Skip to content

Commit

Permalink
Hotfix for reverse related.
Browse files Browse the repository at this point in the history
  • Loading branch information
K0Te committed Oct 10, 2018
1 parent fe27148 commit 2c2c2b4
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 8 deletions.
29 changes: 23 additions & 6 deletions django_object_manager/field_converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,39 @@ def create_foreign_key(object_manager, field, value):
**object_manager._data[name][value])
return FieldConverterResult(value, post_actions, pass_field_value)


# TODO M2M are similar, probably they can be combined
def create_m2m_reverse(object_manager, field, values):

def cb(field, field_val, instance):
args = \
{instance._meta.model.__name__.lower(): instance,
field.related_model.__name__.lower(): field_val}
# Create dependency after main object, using
# M2M "through" model
field.through(**args).save()

foreing_model = field.related_model
name = foreing_model.__name__.lower()

def gen():
for value in values:
if isinstance(value, foreing_model):
yield value
else:
assert isinstance(value, str), \
'Related values must be either instances or str ids'
yield object_manager._get_or_create(name,
value,
**object_manager._data[name][value])
res = list(gen())
return FieldConverterResult(
[],
[partial(cb, field, related_val) for related_val in values],
[partial(cb, field, related_val) for related_val in res],
False)


def create_m2m_forward(self, field, values):
def create_m2m_forward(object_manager, field, values):

def cb(field, field_val, instance):
field_val.save()
Expand All @@ -67,12 +84,12 @@ def gen():
else:
assert isinstance(value, str), \
'Related values must be either instances or str ids'
yield self._get_or_create(name,
value,
**self._data[name][value])
yield object_manager._get_or_create(name,
value,
**object_manager._data[name][value])
res = list(gen())
return FieldConverterResult(
res,
[],
[partial(cb, field, related_val) for related_val in res],
False)

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

setup(
name='django-object-manager',
version='0.0.6',
version='0.0.7',
description='Django object manager for tests',
license='BSD',
long_description=long_description,
Expand Down
10 changes: 10 additions & 0 deletions tests/app/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@
ObjectManager.register(
Film,
{
'memento': {
'name': 'Memento',
'year': 2000,
'uploaded_by': 'bob',
},
'godfather': {
'name': 'The Godfather',
'year': 1974,
'uploaded_by': 'bob',
},
})
ObjectManager.register(
UserExtraInfo,
Expand Down
9 changes: 8 additions & 1 deletion tests/functional/test_object_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def test_foreing_key_as_instance(self):
self.assertEqual(film.uploaded_by.email, 'test@test.org')
self.assertEqual(models.User.objects.count(), 1)

def test_many_to_many_reversed_predefined(self):
def test_many_to_many_reversed(self):
"""Ensure that object with M2M relation can be created."""
film1 = self.object_manager.get_film(name='Memento',
year=2000,
Expand All @@ -81,6 +81,13 @@ def test_many_to_many_reversed_predefined(self):
assert film1 in category.films.all()
assert film2 in category.films.all()

def test_many_to_many_reversed_predefined(self):
"""Ensure that object with M2M relation can be created."""
category = self.object_manager.get_filmcategory(
'crime', films=['memento', 'godfather'])
self.assertEqual(models.FilmCategory.objects.count(), 1)
assert len(category.films.all()) == 2

def test_many_to_many_forward_predefined(self):
"""Ensure that object with M2M relation can be created."""
self.object_manager.get_film(name='Memento',
Expand Down

0 comments on commit 2c2c2b4

Please sign in to comment.