Make `Theme.get_active_theme` class method a manager method. (#230)

- Make `get_active_theme` a manager method instead of class method
- Replace `get_active_theme` by `get_active`
- Refactor signals handlers
master
Mounir 2022-12-15 11:32:33 +01:00 committed by GitHub
parent 186e78b846
commit b3540bc019
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 49 additions and 48 deletions

View File

@ -2,47 +2,25 @@ from colorfield.fields import ColorField
from django.core.validators import FileExtensionValidator from django.core.validators import FileExtensionValidator
from django.db import models from django.db import models
from django.db.models.signals import post_delete, post_save, pre_save from django.db.models.signals import post_delete, post_save, pre_save
from django.dispatch import receiver
from django.utils.encoding import force_str from django.utils.encoding import force_str
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from .cache import del_cached_active_theme from .cache import del_cached_active_theme
class Theme(models.Model): class ThemeQuerySet(models.QuerySet):
@staticmethod def get_active(self):
def post_delete_handler(**kwargs): objs_active_qs = self.filter(active=True)
del_cached_active_theme()
Theme.get_active_theme()
@staticmethod
def post_save_handler(instance, **kwargs):
del_cached_active_theme()
if instance.active:
Theme.objects.exclude(pk=instance.pk).update(active=False)
Theme.get_active_theme()
@staticmethod
def pre_save_handler(instance, **kwargs):
if instance.pk is None:
try:
obj = Theme.objects.get(name=instance.name)
instance.pk = obj.pk
except Theme.DoesNotExist:
pass
@staticmethod
def get_active_theme():
objs_manager = Theme.objects
objs_active_qs = objs_manager.filter(active=True)
objs_active_ls = list(objs_active_qs) objs_active_ls = list(objs_active_qs)
objs_active_count = len(objs_active_ls) objs_active_count = len(objs_active_ls)
if objs_active_count == 0: if objs_active_count == 0:
obj = objs_manager.all().first() obj = self.all().first()
if obj: if obj:
obj.set_active() obj.set_active()
else: else:
obj = objs_manager.create() obj = self.create()
elif objs_active_count == 1: elif objs_active_count == 1:
obj = objs_active_ls[0] obj = objs_active_ls[0]
@ -53,6 +31,8 @@ class Theme(models.Model):
return obj return obj
class Theme(models.Model):
name = models.CharField( name = models.CharField(
unique=True, unique=True,
max_length=50, max_length=50,
@ -386,6 +366,8 @@ class Theme(models.Model):
verbose_name=_("sticky pagination"), verbose_name=_("sticky pagination"),
) )
objects = ThemeQuerySet.as_manager()
def set_active(self): def set_active(self):
self.active = True self.active = True
self.save() self.save()
@ -399,6 +381,25 @@ class Theme(models.Model):
return force_str(self.name) return force_str(self.name)
post_delete.connect(Theme.post_delete_handler, sender=Theme) @receiver(post_delete, sender=Theme)
post_save.connect(Theme.post_save_handler, sender=Theme) def post_delete_handler(sender, instance, **kwargs):
pre_save.connect(Theme.pre_save_handler, sender=Theme) del_cached_active_theme()
Theme.objects.get_active()
@receiver(post_save, sender=Theme)
def post_save_handler(sender, instance, **kwargs):
del_cached_active_theme()
if instance.active:
Theme.objects.exclude(pk=instance.pk).update(active=False)
Theme.objects.get_active()
@receiver(pre_save, sender=Theme)
def pre_save_handler(sender, instance, **kwargs):
if instance.pk is None:
try:
obj = Theme.objects.get(name=instance.name)
instance.pk = obj.pk
except Theme.DoesNotExist:
pass

View File

@ -59,7 +59,7 @@ def get_admin_interface_languages(context):
def get_admin_interface_theme(): def get_admin_interface_theme():
theme = get_cached_active_theme() theme = get_cached_active_theme()
if not theme: if not theme:
theme = Theme.get_active_theme() theme = Theme.objects.get_active()
set_cached_active_theme(theme) set_cached_active_theme(theme)
return theme return theme

View File

@ -38,10 +38,10 @@ class AdminInterfaceFixturesTestCase(TestCase):
self.assertEqual(Theme.objects.count(), 2) self.assertEqual(Theme.objects.count(), 2)
def test_import_override(self): def test_import_override(self):
obj1 = Theme.get_active_theme() obj1 = Theme.objects.get_active()
obj1.title = "Custom 1" obj1.title = "Custom 1"
obj1.save() obj1.save()
self.__load_theme("django") self.__load_theme("django")
obj2 = Theme.get_active_theme() obj2 = Theme.objects.get_active()
self.assertEqual(obj1.pk, obj2.pk) self.assertEqual(obj1.pk, obj2.pk)
self.assertTrue(obj1.title != obj2.title) self.assertTrue(obj1.title != obj2.title)

View File

@ -17,7 +17,7 @@ class AdminInterfaceModelsTestCase(TestCase):
shutil.rmtree(settings.MEDIA_ROOT, ignore_errors=True) shutil.rmtree(settings.MEDIA_ROOT, ignore_errors=True)
def __test_active_theme(self): def __test_active_theme(self):
theme = Theme.get_active_theme() theme = Theme.objects.get_active()
print(theme) print(theme)
self.assertTrue(theme is not None) self.assertTrue(theme is not None)
self.assertTrue(theme.active) self.assertTrue(theme.active)
@ -33,7 +33,7 @@ class AdminInterfaceModelsTestCase(TestCase):
def test_default_theme_activated_on_save_if_no_active_themes(self): def test_default_theme_activated_on_save_if_no_active_themes(self):
Theme.objects.all().delete() Theme.objects.all().delete()
theme = Theme.get_active_theme() theme = Theme.objects.get_active()
theme.active = False theme.active = False
theme.save() theme.save()
self.__test_active_theme() self.__test_active_theme()
@ -57,7 +57,7 @@ class AdminInterfaceModelsTestCase(TestCase):
theme_1 = Theme.objects.create(name="Custom 1", active=True) theme_1 = Theme.objects.create(name="Custom 1", active=True)
theme_2 = Theme.objects.create(name="Custom 2", active=True) theme_2 = Theme.objects.create(name="Custom 2", active=True)
theme_3 = Theme.objects.create(name="Custom 3", active=True) theme_3 = Theme.objects.create(name="Custom 3", active=True)
Theme.objects.filter(pk=Theme.get_active_theme().pk).delete() Theme.objects.filter(pk=Theme.objects.get_active().pk).delete()
self.__test_active_theme() self.__test_active_theme()
def test_last_theme_activated_on_multiple_themes_created(self): def test_last_theme_activated_on_multiple_themes_created(self):
@ -65,7 +65,7 @@ class AdminInterfaceModelsTestCase(TestCase):
theme_1 = Theme.objects.create(name="Custom 1", active=True) theme_1 = Theme.objects.create(name="Custom 1", active=True)
theme_2 = Theme.objects.create(name="Custom 2", active=True) theme_2 = Theme.objects.create(name="Custom 2", active=True)
theme_3 = Theme.objects.create(name="Custom 3", 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() self.__test_active_theme()
def test_last_theme_activated_on_multiple_themes_activated(self): def test_last_theme_activated_on_multiple_themes_activated(self):
@ -80,15 +80,15 @@ class AdminInterfaceModelsTestCase(TestCase):
random.shuffle(themes) random.shuffle(themes)
for theme in themes: for theme in themes:
theme.set_active() 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() self.__test_active_theme()
def test_repr(self): def test_repr(self):
theme = Theme.get_active_theme() theme = Theme.objects.get_active()
self.assertEqual(repr(theme), "<Theme: Django>") self.assertEqual(repr(theme), "<Theme: Django>")
def test_str(self): def test_str(self):
theme = Theme.get_active_theme() theme = Theme.objects.get_active()
self.assertEqual(str(theme), "Django") self.assertEqual(str(theme), "Django")
@ -100,18 +100,18 @@ class AdminInterfaceModelsTestCase(TestCase):
# Theme.objects.create(name="Change Active", active=True) # Theme.objects.create(name="Change Active", active=True)
# def test_get_theme_from_default_db(self): # def test_get_theme_from_default_db(self):
# de_theme = Theme.get_active_theme() # de_theme = Theme.objects.get_active()
# assert de_theme.name == "Change Active" # assert de_theme.name == "Change Active"
# def test_get_theme_from_replica_db(self): # def test_get_theme_from_replica_db(self):
# replica_theme = Theme.get_active_theme(database="replica") # replica_theme = Theme.objects.get_active(database="replica")
# assert replica_theme.name == "Django" # assert replica_theme.name == "Django"
# def test_db_are_isolated(self): # def test_db_are_isolated(self):
# default_theme = Theme.get_active_theme() # default_theme = Theme.objects.get_active()
# replica_theme = Theme.get_active_theme(database="replica") # replica_theme = Theme.objects.get_active(database="replica")
# assert default_theme.name != replica_theme.name # assert default_theme.name != replica_theme.name
# @expectedFailure # @expectedFailure
# def test_fail_for_wrong_db_defined_in_kwargs(self): # def test_fail_for_wrong_db_defined_in_kwargs(self):
# Theme.get_active_theme(database="other") # Theme.objects.get_active(database="other")

View File

@ -25,7 +25,7 @@ class AdminInterfaceModelsWithDBRoutingTestCase(TestCase):
def test_dbrouter_errors_when_fetching_from_default(self): def test_dbrouter_errors_when_fetching_from_default(self):
with self.assertRaises(Exception): with self.assertRaises(Exception):
Theme.get_active_theme() Theme.objects.get_active()
def test_dbrouter_fetches_db(self): def test_dbrouter_fetches_db(self):
DATABASE_APPS_MAPPING = { DATABASE_APPS_MAPPING = {
@ -33,4 +33,4 @@ class AdminInterfaceModelsWithDBRoutingTestCase(TestCase):
} }
router = DatabaseAppsRouter(db_map=DATABASE_APPS_MAPPING) router = DatabaseAppsRouter(db_map=DATABASE_APPS_MAPPING)
with self.settings(DATABASE_ROUTERS=[router]): with self.settings(DATABASE_ROUTERS=[router]):
Theme.get_active_theme() Theme.objects.get_active()