Skip to content

Commit b8a50fc

Browse files
committed
refactor: admin_api의 구조 수정
1 parent b252dbd commit b8a50fc

20 files changed

Lines changed: 186 additions & 201 deletions

app/admin_api/serializers/modification_audit.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import typing
22
import unicodedata
33

4+
from core.serializer.json_schema_serializer import JsonSchemaSerializer
45
from event.presentation.models import Presentation, PresentationSpeaker
56
from participant_portal_api.models import ModificationAudit, ModificationAuditComment
67
from rest_framework import serializers
78
from user.models import UserExt
89

910

10-
class ModificationAuditResponseAdminSerializer(serializers.ModelSerializer):
11+
class ModificationAuditResponseAdminSerializer(JsonSchemaSerializer, serializers.ModelSerializer):
1112
class ModificationAuditCommentAdminSerializer(serializers.ModelSerializer):
1213
class ModificationAuditCommentAdminUserSerializer(serializers.ModelSerializer):
1314
class Meta:

app/admin_api/test/shop/categories_api_test.py

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from user.models.organization import Organization
99

1010
LIST_URL = reverse("v1:admin-shop-category-list")
11-
CHOICES_URL = LIST_URL + "choices/"
11+
SELECTABLES_URL = LIST_URL + "selectables/"
1212

1313

1414
@pytest.fixture
@@ -42,35 +42,27 @@ def test_category_list_returns_categories(api_client, category_fixtures):
4242

4343

4444
@pytest.mark.django_db
45-
def test_category_choices_returns_group_and_event(api_client, category_fixtures):
46-
response = api_client.get(CHOICES_URL)
45+
def test_category_selectables_include_meta(api_client, category_fixtures):
46+
# selectables 결과의 각 category 는 Category.get_choice_meta() 로 group/is_ticket/event 메타를 실어야 한다.
47+
response = api_client.get(SELECTABLES_URL)
4748
assert response.status_code == HTTP_200_OK
48-
data = response.json()
49-
assert {"group", "event"} <= set(data)
50-
assert str(category_fixtures["g2026"].id) in {c["const"] for c in data["group"]}
51-
assert str(category_fixtures["event"].id) in {c["const"] for c in data["event"]}
49+
body = response.json()
50+
ticket_meta = {c["const"]: c for c in body["results"]}[str(category_fixtures["ticket"].id)]["meta"]
51+
assert ticket_meta["group"] == "2026"
52+
assert ticket_meta["is_ticket"] is True
53+
assert ticket_meta["event"] == str(category_fixtures["event"])
54+
# meta_schema 는 모델의 choices_meta_schema 를 반영한다.
55+
assert {"is_ticket", "group", "event"} <= set(body["meta_schema"])
5256

5357

5458
@pytest.mark.django_db
55-
def test_category_choices_include_meta_for_event(api_client, category_fixtures):
56-
# Event 모델이 choices_meta_schema/get_choice_meta 를 정의하므로 event choice 에 meta 가 붙어야 한다.
57-
response = api_client.get(CHOICES_URL)
58-
assert response.status_code == HTTP_200_OK
59-
event_choices = {c["const"]: c for c in response.json()["event"] if c["const"] is not None}
60-
event_meta = event_choices[str(category_fixtures["event"].id)]["meta"]
61-
assert event_meta["organization"] == "Org"
62-
assert event_meta["started_at"] == "2026-08-01"
63-
64-
65-
@pytest.mark.django_db
66-
def test_category_choices_include_audit_meta_for_event(api_client, category_fixtures):
59+
def test_category_selectables_include_audit_meta(api_client, category_fixtures):
6760
# BaseAbstractModel 의 audit 메타(created_by/updated_by/created_at/updated_at)가 자동으로 붙어야 한다.
68-
response = api_client.get(CHOICES_URL)
61+
response = api_client.get(SELECTABLES_URL)
6962
assert response.status_code == HTTP_200_OK
70-
event_choices = {c["const"]: c for c in response.json()["event"] if c["const"] is not None}
71-
event_meta = event_choices[str(category_fixtures["event"].id)]["meta"]
72-
assert {"created_by", "updated_by", "created_at", "updated_at"} <= set(event_meta)
73-
assert event_meta["created_at"] is not None
63+
ticket_meta = {c["const"]: c for c in response.json()["results"]}[str(category_fixtures["ticket"].id)]["meta"]
64+
assert {"created_by", "updated_by", "created_at", "updated_at"} <= set(ticket_meta)
65+
assert ticket_meta["created_at"] is not None
7466

