Commit 93d911c4 authored by Serge S. Koval's avatar Serge S. Koval

Made sqladmin piece not so dependant on the SQLAlchemy version.

parent 552c0ced
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
- Through the hint - Through the hint
- Built-in filtering support - Built-in filtering support
- Many2Many support - Many2Many support
- Verify if it is working properly
- WYSIWYG editor support - WYSIWYG editor support
- File admin - File admin
- Header title - Header title
......
from sqlalchemy.orm.properties import RelationshipProperty, ColumnProperty
from sqlalchemy.orm.interfaces import MANYTOONE, ONETOMANY
from sqlalchemy.orm.attributes import InstrumentedAttribute from sqlalchemy.orm.attributes import InstrumentedAttribute
from sqlalchemy.sql.expression import desc from sqlalchemy.sql.expression import desc
...@@ -35,39 +33,37 @@ class AdminModelConverter(ModelConverter): ...@@ -35,39 +33,37 @@ class AdminModelConverter(ModelConverter):
if not field_args: if not field_args:
field_args = dict() field_args = dict()
if isinstance(prop, RelationshipProperty): if hasattr(prop, 'direction'):
local_column = prop.local_remote_pairs[0][0]
remote_model = prop.mapper.class_ remote_model = prop.mapper.class_
local_column = prop.local_remote_pairs[0][0]
kwargs = { kwargs = {
'validators': [], 'validators': [],
'filters': [], 'filters': [],
'allow_blank': local_column.nullable, 'allow_blank': local_column.nullable,
'label': self._get_label(prop.key, field_args), 'label': self._get_label(prop.key, field_args),
'query_factory': lambda: self.view.session.query(remote_model),
'default': None 'default': None
} }
if field_args: if field_args:
kwargs.update(field_args) kwargs.update(field_args)
def query_factory(): if prop.direction.name == 'MANYTOONE':
return self.view.session.query(remote_model) return QuerySelectField(widget=form.ChosenSelectWidget(), **kwargs)
elif prop.direction.name == 'ONETOMANY':
if prop.direction is MANYTOONE:
return QuerySelectField(query_factory=query_factory,
widget=form.ChosenSelectWidget(),
**kwargs)
elif prop.direction is ONETOMANY:
# Skip backrefs # Skip backrefs
if not local_column.foreign_keys and self.view.hide_backrefs: if not local_column.foreign_keys and self.view.hide_backrefs:
return None return None
return QuerySelectMultipleField(query_factory=query_factory, return QuerySelectMultipleField(widget=form.ChosenSelectWidget(multiple=True),
widget=form.ChosenSelectWidget(multiple=True), **kwargs)
elif prop.direction.name == 'MANYTOMANY':
return QuerySelectMultipleField(widget=form.ChosenSelectWidget(multiple=True),
**kwargs) **kwargs)
else: else:
# Ignore pk/fk # Ignore pk/fk
if isinstance(prop, ColumnProperty): if hasattr(prop, 'columns'):
column = prop.columns[0] column = prop.columns[0]
if column.foreign_keys or column.primary_key: if column.foreign_keys or column.primary_key:
...@@ -81,17 +77,17 @@ class AdminModelConverter(ModelConverter): ...@@ -81,17 +77,17 @@ class AdminModelConverter(ModelConverter):
field_args) field_args)
@converts('Date') @converts('Date')
def conv_date(self, field_args, **extra): def convert_date(self, field_args, **extra):
field_args['widget'] = form.DatePickerWidget() field_args['widget'] = form.DatePickerWidget()
return fields.DateField(**field_args) return fields.DateField(**field_args)
@converts('DateTime') @converts('DateTime')
def conv_datetime(self, field_args, **extra): def convert_datetime(self, field_args, **extra):
field_args['widget'] = form.DateTimePickerWidget() field_args['widget'] = form.DateTimePickerWidget()
return fields.DateTimeField(**field_args) return fields.DateTimeField(**field_args)
@converts('Time') @converts('Time')
def conv_time(self, field_args, **extra): def convert_time(self, field_args, **extra):
return form.TimeField(**field_args) return form.TimeField(**field_args)
...@@ -142,10 +138,10 @@ class ModelView(BaseModelView): ...@@ -142,10 +138,10 @@ class ModelView(BaseModelView):
mapper = self.model._sa_class_manager.mapper mapper = self.model._sa_class_manager.mapper
for p in mapper.iterate_properties: for p in mapper.iterate_properties:
if isinstance(p, RelationshipProperty): if hasattr(p, 'direction'):
if p.direction is MANYTOONE: if p.direction.name == 'MANYTOONE':
columns.append(p.key) columns.append(p.key)
elif isinstance(p, ColumnProperty): elif hasattr(p, 'columns'):
# TODO: Check for multiple columns # TODO: Check for multiple columns
column = p.columns[0] column = p.columns[0]
...@@ -166,7 +162,7 @@ class ModelView(BaseModelView): ...@@ -166,7 +162,7 @@ class ModelView(BaseModelView):
mapper = self.model._sa_class_manager.mapper mapper = self.model._sa_class_manager.mapper
for p in mapper.iterate_properties: for p in mapper.iterate_properties:
if isinstance(p, ColumnProperty): if hasattr(p, 'columns'):
# Sanity check # Sanity check
if len(p.columns) > 1: if len(p.columns) > 1:
raise Exception('Automatic form scaffolding is not supported' + raise Exception('Automatic form scaffolding is not supported' +
......
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