From 3ed89f511bda1265c970d04b3f61c32f98b7ffcc Mon Sep 17 00:00:00 2001
From: Kenzo-Hugo Hillion <kenzo-hugo.hillion1@pasteur.fr>
Date: Thu, 4 Jun 2020 16:11:13 +0200
Subject: [PATCH] add statistics PUT and POST and fix Kegg Eggnog permissions

---
 .../metagenedb/api/catalog/views/function.py  |  4 +-
 .../api/catalog/views/statistics.py           | 38 +++++++++++++------
 .../metagenedb/apps/catalog/admin/__init__.py |  1 +
 .../apps/catalog/admin/statistics.py          |  9 +++++
 .../apps/catalog/models/statistics.py         |  3 ++
 .../common/django_default/permissions.py      |  3 ++
 6 files changed, 45 insertions(+), 13 deletions(-)
 create mode 100644 backend/metagenedb/apps/catalog/admin/statistics.py

diff --git a/backend/metagenedb/api/catalog/views/function.py b/backend/metagenedb/api/catalog/views/function.py
index 9a4d6b1..a26b79e 100644
--- a/backend/metagenedb/api/catalog/views/function.py
+++ b/backend/metagenedb/api/catalog/views/function.py
@@ -57,7 +57,7 @@ class FunctionViewSet(BulkViewSet):
         return super().partial_update(*args, **kwargs)
 
 
-class KeggOrthologyViewSet(QParamsValidationViewSet):
+class KeggOrthologyViewSet(BulkViewSet):
     queryset = KeggOrthology.objects.all()
     serializer_class = KeggOrthologySerializer
     lookup_field = 'function_id'
@@ -117,7 +117,7 @@ class KeggOrthologyViewSet(QParamsValidationViewSet):
         return super().partial_update(*args, **kwargs)
 
 
-class EggNOGViewSet(QParamsValidationViewSet):
+class EggNOGViewSet(BulkViewSet):
     queryset = EggNOG.objects.all()
     serializer_class = EggNOGSerializer
     lookup_field = 'function_id'
diff --git a/backend/metagenedb/api/catalog/views/statistics.py b/backend/metagenedb/api/catalog/views/statistics.py
index f0e3cfd..7146b7f 100644
--- a/backend/metagenedb/api/catalog/views/statistics.py
+++ b/backend/metagenedb/api/catalog/views/statistics.py
@@ -1,4 +1,3 @@
-from django.shortcuts import get_object_or_404
 from drf_yasg.utils import swagger_auto_schema
 from rest_framework import viewsets
 from rest_framework.response import Response
@@ -6,8 +5,12 @@ from rest_framework.response import Response
 from metagenedb.apps.catalog.models import Statistics
 from metagenedb.apps.catalog.serializers import StatisticsSerializer
 
+from .base import BulkViewSet
 
-class StatisticsViewSet(viewsets.ViewSet):
+
+class StatisticsViewSet(BulkViewSet):
+    queryset = Statistics.objects.all()
+    serializer_class = StatisticsSerializer
     lookup_field = 'stats_id'
 
     @swagger_auto_schema(
@@ -15,18 +18,31 @@ class StatisticsViewSet(viewsets.ViewSet):
         operation_summary="API to list all pre-computed statistics.",
         tags=['Statistics'],
     )
-    def list(self, request):
-        queryset = Statistics.objects.all()
-        serializer = StatisticsSerializer(queryset, many=True)
-        return Response(serializer.data)
+    def list(self, *args, **kwargs):
+        return super().list(*args, **kwargs)
 
     @swagger_auto_schema(
         operation_description="Retrieve pre-computed statistics from an ID",
         operation_summary="API to retrieve pre-computed statistics.",
         tags=['Statistics'],
     )
-    def retrieve(self, request, stats_id=None):
-        queryset = Statistics.objects.all()
-        stats = get_object_or_404(queryset, stats_id=stats_id)
-        serializer = StatisticsSerializer(stats)
-        return Response(serializer.data)
+    def retrieve(self, *args, **kwargs):
+        return super().retrieve(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Statistics'],
+    )
+    def create(self, *args, **kwargs):
+        return super().create(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Statistics'],
+    )
+    def update(self, *args, **kwargs):
+        return super().update(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Statistics'],
+    )
+    def partial_update(self, *args, **kwargs):
+        return super().partial_update(*args, **kwargs)
diff --git a/backend/metagenedb/apps/catalog/admin/__init__.py b/backend/metagenedb/apps/catalog/admin/__init__.py
index f7d7aca..93ccd2c 100644
--- a/backend/metagenedb/apps/catalog/admin/__init__.py
+++ b/backend/metagenedb/apps/catalog/admin/__init__.py
@@ -1,3 +1,4 @@
 from .gene import GeneAdmin  # noqa
 from .function import FunctionAdmin, KeggOrthologyAdmin  # noqa
+from .statistics import Statistics  # noqa
 from .taxonomy import TaxonomyAdmin  # noqa
diff --git a/backend/metagenedb/apps/catalog/admin/statistics.py b/backend/metagenedb/apps/catalog/admin/statistics.py
new file mode 100644
index 0000000..6b1d575
--- /dev/null
+++ b/backend/metagenedb/apps/catalog/admin/statistics.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+
+from metagenedb.apps.catalog.models import Statistics
+
+
+@admin.register(Statistics)
+class StatisticsAdmin(admin.ModelAdmin):
+    list_display = ('stats_id',)
+    search_fields = ('stats_id',)
diff --git a/backend/metagenedb/apps/catalog/models/statistics.py b/backend/metagenedb/apps/catalog/models/statistics.py
index 71630a7..70371c6 100644
--- a/backend/metagenedb/apps/catalog/models/statistics.py
+++ b/backend/metagenedb/apps/catalog/models/statistics.py
@@ -9,3 +9,6 @@ class Statistics(models.Model):
 
     stats_id = models.SlugField(max_length=400, db_index=True, unique=True)
     body = JSONField()
+
+    class Meta:
+        verbose_name_plural = "Statistics"
diff --git a/backend/metagenedb/common/django_default/permissions.py b/backend/metagenedb/common/django_default/permissions.py
index 456f88f..c92bbde 100644
--- a/backend/metagenedb/common/django_default/permissions.py
+++ b/backend/metagenedb/common/django_default/permissions.py
@@ -7,4 +7,7 @@ class ListAndRetrieveAll(BasePermission):
     """
 
     def has_permission(self, request, view):
+        print(view.action)
+        print(view.action in ['list', 'retrieve'])
+        print(request.user.is_staff)
         return view.action in ['list', 'retrieve'] or request.user.is_staff
-- 
GitLab