Skip to content

Commit 2a9e866

Browse files
committed
chore: API 정리
1 parent 77606c5 commit 2a9e866

6 files changed

Lines changed: 109 additions & 109 deletions

File tree

app/admin_api/serializers/event/presentation.py

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
from admin_api.serializers.modification_audit import ModificationAuditResponseAdminSerializer
21
from core.const.serializer import COMMON_ADMIN_FIELDS
32
from core.serializer.base_abstract_serializer import BaseAbstractSerializer
43
from core.serializer.json_schema_serializer import JsonSchemaSerializer
54
from event.presentation.models import Presentation, PresentationCategory, PresentationSpeaker, PresentationType
65
from file.models import PublicFile
7-
from participant_portal_api.models import ModificationAudit
86
from rest_framework import serializers
97
from user.models import UserExt
108

@@ -63,50 +61,3 @@ class PresentationSpeakerAdminSerializer(BaseAbstractSerializer, JsonSchemaSeria
6361
class Meta:
6462
model = PresentationSpeaker
6563
fields = COMMON_ADMIN_FIELDS + ("presentation", "user", "image", "biography_ko", "biography_en")
66-
67-
68-
class PresentationModificationAuditPreviewAdminSerializer(serializers.ModelSerializer):
69-
class PresentationSerializer(serializers.ModelSerializer):
70-
class PresentationSpeakerSerializer(serializers.ModelSerializer):
71-
class UserSerializer(serializers.ModelSerializer):
72-
class Meta:
73-
model = UserExt
74-
fields = ("id", "nickname_ko", "nickname_en")
75-
76-
user = UserSerializer()
77-
image_id = serializers.CharField(source="image.id", allow_null=True, required=False)
78-
79-
class Meta:
80-
model = PresentationSpeaker
81-
fields = ("id", "user", "image_id", "biography_ko", "biography_en")
82-
83-
type = serializers.CharField(source="type.name_ko")
84-
categories = serializers.SerializerMethodField()
85-
image_id = serializers.CharField(source="image.id", allow_null=True, required=False)
86-
speakers = PresentationSpeakerSerializer(many=True)
87-
88-
class Meta:
89-
model = Presentation
90-
fields = (
91-
"type",
92-
"categories",
93-
"image_id",
94-
"title_ko",
95-
"title_en",
96-
"summary_ko",
97-
"summary_en",
98-
"description_ko",
99-
"description_en",
100-
"speakers",
101-
)
102-
103-
def get_categories(self, obj: Presentation) -> list[str]:
104-
return [cat.name_ko for cat in obj.categories]
105-
106-
modification_audit = ModificationAuditResponseAdminSerializer(source="*")
107-
original = PresentationSerializer(source="fake_original_instance")
108-
modified = PresentationSerializer(source="fake_modified_instance")
109-
110-
class Meta:
111-
model = ModificationAudit
112-
fields = ("modification_audit", "original", "modified")

app/admin_api/serializers/modification_audit.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import typing
22
import unicodedata
33

4+
from event.presentation.models import Presentation, PresentationSpeaker
45
from participant_portal_api.models import ModificationAudit, ModificationAuditComment
56
from rest_framework import serializers
67
from user.models import UserExt
@@ -96,3 +97,67 @@ def save(self, **kwargs: dict) -> ModificationAudit:
9697
ModificationAuditComment.objects.create(audit=instance, content=reason)
9798

9899
return instance
100+
101+
102+
class PresentationModificationAuditPreviewAdminSerializer(serializers.ModelSerializer):
103+
class PresentationSerializer(serializers.ModelSerializer):
104+
class PresentationSpeakerSerializer(serializers.ModelSerializer):
105+
class UserSerializer(serializers.ModelSerializer):
106+
class Meta:
107+
model = UserExt
108+
fields = ("id", "nickname_ko", "nickname_en")
109+
110+
user = UserSerializer()
111+
image_id = serializers.CharField(source="image.id", allow_null=True, required=False)
112+
113+
class Meta:
114+
model = PresentationSpeaker
115+
fields = ("id", "user", "image_id", "biography_ko", "biography_en")
116+
117+
type = serializers.CharField(source="type.name_ko")
118+
categories = serializers.SerializerMethodField()
119+
image_id = serializers.CharField(source="image.id", allow_null=True, required=False)
120+
speakers = PresentationSpeakerSerializer(many=True)
121+
122+
class Meta:
123+
model = Presentation
124+
fields = (
125+
"type",
126+
"categories",
127+
"image_id",
128+
"title_ko",
129+
"title_en",
130+
"summary_ko",
131+
"summary_en",
132+
"description_ko",
133+
"description_en",
134+
"speakers",
135+
)
136+
137+
def get_categories(self, obj: Presentation) -> list[str]:
138+
return [cat.name_ko for cat in obj.categories]
139+
140+
modification_audit = ModificationAuditResponseAdminSerializer(source="*")
141+
original = PresentationSerializer(source="fake_original_instance")
142+
modified = PresentationSerializer(source="fake_modified_instance")
143+
144+
class Meta:
145+
model = ModificationAudit
146+
fields = ("modification_audit", "original", "modified")
147+
148+
149+
class UserModificationAuditPreviewAdminSerializer(serializers.ModelSerializer):
150+
class UserSerializer(serializers.ModelSerializer):
151+
image_id = serializers.CharField(source="image.id", allow_null=True, required=False)
152+
153+
class Meta:
154+
model = UserExt
155+
fields = ("id", "image_id", "email", "nickname_ko", "nickname_en")
156+
157+
modification_audit = ModificationAuditResponseAdminSerializer(source="*")
158+
original = UserSerializer(source="fake_original_instance")
159+
modified = UserSerializer(source="fake_modified_instance")
160+
161+
class Meta:
162+
model = ModificationAudit
163+
fields = ("modification_audit", "original", "modified")

app/admin_api/serializers/user.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import functools
22
import typing
33

4-
from admin_api.serializers.modification_audit import ModificationAuditResponseAdminSerializer
54
from core.const.serializer import COMMON_ADMIN_FIELDS
65
from core.serializer.base_abstract_serializer import BaseAbstractSerializer
76
from core.serializer.json_schema_serializer import JsonSchemaSerializer
87
from core.serializer.read_only_serializer import ReadOnlyModelSerializer
9-
from participant_portal_api.models import ModificationAudit
108
from rest_framework import serializers
119
from user.models import UserExt
1210
from user.models.organization import Organization
@@ -37,23 +35,6 @@ class Meta:
3735
}
3836

