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

Minor SQLa model_form refactoring

parent c2c09b7f
...@@ -69,6 +69,48 @@ class AdminModelConverter(ModelConverterBase): ...@@ -69,6 +69,48 @@ class AdminModelConverter(ModelConverterBase):
return None return None
def _convert_relation(self, prop, kwargs):
remote_model = prop.mapper.class_
local_column = prop.local_remote_pairs[0][0]
kwargs['label'] = self._get_label(prop.key, kwargs)
kwargs['description'] = self._get_description(prop.key, kwargs)
if local_column.nullable:
kwargs['validators'].append(validators.Optional())
elif prop.direction.name != 'MANYTOMANY':
kwargs['validators'].append(validators.InputRequired())
# 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(**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(**kwargs)
elif prop.direction.name == 'MANYTOMANY':
return QuerySelectMultipleField(**kwargs)
def convert(self, model, mapper, prop, field_args, hidden_pk): def convert(self, model, mapper, prop, field_args, hidden_pk):
# Properly handle forced fields # Properly handle forced fields
if isinstance(prop, FieldPlaceholder): if isinstance(prop, FieldPlaceholder):
...@@ -84,46 +126,7 @@ class AdminModelConverter(ModelConverterBase): ...@@ -84,46 +126,7 @@ class AdminModelConverter(ModelConverterBase):
# Check if it is relation or property # Check if it is relation or property
if hasattr(prop, 'direction'): if hasattr(prop, 'direction'):
remote_model = prop.mapper.class_ return self._convert_relation(prop, kwargs)
local_column = prop.local_remote_pairs[0][0]
kwargs['label'] = self._get_label(prop.key, kwargs)
kwargs['description'] = self._get_description(prop.key, kwargs)
if local_column.nullable:
kwargs['validators'].append(validators.Optional())
elif prop.direction.name != 'MANYTOMANY':
kwargs['validators'].append(validators.InputRequired())
# 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(**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(**kwargs)
elif prop.direction.name == 'MANYTOMANY':
return QuerySelectMultipleField(**kwargs)
else: else:
# Ignore pk/fk # Ignore pk/fk
if hasattr(prop, 'columns'): if hasattr(prop, 'columns'):
......
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