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
26 changes: 26 additions & 0 deletions partner_programs/permissions.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,32 @@
from rest_framework.permissions import BasePermission

from partner_programs.models import PartnerProgram


class IsProjectLeader(BasePermission):
def has_object_permission(self, request, view, obj):
return obj.project.leader == request.user


class IsExpertOrManagerOfProgram(BasePermission):
"""
Доступ разрешён только экспертам и менеджерам конкретной программы.
"""

def has_permission(self, request, view):
if not request.user or not request.user.is_authenticated:
return False

program_id = view.kwargs.get("pk")
if not program_id:
return False

try:
program = PartnerProgram.objects.get(pk=program_id)
except PartnerProgram.DoesNotExist:
return False

if program.is_manager(request.user):
return True

return program.experts.filter(user=request.user).exists()
6 changes: 6 additions & 0 deletions partner_programs/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
PartnerProgramDataSchema,
PartnerProgramDetail,
PartnerProgramList,
PartnerProgramProjectsAPIView,
PartnerProgramProjectSubmitView,
PartnerProgramRegister,
PartnerProgramSetLiked,
Expand Down Expand Up @@ -44,4 +45,9 @@
ProgramProjectFilterAPIView.as_view(),
name="program-projects-filter",
),
path(
"<int:pk>/projects/",
PartnerProgramProjectsAPIView.as_view(),
name="partner-program-projects",
),
]
17 changes: 16 additions & 1 deletion partner_programs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
PartnerProgramUserProfile,
)
from partner_programs.pagination import PartnerProgramPagination
from partner_programs.permissions import IsProjectLeader
from partner_programs.permissions import IsExpertOrManagerOfProgram, IsProjectLeader
from partner_programs.serializers import (
PartnerProgramDataSchemaSerializer,
PartnerProgramFieldSerializer,
Expand Down Expand Up @@ -424,3 +424,18 @@ def post(self, request, pk):
projects, many=True, context={"request": request}
)
return paginator.get_paginated_response(serializer_out.data)


class PartnerProgramProjectsAPIView(generics.ListAPIView):
"""
Список всех проектов участников конкретной партнёрской программы.
Доступ разрешён только менеджерам и экспертам программы.
"""

serializer_class = ProjectListSerializer
permission_classes = [IsAuthenticated, IsExpertOrManagerOfProgram]
pagination_class = PartnerProgramPagination

def get_queryset(self):
program = get_object_or_404(PartnerProgram, pk=self.kwargs["pk"])
return Project.objects.filter(program_links__partner_program=program).distinct()