Skip to content

Commit 610a091

Browse files
committed
feat(home): add viewsets, serializers and routers for pages and keyword models, remove views, update mixins
1 parent b10b9c8 commit 610a091

File tree

11 files changed

+2373
-42
lines changed

11 files changed

+2373
-42
lines changed

apps/blogs/serializers.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from rest_framework.serializers import ModelSerializer, CharField, StringRelatedField
44

55
from apps.utilities.mixins import ReadOnlyFieldsMixin
6+
from apps.users.serializers import UserMinimalSerializer
67
from .models import Post, Tag, PostReport
78

89

@@ -58,9 +59,22 @@ class Meta:
5859
]
5960

6061

62+
class PostMinimalSerializer(ReadOnlyFieldsMixin, ModelSerializer):
63+
"""Serializer for Post model (Minimal)."""
64+
65+
class Meta:
66+
model = Post
67+
fields = [
68+
"id",
69+
"title",
70+
]
71+
72+
6173
class PostReportReadSerializer(ReadOnlyFieldsMixin, ModelSerializer):
6274
"""Serializer for PostReport model (List)."""
6375

76+
user_id = UserMinimalSerializer()
77+
post_id = PostMinimalSerializer()
6478
priority = CharField(source="get_priority_display")
6579
status = CharField(source="get_status_display")
6680

apps/home/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class PageAdmin(BaseAdmin):
2020

2121
search_fields = ["name"]
2222
list_display = ["name", "is_available", "created_at"]
23-
readonly_fields = ["pk", "created_at", "updated_at"]
23+
readonly_fields = ["pk", "slug", "created_at", "updated_at"]
2424

2525

2626
@admin.register(Keyword)

apps/home/routers.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"""Routers for Home App."""
2+
3+
from django.urls import include
4+
from django.urls import path
5+
from rest_framework.routers import DefaultRouter
6+
7+
from .viewsets import PageViewSet, KeywordViewSet
8+
9+
router = DefaultRouter()
10+
router.register(r"pages", PageViewSet, basename="page")
11+
router.register(r"keywords", KeywordViewSet, basename="keyword")
12+
13+
urlpatterns = [
14+
path("api/v1/", include(router.urls)),
15+
]

apps/home/serializers.py

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,65 @@
33
from rest_framework.serializers import ModelSerializer
44

55
from apps.utilities.mixins import ReadOnlyFieldsMixin
6-
from .models import Keyword
6+
from .models import Page, Keyword
77

88

9-
class KeywordMinimalSerializer(ReadOnlyFieldsMixin, ModelSerializer):
10-
"""Serializer for Keyword model (Minimal)."""
9+
class PageReadSerializer(ReadOnlyFieldsMixin, ModelSerializer):
10+
"""Serializer for Page model (List/retrieve)."""
11+
12+
class Meta:
13+
model = Page
14+
fields = [
15+
"id",
16+
"name",
17+
"slug",
18+
"content",
19+
"created_at",
20+
"updated_at",
21+
]
22+
23+
24+
class PageWriteSerializer(ModelSerializer):
25+
"""Serializer for Page model (Create/update)."""
26+
27+
class Meta:
28+
model = Page
29+
fields = [
30+
"name",
31+
"content",
32+
]
33+
34+
35+
class PageMinimalSerializer(ReadOnlyFieldsMixin, ModelSerializer):
36+
"""Serializer for Page model (Minimal)."""
37+
38+
class Meta:
39+
model = Page
40+
fields = [
41+
"id",
42+
"name",
43+
]
44+
45+
46+
class KeywordReadSerializer(ReadOnlyFieldsMixin, ModelSerializer):
47+
"""Serializer for Keyword model (List/retrieve)."""
48+
49+
class Meta:
50+
model = Keyword
51+
fields = [
52+
"id",
53+
"word",
54+
"slug",
55+
"created_at",
56+
"updated_at",
57+
]
58+
59+
60+
class KeywordWriteSerializer(ModelSerializer):
61+
"""Serializer for Keyword model (Create/update)."""
1162

1263
class Meta:
1364
model = Keyword
14-
fields = ["word", "slug"]
65+
fields = [
66+
"word",
67+
]

apps/home/urls.py

Lines changed: 0 additions & 13 deletions
This file was deleted.

apps/home/views.py

Lines changed: 0 additions & 22 deletions
This file was deleted.

