This commit is contained in:
2025-10-02 00:54:34 +02:00
commit 84b34c9615
200 changed files with 42048 additions and 0 deletions

74
backend/commerce/views.py Normal file
View File

@@ -0,0 +1,74 @@
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets, filters, status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import api_view
from decimal import Decimal
from drf_spectacular.utils import extend_schema
from account.permissions import RoleAllowed
from rest_framework.permissions import IsAuthenticated
from .serializers import OrderSerializer, PriceCalculationSerializer
from .filters import OrderFilter
from .models import Order
@extend_schema(
tags=["Order"],
description=(
"Správa objednávek vytvoření, úprava a výpis. Filtrování podle rezervace, uživatele atd.\n\n"
"🔍 **Fulltextové vyhledávání (`?search=`)** prohledává:\n"
"- poznámku (`note`)\n"
"- e-mail uživatele (`user.email`)\n"
"- jméno a příjmení uživatele (`user.first_name`, `user.last_name`)\n"
"- poznámku rezervace (`reservation.note`)\n\n"
"**Příklady:** `?search=jan.novak@example.com`, `?search=poznámka`"
)
)
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.all().select_related("user", "reservation").order_by("-created_at")
serializer_class = OrderSerializer
filter_backends = [DjangoFilterBackend, filters.OrderingFilter, filters.SearchFilter]
filterset_class = OrderFilter
ordering_fields = ["created_at", "price_to_pay", "payed_at"]
search_fields = [
"note",
"user__email",
"user__first_name",
"user__last_name",
"reservation__note",
]
permission_classes = [RoleAllowed("admin", "cityClerk", "seller")]
# permission_classes = [IsAuthenticated]
def get_queryset(self):
queryset = Order.objects.select_related("user", "reservation").order_by("-created_at")
user = self.request.user
if hasattr(user, "role") and user.role == "seller":
return queryset.filter(user=user)
return queryset
class CalculateReservationPriceView(APIView):
@extend_schema(
request=PriceCalculationSerializer,
responses={200: {"type": "object", "properties": {"final_price": {"type": "number"}}}},
tags=["Order"],
summary="Calculate reservation price",
description="Spočítá celkovou cenu rezervace pro zvolený slot, použitá rozšíření a trvání rezervace"
)
def post(self, request):
serializer = PriceCalculationSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
# PriceCalculationSerializer now returns 'final_price' in validated_data
return Response({"final_price": data["final_price"]}, status=status.HTTP_200_OK)