Coverage for website/pizzas/api/v2/admin/views.py: 87.50%
54 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from oauth2_provider.contrib.rest_framework import IsAuthenticatedOrTokenHasScope
2from rest_framework import filters as framework_filters
3from rest_framework.generics import get_object_or_404
5import pizzas.api.v2.filters as normal_filters
6from pizzas.api.v2.admin.permissions import IsOrganiser
7from pizzas.api.v2.admin.serializers.food_event import FoodEventAdminSerializer
8from pizzas.api.v2.admin.serializers.order import FoodOrderAdminSerializer
9from pizzas.api.v2.admin.serializers.product import ProductAdminSerializer
10from pizzas.models import FoodEvent, FoodOrder, Product
11from thaliawebsite.api.v2.admin import (
12 AdminCreateAPIView,
13 AdminDestroyAPIView,
14 AdminListAPIView,
15 AdminRetrieveAPIView,
16 AdminUpdateAPIView,
17)
20class FoodEventAdminListView(AdminListAPIView, AdminCreateAPIView):
21 """Returns an overview of all food events."""
23 serializer_class = FoodEventAdminSerializer
24 queryset = FoodEvent.objects.all()
25 filter_backends = (
26 framework_filters.OrderingFilter,
27 normal_filters.FoodEventDateFilterBackend,
28 )
29 ordering_fields = ("start", "end")
30 permission_classes = [
31 IsAuthenticatedOrTokenHasScope,
32 ]
33 required_scopes = ["food:admin"]
36class FoodEventAdminDetailView(AdminRetrieveAPIView, AdminUpdateAPIView):
37 """Returns or updates one single food event."""
39 serializer_class = FoodEventAdminSerializer
40 queryset = FoodEvent.objects.all()
41 permission_classes = [
42 IsAuthenticatedOrTokenHasScope,
43 ]
44 required_scopes = ["food:admin"]
47class ProductsAdminListView(AdminListAPIView, AdminCreateAPIView):
48 """Returns an overview of all products."""
50 permission_classes = [IsAuthenticatedOrTokenHasScope]
51 serializer_class = ProductAdminSerializer
52 queryset = Product.objects.all()
53 filter_backends = [
54 framework_filters.SearchFilter,
55 normal_filters.FoodEventDateFilterBackend,
56 ]
57 search_fields = ("name",)
58 required_scopes = ["food:admin"]
61class ProductAdminDetailAPIView(
62 AdminRetrieveAPIView, AdminUpdateAPIView, AdminDestroyAPIView
63):
64 """Returns details of one product."""
66 queryset = Product.objects.all()
67 serializer_class = ProductAdminSerializer
68 permission_classes = [IsAuthenticatedOrTokenHasScope]
69 required_scopes = ["food:admin"]
72class FoodEventOrdersAdminListView(AdminListAPIView, AdminCreateAPIView):
73 """Returns a list of food orders."""
75 serializer_class = FoodOrderAdminSerializer
76 permission_classes = [IsAuthenticatedOrTokenHasScope]
77 required_scopes = ["food:admin"]
78 filter_backends = (
79 framework_filters.OrderingFilter,
80 framework_filters.SearchFilter,
81 )
82 ordering_fields = ("product", "payment", "member__first_name", "member__last_name")
83 search_fields = (
84 "product__name",
85 "member__first_name",
86 "member__last_name",
87 "name",
88 )
90 def get_queryset(self):
91 event = get_object_or_404(FoodEvent, pk=self.kwargs.get("pk"))
92 if event:
93 return FoodOrder.objects.filter(food_event_id=event).prefetch_related(
94 "member", "member__profile", "food_event"
95 )
96 return FoodOrder.objects.none()
99class FoodOrderAdminDetailView(
100 AdminRetrieveAPIView, AdminUpdateAPIView, AdminDestroyAPIView
101):
102 """Returns details of a food order."""
104 serializer_class = FoodOrderAdminSerializer
105 queryset = FoodOrder.objects.all()
106 permission_classes = [IsOrganiser, IsAuthenticatedOrTokenHasScope]
107 required_scopes = ["food:admin"]
108 event_lookup_field = "event_id"
110 def get_queryset(self):
111 return (
112 super()
113 .get_queryset()
114 .filter(food_event_id=self.kwargs["event_id"])
115 .prefetch_related("member", "member__profile", "food_event")
116 )