Skip to content

Commit f30400a

Browse files
committed
Скорректирована выдача приглашений согласно бизнес-логике
1 parent 41a87c0 commit f30400a

2 files changed

Lines changed: 25 additions & 14 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/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)