diff --git a/mayan/apps/django_gpg/api_views.py b/mayan/apps/django_gpg/api_views.py new file mode 100644 index 0000000000..bb8762f0a0 --- /dev/null +++ b/mayan/apps/django_gpg/api_views.py @@ -0,0 +1,59 @@ +from __future__ import absolute_import, unicode_literals + +from rest_framework import generics + +from rest_api.filters import MayanObjectPermissionsFilter +from rest_api.permissions import MayanPermission + +from .models import Key +from .permissions import ( + permission_key_delete, permission_key_upload, permission_key_view +) +from .serializers import KeySerializer + + +class APIKeyListView(generics.ListCreateAPIView): + filter_backends = (MayanObjectPermissionsFilter,) + mayan_object_permissions = { + 'GET': (permission_key_view,), + 'POST': (permission_key_upload,) + } + permission_classes = (MayanPermission,) + queryset = Key.objects.all() + serializer_class = KeySerializer + + def get(self, *args, **kwargs): + """ + Returns a list of all the keys. + """ + return super(APIKeyListView, self).get(*args, **kwargs) + + def post(self, *args, **kwargs): + """ + Upload a new key. + """ + return super(APIKeyListView, self).post(*args, **kwargs) + + +class APIKeyView(generics.RetrieveDestroyAPIView): + filter_backends = (MayanObjectPermissionsFilter,) + mayan_object_permissions = { + 'DELETE': (permission_key_delete,), + 'GET': (permission_key_view,), + } + queryset = Key.objects.all() + serializer_class = KeySerializer + + def delete(self, *args, **kwargs): + """ + Delete the selected key. + """ + + return super(APIKeyView, self).delete(*args, **kwargs) + + def get(self, *args, **kwargs): + """ + Return the details of the selected key. + """ + + return super(APIKeyView, self).get(*args, **kwargs) diff --git a/mayan/apps/django_gpg/apps.py b/mayan/apps/django_gpg/apps.py index b3abb60d18..9a3c8340ab 100644 --- a/mayan/apps/django_gpg/apps.py +++ b/mayan/apps/django_gpg/apps.py @@ -10,6 +10,7 @@ from common import ( ) from common.classes import Package from navigation import SourceColumn +from rest_api.classes import APIEndPoint from .classes import KeyStub from .links import ( @@ -32,6 +33,7 @@ class DjangoGPGApp(MayanAppConfig): def ready(self): super(DjangoGPGApp, self).ready() + APIEndPoint(app=self, version_string='1') Key = self.get_model('Key') ModelPermission.register( diff --git a/mayan/apps/django_gpg/serializers.py b/mayan/apps/django_gpg/serializers.py new file mode 100644 index 0000000000..df3c965690 --- /dev/null +++ b/mayan/apps/django_gpg/serializers.py @@ -0,0 +1,17 @@ +from __future__ import unicode_literals + +from rest_framework import serializers + +from .models import Key + + +class KeySerializer(serializers.ModelSerializer): + class Meta: + extra_kwargs = { + 'url': {'view_name': 'rest_api:key-detail'}, + } + fields = ( + 'algorithm', 'creation_date', 'expiration_date', 'fingerprint', + 'id', 'key_data', 'key_type', 'length', 'url', 'user_id' + ) + model = Key diff --git a/mayan/apps/django_gpg/tests/test_api.py b/mayan/apps/django_gpg/tests/test_api.py new file mode 100644 index 0000000000..927fed2ff5 --- /dev/null +++ b/mayan/apps/django_gpg/tests/test_api.py @@ -0,0 +1,59 @@ +from __future__ import unicode_literals + +from django.contrib.auth import get_user_model +from django.core.urlresolvers import reverse +from django.test import override_settings + +from rest_framework.test import APITestCase + +from user_management.tests.literals import ( + TEST_ADMIN_EMAIL, TEST_ADMIN_PASSWORD, TEST_ADMIN_USERNAME +) + +from ..models import Key + +from .literals import TEST_KEY_DATA, TEST_KEY_FINGERPRINT + + +@override_settings(OCR_AUTO_OCR=False) +class KeyAPITestCase(APITestCase): + def setUp(self): + self.admin_user = get_user_model().objects.create_superuser( + username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, + password=TEST_ADMIN_PASSWORD + ) + + self.client.login( + username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD + ) + + def _create_key(self): + return Key.objects.create(key_data=TEST_KEY_DATA) + + def test_key_create_view(self): + response = self.client.post( + reverse('rest_api:key-list'), { + 'key_data': TEST_KEY_DATA + } + ) + self.assertEqual(response.data['fingerprint'], TEST_KEY_FINGERPRINT) + + key = Key.objects.first() + self.assertEqual(Key.objects.count(), 1) + self.assertEqual(key.fingerprint, TEST_KEY_FINGERPRINT) + + def test_key_delete_view(self): + key = self._create_key() + + self.client.delete(reverse('rest_api:key-detail', args=(key.pk,))) + + self.assertEqual(Key.objects.count(), 0) + + def test_key_detail_view(self): + key = self._create_key() + + response = self.client.get( + reverse('rest_api:key-detail', args=(key.pk,)) + ) + + self.assertEqual(response.data['fingerprint'], key.fingerprint) diff --git a/mayan/apps/django_gpg/urls.py b/mayan/apps/django_gpg/urls.py index 929e613e71..39068f3039 100644 --- a/mayan/apps/django_gpg/urls.py +++ b/mayan/apps/django_gpg/urls.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from django.conf.urls import patterns, url +from .api_views import APIKeyListView, APIKeyView from .views import ( KeyDeleteView, KeyDetailView, KeyDownloadView, KeyQueryView, KeyQueryResultView, KeyReceive, KeyUploadView, PrivateKeyListView, @@ -39,3 +40,11 @@ urlpatterns = patterns( r'^receive/(?P.+)/$', KeyReceive.as_view(), name='key_receive' ), ) + +api_urls = [ + url( + r'^keys/(?P[0-9]+)/$', APIKeyView.as_view(), + name='key-detail' + ), + url(r'^keys/$', APIKeyListView.as_view(), name='key-list'), +]