From 86a946a1a6be09e3d857f981313661565df3a449 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Wed, 18 Jun 2008 09:00:11 +0000 Subject: [PATCH] newforms-admin: Fixed #7483 (thanks, Daniel Roseman) - delete view now correctly links to related objects git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@7685 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 1 + django/contrib/admin/util.py | 4 +-- .../fixtures/admin-views-users.xml | 4 +++ tests/regressiontests/admin_views/models.py | 27 ++++++++++++++----- tests/regressiontests/admin_views/tests.py | 19 +++++++++---- 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/AUTHORS b/AUTHORS index 7d82f69006..ee45068cad 100644 --- a/AUTHORS +++ b/AUTHORS @@ -315,6 +315,7 @@ answer newbie questions, and generally made Django that much better: Matt Riggott Henrique Romano Armin Ronacher + Daniel Roseman Brian Rosner Oliver Rutherfurd ryankanno diff --git a/django/contrib/admin/util.py b/django/contrib/admin/util.py index ded284b640..ecb10e55d2 100644 --- a/django/contrib/admin/util.py +++ b/django/contrib/admin/util.py @@ -19,7 +19,7 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_ return # Avoid recursing too deep. opts_seen = [] for related in opts.get_all_related_objects(): - has_admin = related.__class__ in admin_site._registry + has_admin = related.model in admin_site._registry if related.opts in opts_seen: continue opts_seen.append(related.opts) @@ -68,7 +68,7 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_ if not user.has_perm(p): perms_needed.add(related.opts.verbose_name) for related in opts.get_all_related_many_to_many_objects(): - has_admin = related.__class__ in admin_site._registry + has_admin = related.model in admin_site._registry if related.opts in opts_seen: continue opts_seen.append(related.opts) diff --git a/tests/regressiontests/admin_views/fixtures/admin-views-users.xml b/tests/regressiontests/admin_views/fixtures/admin-views-users.xml index 89da93dbd7..8d6c62b58f 100644 --- a/tests/regressiontests/admin_views/fixtures/admin-views-users.xml +++ b/tests/regressiontests/admin_views/fixtures/admin-views-users.xml @@ -70,8 +70,12 @@ + + Test section + <p>test content</p> 2008-03-18 11:54:58 + 1 \ No newline at end of file diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py index 2c0ba1d909..311989bd55 100644 --- a/tests/regressiontests/admin_views/models.py +++ b/tests/regressiontests/admin_views/models.py @@ -1,12 +1,20 @@ from django.db import models from django.contrib import admin +class Section(models.Model): + """ + A simple section that links to articles, to test linking to related items + in admin views. + """ + name = models.CharField(max_length=100) + class Article(models.Model): """ - A simple article to test admin views. Test backwards compabilty. + A simple article to test admin views. Test backwards compatibility. """ content = models.TextField() date = models.DateTimeField() + section = models.ForeignKey(Section) class ArticleAdmin(admin.ModelAdmin): list_display = ('content', 'date') @@ -14,9 +22,11 @@ class ArticleAdmin(admin.ModelAdmin): def changelist_view(self, request): "Test that extra_context works" - return super(ArticleAdmin, self).changelist_view(request, extra_context={ - 'extra_var': 'Hello!' - }) + return super(ArticleAdmin, self).changelist_view( + request, extra_context={ + 'extra_var': 'Hello!' + } + ) class CustomArticle(models.Model): content = models.TextField() @@ -33,9 +43,12 @@ class CustomArticleAdmin(admin.ModelAdmin): def changelist_view(self, request): "Test that extra_context works" - return super(CustomArticleAdmin, self).changelist_view(request, extra_context={ - 'extra_var': 'Hello!' - }) + return super(CustomArticleAdmin, self).changelist_view( + request, extra_context={ + 'extra_var': 'Hello!' + } + ) admin.site.register(Article, ArticleAdmin) admin.site.register(CustomArticle, CustomArticleAdmin) +admin.site.register(Section) diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index a70016d540..3e6b625ca3 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -5,7 +5,7 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.admin.sites import LOGIN_FORM_KEY, _encode_post_data # local test models -from models import Article, CustomArticle +from models import Article, CustomArticle, Section def get_perm(Model, perm): """Return the permission object, for the Model""" @@ -40,6 +40,9 @@ class AdminViewPermissionsTest(TestCase): delete_user = User.objects.get(username='deleteuser') delete_user.user_permissions.add(get_perm(Article, opts.get_delete_permission())) + + delete_user.user_permissions.add(get_perm(Section, + Section._meta.get_delete_permission())) # login POST dicts self.super_login = {'post_data': _encode_post_data({}), @@ -116,7 +119,8 @@ class AdminViewPermissionsTest(TestCase): """Test add view restricts access and actually adds items.""" add_dict = {'content': '

great article

', - 'date_0': '2008-03-18', 'date_1': '10:54:39'} + 'date_0': '2008-03-18', 'date_1': '10:54:39', + 'section': 1} # Change User should not have access to add articles self.client.get('/test_admin/admin/') @@ -158,7 +162,8 @@ class AdminViewPermissionsTest(TestCase): """Change view should restrict access and allow users to edit items.""" change_dict = {'content': '

edited article

', - 'date_0': '2008-03-18', 'date_1': '10:54:39'} + 'date_0': '2008-03-18', 'date_1': '10:54:39', + 'section': 1} # add user shoud not be able to view the list of article or change any of them self.client.get('/test_admin/admin/') @@ -270,8 +275,12 @@ class AdminViewPermissionsTest(TestCase): # Delete user can delete self.client.get('/test_admin/admin/') self.client.post('/test_admin/admin/', self.deleteuser_login) - request = self.client.get('/test_admin/admin/admin_views/article/1/delete/') - self.failUnlessEqual(request.status_code, 200) + response = self.client.get('/test_admin/admin/admin_views/section/1/delete/') + # test response contains link to related Article + self.assertContains(response, "admin_views/article/1/") + + response = self.client.get('/test_admin/admin/admin_views/article/1/delete/') + self.failUnlessEqual(response.status_code, 200) post = self.client.post('/test_admin/admin/admin_views/article/1/delete/', delete_dict) # TODO: http://code.djangoproject.com/ticket/6819 or the next line fails self.assertRedirects(post, '/test_admin/admin/')