Commit 12995505 authored by Serge S. Koval's avatar Serge S. Koval

Improved SQLAlchemy overridden field support

parent d1f58a58
......@@ -46,7 +46,7 @@ class Post(db.Model):
date = db.Column(db.DateTime)
user_id = db.Column(db.Integer(), db.ForeignKey(User.id))
user = db.relationship(User, backref='posts')
user = db.relationship(User, backref=db.backref('posts', collection_class=set))
tags = db.relationship('Tag', secondary=post_tags_table)
......
......@@ -87,32 +87,35 @@ class AdminModelConverter(ModelConverterBase):
elif prop.direction.name != 'MANYTOMANY':
kwargs['validators'].append(validators.InputRequired())
# Override field type if necessary
override = self._get_field_override(prop.key)
if override:
return override(**kwargs)
# Contribute model-related parameters
if 'allow_blank' not in kwargs:
kwargs['allow_blank'] = local_column.nullable
if 'query_factory' not in kwargs:
kwargs['query_factory'] = lambda: self.session.query(remote_model)
if 'widget' not in kwargs:
if prop.direction.name == 'MANYTOONE':
kwargs['widget'] = form.Select2Widget()
elif prop.direction.name == 'ONETOMANY':
kwargs['widget'] = form.Select2Widget(multiple=True)
elif prop.direction.name == 'MANYTOMANY':
kwargs['widget'] = form.Select2Widget(multiple=True)
# Override field type if necessary
override = self._get_field_override(prop.key)
if override:
return override(**kwargs)
if prop.direction.name == 'MANYTOONE':
return QuerySelectField(widget=form.Select2Widget(),
**kwargs)
return QuerySelectField(**kwargs)
elif prop.direction.name == 'ONETOMANY':
# Skip backrefs
if not local_column.foreign_keys and getattr(self.view, 'column_hide_backrefs', False):
return None
return QuerySelectMultipleField(
widget=form.Select2Widget(multiple=True),
**kwargs)
return QuerySelectMultipleField(**kwargs)
elif prop.direction.name == 'MANYTOMANY':
return QuerySelectMultipleField(
widget=form.Select2Widget(multiple=True),
**kwargs)
return QuerySelectMultipleField(**kwargs)
else:
# Ignore pk/fk
if hasattr(prop, 'columns'):
......
......@@ -68,7 +68,7 @@ class ImageUploadInput(object):
"""
empty_template = ('<input %(file)s>')
data_template = ('<div>'
data_template = ('<div class="image-thumbnail">'
' <img %(image)s>'
' <input type="checkbox" name="%(marker)s">Delete</input>'
'</div>'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment