From 80895316f1bdf0dc5e032ddb79b66aa1aafbdff4 Mon Sep 17 00:00:00 2001 From: medmunds Date: Tue, 12 May 2015 15:56:30 -0700 Subject: [PATCH] Deprecate DjrillAdminSite --- djrill/__init__.py | 11 ++++++++++- djrill/tests/test_admin.py | 24 +++++++++++++++++------- djrill/tests/test_legacy.py | 16 +++++++++++++--- djrill/tests/utils.py | 17 +++++++++++++++++ docs/history.rst | 14 ++++++++++++++ 5 files changed, 71 insertions(+), 11 deletions(-) diff --git a/djrill/__init__.py b/djrill/__init__.py index cde709d..92b5432 100644 --- a/djrill/__init__.py +++ b/djrill/__init__.py @@ -2,7 +2,7 @@ from django.conf import settings from django.contrib.admin.sites import AdminSite from django.utils.text import capfirst -from djrill.exceptions import MandrillAPIError, NotSupportedByMandrillError +from djrill.exceptions import MandrillAPIError, NotSupportedByMandrillError, removed_in_djrill_2 from ._version import * @@ -17,6 +17,15 @@ class DjrillAdminSite(AdminSite): # If new versions of Django break DjrillAdminSite, it's worth checking to see # whether django-adminplus has dealt with something similar. + def __init__(self, *args, **kwargs): + removed_in_djrill_2( + "DjrillAdminSite will be removed in Djrill 2.0. " + "You should remove references to it from your code. " + "(All of its data is available in the Mandrill dashboard.)" + ) + super(DjrillAdminSite, self).__init__(*args, **kwargs) + + index_template = "djrill/index.html" custom_views = [] custom_urls = [] diff --git a/djrill/tests/test_admin.py b/djrill/tests/test_admin.py index bab34cd..299cdd7 100644 --- a/djrill/tests/test_admin.py +++ b/djrill/tests/test_admin.py @@ -6,14 +6,9 @@ from django.contrib.auth.models import User from django.contrib import admin import six +from djrill.exceptions import RemovedInDjrill2 from djrill.tests.mock_backend import DjrillBackendMockAPITestCase - -from .utils import override_settings - -# We don't care that the `cycle` template tag will be removed in Django 2.0, -# because we're planning to drop the Djrill admin templates before then. -warnings.filterwarnings('ignore', category=PendingDeprecationWarning, - message="Loading the `cycle` tag from the `future` library") +from djrill.tests.utils import override_settings def reset_admin_site(): @@ -34,6 +29,21 @@ class DjrillAdminTests(DjrillBackendMockAPITestCase): # so return it to the default state before loading test_admin_urls reset_admin_site() + def run(self, result=None): + with warnings.catch_warnings(): + # DjrillAdminSite deprecation is tested in test_legacy + warnings.filterwarnings('ignore', category=RemovedInDjrill2, + message="DjrillAdminSite will be removed in Djrill 2.0") + # We don't care that the `cycle` template tag will be removed in Django 2.0, + # because we're planning to drop the Djrill admin templates before then. + warnings.filterwarnings('ignore', category=PendingDeprecationWarning, + message="Loading the `cycle` tag from the `future` library") + # We don't care that user messaging was deprecated in Django 1.3 + # (testing artifact of our runtests.py minimal Django settings) + warnings.filterwarnings('ignore', category=DeprecationWarning, + message="The user messaging API is deprecated.") + super(DjrillAdminTests, self).run(result) + def setUp(self): super(DjrillAdminTests, self).setUp() # Must be authenticated staff to access admin site... diff --git a/djrill/tests/test_legacy.py b/djrill/tests/test_legacy.py index 3bebb49..c1d558f 100644 --- a/djrill/tests/test_legacy.py +++ b/djrill/tests/test_legacy.py @@ -6,14 +6,24 @@ import warnings from django.core import mail from django.test import TestCase +from djrill import MandrillAPIError, NotSupportedByMandrillError, DjrillAdminSite from djrill.mail import DjrillMessage -from djrill import MandrillAPIError, NotSupportedByMandrillError - -from .mock_backend import DjrillBackendMockAPITestCase +from djrill.tests.mock_backend import DjrillBackendMockAPITestCase +from djrill.tests.utils import reset_warning_registry class DjrillBackendDeprecationTests(DjrillBackendMockAPITestCase): + def setUp(self): + reset_warning_registry() + super(DjrillBackendDeprecationTests, self).setUp() + + def test_deprecated_admin_site(self): + """Djrill 2.0 drops the custom DjrillAdminSite""" + self.assertWarnsMessage(DeprecationWarning, + "DjrillAdminSite will be removed in Djrill 2.0", + DjrillAdminSite) + def test_deprecated_json_date_encoding(self): """Djrill 2.0+ avoids a blanket JSONDateUTCEncoder""" # Djrill allows dates for send_at, so shouldn't warn: diff --git a/djrill/tests/utils.py b/djrill/tests/utils.py index c001e3b..8601082 100644 --- a/djrill/tests/utils.py +++ b/djrill/tests/utils.py @@ -1,9 +1,11 @@ import re import six +import sys __all__ = ( 'BackportedAssertions', 'override_settings', + 'reset_warning_registry', ) try: @@ -86,3 +88,18 @@ class BackportedAssertions(object): callable_obj=None, *args, **kwargs): return six.assertRaisesRegex(self, expected_exception, re.escape(expected_message), callable_obj, *args, **kwargs) + + +# Backport from Django 1.8 (django.test.utils) +def reset_warning_registry(): + """ + Clear warning registry for all modules. This is required in some tests + because of a bug in Python that prevents warnings.simplefilter("always") + from always making warnings appear: http://bugs.python.org/issue4180 + + The bug was fixed in Python 3.4.2. + """ + key = "__warningregistry__" + for mod in sys.modules.values(): + if hasattr(mod, key): + getattr(mod, key).clear() diff --git a/docs/history.rst b/docs/history.rst index 221d2de..9e4bb32 100644 --- a/docs/history.rst +++ b/docs/history.rst @@ -16,6 +16,20 @@ version of Djrill (1.4) will try to warn you if you use things that will change. (Warnings appear in the console when running Django in debug mode.) +* **Djrill Admin site** + + Djrill 2.0 will remove the custom Djrill admin site. It duplicates + information from Mandrill's dashboard, most Djrill users are unaware + it exists, and it has caused problems tracking Django admin changes. + + Drill 1.4 will report a `DeprecationWarning` when you try to load + the `DjrillAdminSite`. You should remove it from your code. + + Also, if you changed :setting:`INSTALLED_APPS` to use + `'django.contrib.admin.apps.SimpleAdminConfig'`, you may be able to + switch that back to `'django.contrib.admin'` and let Django + handle the `admin.autodiscover()` for you. + * **Dates in merge data and other attributes** Djrill automatically converts :attr:`send_at` `date` and `datetime`