Commit 5e5b5736 authored by Serge S. Koval's avatar Serge S. Koval

Improved inline model handling for SQLa backend

parent 4783dc9b
...@@ -6,6 +6,7 @@ from flask.ext.admin.form import Select2Field ...@@ -6,6 +6,7 @@ from flask.ext.admin.form import Select2Field
from flask.ext.admin.model.form import (converts, ModelConverterBase, from flask.ext.admin.model.form import (converts, ModelConverterBase,
InlineFormAdmin, InlineModelConverterBase, InlineFormAdmin, InlineModelConverterBase,
FieldPlaceholder) FieldPlaceholder)
from flask.ext.admin.model.helpers import prettify_name
from flask.ext.admin._backwards import get_property from flask.ext.admin._backwards import get_property
from flask.ext.admin._compat import iteritems from flask.ext.admin._compat import iteritems
...@@ -45,13 +46,20 @@ class AdminModelConverter(ModelConverterBase): ...@@ -45,13 +46,20 @@ class AdminModelConverter(ModelConverterBase):
if column_labels: if column_labels:
return column_labels.get(name) return column_labels.get(name)
return self.view.prettify_name(name) prettify_override = getattr(self.view, 'prettify_name', None)
if prettify_override:
return prettify_override(name)
return prettify_name(name)
def _get_description(self, name, field_args): def _get_description(self, name, field_args):
if 'description' in field_args: if 'description' in field_args:
return field_args['description'] return field_args['description']
if self.view.column_descriptions:
return self.view.column_descriptions.get(name) column_descriptions = getattr(self.view, 'column_descriptions', None)
if column_descriptions:
return column_descriptions.get(name)
def _get_field_override(self, name): def _get_field_override(self, name):
form_overrides = getattr(self.view, 'form_overrides', None) form_overrides = getattr(self.view, 'form_overrides', None)
...@@ -409,9 +417,10 @@ class InlineModelConverter(InlineModelConverterBase): ...@@ -409,9 +417,10 @@ class InlineModelConverter(InlineModelConverterBase):
you can create your own wtforms field and use it instead you can create your own wtforms field and use it instead
""" """
def __init__(self, session, view): def __init__(self, session, view, model_converter):
super(InlineModelConverter, self).__init__(view) super(InlineModelConverter, self).__init__(view)
self.session = session self.session = session
self.model_converter = model_converter
def get_info(self, p): def get_info(self, p):
info = super(InlineModelConverter, self).get_info(p) info = super(InlineModelConverter, self).get_info(p)
...@@ -437,7 +446,7 @@ class InlineModelConverter(InlineModelConverterBase): ...@@ -437,7 +446,7 @@ class InlineModelConverter(InlineModelConverterBase):
return info return info
def contribute(self, converter, model, form_class, inline_model): def contribute(self, model, form_class, inline_model):
""" """
Generate form fields for inline forms and contribute them to Generate form fields for inline forms and contribute them to
the `form_class` the `form_class`
...@@ -497,6 +506,9 @@ class InlineModelConverter(InlineModelConverterBase): ...@@ -497,6 +506,9 @@ class InlineModelConverter(InlineModelConverterBase):
else: else:
exclude = ignore exclude = ignore
# Create converter
converter = self.model_converter(self.session, info)
# Create form # Create form
child_form = info.get_form() child_form = info.get_form()
......
...@@ -530,12 +530,12 @@ class ModelView(BaseModelView): ...@@ -530,12 +530,12 @@ class ModelView(BaseModelView):
:param form_class: :param form_class:
Form class Form class
""" """
converter = self.model_form_converter(self.session, self) inline_converter = self.inline_model_form_converter(self.session,
inline_converter = self.inline_model_form_converter(self.session, self) self,
self.model_form_converter)
for m in self.inline_models: for m in self.inline_models:
form_class = inline_converter.contribute(converter, form_class = inline_converter.contribute(self.model,
self.model,
form_class, form_class,
m) m)
......
...@@ -13,6 +13,7 @@ from flask.ext.admin.helpers import get_form_data, validate_form_on_submit ...@@ -13,6 +13,7 @@ from flask.ext.admin.helpers import get_form_data, validate_form_on_submit
from flask.ext.admin.tools import rec_getattr from flask.ext.admin.tools import rec_getattr
from flask.ext.admin._backwards import ObsoleteAttr from flask.ext.admin._backwards import ObsoleteAttr
from flask.ext.admin._compat import iteritems, as_unicode from flask.ext.admin._compat import iteritems, as_unicode
from .helpers import prettify_name
class BaseModelView(BaseView, ActionsMixin): class BaseModelView(BaseView, ActionsMixin):
...@@ -380,7 +381,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -380,7 +381,7 @@ class BaseModelView(BaseView, ActionsMixin):
# If name not provided, it is model name # If name not provided, it is model name
if name is None: if name is None:
name = '%s' % self._prettify_name(model.__name__) name = '%s' % self.prettify_name(model.__name__)
# If endpoint not provided, it is model name + 'view' # If endpoint not provided, it is model name + 'view'
if endpoint is None: if endpoint is None:
...@@ -818,7 +819,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -818,7 +819,7 @@ class BaseModelView(BaseView, ActionsMixin):
:param name: :param name:
Name to prettify Name to prettify
""" """
return name.replace('_', ' ').title() return prettify_name(name)
# URL generation helper # URL generation helper
def _get_extra_args(self): def _get_extra_args(self):
......
def prettify_name(name):
"""
Prettify pythonic variable name.
For example, 'hello_world' will be converted to 'Hello World'
:param name:
Name to prettify
"""
return name.replace('_', ' ').title()
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