class RuleForm(FlaskForm): location = StringField('Location', validators=[DataRequired()], render_kw={'placeholder': 'Location'}) latitude = FloatField('latitude', widget=HiddenInput(), validators=[DataRequired()]) longitude = FloatField('longitude', widget=HiddenInput(), validators=[DataRequired()]) daysOfTheWeek = [(0, 'Monday'), (1, 'Tuesday'), (2, 'Wednesday'), (3, 'Thursday'), (4, 'Friday'), (5, 'Saturday'), (6, 'Sunday')] days = SelectField('Days', choices=daysOfTheWeek, coerce=int, validators=[DataRequired()]) time = TimeField('Time', validators=[DataRequired()]) # appendDate = BooleanField('Add Date') activity_name = StringField('Activity Name', validators=[DataRequired()], render_kw={'placeholder': 'Activity name'}) submit = SubmitField('New Rule') def validate_location(self, field): current_app.logger.debug(field.data, self.days.data, self.time.data) rule_day = timedelta(days=self.days.data) rule_time = self.time.data provisional_rule = current_user.make_rule(address=self.location.data, latitude=self.latitude, longitude=self.longitude, day_and_time=datetime.combine((ARBITRARY_MONDAY + rule_day), rule_time), activity_name='') if current_user.check_rules_for_match(provisional_rule) is not None: raise ValidationError('This overlaps with an already-existing rule')
class ProjectUpdateForm(ProjectForm): id = IntegerField(label=None, widget=HiddenInput()) description = TextAreaField(lazy_gettext('Description'), [validators.Required( message=lazy_gettext( "You must provide a description.")), validators.Length(max=255)]) long_description = TextAreaField(lazy_gettext('Long Description')) allow_anonymous_contributors = BooleanField(lazy_gettext('Allow Anonymous Contributors')) zip_download = BooleanField(lazy_gettext('Allow ZIP data download')) category_id = SelectField(lazy_gettext('Category'), coerce=int) protect = BooleanField(lazy_gettext('Protect with a password?')) password = TextField(lazy_gettext('Password')) webhook = TextField(lazy_gettext('Webhook'), [pb_validator.Webhook()])
class BulkTaskTwitterImportForm(Form): form_name = TextField(label=None, widget=HiddenInput(), default='twitter') msg_required = lazy_gettext("You must provide some source for the tweets") source = TextField(lazy_gettext('Source'), [validators.Required(message=msg_required)]) max_tweets = IntegerField(lazy_gettext('Number of tweets')) user_credentials = TextField(label=None) def get_import_data(self): return { 'type': 'twitter', 'source': self.source.data, 'max_tweets': self.max_tweets.data, 'user_credentials': self.user_credentials.data, }
class ScheduledChangeExistingPermissionForm(ScheduledChangeTimeForm): """Permissions and username are required when Scheduling a Change that changes an existing Permission because they are needed to find that Permission. Options may also be provided.""" permission = StringField('Permission', validators=[Length(0, 50), InputRequired()]) username = StringField('Username', validators=[Length(0, 100), InputRequired()]) options = JSONStringField(None, 'Options') data_version = IntegerField('data_version', validators=[InputRequired()], widget=HiddenInput()) change_type = SelectField("Change Type", choices=[('update', 'update')])
class BulkTaskEpiCollectPlusImportForm(Form): form_name = TextField(label=None, widget=HiddenInput(), default='epicollect') msg_required = lazy_gettext("You must provide an EpiCollect Plus " "project name") msg_form_required = lazy_gettext("You must provide a Form name " "for the project") epicollect_project = TextField(lazy_gettext('Project Name'), [validators.Required(message=msg_required)]) epicollect_form = TextField(lazy_gettext('Form name'), [validators.Required(message=msg_required)]) def get_import_data(self): return {'type': 'epicollect', 'epicollect_project': self.epicollect_project.data, 'epicollect_form': self.epicollect_form.data}
class ScheduledChangeExistingProductRequiredSignoffForm( ScheduledChangeTimeForm): product = StringField('Product', validators=[Length(0, 15), InputRequired()]) channel = StringField('Channel', validators=[Length(0, 75), InputRequired()]) role = StringField('Role', validators=[InputRequired()]) signoffs_required = IntegerField("Signoffs Required", validators=[InputRequired()]) data_version = IntegerField('data_version', validators=[InputRequired()], widget=HiddenInput()) change_type = SelectField("Change Type", choices=[('update', 'update')])
class UpdateProfileForm(Form): """Form Class for updating PYBOSSA's user Profile.""" id = IntegerField(label=None, widget=HiddenInput()) err_msg = lazy_gettext( "Full name must be between 3 and %(fullname)s " "characters long", fullname=USER_FULLNAME_MAX_LENGTH) fullname = TextField(lazy_gettext('Full name'), [ validators.Length(min=3, max=USER_FULLNAME_MAX_LENGTH, message=err_msg) ]) err_msg = lazy_gettext( "User name must be between 3 and %(username_length)s " "characters long", username_length=USER_NAME_MAX_LENGTH) err_msg_2 = lazy_gettext("The user name is already taken") name = TextField(lazy_gettext('Username'), [ validators.Length(min=3, max=USER_NAME_MAX_LENGTH, message=err_msg), pb_validator.NotAllowedChars(), pb_validator.Unique(user_repo.get_by, 'name', err_msg_2), pb_validator.ReservedName('account', current_app) ]) err_msg = lazy_gettext( "Email must be between 3 and %(email_length)s " "characters long", email_length=EMAIL_MAX_LENGTH) err_msg_2 = lazy_gettext("Email is already taken") email_addr = EmailField(lazy_gettext('Email Address'), [ validators.Length(min=3, max=EMAIL_MAX_LENGTH, message=err_msg), validators.Email(), pb_validator.Unique(user_repo.get_by, 'email_addr', err_msg_2) ]) subscribed = BooleanField(lazy_gettext('Get email notifications')) locale = SelectField(lazy_gettext('Language')) ckan_api = TextField(lazy_gettext('CKAN API Key')) privacy_mode = BooleanField(lazy_gettext('Privacy Mode')) restrict = BooleanField(lazy_gettext('Restrict processing')) def set_locales(self, locales): """Fill the locale.choices.""" choices = [] for locale in locales: choices.append(locale) self.locale.choices = choices
class ProjectUpdateForm(ProjectForm): id = IntegerField(label=None, widget=HiddenInput()) description = TextAreaField(lazy_gettext('Description'), [ validators.Required( message=lazy_gettext("You must provide a description.")), validators.Length(max=255) ]) long_description = TextAreaField(lazy_gettext('Long Description')) allow_anonymous_contributors = SelectField( lazy_gettext('Allow Anonymous Contributors'), choices=[('True', lazy_gettext('Yes')), ('False', lazy_gettext('No'))]) category_id = SelectField(lazy_gettext('Category'), coerce=int) hidden = BooleanField(lazy_gettext('Hide?')) password = TextField( lazy_gettext('Password (leave blank for no password)')) webhook = TextField(lazy_gettext('Webhook'), [pb_validator.Webhook()])
class NewFileForm(Form): ds_name = StringField('Filename', [validators.DataRequired()]) fileName = FileField('File') description = StringField('Filename', [validators.DataRequired()], widget=TextArea()) new_submitted = IntegerField('Submitted', default=0, widget=HiddenInput()) def __init__(self, *args, **kwargs): super(NewFileForm, self).__init__(*args, **kwargs) def validate(self): return super(NewFileForm, self).validate() def populate_obj(self, obj): super(NewFileForm, self).populate_obj(obj)
class EditForm(FlaskForm): def __init__(self, *args, **kwargs): super(EditForm, self).__init__(*args, **kwargs) self.status.choices = list( zip(Asset.Status.get_list(), Asset.Status.get_list())) name = StringField('Naam') quantity = IntegerField('Aantal', default=1) location = StringField('Locatie') qr_code = StringField('QR', validators=[QRisValid(), UniqueQR()], render_kw={'autofocus': 'true'}) status = SelectField('Status', validators=[DataRequired()]) purchase = QuerySelectField('Aankoop', query_factory=get_purchases) serial = StringField('SerieNr') id = IntegerField(widget=HiddenInput())
class PaymentForm(FlaskForm): short_user_description = StringField('Korte beschrijving', validators=[Length(max=50)]) long_user_description = TextAreaField('Lange beschrijving', validators=[Length(max=2000)]) created = DateField('Datum (notatie: 2020-12-31)') hidden = BooleanField('Transactie verbergen') category_id = SelectField('Categorie', validators=[Optional()], choices=[]) route = SelectField('Route', choices=['inbesteding', 'aanbesteding', 'subsidie']) id = IntegerField(widget=HiddenInput()) submit = SubmitField('Opslaan', render_kw={'class': 'btn btn-info'}) # Only manually added payments are allowed to be removed remove = SubmitField('Verwijderen', render_kw={'class': 'btn btn-danger'})
class ScheduledChangeDeletePermissionForm(ScheduledChangeTimeForm): """Permissions and username are required when Scheduling a Change that deletes an existing Permission because they are needed to find that Permission.""" permission = StringField('Permission', validators=[Length(0, 50), InputRequired()]) username = StringField('Username', validators=[Length(0, 100), InputRequired()]) data_version = IntegerField('data_version', validators=[InputRequired()], widget=HiddenInput()) change_type = SelectField("Change Type", choices=[('insert', 'insert'), ('update', 'update'), ('delete', 'delete')])
class MuniForm(Form): region = SelectMultipleField('Municipality', [validators.DataRequired()]) top_tier = SelectField('Cube', [validators.DataRequired()]) lower_tier = SelectField('Category', [validators.DataRequired()], coerce=str) year = SelectMultipleField('Year', [validators.DataRequired()]) data_type = SelectField('Year', [validators.DataRequired()]) muni_submitted = IntegerField('Submitted', default=0, widget=HiddenInput()) def __init__(self, *args, **kwargs): super(MuniForm, self).__init__(*args, **kwargs) self.region.choices = [[str(c.id), str(c.re_name)] for c in WaziRegion.all()] with app.open_resource('static/MuniKeys.json') as f: M = json.load(f) munikeys = [ 'Aged Creditor Analysis', 'Aged Debtor Analysis', 'Balance Sheet', 'Capital Acquisition', 'Cash Flow', 'Income and Expenditure', 'Repairs and Maintenance', 'Unauthorised, Irregular, Fruitless and Wasteful Expenditure' ] self.top_tier.choices = [[str(P), str(m)] for P, m in zip(sorted(M.keys()), munikeys)] Set = [] for m in M.keys(): for n in M[m].keys(): Set.append([n, M[m][n]]) self.lower_tier.choices = [[n, m] for n, m in Set] self.year.choices = [[str(i), str(y)] for i, y in enumerate(range(2012, 2017))] self.data_type.choices = [['AUDA', 'Audited Actual Budget'], ['ADJB', 'Adjusted Budget'], ['ORGB', 'Original Budget']] def validate(self): return super(MuniForm, self).validate() def populate_obj(self, obj): super(MuniForm, self).populate_obj(obj)
class UpdateProfileForm(Form): """Form Class for updating PyBossa's user Profile.""" id = IntegerField(label=None, widget=HiddenInput()) err_msg = lazy_gettext("Full name must be between 3 and 35 " "characters long") fullname = TextField(lazy_gettext('Full name'), [validators.Length(min=3, max=35, message=err_msg)]) err_msg = lazy_gettext("User name must be between 3 and 35 " "characters long") err_msg_2 = lazy_gettext("The user name is already taken") name = TextField(lazy_gettext('Username'), [validators.Length(min=3, max=35, message=err_msg), pb_validator.NotAllowedChars(), pb_validator.Unique( db.session, User, User.name, err_msg_2)]) err_msg = lazy_gettext("Email must be between 3 and 35 characters long") err_msg_2 = lazy_gettext("Email is already taken") email_addr = TextField(lazy_gettext('Email Address'), [validators.Length(min=3, max=35, message=err_msg), validators.Email(), pb_validator.Unique( db.session, User, User.email_addr, err_msg_2)]) locale = SelectField(lazy_gettext('Language')) ckan_api = TextField(lazy_gettext('CKAN API Key')) privacy_mode = BooleanField(lazy_gettext('Privacy Mode')) def set_locales(self, locales): """Fill the locale.choices.""" choices = [] for locale in locales: if locale == 'en': lang = gettext("English") if locale == 'es': lang = gettext("Spanish") if locale == 'fr': lang = gettext("French") if locale == 'pt': lang = gettext("Portuguese") choices.append((locale, lang)) self.locale.choices = choices
def set_group_mode(self, group_idx, group_area_idx): ''' 개인 신청인지 단체의 멤버신청인지 정해줌''' self.group_yn = True self.userid.widget = HiddenInput() self.pwd.widget = HiddenInput() self.pwd2.widget = HiddenInput() self.area_idx.widget = HiddenInput() self.group_idx = group_idx self.group_area_idx = group_area_idx self.sch1.widget = HiddenInput() self.sch2.widget = HiddenInput()
class AnnouncementForm(Form): id = IntegerField(label=None, widget=HiddenInput()) title = TextField(lazy_gettext('Title'), [ validators.Required( message=lazy_gettext("You must enter a title for the post.")) ]) body = TextAreaField(lazy_gettext('Body'), [ validators.Required( message=lazy_gettext("You must enter some text for the post.")) ]) info = TextField(lazy_gettext('Info'), [ validators.Required( message=lazy_gettext("You must enter a level for the post.")), is_json(dict) ]) media_url = TextField(lazy_gettext('URL')) published = BooleanField(lazy_gettext('Publish'))
class BulkTaskLocalCSVImportForm(Form): form_name = TextField(label=None, widget=HiddenInput(), default='localCSV') do_not_validate_tp = BooleanField(label=lazy_gettext( "Do not require all fields used in task presenter code to be present in the csv file" ), default=False) _allowed_extensions = set(['csv']) def _allowed_file(self, filename): return '.' in filename and \ filename.rsplit('.', 1)[1] in self._allowed_extensions def _container(self): return "user_%d" % current_user.id def _upload_path(self): container = self._container() filepath = None if isinstance(uploader, local.LocalUploader): filepath = safe_join(uploader.upload_folder, container) if not os.path.isdir(filepath): os.makedirs(filepath) return filepath current_app.logger.error( 'Failed to generate upload path {0}'.format(filepath)) raise IOError('Local Upload folder is missing: {0}'.format(filepath)) def get_import_data(self): def get_csv_filename(): if request.method != 'POST': return if 'file' not in request.files: return csv_file = request.files['file'] if csv_file.filename == '': return if csv_file and self._allowed_file(csv_file.filename): return get_file_path_for_import_csv(csv_file) return { 'type': 'localCSV', 'csv_filename': get_csv_filename(), 'validate_tp': not self.do_not_validate_tp.data }
class MyDataForm(Form): ds_id = SelectField('Dataset Name', [validators.DataRequired()]) my_submitted = IntegerField('Submitted', default=0, widget=HiddenInput()) def __init__(self, *args, **kwargs): super(MyDataForm, self).__init__(*args, **kwargs) query = db.session.query(UserSet.id, UserSet.ds_title).filter(UserSet.user_id == current_user.id).order_by( UserSet.ds_title) self.ds_id.choices = [[str(i), str(n)] for i, n in query] def validate(self): return super(MyDataForm, self).validate() def populate_obj(self, obj): super(MyDataForm, self).populate_obj(obj)
class ViewForm(FlaskForm): def __init__(self, *args, **kwargs): super(ViewForm, self).__init__(*args, **kwargs) self.category_id.choices = DeviceCategory.get_list_for_select() category_id = SelectField('Categorie', render_kw={'readonly': ''}) brand = StringField('Merk', render_kw={'readonly': ''}) type = StringField('Type', render_kw={'readonly': ''}) power = DecimalField('Vermogen', render_kw={'readonly': ''}) ce = BooleanField('CE', render_kw={'disabled': ''}) control_template = StringField('Inspectie Fiche', render_kw={'readonly': ''}) risk_analysis = StringField('Risicoanalyse', render_kw={'readonly': ''}) manual = StringField('Handleiding', render_kw={'readonly': ''}) safety_information = StringField('VIK', render_kw={'readonly': ''}) photo = StringField('Foto', render_kw={'readonly': ''}) id = IntegerField(widget=HiddenInput(), render_kw={'readonly': ''})
class EditForm(FlaskForm): def __init__(self, *args, **kwargs): super(EditForm, self).__init__(*args, **kwargs) self.commissioning.choices = list( zip([''] + get_doc_list('commissioning'), [''] + get_doc_list('commissioning'))) invoice = StringField('Factuur') since = DateField('Datum', validators=[DataRequired()], format='%d-%m-%Y', default=datetime.date.today) value = DecimalField('Bedrag (€)', default=0.0) supplier = QuerySelectField('Leverancier', query_factory=get_suppliers) device = QuerySelectField('Toestel', query_factory=get_devices) commissioning = NonValidatingSelectFields('Indienststelling') id = IntegerField(widget=HiddenInput())
class ScheduledChangeExistingReleaseForm(ScheduledChangeTimeForm): """Name must be provided when Scheduling a Change that modifies an existing Release so that we can identify it. Other Release fields (product, data) are optional.""" name = StringField('Name', validators=[InputRequired()]) product = StringField('Product', validators=[Optional()]) data = JSONStringField({}, 'Data', validators=[Optional()], widget=FileInput()) data_version = IntegerField('data_version', validators=[InputRequired()], widget=HiddenInput()) change_type = SelectField("Change Type", choices=[('insert', 'insert'), ('update', 'update'), ('delete'), ('delete')])
class InsideVerificationForm(Form): standard = StringField(u'Standard', widget=HiddenInput()) student = StringField(u'Student Name (Full Name)', widget=TextInput(),validators=[validators.input_required(message=NO_INPUT_ERROR)]) verifier_name = StringField(u'Teacher name (Verifier)', widget=TextInput(),validators=[validators.input_required(message=NO_INPUT_ERROR)]) verifier_school = StringField(u'School of Verifier', widget=TextInput()) verifier_school_other = StringField(u'Other - School of Verifier', widget=TextInput()) verifiers_grade = SelectField(u'Assessment Judgement of Verifier', widget=Select(), choices=GRADES, validators=[validators.NoneOf(values='No Grade',message='Please enter appropriate grade')]) markers_grade = SelectField(u'Markers assessment judgement', widget=Select(), choices=GRADES,validators=[validators.optional()]) reported_grade = SelectField(u'Reported assessment judegement', widget=Select(), choices=GRADES,validators=[validators.optional()]) # tic = AllStaffData(u'Teacher in Charge', widget=Select(),validators=[validators.optional()]) discussion = StringField(u'Discussion', widget=TextArea(),validators=[validators.optional()]) finished = BooleanField(u"<p id='finished_p'>", widget=CheckboxInput(),validators=[validators.required(message="The sign off box above must be checked to submit data")])
class ShopForm(Form): shop_name = StringField(label="店铺名称", validators=[ validators.DataRequired(message="必填项"), validators.Length(max=20, message="名称过长") ], render_kw={ "class": "form-control", "placeholder": "店铺名称" }) brand = BooleanField(label="品牌", default=False) on_time = BooleanField(label="准时送达", default=False) fengniao = BooleanField(label="蜂鸟配送", default=False) bao = BooleanField(label="保险", default=False) fapiao = BooleanField(label="发票", default=False) zhun = BooleanField(label="准标识", default=False) start_send = FloatField( label="起送价格", validators=[validators.DataRequired(message="必填项")], render_kw={ "class": "form-control", "placeholder": "起送价格" }) send_cost = FloatField(label="配送费", validators=[validators.DataRequired(message="必填项")], render_kw={ "class": "form-control", "placeholder": "配送费" }) notice = StringField(label="店铺公告", validators=[validators.DataRequired(message="必填项")], render_kw={ "class": "form-control", "placeholder": "店铺公告" }) discount = StringField(label="优惠信息", validators=[validators.DataRequired(message="必填项")], render_kw={ "class": "form-control", "placeholder": "优惠信息" }) shop_img = StringField(label="店铺图片", id="image-input", render_kw={"class": "form-control"}, widget=HiddenInput())
class ProjectForm(FlaskForm): name = StringField('Naam', validators=[DataRequired(), Length(max=120)]) description = TextAreaField('Beschrijving', validators=[DataRequired()]) contains_subprojects = BooleanField( 'Uitgaven van dit project gebeuren via subrekeningen en subprojecten', render_kw={ 'checked': '', 'value': 'y' }) hidden = BooleanField('Project verbergen') hidden_sponsors = BooleanField('Sponsoren verbergen') budget = IntegerField('Budget voor dit project', validators=[Optional()]) iban = SelectField('IBAN', validators=[Optional()], choices=[]) id = IntegerField(widget=HiddenInput()) submit = SubmitField('Opslaan', render_kw={'class': 'btn btn-info'}) remove = SubmitField('Verwijderen', render_kw={'class': 'btn btn-danger'})
class ObjectField(Field): widget = HiddenInput() def __init__(self, label='', validators=None, model=None, **kwargs): super(ObjectField, self).__init__(label, validators, **kwargs) self.model = model def _value(self): if self.data: return str(self.data.id) else: return u'' def process_formdata(self, valuelist): if valuelist: self.data = self.model.query.get(valuelist[0]) else: self.data = []
class BulkTaskIIIFImportForm(Form): form_name = TextField(label=None, widget=HiddenInput(), default='iiif') msg_required = lazy_gettext("You must provide a URL") msg_url = lazy_gettext("Oops! That's not a valid URL. " "You must provide a valid URL") manifest_uri = TextField(lazy_gettext('URL'), [validators.Required(message=msg_required), validators.URL(message=msg_url)]) version = SelectField(lazy_gettext('Presentation API version'), choices=[ (ctx, ctx) for ctx in ManifestReader.contexts ], default='2.1') def get_import_data(self): return { 'type': 'iiif', 'manifest_uri': self.manifest_uri.data, 'version': self.version.data }
class ContactForm(FlaskForm): release = StringField('Release', widget=HiddenInput()) first_name = StringField('First Name', validators=[InputRequired()]) last_name = StringField( 'Last Name', validators=[InputRequired()], ) email = StringField('Email', validators=[Email()]) phone = StringField('Phone Number', validators=[], render_kw={"placeholder": "optional"}) company = StringField('Company', validators=[InputRequired()]) company_website = StringField('Company Site', validators=[]) use_case = StringField( '', widget=TextArea(), render_kw={"placeholder": "describe here your use case"}) recaptcha = RecaptchaField()
def register(self, **kwargs): for key, rel in kwargs.items(): if key in self.store: return if isinstance(rel, dj.Computed) or \ isinstance(rel, dj.Imported) or \ isinstance(rel, dj.Part): raise dj.DataJointError( "Data should not be entered directly in Computed, Imported, or Subordinate tables." ) class ReturnValue(wtf.Form): _rel = rel @classmethod def append_field(cls, name, field): setattr(cls, name, field) return cls def insert(self2, replace=False): rel = self2._rel dat = {} for k, v in self2._fields.items(): if v.data is not None and k != 'REFERRER': # was not specified and is also not required if isinstance(v.data, datetime.datetime) or isinstance( v.data, datetime.date): dat[k] = str(v.data) else: dat[k] = v.data rel.insert1(dat, replace=replace) ReturnValue.required = OrderedDict() for name, attr in rel.heading.attributes.items(): ReturnValue.append_field(name, field_factory(attr)) #setattr(ReturnValue, name, field_factory(attr)) ReturnValue.required[ name] = not attr.nullable and attr.default is None ReturnValue.append_field( 'REFERRER', wtf.StringField(label='REFERRER', widget=HiddenInput())) self.store[key] = ReturnValue
class CustomSelectField(Field): widget = HiddenInput() def __init__(self, label='', validators=None, multiple=False, choices=[], allow_custom=True, **kwargs): super(CustomSelectField, self).__init__(label, validators, **kwargs) self.multiple = multiple self.choices = choices self.allow_custom = allow_custom def _value(self): return text_type(self.data) if self.data is not None else '' def process_formdata(self, valuelist): if valuelist: self.data = valuelist[1] self.raw_data = [valuelist[1]] else: self.data = ''
class ApplicationForm(FlaskForm): #identity full_name = StringField('Full Name', validators=[validators.DataRequired()]) email = more_fields.EmailField('Email Address', validators=[validators.DataRequired(), validators.Email()]) # Requirements license = BooleanField('Licensed Driver') insurance = BooleanField('Insured') l_plate = StringField('License Plate') state = BooleanField('Registration State') consent = BooleanField('Parent/Guardian Written Consent') grade = SelectField(choices=[(9,'9th'), (10,'10th'), (11, '11th'), (12, '12th')]) # vehicle make = StringField('Vehicle Manufacturer') model = StringField('Model') year = StringField('Vehicle Year') # eligibility internship = BooleanField('Internship') d_enrollment = BooleanField('Dual Enrollment') service = BooleanField('Community Service') job = BooleanField('Weekday Work Hours') athletics_carpool = BooleanField('Team Carpool Host') athletics_captain = BooleanField('Athletic Captian') athletics = BooleanField('Seasonal Athlete') extracurricular = BooleanField('extracurricular Activities') sga = BooleanField('Student Government') media_production = BooleanField('Media Production') gpa = BooleanField('GPA Advantage') distance = BooleanField('Prohibitive Commute') weekday_job = BooleanField('weekday_job') attendance = BooleanField('Attendance Advantage') narrative = StringField('Explanation', widget=TextArea(), validators=[validators.DataRequired()]) timestamp = DateTimeField('',widget=HiddenInput()) submit = SubmitField('Submit')