7567

7668
@pytest.mark.django_db

app/admin_api/test/shop/products_api_test.py

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import pytest
44
from admin_api.test.helpers import CategoryGroupsAdminApi, OptionGroupsAdminApi, ProductsAdminApi, TagsAdminApi
55
from django.urls import reverse
6-
from event.models import Event
76
from rest_framework.status import (
87
HTTP_200_OK,
98
HTTP_201_CREATED,
@@ -13,10 +12,8 @@
1312
)
1413
from shop.conftest import FAR_FUTURE, FAR_PAST
1514
from shop.product.models import Category, CategoryGroup, OptionGroup, Product, Tag
16-
from user.models.organization import Organization
1715

18-
PRODUCT_CHOICES_URL = reverse("v1:admin-shop-product-list") + "choices/"
19-
OPTION_GROUP_CHOICES_URL = reverse("v1:admin-shop-option-group-list") + "choices/"
16+
PRODUCT_SELECTABLES_URL = reverse("v1:admin-shop-product-list") + "selectables/"
2017

2118

2219
@pytest.mark.parametrize("api_cls", [CategoryGroupsAdminApi, TagsAdminApi, ProductsAdminApi])
@@ -442,41 +439,20 @@ def test_admin_product_list_filters_by_status(api_client, products_by_status, st
442439

443440

444441
@pytest.mark.django_db
445-
def test_admin_product_choices_include_category_meta(api_client, ticket_product):
446-
# Product choices 의 category FK 는 Category.get_choice_meta() 로 group/is_ticket/event 메타를 실어야 한다.
447-
org = Organization.objects.create(name="PSK")
448-
event = Event.objects.create(
449-
organization=org, name="PyCon Korea 2026", event_start_at=datetime(2026, 8, 1, tzinfo=timezone.utc)
450-
)
451-
evented = Category.objects.create(
452-
group=CategoryGroup.objects.create(name="2026"), name="Conference", is_ticket=True, event=event
453-
)
454-
455-
response = api_client.get(PRODUCT_CHOICES_URL)
456-
assert response.status_code == HTTP_200_OK
457-
category_choices = {c["const"]: c for c in response.json()["category"]}
458-
459-
# event 가 있는 카테고리 — str(event) 분기.
460-
evented_meta = category_choices[str(evented.id)]["meta"]
461-
assert evented_meta.items() >= {"group": "2026", "is_ticket": True, "event": str(event)}.items()
462-
463-
# event 가 없는 카테고리(fixture) — None 분기.
464-
plain_meta = category_choices[str(ticket_product.category.id)]["meta"]
465-
assert plain_meta.items() >= {"group": "기본", "is_ticket": True, "event": None}.items()
466-
467-
468-
@pytest.mark.django_db
469-
def test_admin_option_group_choices_include_product_meta(api_client, ticket_product):
470-
# OptionGroup choices 의 product FK 는 Product.get_choice_meta() 로 category/price/stock/status 메타를 실어야 한다.
471-
response = api_client.get(OPTION_GROUP_CHOICES_URL)
442+
def test_admin_product_selectables_include_meta(api_client, ticket_product):
443+
# selectables 결과의 각 product 는 Product.get_choice_meta() 로 category/price/stock/status 메타를 실어야 한다.
444+
response = api_client.get(PRODUCT_SELECTABLES_URL)
472445
assert response.status_code == HTTP_200_OK
473-
product_choices = {c["const"]: c for c in response.json()["product"]}
446+
body = response.json()
447+
product_meta = {p["const"]: p for p in body["results"]}[str(ticket_product.id)]["meta"]
474448
assert (
475-
product_choices[str(ticket_product.id)]["meta"].items()
449+
product_meta.items()
476450
>= {
477451
"category": str(ticket_product.category),
478452
"price": ticket_product.price,
479453
"stock": ticket_product.stock,
480454
"status": Product.CurrentStatus.ACTIVE.label,
481455
}.items()
482456
)
457+
# meta_schema 는 모델의 choices_meta_schema 를 반영한다.
458+
assert {"category", "price", "stock", "status"} <= set(body["meta_schema"])

app/admin_api/views/cms.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
from cms.models import DomainGroup, Page, Section, Sitemap
1313
from core.authz import IsSuperUser
1414
from core.const.tag import OpenAPITag
15-
from core.viewset.json_schema_viewset import JsonSchemaViewSet
15+
from core.pagination import AdminPagination
16+
from core.viewset.json_schema_viewset import JsonSchemaMixin
17+
from core.viewset.selectables_viewset import SelectablesMixin
1618
from django.db import transaction
1719
from drf_spectacular.utils import extend_schema, extend_schema_view, inline_serializer
1820
from drf_standardized_errors.openapi_serializers import (
@@ -26,7 +28,8 @@
2628

2729

2830
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_CMS]) for m in ADMIN_METHODS})
29-
class DomainGroupAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
31+
class DomainGroupAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
32+
pagination_class = AdminPagination
3033
http_method_names = ["get", "post", "patch", "delete"]
3134
serializer_class = DomainGroupAdminSerializer
3235
permission_classes = [IsSuperUser]
@@ -61,7 +64,8 @@ class SectionData(typing.TypedDict):
6164

