Skip to content

Commit cf8a4ef

Browse files
authored
Merge pull request #568 from PROCOLLAB-github/fix/user_invite
Скорректирована выдача приглашений согласно бизнес-логике
2 parents f384285 + 712b420 commit cf8a4ef

4 files changed

Lines changed: 27 additions & 16 deletions

File tree

invites/filters.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,13 @@ class InviteFilter(filters.FilterSet):
1919
"""
2020

2121
def __init__(self, *args, **kwargs):
22-
"""if user filter is not passed, default to request.user"""
2322
super().__init__(*args, **kwargs)
24-
if self.data.get("user") is None:
25-
# default filtering by current user
26-
self.data = dict(self.data)
27-
self.data["user"] = kwargs.get("request").user.id
28-
# if user == "any", remove the filter
29-
if self.data.get("user") == "any":
30-
self.data = dict(self.data)
31-
self.data.pop("user")
23+
self.data = dict(self.data)
24+
request = kwargs.get("request")
25+
self.data["user"] = request.user.id if request and request.user.is_authenticated else None
3226

3327
project = filters.Filter(method=project_id_filter)
3428

3529
class Meta:
3630
model = Invite
37-
fields = ("project", "user")
31+
fields = ("project",)

invites/serializers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class Meta:
1919
"specialization",
2020
"is_accepted",
2121
]
22+
read_only_fields = ["is_accepted"]
2223

2324
def validate(self, attrs):
2425
project = attrs["project"]

invites/tests.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ def setUp(self) -> None:
2929
"user": None,
3030
"motivational_letter": "hello",
3131
"role": "Developer",
32-
"is_accepted": False,
3332
}
3433

3534
self.project_create_data = {
@@ -59,7 +58,7 @@ def test_invites_creation(self):
5958
)
6059
self.assertEqual(response.data["project"]["id"], create_user["project"])
6160
self.assertEqual(response.data["role"], create_user["role"])
62-
self.assertEqual(response.data["is_accepted"], create_user["is_accepted"])
61+
self.assertIsNone(response.data["is_accepted"])
6362

6463
def test_invites_creation_with_empty_text(self):
6564
user_main = self._user_create("example@gmail.com")

invites/views.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
class InviteList(generics.ListCreateAPIView):
12-
queryset = Invite.objects.get_invite_for_list_view()
12+
queryset = Invite.objects.get_invite_for_list_view().filter(is_accepted__isnull=True)
1313
serializer_class = InviteDetailSerializer
1414
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
1515
filter_backends = (filters.DjangoFilterBackend,)
@@ -47,13 +47,30 @@ def post(self, request, *args, **kwargs):
4747
invite = self.get_object() # type: Invite
4848
if invite.user != request.user:
4949
return Response(status=status.HTTP_403_FORBIDDEN)
50+
if invite.is_accepted is True:
51+
return Response(
52+
{"detail": "Invite has already been accepted."},
53+
status=status.HTTP_409_CONFLICT,
54+
)
55+
if invite.is_accepted is False:
56+
return Response(
57+
{"detail": "Invite has already been declined."},
58+
status=status.HTTP_409_CONFLICT,
59+
)
5060
# add user to project collaborators
51-
Collaborator.objects.create(
61+
collaborator, created = Collaborator.objects.get_or_create(
5262
user=invite.user,
5363
project=invite.project,
54-
role=invite.role,
55-
specialization=invite.specialization,
64+
defaults={
65+
"role": invite.role,
66+
"specialization": invite.specialization,
67+
},
5668
)
69+
if not created:
70+
return Response(
71+
{"detail": "User is already a collaborator of this project."},
72+
status=status.HTTP_409_CONFLICT,
73+
)
5774
invite.is_accepted = True
5875
invite.save()
5976
return Response(status=status.HTTP_200_OK)

0 commit comments

Comments
 (0)