<%! from itertools import izip_longest from random import randint import formencode %> <%def name="renderControl(id_name, value, props, default_classes = 'span3')" > %if props.html_type == "checkboxselect": %for item in props.getItems(request): %endfor %elif props.html_type == "simpleselect": <% if not value and props.default is not None: value = props.default %> %if getattr(props, 'html_append', None):
%endif \ %if getattr(props, 'html_append', None): ${_(props.html_append)|n}
%endif %elif props.html_type == "simpleradio": <% if not value and props.default is not None: value = props.default %> %for item in props.getItems(request): %if item.getKey(request): %endif %endfor %elif props.html_type == "select": <% select_value = props.keyToPython(value.get("value") if isinstance(value, dict) else value, request) custom = value.get("custom") if isinstance(value, dict) else "" %> %if hasattr(props, 'html_append'):
%elif hasattr(props, 'html_prepend'):
${_(props.html_prepend)|n}\ %endif \ %if hasattr(props, 'html_append'): ${_(props.html_append)|n} %endif %if hasattr(props, 'html_append') or hasattr(props, 'html_prepend'):
%endif %if props.hasCustom(request): %endif %elif props.html_type == "checkbox": %elif props.html_type == "textarea": %else: <% html_type = props.html_type classes = getattr(props, 'classes', default_classes) if getattr(props, "is_number_validator", False): html_type = 'text' classes+= " number" maxpropname = 'max' minpropname = 'min' extras = [("step", props.step)] else: maxpropname = 'maxlength' minpropname = 'minlength' extras = [] %> %if hasattr(props, 'html_append'):
%elif hasattr(props, 'html_prepend'):
${_(props.html_prepend)|n}\ %endif ${_(props.html_append)|n} %else: > %endif %if hasattr(props, 'html_append') or hasattr(props, 'html_prepend'):
%endif %endif %if getattr(props, 'html_help', False):

${_(props.html_help)|n}

