init
This commit is contained in:
74
backend/commerce/views.py
Normal file
74
backend/commerce/views.py
Normal 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)
|
||||
Reference in New Issue
Block a user