From 77df3e6fe88174200cbb4a4d454f39b86180f7fb Mon Sep 17 00:00:00 2001
From: Kenzo-Hugo Hillion <kenzo-hugo.hillion1@pasteur.fr>
Date: Fri, 23 Aug 2019 10:53:45 +0200
Subject: [PATCH] add upsert method to genes API

---
 backend/metagenedb/api/catalog/views/gene.py | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/backend/metagenedb/api/catalog/views/gene.py b/backend/metagenedb/api/catalog/views/gene.py
index fe811b9..db94f34 100644
--- a/backend/metagenedb/api/catalog/views/gene.py
+++ b/backend/metagenedb/api/catalog/views/gene.py
@@ -1,4 +1,5 @@
 import pandas as pd
+from django.core.exceptions import ObjectDoesNotExist
 from drf_yasg import openapi
 from drf_yasg.utils import swagger_auto_schema
 from rest_framework import status
@@ -50,6 +51,21 @@ class GeneViewSet(ModelViewSet):
     def get_permissions(self):
         return super(self.__class__, self).get_permissions()
 
+    def create(self, request, *args, **kwargs):
+        """
+        Overload create to behave like an upsert method.
+        """
+        serializer = self.get_serializer(data=request.data)
+        try:
+            gene_obj = self.queryset.get(gene_id=request.data.get('gene_id'))
+            serializer = self.get_serializer(gene_obj, data=request.data)
+        except ObjectDoesNotExist:
+            serializer = self.get_serializer(data=request.data)
+        serializer.is_valid(raise_exception=True)
+        self.perform_create(serializer)
+        headers = self.get_success_headers(serializer.data)
+        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
+
     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
-- 
GitLab