From f4dd992799b9e3a4800f77454761f6e78924781a Mon Sep 17 00:00:00 2001 From: yeezy-na-izi Date: Thu, 17 Nov 2022 09:44:21 +0300 Subject: [PATCH 1/4] Fix swagger errors, fix VacancyResponse create --- users/views.py | 11 +++++------ vacancy/serializers.py | 14 ++++++++++++++ vacancy/urls.py | 2 +- vacancy/views.py | 8 ++++---- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/users/views.py b/users/views.py index 9d792157..0ed4426a 100644 --- a/users/views.py +++ b/users/views.py @@ -35,7 +35,6 @@ UserListSerializer, VerifyEmailSerializer, ) - from .filters import UserFilter User = get_user_model() @@ -77,10 +76,10 @@ def post(self, request, *args, **kwargs): return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) -class UserAdditionalRolesView(GenericAPIView): +class UserAdditionalRolesView(APIView): permission_classes = [AllowAny] - def get(self, request, format=None): + def get(self, request): """ Return a tuple of user additional roles types. """ @@ -105,19 +104,19 @@ class UserDetail(RetrieveUpdateDestroyAPIView): serializer_class = UserDetailSerializer -class CurrentUser(APIView): +class CurrentUser(GenericAPIView): queryset = User.objects.get_users_for_detail_view() permission_classes = [IsAuthenticated] serializer_class = UserDetailSerializer def get(self, request): user = request.user - serializer = UserDetailSerializer(user) + serializer = self.get_serializer(user) return Response(serializer.data, status=status.HTTP_200_OK) class UserTypesView(APIView): - def get(self, request, format=None): + def get(self, request): """ Return a list of tuples [(id, name), ..] of user types. """ diff --git a/vacancy/serializers.py b/vacancy/serializers.py index 96bd7e38..1158b8c8 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -1,9 +1,12 @@ +from django.contrib.auth import get_user_model from rest_framework import serializers from projects.models import Project from users.serializers import UserDetailSerializer from vacancy.models import Vacancy, VacancyResponse +User = get_user_model() + class ProjectForVacancySerializer(serializers.ModelSerializer): class Meta: @@ -62,16 +65,27 @@ class Meta: class VacancyResponseListSerializer(serializers.ModelSerializer): is_approved = serializers.BooleanField(read_only=True) user = UserDetailSerializer(read_only=True) + user_id = serializers.IntegerField(write_only=True) class Meta: model = VacancyResponse fields = [ "id", "user", + "user_id", "why_me", "is_approved", "vacancy", ] + extra_kwargs = { + "user_id": {"write_only": True}, + } + + def create(self, validated_data): + user_id = validated_data.pop("user_id") + user = User.objects.get(id=user_id) + vacancy_response = VacancyResponse.objects.create(user=user, **validated_data) + return vacancy_response class VacancyResponseDetailSerializer(serializers.ModelSerializer): diff --git a/vacancy/urls.py b/vacancy/urls.py index a284ec22..530b5f57 100644 --- a/vacancy/urls.py +++ b/vacancy/urls.py @@ -15,7 +15,7 @@ urlpatterns = [ path("", VacancyList.as_view()), path("/", VacancyDetail.as_view()), - path("/responses/", VacancyResponseList.as_view()), + path("/responses/", VacancyResponseList.as_view()), path("responses//", VacancyResponseDetail.as_view()), path("responses//accept", VacancyResponseAccept.as_view()), path("responses//decline", VacancyResponseDecline.as_view()), diff --git a/vacancy/views.py b/vacancy/views.py index e79b6e66..d8dc75ac 100644 --- a/vacancy/views.py +++ b/vacancy/views.py @@ -67,16 +67,16 @@ def get(self, request, *args, **kwargs): def get_queryset(self): return VacancyResponse.objects.get_vacancy_response_for_list_view().filter( - vacancy__id=self.kwargs["pk"] + vacancy__id=self.kwargs["vacancy_id"] ) - def post(self, request, pk): + def post(self, request, vacancy_id): try: request.data["user"] = self.request.user.id - request.data["vacancy"] = pk + request.data["vacancy"] = vacancy_id except AttributeError: pass - return self.create(request, pk) + return self.create(request, vacancy_id) class VacancyResponseDetail(generics.RetrieveUpdateDestroyAPIView): From 03d1802d944418fbe6f957deda616d9a268ea8c6 Mon Sep 17 00:00:00 2001 From: yeezy-na-izi Date: Thu, 17 Nov 2022 09:54:58 +0300 Subject: [PATCH 2/4] Fix VacanciesResponses creation --- vacancy/serializers.py | 17 ++++++++++++++++- vacancy/views.py | 4 +++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/vacancy/serializers.py b/vacancy/serializers.py index 1158b8c8..5e7bc2d5 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -81,9 +81,24 @@ class Meta: "user_id": {"write_only": True}, } + def validate(self, attrs): + vacancy = attrs["vacancy"] + user = self.validate_user_exists(attrs["user_id"]) + + if VacancyResponse.objects.filter(vacancy=vacancy, user=user).exists(): + raise serializers.ValidationError("Vacancy response already exists") + return attrs + + def validate_user_exists(self, value): + try: + user = User.objects.get(pk=value) + except User.DoesNotExist: + raise serializers.ValidationError("User does not exist") + return user + def create(self, validated_data): user_id = validated_data.pop("user_id") - user = User.objects.get(id=user_id) + user = User.objects.get(pk=user_id) vacancy_response = VacancyResponse.objects.create(user=user, **validated_data) return vacancy_response diff --git a/vacancy/views.py b/vacancy/views.py index d8dc75ac..3b28e508 100644 --- a/vacancy/views.py +++ b/vacancy/views.py @@ -72,10 +72,12 @@ def get_queryset(self): def post(self, request, vacancy_id): try: - request.data["user"] = self.request.user.id + request.data["user_id"] = self.request.user.id request.data["vacancy"] = vacancy_id except AttributeError: pass + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) return self.create(request, vacancy_id) From 9a8e0e42ac0aed60e3f0e1e4f77bc27b3464195f Mon Sep 17 00:00:00 2001 From: yeezy-na-izi Date: Thu, 17 Nov 2022 10:00:48 +0300 Subject: [PATCH 3/4] Add birthday to UserDetail serializer --- users/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/serializers.py b/users/serializers.py index 85351b01..e1709407 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -68,7 +68,7 @@ class Meta: "last_name", "patronymic", "speciality", - "avatar", + "birthday" "avatar", "city", "is_active", "member", From e1f2e66ebc8609ea1721bf484a1e0bcd0f867835 Mon Sep 17 00:00:00 2001 From: yeezy-na-izi Date: Thu, 17 Nov 2022 10:03:33 +0300 Subject: [PATCH 4/4] Oops --- users/serializers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/users/serializers.py b/users/serializers.py index e1709407..00a13f82 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -68,7 +68,8 @@ class Meta: "last_name", "patronymic", "speciality", - "birthday" "avatar", + "birthday", + "avatar", "city", "is_active", "member",