3937

40-
class UserModificationAuditPreviewAdminSerializer(serializers.ModelSerializer):
41-
class UserSerializer(serializers.ModelSerializer):
42-
image_id = serializers.CharField(source="image.id", allow_null=True, required=False)
43-
44-
class Meta:
45-
model = UserExt
46-
fields = ("id", "image_id", "email", "nickname_ko", "nickname_en")
47-
48-
modification_audit = ModificationAuditResponseAdminSerializer(source="*")
49-
original = UserSerializer(source="fake_original_instance")
50-
modified = UserSerializer(source="fake_modified_instance")
51-
52-
class Meta:
53-
model = ModificationAudit
54-
fields = ("modification_audit", "original", "modified")
55-
56-
5738
class UserAdminSignInSerializerData(typing.TypedDict):
5839
identity: str
5940
password: str

app/admin_api/views/event/presentation.py

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88
from admin_api.serializers.event.presentation import (
99
PresentationAdminSerializer,
1010
PresentationCategoryAdminSerializer,
11-
PresentationModificationAuditPreviewAdminSerializer,
1211
PresentationSpeakerAdminSerializer,
1312
PresentationTypeAdminSerializer,
1413
)
15-
from core.const.regex import UUID_V4_REGEX
1614
from core.const.tag import OpenAPITag
1715
from core.permissions import IsSuperUser
1816
from core.viewset.json_schema_viewset import JsonSchemaViewSet
@@ -23,8 +21,7 @@
2321
PresentationSpeaker,
2422
PresentationType,
2523
)
26-
from participant_portal_api.models import ModificationAudit
27-
from rest_framework import decorators, request, response, status, viewsets
24+
from rest_framework import viewsets
2825

