from flask_wtf import Form from wtforms import IntegerField from wtforms.validators import NumberRange, Required from wtforms.ext.sqlalchemy.fields import QuerySelectField from sqlalchemy import func from .models import Community, Dataset, Temperature class AKIYearField(IntegerField): def pre_validate(self, form): if form.model.data is not None: ymin, ymax = Temperature.query \ .with_entities(func.min(Temperature.year), func.max(Temperature.year)) \ .filter(Temperature.dataset_id == form.model.data.id).all()[0] self.validators = [NumberRange(min=ymin, max=ymax), Required()] def communities(): return Community.query.order_by('name') def datasets(): return Dataset.query.order_by('datatype', 'model', 'scenario') def dataset_names(ds): return "{0.type} ({0.resolution}) - {0.modelname} {0.scenario}".format(ds) class AKIForm(Form): community = QuerySelectField(query_factory=communities, get_label='name', allow_blank=True, blank_text='---Select a community---', validators=[Required(message='Please select a community')]) minyear = AKIYearField('minyear') maxyear = AKIYearField('maxyear') model = QuerySelectField(query_factory=datasets, get_label=dataset_names, allow_blank=True, blank_text='---Select a dataset---', validators=[Required(message='Please select a dataset')])