Skip to content

Commit 4d610dd

Browse files
committed
pro-85: route for specialization list
1 parent 4b2c87d commit 4d610dd

4 files changed

Lines changed: 54 additions & 1 deletion

File tree

users/filters.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.db.models import Q
44
from django_filters import rest_framework as filters
55

6+
from core.models import Specialization
67
from partner_programs.models import PartnerProgram, PartnerProgramUserProfile
78

89
User = get_user_model()
@@ -107,3 +108,11 @@ class Meta:
107108
"user_type",
108109
"speciality",
109110
)
111+
112+
113+
class SpecializationFilter(filters.FilterSet):
114+
name__icontains = filters.Filter(field_name="name", lookup_expr="icontains")
115+
116+
class Meta:
117+
model = Specialization
118+
fields = ("name",)

users/serializers.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from rest_framework import serializers
33
from django.core.cache import cache
44

5+
from core.models import SpecializationCategory, Specialization
56
from core.services import get_views_count
67
from core.utils import get_user_online_cache_key
78
from projects.models import Project, Collaborator
@@ -390,3 +391,20 @@ def is_valid(self, *, raise_exception=False):
390391
def validate(self, data):
391392
super().validate(data)
392393
return validate_project(data)
394+
395+
396+
class SpecializationSerializer(serializers.ModelSerializer[Specialization]):
397+
class Meta:
398+
model = SpecializationCategory
399+
fields = [
400+
"id",
401+
"name",
402+
]
403+
404+
405+
class SpecializationsSerializer(serializers.ModelSerializer[SpecializationCategory]):
406+
specializations = SpecializationSerializer(many=True)
407+
408+
class Meta:
409+
model = SpecializationCategory
410+
fields = ["id", "name", "specializations"]

users/urls.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
CurrentUserProgramsTags,
2222
ForceVerifyView,
2323
UserSubscribedProjectsList,
24+
UserSpecializationsNestedView,
25+
UserSpecializationsInlineView,
2426
)
2527

2628
app_name = "users"
@@ -34,6 +36,8 @@
3436
path("users/liked/", LikedProjectList.as_view()),
3537
path("users/roles/", UserAdditionalRolesView.as_view()),
3638
path("users/types/", UserTypesView.as_view()),
39+
path("users/specializations/nested/", UserSpecializationsNestedView.as_view()),
40+
path("users/specializations/inline/", UserSpecializationsInlineView.as_view()),
3741
path("users/<int:pk>/", UserDetail.as_view()),
3842
path("users/<int:pk>/subscribed_projects/", UserSubscribedProjectsList.as_view()),
3943
path("users/<int:pk>/set_onboarding_stage/", SetUserOnboardingStage.as_view()),

users/views.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from rest_framework.views import APIView
2222
from rest_framework_simplejwt.tokens import RefreshToken, TokenError
2323

24+
from core.models import SpecializationCategory, Specialization
2425
from core.pagination import Pagination
2526
from core.permissions import IsOwnerOrReadOnly
2627
from events.models import Event
@@ -54,8 +55,10 @@
5455
ResendVerifyEmailSerializer,
5556
UserProjectListSerializer,
5657
UserSubscribedProjectsSerializer,
58+
SpecializationsSerializer,
59+
SpecializationSerializer,
5760
)
58-
from .filters import UserFilter
61+
from .filters import UserFilter, SpecializationFilter
5962
from .pagination import UsersPagination
6063
from .services.verification import VerificationTasks
6164

@@ -386,3 +389,22 @@ def get_queryset(self):
386389
return user.subscribed_projects.all()
387390
except User.DoesNotExist:
388391
raise exceptions.NotFound
392+
393+
394+
class UserSpecializationsNestedView(GenericAPIView):
395+
serializer_class = SpecializationsSerializer
396+
queryset = SpecializationCategory.objects.all()
397+
398+
def get(self, request):
399+
data = self.serializer_class(self.get_queryset(), many=True).data
400+
return Response(status=status.HTTP_200_OK, data=data)
401+
402+
403+
class UserSpecializationsInlineView(ListAPIView):
404+
serializer_class = SpecializationSerializer
405+
pagination_class = Pagination
406+
filter_backends = (filters.DjangoFilterBackend,)
407+
filterset_class = SpecializationFilter
408+
409+
def get_queryset(self):
410+
return Specialization.objects.all()

0 commit comments

Comments
 (0)