%endif <%def name="buildLabel(widget, classes = 'control-label', field_id_name = None)"> <% label = getattr(widget, "html_label", " ") %> %if callable(label): %else: %endif <%def name="renderFormLine(field_id_name, field, props, values, errors, default_classes = 'span3')"> %if props.html_type == 'hidden': %else:
%if not getattr(props, "suppress_label", False): ${self.buildLabel(props, 'control-label', field_id_name)} %endif
%if hasattr(props, 'widget'): <%doc> Try determine caller with the widget definition %for callItem in filter(None, caller): %if hasattr(callItem, props.widget): ${getattr(callItem, props.widget)(field_id_name, values.get(field), props, values, errors, default_classes)|n} <% break %> %endif %endfor %else: ${self.renderControl(id_name = field_id_name, value=values.get(field), props = props, default_classes = default_classes)} %endif %if field in errors: ${errors[field]} %endif
%endif <%def name="buildLayoutElement(field, values)"> <${field.tag} ${'class="{}"'.format(field.classes) if field.classes else ''|n}>${_(field.getLabel(values))|n} <%def name="buildCombinedFormLine(key, schema, widget, values, errors)"> <% fields, local_errors = widget.getFields(schema), widget.getErrors(errors) %>
%if widget.showOutsideLabel(): ${self.buildLabel(widget)} %endif
%if widget.inline_label: ${self.buildLabel(widget, 'inline-label')} %endif %for i, field in enumerate(widget.elements): <% props = schema.fields[field] field_id_name = "{}.{}".format(key, field) %> ${self.renderControl(id_name = field_id_name, value=values.get(field), props = props, default_classes = getattr(schema, "default_classes", "span3"))} %endfor %for error in local_errors: ${error} %endfor
<%def name="buildListItemSubform(key, position, schema, values, errors, id_key = None, default_classes = 'span3', props = None)"> <${schema.html_tag} class="form-embedded ${schema.html_classes}" ${'id="template-{}"'.format(key.replace(".","-")) if position == 0 else ""|n}> %if position > 0: checkbox %endif ${position+1} %if id_key: %endif %for i, field in enumerate(schema.form_order): <% props = schema.fields[field] field_id_name = "{}-{}.{}".format(key, position, field) %> ${self.renderFormLine(field_id_name, field, props, values, getattr(errors, "error_dict", dict()), default_classes = getattr(schema, "default_classes", default_classes))} %endfor <%def name="buildListSubforms(field_id_name, field, props, values, errors, id_key = None)">
%for j, (values_, errors_) in enumerate(izip_longest(values.get(field) or [{}], getattr(errors.get(field), "error_list", []), fillvalue = {})): %for subschema in props.validators: ${self.buildListItemSubform(field_id_name, j, subschema, values_, errors_, id_key, props = props)} %endfor %endfor
<%def name="buildSubform(key, schema, values, errors, default_classes = 'span3')"> <${schema.html_tag} class="${schema.html_classes}"> %for i, field in enumerate(schema.form_order): %if schema.fields.get(field): <% props = schema.fields[field] field_id_name = "{}.{}".format(key, field) %> ${self.renderFormLine(field_id_name, field, props, values, getattr(errors, "error_dict", dict()), default_classes = default_classes)} %elif hasattr(field, "elements"): ${self.buildCombinedFormLine(key, schema, field, values, errors)} %else: ${self.buildLayoutElement(field, values)} %endif %endfor <%def name="prelims(schema)"> <%def name="buildFormFields(schema, form_order, values, errors)"> %for i, field in enumerate(form_order): %if hasattr(field, "structure"): %if hasattr(field, "form_order"): <${field.tag} ${'class="{}"'.format(field.classes) if field.classes else ''|n}"> ${self.buildFormFields(schema, field.form_order, values, errors)} %elif hasattr(field, "widget"): <%doc> Try determine caller with the widget definition %for callItem in filter(None, caller): %if hasattr(callItem, field.widget): ${getattr(callItem, field.widget)()|n} <% break %> %endif %endfor %elif hasattr(field, "elements"): ${self.buildCombinedFormLine(schema.form_id, schema, field, values, errors)} %else: ${self.buildLayoutElement(field, values)} %endif %elif schema.fields.get(field): <% props = schema.fields[field] field_id_name = "{}.{}".format(schema.form_id, field) %> %if props.repeating == True and isinstance(props, formencode.ForEach) and not hasattr(props, "html_type"): ${self.buildListSubforms(field_id_name, field, props, values, errors)} %elif props.repeating == False and isinstance(props, formencode.Schema) and not hasattr(props, "html_type"): ${self.buildSubform(field_id_name, props, values.get(field, dict()), errors.get(field, dict()))} %else: ${self.renderFormLine(field_id_name, field, props, values, errors, default_classes = getattr(schema, "default_classes", "span3"))} %endif %endif %endfor <%doc> Try determine caller with the appendix definition %for callItem in caller: %if callItem and hasattr(callItem, 'appendix'): ${callItem.appendix()} <% break %> %endif %endfor <%def name="buildFormContent(schema, values, errors)"> ${self.prelims(schema)}
${self.buildFormFields(schema, schema.form_order, values, errors)}
<%def name="buildform(schema, values, errors)"> <% values = values[schema.form_id] errors = errors[schema.form_id] %>
${self.prelims(schema)}
%if hasattr(caller, "header"): ${caller.header()} %endif %if hasattr(caller, 'headparagraph'):
${caller.headparagraph()}
%endif ${self.buildFormFields(schema, schema.form_order, values, errors)}
%if hasattr(caller, "footer"):
${caller.footer()}
%endif
<%def name="buildValidators(root, success=True, expanding_list = False, with_custom_select = False)"> %if "de" in request._LOCALE_.lower(): $.validator.methods.range = function (value, element, param) { var globalizedValue = value.replace(",", "."); return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]); } $.validator.methods.number = function (value, element) { return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value); } %endif ${root}.find("form.form-validated").each(function(index, form){ var validator = $(form).validate({ errorClass: "help-inline" ,errorElement: "span" ,highlight: function (element, errorClass, validClass) { $(element).closest(".control-group").addClass("error").removeClass(validClass); } , unhighlight: function (element, errorClass, validClass) { $(element).closest(".control-group").removeClass("error").addClass(validClass); } }); $(form).find("input[type=reset], button[type=reset]").click(function(e) { validator.resetForm(); $(form).find(".error").removeClass("error"); }); }); %if with_custom_select: var checkSelectedOption = function(selectInput){ var selected = selectInput.find("option:selected") if(selected.attr("data-entity-custom")){ selectInput.parent().find(".select-option-custom").show(); } else { selectInput.parent().find(".select-option-custom").hide(); selectInput.closest(".control-group").removeClass("error").find("[generated]").remove(); } }; ${root}.find("form.form-validated").on({change:function(e){checkSelectedOption($(e.target));}}, "select"); ${root}.find("form.form-validated").find("select").each(function(idx, selectInput){checkSelectedOption($(selectInput))}); %endif %if expanding_list: ${root}.on({click:function(e){ var $target = $(e.target) , $embeddedForm = $target.closest(".form-embedded") , refLink = $target.closest(".form-embedded-wrapper").find(".add-more-listitem") , delLink = $target.remove(); refLink.attr("_field_position", parseInt(refLink.attr("_field_position"), 10) - 1); if($embeddedForm.prevAll(".form-embedded").length>1){ $embeddedForm.prev().prepend(delLink); } $embeddedForm.remove(); } }, ".add-more-delete-link"); ${root}.on({ click : function(e){ var $target = $(e.target) , $form = $target.closest("form") , templ = $("#template-"+$target.attr("_field_key")) , new_node = templ.clone().removeAttr("id") , new_position = parseInt($target.attr("_field_position"), 10) + 1 , inc = function(elem, attr){ elem.attr(attr, elem.attr(attr).replace(/-[0-9]+\./g, "-"+new_position+".")) }; new_node.find("input[type=hidden]").remove(); new_node.find("label").each(function(index, elem){ elem = $(elem); inc(elem, "for"); }); new_node.find("input,select,textarea").each(function(index, elem){ elem = $(elem); inc(elem, "id"); inc(elem, "name"); elem.val(""); }); new_node.find(".control-number").html(new_position+1); $target.attr("_field_position", new_position); $target.closest(".add-more").before(new_node); var delete_link = $form.find(".add-more-delete-link").remove(); if(delete_link.length === 0){ delete_link = $('×') } new_node.prepend(delete_link); new_node.find("[generated]").remove(); new_node.find(".error").removeClass("error"); new_node.find(".valid").removeClass("valid"); } }, ".add-more-listitem"); %endif <% modal_id = "confirmSubmit-{}".format(randint(0, 100000)) %>