Skip to content

Commit 426d531

Browse files
committed
refactor: include exists action in quibletviewset for checkin
1 parent 7ae1cb1 commit 426d531

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

backend/apps/quiblet/api/v1/serializers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,8 @@ class QuibletSlimSerializer(serializers.ModelSerializer):
2121
class Meta:
2222
model = QuibletModel
2323
fields = ('name', 'avatar')
24+
25+
26+
class QuibletExistsSerializer(serializers.Serializer):
27+
exists = serializers.BooleanField()
28+
name = serializers.CharField()

backend/apps/quiblet/api/v1/viewsets.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,50 @@
1+
from http import HTTPMethod
12
from typing import cast
23

3-
from rest_framework.viewsets import ModelViewSet
4+
from django.db.models import QuerySet
5+
from rest_framework import exceptions, response, viewsets
6+
from rest_framework.decorators import action
47

58
from common.patches.request import PatchedHttpRequest
69

710
from ...models import QuibletModel
8-
from .serializers import QuibletSerializer
11+
from .serializers import QuibletExistsSerializer, QuibletSerializer
912

1013

11-
class QuibletModelViewSet(ModelViewSet):
14+
class QuibletModelViewSet(viewsets.ModelViewSet):
1215
queryset = QuibletModel.objects.all()
1316
serializer_class = QuibletSerializer
17+
lookup_field = 'name'
18+
19+
def get_queryset(self) -> QuerySet[QuibletModel]: # pyright: ignore
20+
return super().get_queryset()
21+
22+
def get_object(self) -> QuibletModel: # pyright: ignore
23+
qs = self.get_queryset()
24+
filter_kwargs = {f'{self.lookup_field}': self.kwargs[self.lookup_field]}
25+
obj = qs.filter(**filter_kwargs).first()
26+
27+
if not obj:
28+
raise exceptions.NotFound(
29+
f'Quiblet with name {self.kwargs[self.lookup_field]} not found.'
30+
)
31+
return obj
32+
33+
def get_serializer_class(self): # pyright: ignore
34+
if self.action == 'exists':
35+
return QuibletExistsSerializer
36+
return super().get_serializer_class()
37+
38+
@action(detail=True, methods=[HTTPMethod.GET])
39+
def exists(self, request, name=None):
40+
res = dict(exists=False, name=name)
41+
42+
quiblet = self.get_queryset().filter(name__iexact=name).first()
43+
if quiblet is not None:
44+
res['exists'] = True
45+
res['name'] = quiblet.name
46+
47+
return response.Response(res)
1448

1549
def perform_create(self, serializer):
1650
patched_request = cast(PatchedHttpRequest, self.request)

backend/apps/quiblet/models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@
1313

1414

1515
class QuibletModel(AvatarMixin, CreatedAtMixin, IsPublicMixin):
16-
name = models.CharField(_('name'), unique=True, max_length=25)
16+
name = models.CharField(
17+
_('name'),
18+
unique=True,
19+
max_length=25,
20+
error_messages={'unique': 'Quiblet with this name already exists.'},
21+
)
1722
description = models.TextField(_('description'))
1823
cover = models.ImageField(
1924
_('cover'),

0 commit comments

Comments
 (0)