apps/home/viewsets.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
"""ViewSets for Home App."""
2+
3+
from rest_framework.viewsets import ModelViewSet
4+
from rest_framework.permissions import AllowAny
5+
6+
from apps.users.permissions import IsMarketing
7+
from apps.utilities.mixins import ListCacheMixin, LogicalDeleteMixin
8+
from .models import Page, Keyword
9+
from .serializers import (
10+
PageReadSerializer,
11+
PageWriteSerializer,
12+
PageMinimalSerializer,
13+
KeywordReadSerializer,
14+
KeywordWriteSerializer,
15+
)
16+
17+
18+
class PageViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
19+
"""
20+
ViewSet for managing Page instances.
21+
22+
Endpoints:
23+
- GET /api/v1/pages/
24+
- POST /api/v1/pages/
25+
- GET /api/v1/pages/{id}/
26+
- PUT /api/v1/pages/{id}/
27+
- PATCH /api/v1/pages/{id}/
28+
- DELETE /api/v1/pages/{id}/
29+
"""
30+
31+
permission_classes = [IsMarketing]
32+
serializer_class = PageWriteSerializer
33+
search_fields = ["name"]
34+
35+
def get_queryset(self):
36+
if self.action == "list":
37+
return Page.objects.get_available().only("id", "name")
38+
elif self.action == "retrieve":
39+
return Page.objects.get_available().defer("is_available")
40+
41+
# TODO: Add managers
42+
43+
def get_serializer_class(self):
44+
if self.action == "list":
45+
return PageMinimalSerializer
46+
elif self.action == "retrieve":
47+
return PageReadSerializer
48+
return super().get_serializer_class()
49+
50+
def get_permissions(self):
51+
if self.action in ["list", "retrieve"]:
52+
return [AllowAny()]
53+
return super().get_permissions()
54+
55+
56+
class KeywordViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
57+
"""
58+
ViewSet for managing Keywords instances.
59+
60+
Endpoints:
61+
- GET /api/v1/keywords/
62+
- POST /api/v1/keywords/
63+
- GET /api/v1/keywords/{id}/
64+
- PUT /api/v1/keywords/{id}/
65+
- PATCH /api/v1/keywords/{id}/
66+
- DELETE /api/v1/keywords/{id}/
67+
"""
68+
69+
permission_classes = [IsMarketing]
70+
serializer_class = KeywordWriteSerializer
71+
search_fields = ["name"]
72+
73+
def get_queryset(self):
74+
return Keyword.objects.get_available()
75+
76+
def get_serializer_class(self):
77+
if self.action in ["list", "retrieve"]:
78+
return KeywordReadSerializer
79+
return super().get_serializer_class()
80+
81+
def get_permissions(self):
82+
if self.action in ["list", "retrieve"]:
83+
return [AllowAny()]
84+
return super().get_permissions()

apps/jobs/routers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
from django.urls import path
55
from rest_framework.routers import DefaultRouter
66

7-
from .viewsets import PositionViewSet
7+
from .viewsets import PositionViewSet, WorkerViewSet, ApplicantViewSet
88

99
router = DefaultRouter()
1010
router.register(r"positions", PositionViewSet, basename="position")
11+
router.register(r"workers", WorkerViewSet, basename="worker")
12+
router.register(r"applicants", ApplicantViewSet, basename="applicant")
1113

1214
urlpatterns = [
1315
path("api/v1/", include(router.urls)),

apps/utilities/mixins.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ class ListCacheMixin:
4040
@method_decorator(cache_page(60 * 60 * 2))
4141
@method_decorator(vary_on_headers("User-Agent"))
4242
def list(self, request, *args, **kwargs):
43+
queryset = self.filter_queryset(self.get_queryset())
44+
model_name = queryset.model._meta.verbose_name_plural.lower()
45+
if not queryset.exists():
46+
return Response({"message": f"No {model_name} available"})
4347
return super().list(request, *args, **kwargs)
4448

4549

config/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
path("", include("apps.promotions.routers")),
3535
path("", include("apps.locations.routers")),
3636
path("", include("apps.blogs.routers")),
37+
path("", include("apps.home.routers")),
3738
path("", include("apps.jobs.routers")),
3839
# Apps urls
39-
path("", include("apps.home.urls")),
4040
path("", include("apps.drivers.urls")),
4141
path("", include("apps.orders.urls")),
4242
path("", include("apps.users.urls")),

0 commit comments

Comments
 (0)