Source code for pangea.contrib.tagging.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 pangea.core.views.utils import PermissionedListCreateAPIView
from .models import (
    Tag,
    SampleGroup,
    Sample,
)
from pangea.core.permissions import (
    SampleGroupPermission,
    SamplePermission,
)
from .serializers import (
    TagSerializer,
    TagAddTagSerializer,
    TagAddSampleGroupSerializer,
    TagAddSampleSerializer,
)
from pangea.core.serializers import (
    SampleGroupSerializer,
    SampleSerializer,
)


logger = structlog.get_logger(__name__)


[docs]class TagCreateView(PermissionedListCreateAPIView): queryset = Tag.objects.all().order_by('created_at') serializer_class = TagSerializer permission_classes = (IsAuthenticatedOrReadOnly,) filterset_fields = ['uuid', 'name']
[docs]class TagDetailsView(generics.RetrieveUpdateDestroyAPIView): """This class handles the http GET, PUT and DELETE requests.""" queryset = Tag.objects.all().order_by('created_at') serializer_class = TagSerializer permission_classes = (IsAuthenticatedOrReadOnly,)
[docs]class TagTagsView(generics.ListAPIView): """This class handles managing membership of sample groups within projects.""" permission_classes = (IsAuthenticatedOrReadOnly,) queryset = Tag.objects.all().order_by('created_at')
[docs] def get_serializer_class(self): if self.request.method == 'GET': return TagSerializer if self.request.method == 'POST': return TagAddTagSerializer
[docs] def post(self, request, *args, **kwargs): tag = Tag.objects.get(pk=kwargs.get('tag_pk')) other_tag = Tag.objects.get(pk=request.data.get('tag_uuid')) payload = request.data.get('payload', '') tag.add_related_tag(other_tag, payload=payload) return Response({"status": "success"})
[docs]class TagSampleGroupsView(generics.ListAPIView): """This class handles tagging sample groups.""" permission_classes = (IsAuthenticatedOrReadOnly,) 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 TagAddSampleGroupSerializer
[docs] def filter_queryset(self, queryset): tag = Tag.objects.get(pk=self.kwargs.get('tag_pk')) perm = SampleGroupPermission() sample_groups = [ grp.sample_group for grp in tag.tagged_sample_groups.order_by('created_at') if perm.has_object_permission(self.request, self, grp.sample_group) ] return sample_groups
[docs] def post(self, request, *args, **kwargs): tag = Tag.objects.get(pk=kwargs.get('tag_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) if not group.is_public and not group_member_query.exists(): logger.info( 'attempted_tag_sample_group_without_permission', user=request.user, tag_pk=tag.pk, sample_group_pk=group.pk, ) raise PermissionDenied(_('Insufficient permissions to tag sample group.')) tag.tag_sample_group(group) return Response({"status": "success"})
[docs]class TagSamplesView(generics.ListAPIView): """This class handles tagging samples.""" permission_classes = (IsAuthenticatedOrReadOnly,) queryset = Sample.objects.all().order_by('created_at')
[docs] def get_serializer_class(self): if self.request.method == 'GET': return SampleSerializer if self.request.method == 'POST': return TagAddSampleSerializer
[docs] def filter_queryset(self, queryset): tag = Tag.objects.get(pk=self.kwargs.get('tag_pk')) perm = SamplePermission() samples = [ sample for sample in tag.tagged_samples.order_by('created_at') if perm.has_object_permission(self.request, self, sample) ] return samples
[docs] def post(self, request, *args, **kwargs): tag = Tag.objects.get(pk=kwargs.get('tag_pk')) sample = Sample.objects.get(pk=request.data.get('sample_uuid')) sample_member_query = self.request.user.organization_set.filter(pk=sample.organization.pk) if not sample_member_query.exists(): logger.info( 'attempted_tag_sample_without_permission', user=request.user, tag_pk=tag.pk, sample_pk=sample.pk, ) raise PermissionDenied(_('Insufficient permissions to tag sample.')) tag.tag_sample(sample) return Response({"status": "success"})