Commit 1fdfd3f3 authored by Serge S. Koval's avatar Serge S. Koval

Fixed #242

parent 8c3f7533
from mongoengine import ReferenceField
from wtforms import validators
from flask.ext.mongoengine.wtf import orm, fields
from flask.ext.admin import form
......@@ -16,6 +17,59 @@ class CustomModelConverter(orm.ModelConverter):
Injects various Flask-Admin widgets and handles lists with
customized InlineFieldList field.
"""
def __init__(self, view):
super(CustomModelConverter, self).__init__()
self.view = view
def _get_field_override(self, name):
form_overrides = getattr(self.view, 'form_overrides', None)
if form_overrides:
return form_overrides.get(name)
return None
def convert(self, model, field, field_args):
kwargs = {
'label': getattr(field, 'verbose_name', field.name),
'description': field.help_text or '',
'validators': [],
'filters': [],
'default': field.default,
}
if field_args:
kwargs.update(field_args)
if field.required:
kwargs['validators'].append(validators.Required())
else:
kwargs['validators'].append(validators.Optional())
ftype = type(field).__name__
if field.choices:
kwargs['choices'] = field.choices
if ftype in self.converters:
kwargs["coerce"] = self.coerce(ftype)
if kwargs.pop('multiple', False):
return fields.SelectMultipleField(**kwargs)
return fields.SelectField(**kwargs)
ftype = type(field).__name__
if hasattr(field, 'to_form_field'):
return field.to_form_field(model, kwargs)
override = self._get_field_override(field.name)
if override:
return override(**kwargs)
if ftype in self.converters:
return self.converters[ftype](model, field, kwargs)
@orm.converts('DateTimeField')
def conv_DateTime(self, model, field, kwargs):
kwargs['widget'] = form.DateTimePickerWidget()
......
......@@ -62,6 +62,9 @@ class ModelView(BaseModelView):
Model form conversion class. Use this to implement custom
field conversion logic.
Custom class should be derived from the
`flask.ext.admin.contrib.mongoengine.form.CustomModelConverter`.
For example::
class MyModelConverter(AdminModelConverter):
......@@ -237,7 +240,7 @@ class ModelView(BaseModelView):
only=self.form_columns,
exclude=self.form_excluded_columns,
field_args=self.form_args,
converter=self.model_form_converter())
converter=self.model_form_converter(self))
return form_class
......
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