Files
e-trznice/backend/commerce/views.py
2025-10-02 00:54:34 +02:00

74 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)