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

Commit

Permalink
automatically allow unsaved instances for foreignkeys and OneToFields…
Browse files Browse the repository at this point in the history
… from django 1.8 up
  • Loading branch information
vandersonmota committed Jun 13, 2015
1 parent a5aa1a4 commit 8b1c2e9
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 19 deletions.
19 changes: 12 additions & 7 deletions model_mommy/mommy.py
Expand Up @@ -57,6 +57,7 @@ def validate_ipv6_address(v):
from .exceptions import ModelNotFound, AmbiguousModelName, InvalidQuantityException, RecipeIteratorEmpty

from six import string_types, advance_iterator, PY3
from mock import patch

recipes = None

Expand Down Expand Up @@ -91,7 +92,16 @@ def make(model, _quantity=None, make_m2m=False, **attrs):
else:
return mommy.make(**attrs)

def _allow_unsaved(fn, *args, **kwargs):
def p(*args, **kwargs):
if django.VERSION >= (1, 8):
with patch.object(ForeignKey, 'allow_unsaved_instance_assignment', True):
with patch.object(OneToOneField, 'allow_unsaved_instance_assignment', True):
return fn(*args, **kwargs)
return fn(*args, **kwargs)
return p

@_allow_unsaved
def prepare(model, _quantity=None, **attrs):
"""
Creates BUT DOESN'T persist an instance from a given model its
Expand All @@ -108,7 +118,6 @@ def prepare(model, _quantity=None, **attrs):
else:
return mommy.prepare(**attrs)


def _recipe(name):
app, recipe_name = name.rsplit('.', 1)
recipes = importlib.import_module('.'.join([app, 'mommy_recipes']))
Expand Down Expand Up @@ -285,12 +294,8 @@ def make(self, **attrs):
def prepare(self, **attrs):
'''Creates, but does not persist, an instance of the model
associated with Mommy instance.'''
if django.VERSION >= (1, 8):
self.type_mapping[ForeignKey] = make
self.type_mapping[OneToOneField] = make
else:
self.type_mapping[ForeignKey] = prepare
self.type_mapping[OneToOneField] = prepare
self.type_mapping[ForeignKey] = prepare
self.type_mapping[OneToOneField] = prepare
return self._make(commit=False, **attrs)

def get_fields(self):
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
@@ -1,2 +1,3 @@
Django<1.9
six
mock
10 changes: 2 additions & 8 deletions test/generic/tests/test_mommy.py
Expand Up @@ -196,21 +196,15 @@ def test_prepare_fk(self):
self.assertIsInstance(dog, Dog)
self.assertIsInstance(dog.owner, Person)

if django.VERSION >= (1, 8):
self.assertEqual(Person.objects.all().count(), 1)
else:
self.assertEqual(Person.objects.all().count(), 0)
self.assertEqual(Person.objects.all().count(), 0)
self.assertEqual(Dog.objects.all().count(), 0)

def test_prepare_one_to_one(self):
lonely_person = mommy.prepare(LonelyPerson)

self.assertEqual(LonelyPerson.objects.all().count(), 0)
self.assertTrue(isinstance(lonely_person.only_friend, Person))
if django.VERSION >= (1, 8):
self.assertEqual(Person.objects.all().count(), 1)
else:
self.assertEqual(Person.objects.all().count(), 0)
self.assertEqual(Person.objects.all().count(), 0)

def test_create_one_to_one(self):
lonely_person = mommy.make(LonelyPerson)
Expand Down
5 changes: 1 addition & 4 deletions test/generic/tests/test_recipes.py
Expand Up @@ -364,10 +364,7 @@ def test_do_query_lookup_empty_recipes(self):
self.assertEqual(dog.owner.name, 'James')

dog = dog_recipe.prepare(owner__name='Zezin')
if django.VERSION >= (1, 8):
self.assertEqual(Person.objects.count(), 2)
else:
self.assertEqual(Person.objects.count(), 1)
self.assertEqual(Person.objects.count(), 1)
self.assertEqual(dog.owner.name, 'Zezin')

def test_related_models_recipes(self):
Expand Down

0 comments on commit 8b1c2e9

Please sign in to comment.