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

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 

4 

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) 

18 

19 

20class FoodEventAdminListView(AdminListAPIView, AdminCreateAPIView): 

21 """Returns an overview of all food events.""" 

22 

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"] 

34 

35 

36class FoodEventAdminDetailView(AdminRetrieveAPIView, AdminUpdateAPIView): 

37 """Returns or updates one single food event.""" 

38 

39 serializer_class = FoodEventAdminSerializer 

40 queryset = FoodEvent.objects.all() 

41 permission_classes = [ 

42 IsAuthenticatedOrTokenHasScope, 

43 ] 

44 required_scopes = ["food:admin"] 

45 

46 

47class ProductsAdminListView(AdminListAPIView, AdminCreateAPIView): 

48 """Returns an overview of all products.""" 

49 

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"] 

59 

60 

61class ProductAdminDetailAPIView( 

62 AdminRetrieveAPIView, AdminUpdateAPIView, AdminDestroyAPIView 

63): 

64 """Returns details of one product.""" 

65 

66 queryset = Product.objects.all() 

67 serializer_class = ProductAdminSerializer 

68 permission_classes = [IsAuthenticatedOrTokenHasScope] 

69 required_scopes = ["food:admin"] 

70 

71 

72class FoodEventOrdersAdminListView(AdminListAPIView, AdminCreateAPIView): 

73 """Returns a list of food orders.""" 

74 

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 ) 

89 

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() 

97 

98 

99class FoodOrderAdminDetailView( 

100 AdminRetrieveAPIView, AdminUpdateAPIView, AdminDestroyAPIView 

101): 

102 """Returns details of a food order.""" 

103 

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" 

109 

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 )