6265

6366
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_CMS]) for m in ADMIN_METHODS})
64-
class SitemapAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
67+
class SitemapAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
68+
pagination_class = AdminPagination
6569
http_method_names = ["get", "post", "patch", "delete"]
6670
serializer_class = SitemapAdminSerializer
6771
permission_classes = [IsSuperUser]
@@ -70,7 +74,8 @@ class SitemapAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
7074

7175

7276
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_CMS]) for m in ADMIN_METHODS})
73-
class PageAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
77+
class PageAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
78+
pagination_class = AdminPagination
7479
serializer_class = PageAdminSerializer
7580
permission_classes = [IsSuperUser]
7681
filterset_class = PageAdminFilterSet

app/admin_api/views/document.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
from admin_api.serializers.document import DocumentTemplateAdminSerializer, IssuedDocumentAdminSerializer
33
from core.authz import IsSuperUser
44
from core.const.tag import OpenAPITag
5-
from core.viewset.json_schema_viewset import JsonSchemaViewSet
5+
from core.pagination import AdminPagination
6+
from core.viewset.json_schema_viewset import JsonSchemaMixin
7+
from core.viewset.selectables_viewset import SelectablesMixin
68
from document.models import DocumentTemplate, IssuedDocument
79
from drf_spectacular.utils import extend_schema, extend_schema_view
810
from rest_framework import request, response
@@ -14,15 +16,17 @@
1416

1517

1618
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_DOCUMENT]) for m in TEMPLATE_METHODS})
17-
class DocumentTemplateAdminViewSet(JsonSchemaViewSet, ModelViewSet):
19+
class DocumentTemplateAdminViewSet(JsonSchemaMixin, SelectablesMixin, ModelViewSet):
20+
pagination_class = AdminPagination
1821
http_method_names = ["get", "post", "patch", "delete"]
1922
permission_classes = [IsSuperUser]
2023
serializer_class = DocumentTemplateAdminSerializer
2124
queryset = DocumentTemplate.objects.filter_active().select_related_with_user().order_by("-created_at", "pk")
2225

2326

2427
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_DOCUMENT]) for m in ISSUED_METHODS})
25-
class IssuedDocumentAdminViewSet(JsonSchemaViewSet, ReadOnlyModelViewSet):
28+
class IssuedDocumentAdminViewSet(JsonSchemaMixin, SelectablesMixin, ReadOnlyModelViewSet):
29+
pagination_class = AdminPagination
2630
permission_classes = [IsSuperUser]
2731
filterset_class = IssuedDocumentAdminFilterSet
2832
serializer_class = IssuedDocumentAdminSerializer

