From ae202ddf2ce825fa4e2372361d04586fe7852ea7 Mon Sep 17 00:00:00 2001
From: Hugh Dickinson <hugh.dickinson@open.ac.uk>
Date: Mon, 19 Oct 2020 18:07:28 +0100
Subject: [PATCH] Implemented DB model and query views for accounts app.

---
 esap/accounts/api/serializers.py | 49 +++++++++++++++++++++++++
 esap/accounts/api/urls.py        | 19 +++++-----
 esap/accounts/api/views.py       | 61 +++++++++++++++++++++++++-------
 esap/accounts/database_router.py | 18 +++++-----
 esap/accounts/urls.py            |  9 -----
 esap/accounts/views.py           |  3 --
 esap/esap/settings/statics.py    |  2 +-
 esap/query/database_router.py    | 11 +++---
 8 files changed, 125 insertions(+), 47 deletions(-)
 delete mode 100644 esap/accounts/urls.py
 delete mode 100644 esap/accounts/views.py

diff --git a/esap/accounts/api/serializers.py b/esap/accounts/api/serializers.py
index e69de29b..61995e37 100644
--- a/esap/accounts/api/serializers.py
+++ b/esap/accounts/api/serializers.py
@@ -0,0 +1,49 @@
+from rest_framework import serializers
+
+from ..models import *
+
+
+class EsapQuerySchemaSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = EsapQuerySchema
+        fields = ["schema_name"]
+
+
+class EsapComputeResourceSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = EsapComputeResource
+        fields = [
+            "resource_name",
+            "resource_type",
+            "resource_url",  # 'resource_metadata'
+        ]
+
+
+class EsapSoftwareRepositorySerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = EsapSoftwareRepository
+        fields = [
+            "repository_name",
+            "repository_type",
+            "repository_url",  #'repository_metadata'
+        ]
+
+
+class EsapShoppingItemSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = EsapShoppingItem
+        fields = ["item_data"]
+
+
+class EsapUserProfileSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = EsapUserProfile
+        fields = [
+            "user_name",
+            "full_name",
+            "user_email",
+            "query_schema",
+            "software_repositories",
+            "compute_resources",
+            "shopping_cart",
+        ]
diff --git a/esap/accounts/api/urls.py b/esap/accounts/api/urls.py
index 7eab2229..1145dd1b 100644
--- a/esap/accounts/api/urls.py
+++ b/esap/accounts/api/urls.py
@@ -1,9 +1,12 @@
-from django.urls import path
-from knox import views as knox_views
-from .views import LoginView
+from django.urls import include, path
+from rest_framework import routers
+from . import views
 
-urlpatterns = [
-    path(r'login/', LoginView.as_view(), name='knox_login'),
-    path(r'logout/', knox_views.LogoutView.as_view(), name='knox_logout'),
-    path(r'logoutall/', knox_views.LogoutAllView.as_view(), name='knox_logoutall'),
-]
\ No newline at end of file
+router = routers.DefaultRouter()
+router.register(r"query-schemas", views.EsapQuerySchemaViewSet)
+router.register(r"compute-resources", views.EsapComputeResourceViewSet)
+router.register(r"software-repositories", views.EsapSoftwareRepositoryViewSet)
+router.register(r"shopping-items", views.EsapShoppingItemViewSet)
+router.register(r"user-profiles", views.EsapUserProfileViewSet)
+
+urlpatterns = [path("", include(router.urls))]
diff --git a/esap/accounts/api/views.py b/esap/accounts/api/views.py
index 65ab8611..b25e4583 100644
--- a/esap/accounts/api/views.py
+++ b/esap/accounts/api/views.py
@@ -1,15 +1,52 @@
-from django.contrib.auth import login
+from rest_framework import viewsets
+from .serializers import *
+from ..models import *
 
-from rest_framework import permissions
-from rest_framework.authtoken.serializers import AuthTokenSerializer
-from knox.views import LoginView as KnoxLoginView
 
-class LoginView(KnoxLoginView):
-    permission_classes = (permissions.AllowAny,)
+class EsapQuerySchemaViewSet(viewsets.ModelViewSet):
+    """
+    API endpoint that allows EsapQuerySchemas to be viewed or edited.
+    """
 