2926
ADMIN_METHODS = ["list", "retrieve", "create", "update", "partial_update", "destroy"]
3027

@@ -54,22 +51,6 @@ class PresentationAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
5451
filterset_class = PresentationAdminFilterSet
5552
queryset = Presentation.objects.get_all_nested_data().select_related("created_by", "updated_by", "deleted_by")
5653

57-
@extend_schema(
58-
tags=[OpenAPITag.ADMIN_EVENT_PRESENTATION],
59-
responses={status.HTTP_200_OK: PresentationModificationAuditPreviewAdminSerializer},
60-
)
61-
@decorators.action(detail=True, methods=["get"], url_path=r"preview/(?P<audit_id>[\w-]+)")
62-
def preview_modification_audit(
63-
self, request: request.Request, audit_id: str, *args: tuple, **kwargs: dict
64-
) -> response.Response:
65-
if not UUID_V4_REGEX.match(audit_id):
66-
return response.Response(status=status.HTTP_404_NOT_FOUND)
67-
68-
if not (audit := ModificationAudit.objects.filter_by_instance(self.get_object()).filter(id=audit_id).first()):
69-
return response.Response(status=status.HTTP_404_NOT_FOUND)
70-
71-
return response.Response(data=PresentationModificationAuditPreviewAdminSerializer(instance=audit).data)
72-
7354

7455
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_PRESENTATION]) for m in ADMIN_METHODS})
7556
class PresentationSpeakerAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):

app/admin_api/views/modification_audit.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,34 @@
22
ModificationAuditApprovalAdminSerializer,
33
ModificationAuditRejectionAdminSerializer,
44
ModificationAuditResponseAdminSerializer,
5+
PresentationModificationAuditPreviewAdminSerializer,
6+
UserModificationAuditPreviewAdminSerializer,
57
)
68
from core.const.tag import OpenAPITag
79
from core.permissions import IsSuperUser
810
from django.db import models
911
from 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
1018
from 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:

app/admin_api/views/user.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@
33
UserAdminPasswordChangeSerializer,
44
UserAdminSerializer,
55
UserAdminSignInSerializer,
6-
UserModificationAuditPreviewAdminSerializer,
76
)
87
from core.const.account import INITIAL_ADMIN_PASSWORD
9-
from core.const.regex import UUID_V4_REGEX
108
from core.const.tag import OpenAPITag
119
from core.permissions import IsSuperUser
1210
from core.viewset.json_schema_viewset import JsonSchemaViewSet
1311
from django.contrib.auth import login, logout
1412
from drf_spectacular.utils import extend_schema, extend_schema_view
15-
from participant_portal_api.models import ModificationAudit
1613
from rest_framework import decorators, mixins, request, response, status, viewsets
1714
from user.models import UserExt
1815
from user.models.organization import Organization
@@ -81,22 +78,6 @@ def change_password(self, request: request.Request, *args: tuple, **kwargs: dict
8178
serializer.save()
8279
return response.Response(data=UserAdminSerializer(serializer.instance).data)
8380

84-
@extend_schema(
85-
tags=[OpenAPITag.ADMIN_USER],
86-
responses={status.HTTP_200_OK: UserModificationAuditPreviewAdminSerializer},
87-
)
88-
@decorators.action(detail=True, methods=["get"], url_path=r"preview/(?P<audit_id>[\w-]+)")
89-
def preview_modification_audit(
90-
self, request: request.Request, audit_id: str, *args: tuple, **kwargs: dict
91-
) -> response.Response:
92-
if not UUID_V4_REGEX.match(audit_id):
93-
return response.Response(status=status.HTTP_404_NOT_FOUND)
94-
95-
if not (audit := ModificationAudit.objects.filter_by_instance(self.get_object()).filter(id=audit_id).first()):
96-
return response.Response(status=status.HTTP_404_NOT_FOUND)
97-
98-
return response.Response(data=UserModificationAuditPreviewAdminSerializer(instance=audit).data)
99-
10081

10182
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_USER]) for m in ADMIN_METHODS})
10283
class OrganizationAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):

0 commit comments

Comments
 (0)