Remove `_populate` keyword.

Other ways of managing population are preferred and more elegant.
This commit is contained in:
Jacek Tomaszewski 2013-02-19 18:03:41 +01:00
parent 176f4aeeb1
commit cbfb1563a2
2 changed files with 47 additions and 58 deletions

View file

@ -184,30 +184,27 @@ class MultilingualQuerySet(models.query.QuerySet):
update.alters_data = True
# This method was not present in django-linguo
def _populate_mode(self, **kwargs):
# Populate can be set using a global setting, a manager method,
# or given as an argument to ``create`` or ``get_or_create``.
populate = kwargs.pop('_populate', self._populate)
if populate is None:
populate = settings.AUTO_POPULATE
return kwargs, populate
@property
def _populate_mode(self):
# Populate can be set using a global setting or a manager method.
if self._populate is None:
return settings.AUTO_POPULATE
return self._populate
# This method was not present in django-linguo
def create(self, **kwargs):
"""
Allows to override population mode with a ``_populate`` keyword.
Allows to override population mode with a ``populate`` method.
"""
kwargs, mode = self._populate_mode(**kwargs)
with auto_populate(mode):
with auto_populate(self._populate_mode):
return super(MultilingualQuerySet, self).create(**kwargs)
# This method was not present in django-linguo
def get_or_create(self, **kwargs):
"""
Allows to override population mode with a ``_populate`` keyword.
Allows to override population mode with a ``populate`` method.
"""
kwargs, mode = self._populate_mode(**kwargs)
with auto_populate(mode):
with auto_populate(self._populate_mode):
return super(MultilingualQuerySet, self).get_or_create(**kwargs)

View file

@ -1870,20 +1870,20 @@ class TestManager(ModeltranslationTestBase):
def test_creation_population(self):
"""Test if language fields are populated with default value on creation."""
n = models.ManagerTestModel.objects.create(title='foo', _populate=True)
n = models.ManagerTestModel.objects.populate(True).create(title='foo')
self.assertEqual('foo', n.title_en)
self.assertEqual('foo', n.title_de)
self.assertEqual('foo', n.title)
# You can specify some language...
n = models.ManagerTestModel.objects.create(title='foo', title_de='bar', _populate=True)
n = models.ManagerTestModel.objects.populate(True).create(title='foo', title_de='bar')
self.assertEqual('foo', n.title_en)
self.assertEqual('bar', n.title_de)
self.assertEqual('foo', n.title)
# ... but remember that still original attribute points to current language
self.assertEqual('en', get_language())
n = models.ManagerTestModel.objects.create(title='foo', title_en='bar', _populate=True)
n = models.ManagerTestModel.objects.populate(True).create(title='foo', title_en='bar')
self.assertEqual('bar', n.title_en)
self.assertEqual('foo', n.title_de)
self.assertEqual('bar', n.title) # points to en
@ -1891,49 +1891,12 @@ class TestManager(ModeltranslationTestBase):
self.assertEqual('foo', n.title) # points to de
self.assertEqual('en', get_language())
# This feature (for backward-compatibility) require _populate keyword...
# This feature (for backward-compatibility) require populate method...
n = models.ManagerTestModel.objects.create(title='foo')
self.assertEqual('foo', n.title_en)
self.assertEqual(None, n.title_de)
self.assertEqual('foo', n.title)
# Populate ``default`` fills just the default translation.
# TODO: Having more languages would make these tests more meaningful.
qs = models.ManagerTestModel.objects
m = qs.create(title='foo', description='bar', _populate='default')
self.assertEqual('foo', m.title_de)
self.assertEqual('foo', m.title_en)
self.assertEqual('bar', m.description_de)
self.assertEqual('bar', m.description_en)
with override('de'):
m = qs.create(title='foo', description='bar', _populate='default')
self.assertEqual('foo', m.title_de)
self.assertEqual(None, m.title_en)
self.assertEqual('bar', m.description_de)
self.assertEqual(None, m.description_en)
# Populate ``required`` fills just non-nullable default translations.
qs = models.ManagerTestModel.objects
m = qs.create(title='foo', description='bar', _populate='required')
self.assertEqual('foo', m.title_de)
self.assertEqual('foo', m.title_en)
self.assertEqual(None, m.description_de)
self.assertEqual('bar', m.description_en)
with override('de'):
m = qs.create(title='foo', description='bar', _populate='required')
self.assertEqual('foo', m.title_de)
self.assertEqual(None, m.title_en)
self.assertEqual('bar', m.description_de)
self.assertEqual(None, m.description_en)
# Populate may be used as a manager toggle.
m = qs.populate(False).create(title='foo')
self.assertEqual('foo', m.title_en)
self.assertEqual(None, m.title_de)
m = qs.populate(True).create(title='foo')
self.assertEqual('foo', m.title_en)
self.assertEqual('foo', m.title_de)
# ... or MODELTRANSLATION_AUTO_POPULATE setting
with reload_override_settings(MODELTRANSLATION_AUTO_POPULATE=True):
self.assertEqual(True, mt_settings.AUTO_POPULATE)
@ -1942,19 +1905,48 @@ class TestManager(ModeltranslationTestBase):
self.assertEqual('foo', n.title_de)
self.assertEqual('foo', n.title)
# _populate keyword has highest priority
n = models.ManagerTestModel.objects.create(title='foo', _populate=False)
# populate method has highest priority
n = models.ManagerTestModel.objects.populate(False).create(title='foo')
self.assertEqual('foo', n.title_en)
self.assertEqual(None, n.title_de)
self.assertEqual('foo', n.title)
# Populate ``default`` fills just the default translation.
# TODO: Having more languages would make these tests more meaningful.
qs = models.ManagerTestModel.objects
m = qs.populate('default').create(title='foo', description='bar')
self.assertEqual('foo', m.title_de)
self.assertEqual('foo', m.title_en)
self.assertEqual('bar', m.description_de)
self.assertEqual('bar', m.description_en)
with override('de'):
m = qs.populate('default').create(title='foo', description='bar')
self.assertEqual('foo', m.title_de)
self.assertEqual(None, m.title_en)
self.assertEqual('bar', m.description_de)
self.assertEqual(None, m.description_en)
# Populate ``required`` fills just non-nullable default translations.
qs = models.ManagerTestModel.objects
m = qs.populate('required').create(title='foo', description='bar')
self.assertEqual('foo', m.title_de)
self.assertEqual('foo', m.title_en)
self.assertEqual(None, m.description_de)
self.assertEqual('bar', m.description_en)
with override('de'):
m = qs.populate('required').create(title='foo', description='bar')
self.assertEqual('foo', m.title_de)
self.assertEqual(None, m.title_en)
self.assertEqual('bar', m.description_de)
self.assertEqual(None, m.description_en)
def test_get_or_create_population(self):
"""
Populate may be used with ``get_or_create``.
"""
qs = models.ManagerTestModel.objects
m1, created1 = qs.get_or_create(title='aaa', _populate=True)
m2, created2 = qs.get_or_create(title='aaa', _populate=True)
m1, created1 = qs.populate(True).get_or_create(title='aaa')
m2, created2 = qs.populate(True).get_or_create(title='aaa')
self.assertTrue(created1)
self.assertFalse(created2)
self.assertEqual(m1, m2)