import structlog
from django.utils.translation import gettext_lazy as _
from rest_framework import generics
from rest_framework.decorators import api_view, authentication_classes
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 (
SampleAnalysisResult,
SampleGroupAnalysisResult,
SampleAnalysisResultField,
SampleGroupAnalysisResultField,
)
from ..permissions import (
SampleAnalysisResultPermission,
SampleGroupAnalysisResultPermission,
SampleAnalysisResultFieldPermission,
SampleGroupAnalysisResultFieldPermission,
)
from ..serializers import (
SampleAnalysisResultSerializer,
SampleGroupAnalysisResultSerializer,
SampleAnalysisResultFieldSerializer,
SampleGroupAnalysisResultFieldSerializer,
)
logger = structlog.get_logger(__name__)
[docs]class SampleAnalysisResultCreateView(PermissionedListCreateAPIView):
queryset = SampleAnalysisResult.objects.all()
serializer_class = SampleAnalysisResultSerializer
permission_classes = (IsAuthenticatedOrReadOnly, )
filterset_fields = ['uuid', 'sample_id', 'module_name', 'replicate']
permission = SampleAnalysisResultPermission
[docs]class SampleAnalysisResultDetailsView(generics.RetrieveUpdateDestroyAPIView):
queryset = SampleAnalysisResult.objects.all()
serializer_class = SampleAnalysisResultSerializer
permission_classes = (SampleAnalysisResultPermission,)
[docs]class SampleGroupAnalysisResultCreateView(PermissionedListCreateAPIView):
queryset = SampleGroupAnalysisResult.objects.all().order_by('created_at')
serializer_class = SampleGroupAnalysisResultSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
filterset_fields = ['uuid', 'sample_group_id', 'module_name', 'replicate']
permission = SampleGroupAnalysisResultPermission
[docs]class SampleGroupAnalysisResultDetailsView(generics.RetrieveUpdateDestroyAPIView):
queryset = SampleGroupAnalysisResult.objects.all()
serializer_class = SampleGroupAnalysisResultSerializer
permission_classes = (SampleGroupAnalysisResultPermission,)
[docs]class SampleAnalysisResultFieldCreateView(PermissionedListCreateAPIView):
queryset = SampleAnalysisResultField.objects.all().order_by('created_at')
serializer_class = SampleAnalysisResultFieldSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
filterset_fields = ['uuid', 'name', 'analysis_result_id']
permission = SampleAnalysisResultFieldPermission
[docs]def authorize_sample_ar_upload_url(request, pk):
arf = SampleAnalysisResultField.objects.get(pk=pk)
mygrp = arf.analysis_result.sample.library.group
if not mygrp.is_public:
try:
membership_queryset = request.user.organization_set.filter(pk=mygrp.organization.pk)
authorized = membership_queryset.exists()
except AttributeError: # occurs if user is not logged in
authorized = False
if not authorized:
raise PermissionDenied(_('Insufficient permissions to get upload url.'))
return arf
[docs]@api_view(['POST'])
def post_sample_ar_upload_url(request, pk):
"""Reply with a sample group manifest."""
arf = authorize_sample_ar_upload_url(request, pk)
if arf.field_type != 's3':
arf.as_s3_link(request.data['filename'])
stance = request.data.get('stance', 'upload')
n_parts = request.data.get('n_parts', 1)
blob = arf.get_presigned_upload_url(stance=stance, n_parts=n_parts)
return Response(blob)
[docs]@api_view(['POST'])
def post_sample_ar_complete_multipart_upload_url(request, pk):
"""Reply with a sample group manifest."""
arf = authorize_sample_ar_upload_url(request, pk)
upload_id, parts = request.data['upload_id'], request.data['parts']
blob = arf.get_presigned_completion_url(upload_id, parts)
return Response(blob)
[docs]def authorize_sample_group_ar_upload_url(request, pk):
arf = SampleGroupAnalysisResultField.objects.get(pk=pk)
mygrp = arf.analysis_result.sample_group
if not mygrp.is_public:
try:
membership_queryset = request.user.organization_set.filter(pk=mygrp.organization.pk)
authorized = membership_queryset.exists()
except AttributeError: # occurs if user is not logged in
authorized = False
if not authorized:
raise PermissionDenied(_('Insufficient permissions to get upload url.'))
return arf
[docs]@api_view(['POST'])
def post_sample_group_ar_upload_url(request, pk):
"""Reply with a sample group manifest."""
arf = authorize_sample_group_ar_upload_url(request, pk)
if arf.field_type != 's3':
arf.as_s3_link(request.data['filename'])
stance = request.data.get('stance', 'upload')
n_parts = request.data.get('n_parts', 1)
blob = arf.get_presigned_upload_url(stance=stance, n_parts=n_parts)
return Response(blob)
[docs]@api_view(['POST'])
def post_sample_group_ar_complete_multipart_upload_url(request, pk):
"""Reply with a sample group manifest."""
arf = authorize_sample_group_ar_upload_url(request, pk)
upload_id, parts = request.data['upload_id'], request.data['parts']
blob = arf.get_presigned_completion_url(upload_id, parts)
return Response(blob)
[docs]class SampleAnalysisResultFieldDetailsView(generics.RetrieveUpdateDestroyAPIView):
queryset = SampleAnalysisResultField.objects.all()
serializer_class = SampleAnalysisResultFieldSerializer
permission_classes = (SampleAnalysisResultFieldPermission,)
[docs]class SampleGroupAnalysisResultFieldCreateView(PermissionedListCreateAPIView):
queryset = SampleGroupAnalysisResultField.objects.all().order_by('created_at')
serializer_class = SampleGroupAnalysisResultFieldSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
filterset_fields = ['uuid', 'name', 'analysis_result_id']
permission = SampleGroupAnalysisResultFieldPermission
[docs]class SampleGroupAnalysisResultFieldDetailsView(generics.RetrieveUpdateDestroyAPIView):
queryset = SampleGroupAnalysisResultField.objects.all()
serializer_class = SampleGroupAnalysisResultFieldSerializer
permission_classes = (SampleGroupAnalysisResultFieldPermission,)