mirror of
https://github.com/Hopiu/django-modeltranslation.git
synced 2026-05-03 19:14:42 +00:00
Make every manager MultiLingual, not only objects (close #198).
This commit is contained in:
parent
e3954828c4
commit
73d845921a
3 changed files with 20 additions and 13 deletions
|
|
@ -2201,6 +2201,12 @@ class TestManager(ModeltranslationTestBase):
|
|||
with override('de'):
|
||||
self.assertEqual(1, models.CustomManagerTestModel.objects.count())
|
||||
|
||||
def test_non_objects_manager(self):
|
||||
"""Test if managers other than ``objects`` are patched too"""
|
||||
from modeltranslation.manager import MultilingualManager
|
||||
manager = models.CustomManagerTestModel.another_mgr_name
|
||||
self.assertTrue(isinstance(manager, MultilingualManager))
|
||||
|
||||
def test_custom_manager2(self):
|
||||
"""Test if user-defined queryset is still working"""
|
||||
from modeltranslation.manager import MultilingualManager, MultilingualQuerySet
|
||||
|
|
|
|||
|
|
@ -265,6 +265,8 @@ class CustomManagerTestModel(models.Model):
|
|||
title = models.CharField(ugettext_lazy('title'), max_length=255)
|
||||
objects = CustomManager()
|
||||
|
||||
another_mgr_name = CustomManager()
|
||||
|
||||
|
||||
class CustomQuerySet(models.query.QuerySet):
|
||||
pass
|
||||
|
|
|
|||
|
|
@ -125,21 +125,20 @@ def add_translation_fields(model, opts):
|
|||
def add_manager(model):
|
||||
"""
|
||||
Monkey patches the original model to use MultilingualManager instead of
|
||||
default manager (``objects``).
|
||||
default managers (not only ``objects``, but also every manager defined and inherited).
|
||||
|
||||
If model has a custom manager, then merge it with MultilingualManager.
|
||||
Custom managers are merged with MultilingualManager.
|
||||
"""
|
||||
if not hasattr(model, 'objects'):
|
||||
return
|
||||
current_manager = model.objects
|
||||
if isinstance(current_manager, MultilingualManager):
|
||||
return
|
||||
if current_manager.__class__ is Manager:
|
||||
current_manager.__class__ = MultilingualManager
|
||||
else:
|
||||
class NewMultilingualManager(MultilingualManager, current_manager.__class__):
|
||||
pass
|
||||
current_manager.__class__ = NewMultilingualManager
|
||||
for _, attname, cls in model._meta.concrete_managers:
|
||||
current_manager = getattr(model, attname)
|
||||
if isinstance(current_manager, MultilingualManager):
|
||||
continue
|
||||
if current_manager.__class__ is Manager:
|
||||
current_manager.__class__ = MultilingualManager
|
||||
else:
|
||||
class NewMultilingualManager(MultilingualManager, current_manager.__class__):
|
||||
pass
|
||||
current_manager.__class__ = NewMultilingualManager
|
||||
|
||||
|
||||
def patch_constructor(model):
|
||||
|
|
|
|||
Loading…
Reference in a new issue