Skip to content

Commit 863aabe

Browse files
authored
Merge pull request #539 from PROCOLLAB-github/fix/access_to_participants
Добавлена ручка для вывода проектов участвующих в программах
2 parents e896e39 + 628e2d1 commit 863aabe

3 files changed

Lines changed: 48 additions & 1 deletion

File tree

partner_programs/permissions.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,32 @@
11
from rest_framework.permissions import BasePermission
22

3+
from partner_programs.models import PartnerProgram
4+
35

46
class IsProjectLeader(BasePermission):
57
def has_object_permission(self, request, view, obj):
68
return obj.project.leader == request.user
9+
10+
11+
class IsExpertOrManagerOfProgram(BasePermission):
12+
"""
13+
Доступ разрешён только экспертам и менеджерам конкретной программы.
14+
"""
15+
16+
def has_permission(self, request, view):
17+
if not request.user or not request.user.is_authenticated:
18+
return False
19+
20+
program_id = view.kwargs.get("pk")
21+
if not program_id:
22+
return False
23+
24+
try:
25+
program = PartnerProgram.objects.get(pk=program_id)
26+
except PartnerProgram.DoesNotExist:
27+
return False
28+
29+
if program.is_manager(request.user):
30+
return True
31+
32+
return program.experts.filter(user=request.user).exists()

partner_programs/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
PartnerProgramDataSchema,
77
PartnerProgramDetail,
88
PartnerProgramList,
9+
PartnerProgramProjectsAPIView,
910
PartnerProgramProjectSubmitView,
1011
PartnerProgramRegister,
1112
PartnerProgramSetLiked,
@@ -44,4 +45,9 @@
4445
ProgramProjectFilterAPIView.as_view(),
4546
name="program-projects-filter",
4647
),
48+
path(
49+
"<int:pk>/projects/",
50+
PartnerProgramProjectsAPIView.as_view(),
51+
name="partner-program-projects",
52+
),
4753
]

partner_programs/views.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
PartnerProgramUserProfile,
2424
)
2525
from partner_programs.pagination import PartnerProgramPagination
26-
from partner_programs.permissions import IsProjectLeader
26+
from partner_programs.permissions import IsExpertOrManagerOfProgram, IsProjectLeader
2727
from partner_programs.serializers import (
2828
PartnerProgramDataSchemaSerializer,
2929
PartnerProgramFieldSerializer,
@@ -424,3 +424,18 @@ def post(self, request, pk):
424424
projects, many=True, context={"request": request}
425425
)
426426
return paginator.get_paginated_response(serializer_out.data)
427+
428+
429+
class PartnerProgramProjectsAPIView(generics.ListAPIView):
430+
"""
431+
Список всех проектов участников конкретной партнёрской программы.
432+
Доступ разрешён только менеджерам и экспертам программы.
433+
"""
434+
435+
serializer_class = ProjectListSerializer
436+
permission_classes = [IsAuthenticated, IsExpertOrManagerOfProgram]
437+
pagination_class = PartnerProgramPagination
438+
439+
def get_queryset(self):
440+
program = get_object_or_404(PartnerProgram, pk=self.kwargs["pk"])
441+
return Project.objects.filter(program_links__partner_program=program).distinct()

0 commit comments

Comments
 (0)