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):
'form_subdocuments': {
None: {
# 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.path as op
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
......@@ -261,7 +262,6 @@ def build_sample_db():
return
if __name__ == '__main__':
# Build a sample db on the fly, if one does not exist yet.
app_dir = op.realpath(os.path.dirname(__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
from flask.ext.admin import form
from flask.ext.admin.model.form import FieldPlaceholder
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 .fields import ModelFormField, MongoFileField, MongoImageField
......@@ -138,7 +138,10 @@ class CustomModelConverter(orm.ModelConverter):
view = self._get_subdocument_config(field.name)
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()
if form_class is None:
......
......@@ -14,10 +14,11 @@ class BaseForm(form.Form):
class FormOpts(object):
__slots__ = ['widget_args']
__slots__ = ['widget_args', 'form_rules']
def __init__(self, widget_args):
self.widget_args = widget_args
def __init__(self, widget_args=None, form_rules=None):
self.widget_args = widget_args or {}
self.form_rules = form_rules
def recreate_field(unbound):
......@@ -31,13 +32,3 @@ def recreate_field(unbound):
raise ValueError('recreate_field expects UnboundField instance, %s was passed.' % type(unbound))
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
from flask.ext.admin.babel import gettext
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.actions import ActionsMixin
from flask.ext.admin.helpers import get_form_data, validate_form_on_submit
......@@ -1215,10 +1215,12 @@ class BaseModelView(BaseView, ActionsMixin):
else:
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,
form=form,
form_opts=get_form_opts(self),
form_rules=self._form_create_rules,
form_opts=form_opts,
return_url=return_url)
@expose('/edit/', methods=('GET', 'POST'))
......@@ -1250,11 +1252,13 @@ class BaseModelView(BaseView, ActionsMixin):
else:
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,
model=model,
form=form,
form_opts=get_form_opts(self),
form_rules=self._form_edit_rules,
form_opts=form_opts,
return_url=return_url)
@expose('/delete/', methods=('POST',))
......
......@@ -12,24 +12,15 @@ class InlineFieldListWidget(RenderTemplateWidget):
class InlineFormWidget(RenderTemplateWidget):
def __init__(self):
def __init__(self, form_opts=None):
super(InlineFormWidget, self).__init__('admin/model/inline_form.html')
self.form_opts = form_opts
def __call__(self, field, **kwargs):
kwargs.setdefault('form_rules', None)
kwargs.setdefault('form_opts', self.form_opts)
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):
def __init__(self, multiple=False):
self.multiple = multiple
......
......@@ -108,7 +108,7 @@
<h3>{{ text }}</h3>
{% 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 %}
{{ form.hidden_tag() }}
{% else %}
......@@ -120,8 +120,8 @@
{% endfor %}
{% endif %}
{% if form_rules %}
{% for r in form_rules %}
{% if form_opts and form_opts.form_rules %}
{% for r in form_opts.form_rules %}
{{ r(form, form_opts=form_opts) }}
{% endfor %}
{% else %}
......@@ -158,9 +158,9 @@
</div>
{% 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() %}
{{ 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) }}
{% endcall %}
{% endmacro %}
......@@ -23,7 +23,7 @@
</ul>
{% 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()) }}
{% endcall %}
{% endblock %}
......
......@@ -14,7 +14,7 @@
{% block body %}
{% 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()) }}
{% endcall %}
{% endblock %}
......
{% import 'admin/lib.html' as lib with context %}
<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>
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