Files
vontor-cz/backend/thirdparty/zasilkovna/views.py
Brunobrno 564418501c Refactor email system and add contact form backend
Refactored email sending to use a single HTML template with a base layout, removed plain text email templates, and updated all related backend logic. Introduced a new ContactMe model, serializer, Celery task, and API endpoints for handling contact form submissions, including email notifications. Renamed ShopConfiguration to SiteConfiguration throughout the backend for consistency. Updated frontend to remove unused components, add a new Services section, and adjust navigation and contact form integration.
2025-12-12 01:52:41 +01:00

142 lines
4.8 KiB
Python

from rest_framework import viewsets, mixins, status
from rest_framework.decorators import action
from rest_framework.response import Response
from django.template import loader
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiResponse, OpenApiParameter, OpenApiTypes
from backend.configuration.models import SiteConfiguration
from .models import ZasilkovnaShipment, ZasilkovnaPacket
from .serializers import (
ZasilkovnaShipmentSerializer,
ZasilkovnaPacketSerializer,
TrackingURLSerializer,
)
# -- SHIPMENT --
@extend_schema_view(
list=extend_schema(
tags=["Packeta-Shipment"],
summary="Hromadný shipment",
description="Returns a paginated list of Packeta (Zásilkovna) shipments.",
responses=ZasilkovnaShipmentSerializer,
),
retrieve=extend_schema(
tags=["Packeta-Shipment"],
summary="Detail hromadné zásilky",
description="Returns detail for a single shipment.",
responses=ZasilkovnaShipmentSerializer,
),
)
class ZasilkovnaShipmentViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet,):
queryset = ZasilkovnaShipment.objects.all().order_by("-created_at")
serializer_class = ZasilkovnaShipmentSerializer
# -- PACKET --
@extend_schema_view(
retrieve=extend_schema(
tags=["Packet"],
summary="Packet",
description="#TODO: Popis endpointu",
responses={200: ZasilkovnaPacketSerializer},
)
)
class ZasilkovnaPacketViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
queryset = ZasilkovnaPacket.objects.all()
serializer_class = ZasilkovnaPacketSerializer
@extend_schema(
tags=["Packet"],
summary="Get public tracking URL",
description="Returns the public Zásilkovna tracking URL derived from the packet's barcode.",
responses=OpenApiResponse(response=TrackingURLSerializer),
parameters=[
OpenApiParameter(name="pk", location=OpenApiParameter.PATH, description="Packet ID", required=True, type=int),
],
request=None,
)
@action(detail=True, methods=["get"], url_path="tracking-url")
def tracking_url(self, request, pk=None):
packet: ZasilkovnaPacket = self.get_object()
data = {
"barcode": packet.barcode,
"tracking_url": packet.get_tracking_url(),
}
return Response(data)
#HOTOVO
@extend_schema(
tags=["Packet"],
summary="Order shipping",
description=(
"Objedná přepravu přes API Packety,"
"podle existujicího objektu, kde je od uživatele uložený id od místa poslání."
),
request=None,
responses=OpenApiResponse(response=ZasilkovnaPacketSerializer),
parameters=[
OpenApiParameter(name="pk", location=OpenApiParameter.PATH, description="Packet ID", required=True, type=int),
],
)
@action(detail=True, methods=["patch"], url_path="order-shipping")
def order_shipping(self, request, pk=None):
packet: ZasilkovnaPacket = self.get_object()
packet.order_shipping()
serializer = self.get_serializer(packet)
return Response(serializer.data, status=status.HTTP_200_OK)
#HOTOVO
@extend_schema(
tags=["Packet"],
summary="Cancel packet",
description=(
"Cancels the packet through the Packeta API and updates its state to CANCELED. "
"No request body is required."
),
request=None,
responses=OpenApiResponse(response=ZasilkovnaPacketSerializer),
parameters=[
OpenApiParameter(name="pk", location=OpenApiParameter.PATH, description="Packet ID", required=True, type=int),
],
)
@action(detail=True, methods=["patch"], url_path="cancel")
def cancel(self, request, pk=None):
packet: ZasilkovnaPacket = self.get_object()
packet.cancel_packet()
serializer = self.get_serializer(packet)
return Response(serializer.data, status=status.HTTP_200_OK)
#TODO: dodělat/domluvit se
@extend_schema(
tags=["Packet"],
summary="Get widget for user, to select pickup point.",
description=(
"Returns HTML widget for user to select pickup point. "
"No request body is required."
),
request=None,
responses={200: OpenApiResponse(response=TrackingURLSerializer)},
)
@action(detail=True, methods=["get"], url_path="pickup-point-widget")
def pickup_point_widget(self, request):
#https://configurator.widget.packeta.com/cs
widget_html = loader.render_to_string(
"zasilkovna/pickup_point_widget.html",
{
"api_key": SiteConfiguration.get_solo().zasilkovna_widget_api_key,
}
)
return Response({"widget_html": widget_html})