Aggiornato con i contenuti del remoto al 07/03/2024

This commit is contained in:
Davide Borgonovo
2024-03-07 16:33:26 +01:00
parent 0eed8c8679
commit b8252030a4
156 changed files with 6303 additions and 2655 deletions
+45
View File
@@ -0,0 +1,45 @@
DATABASE_APPS_MAPPING = {
"admin_interface": "default",
}
class DatabaseAppsRouter:
"""
arouter to control all database operations on models for different
databases.
in case an app is not set in DATABASE_APPS_MAPPING, the router
will fallback to the `default` database.
Settings example:
DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
"""
def __init__(self, db_map=DATABASE_APPS_MAPPING):
"""
If routers is not specified, default to DATABASE_APPS_MAPPING
"""
self.db_map = db_map
def db_for_read(self, model, **hints):
"""Point all read operations to the specific database"""
if model._meta.app_label in self.db_map:
return self.db_map[model._meta.app_label]
return None
def db_for_write(self, model, **hints):
"""Point all write operations to the specific database"""
if model._meta.app_label in self.db_map:
return self.db_map[model._meta.app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database"""
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""Make sure that apps only appear in the related database"""
return None
+37 -38
View File
@@ -1,8 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import django
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -17,17 +12,6 @@ INSTALLED_APPS = [
"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",
@@ -37,20 +21,13 @@ INSTALLED_APPS += [
"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",
"django.middleware.locale.LocaleMiddleware",
]
TEMPLATES = [
{
@@ -89,6 +66,14 @@ database_config = {
"HOST": "",
"PORT": "",
},
"postgres_replica": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": "admin_interface_2",
"USER": "postgres",
"PASSWORD": "postgres",
"HOST": "",
"PORT": "",
},
}
github_workflow = os.environ.get("GITHUB_WORKFLOW")
@@ -96,24 +81,38 @@ if github_workflow:
database_config["postgres"]["NAME"] = "postgres"
database_config["postgres"]["HOST"] = "127.0.0.1"
database_config["postgres"]["PORT"] = "5432"
database_config["postgres_replica"]["HOST"] = "127.0.0.1"
database_config["postgres_replica"]["PORT"] = "5432"
replica_engine = (
"postgres_replica" if database_engine == "postgres" else database_engine
)
DATABASES = {
"default": database_config.get(database_engine),
"replica": database_config.get(replica_engine),
}
DATABASE_ROUTERS = ["tests.routers.DatabaseAppsRouter"]
USE_I18N = True
LANGUAGES = (
(
"en",
"English",
),
(
"it",
"Italian",
),
("de", "Deutsch"),
("en", "English"),
("es", "Español"),
("fa", "Farsi"),
("fr", "Français"),
("it", "Italiano"),
("pl", "Polski"),
("pt-BR", "Português"),
("ru", "Русский"),
("tr", "Türk"),
)
LANGUAGE_CODE = "en"
LOCALE_PATHS = (os.path.join(BASE_DIR, "admin_interface/locale/"),)
ROOT_URLCONF = "tests.urls"
MEDIA_ROOT = os.path.join(BASE_DIR, "admin_interface/public/media/")
+3 -7
View File
@@ -1,7 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.core.management import call_command
from django.test import TestCase
@@ -16,7 +12,7 @@ class AdminInterfaceFixturesTestCase(TestCase):
pass
def __load_theme(self, theme_name):
call_command("loaddata", "admin_interface_theme_%s.json" % (theme_name,))
call_command("loaddata", f"admin_interface_theme_{theme_name}.json")
def test_import_initial_data(self):
call_command("loaddata", "initial_data.json")
@@ -42,10 +38,10 @@ class AdminInterfaceFixturesTestCase(TestCase):
self.assertEqual(Theme.objects.count(), 2)
def test_import_override(self):
obj1 = Theme.get_active_theme()
obj1 = Theme.objects.get_active()
obj1.title = "Custom 1"
obj1.save()
self.__load_theme("django")
obj2 = Theme.get_active_theme()
obj2 = Theme.objects.get_active()
self.assertEqual(obj1.pk, obj2.pk)
self.assertTrue(obj1.title != obj2.title)
+34
View File
@@ -0,0 +1,34 @@
import re
from django.test import TestCase
from admin_interface.metadata import (
__author__,
__copyright__,
__description__,
__email__,
__license__,
__title__,
__version__,
)
class MetadataTestCase(TestCase):
"""
This class describes a metadata test case.
"""
def test_metadata(self):
self.assertTrue(isinstance(__author__, str))
self.assertTrue(isinstance(__copyright__, str))
self.assertTrue(isinstance(__description__, str))
self.assertTrue(isinstance(__email__, str))
self.assertTrue(isinstance(__license__, str))
self.assertTrue(isinstance(__title__, str))
self.assertTrue(isinstance(__version__, str))
def test_version(self):
v = __version__
v_re = re.compile(r"^([0-9]+)(\.([0-9]+)){1,2}$")
v_match = v_re.match(v)
self.assertTrue(v_match is not None)
+49 -23
View File
@@ -1,13 +1,9 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import random
import shutil
from django.conf import settings
from django.test import TestCase
import random
import shutil
from admin_interface.models import Theme
@@ -16,12 +12,13 @@ class AdminInterfaceModelsTestCase(TestCase):
pass
def tearDown(self):
Theme.objects.all().delete()
shutil.rmtree(settings.MEDIA_ROOT, ignore_errors=True)
def __test_active_theme(self):
theme = Theme.get_active_theme()
theme = Theme.objects.get_active()
print(theme)
self.assertTrue(theme != None)
self.assertTrue(theme is not None)
self.assertTrue(theme.active)
self.assertEqual(Theme.objects.filter(active=True).count(), 1)
@@ -35,7 +32,7 @@ class AdminInterfaceModelsTestCase(TestCase):
def test_default_theme_activated_on_save_if_no_active_themes(self):
Theme.objects.all().delete()
theme = Theme.get_active_theme()
theme = Theme.objects.get_active()
theme.active = False
theme.save()
self.__test_active_theme()
@@ -47,27 +44,27 @@ class AdminInterfaceModelsTestCase(TestCase):
def test_default_theme_activated_after_update_if_multiple_active_themes(self):
Theme.objects.all().delete()
theme_1 = Theme.objects.create(name="Custom 1", active=True)
theme_2 = Theme.objects.create(name="Custom 2", active=True)
theme_3 = Theme.objects.create(name="Custom 3", active=True)
Theme.objects.create(name="Custom 1", active=True)
Theme.objects.create(name="Custom 2", active=True)
Theme.objects.create(name="Custom 3", active=True)
Theme.objects.update(active=False)
Theme.objects.update(active=True)
self.__test_active_theme()
def test_default_theme_activated_on_active_theme_deleted(self):
Theme.objects.all().delete()
theme_1 = Theme.objects.create(name="Custom 1", active=True)
theme_2 = Theme.objects.create(name="Custom 2", active=True)
theme_3 = Theme.objects.create(name="Custom 3", active=True)
Theme.objects.filter(pk=Theme.get_active_theme().pk).delete()
Theme.objects.create(name="Custom 1", active=True)
Theme.objects.create(name="Custom 2", active=True)
Theme.objects.create(name="Custom 3", active=True)
Theme.objects.filter(pk=Theme.objects.get_active().pk).delete()
self.__test_active_theme()
def test_last_theme_activated_on_multiple_themes_created(self):
Theme.objects.all().delete()
theme_1 = Theme.objects.create(name="Custom 1", active=True)
theme_2 = Theme.objects.create(name="Custom 2", active=True)
Theme.objects.create(name="Custom 1", active=True)
Theme.objects.create(name="Custom 2", active=True)
theme_3 = Theme.objects.create(name="Custom 3", active=True)
self.assertEqual(Theme.get_active_theme().pk, theme_3.pk)
self.assertEqual(Theme.objects.get_active().pk, theme_3.pk)
self.__test_active_theme()
def test_last_theme_activated_on_multiple_themes_activated(self):
@@ -78,13 +75,42 @@ class AdminInterfaceModelsTestCase(TestCase):
theme_4 = Theme.objects.create(name="Custom 4", active=True)
theme_5 = Theme.objects.create(name="Custom 5", active=True)
themes = [theme_1, theme_2, theme_3, theme_4, theme_5]
for i in range(5):
for _ in range(5):
random.shuffle(themes)
for theme in themes:
theme.set_active()
self.assertEqual(Theme.get_active_theme().pk, theme.pk)
self.assertEqual(Theme.objects.get_active().pk, theme.pk)
self.__test_active_theme()
def test_repr(self):
theme = Theme.get_active_theme()
self.assertEqual("{0}".format(theme), "Django")
theme = Theme.objects.get_active()
self.assertEqual(repr(theme), "<Theme: Django>")
def test_str(self):
theme = Theme.objects.get_active()
self.assertEqual(str(theme), "Django")
# class AdminInterfaceModelsMultiDBTestCase(TestCase):
# databases = ["default", "replica"]
# @classmethod
# def setUpTestData(cls):
# Theme.objects.create(name="Change Active", active=True)
# def test_get_theme_from_default_db(self):
# de_theme = Theme.objects.get_active()
# assert de_theme.name == "Change Active"
# def test_get_theme_from_replica_db(self):
# replica_theme = Theme.objects.get_active(database="replica")
# assert replica_theme.name == "Django"
# def test_db_are_isolated(self):
# default_theme = Theme.objects.get_active()
# replica_theme = Theme.objects.get_active(database="replica")
# assert default_theme.name != replica_theme.name
# @expectedFailure
# def test_fail_for_wrong_db_defined_in_kwargs(self):
# Theme.objects.get_active(database="other")
+39
View File
@@ -0,0 +1,39 @@
from django.test import TestCase
from admin_interface.models import Theme
from .routers import DatabaseAppsRouter
try:
from django.test.testcases import DatabaseOperationForbidden
except ImportError:
DatabaseOperationForbidden = AssertionError
class AdminInterfaceModelsWithDBRoutingTestCase(TestCase):
databases = ["replica"]
def test_standard_dbrouter(self):
router = DatabaseAppsRouter()
db_for_theme = router.db_for_read(Theme)
self.assertEqual(db_for_theme, "default")
def test_dbrouter_selects_correct_db(self):
DATABASE_APPS_MAPPING = {
"admin_interface": "replica",
}
router = DatabaseAppsRouter(db_map=DATABASE_APPS_MAPPING)
db_for_theme = router.db_for_read(Theme)
self.assertEqual(db_for_theme, "replica")
def test_dbrouter_errors_when_fetching_from_default(self):
with self.assertRaises(DatabaseOperationForbidden):
Theme.objects.get_active()
def test_dbrouter_fetches_db(self):
DATABASE_APPS_MAPPING = {
"admin_interface": "replica",
}
router = DatabaseAppsRouter(db_map=DATABASE_APPS_MAPPING)
with self.settings(DATABASE_ROUTERS=[router]):
Theme.objects.get_active()
+1 -49
View File
@@ -1,17 +1,11 @@
# -*- 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 override_settings, TestCase
from django.test import TestCase, override_settings
from admin_interface.settings import check_installed_apps
class AdminInterfaceSettingsTestCase(TestCase):
DJANGO_APPS = [
"django.contrib.admin",
"django.contrib.auth",
@@ -27,24 +21,10 @@ class AdminInterfaceSettingsTestCase(TestCase):
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 +32,6 @@ class AdminInterfaceSettingsTestCase(TestCase):
INSTALLED_APPS=[
"admin_interface",
"colorfield",
"flat",
"flat_responsive",
]
+ DJANGO_APPS
)
@@ -64,34 +42,8 @@ class AdminInterfaceSettingsTestCase(TestCase):
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()
+187 -75
View File
@@ -1,15 +1,15 @@
# -*- coding: utf-8 -*-
from datetime import date
from unittest.mock import Mock
from __future__ import unicode_literals
from django.test import override_settings, TestCase
from django.test.client import RequestFactory
from django.contrib.admin.views.main import ChangeList
from django.template import Context, Template
from django.test import TestCase, override_settings
from django.test.client import RequestFactory
from admin_interface.metadata import __version__
from admin_interface.models import Theme
from admin_interface.templatetags import admin_interface_tags as templatetags
from admin_interface.templatetags.admin_interface_tags import hash_string
from admin_interface.version import __version__
class AdminInterfaceTemplateTagsTestCase(TestCase):
@@ -22,87 +22,75 @@ class AdminInterfaceTemplateTagsTestCase(TestCase):
def __render_template(self, string, context=None):
return Template(string).render(Context(context or {}))
def test_get_admin_interface_languages(self):
context = Context(
{
"request": self.request_factory.get("/en/admin/"),
}
)
languages = templatetags.get_admin_interface_languages(context)
def test_admin_interface_language_chooser(self):
context = Context({"request": self.request_factory.get("/en/admin/")})
context = templatetags.admin_interface_language_chooser(context)
languages = context["LANGUAGES"]
expected_languages = [
{
"code": "en",
"name": "English",
"default": True,
"active": True,
"activation_url": "/i18n/setlang/?next=/en/admin/",
},
{
"code": "it",
"name": "Italian",
"default": False,
"active": False,
"activation_url": "/i18n/setlang/?next=/it/admin/",
},
("de", "Deutsch"),
("en", "English"),
("es", "Español"),
("fa", "Farsi"),
("fr", "Français"),
("it", "Italiano"),
("pl", "Polski"),
("pt-BR", "Português"),
("ru", "Русский"),
("tr", "Türk"),
]
self.assertEqual(len(languages), len(expected_languages))
self.assertEqual(languages[0], expected_languages[0])
self.assertEqual(languages[1], expected_languages[1])
self.assertEqual(context["next"], "/admin/")
@override_settings(
USE_I18N=False,
)
def test_get_admin_interface_languages_with_i18n_disabled(self):
context = Context(
{
"request": self.request_factory.get("/en/admin/"),
}
)
languages = templatetags.get_admin_interface_languages(context)
self.assertEqual(languages, None)
def test_admin_interface_language_chooser_with_i18n_disabled(self):
context = Context({"request": self.request_factory.get("/en/admin/")})
tag_context = templatetags.admin_interface_language_chooser(context)
self.assertEqual(tag_context, None)
@override_settings(
ROOT_URLCONF="tests.urls_without_i18n_patterns",
)
def test_get_admin_interface_languages_without_i18n_url_patterns(self):
context = Context(
{
"request": self.request_factory.get("/en/admin/"),
}
)
languages = templatetags.get_admin_interface_languages(context)
self.assertEqual(languages, None)
def test_admin_interface_language_chooser_without_i18n_url_patterns(self):
context = Context({"request": self.request_factory.get("/en/admin/")})
with self.assertWarnsMessage(UserWarning, "django.conf.urls.i18n"):
tag_context = templatetags.admin_interface_language_chooser(context)
self.assertEqual(tag_context, None)
@override_settings(
MIDDLEWARE=[],
)
def test_admin_interface_language_chooser_without_locale_middleware(self):
context = Context({"request": self.request_factory.get("/en/admin/")})
with self.assertWarnsMessage(UserWarning, "LocaleMiddleware"):
tag_context = templatetags.admin_interface_language_chooser(context)
self.assertEqual(tag_context, None)
@override_settings(
LANGUAGES=(("en", "English"),),
)
def test_get_admin_interface_languages_without_multiple_languages(self):
context = Context(
{
"request": self.request_factory.get("/en/admin/"),
}
)
languages = templatetags.get_admin_interface_languages(context)
self.assertEqual(languages, None)
def test_admin_interface_language_chooser_without_multiple_languages(self):
context = Context({"request": self.request_factory.get("/en/admin/")})
tag_context = templatetags.admin_interface_language_chooser(context)
self.assertEqual(tag_context, None)
def test_get_admin_interface_languages_without_request(self):
def test_admin_interface_language_chooser_without_request(self):
context = Context({})
languages = templatetags.get_admin_interface_languages(context)
self.assertEqual(languages, None)
tag_context = templatetags.admin_interface_language_chooser(context)
self.assertEqual(tag_context, None)
def test_get_admin_interface_languages_without_language_prefix_in_url(self):
context = Context(
{
"request": self.request_factory.get("/admin/"),
}
)
languages = templatetags.get_admin_interface_languages(context)
self.assertEqual(languages, None)
def test_admin_interface_language_chooser_without_language_prefix_in_url(self):
context = Context({"request": self.request_factory.get("/admin/")})
tag_context = templatetags.admin_interface_language_chooser(context)
self.assertEqual(tag_context["next"], "/admin/")
def test_get_theme(self):
Theme.objects.all().delete()
context = Context({})
theme = templatetags.get_admin_interface_theme(context)
theme = templatetags.get_admin_interface_theme()
self.assertEqual(theme.name, "Django")
rendered = self.__render_template(
"{% load admin_interface_tags %}"
@@ -112,18 +100,9 @@ class AdminInterfaceTemplateTagsTestCase(TestCase):
)
self.assertEqual(rendered, "Django")
def test_get_theme_with_request(self):
Theme.objects.all().delete()
context = Context({"request": self.request_factory.get("/")})
theme = templatetags.get_admin_interface_theme(context)
self.assertEqual(theme.name, "Django")
rendered = self.__render_template(
"{% load admin_interface_tags %}"
"{% get_admin_interface_theme as theme %}"
"{{ theme.name }}",
context,
)
self.assertEqual(rendered, "Django")
def test_get_setting(self):
title = templatetags.get_admin_interface_setting("title")
self.assertEqual(title, "Django administration")
def test_get_version(self):
version = templatetags.get_admin_interface_version()
@@ -146,3 +125,136 @@ class AdminInterfaceTemplateTagsTestCase(TestCase):
"{{ version_md5_hash }}"
)
self.assertEqual(rendered, hash_manual)
def test_get_admin_interface_inline_template(self):
headless_template = templatetags.get_admin_interface_inline_template(
"admin/edit_inline/stacked.html"
)
self.assertEqual(headless_template, "admin/edit_inline/headerless_stacked.html")
headless_template = templatetags.get_admin_interface_inline_template(
"nesting/admin/inlines/tabular.html"
)
self.assertEqual(headless_template, "nesting/admin/inlines/tabular.html")
def test_get_active_date_hierarchy_none(self):
changelist = Mock()
changelist.date_hierarchy = None
date_field = templatetags.get_admin_interface_active_date_hierarchy(changelist)
self.assertIsNone(date_field)
def test_get_active_date_hierarchy_inactive(self):
changelist = Mock()
changelist.date_hierarchy = "last_login"
changelist.get_filters_params.return_value = {}
date_field = templatetags.get_admin_interface_active_date_hierarchy(changelist)
self.assertIsNone(date_field)
def test_get_active_date_hierarchy_active(self):
changelist = Mock()
changelist.date_hierarchy = "last_login"
params = {"some_field": 2, "last_login__year": 2022}
changelist.get_filters_params.return_value = params
date_field = templatetags.get_admin_interface_active_date_hierarchy(changelist)
self.assertEqual(date_field, "last_login")
def _get_changelist_mock(self, params=None):
class ChangelistMock(Mock):
def __init__(self, params=None, *args, **kwargs):
super().__init__(*args, **kwargs)
# django < 5.0
self.params = params or {}
# django >= 5.0
self.filter_params = params or {}
def get_query_string(self, **kwargs):
return ChangeList.get_query_string(self, **kwargs)
def get_filters_params(self, **kwargs):
return ChangeList.get_filters_params(self, **kwargs)
return ChangelistMock(params=params)
def test_filter_removal_link(self):
params = {"shape": "pointy", "size": "small"}
changelist = self._get_changelist_mock(params)
list_filter = Mock()
list_filter.title = "Shape filter"
choices = [{"display": "Round"}, {"display": "Pointy", "selected": True}]
list_filter.choices.return_value = choices
list_filter.expected_parameters.return_value = ("shape",)
context = templatetags.admin_interface_filter_removal_link(
changelist, list_filter
)
self.assertEqual(context["removal_link"], "?size=small")
self.assertEqual(context["title"], "Shape filter")
self.assertEqual(context["selected_value"], "Pointy")
def test_filter_removal_link_no_display(self):
params = {"shape": "pointy", "size": "small"}
changelist = self._get_changelist_mock(params)
list_filter = Mock()
list_filter.title = "Shape filter"
choices = [{"other": "Round"}, {"other": "Pointy", "selected": True}]
list_filter.choices.return_value = choices
list_filter.expected_parameters.return_value = ("shape",)
context = templatetags.admin_interface_filter_removal_link(
changelist, list_filter
)
self.assertEqual(context["removal_link"], "?size=small")
self.assertEqual(context["title"], "Shape filter")
self.assertEqual(context["selected_value"], "...")
def test_date_hierarchy_removal_link_year(self):
params = {"shape": "pointy", "last_login__year": 2022}
changelist = self._get_changelist_mock(params)
changelist.model._meta.get_field.return_value.verbose_name = "last login"
context = templatetags.admin_interface_date_hierarchy_removal_link(
changelist, "last_login"
)
self.assertEqual(context["removal_link"], "?shape=pointy")
self.assertEqual(context["date_label"], "last login")
self.assertEqual(context["date_value"], date(2022, 1, 1))
def test_date_hierarchy_removal_link_year_month(self):
params = {"last_login__year": 2022, "last_login__month": "11"}
changelist = self._get_changelist_mock(params)
changelist.model._meta.get_field.return_value.verbose_name = "last login"
context = templatetags.admin_interface_date_hierarchy_removal_link(
changelist, "last_login"
)
self.assertEqual(context["removal_link"], "?")
self.assertEqual(context["date_label"], "last login")
self.assertEqual(context["date_value"], date(2022, 11, 1))
def test_date_hierarchy_removal_link_year_month_day(self):
params = {
"last_login__year": 2022,
"last_login__month": "11",
"last_login__day": "30",
"shape": "round",
"size": "small",
}
changelist = self._get_changelist_mock(params)
changelist.model._meta.get_field.return_value.verbose_name = "last login"
context = templatetags.admin_interface_date_hierarchy_removal_link(
changelist, "last_login"
)
self.assertEqual(context["removal_link"], "?shape=round&size=small")
self.assertEqual(context["date_label"], "last login")
self.assertEqual(context["date_value"], date(2022, 11, 30))
+4 -14
View File
@@ -1,21 +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, 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),
)
+2 -12
View File
@@ -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),
]