Source code for quizApp.forms.common
"""Common forms or form elements live here.
"""
from collections import OrderedDict
from flask_wtf import Form
from wtforms import SubmitField, SelectMultipleField, SelectField
from wtforms.validators import DataRequired
from wtforms.widgets.core import CheckboxInput, ListWidget
from wtforms_alchemy import ModelForm
from quizApp.models import ScorecardSettings
[docs]class MultiCheckboxField(SelectMultipleField):
"""Like a SelectMultipleField, but use checkboxes instead,
"""
widget = ListWidget(prefix_label=False)
option_widget = CheckboxInput()
[docs]class ListObjectForm(Form):
"""A form that has a MultiCheckboxField of some objet.
"""
objects = MultiCheckboxField(validators=[DataRequired()])
submit = SubmitField("Submit")
objects_mapping = {}
[docs] def reset_objects(self):
"""Sometimes choices have to be reset.
"""
self.objects.choices = []
[docs] def populate_objects(self, object_pool):
"""Given a list of objects, populate the object field with
choices.
"""
if not self.objects.choices:
self.objects.choices = []
self.objects_mapping = {}
for obj in object_pool:
self.objects_mapping[str(obj.id)] = obj
self.get_choice_tuple(obj)
[docs] def get_choice_tuple(self, obj):
"""Populate the list of choices with the appropriate tuple.
"""
raise NotImplementedError
[docs]class DeleteObjectForm(Form):
"""Display a button to delete some object.
"""
submit = SubmitField("Delete")
[docs]class ObjectTypeForm(Form):
"""Select an object type from a drop down menu.
"""
object_type = SelectField("Type")
submit = SubmitField("Create")
[docs] def populate_object_type(self, mapping):
"""Given a mapping of object types to human readable names, populate
the object_type field.
"""
self.object_type.choices = [(k, v) for k, v in mapping.items()]
[docs]class OrderFormMixin(object):
"""This mixin allows us to set the order of fields in a ModelForm.
To use, specify a ``Meta`` class in your form class and define ``order`` as
an attribute in the ``Meta`` class.
Based on https://gist.github.com/rombr/89d4d9db0229237f40bbd46482764918/
"""
def __init__(self, *args, **kwargs):
super(OrderFormMixin, self).__init__(*args, **kwargs)
field_order = getattr(self.meta, 'order', [])
if field_order:
self.order_fields(field_order)
[docs] def order_fields(self, field_order):
"""Given a field order, order the fields of this form as specified.
"""
visited = set()
new_fields = OrderedDict()
for field_name in field_order:
if field_name not in visited:
if field_name == '*':
for field in self._fields:
if field in visited or field in field_order:
continue
new_fields[field] = self._fields[field]
elif field_name in self._fields:
new_fields[field_name] = self._fields[field_name]
visited.add(field_name)
self._fields = new_fields
[docs]class ScorecardSettingsForm(ModelForm):
"""Form for rendering scorecard options.
"""
class Meta(object):
"""Specify model.
"""
model = ScorecardSettings