Add key serializer, API endpoints and API tests to the django_gpg app.

This commit is contained in:
Roberto Rosario
2017-02-08 01:28:30 -04:00
parent f885d886bd
commit 651e370191
5 changed files with 146 additions and 0 deletions

View File

@@ -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)

View File

@@ -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(

View File

@@ -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

View File

@@ -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)

View File

@@ -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<key_id>.+)/$', KeyReceive.as_view(), name='key_receive'
),
)
api_urls = [
url(
r'^keys/(?P<pk>[0-9]+)/$', APIKeyView.as_view(),
name='key-detail'
),
url(r'^keys/$', APIKeyListView.as_view(), name='key-list'),
]