Skip to content

Commit f86cfad

Browse files
committed
feat: 참가자 포탈용 preview API 추가
1 parent 94d77c1 commit f86cfad

2 files changed

Lines changed: 75 additions & 1 deletion

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from participant_portal_api.models import ModificationAudit
2+
from participant_portal_api.serializers.modification_audit import ModificationAuditResponsePortalSerializer
3+
from participant_portal_api.serializers.presentation import PresentationPortalSerializer
4+
from participant_portal_api.serializers.user import UserPortalSerializer
5+
from rest_framework import serializers
6+
7+
8+
class ModificationAuditPresentationPreviewPortalSerializer(serializers.ModelSerializer):
9+
modification_audit = ModificationAuditResponsePortalSerializer(read_only=True, source="*")
10+
original = PresentationPortalSerializer(read_only=True, source="fake_original_instance")
11+
modified = PresentationPortalSerializer(read_only=True, source="fake_modified_instance")
12+
13+
class Meta:
14+
model = ModificationAudit
15+
fields = read_only_fields = ("id", "modification_audit", "original", "modified")
16+
17+
18+
class ModificationAuditUserPreviewPortalSerializer(serializers.ModelSerializer):
19+
modification_audit = ModificationAuditResponsePortalSerializer(read_only=True, source="*")
20+
original = UserPortalSerializer(read_only=True, source="fake_original_instance")
21+
modified = UserPortalSerializer(read_only=True, source="fake_modified_instance")
22+
23+
class Meta:
24+
model = ModificationAudit
25+
fields = read_only_fields = ("id", "modification_audit", "original", "modified")

app/participant_portal_api/views/modification_audit.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
11
from core.const.tag import OpenAPITag
22
from django.db import models
33
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
410
from participant_portal_api.models import ModificationAudit, ModificationAuditComment
511
from participant_portal_api.permissions import IsSessionSpeaker
612
from participant_portal_api.serializers.modification_audit import (
713
ModificationAuditCancelPortalSerializer,
814
ModificationAuditResponsePortalSerializer,
915
)
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+
}
1127

1228

1329
@utils.extend_schema_view(
@@ -43,3 +59,36 @@ def cancel_audit(self, request: request.Request, *args: tuple, **kwargs: dict) -
4359
instance = serializer.save()
4460

4561
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

Comments
 (0)