From e7452914450652b9ff04f4eb8a425510dd7abe2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20M=C3=BCllegger?= Date: Sun, 19 May 2013 15:32:51 +0200 Subject: [PATCH 1/2] Fixing issue that permissions cannot be hyperlinked from users and group API resource. --- djadmin2/models.py | 20 ++++++++++++-------- example/blog/admin2.py | 28 +++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/djadmin2/models.py b/djadmin2/models.py index a0b40a5..f7e50bd 100644 --- a/djadmin2/models.py +++ b/djadmin2/models.py @@ -108,6 +108,9 @@ class ModelAdmin2(BaseAdmin2): detail_view = views.ModelDetailView delete_view = views.ModelDeleteView + # API configuration + api_serializer_class = None + # API Views api_list_view = apiviews.ListCreateAPIView api_detail_view = apiviews.RetrieveUpdateDestroyAPIView @@ -131,6 +134,13 @@ class ModelAdmin2(BaseAdmin2): 'modeladmin': self, } + def get_default_api_view_kwargs(self): + kwargs = self.get_default_view_kwargs() + kwargs.update({ + 'serializer_class': self.api_serializer_class, + }) + return kwargs + def get_prefixed_view_name(self, view_name): return '{}_{}_{}'.format(self.app_label, self.model_name, view_name) @@ -157,24 +167,18 @@ class ModelAdmin2(BaseAdmin2): def get_delete_kwargs(self): return self.get_default_view_kwargs() - def get_api_index_kwargs(self): - return self.get_default_view_kwargs() - - def get_api_detail_kwargs(self): - return self.get_default_view_kwargs() - def get_index_url(self): return reverse('admin2:{}'.format(self.get_prefixed_view_name('index'))) def get_api_list_kwargs(self): - kwargs = self.get_default_view_kwargs() + kwargs = self.get_default_api_view_kwargs() kwargs.update({ 'paginate_by': self.list_per_page, }) return kwargs def get_api_detail_kwargs(self): - return self.get_default_view_kwargs() + return self.get_default_api_view_kwargs() def get_urls(self): return patterns('', diff --git a/example/blog/admin2.py b/example/blog/admin2.py index 8367587..403e11f 100644 --- a/example/blog/admin2.py +++ b/example/blog/admin2.py @@ -2,21 +2,43 @@ # Import your custom models from .models import Post, Comment from django.contrib.auth.forms import UserCreationForm, UserChangeForm -from django.contrib.auth.models import Group, Permission, User +from django.contrib.auth.models import Group, User +from rest_framework.relations import PrimaryKeyRelatedField import djadmin2 from djadmin2.models import ModelAdmin2 +from djadmin2.apiviews import Admin2APISerializer + + +class GroupSerializer(Admin2APISerializer): + permissions = PrimaryKeyRelatedField(many=True) + + class Meta: + model = Group + + +class GroupAdmin2(ModelAdmin2): + api_serializer_class = GroupSerializer + + +class UserSerializer(Admin2APISerializer): + user_permissions = PrimaryKeyRelatedField(many=True) + + class Meta: + model = User + exclude = ('passwords',) class UserAdmin2(ModelAdmin2): create_form_class = UserCreationForm update_form_class = UserChangeForm + api_serializer_class = UserSerializer + # Register each model with the admin djadmin2.default.register(Post) djadmin2.default.register(Comment) djadmin2.default.register(User, UserAdmin2) -djadmin2.default.register(Permission) -djadmin2.default.register(Group) +djadmin2.default.register(Group, GroupAdmin2) From 155f19db524a612a7f4307124bb8cef9c25a4c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20M=C3=BCllegger?= Date: Sun, 19 May 2013 15:56:22 +0200 Subject: [PATCH 2/2] Adding smoke tests for User and Group API resources. --- example/blog/tests/__init__.py | 1 + .../blog/tests/test_builtin_api_resources.py | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 example/blog/tests/test_builtin_api_resources.py diff --git a/example/blog/tests/__init__.py b/example/blog/tests/__init__.py index 9ccb8bb..c1a80e2 100644 --- a/example/blog/tests/__init__.py +++ b/example/blog/tests/__init__.py @@ -1,2 +1,3 @@ from test_views import * from test_apiviews import * +from test_builtin_api_resources import * diff --git a/example/blog/tests/test_builtin_api_resources.py b/example/blog/tests/test_builtin_api_resources.py new file mode 100644 index 0000000..a3f9a73 --- /dev/null +++ b/example/blog/tests/test_builtin_api_resources.py @@ -0,0 +1,29 @@ +from django.contrib.auth.models import Group, User +from django.core.urlresolvers import reverse +from django.test import TestCase + + +class UserAPITest(TestCase): + def test_list_response_ok(self): + response = self.client.get(reverse('admin2:auth_user_api-list')) + self.assertEqual(response.status_code, 200) + + def test_detail_response_ok(self): + user = User.objects.create_user( + username='Foo', + password='bar') + response = self.client.get( + reverse('admin2:auth_user_api-detail', args=(user.pk,))) + self.assertEqual(response.status_code, 200) + + +class GroupAPITest(TestCase): + def test_list_response_ok(self): + response = self.client.get(reverse('admin2:auth_group_api-list')) + self.assertEqual(response.status_code, 200) + + def test_detail_response_ok(self): + group = Group.objects.create(name='group') + response = self.client.get( + reverse('admin2:auth_group_api-detail', args=(group.pk,))) + self.assertEqual(response.status_code, 200)