Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class Migration(migrations.Migration):
name="publish_projects_after_finish",
field=models.BooleanField(
default=False,
help_text="Если включено, проекты участников могут стать публичными после завершения программы",
help_text="Если включено, проекты участников станут публичными после завершения программы",
verbose_name="Публиковать проекты после окончания программы",
),
),
Expand Down
2 changes: 1 addition & 1 deletion partner_programs/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class PartnerProgram(models.Model):
publish_projects_after_finish = models.BooleanField(
default=False,
verbose_name="Публиковать проекты после окончания программы",
help_text="Если включено, проекты участников могут стать публичными после завершения программы",
help_text="Если включено, проекты участников станут публичными после завершения программы",
)
datetime_registration_ends = models.DateTimeField(
verbose_name="Дата окончания регистрации",
Expand Down
23 changes: 21 additions & 2 deletions partner_programs/serializers/programs.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@ class PartnerProgramListSerializer(serializers.ModelSerializer):
method_name="get_short_description"
)
is_user_liked = serializers.SerializerMethodField(method_name="get_is_user_liked")
is_user_member = serializers.SerializerMethodField(method_name="get_is_user_member")

def _get_user(self):
user = self.context.get("user")
if user:
return user
request = self.context.get("request")
if request:
return request.user
return None

def count_likes(self, program):
return get_likes_count(program)
Expand All @@ -38,11 +48,19 @@ def get_short_description(self, program):

def get_is_user_liked(self, obj):
# fixme: copy-paste in every serializer...
user = self.context.get("user")
if user:
user = self._get_user()
if user and user.is_authenticated:
return is_fan(obj, user)
return False

def get_is_user_member(self, program):
if hasattr(program, "is_user_member"):
return bool(program.is_user_member)
user = self._get_user()
if not user or not user.is_authenticated:
return False
return program.users.filter(pk=user.pk).exists()

class Meta:
model = PartnerProgram
fields = (
Expand All @@ -60,6 +78,7 @@ class Meta:
"views_count",
"likes_count",
"is_user_liked",
"is_user_member",
)


Expand Down
35 changes: 22 additions & 13 deletions partner_programs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from django.contrib.auth import get_user_model
from django.db import IntegrityError, transaction
from django.db.models import Prefetch
from django.db.models import Exists, OuterRef, Prefetch
from django.http import FileResponse
from django.shortcuts import get_object_or_404
from django.utils import timezone
Expand Down Expand Up @@ -68,19 +68,28 @@ def get_queryset(self):
base_qs = super().get_queryset()
participating_flag = self.request.query_params.get("participating")
if not participating_flag:
return base_qs
qs = base_qs
elif not self.request.user.is_authenticated:
qs = PartnerProgram.objects.none()
else:
now = timezone.now()
qs = (
base_qs.filter(
partner_program_profiles__user=self.request.user,
datetime_finished__gte=now,
)
.distinct()
)

if not self.request.user.is_authenticated:
return PartnerProgram.objects.none()
user = self.request.user
if not user.is_authenticated:
return qs

now = timezone.now()
return (
base_qs.filter(
partner_program_profiles__user=self.request.user,
datetime_finished__gte=now,
)
.distinct()
member_qs = PartnerProgramUserProfile.objects.filter(
partner_program=OuterRef("pk"),
user=user,
)
return qs.annotate(is_user_member=Exists(member_qs))


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

class PartnerProgramProjectApplyView(GenericAPIView):
"""
Создание проекта сразу в рамках программы (подать проект).
Проект создаётся как черновик и строго непубличный.
Создание проекта в рамках программы (подать проект).
Проект создаётся как непубличный черновик.
"""

permission_classes = [IsAuthenticated]
Expand Down