app/admin_api/views/event/event.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
from admin_api.serializers.event.event import EventAdminSerializer
44
from core.authz import IsSuperUser
55
from core.const.tag import OpenAPITag
6-
from core.viewset.json_schema_viewset import JsonSchemaViewSet
6+
from core.pagination import AdminPagination
7+
from core.viewset.json_schema_viewset import JsonSchemaMixin
8+
from core.viewset.selectables_viewset import SelectablesMixin
79
from drf_spectacular.utils import extend_schema, extend_schema_view
810
from event.models import Event
911
from rest_framework import viewsets
@@ -12,7 +14,8 @@
1214

1315

1416
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_EVENT]) for m in ADMIN_METHODS})
15-
class EventAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
17+
class EventAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
18+
pagination_class = AdminPagination
1619
http_method_names = ["get", "post", "patch", "delete"]
1720
serializer_class = EventAdminSerializer
1821
permission_classes = [IsSuperUser]

app/admin_api/views/event/presentation.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
)
1919
from core.authz import IsSuperUser
2020
from core.const.tag import OpenAPITag
21-
from core.viewset.json_schema_viewset import JsonSchemaViewSet
21+
from core.pagination import AdminPagination
22+
from core.viewset.json_schema_viewset import JsonSchemaMixin
23+
from core.viewset.selectables_viewset import SelectablesMixin
2224
from drf_spectacular.utils import extend_schema, extend_schema_view
2325
from event.presentation.models import (
2426
Presentation,
@@ -34,7 +36,8 @@
3436

3537

3638
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_PRESENTATION]) for m in ADMIN_METHODS})
37-
class PresentationTypeAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
39+
class PresentationTypeAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
40+
pagination_class = AdminPagination
3841
http_method_names = ["get", "post", "patch", "delete"]
3942
serializer_class = PresentationTypeAdminSerializer
4043
permission_classes = [IsSuperUser]
@@ -47,7 +50,8 @@ class PresentationTypeAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
4750

4851

4952
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_PRESENTATION]) for m in ADMIN_METHODS})
50-
class PresentationCategoryAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
53+
class PresentationCategoryAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
54+
pagination_class = AdminPagination
5155
http_method_names = ["get", "post", "patch", "delete"]
5256
serializer_class = PresentationCategoryAdminSerializer
5357
permission_classes = [IsSuperUser]
@@ -60,7 +64,8 @@ class PresentationCategoryAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet)
6064

6165

6266
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_PRESENTATION]) for m in ADMIN_METHODS})
63-
class PresentationAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
67+
class PresentationAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
68+
pagination_class = AdminPagination
6469
http_method_names = ["get", "post", "patch", "delete"]
6570
serializer_class = PresentationAdminSerializer
6671
permission_classes = [IsSuperUser]
@@ -74,7 +79,8 @@ class PresentationAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
7479

7580

7681
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_PRESENTATION]) for m in ADMIN_METHODS})
77-
class PresentationSpeakerAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
82+
class PresentationSpeakerAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
83+
pagination_class = AdminPagination
7884
http_method_names = ["get", "post", "patch", "delete"]
7985
serializer_class = PresentationSpeakerAdminSerializer
8086
permission_classes = [IsSuperUser]
@@ -85,7 +91,8 @@ class PresentationSpeakerAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
8591

8692

8793
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_PRESENTATION]) for m in ADMIN_METHODS})
88-
class RoomAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
94+
class RoomAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
95+
pagination_class = AdminPagination
8996
http_method_names = ["get", "post", "patch", "delete"]
9097
serializer_class = RoomAdminSerializer
9198
permission_classes = [IsSuperUser]
@@ -94,7 +101,8 @@ class RoomAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
94101

95102

96103
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_PRESENTATION]) for m in ADMIN_METHODS})
97-
class RoomScheduleAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
104+
class RoomScheduleAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
105+
pagination_class = AdminPagination
98106
http_method_names = ["get", "post", "patch", "delete"]
99107
serializer_class = RoomScheduleAdminSerializer
100108
permission_classes = [IsSuperUser]

