Commit 794aa776 authored by Serge S. Koval's avatar Serge S. Koval

Fixed #361. 'widget_args' are now passed to the InlineFormField

parent 248d6be8
...@@ -100,7 +100,12 @@ class PostView(ModelView): ...@@ -100,7 +100,12 @@ class PostView(ModelView):
'form_subdocuments': { 'form_subdocuments': {
None: { None: {
# Add <hr> at the end of the form # Add <hr> at the end of the form
'form_rules': ('name', 'tag', 'value', rules.HTML('<hr>')) 'form_rules': ('name', 'tag', 'value', rules.HTML('<hr>')),
'form_widget_args': {
'name': {
'style': 'color: red'
}
}
} }
} }
} }
......
import os import os
import os.path as op
from flask import Flask from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy from flask.ext.sqlalchemy import SQLAlchemy
...@@ -261,7 +262,6 @@ def build_sample_db(): ...@@ -261,7 +262,6 @@ def build_sample_db():
return return
if __name__ == '__main__': if __name__ == '__main__':
# Build a sample db on the fly, if one does not exist yet. # Build a sample db on the fly, if one does not exist yet.
app_dir = op.realpath(os.path.dirname(__file__)) app_dir = op.realpath(os.path.dirname(__file__))
database_path = op.join(app_dir, app.config['DATABASE_FILE']) database_path = op.join(app_dir, app.config['DATABASE_FILE'])
......
...@@ -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 InlineFormRuleWidget from flask.ext.admin.model.widgets import InlineFormWidget
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
...@@ -138,7 +138,10 @@ class CustomModelConverter(orm.ModelConverter): ...@@ -138,7 +138,10 @@ class CustomModelConverter(orm.ModelConverter):
view = self._get_subdocument_config(field.name) view = self._get_subdocument_config(field.name)
if 'widget' not in kwargs: if 'widget' not in kwargs:
kwargs['widget'] = InlineFormRuleWidget(view._form_rules) form_opts = form.FormOpts(widget_args=getattr(view, 'form_widget_args', None),
form_rules=view._form_rules)
kwargs['widget'] = InlineFormWidget(form_opts)
form_class = view.get_form() form_class = view.get_form()
if form_class is None: if form_class is None:
......
...@@ -14,10 +14,11 @@ class BaseForm(form.Form): ...@@ -14,10 +14,11 @@ class BaseForm(form.Form):
class FormOpts(object): class FormOpts(object):
__slots__ = ['widget_args'] __slots__ = ['widget_args', 'form_rules']
def __init__(self, widget_args): def __init__(self, widget_args=None, form_rules=None):
self.widget_args = widget_args self.widget_args = widget_args or {}
self.form_rules = form_rules
def recreate_field(unbound): def recreate_field(unbound):
...@@ -31,13 +32,3 @@ def recreate_field(unbound): ...@@ -31,13 +32,3 @@ def recreate_field(unbound):
raise ValueError('recreate_field expects UnboundField instance, %s was passed.' % type(unbound)) raise ValueError('recreate_field expects UnboundField instance, %s was passed.' % type(unbound))
return unbound.field_class(*unbound.args, **unbound.kwargs) return unbound.field_class(*unbound.args, **unbound.kwargs)
def get_form_opts(view):
"""
Return form options object from the view.
:param view:
Administrative view or inline model configuration class.
"""
return FormOpts(getattr(view, 'form_widget_args', {}))
...@@ -7,7 +7,7 @@ from jinja2 import contextfunction ...@@ -7,7 +7,7 @@ from jinja2 import contextfunction
from flask.ext.admin.babel import gettext from flask.ext.admin.babel import gettext
from flask.ext.admin.base import BaseView, expose from flask.ext.admin.base import BaseView, expose
from flask.ext.admin.form import BaseForm, rules, get_form_opts from flask.ext.admin.form import BaseForm, FormOpts, rules
from flask.ext.admin.model import filters, typefmt from flask.ext.admin.model import filters, typefmt
from flask.ext.admin.actions import ActionsMixin from flask.ext.admin.actions import ActionsMixin
from flask.ext.admin.helpers import get_form_data, validate_form_on_submit from flask.ext.admin.helpers import get_form_data, validate_form_on_submit
...@@ -1215,10 +1215,12 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1215,10 +1215,12 @@ class BaseModelView(BaseView, ActionsMixin):
else: else:
return redirect(return_url) return redirect(return_url)
form_opts = FormOpts(widget_args=self.form_widget_args,
form_rules=self._form_create_rules)
return self.render(self.create_template, return self.render(self.create_template,
form=form, form=form,
form_opts=get_form_opts(self), form_opts=form_opts,
form_rules=self._form_create_rules,
return_url=return_url) return_url=return_url)
@expose('/edit/', methods=('GET', 'POST')) @expose('/edit/', methods=('GET', 'POST'))
...@@ -1250,11 +1252,13 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1250,11 +1252,13 @@ class BaseModelView(BaseView, ActionsMixin):
else: else:
return redirect(return_url) return redirect(return_url)
form_opts = FormOpts(widget_args=self.form_widget_args,
form_rules=self._form_create_rules)
return self.render(self.edit_template, return self.render(self.edit_template,
model=model, model=model,
form=form, form=form,
form_opts=get_form_opts(self), form_opts=form_opts,
form_rules=self._form_edit_rules,
return_url=return_url) return_url=return_url)
@expose('/delete/', methods=('POST',)) @expose('/delete/', methods=('POST',))
......
...@@ -12,24 +12,15 @@ class InlineFieldListWidget(RenderTemplateWidget): ...@@ -12,24 +12,15 @@ class InlineFieldListWidget(RenderTemplateWidget):
class InlineFormWidget(RenderTemplateWidget): class InlineFormWidget(RenderTemplateWidget):
def __init__(self): def __init__(self, form_opts=None):
super(InlineFormWidget, self).__init__('admin/model/inline_form.html') super(InlineFormWidget, self).__init__('admin/model/inline_form.html')
self.form_opts = form_opts
def __call__(self, field, **kwargs): def __call__(self, field, **kwargs):
kwargs.setdefault('form_rules', None) kwargs.setdefault('form_opts', self.form_opts)
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
......
...@@ -108,7 +108,7 @@ ...@@ -108,7 +108,7 @@
<h3>{{ text }}</h3> <h3>{{ text }}</h3>
{% endmacro %} {% endmacro %}
{% macro render_form_fields(form, form_opts={}, form_rules=None) %} {% macro render_form_fields(form, form_opts=None) %}
{% if form.hidden_tag is defined %} {% if form.hidden_tag is defined %}
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
{% else %} {% else %}
...@@ -120,8 +120,8 @@ ...@@ -120,8 +120,8 @@
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% if form_rules %} {% if form_opts and form_opts.form_rules %}
{% for r in form_rules %} {% for r in form_opts.form_rules %}
{{ r(form, form_opts=form_opts) }} {{ r(form, form_opts=form_opts) }}
{% endfor %} {% endfor %}
{% else %} {% else %}
...@@ -158,9 +158,9 @@ ...@@ -158,9 +158,9 @@
</div> </div>
{% endmacro %} {% endmacro %}
{% macro render_form(form, cancel_url, extra=None, form_opts={}, form_rules=None) -%} {% macro render_form(form, cancel_url, extra=None, form_opts=None) -%}
{% call form_tag() %} {% call form_tag() %}
{{ render_form_fields(form, form_opts=form_opts, form_rules=form_rules) }} {{ render_form_fields(form, form_opts=form_opts) }}
{{ render_form_buttons(cancel_url, extra) }} {{ render_form_buttons(cancel_url, extra) }}
{% endcall %} {% endcall %}
{% endmacro %} {% endmacro %}
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
</ul> </ul>
{% call lib.form_tag(form) %} {% call lib.form_tag(form) %}
{{ lib.render_form_fields(form, form_opts=form_opts, form_rules=form_rules) }} {{ lib.render_form_fields(form, form_opts=form_opts) }}
{{ lib.render_form_buttons(return_url, extra()) }} {{ lib.render_form_buttons(return_url, extra()) }}
{% endcall %} {% endcall %}
{% endblock %} {% endblock %}
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
{% block body %} {% block body %}
{% call lib.form_tag(form) %} {% call lib.form_tag(form) %}
{{ lib.render_form_fields(form, form_opts=form_opts, form_rules=form_rules) }} {{ lib.render_form_fields(form, form_opts=form_opts) }}
{{ lib.render_form_buttons(return_url, extra()) }} {{ lib.render_form_buttons(return_url, extra()) }}
{% endcall %} {% endcall %}
{% endblock %} {% endblock %}
......
{% 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.form, form_rules=form_rules) }} {{ lib.render_form_fields(field.form, form_opts=form_opts) }}
</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