From 999e164c3deae85c5de883ae8901ff39699d4e4d Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 6 Feb 2019 21:36:27 -0400 Subject: [PATCH] Refactor the Django GPG app API views Convert the Django GPG app API view to use viewsets. Add key-list API view test. Signed-off-by: Roberto Rosario --- mayan/apps/django_gpg/api_views.py | 36 ++++---------- mayan/apps/django_gpg/serializers.py | 8 ++-- mayan/apps/django_gpg/settings.py | 2 +- mayan/apps/django_gpg/tests/test_api.py | 63 +++++++++++++++---------- mayan/apps/django_gpg/urls.py | 13 ++--- mayan/apps/tags/routers.py | 20 -------- 6 files changed, 58 insertions(+), 84 deletions(-) delete mode 100644 mayan/apps/tags/routers.py diff --git a/mayan/apps/django_gpg/api_views.py b/mayan/apps/django_gpg/api_views.py index dc7fcfa4f7..03da798bce 100644 --- a/mayan/apps/django_gpg/api_views.py +++ b/mayan/apps/django_gpg/api_views.py @@ -1,9 +1,6 @@ from __future__ import absolute_import, unicode_literals -from rest_framework import generics - -from mayan.apps.rest_api.filters import MayanObjectPermissionsFilter -from mayan.apps.rest_api.permissions import MayanPermission +from mayan.apps.rest_api.viewsets import MayanAPIModelViewSet from .models import Key from .permissions import ( @@ -12,30 +9,15 @@ from .permissions import ( from .serializers import KeySerializer -class APIKeyListView(generics.ListCreateAPIView): - """ - get: Returns a list of all the keys. - post: Upload a new key. - """ - filter_backends = (MayanObjectPermissionsFilter,) - mayan_object_permissions = {'GET': (permission_key_view,)} - mayan_view_permissions = {'POST': (permission_key_upload,)} - permission_classes = (MayanPermission,) - queryset = Key.objects.all() - serializer_class = KeySerializer - - -class APIKeyView(generics.RetrieveDestroyAPIView): - """ - delete: Delete the selected key. - get: Return the details of the selected key. - """ - filter_backends = (MayanObjectPermissionsFilter,) - lookup_field = 'pk' +class KeyAPIViewSet(MayanAPIModelViewSet): lookup_url_kwarg = 'key_id' - mayan_object_permissions = { - 'DELETE': (permission_key_delete,), - 'GET': (permission_key_view,), + object_permission_map = { + 'destroy': permission_key_delete, + 'list': permission_key_view, + 'retrieve': permission_key_view, } queryset = Key.objects.all() serializer_class = KeySerializer + view_permission_map = { + 'create': permission_key_upload + } diff --git a/mayan/apps/django_gpg/serializers.py b/mayan/apps/django_gpg/serializers.py index 6191ea6f24..b5a1e8e572 100644 --- a/mayan/apps/django_gpg/serializers.py +++ b/mayan/apps/django_gpg/serializers.py @@ -5,11 +5,13 @@ from rest_framework import serializers from .models import Key -class KeySerializer(serializers.ModelSerializer): +class KeySerializer(serializers.HyperlinkedModelSerializer): class Meta: extra_kwargs = { - 'lookup_url_kwarg': 'key_id', - 'url': {'view_name': 'rest_api:key-detail'}, + 'url': { + 'lookup_url_kwarg': 'key_id', + 'view_name': 'rest_api:key-detail' + }, } fields = ( 'algorithm', 'creation_date', 'expiration_date', 'fingerprint', diff --git a/mayan/apps/django_gpg/settings.py b/mayan/apps/django_gpg/settings.py index 0559a1504f..31bb8741b4 100644 --- a/mayan/apps/django_gpg/settings.py +++ b/mayan/apps/django_gpg/settings.py @@ -8,7 +8,7 @@ from .literals import ( DEFAULT_GPG_PATH, DEFAULT_KEYSERVER, DEFAULT_SETTING_GPG_BACKEND ) -namespace = Namespace(name='django_gpg', label=_('Signatures')) +namespace = Namespace(label=_('Signatures'), name='django_gpg') setting_gpg_backend = namespace.add_setting( default=DEFAULT_SETTING_GPG_BACKEND, diff --git a/mayan/apps/django_gpg/tests/test_api.py b/mayan/apps/django_gpg/tests/test_api.py index 14abdd85f3..71ab51e47e 100644 --- a/mayan/apps/django_gpg/tests/test_api.py +++ b/mayan/apps/django_gpg/tests/test_api.py @@ -10,18 +10,10 @@ from ..permissions import ( ) from .literals import TEST_KEY_DATA, TEST_KEY_FINGERPRINT +from .mixins import KeyTestMixin -class KeyAPITestCase(BaseAPITestCase): - def setUp(self): - super(KeyAPITestCase, self).setUp() - self.login_user() - - def _create_key(self): - return Key.objects.create(key_data=TEST_KEY_DATA) - - # Key creation by upload - +class KeyAPITestCase(KeyTestMixin, BaseAPITestCase): def _request_key_create_view(self): return self.post( viewname='rest_api:key-list', data={ @@ -32,13 +24,13 @@ class KeyAPITestCase(BaseAPITestCase): def test_key_create_view_no_permission(self): response = self._request_key_create_view() self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(Key.objects.count(), 0) def test_key_create_view_with_permission(self): self.grant_permission(permission=permission_key_upload) response = self._request_key_create_view() - self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(response.data['fingerprint'], TEST_KEY_FINGERPRINT) @@ -46,49 +38,70 @@ class KeyAPITestCase(BaseAPITestCase): self.assertEqual(Key.objects.count(), 1) self.assertEqual(key.fingerprint, TEST_KEY_FINGERPRINT) - # Key deletion - def _request_key_delete_view(self): return self.delete( - viewname='rest_api:key-detail', kwargs={'key_id': self.key.pk} + viewname='rest_api:key-detail', kwargs={'key_id': self.test_key.pk} ) def test_key_delete_view_no_access(self): - self.key = self._create_key() + self._create_test_key() + response = self._request_key_delete_view() self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertEqual(Key.objects.count(), 1) def test_key_delete_view_with_access(self): - self.key = self._create_key() + self._create_test_key() + self.grant_access( - permission=permission_key_delete, obj=self.key + permission=permission_key_delete, obj=self.test_key ) response = self._request_key_delete_view() self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertEqual(Key.objects.count(), 0) - # Key detail + self.assertEqual(Key.objects.count(), 0) def _request_key_detail_view(self): return self.get( - viewname='rest_api:key-detail', kwargs={'key_id': self.key.pk} + viewname='rest_api:key-detail', kwargs={'key_id': self.test_key.pk} ) def test_key_detail_view_no_access(self): - self.key = self._create_key() - response = self._request_key_detail_view() + self._create_test_key() + response = self._request_key_detail_view() self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_key_detail_view_with_access(self): - self.key = self._create_key() + self._create_test_key() + self.grant_access( - permission=permission_key_view, obj=self.key + permission=permission_key_view, obj=self.test_key ) response = self._request_key_detail_view() self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( - response.data['fingerprint'], self.key.fingerprint + response.data['fingerprint'], self.test_key.fingerprint ) + + def _request_key_list_view(self): + return self.get(viewname='rest_api:key-list') + + def test_key_list_view_no_access(self): + self._create_test_key() + + response = self._request_key_list_view() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.json()['count'], 0) + + def test_key_list_view_with_access(self): + self._create_test_key() + + self.grant_access( + permission=permission_key_view, obj=self.test_key + ) + response = self._request_key_list_view() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.json()['count'], 1) diff --git a/mayan/apps/django_gpg/urls.py b/mayan/apps/django_gpg/urls.py index eaad4a617b..915373e5b3 100644 --- a/mayan/apps/django_gpg/urls.py +++ b/mayan/apps/django_gpg/urls.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django.conf.urls import url -from .api_views import APIKeyListView, APIKeyView +from .api_views import KeyAPIViewSet from .views import ( KeyDeleteView, KeyDetailView, KeyDownloadView, KeyQueryView, KeyQueryResultView, KeyReceive, KeyUploadView, PrivateKeyListView, @@ -45,10 +45,7 @@ urlpatterns = [ ) ] -api_urls = [ - url( - regex=r'^keys/(?P\d+)/$', name='key-detail', - view=APIKeyView.as_view() - ), - url(regex=r'^keys/$', name='key-list', view=APIKeyListView.as_view()) -] + +api_router_entries = ( + {'prefix': r'keys', 'viewset': KeyAPIViewSet, 'basename': 'key'}, +) diff --git a/mayan/apps/tags/routers.py b/mayan/apps/tags/routers.py deleted file mode 100644 index 04f7371af6..0000000000 --- a/mayan/apps/tags/routers.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import unicode_literals - -#from rest_framework import routers - -#router = routers.SimpleRouter() -#router.register(r'users', UserViewSet) -#router.register(r'accounts', AccountViewSet) -#urlpatterns = router.urls - -#router = routers.DefaultRouter() -#from mayan.apps.rest_api.api_views import router -#from mayan.apps.rest_api.urls import router - -from .api_views import TagViewSet - -router_entries = ( - {'prefix': r'tags', 'viewset': TagViewSet, 'base_name': 'tag'}, -) - -#router.register(prefix=r'tags', viewset=TagViewSet, basename='tag')