Commit 723cdfad authored by Serge S. Koval's avatar Serge S. Koval

Support form_rules in MongoEngine embedded documents.

parent f7d78461
...@@ -7,7 +7,7 @@ from flask.ext.mongoengine.wtf import orm, fields as mongo_fields ...@@ -7,7 +7,7 @@ from flask.ext.mongoengine.wtf import orm, fields as mongo_fields
from flask.ext.admin import form from flask.ext.admin import form
from flask.ext.admin.model.form import FieldPlaceholder from flask.ext.admin.model.form import FieldPlaceholder
from flask.ext.admin.model.fields import InlineFieldList, AjaxSelectField, AjaxSelectMultipleField from flask.ext.admin.model.fields import InlineFieldList, AjaxSelectField, AjaxSelectMultipleField
from flask.ext.admin.model.widgets import InlineFormWidget from flask.ext.admin.model.widgets import InlineFormRuleWidget
from flask.ext.admin._compat import iteritems from flask.ext.admin._compat import iteritems
from .fields import ModelFormField, MongoFileField, MongoImageField from .fields import ModelFormField, MongoFileField, MongoImageField
...@@ -135,11 +135,11 @@ class CustomModelConverter(orm.ModelConverter): ...@@ -135,11 +135,11 @@ class CustomModelConverter(orm.ModelConverter):
# FormField does not support validators # FormField does not support validators
kwargs['validators'] = [] kwargs['validators'] = []
if 'widget' not in kwargs:
kwargs['widget'] = InlineFormWidget()
view = self._get_subdocument_config(field.name) view = self._get_subdocument_config(field.name)
if 'widget' not in kwargs:
kwargs['widget'] = InlineFormRuleWidget(view._form_rules)
form_class = view.get_form() form_class = view.get_form()
if form_class is None: if form_class is None:
converter = self.clone_converter(view) converter = self.clone_converter(view)
......
from flask.ext.admin._compat import iteritems from flask.ext.admin._compat import iteritems
from flask.ext.admin.form import rules
from flask.ext.admin.model.form import InlineBaseFormAdmin from flask.ext.admin.model.form import InlineBaseFormAdmin
...@@ -8,6 +9,13 @@ class EmbeddedForm(InlineBaseFormAdmin): ...@@ -8,6 +9,13 @@ class EmbeddedForm(InlineBaseFormAdmin):
self._form_subdocuments = convert_subdocuments(getattr(self, 'form_subdocuments', {})) self._form_subdocuments = convert_subdocuments(getattr(self, 'form_subdocuments', {}))
form_rules = getattr(self, 'form_rules', None)
if form_rules:
self._form_rules = rules.RuleSet(self, form_rules)
else:
self._form_rules = None
def convert_subdocuments(values): def convert_subdocuments(values):
result = {} result = {}
......
...@@ -239,7 +239,7 @@ class Field(Macro): ...@@ -239,7 +239,7 @@ class Field(Macro):
field = getattr(form, self.field_name, None) field = getattr(form, self.field_name, None)
if not field: if not field:
raise ValueError('Form %s does not have field %s' % (form, form_opts, self.field_name)) raise ValueError('Form %s does not have field %s' % (form, self.field_name))
opts = {} opts = {}
......
...@@ -16,9 +16,20 @@ class InlineFormWidget(RenderTemplateWidget): ...@@ -16,9 +16,20 @@ class InlineFormWidget(RenderTemplateWidget):
super(InlineFormWidget, self).__init__('admin/model/inline_form.html') super(InlineFormWidget, self).__init__('admin/model/inline_form.html')
def __call__(self, field, **kwargs): def __call__(self, field, **kwargs):
kwargs.setdefault('form_rules', None)
return super(InlineFormWidget, self).__call__(field, **kwargs) return super(InlineFormWidget, self).__call__(field, **kwargs)
class InlineFormRuleWidget(InlineFormWidget):
def __init__(self, rule_set):
super(InlineFormRuleWidget, self).__init__()
self.rule_set = rule_set
def __call__(self, field, **kwargs):
kwargs['form_rules'] = self.rule_set
return super(InlineFormRuleWidget, self).__call__(field, **kwargs)
class AjaxSelect2Widget(object): class AjaxSelect2Widget(object):
def __init__(self, multiple=False): def __init__(self, multiple=False):
self.multiple = multiple self.multiple = multiple
......
{% import 'admin/lib.html' as lib with context %} {% import 'admin/lib.html' as lib with context %}
<div class="fa-inline-field"> <div class="fa-inline-field">
{{ lib.render_form_fields(field) }} {{ lib.render_form_fields(field.form, form_rules=form_rules) }}
</div> </div>
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