Aggiornato con i contenuti del remoto al 07/03/2024
This commit is contained in:
@@ -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
@@ -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/")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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")
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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),
|
||||
)
|
||||
|
||||
@@ -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),
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user