-    def post(self, request, format=None):
-        serializer = AuthTokenSerializer(data=request.data)
-        serializer.is_valid(raise_exception=True)
-        user = serializer.validated_data['user']
-        login(request, user)
-        return super(LoginView, self).post(request, format=None)
+    queryset = EsapQuerySchema.objects.all().order_by("schema_name")
+    serializer_class = EsapQuerySchemaSerializer
+
+
+class EsapComputeResourceViewSet(viewsets.ModelViewSet):
+    """
+    API endpoint that allows EsapComputeResources to be viewed or edited.
+    """
+
+    queryset = EsapComputeResource.objects.all().order_by("resource_name")
+    serializer_class = EsapComputeResourceSerializer
+
+
+class EsapSoftwareRepositoryViewSet(viewsets.ModelViewSet):
+    """
+    API endpoint that allows EsapSoftwareRepositorys to be viewed or edited.
+    """
+
+    queryset = EsapSoftwareRepository.objects.all().order_by("repository_name")
+    serializer_class = EsapSoftwareRepositorySerializer
+
+
+class EsapShoppingItemViewSet(viewsets.ModelViewSet):
+    """
+    API endpoint that allows EsapShoppingItems to be viewed or edited.
+    """
+
+    queryset = EsapShoppingItem.objects.all()
+    serializer_class = EsapShoppingItemSerializer
+
+
+class EsapUserProfileViewSet(viewsets.ModelViewSet):
+    """
+    API endpoint that allows EsapUserProfiles to be viewed or edited.
+    """
+
+    queryset = EsapUserProfile.objects.all().order_by("user_name")
+    serializer_class = EsapUserProfileSerializer
+
+    def get_queryset(self):
+        user_name = self.request.query_params.get("user_name", None)
+        return EsapUserProfile.objects.filter(user_name=user_name)
diff --git a/esap/accounts/database_router.py b/esap/accounts/database_router.py
index 41a96afe..6366e1ec 100644
--- a/esap/accounts/database_router.py
+++ b/esap/accounts/database_router.py
@@ -13,19 +13,21 @@ class AccountsRouter:
         """
         Writes always go to accounts.
         """
-        return 'accounts'
+        if model._meta.app_label in self.route_app_labels:
+            return 'accounts'
+
 
     def allow_relation(self, obj1, obj2, **hints):
         """
-        Allow relations if a model in the accounts apps is
-        involved.
+        Allow relations if a both involved models are in the accounts
+        app.
         """
         if (
-            obj1._meta.app_label in self.route_app_labels or
-            obj2._meta.app_label in self.route_app_labels
+            obj1._state.db in self.route_app_labels and
+            obj2._state.db in self.route_app_labels
         ):
-           return True
-        return None
+            return True
+        return False
 
     def allow_migrate(self, db, app_label, model_name=None, **hints):
         """
@@ -34,4 +36,4 @@ class AccountsRouter:
         """
         if app_label in self.route_app_labels:
             return db == 'accounts'
-        return None
+        return False
diff --git a/esap/accounts/urls.py b/esap/accounts/urls.py
deleted file mode 100644
index a5254c8f..00000000
--- a/esap/accounts/urls.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from django.urls import path
-from django.contrib.auth.views import LoginView
-from django.contrib.auth.views import LogoutView
-
-urlpatterns = [
-    path('login/', LoginView.as_view(), name='django_login'),
-    path('logout/', LogoutView.as_view(), name='django_logout'),
-
-]
\ No newline at end of file
diff --git a/esap/accounts/views.py b/esap/accounts/views.py
deleted file mode 100644
index 91ea44a2..00000000
--- a/esap/accounts/views.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.shortcuts import render
-
-# Create your views here.
diff --git a/esap/esap/settings/statics.py b/esap/esap/settings/statics.py
index 8504abe2..5635e5de 100644
--- a/esap/esap/settings/statics.py
+++ b/esap/esap/settings/statics.py
@@ -15,6 +15,7 @@ DEBUG = False
 
 INSTALLED_APPS = [
     'query',
+    'accounts',
     'django.contrib.staticfiles',
 ]
 
@@ -23,4 +24,3 @@ INSTALLED_APPS = [
 
 STATIC_URL = '/static/'
 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
-
diff --git a/esap/query/database_router.py b/esap/query/database_router.py
index 309667b3..a975528a 100644
--- a/esap/query/database_router.py
+++ b/esap/query/database_router.py
@@ -1,15 +1,15 @@
 class QueryRouter:
 
     route_app_labels = {'query', 'auth', 'contenttypes', 'sessions', 'admin'}
+    custom_router_app_labels = {'ida', 'rucio', 'accounts', 'staging'}
 
     def db_for_read(self, model, **hints):
-        if model._meta.app_label in self.route_app_labels:
-#            return 'query'
+        if model._meta.app_label not in self.custom_router_app_labels:
             return 'default'
 
     def db_for_write(self, model, **hints):
-#        return 'query'
-        return 'default'
+        if model._meta.app_label not in self.custom_router_app_labels:
+            return 'default'
 
     def allow_relation(self, obj1, obj2, **hints):
         """
@@ -29,6 +29,5 @@ class QueryRouter:
         'query' database.
         """
         if app_label in self.route_app_labels:
-#            return db == 'query'
             return db == 'default'
-        return None
\ No newline at end of file
+        return None
-- 
GitLab