{# Renders field for bootstrap 3 standards.

Params:
field - WTForm field
kwargs - pass any arguments you want in order to put them into the html attributes.
There are few exceptions: for - for_, class - class_, class__ - class_

Example usage:
{{ macros.render_field(form.email, placeholder='Input email', type='email') }}
#}
{% macro render_field(field, label_visible=true) -%}

<div class="form-group {% if field.errors %}has-error{% endif %} {{ kwargs.pop('class_', '') }}">
    {% if (field.type != 'HiddenField' or field.type !='CSRFTokenField') and label_visible %}
    <label for="{{ field.id }}" class="control-label">{{ field.label }}</label>
    {% endif %}
    {{ field(class_='form-control text-capitalized', **kwargs) }}
    {% if field.errors %}
    {% for e in field.errors %}
    <p class="help-block">{{ e }}</p>
    {% endfor %}
    {% endif %}
</div>
{%- endmacro %}

{# Renders checkbox fields since they are represented differently in bootstrap
Params:
field - WTForm field (there are no check, but you should put here only BooleanField.
kwargs - pass any arguments you want in order to put them into the html attributes.
There are few exceptions: for - for_, class - class_, class__ - class_

Example usage:
{{ macros.render_checkbox_field(form.remember_me) }}
#}
{% macro render_checkbox_field(field) -%}
<div class="checkbox">
    <label>
        {{ field(type='checkbox', **kwargs) }} {{ field.label }}
    </label>
</div>
{%- endmacro %}

{# Renders radio field
Params:
field - WTForm field (there are no check, but you should put here only BooleanField.
kwargs - pass any arguments you want in order to put them into the html attributes.
There are few exceptions: for - for_, class - class_, class__ - class_

Example usage:
{{ macros.render_radio_field(form.answers) }}
#}
{% macro render_radio_field(field) -%}
{% for value, label, _ in field.iter_choices() %}
<div class="radio" style="margin:8pt auto;">
    <label>
        <input type="radio" name="{{ field.id }}" id="{{ field.id }}" value="{{ value }}">{{ label }}
    </label>
</div>
{% endfor %}
{%- endmacro %}

{# Renders WTForm in bootstrap way. There are two ways to call function:
- as macros: it will render all field forms using cycle to iterate over them
- as call: it will insert form fields as you specify:
e.g. {% call macros.render_form(form, action_url=url_for('login_view'), action_text='Login',
class_='login-form') %}
{{ macros.render_field(form.email, placeholder='Input email', type='email') }}
{{ macros.render_field(form.password, placeholder='Input password', type='password') }}
{{ macros.render_checkbox_field(form.remember_me, type='checkbox') }}
{% endcall %}

Params:
form - WTForm class
method - form method
action_url - url where to submit this form
action_text - text of submit button
class_ - sets a class for form
#}
{% macro render_form(form, action_url='', method='POST', action_text='Submit', class_='', btn_class='btn btn-default') -%}

<form method="{{ method }}" action="{{ action_url }}" role="form" class="{{ class_ }}">
    {{ form.hidden_tag() if form.hidden_tag }}
    {% if caller %}
        {{ caller() }}
    {% else %}
    {% for f in form %}
    {% if f.id != 'csrf_token' %}
        {% if f.type == 'BooleanField' %}
            {{ render_checkbox_field(f) }}
        {% elif f.type == 'RadioField' %}
            {{ render_radio_field(f) }}
        {% else %}
            {{ render_field(f) }}
        {% endif %}
    {% endif %}
    {% endfor %}
    {% endif %}
    <button type="submit" class="{{ btn_class }}">{{ action_text }}</button>
</form>
{%- endmacro %}