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