From 008b6cfa362a32eca6b60df7247831959ebaf576 Mon Sep 17 00:00:00 2001 From: "Rafael E. Belliard" Date: Tue, 13 Nov 2012 17:05:50 -0400 Subject: [PATCH 1/4] Provide a way to block admin.py when django-adminplus isn't loaded. --- djrill/admin.py | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/djrill/admin.py b/djrill/admin.py index 979f02a..8d21fcf 100644 --- a/djrill/admin.py +++ b/djrill/admin.py @@ -5,18 +5,25 @@ from djrill.views import (DjrillIndexView, DjrillSendersListView, DjrillAddSenderView, DjrillTagListView, DjrillUrlListView) -admin.site.register_view("djrill/senders/", DjrillSendersListView.as_view(), - "djrill_senders", "senders") -admin.site.register_view("djrill/status/", DjrillIndexView.as_view(), - "djrill_status", "status") -admin.site.register_view("djrill/tags/", DjrillTagListView.as_view(), - "djrill_tags", "tags") -admin.site.register_view("djrill/urls/", DjrillUrlListView.as_view(), - "djrill_urls", "urls") +''' +This condition is set so wild 'admin.autodiscovers' don't call this admin.py +when we don't want it to and when django-adminplus isn't set, which is +colossally breaks the rest of the admins' sections. +''' +if hasattr(admin.site,'register_view'): + admin.site.register_view("djrill/senders/", DjrillSendersListView.as_view(), + "djrill_senders", "senders") + admin.site.register_view("djrill/status/", DjrillIndexView.as_view(), + "djrill_status", "status") + admin.site.register_view("djrill/tags/", DjrillTagListView.as_view(), + "djrill_tags", "tags") + admin.site.register_view("djrill/urls/", DjrillUrlListView.as_view(), + "djrill_urls", "urls") + + admin.site.register_url("djrill/disable/sender/", DjrillDisableSenderView.as_view(), + "djrill_disable_sender") + admin.site.register_url("djrill/verify/sender/", DjrillVerifySenderView.as_view(), + "djrill_verify_sender") + admin.site.register_url("djrill/add/sender/", DjrillAddSenderView.as_view(), + "djrill_add_sender") -admin.site.register_url("djrill/disable/sender/", - DjrillDisableSenderView.as_view(), "djrill_disable_sender") -admin.site.register_url("djrill/verify/sender/", - DjrillVerifySenderView.as_view(), "djrill_verify_sender") -admin.site.register_url("djrill/add/sender/", - DjrillAddSenderView.as_view(), "djrill_add_sender") From 1b47ee93e40d22b11d356900b88002174259a570 Mon Sep 17 00:00:00 2001 From: medmunds Date: Wed, 5 Dec 2012 15:52:02 -0800 Subject: [PATCH 2/4] Add simple tests for admin views. Make sure the admin views load without error. (Not really trying to test content right now.) This includes failing test cases for: * brack3t/Djrill#8: admin.autodiscover() fails without django-adminplus or DjrillAdminSite * brack3t/Djrill#14: Django 1.5 doesn't support adminmedia template tag --- djrill/test_admin_urls.py | 16 +++++++++ djrill/tests.py | 71 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 djrill/test_admin_urls.py diff --git a/djrill/test_admin_urls.py b/djrill/test_admin_urls.py new file mode 100644 index 0000000..4fea6af --- /dev/null +++ b/djrill/test_admin_urls.py @@ -0,0 +1,16 @@ +try: + from django.conf.urls import include, patterns, url +except ImportError: + # Django 1.3 + from django.conf.urls.defaults import include, patterns, url + +from django.contrib import admin + +from djrill import DjrillAdminSite + +admin.site = DjrillAdminSite() +admin.autodiscover() + +urlpatterns = patterns('', + url(r'^admin/', include(admin.site.urls)), +) diff --git a/djrill/tests.py b/djrill/tests.py index ebbba35..e5c006f 100644 --- a/djrill/tests.py +++ b/djrill/tests.py @@ -1,6 +1,9 @@ from mock import patch +import sys from django.conf import settings +from django.contrib import admin +from django.contrib.auth.models import User from django.core import mail from django.core.exceptions import ImproperlyConfigured from django.test import TestCase @@ -13,8 +16,9 @@ class DjrillBackendMockAPITestCase(TestCase): class MockResponse: """requests.post return value mock sufficient for DjrillBackend""" - def __init__(self, status_code=200): + def __init__(self, status_code=200, content="{}"): self.status_code = status_code + self.content = content def setUp(self): self.patch = patch('requests.post') @@ -146,6 +150,71 @@ class DjrillBackendTests(DjrillBackendMockAPITestCase): self.assertEqual(sent, 0) +def reset_admin_site(): + """Return the Django admin globals to their original state""" + admin.site = admin.AdminSite() # restore default + if 'djrill.admin' in sys.modules: + del sys.modules['djrill.admin'] # force autodiscover to re-import + + +class DjrillAdminTests(DjrillBackendMockAPITestCase): + """Test the Djrill admin site""" + + # These tests currently just verify that the admin site pages load + # without error -- they don't test any Mandrill-supplied content. + # (Future improvements could mock the Mandrill responses.) + + # These urls set up the DjrillAdminSite as suggested in the readme + urls = 'djrill.test_admin_urls' + + @classmethod + def setUpClass(cls): + # Other test cases may muck with the Django admin site globals, + # so return it to the default state before loading test_admin_urls + reset_admin_site() + + def setUp(self): + super(DjrillAdminTests, self).setUp() + # Must be authenticated staff to access admin site... + admin = User.objects.create_user('admin', 'admin@example.com', 'secret') + admin.is_staff = True + admin.save() + self.client.login(username='admin', password='secret') + + def test_admin_senders(self): + response = self.client.get('/admin/djrill/senders/') + self.assertEqual(response.status_code, 200) + self.assertContains(response, "Senders") + + def test_admin_status(self): + response = self.client.get('/admin/djrill/status/') + self.assertEqual(response.status_code, 200) + self.assertContains(response, "Status") + + def test_admin_tags(self): + response = self.client.get('/admin/djrill/tags/') + self.assertEqual(response.status_code, 200) + self.assertContains(response, "Tags") + + def test_admin_urls(self): + response = self.client.get('/admin/djrill/urls/') + self.assertEqual(response.status_code, 200) + self.assertContains(response, "URLs") + + def test_admin_index(self): + """Make sure Djrill section is included in the admin index page""" + response = self.client.get('/admin/') + self.assertEqual(response.status_code, 200) + self.assertContains(response, "Djrill") + + +class DjrillNoAdminTests(TestCase): + def test_admin_autodiscover_without_djrill(self): + """Make sure autodiscover doesn't die without DjrillAdminSite""" + reset_admin_site() + admin.autodiscover() # test: this shouldn't error + + class DjrillMessageTests(TestCase): def setUp(self): self.subject = "Djrill baby djrill." From 5f0ff0cba264623d164bc803fb6b140caf8f2553 Mon Sep 17 00:00:00 2001 From: medmunds Date: Wed, 5 Dec 2012 16:04:55 -0800 Subject: [PATCH 3/4] Remove unused adminmedia template tag Fixes brack3t/Djrill#14 --- djrill/templates/djrill/senders_list.html | 2 +- djrill/templates/djrill/status.html | 2 +- djrill/templates/djrill/tags_list.html | 2 +- djrill/templates/djrill/urls_list.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/djrill/templates/djrill/senders_list.html b/djrill/templates/djrill/senders_list.html index 0310b63..c8f1976 100644 --- a/djrill/templates/djrill/senders_list.html +++ b/djrill/templates/djrill/senders_list.html @@ -1,5 +1,5 @@ {% extends "admin/base_site.html" %} -{% load adminmedia admin_list i18n %} +{% load admin_list i18n %} {% load url from future %} {% block extrastyle %} {{ block.super }} diff --git a/djrill/templates/djrill/status.html b/djrill/templates/djrill/status.html index b29cd3a..63f7731 100644 --- a/djrill/templates/djrill/status.html +++ b/djrill/templates/djrill/status.html @@ -1,5 +1,5 @@ {% extends "admin/base_site.html" %} -{% load adminmedia admin_list i18n %} +{% load admin_list i18n %} {% load url from future %} {% block extrastyle %} {{ block.super }} diff --git a/djrill/templates/djrill/tags_list.html b/djrill/templates/djrill/tags_list.html index 0624842..65f0d76 100644 --- a/djrill/templates/djrill/tags_list.html +++ b/djrill/templates/djrill/tags_list.html @@ -1,5 +1,5 @@ {% extends "admin/base_site.html" %} -{% load adminmedia admin_list i18n %} +{% load admin_list i18n %} {% load url from future %} {% block extrastyle %} {{ block.super }} diff --git a/djrill/templates/djrill/urls_list.html b/djrill/templates/djrill/urls_list.html index 7740bff..9214cbd 100644 --- a/djrill/templates/djrill/urls_list.html +++ b/djrill/templates/djrill/urls_list.html @@ -1,5 +1,5 @@ {% extends "admin/base_site.html" %} -{% load adminmedia admin_list i18n %} +{% load admin_list i18n %} {% load url from future %} {% block extrastyle %} {{ block.super }} From 49238b28ae0519a0268b2b45fc77674e44847bf9 Mon Sep 17 00:00:00 2001 From: medmunds Date: Wed, 5 Dec 2012 16:06:12 -0800 Subject: [PATCH 4/4] Fix django.conf.urls.defaults deprecation warning in admin (Test on Django 1.3, 1.4, 1.5b) --- djrill/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/djrill/__init__.py b/djrill/__init__.py index 7fb4430..97158cb 100644 --- a/djrill/__init__.py +++ b/djrill/__init__.py @@ -27,7 +27,11 @@ class DjrillAdminSite(AdminSite): def get_urls(self): """Add our custom views to the admin urlconf.""" urls = super(DjrillAdminSite, self).get_urls() - from django.conf.urls.defaults import patterns, url + try: + from django.conf.urls import include, patterns, url + except ImportError: + # Django 1.3 + from django.conf.urls.defaults import include, patterns, url for path, view, name, display_name in self.custom_views: urls += patterns('', url(r'^%s$' % path, self.admin_view(view), name=name),