diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml index 6d5a4b83..2e454c2d 100644 --- a/.github/workflows/test-package.yml +++ b/.github/workflows/test-package.yml @@ -19,9 +19,6 @@ jobs: id: create_matrix with: matrix: | - python-version {2.7}, django-version {1.8,1.9,1.10,1.11}, database {sqlite,postgres} - python-version {3.6}, django-version {1.8,1.9,1.10,1.11,2.0,2.1,2.2,3.0,3.1,3.2}, database {sqlite,postgres} - python-version {3.7}, django-version {2.0,2.1,2.2,3.0,3.1,3.2}, database {sqlite,postgres} python-version {3.8}, django-version {2.2,3.0,3.1,3.2}, database {sqlite,postgres} python-version {3.9}, django-version {2.2,3.0,3.1,3.2}, database {sqlite,postgres} python-version {3.10}, django-version {3.2,4.0,4.1}, database {sqlite,postgres} diff --git a/README.md b/README.md index 3f1f10ff..9bd10bc2 100644 --- a/README.md +++ b/README.md @@ -47,20 +47,17 @@ django-admin-interface is a modern **responsive flat admin interface customizabl ## Installation - Run `pip install django-admin-interface` -- Add `admin_interface`, `flat_responsive`, `flat` and `colorfield` to `settings.INSTALLED_APPS` **before** `django.contrib.admin` +- Add `admin_interface` and `colorfield` to `settings.INSTALLED_APPS` **before** `django.contrib.admin` ```python INSTALLED_APPS = ( #... "admin_interface", - "flat_responsive", # only if django version < 2.0 - "flat", # only if django version < 1.9 "colorfield", #... "django.contrib.admin", #... ) -# only if django version >= 3.0 X_FRAME_OPTIONS = "SAMEORIGIN" SILENCED_SYSTEM_CHECKS = ["security.W019"] ``` diff --git a/admin_interface/admin.py b/admin_interface/admin.py index c70e3a97..5a36777b 100644 --- a/admin_interface/admin.py +++ b/admin_interface/admin.py @@ -1,8 +1,6 @@ -# -*- coding: utf-8 -*- - from django.contrib import admin +from django.utils.translation import gettext_lazy as _ -from admin_interface.compat import gettext_lazy as _ from admin_interface.models import Theme diff --git a/admin_interface/apps.py b/admin_interface/apps.py index ffeafdcb..7560d475 100644 --- a/admin_interface/apps.py +++ b/admin_interface/apps.py @@ -1,9 +1,6 @@ -# -*- coding: utf-8 -*- - from django.apps import AppConfig from django.db.models.signals import post_migrate - -from admin_interface.compat import gettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class AdminInterfaceConfig(AppConfig): diff --git a/admin_interface/cache.py b/admin_interface/cache.py index b256c1a7..78d1ffe8 100644 --- a/admin_interface/cache.py +++ b/admin_interface/cache.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - from django.conf import settings from django.core.cache import cache, caches diff --git a/admin_interface/compat.py b/admin_interface/compat.py deleted file mode 100644 index fed1d1b9..00000000 --- a/admin_interface/compat.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -import django - -if django.VERSION >= (1, 11): - from django.core.validators import FileExtensionValidator -else: - - def FileExtensionValidator(*args, **kwargs): - def noop(*args, **kwargs): - pass - - return noop - - -if django.VERSION < (1, 10): - from django.core.urlresolvers import NoReverseMatch, reverse -else: - from django.urls import NoReverseMatch, reverse - -if django.VERSION < (2, 0): - from django.utils.encoding import force_text as force_str - from django.utils.translation import ugettext_lazy as gettext_lazy -else: - from django.utils.encoding import force_str - from django.utils.translation import gettext_lazy diff --git a/admin_interface/migrations/0021_file_extension_validator.py b/admin_interface/migrations/0021_file_extension_validator.py index 1b9846c2..75eb2997 100644 --- a/admin_interface/migrations/0021_file_extension_validator.py +++ b/admin_interface/migrations/0021_file_extension_validator.py @@ -2,10 +2,9 @@ from __future__ import unicode_literals +from django.core.validators import FileExtensionValidator from django.db import migrations, models -from admin_interface.compat import FileExtensionValidator - class Migration(migrations.Migration): diff --git a/admin_interface/models.py b/admin_interface/models.py index e847d36e..c3c13499 100644 --- a/admin_interface/models.py +++ b/admin_interface/models.py @@ -1,18 +1,13 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - from colorfield.fields import ColorField +from django.core.validators import FileExtensionValidator from django.db import models from django.db.models.signals import post_delete, post_save, pre_save -from six import python_2_unicode_compatible +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ -from admin_interface.cache import del_cached_active_theme -from admin_interface.compat import FileExtensionValidator, force_str -from admin_interface.compat import gettext_lazy as _ +from .cache import del_cached_active_theme -@python_2_unicode_compatible class Theme(models.Model): @staticmethod def post_migrate_handler(**kwargs): diff --git a/admin_interface/settings.py b/admin_interface/settings.py index 340b8095..f63f139d 100644 --- a/admin_interface/settings.py +++ b/admin_interface/settings.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - import django from django.conf import settings from django.core.exceptions import ImproperlyConfigured @@ -29,5 +27,3 @@ def check_installed_app(app, max_dj_version=None): def check_installed_apps(): check_installed_app("colorfield") - check_installed_app("flat", max_dj_version=(1, 9)) - check_installed_app("flat_responsive", max_dj_version=(2, 0)) diff --git a/admin_interface/static/admin/js/popup_response.js b/admin_interface/static/admin/js/popup_response.js index f669389c..dc24ef2b 100644 --- a/admin_interface/static/admin/js/popup_response.js +++ b/admin_interface/static/admin/js/popup_response.js @@ -42,11 +42,7 @@ if (typeof(openerRef.dismissAddRelatedObjectPopup) === 'function') { openerRef.dismissAddRelatedObjectPopup(windowRef, initData.value, initData.obj); } - else if (typeof(openerRef.dismissAddAnotherPopup) === 'function') { - // django 1.7 compatibility - openerRef.dismissAddAnotherPopup(windowRef, initData.value, initData.obj); - } break; } -})(); \ No newline at end of file +})(); diff --git a/admin_interface/static/admin_interface/related-modal/related-modal.js b/admin_interface/static/admin_interface/related-modal/related-modal.js index b3b9d326..dd1065a3 100644 --- a/admin_interface/static/admin_interface/related-modal/related-modal.js +++ b/admin_interface/static/admin_interface/related-modal/related-modal.js @@ -70,7 +70,7 @@ if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined') } } - // fix for django 1.7 + // fix for django 1.7 TODO remove if (iframeSrc.indexOf('_popup=1') === -1) { if (iframeSrc.indexOf('?') === -1) { iframeSrc += '?_popup=1'; @@ -135,10 +135,6 @@ if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined') window.presentRelatedObjectModal = presentRelatedObjectModal; window.presentRelatedObjectModalOnClickOn = presentRelatedObjectModalOnClickOn; - // django 1.7 compatibility - presentRelatedObjectModalOnClickOn('a.add-another'); - - // django 1.8 and above presentRelatedObjectModalOnClickOn('a.related-widget-wrapper-link'); // raw_id_fields support diff --git a/admin_interface/templatetags/admin_interface_tags.py b/admin_interface/templatetags/admin_interface_tags.py index ee2fb1e1..51783464 100644 --- a/admin_interface/templatetags/admin_interface_tags.py +++ b/admin_interface/templatetags/admin_interface_tags.py @@ -1,28 +1,20 @@ -# -*- coding: utf-8 -*- - import hashlib import re -import django from django import template from django.conf import settings from django.template.loader import get_template +from django.urls import NoReverseMatch, reverse from django.utils import translation from admin_interface.cache import get_cached_active_theme, set_cached_active_theme -from admin_interface.compat import NoReverseMatch, reverse from admin_interface.models import Theme from admin_interface.version import __version__ register = template.Library() -if django.VERSION < (1, 9): - simple_tag = register.assignment_tag -else: - simple_tag = register.simple_tag - -@simple_tag(takes_context=True) +@register.simple_tag(takes_context=True) def get_admin_interface_languages(context): if not settings.USE_I18N: # i18n disabled @@ -65,7 +57,7 @@ def get_admin_interface_languages(context): return langs_data -@simple_tag() +@register.simple_tag() def get_admin_interface_theme(): theme = get_cached_active_theme() if not theme: @@ -74,20 +66,20 @@ def get_admin_interface_theme(): return theme -@simple_tag() +@register.simple_tag() def get_admin_interface_setting(setting): theme = get_admin_interface_theme() return getattr(theme, setting) -@simple_tag() +@register.simple_tag() def get_admin_interface_inline_template(template): template_path = template.split("/") template_path[-1] = "headerless_" + template_path[-1] return "/".join(template_path) -@simple_tag(takes_context=False) +@register.simple_tag() def get_admin_interface_version(): return __version__ @@ -98,17 +90,17 @@ def hash_string(text): return sha224_hash -@simple_tag(takes_context=False) +@register.simple_tag() def get_admin_interface_nocache(): return hash_string(__version__) -@simple_tag() +@register.simple_tag() def admin_interface_clear_filter_qs(changelist, list_filter): return changelist.get_query_string(remove=list_filter.expected_parameters()) -@simple_tag() +@register.simple_tag() def admin_interface_filter_removal_link(changelist, list_filter): template = get_template("admin_interface/list_filter_removal_link.html") title = list_filter.title @@ -130,7 +122,7 @@ def admin_interface_filter_removal_link(changelist, list_filter): ) -@simple_tag() +@register.simple_tag() def admin_interface_use_changeform_tabs(adminform, inline_forms): theme = get_admin_interface_theme() has_fieldset_tabs = theme.show_fieldsets_as_tabs and len(adminform.fieldsets) > 1 diff --git a/admin_interface/version.py b/admin_interface/version.py index 518a08d8..8b301a77 100644 --- a/admin_interface/version.py +++ b/admin_interface/version.py @@ -1,3 +1 @@ -# -*- coding: utf-8 -*- - __version__ = "0.23.0" diff --git a/runtests.py b/runtests.py index 7075c557..9c83e95f 100755 --- a/runtests.py +++ b/runtests.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - import os import sys diff --git a/setup.py b/setup.py index ee42232d..0a68a709 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,4 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- - import os import sys @@ -18,10 +16,7 @@ long_description_content_type = "text/markdown" long_description = "" try: - long_description_file_options = ( - {} if sys.version_info[0] < 3 else {"encoding": "utf-8"} - ) - with open(long_description_file_path, "r", **long_description_file_options) as f: + with open(long_description_file_path, "r", encoding="utf-8") as f: long_description = f.read() except IOError: pass @@ -54,7 +49,6 @@ "custom", "ui", ], - requires=["django(>=1.7)"], install_requires=[ "django-colorfield >= 0.2, < 1.0", "django-flat-theme >= 1.0, < 2.0", @@ -65,13 +59,6 @@ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", - "Framework :: Django :: 1.7", - "Framework :: Django :: 1.8", - "Framework :: Django :: 1.9", - "Framework :: Django :: 1.10", - "Framework :: Django :: 1.11", - "Framework :: Django :: 2.0", - "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Framework :: Django :: 3.0", "Framework :: Django :: 3.1", @@ -82,19 +69,13 @@ "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Topic :: Software Development :: Build Tools", ], - license="MIT", test_suite="runtests.runtests", ) diff --git a/tests/settings.py b/tests/settings.py index 55fb4689..1f3690a0 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -1,11 +1,5 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - import os -import django - BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SECRET_KEY = "django-admin-interface" @@ -18,17 +12,6 @@ "colorfield", ] -if django.VERSION < (1, 9): - # ONLY if django version < 1.9 - INSTALLED_APPS += [ - "flat", - ] - -if django.VERSION < (2, 0): - # ONLY if django version < 2.0 - INSTALLED_APPS += [ - "flat_responsive", - ] INSTALLED_APPS += [ "django.contrib.admin", @@ -38,20 +21,12 @@ "django.contrib.sessions", ] -if django.VERSION < (2, 0): - MIDDLEWARE_CLASSES = [ - "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.messages.middleware.MessageMiddleware", - "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.common.CommonMiddleware", - ] -else: - MIDDLEWARE = [ - "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.messages.middleware.MessageMiddleware", - "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.common.CommonMiddleware", - ] +MIDDLEWARE = [ + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", +] TEMPLATES = [ { diff --git a/tests/test_fixtures.py b/tests/test_fixtures.py index 15c8dc31..49aaa1b2 100644 --- a/tests/test_fixtures.py +++ b/tests/test_fixtures.py @@ -1,7 +1,3 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - from django.core.management import call_command from django.test import TestCase diff --git a/tests/test_models.py b/tests/test_models.py index 30fba992..1adadc52 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,7 +1,3 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - import random import shutil from unittest import expectedFailure diff --git a/tests/test_multidb.py b/tests/test_multidb.py index 83915f16..f5929b07 100644 --- a/tests/test_multidb.py +++ b/tests/test_multidb.py @@ -1,6 +1,5 @@ from unittest import skipIf -from django import VERSION from django.test import TestCase from admin_interface.models import Theme @@ -24,9 +23,6 @@ def test_dbrouter_selects_correct_db(self): db_for_theme = router.db_for_read(Theme) assert db_for_theme == "replica" - @skipIf( - VERSION[0] < 2, "TestCase does not respect database param on older versions" - ) def test_dbrouter_errors_when_fetching_from_default(self): with self.assertRaises(Exception): Theme.get_active_theme() diff --git a/tests/test_settings.py b/tests/test_settings.py index d795638d..ffbae857 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -1,8 +1,3 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - -import django from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.test import TestCase, override_settings @@ -27,24 +22,10 @@ def tearDown(self): pass def __test_installed_apps(self): - dj_version = django.VERSION installed_apps = settings.INSTALLED_APPS if "colorfield" not in installed_apps: self.assertRaises(ImproperlyConfigured, check_installed_apps) - - elif "flat" not in installed_apps and dj_version < (1, 9): - self.assertRaises(ImproperlyConfigured, check_installed_apps) - - elif "flat" in installed_apps and dj_version >= (1, 9): - self.assertRaises(ImproperlyConfigured, check_installed_apps) - - elif "flat_responsive" not in installed_apps and dj_version < (2, 0): - self.assertRaises(ImproperlyConfigured, check_installed_apps) - - elif "flat_responsive" in installed_apps and dj_version >= (2, 0): - self.assertRaises(ImproperlyConfigured, check_installed_apps) - else: check_installed_apps() @@ -52,8 +33,6 @@ def __test_installed_apps(self): INSTALLED_APPS=[ "admin_interface", "colorfield", - "flat", - "flat_responsive", ] + DJANGO_APPS ) @@ -64,34 +43,8 @@ def test_installed_apps_all(self): INSTALLED_APPS=[ "admin_interface", # 'colorfield', - "flat", - "flat_responsive", ] + DJANGO_APPS ) def test_installed_apps_no_colorfield(self): self.__test_installed_apps() - - @override_settings( - INSTALLED_APPS=[ - "admin_interface", - "colorfield", - # 'flat', - "flat_responsive", - ] - + DJANGO_APPS - ) - def test_installed_apps_no_flat(self): - self.__test_installed_apps() - - @override_settings( - INSTALLED_APPS=[ - "admin_interface", - "colorfield", - "flat", - # 'flat_responsive', - ] - + DJANGO_APPS - ) - def test_installed_apps_no_flat_responsive(self): - self.__test_installed_apps() diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index bc620f54..0cd44a5a 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -1,7 +1,3 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - from django.template import Context, Template from django.test import TestCase, override_settings from django.test.client import RequestFactory diff --git a/tests/urls.py b/tests/urls.py index 9114d88d..6ed6eb6e 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -1,22 +1,11 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - -import django -from django.contrib import admin - -if django.VERSION < (2, 0): - from django.conf.urls import include - from django.conf.urls import url as re_path -else: - from django.urls import include, re_path - from django.conf.urls.i18n import i18n_patterns +from django.contrib import admin +from django.urls import include, path urlpatterns = [] urlpatterns += [ - re_path(r"^i18n/", include("django.conf.urls.i18n")), + path("i18n/", include("django.conf.urls.i18n")), ] urlpatterns += i18n_patterns( - re_path(r"^admin/", admin.site.urls), + path("admin/", admin.site.urls), ) diff --git a/tests/urls_without_i18n_patterns.py b/tests/urls_without_i18n_patterns.py index a0404020..083932c6 100644 --- a/tests/urls_without_i18n_patterns.py +++ b/tests/urls_without_i18n_patterns.py @@ -1,16 +1,6 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - -import django from django.contrib import admin - -if django.VERSION < (2, 0): - from django.conf.urls import url as re_path -else: - from django.urls import re_path - +from django.urls import path urlpatterns = [ - re_path(r"^admin/", admin.site.urls), + path("admin/", admin.site.urls), ] diff --git a/tox.ini b/tox.ini index de5ec728..3d1deee2 100644 --- a/tox.ini +++ b/tox.ini @@ -1,8 +1,5 @@ [tox] envlist = - py27-{dj17,dj18,dj19,dj110,dj111}-{sqlite,postgres}, - py36-{dj18,dj19,dj110,dj111,dj20,dj21,dj22,dj30,dj31,dj32}-{sqlite,postgres}, - py37-{dj20,dj21,dj22,dj30,dj31,dj32}-{sqlite,postgres}, py38-{dj22,dj30,dj31,dj32}-{sqlite,postgres}, py39-{dj22,dj30,dj31,dj32}-{sqlite,postgres}, py310-{dj32,dj40,dj41}-{sqlite,postgres}, @@ -10,9 +7,6 @@ envlist = [gh-actions] python = - 2.7: py27 - 3.6: py36 - 3.7: py37 3.8: py38 3.9: py39 3.10: py310 @@ -21,13 +15,6 @@ python = [testenv] passenv = CI GITHUB_WORKFLOW deps = - dj17: Django == 1.7.* - dj18: Django == 1.8.* - dj19: Django == 1.9.* - dj110: Django == 1.10.* - dj111: Django == 1.11.* - dj20: Django == 2.0.* - dj21: Django == 2.1.* dj22: Django == 2.2.* dj30: Django == 3.0.* dj31: Django == 3.1.*