Skip to content
Snippets Groups Projects
Commit f482559f authored by Kenzo-Hugo Hillion's avatar Kenzo-Hugo Hillion :recycle:
Browse files

allow filtering on version through eggnog API

parent e1c07427
No related branches found
No related tags found
2 merge requests!59Prod,!25integration eggnog to catalog
from .function import FunctionFilter # noqa from .function import EggNOGFilter, FunctionFilter # noqa
from .gene import GeneFilter # noqa from .gene import GeneFilter # noqa
from .taxonomy import TaxonomyFilter # noqa from .taxonomy import TaxonomyFilter # noqa
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from metagenedb.apps.catalog.models import Function from metagenedb.apps.catalog.models import Function, EggNOG
class FunctionFilter(filters.FilterSet): class FunctionFilter(filters.FilterSet):
...@@ -7,3 +7,10 @@ class FunctionFilter(filters.FilterSet): ...@@ -7,3 +7,10 @@ class FunctionFilter(filters.FilterSet):
class Meta: class Meta:
model = Function model = Function
fields = ['source'] fields = ['source']
class EggNOGFilter(filters.FilterSet):
class Meta:
model = EggNOG
fields = ['version']
from marshmallow import fields from marshmallow import fields
from marshmallow.validate import OneOf
from metagenedb.apps.catalog import models
from metagenedb.common.django_default.qparams_validators import PaginatedQueryParams from metagenedb.common.django_default.qparams_validators import PaginatedQueryParams
SELECTED_SOURCE = [i[0] for i in models.Function.SOURCE_CHOICES]
EGGNOG_VERSIONS = [i[0] for i in models.EggNOG.VERSION_CHOICES]
class FunctionQueryParams(PaginatedQueryParams): class FunctionQueryParams(PaginatedQueryParams):
source = fields.String(validate=OneOf(choices=SELECTED_SOURCE))
class KeggQueryParams(PaginatedQueryParams):
detailed = fields.Boolean() detailed = fields.Boolean()
class EggNOGQueryParams(PaginatedQueryParams):
version = fields.String(validate=OneOf(choices=EGGNOG_VERSIONS))
...@@ -7,16 +7,51 @@ from metagenedb.common.django_default.permissions import ListAndRetrieveAll ...@@ -7,16 +7,51 @@ from metagenedb.common.django_default.permissions import ListAndRetrieveAll
from metagenedb.common.django_default.qparams_validators import PaginatedQueryParams from metagenedb.common.django_default.qparams_validators import PaginatedQueryParams
class BulkViewSet(ModelViewSet): class QParamsValidationViewSet(ModelViewSet):
query_params_parser = PaginatedQueryParams query_params_parser = PaginatedQueryParams
def _get_qparams(self, raw_query_params):
return self.query_params_parser().load(raw_query_params)
def list(self, request, *args, **kwargs):
try:
query_params = self._get_qparams(request.query_params) # noqa
except ValidationError as validation_error:
error_message = validation_error.normalized_messages()
error_message.update({
'allowed_query_params': ', '.join(self.query_params_parser().declared_fields.keys())
})
return Response(error_message, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, *args, **kwargs):
try:
query_params = self._get_qparams(request.query_params) # noqa
except ValidationError as validation_error:
error_message = validation_error.normalized_messages()
error_message.update({
'allowed_query_params': ', '.join(self.query_params_parser().declared_fields.keys())
})
return Response(error_message, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
class BulkViewSet(QParamsValidationViewSet):
permission_classes = [ListAndRetrieveAll] permission_classes = [ListAndRetrieveAll]
def get_objects(self, instance_ids): def get_objects(self, instance_ids):
return self.queryset.in_bulk(instance_ids, field_name=self.lookup_field) return self.queryset.in_bulk(instance_ids, field_name=self.lookup_field)
def _get_qparams(self, raw_query_params):
return self.query_params_parser().load(raw_query_params)
def _created_payload(self, serializer, request): def _created_payload(self, serializer, request):
if isinstance(request.data, list): if isinstance(request.data, list):
return { return {
...@@ -83,35 +118,3 @@ class BulkViewSet(ModelViewSet): ...@@ -83,35 +118,3 @@ class BulkViewSet(ModelViewSet):
self._updated_payload(create_serializer, update_serializer, request), self._updated_payload(create_serializer, update_serializer, request),
status=status.HTTP_201_CREATED, headers=headers status=status.HTTP_201_CREATED, headers=headers
) )
def list(self, request, *args, **kwargs):
try:
query_params = self._get_qparams(request.query_params) # noqa
except ValidationError as validation_error:
error_message = validation_error.normalized_messages()
error_message.update({
'allowed_query_params': ', '.join(self.query_params_parser().declared_fields.keys())
})
return Response(error_message, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, *args, **kwargs):
try:
query_params = self._get_qparams(request.query_params) # noqa
except ValidationError as validation_error:
error_message = validation_error.normalized_messages()
error_message.update({
'allowed_query_params': ', '.join(self.query_params_parser().declared_fields.keys())
})
return Response(error_message, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
...@@ -5,13 +5,15 @@ from rest_framework.response import Response ...@@ -5,13 +5,15 @@ from rest_framework.response import Response
from rest_framework.status import HTTP_422_UNPROCESSABLE_ENTITY from rest_framework.status import HTTP_422_UNPROCESSABLE_ENTITY
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from metagenedb.api.catalog.filters import FunctionFilter from metagenedb.api.catalog.filters import FunctionFilter, EggNOGFilter
from metagenedb.api.catalog.qparams_validators.function import FunctionQueryParams from metagenedb.api.catalog.qparams_validators.function import (
EggNOGQueryParams, FunctionQueryParams, KeggQueryParams
)
from metagenedb.apps.catalog.models import EggNOG, Function, KeggOrthology from metagenedb.apps.catalog.models import EggNOG, Function, KeggOrthology
from metagenedb.apps.catalog.serializers import EggNOGSerializer, FunctionSerializer, KeggOrthologySerializer from metagenedb.apps.catalog.serializers import EggNOGSerializer, FunctionSerializer, KeggOrthologySerializer
from metagenedb.common.utils.external_api.togows import GetFunctionExternalInfo from metagenedb.common.utils.external_api.togows import GetFunctionExternalInfo
from .bulk_viewset import BulkViewSet from .base import BulkViewSet, QParamsValidationViewSet
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -22,13 +24,14 @@ class FunctionViewSet(BulkViewSet): ...@@ -22,13 +24,14 @@ class FunctionViewSet(BulkViewSet):
serializer_class = FunctionSerializer serializer_class = FunctionSerializer
lookup_field = 'function_id' lookup_field = 'function_id'
filterset_class = FunctionFilter filterset_class = FunctionFilter
query_params_parser = FunctionQueryParams
class KeggOrthologyViewSet(ModelViewSet): class KeggOrthologyViewSet(QParamsValidationViewSet):
queryset = KeggOrthology.objects.all() queryset = KeggOrthology.objects.all()
serializer_class = KeggOrthologySerializer serializer_class = KeggOrthologySerializer
lookup_field = 'function_id' lookup_field = 'function_id'
query_params_parser = FunctionQueryParams query_params_parser = KeggQueryParams
def _get_external_info(self, db_data): def _get_external_info(self, db_data):
detailed_info_retriever = GetFunctionExternalInfo(db_data['function_id'], 'kegg') detailed_info_retriever = GetFunctionExternalInfo(db_data['function_id'], 'kegg')
...@@ -57,7 +60,9 @@ class KeggOrthologyViewSet(ModelViewSet): ...@@ -57,7 +60,9 @@ class KeggOrthologyViewSet(ModelViewSet):
return Response(returned_data) return Response(returned_data)
class EggNOGViewSet(ModelViewSet): class EggNOGViewSet(QParamsValidationViewSet):
queryset = EggNOG.objects.all() queryset = EggNOG.objects.all()
serializer_class = EggNOGSerializer serializer_class = EggNOGSerializer
lookup_field = 'function_id' lookup_field = 'function_id'
filterset_class = EggNOGFilter
query_params_parser = EggNOGQueryParams
...@@ -14,7 +14,7 @@ from metagenedb.api.catalog.filters import GeneFilter ...@@ -14,7 +14,7 @@ from metagenedb.api.catalog.filters import GeneFilter
from metagenedb.api.catalog.qparams_validators.gene import GeneLengthQueryParams, GeneQueryParams, TaxCountQueryParams from metagenedb.api.catalog.qparams_validators.gene import GeneLengthQueryParams, GeneQueryParams, TaxCountQueryParams
from metagenedb.apps.catalog.serializers import GeneSerializer from metagenedb.apps.catalog.serializers import GeneSerializer
from .bulk_viewset import BulkViewSet from .base import BulkViewSet
class DocGeneLength(object): class DocGeneLength(object):
......
...@@ -7,7 +7,7 @@ from metagenedb.api.catalog.qparams_validators.taxonomy import TaxonomyQueryPara ...@@ -7,7 +7,7 @@ from metagenedb.api.catalog.qparams_validators.taxonomy import TaxonomyQueryPara
from metagenedb.apps.catalog.models import Taxonomy from metagenedb.apps.catalog.models import Taxonomy
from metagenedb.apps.catalog.serializers import TaxonomySerializer from metagenedb.apps.catalog.serializers import TaxonomySerializer
from .bulk_viewset import BulkViewSet from .base import BulkViewSet
class TaxonomyViewSet(BulkViewSet): class TaxonomyViewSet(BulkViewSet):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment