diff --git a/backend/metagenedb/api/catalog/urls.py b/backend/metagenedb/api/catalog/urls.py index b635181a54a231f6678819ff70e2ecf9f786bdc9..ba67c99691e57c2896dd272f32dac56309293373 100644 --- a/backend/metagenedb/api/catalog/urls.py +++ b/backend/metagenedb/api/catalog/urls.py @@ -1,10 +1,57 @@ from django.conf.urls import url, include -from rest_framework.routers import DefaultRouter +from rest_framework.routers import DefaultRouter, DynamicRoute, Route from metagenedb.api.catalog.views import FunctionViewSet, GeneViewSet, TaxonomyViewSet -api_router = DefaultRouter() +class CustomRouter(DefaultRouter): + + routes = [ + # List route. + Route( + url=r'^{prefix}{trailing_slash}$', + mapping={ + 'get': 'list', + 'put': 'update', + 'post': 'create' + }, + name='{basename}-list', + detail=False, + initkwargs={'suffix': 'List'} + ), + # Dynamically generated list routes. Generated using + # @action(detail=False) decorator on methods of the viewset. + DynamicRoute( + url=r'^{prefix}/{url_path}{trailing_slash}$', + name='{basename}-{url_name}', + detail=False, + initkwargs={} + ), + # Detail route. + Route( + url=r'^{prefix}/{lookup}{trailing_slash}$', + mapping={ + 'get': 'retrieve', + 'put': 'update', + 'patch': 'partial_update', + 'delete': 'destroy' + }, + name='{basename}-detail', + detail=True, + initkwargs={'suffix': 'Instance'} + ), + # Dynamically generated detail routes. Generated using + # @action(detail=True) decorator on methods of the viewset. + DynamicRoute( + url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$', + name='{basename}-{url_name}', + detail=True, + initkwargs={} + ), + ] + + +api_router = CustomRouter() api_router.register(r'functions', FunctionViewSet, basename='functions') api_router.register(r'genes', GeneViewSet, basename='genes') api_router.register(r'taxonomy', TaxonomyViewSet, basename='taxonomy') diff --git a/backend/metagenedb/api/catalog/views/bulk_viewset.py b/backend/metagenedb/api/catalog/views/bulk_viewset.py index 9a405f5b40c9ae9eeade85471a240a0f5ba3a899..874577ce984258682b2a189cac3ee1366aa1c532 100644 --- a/backend/metagenedb/api/catalog/views/bulk_viewset.py +++ b/backend/metagenedb/api/catalog/views/bulk_viewset.py @@ -27,3 +27,22 @@ class BulkViewSet(ModelViewSet): self._created_payload(serializer, request), status=status.HTTP_201_CREATED, headers=headers ) + + def update(self, request, *args, **kwargs): + if self.lookup_field in kwargs.keys(): + # perform the classic update + return super().update(request, *args, **kwargs) + if isinstance(request.data, list): + print("this is a list man") + # instance = self.get_object() + # serializer = self.get_serializer(instance, data=request.data, partial=partial) + # serializer.is_valid(raise_exception=True) + # self.perform_update(serializer) + + # if getattr(instance, '_prefetched_objects_cache', None): + # # If 'prefetch_related' has been applied to a queryset, we need to + # # forcibly invalidate the prefetch cache on the instance. + # instance._prefetched_objects_cache = {} + + # return Response(serializer.data) + return Response({'wait': 'for it'}) diff --git a/backend/metagenedb/api/catalog/views/test_bulk_viewset.py b/backend/metagenedb/api/catalog/views/test_bulk_viewset.py index edd38c8431948490e7dea280a1ce9985dce33c72..ef2afecf6b1e6387b381410082337d05970ef0fa 100644 --- a/backend/metagenedb/api/catalog/views/test_bulk_viewset.py +++ b/backend/metagenedb/api/catalog/views/test_bulk_viewset.py @@ -1,5 +1,6 @@ from rest_framework.test import APITestCase +from metagenedb.apps.catalog.factory import FunctionFactory from metagenedb.common.utils.mocks.metagenedb import MetageneDBCatalogFunctionAPIMock @@ -50,5 +51,27 @@ class TestOperationsBulkViewSet(APITestCase): for element in data: self.assertDictEqual(self.function_api.get(element['function_id']), element) + def test_update_existing_function(self): + function = FunctionFactory() + data = { + "function_id": function.function_id, + "source": function.source, + "name": "Kegg Test 1" + } + self.function_api.put(data, function.function_id) + self.assertDictEqual(self.function_api.get(function.function_id), data) + def test_update_existing_functions(self): - pass + data = [ + { + "function_id": "k_test1", + "source": "kegg", + "name": "Kegg Test 1" + }, + { + "function_id": "k_test2", + "source": "kegg", + "name": "Kegg Test 2" + } + ] + print(self.function_api.put(data)) diff --git a/backend/metagenedb/common/utils/mocks/metagenedb.py b/backend/metagenedb/common/utils/mocks/metagenedb.py index d4a84f42a8d23e15238596a0813b1518d3ac9dd5..90b43bca25a289aec2287b1a104920a1bf606ffa 100644 --- a/backend/metagenedb/common/utils/mocks/metagenedb.py +++ b/backend/metagenedb/common/utils/mocks/metagenedb.py @@ -38,9 +38,11 @@ class MetageneDBAPIMock(MetageneDBCatalogGeneAPI): raise HTTPError return response.json() - def put(self, entry_id, data): - return self.client.put(reverse(f'{self.reverse_path}-detail', kwargs={self.KEY_ID: entry_id}), - data, format='json').json() + def put(self, data, entry_id=None): + if entry_id: + return self.client.put(reverse(f'{self.reverse_path}-detail', kwargs={self.KEY_ID: entry_id}), + data, format='json').json() + return self.client.put(reverse(f'{self.reverse_path}-list'), data, format='json').json() class MetageneDBCatalogGeneAPIMock(MetageneDBAPIMock):