Skip to content

Commit

Permalink
Fix nullable FK
Browse files Browse the repository at this point in the history
  • Loading branch information
klen committed Dec 11, 2012
1 parent b20864b commit 610a8f3
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 10 deletions.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -6,7 +6,7 @@ BUILDDIR=_build

.PHONY: clean
clean:
sudo rm -rf build dist
rm -rf build dist
find . -name "*.pyc" -delete
find . -name "*.orig" -delete

Expand Down
7 changes: 4 additions & 3 deletions flask_mixer/core.py
Expand Up @@ -107,7 +107,7 @@ def set_explicit_values(self, mixer, target, values):

def set_local_fields(self, target, mixer, exclude):
columns = [c for c in self.mapper.columns if not c.
nullable and not c.name in exclude]
nullable and not c.foreign_keys and not c.name in exclude]

for column in columns:
if column.default:
Expand All @@ -118,12 +118,13 @@ def set_local_fields(self, target, mixer, exclude):

def set_related_fields(self, target, mixer, exclude, related_explicit_values):
related_explicit_values = related_explicit_values or dict()

for prop in self.mapper.iterate_properties:
if hasattr(prop, 'direction') and prop.direction == MANYTOONE and not prop.key in exclude:
col = prop.local_remote_pairs[0][0]
if col.nullable:
continue
related_values = related_explicit_values.get(prop.key, dict())
value = mixer.blend(prop.mapper.class_, **related_values)
col = prop.local_remote_pairs[0][0]
setattr(target, prop.key, value)
setattr(target, col.name,
prop.mapper.identity_key_from_instance(value)[1][0])
Expand Down
14 changes: 9 additions & 5 deletions tests/__init__.py
Expand Up @@ -6,7 +6,7 @@ class BaseTest(TestCase):
def test_mixer(self):
from flask import Flask
from flask_mixer import Mixer
from .models import db, User, Profile
from .models import db, User

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
Expand All @@ -18,6 +18,10 @@ def test_mixer(self):

db.create_all()

node = mixer.blend('tests.models.Node')
self.assertTrue(node.id)
self.assertFalse(node.parent)

role = mixer.blend('tests.models.Role')
self.assertTrue(role.user)
self.assertEqual(role.user_id, role.user.id)
Expand All @@ -36,14 +40,14 @@ def test_mixer(self):
role = mixer.blend('tests.models.Role', user__username='test2')
self.assertEqual(role.user.username, 'test2')

users = User.query.all()
role = mixer.blend('tests.models.Role', user=mixer.random)
self.assertTrue(role.user in users)

profile = mixer.blend('tests.models.Profile')
user = mixer.blend(User, profile=profile)
self.assertEqual(user.profile, profile)

profiles = Profile.query.all()
user = mixer.blend(User, profile=mixer.random)
self.assertTrue(user.profile in profiles)

user = mixer.blend(User, score=mixer.random)
self.assertNotEqual(user.score, 50)

Expand Down
12 changes: 11 additions & 1 deletion tests/models.py
Expand Up @@ -25,7 +25,7 @@ class User(db.Model):
score = db.Column(db.SmallInteger, default=50, nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
username = db.Column(db.String(20), nullable=False)
profile_id = db.Column(db.Integer, db.ForeignKey('profile.id'))
profile_id = db.Column(db.Integer, db.ForeignKey('profile.id'), nullable=False)

messages = db.relationship("Message", secondary=usermessages, backref="users")

Expand All @@ -42,3 +42,13 @@ class Role(db.Model):
class Message(db.Model):
__tablename__ = 'message'
id = db.Column(db.Integer, primary_key=True)


class Node(db.Model):
__tablename__ = 'node'
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('node.id'))
children = db.relation(
'Node',
cascade='all',
backref=db.backref('parent', remote_side='Node.id'))

0 comments on commit 610a8f3

Please sign in to comment.