diff --git a/users/serializers.py b/users/serializers.py index 85351b01..00a13f82 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -68,6 +68,7 @@ class Meta: "last_name", "patronymic", "speciality", + "birthday", "avatar", "city", "is_active", 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..5e7bc2d5 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,42 @@ 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 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(pk=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..3b28e508 100644 --- a/vacancy/views.py +++ b/vacancy/views.py @@ -67,16 +67,18 @@ 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["user_id"] = self.request.user.id + request.data["vacancy"] = vacancy_id except AttributeError: pass - return self.create(request, pk) + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + return self.create(request, vacancy_id) class VacancyResponseDetail(generics.RetrieveUpdateDestroyAPIView):