Skip to content

Commit df7f956

Browse files
authored
Merge pull request #86 from PROCOLLAB-github/dev
Dev
2 parents bfc1339 + 5bb45cc commit df7f956

3 files changed

Lines changed: 43 additions & 2 deletions

File tree

projects/filters.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.db.models import Count
12
from django_filters import rest_framework as filters
23

34
from projects.models import Project
@@ -11,16 +12,28 @@ class ProjectFilter(filters.FilterSet):
1112
Parameters to filter by:
1213
industry (int), step (int), region (str), name__contains (str),
1314
description__contains (str), collaborator__user__in (List[int]),
14-
datetime_created__gt (datetime.datetime)
15+
datetime_created__gt (datetime.datetime), step (int), any_vacancies (bool),
16+
member_count__gt (int), member_count__lt (int), leader (int)
1517
1618
Examples:
1719
?industry=1&name__contains=clown
1820
equals to .filter(industry=1, name__contains='clown')
1921
?datetime_created__gt=25.10.2022
2022
equals to .filter(datetime_created__gt=datetime.datetime(...))
2123
?collaborator__user__in=1,2 equals to .filter(collaborator__user__in=[1, 2])
24+
?step=1 equals to .filter(step=1)
25+
?any_vacancies=true equals to .filter(any_vacancies=True)
26+
?collaborator__count__gt=1 equals to .filter(collaborator__count__gt=1)
2227
"""
2328

29+
@classmethod
30+
def filter_collaborator_count_lt(cls, queryset, name, value):
31+
return queryset.alias(Count("collaborator")).filter(collaborator__count__lt=value)
32+
33+
@classmethod
34+
def filter_collaborator_count_gt(cls, queryset, name, value):
35+
return queryset.alias(Count("collaborator")).filter(collaborator__count__gt=value)
36+
2437
name__contains = filters.Filter(field_name="name", lookup_expr="contains")
2538
description__contains = filters.Filter(
2639
field_name="description", lookup_expr="contains"
@@ -32,6 +45,18 @@ class ProjectFilter(filters.FilterSet):
3245
field_name="datetime_created", lookup_expr="gt"
3346
)
3447

48+
# filters by whether there are any vacancies in the project
49+
any_vacancies = filters.BooleanFilter(
50+
field_name="vacancies", lookup_expr="isnull", exclude=True
51+
)
52+
collaborator__count__gt = filters.NumberFilter(
53+
field_name="collaborator", lookup_expr="count__gt"
54+
)
55+
collaborator__count__lt = filters.NumberFilter(
56+
field_name="collaborator", method="filter_collaborator_count_lt"
57+
)
58+
step = filters.NumberFilter(field_name="step")
59+
3560
class Meta:
3661
model = Project
37-
fields = ("industry", "step", "region", "leader")
62+
fields = ("industry", "step", "region", "leader", "step")

users/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
UserList,
1414
UserTypesView,
1515
VerifyEmail,
16+
LogoutView,
1617
)
1718

1819
app_name = "users"
@@ -30,6 +31,7 @@
3031
path("users/current/", CurrentUser.as_view()),
3132
path("users/achievements/", AchievementList.as_view()),
3233
path("users/achievements/<int:pk>/", AchievementDetail.as_view()),
34+
path("logout/", LogoutView.as_view()),
3335
re_path(
3436
r"^account-confirm-email/",
3537
VerifyEmail.as_view(),

users/views.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,3 +331,17 @@ def get(self, request):
331331
many=True,
332332
)
333333
return Response(serializer.data, status=status.HTTP_200_OK)
334+
335+
336+
class LogoutView(APIView):
337+
permission_classes = [IsAuthenticated]
338+
339+
def post(self, request):
340+
try:
341+
# get request's refresh token from headers
342+
refresh_token = request.headers["Authorization"].split(" ")[1]
343+
# blacklist the refresh token
344+
RefreshToken(refresh_token).blacklist()
345+
return Response(status=status.HTTP_205_RESET_CONTENT)
346+
except TokenError:
347+
return Response(status=status.HTTP_400_BAD_REQUEST)

0 commit comments

Comments
 (0)