Skip to content

Commit 418e679

Browse files
committed
Merge branch 'dev' of https://github.com/PROCOLLAB-github/api into dev
2 parents 6963437 + e1f2e66 commit 418e679

4 files changed

Lines changed: 42 additions & 12 deletions

File tree

users/views.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
UserListSerializer,
3636
VerifyEmailSerializer,
3737
)
38-
3938
from .filters import UserFilter
4039

4140
User = get_user_model()
@@ -77,10 +76,10 @@ def post(self, request, *args, **kwargs):
7776
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
7877

7978

80-
class UserAdditionalRolesView(GenericAPIView):
79+
class UserAdditionalRolesView(APIView):
8180
permission_classes = [AllowAny]
8281

83-
def get(self, request, format=None):
82+
def get(self, request):
8483
"""
8584
Return a tuple of user additional roles types.
8685
"""
@@ -105,19 +104,19 @@ class UserDetail(RetrieveUpdateDestroyAPIView):
105104
serializer_class = UserDetailSerializer
106105

107106

108-
class CurrentUser(APIView):
107+
class CurrentUser(GenericAPIView):
109108
queryset = User.objects.get_users_for_detail_view()
110109
permission_classes = [IsAuthenticated]
111110
serializer_class = UserDetailSerializer
112111

113112
def get(self, request):
114113
user = request.user
115-
serializer = UserDetailSerializer(user)
114+
serializer = self.get_serializer(user)
116115
return Response(serializer.data, status=status.HTTP_200_OK)
117116

118117

119118
class UserTypesView(APIView):
120-
def get(self, request, format=None):
119+
def get(self, request):
121120
"""
122121
Return a list of tuples [(id, name), ..] of user types.
123122
"""

vacancy/serializers.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
from django.contrib.auth import get_user_model
12
from rest_framework import serializers
23

34
from projects.models import Project
45
from users.serializers import UserDetailSerializer
56
from vacancy.models import Vacancy, VacancyResponse
67

8+
User = get_user_model()
9+
710

811
class ProjectForVacancySerializer(serializers.ModelSerializer):
912
class Meta:
@@ -62,16 +65,42 @@ class Meta:
6265
class VacancyResponseListSerializer(serializers.ModelSerializer):
6366
is_approved = serializers.BooleanField(read_only=True)
6467
user = UserDetailSerializer(read_only=True)
68+
user_id = serializers.IntegerField(write_only=True)
6569

6670
class Meta:
6771
model = VacancyResponse
6872
fields = [
6973
"id",
7074
"user",
75+
"user_id",
7176
"why_me",
7277
"is_approved",
7378
"vacancy",
7479
]
80+
extra_kwargs = {
81+
"user_id": {"write_only": True},
82+
}
83+
84+
def validate(self, attrs):
85+
vacancy = attrs["vacancy"]
86+
user = self.validate_user_exists(attrs["user_id"])
87+
88+
if VacancyResponse.objects.filter(vacancy=vacancy, user=user).exists():
89+
raise serializers.ValidationError("Vacancy response already exists")
90+
return attrs
91+
92+
def validate_user_exists(self, value):
93+
try:
94+
user = User.objects.get(pk=value)
95+
except User.DoesNotExist:
96+
raise serializers.ValidationError("User does not exist")
97+
return user
98+
99+
def create(self, validated_data):
100+
user_id = validated_data.pop("user_id")
101+
user = User.objects.get(pk=user_id)
102+
vacancy_response = VacancyResponse.objects.create(user=user, **validated_data)
103+
return vacancy_response
75104

76105

77106
class VacancyResponseDetailSerializer(serializers.ModelSerializer):

vacancy/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
urlpatterns = [
1616
path("", VacancyList.as_view()),
1717
path("<int:pk>/", VacancyDetail.as_view()),
18-
path("<int:pk>/responses/", VacancyResponseList.as_view()),
18+
path("<int:vacancy_id>/responses/", VacancyResponseList.as_view()),
1919
path("responses/<int:pk>/", VacancyResponseDetail.as_view()),
2020
path("responses/<int:pk>/accept", VacancyResponseAccept.as_view()),
2121
path("responses/<int:pk>/decline", VacancyResponseDecline.as_view()),

vacancy/views.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,18 @@ def get(self, request, *args, **kwargs):
6767

6868
def get_queryset(self):
6969
return VacancyResponse.objects.get_vacancy_response_for_list_view().filter(
70-
vacancy__id=self.kwargs["pk"]
70+
vacancy__id=self.kwargs["vacancy_id"]
7171
)
7272

73-
def post(self, request, pk):
73+
def post(self, request, vacancy_id):
7474
try:
75-
request.data["user"] = self.request.user.id
76-
request.data["vacancy"] = pk
75+
request.data["user_id"] = self.request.user.id
76+
request.data["vacancy"] = vacancy_id
7777
except AttributeError:
7878
pass
79-
return self.create(request, pk)
79+
serializer = self.get_serializer(data=request.data)
80+
serializer.is_valid(raise_exception=True)
81+
return self.create(request, vacancy_id)
8082

8183

8284
class VacancyResponseDetail(generics.RetrieveUpdateDestroyAPIView):

0 commit comments

Comments
 (0)