Skip to content

Commit

Permalink
Merge pull request coagulant#46 from hovel/related_field_default
Browse files Browse the repository at this point in the history
improve any_model_with_defaults - add fix for django 1.9, add test
  • Loading branch information
GeyseR committed Mar 14, 2016
2 parents 2afc81b + 2bb67c5 commit 04c1be2
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 5 deletions.
10 changes: 7 additions & 3 deletions django_any/contrib/default.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# -*- coding: utf-8 -*-
from inspect import isfunction, ismethod
import django
from django.db.models.fields import NOT_PROVIDED
from django.db.models.fields.related import RelatedField
from django.db.models.fields.related import ForeignKey, OneToOneField
from django_any.models import any_model


Expand All @@ -14,8 +15,11 @@ def any_model_with_defaults(cls, **attrs):
if isfunction(default) or ismethod(default):
# for stuff like default=datetime.now
default = default()
if isinstance(field, RelatedField):
Model = field.related_field.model
if isinstance(field, (ForeignKey, OneToOneField)):
if django.VERSION >= (1, 9):
Model = field.target_field.model
else:
Model = field.related_field.model
if not isinstance(default, Model):
try:
default = Model.objects.get(pk=default)
Expand Down
31 changes: 29 additions & 2 deletions django_any/tests/test_contrib_defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
from decimal import Decimal
from django_any.contrib.default import any_model_with_defaults
from django.db.models.fields import NOT_PROVIDED
from django.core.files.base import ContentFile
from django_any.tests.test_model_creation_simple import SimpleModel


class SimpleModelWithDefaults(models.Model):
Expand Down Expand Up @@ -37,6 +35,19 @@ class Meta:
app_label = 'django_any'


class TargetModel(models.Model):
class Meta:
app_label = 'django_any'


class RelationshipModelsWithDefaults(models.Model):
fk = models.ForeignKey(TargetModel, default=1, related_name='related_fk')
o2o = models.OneToOneField(TargetModel, default=1, related_name='related_o2o')

class Meta:
app_label = 'django_any'


class AnyModelWithDefaults(TestCase):
sample_args = dict(
big_integer_field = 1,
Expand Down Expand Up @@ -79,3 +90,19 @@ def test_default_provided_called_with_args(self):
for field, original_field in zip(result._meta.fields, SimpleModelWithDefaults._meta.local_fields):
self.assertNotEqual(original_field.default, getattr(result, field.name))

def test_related_fields_instances(self):
default_target = TargetModel.objects.create()

standard = RelationshipModelsWithDefaults.objects.create()
self.assertEqual(standard.fk, default_target)
self.assertEqual(standard.o2o, default_target)
standard.delete() # release o2o field

try:
test = any_model_with_defaults(RelationshipModelsWithDefaults)
self.assertEqual(test.fk, default_target)
self.assertEqual(test.o2o, default_target)
except ValueError:
raise AssertionError(
'`any_model_with_defaults` must provide models instances '
'instead of raw values for related fields with defaults.')
14 changes: 14 additions & 0 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[tox]
envlist = py{27}-django1{7,8,9}

[testenv]
setenv =
PYTHONPATH = {toxinidir}
commands = {envpython} tests/manage.py test django_any
basepython =
py27: python2.7
deps =
-rtests/requirements.pip
django17: Django>=1.7,<1.8
django18: Django>=1.8,<1.9
django19: Django>=1.9,<1.10

0 comments on commit 04c1be2

Please sign in to comment.