Skip to content
This repository has been archived by the owner on Oct 22, 2019. It is now read-only.

Commit

Permalink
Solve branch conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
berinhard committed Nov 2, 2016
2 parents 0ee8ee4 + 7a85be2 commit fb51ec8
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 13 deletions.
24 changes: 22 additions & 2 deletions docs/source/how_mommy_behaves.rst
Expand Up @@ -10,11 +10,11 @@ You can override this behavior by:
.. code-block:: python
# from "Basic Usage" page, assume all fields either null=True or blank=True
from .models import Kid
from .models import Kid
from model_mommy import mommy
kid = mommy.make(Kid, happy=True, bio='Happy kid')
2. Passing `_fill_optional` with a list of fields to fill with random data

.. code-block:: python
Expand Down Expand Up @@ -102,3 +102,23 @@ Examples:
# in your settings.py file:
MOMMY_CUSTOM_CLASS = 'code.path.CustomMommy'
Save method custom parameters
-----------------------------

If you have overwritten the `save` method for a model, you can pass custom parameters to it using model mommy. Example:

.. code-block:: python
class ProjectWithCustomSave(models.Model)
# some model fields
created_by = models.ForeignKey(settings.AUTH_USER_MODEL)
def save(self, user, *args, **kwargs):
self.created_by = user
return super(ProjectWithCustomSave, self).save(*args, **kwargs)
#with model mommy:
user = mommy.make(settings.AUTH_USER_MODEL)
project = mommy.make(ProjectWithCustomSave, _save_kwargs={'user': user})
assert user == project.user
20 changes: 11 additions & 9 deletions model_mommy/mommy.py
Expand Up @@ -94,20 +94,21 @@ def _valid_quantity(quantity):
return quantity is not None and (not isinstance(quantity, int) or quantity < 1)


def make(model, _quantity=None, make_m2m=False, **attrs):
def make(model, _quantity=None, make_m2m=False, _save_kwargs=None, **attrs):
"""
Creates a persisted instance from a given model its associated models.
It fill the fields with random values or you can specify
which fields you want to define its values by yourself.
"""
_save_kwargs = _save_kwargs or {}
mommy = Mommy.create(model, make_m2m=make_m2m)
if _valid_quantity(_quantity):
raise InvalidQuantityException

if _quantity:
return [mommy.make(**attrs) for i in range(_quantity)]
return [mommy.make(_save_kwargs=_save_kwargs, **attrs) for i in range(_quantity)]
else:
return mommy.make(**attrs)
return mommy.make(_save_kwargs=_save_kwargs, **attrs)


def prepare(model, _quantity=None, _save_related=False, **attrs):
Expand Down Expand Up @@ -331,10 +332,10 @@ def init_type_mapping(self):
generator = import_if_str(v)
self.type_mapping[field_class] = generator

def make(self, **attrs):
def make(self, _save_kwargs=None, **attrs):
'''Creates and persists an instance of the model
associated with Mommy instance.'''
return self._make(commit=True, commit_related=True, **attrs)
return self._make(commit=True, commit_related=True, _save_kwargs=_save_kwargs, **attrs)

def prepare(self, _save_related=False, **attrs):
'''Creates, but does not persist, an instance of the model
Expand All @@ -344,7 +345,8 @@ def prepare(self, _save_related=False, **attrs):
def get_fields(self):
return self.model._meta.fields + self.model._meta.many_to_many

def _make(self, commit=True, commit_related=True, **attrs):
def _make(self, commit=True, commit_related=True, _save_kwargs=None, **attrs):
_save_kwargs = _save_kwargs or {}
fill_in_optional = attrs.pop('_fill_optional', False)
is_rel_field = lambda x: '__' in x
iterator_attrs = dict((k, v) for k, v in attrs.items() if is_iterator(v))
Expand Down Expand Up @@ -391,7 +393,7 @@ def _make(self, commit=True, commit_related=True, **attrs):
except StopIteration:
raise RecipeIteratorEmpty('{0} iterator is empty.'.format(field.name))

return self.instance(model_attrs, _commit=commit)
return self.instance(model_attrs, _commit=commit, _save_kwargs=_save_kwargs)

def m2m_value(self, field):
if field.name in self.rel_fields:
Expand All @@ -400,7 +402,7 @@ def m2m_value(self, field):
return []
return self.generate_value(field)

def instance(self, attrs, _commit):
def instance(self, attrs, _commit, _save_kwargs):
one_to_many_keys = {}
for k in tuple(attrs.keys()):
field = getattr(self.model, k, None)
Expand All @@ -410,7 +412,7 @@ def instance(self, attrs, _commit):
instance = self.model(**attrs)
# m2m only works for persisted instances
if _commit:
instance.save()
instance.save(**_save_kwargs)
self._handle_one_to_many(instance, one_to_many_keys)
self._handle_m2m(instance)
return instance
Expand Down
7 changes: 7 additions & 0 deletions test/generic/models.py
Expand Up @@ -125,6 +125,13 @@ class LonelyPerson(models.Model):
only_friend = models.OneToOneField(Person)


class ModelWithOverridedSave(Dog):

def save(self, *args, **kwargs):
self.owner = kwargs.pop('owner')
return super(ModelWithOverridedSave, self).save(*args, **kwargs)


class Classroom(models.Model):
students = models.ManyToManyField(Person, null=True)

Expand Down
2 changes: 2 additions & 0 deletions test/generic/mommy_recipes.py
Expand Up @@ -93,3 +93,5 @@
movie_with_cast = Recipe('generic.Movie',
cast_members=related(cast_member, cast_member)
)

overrided_save = Recipe('generic.ModelWithOverridedSave')
17 changes: 15 additions & 2 deletions test/generic/tests/test_mommy.py
@@ -1,4 +1,5 @@
# -*- coding:utf-8 -*-
from mock import patch
from decimal import Decimal

from django import VERSION
Expand All @@ -11,8 +12,6 @@
from model_mommy.exceptions import ModelNotFound, AmbiguousModelName, InvalidQuantityException
from model_mommy.timezone import smart_datetime as datetime

from mock import patch

from test.generic import models


Expand Down Expand Up @@ -477,3 +476,17 @@ def test_create_model_with_valid_ips(self):
'ipv46_field': generators.gen_ipv46(),
}
self.assertTrue(DummyGenericIPAddressFieldForm(form_data).is_valid())


class MommyAllowsSaveParameters(TestCase):

def setUp(self):
self.owner = mommy.make(models.Person)

def test_allows_save_kwargs_on_mommy_make(self):
dog = mommy.make(models.ModelWithOverridedSave, _save_kwargs={'owner': self.owner})
self.assertEqual(self.owner, dog.owner)

dog1, dog2 = mommy.make(models.ModelWithOverridedSave, _save_kwargs={'owner': self.owner}, _quantity=2)
self.assertEqual(self.owner, dog1.owner)
self.assertEqual(self.owner, dog2.owner)
6 changes: 6 additions & 0 deletions test/generic/tests/test_recipes.py
Expand Up @@ -288,6 +288,12 @@ def test_import_recipe_inside_deeper_modules(self):
person = mommy.prepare_recipe(recipe_name)
self.assertEqual(person.name, 'John Deeper')

def test_pass_save_kwargs(self):
owner = mommy.make(Person)

dog = mommy.make_recipe('test.generic.overrided_save', _save_kwargs={'owner': owner})
self.assertEqual(owner, dog.owner)


class ForeignKeyTestCase(TestCase):
def test_foreign_key_method_returns_a_recipe_foreign_key_object(self):
Expand Down

0 comments on commit fb51ec8

Please sign in to comment.