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

Fixed #242

parent 8c3f7533
from mongoengine import ReferenceField from mongoengine import ReferenceField
from wtforms import validators
from flask.ext.mongoengine.wtf import orm, fields from flask.ext.mongoengine.wtf import orm, fields
from flask.ext.admin import form from flask.ext.admin import form
...@@ -16,6 +17,59 @@ class CustomModelConverter(orm.ModelConverter): ...@@ -16,6 +17,59 @@ class CustomModelConverter(orm.ModelConverter):
Injects various Flask-Admin widgets and handles lists with Injects various Flask-Admin widgets and handles lists with
customized InlineFieldList field. 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') @orm.converts('DateTimeField')
def conv_DateTime(self, model, field, kwargs): def conv_DateTime(self, model, field, kwargs):
kwargs['widget'] = form.DateTimePickerWidget() kwargs['widget'] = form.DateTimePickerWidget()
......
...@@ -62,6 +62,9 @@ class ModelView(BaseModelView): ...@@ -62,6 +62,9 @@ class ModelView(BaseModelView):
Model form conversion class. Use this to implement custom Model form conversion class. Use this to implement custom
field conversion logic. field conversion logic.
Custom class should be derived from the
`flask.ext.admin.contrib.mongoengine.form.CustomModelConverter`.
For example:: For example::
class MyModelConverter(AdminModelConverter): class MyModelConverter(AdminModelConverter):
...@@ -237,7 +240,7 @@ class ModelView(BaseModelView): ...@@ -237,7 +240,7 @@ class ModelView(BaseModelView):
only=self.form_columns, only=self.form_columns,
exclude=self.form_excluded_columns, exclude=self.form_excluded_columns,
field_args=self.form_args, field_args=self.form_args,
converter=self.model_form_converter()) converter=self.model_form_converter(self))
return form_class 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