app/admin_api/views/event/sponsor.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
)
1313
from core.authz import IsSuperUser
1414
from core.const.tag import OpenAPITag
15-
from core.viewset.json_schema_viewset import JsonSchemaViewSet
15+
from core.pagination import AdminPagination
16+
from core.viewset.json_schema_viewset import JsonSchemaMixin
17+
from core.viewset.selectables_viewset import SelectablesMixin
1618
from django.db import models
1719
from drf_spectacular.utils import extend_schema, extend_schema_view
1820
from event.sponsor.models import Sponsor, SponsorTag, SponsorTier
@@ -22,7 +24,8 @@
2224

2325

2426
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_SPONSOR]) for m in ADMIN_METHODS})
25-
class SponsorTierAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
27+
class SponsorTierAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
28+
pagination_class = AdminPagination
2629
http_method_names = ["get", "post", "patch", "delete"]
2730
serializer_class = SponsorTierAdminSerializer
2831
permission_classes = [IsSuperUser]
@@ -42,7 +45,8 @@ class SponsorTierAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
4245

4346

4447
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_SPONSOR]) for m in ADMIN_METHODS})
45-
class SponsorTagAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
48+
class SponsorTagAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
49+
pagination_class = AdminPagination
4650
http_method_names = ["get", "post", "patch", "delete"]
4751
serializer_class = SponsorTagAdminSerializer
4852
permission_classes = [IsSuperUser]
@@ -53,7 +57,8 @@ class SponsorTagAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
5357

5458

5559
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EVENT_SPONSOR]) for m in ADMIN_METHODS})
56-
class SponsorAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
60+
class SponsorAdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
61+
pagination_class = AdminPagination
5762
http_method_names = ["get", "post", "patch", "delete"]
5863
serializer_class = SponsorAdminSerializer
5964
permission_classes = [IsSuperUser]

app/admin_api/views/external_api/google_oauth2.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
)
55
from core.authz import IsSuperUser
66
from core.const.tag import OpenAPITag
7-
from core.viewset.json_schema_viewset import JsonSchemaViewSet
7+
from core.pagination import AdminPagination
8+
from core.viewset.json_schema_viewset import JsonSchemaMixin
9+
from core.viewset.selectables_viewset import SelectablesMixin
810
from drf_spectacular.utils import extend_schema, extend_schema_view
911
from external_api.google_oauth2.models import GoogleOAuth2
1012
from rest_framework import decorators, request, response, status, viewsets
@@ -13,7 +15,8 @@
1315

1416

1517
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_EXT_API_GOOGLE_OAUTH2]) for m in ADMIN_METHODS})
16-
class GoogleOAuth2AdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
18+
class GoogleOAuth2AdminViewSet(JsonSchemaMixin, SelectablesMixin, viewsets.ModelViewSet):
19+
pagination_class = AdminPagination
1720
http_method_names = ["get", "post", "patch", "delete"]
1821
serializer_class = GoogleOAuth2AdminSerializer
1922
permission_classes = [IsSuperUser]

app/admin_api/views/file.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
from admin_api.serializers.file import PublicFileAdmimUploadSerializer, PublicFileAdminSerializer
33
from core.authz import IsSuperUser
44
from core.const.tag import OpenAPITag
5-
from core.viewset.json_schema_viewset import JsonSchemaViewSet
5+
from core.pagination import AdminPagination
6+
from core.viewset.json_schema_viewset import JsonSchemaMixin
7+
from core.viewset.selectables_viewset import SelectablesMixin
68
from drf_spectacular import utils
79
from file.models import PublicFile
810
from rest_framework import decorators, mixins, parsers, request, response, serializers, status, viewsets
@@ -15,9 +17,11 @@ class PublicFileAdminViewSet(
1517
mixins.RetrieveModelMixin,
1618
mixins.DestroyModelMixin,
1719
mixins.ListModelMixin,
18-
JsonSchemaViewSet,
20+
JsonSchemaMixin,
21+
SelectablesMixin,
1922
viewsets.GenericViewSet,
2023
):
24+
pagination_class = AdminPagination
2125
serializer_class = PublicFileAdminSerializer
2226
permission_classes = [IsSuperUser]
2327
filterset_class = PublicFileAdminFilterSet

0 commit comments

Comments
 (0)