From 5ed3a2696b7e13687c2eec2cf86e69859917b56d Mon Sep 17 00:00:00 2001 From: Jacek Tomaszewski Date: Tue, 6 May 2014 21:59:21 +0200 Subject: [PATCH] Don't set use_for_related_fields unconditionally on all managers (ref #242). --- modeltranslation/translator.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/modeltranslation/translator.py b/modeltranslation/translator.py index 46c60a7..fd5486e 100644 --- a/modeltranslation/translator.py +++ b/modeltranslation/translator.py @@ -161,17 +161,22 @@ def add_manager(model): """ if model._meta.abstract: return + + def patch_manager_class(manager): + if isinstance(manager, MultilingualManager): + return + if manager.__class__ is Manager: + manager.__class__ = MultilingualManager + else: + class NewMultilingualManager(MultilingualManager, manager.__class__): + use_for_related_fields = getattr( + manager.__class__, "use_for_related_fields", False) + manager.__class__ = NewMultilingualManager + for _, attname, cls in model._meta.concrete_managers + model._meta.abstract_managers: current_manager = getattr(model, attname) - if isinstance(current_manager, MultilingualManager): - continue prev_class = current_manager.__class__ - if current_manager.__class__ is Manager: - current_manager.__class__ = MultilingualManager - else: - class NewMultilingualManager(MultilingualManager, current_manager.__class__): - pass - current_manager.__class__ = NewMultilingualManager + patch_manager_class(current_manager) if model._default_manager.__class__ is prev_class: # Normally model._default_manager is a reference to one of model's managers # (and would be patched by the way). @@ -179,6 +184,7 @@ def add_manager(model): # model._default_manager is not the same instance as one of managers, but it # share the same class. model._default_manager.__class__ = current_manager.__class__ + patch_manager_class(model._base_manager) def patch_constructor(model):