|
1 | 1 | from core.const.tag import OpenAPITag |
2 | 2 | from django.db import models |
3 | 3 | from drf_spectacular import utils |
| 4 | +from drf_standardized_errors.openapi_serializers import ( |
| 5 | + ValidationErrorEnum, |
| 6 | + ValidationErrorResponseSerializer, |
| 7 | + ValidationErrorSerializer, |
| 8 | +) |
| 9 | +from event.presentation.models import Presentation |
4 | 10 | from participant_portal_api.models import ModificationAudit, ModificationAuditComment |
5 | 11 | from participant_portal_api.permissions import IsSessionSpeaker |
6 | 12 | from participant_portal_api.serializers.modification_audit import ( |
7 | 13 | ModificationAuditCancelPortalSerializer, |
8 | 14 | ModificationAuditResponsePortalSerializer, |
9 | 15 | ) |
10 | | -from rest_framework import decorators, mixins, request, response, viewsets |
| 16 | +from participant_portal_api.serializers.modification_audit_preview import ( |
| 17 | + ModificationAuditPresentationPreviewPortalSerializer, |
| 18 | + ModificationAuditUserPreviewPortalSerializer, |
| 19 | +) |
| 20 | +from rest_framework import decorators, mixins, request, response, serializers, status, viewsets |
| 21 | +from user.models import UserExt |
| 22 | + |
| 23 | +MODEL_SERIALIZER_MAP: dict[models.Model, type[serializers.Serializer]] = { |
| 24 | + Presentation: ModificationAuditPresentationPreviewPortalSerializer, |
| 25 | + UserExt: ModificationAuditUserPreviewPortalSerializer, |
| 26 | +} |
11 | 27 |
|
12 | 28 |
|
13 | 29 | @utils.extend_schema_view( |
@@ -43,3 +59,36 @@ def cancel_audit(self, request: request.Request, *args: tuple, **kwargs: dict) - |
43 | 59 | instance = serializer.save() |
44 | 60 |
|
45 | 61 | return response.Response(data=self.get_serializer(instance).data) |
| 62 | + |
| 63 | + @utils.extend_schema( |
| 64 | + tags=[OpenAPITag.PARTICIPANT_PORTAL_MODIFICATION_AUDIT], |
| 65 | + responses={ |
| 66 | + status.HTTP_200_OK: ModificationAuditPresentationPreviewPortalSerializer, |
| 67 | + status.HTTP_400_BAD_REQUEST: ValidationErrorResponseSerializer, |
| 68 | + }, |
| 69 | + ) |
| 70 | + @decorators.action(detail=True, methods=["get"], url_path="preview") |
| 71 | + def preview_modification_audit(self, request: request.Request, *args: tuple, **kwargs: dict) -> response.Response: |
| 72 | + audit: ModificationAudit = self.get_object() |
| 73 | + |
| 74 | + if serializer := MODEL_SERIALIZER_MAP.get(audit.instance_type.model_class()): |
| 75 | + return response.Response(data=serializer(audit, context={"request": request}).data) |
| 76 | + |
| 77 | + return response.Response( |
| 78 | + data=ValidationErrorResponseSerializer( |
| 79 | + instance={ |
| 80 | + "type": ValidationErrorEnum.VALIDATION_ERROR, |
| 81 | + "errors": ValidationErrorSerializer( |
| 82 | + instance=[ |
| 83 | + { |
| 84 | + "code": "modification_audit_preview_error", |
| 85 | + "detail": f"지원하지 않는 모델: {audit.instance_type.model_class().__name__}", |
| 86 | + "attr": "instance", |
| 87 | + } |
| 88 | + ], |
| 89 | + many=True, |
| 90 | + ).data, |
| 91 | + }, |
| 92 | + ).data, |
| 93 | + status=status.HTTP_400_BAD_REQUEST, |
| 94 | + ) |
0 commit comments