22 ModificationAuditApprovalAdminSerializer ,
33 ModificationAuditRejectionAdminSerializer ,
44 ModificationAuditResponseAdminSerializer ,
5+ PresentationModificationAuditPreviewAdminSerializer ,
6+ UserModificationAuditPreviewAdminSerializer ,
57)
68from core .const .tag import OpenAPITag
79from core .permissions import IsSuperUser
810from django .db import models
911from drf_spectacular import utils
12+ from drf_standardized_errors .openapi_serializers import (
13+ ValidationErrorEnum ,
14+ ValidationErrorResponseSerializer ,
15+ ValidationErrorSerializer ,
16+ )
17+ from event .presentation .models import Presentation
1018from participant_portal_api .models import ModificationAudit , ModificationAuditComment
11- from rest_framework import decorators , mixins , request , response , viewsets
19+ from rest_framework import decorators , mixins , request , response , serializers , status , viewsets
20+ from user .models import UserExt
21+
22+ MODEL_SERIALIZER_MAP : dict [models .Model , type [serializers .Serializer ]] = {
23+ Presentation : PresentationModificationAuditPreviewAdminSerializer ,
24+ UserExt : UserModificationAuditPreviewAdminSerializer ,
25+ }
1226
1327
1428@utils .extend_schema_view (
1529 list = utils .extend_schema (tags = [OpenAPITag .ADMIN_MODIFICATION_AUDIT ]),
1630 retrieve = utils .extend_schema (tags = [OpenAPITag .ADMIN_MODIFICATION_AUDIT ]),
1731)
18- class ModificationAuditAdminViewSet (mixins .ListModelMixin , mixins . RetrieveModelMixin , viewsets .GenericViewSet ):
32+ class ModificationAuditAdminViewSet (mixins .ListModelMixin , viewsets .GenericViewSet ):
1933 serializer_class = ModificationAuditResponseAdminSerializer
2034 permission_classes = [IsSuperUser ]
2135 queryset = (
@@ -26,6 +40,33 @@ class ModificationAuditAdminViewSet(mixins.ListModelMixin, mixins.RetrieveModelM
2640 .select_related ("created_by" , "updated_by" , "deleted_by" )
2741 )
2842
43+ @utils .extend_schema (tags = [OpenAPITag .ADMIN_MODIFICATION_AUDIT ])
44+ @decorators .action (detail = True , methods = ["get" ], url_path = "preview" )
45+ def preview_modification_audit (self , request : request .Request , * args : tuple , ** kwargs : dict ) -> response .Response :
46+ audit : ModificationAudit = self .get_object ()
47+
48+ if serializer := MODEL_SERIALIZER_MAP .get (audit .instance_type .model_class ()):
49+ return response .Response (data = serializer (audit , context = {"request" : request }).data )
50+
51+ return response .Response (
52+ data = ValidationErrorResponseSerializer (
53+ instance = {
54+ "type" : ValidationErrorEnum .VALIDATION_ERROR ,
55+ "errors" : ValidationErrorSerializer (
56+ instance = [
57+ {
58+ "code" : "modification_audit_preview_error" ,
59+ "detail" : f"지원하지 않는 모델: { audit .instance_type .model_class ().__name__ } " ,
60+ "attr" : "instance" ,
61+ }
62+ ],
63+ many = True ,
64+ ).data ,
65+ },
66+ ).data ,
67+ status = status .HTTP_400_BAD_REQUEST ,
68+ )
69+
2970 @utils .extend_schema (tags = [OpenAPITag .ADMIN_MODIFICATION_AUDIT ])
3071 @decorators .action (detail = True , methods = ["patch" ], url_path = "approve" )
3172 def approve_audit (self , request : request .Request , * args : tuple , ** kwargs : dict ) -> response .Response :
0 commit comments