Skip to content

Commit 54d6325

Browse files
committed
В список программ добавлено поле отражающее участие авторизованного пользователя в программах
1 parent 14bdd99 commit 54d6325

4 files changed

Lines changed: 45 additions & 17 deletions

File tree

partner_programs/migrations/0015_partnerprogram_publish_projects_after_finish.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Migration(migrations.Migration):
1515
name="publish_projects_after_finish",
1616
field=models.BooleanField(
1717
default=False,
18-
help_text="Если включено, проекты участников могут стать публичными после завершения программы",
18+
help_text="Если включено, проекты участников станут публичными после завершения программы",
1919
verbose_name="Публиковать проекты после окончания программы",
2020
),
2121
),

partner_programs/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class PartnerProgram(models.Model):
116116
publish_projects_after_finish = models.BooleanField(
117117
default=False,
118118
verbose_name="Публиковать проекты после окончания программы",
119-
help_text="Если включено, проекты участников могут стать публичными после завершения программы",
119+
help_text="Если включено, проекты участников станут публичными после завершения программы",
120120
)
121121
datetime_registration_ends = models.DateTimeField(
122122
verbose_name="Дата окончания регистрации",

partner_programs/serializers/programs.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ class PartnerProgramListSerializer(serializers.ModelSerializer):
2424
method_name="get_short_description"
2525
)
2626
is_user_liked = serializers.SerializerMethodField(method_name="get_is_user_liked")
27+
is_user_member = serializers.SerializerMethodField(method_name="get_is_user_member")
28+
29+
def _get_user(self):
30+
user = self.context.get("user")
31+
if user:
32+
return user
33+
request = self.context.get("request")
34+
if request:
35+
return request.user
36+
return None
2737

2838
def count_likes(self, program):
2939
return get_likes_count(program)
@@ -38,11 +48,19 @@ def get_short_description(self, program):
3848

3949
def get_is_user_liked(self, obj):
4050
# fixme: copy-paste in every serializer...
41-
user = self.context.get("user")
42-
if user:
51+
user = self._get_user()
52+
if user and user.is_authenticated:
4353
return is_fan(obj, user)
4454
return False
4555

56+
def get_is_user_member(self, program):
57+
if hasattr(program, "is_user_member"):
58+
return bool(program.is_user_member)
59+
user = self._get_user()
60+
if not user or not user.is_authenticated:
61+
return False
62+
return program.users.filter(pk=user.pk).exists()
63+
4664
class Meta:
4765
model = PartnerProgram
4866
fields = (
@@ -60,6 +78,7 @@ class Meta:
6078
"views_count",
6179
"likes_count",
6280
"is_user_liked",
81+
"is_user_member",
6382
)
6483

6584

partner_programs/views.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from django.contrib.auth import get_user_model
66
from django.db import IntegrityError, transaction
7-
from django.db.models import Prefetch
7+
from django.db.models import Exists, OuterRef, Prefetch
88
from django.http import FileResponse
99
from django.shortcuts import get_object_or_404
1010
from django.utils import timezone
@@ -68,19 +68,28 @@ def get_queryset(self):
6868
base_qs = super().get_queryset()
6969
participating_flag = self.request.query_params.get("participating")
7070
if not participating_flag:
71-
return base_qs
71+
qs = base_qs
72+
elif not self.request.user.is_authenticated:
73+
qs = PartnerProgram.objects.none()
74+
else:
75+
now = timezone.now()
76+
qs = (
77+
base_qs.filter(
78+
partner_program_profiles__user=self.request.user,
79+
datetime_finished__gte=now,
80+
)
81+
.distinct()
82+
)
7283

73-
if not self.request.user.is_authenticated:
74-
return PartnerProgram.objects.none()
84+
user = self.request.user
85+
if not user.is_authenticated:
86+
return qs
7587

76-
now = timezone.now()
77-
return (
78-
base_qs.filter(
79-
partner_program_profiles__user=self.request.user,
80-
datetime_finished__gte=now,
81-
)
82-
.distinct()
88+
member_qs = PartnerProgramUserProfile.objects.filter(
89+
partner_program=OuterRef("pk"),
90+
user=user,
8391
)
92+
return qs.annotate(is_user_member=Exists(member_qs))
8493

8594

8695
class PartnerProgramDetail(generics.RetrieveAPIView):
@@ -108,8 +117,8 @@ def get(self, request, *args, **kwargs):
108117

109118
class PartnerProgramProjectApplyView(GenericAPIView):
110119
"""
111-
Создание проекта сразу в рамках программы (подать проект).
112-
Проект создаётся как черновик и строго непубличный.
120+
Создание проекта в рамках программы (подать проект).
121+
Проект создаётся как непубличный черновик.
113122
"""
114123

115124
permission_classes = [IsAuthenticated]

0 commit comments

Comments
 (0)