Source code for pangea.core.views.project_views
import structlog
from django.utils.translation import gettext_lazy as _
from rest_framework import generics
from rest_framework.response import Response
from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from .utils import PermissionedListCreateAPIView
from ..models import (
SampleGroup,
Project,
)
from ..permissions import (
ProjectPermission,
)
from ..serializers import (
SampleGroupSerializer,
ProjectSerializer,
ProjectAddSampleGroupSerializer
)
logger = structlog.get_logger(__name__)
[docs]class ProjectCreateView(PermissionedListCreateAPIView):
queryset = Project.objects.all().order_by('created_at')
serializer_class = ProjectSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
filterset_fields = ['uuid', 'organization_id', 'name']
permission = ProjectPermission
[docs]class ProjectDetailsView(generics.RetrieveUpdateDestroyAPIView):
"""This class handles the http GET, PUT and DELETE requests."""
queryset = Project.objects.all().order_by('created_at')
serializer_class = ProjectSerializer
permission_classes = (ProjectPermission,)
[docs]class ProjectSampleGroupsView(generics.ListAPIView):
"""This class handles managing membership of sample groups within projects."""
permission_classes = (ProjectPermission,)
queryset = SampleGroup.objects.all().order_by('created_at')
[docs] def get_serializer_class(self):
if self.request.method == 'GET':
return SampleGroupSerializer
if self.request.method == 'POST':
return ProjectAddSampleGroupSerializer
[docs] def filter_queryset(self, queryset):
proj_uuid = self.kwargs.get('project_pk')
project = Project.objects.get(pk=proj_uuid)
perm = ProjectPermission()
has_permission = perm.has_object_permission(self.request, self, project)
if not has_permission:
return []
return project.sample_groups.order_by('created_at')
[docs] def post(self, request, *args, **kwargs):
project = Project.objects.get(pk=kwargs.get('project_pk'))
group = SampleGroup.objects.get(pk=request.data.get('sample_group_uuid'))
group_member_query = self.request.user.organization_set.filter(pk=group.organization.pk)
proj_member_query = self.request.user.organization_set.filter(pk=project.organization.pk)
if not group_member_query.exists() or not proj_member_query.exists():
logger.info(
'attempted_add_sample_group_to_project_without_permission',
user=request.user,
project_pk=project.pk,
sample_group_pk=group.pk,
)
raise PermissionDenied(_('Insufficient permissions to add sample group to project.'))
project.add_sample_group(group)
return Response({"status": "success"})