11from __future__ import annotations
22
3+ from admin_api .filtersets .event .presentation import (
4+ PresentationAdminFilterSet ,
5+ PresentationCategoryAdminFilterSet ,
6+ PresentationSpeakerAdminFilterSet ,
7+ )
38from admin_api .serializers .event .presentation import (
49 PresentationAdminSerializer ,
510 PresentationCategoryAdminSerializer ,
611 PresentationSpeakerAdminSerializer ,
712 PresentationTypeAdminSerializer ,
813)
9- from core .const .regex import UUID_V4_PATTERN
1014from core .const .tag import OpenAPITag
1115from core .permissions import IsSuperUser
1216from core .viewset .json_schema_viewset import JsonSchemaViewSet
13- from django .db import models
1417from drf_spectacular .utils import extend_schema , extend_schema_view
1518from event .presentation .models import (
1619 Presentation ,
1720 PresentationCategory ,
18- PresentationCategoryRelation ,
1921 PresentationSpeaker ,
2022 PresentationType ,
2123)
22- from rest_framework import decorators , exceptions , request , response , status , viewsets
24+ from rest_framework import viewsets
2325
2426ADMIN_METHODS = ["list" , "retrieve" , "create" , "update" , "partial_update" , "destroy" ]
2527
@@ -31,92 +33,29 @@ class PresentationTypeAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
3133 permission_classes = [IsSuperUser ]
3234 queryset = PresentationType .objects .filter_active ().select_related ("created_by" , "updated_by" , "deleted_by" )
3335
34- @extend_schema (
35- tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ],
36- responses = {status .HTTP_200_OK : PresentationCategoryAdminSerializer (many = True )},
37- )
38- @decorators .action (detail = True , methods = ["get" ], url_path = "categories" )
39- def list_categories (self , * args : tuple , ** kwargs : dict ) -> response .Response :
40- categories = PresentationCategory .objects .filter_active ().filter (type = self .get_object ())
41- return response .Response (data = PresentationCategoryAdminSerializer (instance = categories , many = True ).data )
42-
43- @extend_schema (
44- tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ],
45- request = PresentationCategoryAdminSerializer ,
46- responses = {status .HTTP_201_CREATED : PresentationCategoryAdminSerializer },
47- )
48- @decorators .action (detail = True , methods = ["post" ], url_path = "categories" )
49- def add_category (self , request : request .Request , * args : tuple , ** kwargs : dict ) -> response .Response :
50- serializer = PresentationCategoryAdminSerializer (data = request .data )
51- serializer .is_valid (raise_exception = True )
52- serializer .save ()
53- return response .Response (data = serializer .data , status = status .HTTP_201_CREATED )
54-
55- @extend_schema (
56- tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ],
57- request = PresentationCategoryAdminSerializer ,
58- responses = {status .HTTP_200_OK : PresentationCategoryAdminSerializer },
59- )
60- @decorators .action (detail = True , methods = ["patch" ], url_path = f"categories/(?P<category_id>{ UUID_V4_PATTERN } )" )
61- def update_category (self , request : request .Request , pk : str , category_id : str , * args , ** kwargs ):
62- if not (category := PresentationCategory .objects .filter_active ().filter (type_id = pk , id = category_id ).first ()):
63- raise exceptions .NotFound (detail = "Category not found." )
64-
65- serializer = PresentationCategoryAdminSerializer (instance = category , data = request .data , partial = True )
66- serializer .is_valid (raise_exception = True )
67- serializer .save ()
68- return response .Response (data = serializer .data )
6936
70- @extend_schema (tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ], responses = {status .HTTP_204_NO_CONTENT : None })
71- @decorators .action (detail = True , methods = ["delete" ], url_path = f"categories/(?P<category_id>{ UUID_V4_PATTERN } )" )
72- def delete_category (self , pk : str , category_id : str , * args : tuple , ** kwargs : dict ) -> response .Response :
73- if not (category := PresentationCategory .objects .filter_active ().filter (type_id = pk , id = category_id ).first ()):
74- raise exceptions .NotFound (detail = "Category not found." )
75-
76- category .delete ()
77- return response .Response (status = status .HTTP_204_NO_CONTENT )
37+ @extend_schema_view (** {m : extend_schema (tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ]) for m in ADMIN_METHODS })
38+ class PresentationCategoryAdminViewSet (JsonSchemaViewSet , viewsets .ModelViewSet ):
39+ http_method_names = ["get" , "post" , "patch" , "delete" ]
40+ serializer_class = PresentationCategoryAdminSerializer
41+ permission_classes = [IsSuperUser ]
42+ filterset_class = PresentationCategoryAdminFilterSet
43+ queryset = PresentationCategory .objects .filter_active ().select_related ("created_by" , "updated_by" , "deleted_by" )
7844
7945
8046@extend_schema_view (** {m : extend_schema (tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ]) for m in ADMIN_METHODS })
8147class PresentationAdminViewSet (JsonSchemaViewSet , viewsets .ModelViewSet ):
8248 http_method_names = ["get" , "post" , "patch" , "delete" ]
8349 serializer_class = PresentationAdminSerializer
8450 permission_classes = [IsSuperUser ]
51+ filterset_class = PresentationAdminFilterSet
8552 queryset = Presentation .objects .get_all_nested_data ().select_related ("created_by" , "updated_by" , "deleted_by" )
8653
87- @extend_schema (
88- tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ],
89- responses = {status .HTTP_200_OK : PresentationCategoryAdminSerializer (many = True )},
90- )
91- @decorators .action (detail = True , methods = ["get" ], url_path = "categories" )
92- def list_categories (self , * args : tuple , ** kwargs : dict ) -> response .Response :
93- categories = self .get_object ().active_categories
94- return response .Response (data = PresentationCategoryAdminSerializer (instance = categories , many = True ).data )
95-
96- @extend_schema (tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ], responses = {status .HTTP_201_CREATED : None })
97- @decorators .action (detail = True , methods = ["post" ], url_path = "categories/(?P<category_id>{UUID_V4_PATTERN})" )
98- def add_category (self , pk : str , category_id : str , * args : tuple , ** kwargs : dict ) -> response .Response :
99- PresentationCategoryRelation .objects .get_or_create (presentation_id = pk , category_id = category_id )
100- return response .Response (status = status .HTTP_201_CREATED )
101-
102- @extend_schema (tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ], responses = {status .HTTP_204_NO_CONTENT : None })
103- @decorators .action (detail = True , methods = ["delete" ], url_path = "categories/(?P<category_id>{UUID_V4_PATTERN})" )
104- def remove_category (self , pk : str , category_id : str , * args : tuple , ** kwargs : dict ) -> response .Response :
105- if not (
106- relation := PresentationCategoryRelation .objects .filter (presentation_id = pk , category_id = category_id ).first ()
107- ):
108- raise exceptions .NotFound (detail = "Category is not associated with this presentation." )
109-
110- relation .delete ()
111- return response .Response (status = status .HTTP_204_NO_CONTENT )
112-
11354
11455@extend_schema_view (** {m : extend_schema (tags = [OpenAPITag .ADMIN_EVENT_PRESENTATION ]) for m in ADMIN_METHODS })
11556class PresentationSpeakerAdminViewSet (JsonSchemaViewSet , viewsets .ModelViewSet ):
11657 http_method_names = ["get" , "post" , "patch" , "delete" ]
11758 serializer_class = PresentationSpeakerAdminSerializer
11859 permission_classes = [IsSuperUser ]
60+ filterset_class = PresentationSpeakerAdminFilterSet
11961 queryset = PresentationSpeaker .objects .filter_active ().select_related ("created_by" , "updated_by" , "deleted_by" )
120-
121- def get_queryset (self ) -> models .QuerySet [PresentationSpeaker ]:
122- return super ().get_queryset ().filter (presentation_id = self .kwargs ["presentation_id" ])
0 commit comments