diff --git a/backend/metagenedb/api/catalog/views/gene.py b/backend/metagenedb/api/catalog/views/gene.py index f60033e5c1926356cfc49cf93fa0394c1b019599..05e395e90ff175e6cc21cfa8d30a036fecdc2ad5 100644 --- a/backend/metagenedb/api/catalog/views/gene.py +++ b/backend/metagenedb/api/catalog/views/gene.py @@ -1,23 +1,45 @@ import pandas as pd -import django_filters.rest_framework from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema -from rest_framework.viewsets import GenericViewSet, ModelViewSet -from rest_framework import mixins from rest_framework import status from rest_framework.decorators import action +from rest_framework.permissions import IsAdminUser from rest_framework.response import Response +from rest_framework.viewsets import ModelViewSet from metagenedb.common.utils.df_operations import get_mask from metagenedb.apps.catalog.models import Gene from metagenedb.apps.catalog.serializers import GeneSerializer -# Define global variable for API documentation -window_size_param = openapi.Parameter('window_size', in_=openapi.IN_QUERY, description='Size of the window.', - type=openapi.TYPE_INTEGER, default=10000) -# gene_length_schema = openapi.Schema("pouet", {}, type={'hihi': 'haha'}) -# gene_length_response = openapi.Response('Get the distribution of gene length for a given window size', schema=gene_length_schema) +class DocGeneLength(object): + """ + Define response for API documentation of gene length distribution method + { + "results": { + "counts": [ + 0, + 887, + ], + "labels": [ + "0-9999", + "10000-19999", + "20000-29999", + ] + } +} + """ + window_size_param = openapi.Parameter('window_size', in_=openapi.IN_QUERY, description='Size of the window.', + type=openapi.TYPE_INTEGER, default=10000) + counts = openapi.Schema(type="array", items=openapi.Schema(type="int"), + description="Counts for every window_size") + labels = openapi.Schema(type="array", items=openapi.Schema(type="char"), + description="Corresponding windows") + results = openapi.Schema(type="object", properties={'counts': counts, 'labels': labels}, + description="results of your request") + gene_length_schema = openapi.Schema(type="object", properties={'results': results}) + gene_length_response = openapi.Response('Get the distribution of gene length for a given window size', + schema=gene_length_schema) class GeneViewSet(ModelViewSet): @@ -25,6 +47,11 @@ class GeneViewSet(ModelViewSet): serializer_class = GeneSerializer GENE_LENGTH_COL = 'length' + def get_permissions(self): + if self.action == 'create': + self.permission_classes = [IsAdminUser, ] + return super(self.__class__, self).get_permissions() + def _count_windows(self, df, window_size=10000, window_col=GENE_LENGTH_COL): """ Count how many line of the df belong to each windows defined by the window_size for the window_col @@ -45,12 +72,12 @@ class GeneViewSet(ModelViewSet): } @swagger_auto_schema( - manual_parameters=[window_size_param], + manual_parameters=[DocGeneLength.window_size_param], responses={ - # '200': gene_length_response, - '204': 'no content' + '200': DocGeneLength.gene_length_response, + '204': 'No genes on the catalog to build the distribution' }, - operation_id='List of categories', + operation_id='Gene length distribution', ) @action(methods=['get'], detail=False) def gene_length(self, request, window_size=10000):