Make every manager MultiLingual, not only objects (close #198).

This commit is contained in:
Jacek Tomaszewski 2013-10-10 15:27:27 +02:00
parent e3954828c4
commit 73d845921a
3 changed files with 20 additions and 13 deletions

View file

@ -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

View file

@ -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

View file

@ -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):