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), diff --git a/djrill/admin.py b/djrill/admin.py index d58860d..0ad70ee 100644 --- a/djrill/admin.py +++ b/djrill/admin.py @@ -4,11 +4,14 @@ from djrill.views import (DjrillIndexView, DjrillSendersListView, 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") +# Only try to register Djrill admin views if DjrillAdminSite +# or django-adminplus is in use +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") 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 }} 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."