From 3181f5df5dde06027dcab14836bf2d8ad6d776b8 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 29 Jan 2016 16:18:03 +0100 Subject: [PATCH] WIP see #831 --- modoboa/admin/api.py | 18 ++++++++++ modoboa/admin/serializers.py | 14 ++++++++ modoboa/admin/tests/api.py | 66 ++++++++++++++++++++++++++++++++++++ modoboa/admin/urls_api.py | 11 ++++++ modoboa/urls_api.py | 1 + requirements.txt | 1 - test-requirements.txt | 3 ++ 7 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 modoboa/admin/api.py create mode 100644 modoboa/admin/serializers.py create mode 100644 modoboa/admin/tests/api.py create mode 100644 modoboa/admin/urls_api.py create mode 100644 test-requirements.txt diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py new file mode 100644 index 000000000..cab177d6a --- /dev/null +++ b/modoboa/admin/api.py @@ -0,0 +1,18 @@ +"""Admin API.""" + +from rest_framework import viewsets +from rest_framework.permissions import DjangoModelPermissions + +from . import models +from . import serializers + + +class DomainViewSet(viewsets.ModelViewSet): + """ViewSet for Domain.""" + + permission_classes = [DjangoModelPermissions, ] + serializer_class = serializers.DomainSerializer + + def get_queryset(self): + """Filter queryset based on current user.""" + return models.Domain.objects.get_for_admin(self.request.user) diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py new file mode 100644 index 000000000..ca1a0ea4f --- /dev/null +++ b/modoboa/admin/serializers.py @@ -0,0 +1,14 @@ +"""Admin serializers.""" + +from rest_framework import serializers + +from . import models + + +class DomainSerializer(serializers.ModelSerializer): + + """Base Domain serializer.""" + + class Meta: + model = models.Domain + fields = ("pk", "name", "quota", "enabled", "type", ) diff --git a/modoboa/admin/tests/api.py b/modoboa/admin/tests/api.py new file mode 100644 index 000000000..7487a2ae6 --- /dev/null +++ b/modoboa/admin/tests/api.py @@ -0,0 +1,66 @@ +"""Admin API related tests.""" + +from django.core.urlresolvers import reverse + +from rest_framework.authtoken.models import Token + +from modoboa.core import models as core_models +from modoboa.lib.tests import ModoAPITestCase + +from .. import factories +from .. import models + + +class APITestCase(ModoAPITestCase): + + """Check API.""" + + @classmethod + def setUpTestData(cls): + """Create test data.""" + super(APITestCase, cls).setUpTestData() + factories.populate_database() + cls.da_token = Token.objects.create( + user=core_models.User.objects.get(username="admin@test.com")) + + def test_get_domains(self): + """Retrieve a list of domains.""" + url = reverse("external_api:domain-list") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + self.assertEqual(len(response.data), 2) + url = reverse( + "external_api:domain-detail", args=[response.data[0]["pk"]]) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data["name"], "test2.com") + + def test_create_domain(self): + """Check domain creation.""" + url = reverse("external_api:domain-list") + response = self.client.post(url, {"name": "test3.com", "quota": 10}) + self.assertEqual(response.status_code, 201) + self.assertTrue( + models.Domain.objects.filter(name="test3.com").exists()) + response = self.client.post(url, {}) + self.assertEqual(response.status_code, 400) + self.assertIn("name", response.data) + self.assertIn("quota", response.data) + + self.client.credentials( + HTTP_AUTHORIZATION='Token ' + self.da_token.key) + response = self.client.post(url, {"name": "test4.com", "quota": 10}) + self.assertEqual(response.status_code, 403) + + def test_update_domain(self): + """Check domain update.""" + domain = models.Domain.objects.get(name="test.com") + url = reverse("external_api:domain-detail", args=[domain.pk]) + response = self.client.put(url, {"name": "test.com", "quota": 1000}) + self.assertEqual(response.status_code, 200) + domain.refresh_from_db() + self.assertEqual(domain.quota, 1000) + + response = self.client.put(url, {"name": "test42.com", "quota": 1000}) + self.assertEqual(response.status_code, 200) + diff --git a/modoboa/admin/urls_api.py b/modoboa/admin/urls_api.py new file mode 100644 index 000000000..b3e1c33fd --- /dev/null +++ b/modoboa/admin/urls_api.py @@ -0,0 +1,11 @@ +"""Admin API urls.""" + +from rest_framework import routers + +from . import api + + +router = routers.SimpleRouter() +router.register(r"domains", api.DomainViewSet, base_name="domain") + +urlpatterns = router.urls diff --git a/modoboa/urls_api.py b/modoboa/urls_api.py index 5baa6af29..0027c4bd4 100644 --- a/modoboa/urls_api.py +++ b/modoboa/urls_api.py @@ -7,4 +7,5 @@ urlpatterns = patterns( "", ("", include("modoboa.core.urls_api")), + ("", include("modoboa.admin.urls_api")), ) diff --git a/requirements.txt b/requirements.txt index 941583e64..f265c3af9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,6 @@ django-reversion==1.9.3 dj-database-url pycrypto argparse -factory-boy>=2.4 passlib django-versionfield2>=0.3.3 requests diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..e37c21246 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,3 @@ +factory-boy>=2.4 +testfixtures==4.7.0 +