def validate(self, form, extra_validators=tuple()): self.errors = [] success = True field = HiddenField(validators=self.validators, _form=form, _name='item') if self.data is None: self.data = [] for value in self.data: field.data = value if not field.validate(form, extra_validators): success = False self.errors.extend(field.errors) return success
class EmailEventPersonsForm(IndicoForm): from_address = SelectField(_('From'), [DataRequired()]) subject = StringField(_('Subject'), [DataRequired()]) body = TextAreaField(_('Email body'), [DataRequired()], widget=CKEditorWidget(simple=True, images=True)) recipients = IndicoEmailRecipientsField(_('Recipients')) copy_for_sender = BooleanField( _('Send copy to me'), widget=SwitchWidget(), description=_('Send copy of each email to my mailbox')) person_id = HiddenFieldList() user_id = HiddenFieldList() submitted = HiddenField() def __init__(self, *args, **kwargs): register_link = kwargs.pop('register_link') event = kwargs.pop('event') super(EmailEventPersonsForm, self).__init__(*args, **kwargs) self.from_address.choices = event.get_allowed_sender_emails().items() self.body.description = render_placeholder_info( 'event-persons-email', event=None, person=None, register_link=register_link) def is_submitted(self): return super(EmailEventPersonsForm, self).is_submitted() and 'submitted' in request.form
class LoginForm(FlaskForm): # pylint: disable=too-few-public-methods """Login data.""" ident = StringField("Identifier", [DataRequired(), Length(max=1000)]) password = PasswordField("Password", [DataRequired(), Length(max=1000)]) next_url = HiddenField() submit_login = SubmitField("Login")
class BulkAbstractJudgmentForm(AbstractJudgmentFormBase): judgment = HiddenEnumField(enum=AbstractAction, skip={AbstractAction.change_tracks}) abstract_id = HiddenFieldList() submitted = HiddenField() def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') super(BulkAbstractJudgmentForm, self).__init__(*args, **kwargs) self.duplicate_of.excluded_abstract_ids = set(kwargs['abstract_id']) self.merged_into.excluded_abstract_ids = set(kwargs['abstract_id']) if kwargs['judgment']: self._remove_unused_fields(kwargs['judgment']) def _remove_unused_fields(self, judgment): for field in list(self): validator = next( (v for v in field.validators if isinstance(v, HiddenUnless) and v.field == 'judgment'), None) if validator is None: continue if not any(v.name == judgment for v in validator.value): delattr(self, field.name) def is_submitted(self): return super(BulkAbstractJudgmentForm, self).is_submitted() and 'submitted' in request.form
class EmailEventPersonsForm(IndicoForm): from_address = SelectField(_('From'), [DataRequired()]) subject = StringField(_('Subject'), [DataRequired()]) body = TextAreaField(_('Email body'), [DataRequired()], widget=CKEditorWidget(simple=True)) recipients = IndicoEmailRecipientsField(_('Recipients')) copy_for_sender = BooleanField( _('Send copy to me'), widget=SwitchWidget(), description=_('Send copy of each email to my mailbox')) person_id = HiddenFieldList() user_id = HiddenFieldList() submitted = HiddenField() def __init__(self, *args, **kwargs): register_link = kwargs.pop('register_link') super(EmailEventPersonsForm, self).__init__(*args, **kwargs) from_addresses = [ '{} <{}>'.format(session.user.full_name, email) for email in sorted(session.user.all_emails, key=lambda x: x != session.user.email) ] self.from_address.choices = zip(from_addresses, from_addresses) self.body.description = render_placeholder_info( 'event-persons-email', event=None, person=None, register_link=register_link) def is_submitted(self): return super(EmailEventPersonsForm, self).is_submitted() and 'submitted' in request.form
class ReauthForm(Form): next = HiddenField() password = PasswordField( u'Password', [DataRequired(), Length(PASSWORD_LEN_MIN, PASSWORD_LEN_MAX)]) submit = SubmitField('Reauthenticate')
class InvitationForm(IndicoForm): from_address = SelectField(_('From'), [DataRequired()]) subject = StringField(_('Subject'), [DataRequired()]) body = TextAreaField(_('Email body'), [DataRequired()], widget=CKEditorWidget(simple=True)) recipients = EmailListField(_('Recipients'), [DataRequired()], description=_('One email address per line.')) copy_for_sender = BooleanField(_('Send copy to me'), widget=SwitchWidget()) submitted = HiddenField() def __init__(self, *args, **kwargs): event = kwargs.pop('event') super(InvitationForm, self).__init__(*args, **kwargs) self.from_address.choices = event.get_allowed_sender_emails().items() self.body.description = render_placeholder_info('survey-link-email', event=None, survey=None) def is_submitted(self): return super(InvitationForm, self).is_submitted() and 'submitted' in request.form def validate_body(self, field): missing = get_missing_placeholders('survey-link-email', field.data, event=None, survey=None) if missing: raise ValidationError( _('Missing placeholders: {}').format(', '.join(missing)))
class AddChecklistItemForm(Form): item_text = StringField( 'Checklist Item', validators=[InputRequired(), Length(1, 64)]) date = DateField('Deadline', format='%Y-%m-%d', validators=[Optional()]) assignee_ids = HiddenField('Assignee Ids') submit = SubmitField('Add checklist item')
class PromptSearchByWord(FlaskForm): type = HiddenField(default="word") query = SearchField( "Word search", validators=[InputRequired()], render_kw={"placeholder": "braid"}, )
class ListForm(FlaskForm): id = HiddenField() test = HiddenListIntegerField() date = DateField(validators=[Required()], description="Date of purchase") price = DecimalField(validators=[Required()], description="Total price") shop = QuerySelectField( validators=[Required()], query_factory=lambda: Shop.query.order_by(Shop.name), get_label='name', allow_blank=True, blank_text="Select a Shop", description="Shop where purchase took place", ) category = QuerySelectField( query_factory=lambda: Category.query.order_by(Category.name), get_label='name', allow_blank=True, blank_text="Select a category", description="Category of purchase", ) user = QuerySelectField( query_factory=lambda: User.query.order_by(User.name), get_label='username', allow_blank=False, blank_text="Select an Owner", description="User who bought this list.", ) items_obj = QuerySelectMultipleField(validators=[Required()], query_factory=lambda: Item.query, allow_blank=False, get_label=get_item_label)
class UploadEvidence(FlaskForm): """ For to submit evidence for a competence """ file = FileField('Upload Evidence') #TODO edit this so 'Inactivation Request' doesn't show up as an evidence upload type evidence_type = QuerySelectField("What type of evidence do you want to send?",allow_blank=True, blank_text=u'-- please choose --', query_factory=lambda: s.query(EvidenceTypeRef).all(), get_label="type") # All sections in database trainer = SelectField(label="Who was your trainer?") datecompleted = DateField('What date did you attain this evidence?', format='%Y-%m-%d', default=datetime.date.today) datetrained = DateField('What date did you train?', format='%Y-%m-%d', default=datetime.date.today) assessor = SelectField(label="Who will sign-off this evidence?") evidence_observation = TextAreaField(label="Evidence") evidence_discussion = TextAreaField(label="Evidence") case = StringField(label="Case") result = StringField(label="Result") fouryearstatus = RadioField("Is this evidence being submitted for a four year reassessment?", choices=[(1, 'Yes'), (0, 'No')], validators=[DataRequired()] ) assid = HiddenField("AssesmentID") submit = SubmitField('Submit Evidence')
class AttachmentCreateForm(BaseForm): op = HiddenField(default='add') file = FileField('plik załącznika', validators=[FileRequired()]) title = StringField('tytuł') description = TextAreaField('opis') def save(self, page: Page) -> Attachment: obj = Attachment(page=page) file_storage = self.file.data filename = secure_filename(file_storage.filename) root, _ = os.path.splitext(filename) obj.title = self.title.data or root obj.description = self.description.data if obj.description: obj.description_html = markdown(obj.description) target_dir = os.path.join( current_app.instance_path, current_app.config['ATTACHMENTS_DIR'] ) with tempfile.TemporaryDirectory() as tmpdir: temp_filename = os.path.join(tmpdir, filename) file_storage.save(temp_filename) with db.atomic(): file_data = process_incoming_file(temp_filename, target_dir) obj.filename = file_data.filename obj.file_type = file_data.file_type obj.file_size = file_data.file_size obj.save() ChangeRecord.log_change( page=page, change_type=Change.updated, user=current_user, description=f'dodano załącznik {obj.title}', ) return obj
class PhotoForm(Form): id = IntegerField() name = StringField() amount = IntegerField() size = StringField() image = HiddenField() image_file = FileField('Image file')
class AdvancedSearchForm(Form): """Replacement for the 'classic' advanced search interface.""" # pylint: disable=too-few-public-methods advanced = HiddenField('Advanced', default=1) """Used to indicate whether the form should be shown.""" terms = FieldList(FormField(FieldForm), min_entries=1) classification = FormField(ClassificationForm) date = FormField(DateForm) size = SelectField('results per page', default=50, choices=[('25', '25'), ('50', '50'), ('100', '100'), ('200', '200')]) order = SelectField( 'Sort results by', choices=[('-announced_date_first', 'Announcement date (newest first)'), ('announced_date_first', 'Announcement date (oldest first)'), ('-submitted_date', 'Submission date (newest first)'), ('submitted_date', 'Submission date (oldest first)'), ('', 'Relevance')], validators=[validators.Optional()], default='-announced_date_first') include_older_versions = BooleanField('Include older versions of papers') HIDE_ABSTRACTS = 'hide' SHOW_ABSTRACTS = 'show' abstracts = RadioField('Abstracts', choices=[(SHOW_ABSTRACTS, 'Show abstracts'), (HIDE_ABSTRACTS, 'Hide abstracts')], default=SHOW_ABSTRACTS)
class ConflictPreventionForm(CsrfForm): """Implements content conflict prevention to stop two people overwriting each other changes. This form detects the case where user A loads up this form and makes some changes while user B simultaneously loads up the same form and makes some other changes and saves them before user A. """ cp_token = HiddenField( 'Content conflict', validators=[ DataRequired(message="The Content Changes Token is missing"), ]) def process(self, formdata=None, obj=None, **kwargs): super(ConflictPreventionForm, self).process(formdata, obj, **kwargs) self._cp_hash = self._object_hash(obj) if not formdata: self.cp_token.data = self._object_hash(obj) def validate_cp_token(form, cp_token): if not form._cp_hash == cp_token.data: raise ValidationError( "Could not save as the content has become outdated. " "The content has changed since this page was " "initially loaded.") def _object_hash(self, obj): props = vars(obj) fields = {k: v for k, v in props.items() if k in self._fields} return hashlib.md5(pickle.dumps(fields)).hexdigest()
class SeedSubgraphForm(FlaskForm): """Builds the form for seeding by sub-graph.""" node_list = HiddenField('Nodes') seed_method = RadioField( 'Expansion Method', choices=[ (SEED_TYPE_NEIGHBORS, 'Induce a subgraph over the given nodes and expand to their first neighbors' ), (SEED_TYPE_DOUBLE_NEIGHBORS, 'Induce a subgraph over the given nodes and expand to their second neighbors' ), (SEED_TYPE_PATHS, 'Induce a subgraph over the nodes in all shortest paths between the given nodes' ), (SEED_TYPE_UPSTREAM, 'Induce over upstream causal neighbors (2 layers)'), (SEED_TYPE_DOWNSTREAM, 'Induce over downstream causal neighbors (2 layers)'), (SEED_TYPE_INDUCTION, 'Only induce a subgraph over the given nodes'), ], default=SEED_TYPE_NEIGHBORS, ) filter_pathologies = BooleanField('Filter pathology nodes', default=False) submit_subgraph = SubmitField('Submit Subgraph')
class FuncKeyTemplateKeysForm(BaseForm): id = HiddenField() label = StringField(l_('Label'), [Length(max=128)]) digit = IntegerField(validators=[InputRequired()]) destination = FuncKeyDestinationField() blf = BooleanField(l_('BLF'), default=False) submit = SubmitField()
class UserCreationForm(BaseForm): name = StringField(_l('Name'), validators=[DataRequired()]) email = EmailField(_l('Email'), validators=[DataRequired()]) password = PasswordField(_l('Password'), validators=[DataRequired()]) avatar = FileField(_l('Avatar'), render_kw={ 'accept': 'image/png, image/jpeg, image/jpg', 'onchange': 'loadImage(this)' }) hidden_img = HiddenField(validators=[DataRequired()]) def validate_email(self, field): email = field.data.lower() user = User.query.filter_by(email=email).first() if user: raise StopValidation(_l('Email has been registered.')) def signup(self): name = self.name.data email = self.email.data.lower() image = save_image(self.hidden_img.data) user = User(name=name, email=email, image_filename=image) user.password = self.password.data with db.auto_commit(): db.session.add(user) login(user, True) return user
class ChatForm(Form): """ A simple Chat form. Will create Chat messages and may provide a Chat object, if found, to the View. """ source = HiddenField('source') name = TextField('name', validators=[DataRequired()]) message = TextAreaField('message', validators=[DataRequired()]) def __init__(self, *args, **kwargs): """ Register a new a Chat object via a Chat class helper @param args: Arguments, in order of definition in class @param kwargs: Keyword based Arguments, in any order """ Form.__init__(self, *args, **kwargs) self.channel = None def validate(self): """ Do validation of the form contents. @return: True if the Chat object was successfully created, or False if it was not. """ rv = Form.validate(self) if not rv: flash('A required field is empty', 'error') return False message = Chat.make(self.source.data, self.name.data, self.message.data) if message is not None: return True else: return False
class SignupForm(Form): next = HiddenField() email = EmailField(u'Email', [DataRequired(), Email()], description=u"What's your email address?") password = PasswordField( u'Password', [DataRequired(), Length(PASSWORD_LEN_MIN, PASSWORD_LEN_MAX)], description=u'%s characters or more! Be tricky.' % PASSWORD_LEN_MIN) name = TextField( u'Choose your username', [DataRequired(), Length(USERNAME_LEN_MIN, USERNAME_LEN_MAX)], description=u"Don't worry. you can change it later.") agree = BooleanField( u'Agree to the ' + Markup('<a target="blank" href="/terms">Terms of Servic</a>'), [DataRequired()]) submit = SubmitField('Sign up') def validate_name(self, field): if Models.User.objects(name=field.data).first() is not None: raise ValidationError(u'This username is taken') def validate_email(self, field): if Models.User.objects(account__email=field.data).first() is not None: raise ValidationError(u'This email is taken')
class EnvironmentForm(Form): environment_id = HiddenField() environment_name = HiddenField() role = SelectField( environment_name, choices=ENV_ROLES, default=NO_ACCESS, filters=[lambda x: None if x == "None" else x], ) @property def data(self): _data = super().data if "role" in _data and _data["role"] == NO_ACCESS: _data["role"] = None return _data
class JobForm(FlaskForm): base_args = FormField(JobBaseForm) cron_trigger_args = FormField(CronForm) date_trigger_args = FormField(DateForm) interval_trigger_args = FormField(IntervalForm) type = HiddenField("Type") submit = SubmitField("Apply") def validate(self): current_app.logger.info("----------BEGIN FORM VALIDATE----------") results = True if not FlaskForm.validate(self.base_args.form): current_app.logger.info("Base Form Not Validate") results = False if self.base_args.trigger.data == "cron" and not self.cron_trigger_args.validate( self): current_app.logger.info("Cron Form Not Validate") results = False if self.base_args.trigger.data == "date" and not self.date_trigger_args.validate( self): current_app.logger.info("Date Form Not Validate") results = False if self.base_args.trigger.data == "interval" and not self.interval_trigger_args.validate( self): current_app.logger.info("Interval Form Not Validate") results = False current_app.logger.info("Final Results: {}".format(results)) current_app.logger.info("----------END FORM VALIDATE----------") return results
class TaskForm(FlaskForm): """ 任务表单 """ id = HiddenField('任务ID', validators=[Length(0, 64, message='任务ID长度不超过64个字符')]) name = StringField( '任务名称', validators=[DataRequired(), Length(1, 10, message='任务名称长度不超过10个字符')]) desc = TextAreaField('任务简述', validators=[ DataRequired(), Length(0, 1024, message='任务简述长度不超过1024个字符') ], render_kw={ 'rows': '5', 'placeholder': '对于任务进行简要描述' }) trigger = RadioField('任务类型', choices=TASK_TYPES, validators=[DataRequired()], default=TASK_TYPES[0][0]) time = StringField('触发时间', validators=[DataRequired()]) url = StringField('触发地址', validators=[DataRequired(), URL(message='URL地址格式有误')]) method = RadioField('触发方法', choices=METHODS, validators=[DataRequired()], default=METHODS[0][1]) submit = SubmitField("提交")
class EmailRegistrantsForm(IndicoForm): from_address = SelectField(_("From"), [DataRequired()]) cc_addresses = EmailListField(_("CC"), description=_("Beware, addresses in this field will receive one mail per " "registrant.")) subject = StringField(_("Subject"), [DataRequired()]) body = TextAreaField(_("Email body"), [DataRequired()], widget=CKEditorWidget(simple=True)) recipients = IndicoEmailRecipientsField(_('Recipients')) copy_for_sender = BooleanField(_('Send copy to me'), widget=SwitchWidget(), description=_('Send copy of each email to my mailbox')) attach_ticket = BooleanField(_('Attach ticket'), widget=SwitchWidget(), description=_('Attach tickets to emails')) registration_id = HiddenFieldList() submitted = HiddenField() def __init__(self, *args, **kwargs): self.regform = kwargs.pop('regform') event = self.regform.event super(EmailRegistrantsForm, self).__init__(*args, **kwargs) self.from_address.choices = event.get_allowed_sender_emails().items() self.body.description = render_placeholder_info('registration-email', regform=self.regform, registration=None) def validate_body(self, field): missing = get_missing_placeholders('registration-email', field.data, regform=self.regform, registration=None) if missing: raise ValidationError(_('Missing placeholders: {}').format(', '.join(missing))) def is_submitted(self): return super(EmailRegistrantsForm, self).is_submitted() and 'submitted' in request.form
class BadgeSettingsForm(IndicoForm): template = SelectField(_('Template')) save_values = BooleanField(_("Save values for next time"), widget=SwitchWidget(), description=_("Save these values in the event settings")) dashed_border = BooleanField(_("Dashed border around each badge"), widget=SwitchWidget(), description=_("Display a dashed border around each badge")) page_size = IndicoEnumSelectField(_('Page size'), enum=PageSize, sorted=True) page_orientation = IndicoEnumSelectField(_('Page orientation'), enum=PageOrientation) page_layout = IndicoEnumSelectField(_('Page layout'), enum=PageLayout, description=_('The single sided (foldable) option is only available if the ' 'template orientation is the same as the page orientation and ' 'its width is exactly half of the page width')) top_margin = FloatField(_('Top margin'), [InputRequired()]) left_margin = FloatField(_('Left margin'), [InputRequired()]) right_margin = FloatField(_('Right margin'), [InputRequired()]) bottom_margin = FloatField(_('Bottom margin'), [InputRequired()]) margin_columns = FloatField(_('Margin between columns'), [InputRequired()]) margin_rows = FloatField(_('Margin between rows'), [InputRequired()]) submitted = HiddenField() def __init__(self, event, **kwargs): all_templates = set(event.designer_templates) | get_inherited_templates(event) badge_templates = [tpl for tpl in all_templates if tpl.type.name == 'badge'] tickets = kwargs.pop('tickets') super(BadgeSettingsForm, self).__init__(**kwargs) self.template.choices = sorted(((unicode(tpl.id), tpl.title) for tpl in badge_templates if tpl.is_ticket == tickets), key=itemgetter(1)) def is_submitted(self): return super(BadgeSettingsForm, self).is_submitted() and 'submitted' in request.form
class FavoritesNewForm(Form): """ 新建 Favorites 的表单 """ title = TextField(_("favorites.title"), description=u'标题', validators=[ required(message=_("title is required")), length(min=1, max=100, message=_("Length range: 1 - 100")) ]) tags = TextField(_("favorites.tags"), description=u'标签', validators=[ length(min=1, max=512, message=_("Length range: 1 - 512")) ]) description = TextField(_("favorites.description"), description=u'描述', validators=[ required(message=_("description is required")), ]) next = HiddenField() submit = SubmitField(_("Submit"))
class BlastPromoForm(FlaskForm): first_name = StringField( u"First name", [validators.required(message="Your first name is required.")] ) last_name = StringField( u"Last name", [validators.required(message="Your last name is required.")] ) subscriber_email = EmailField( "Subscriber Email address", [validators.DataRequired(), validators.Email()] ) installment_period = HiddenField(u"Installment Period") campaign_id = HiddenField("Campaign ID") referral_id = HiddenField("Referral ID") description = HiddenField(u"Description") pay_fees = BooleanField(u"Agree to pay fees") pay_fees_value = HiddenField(u"Pay Fees Value")
class SplitCategoryForm(IndicoForm): first_category = StringField( _('Category name #1'), [DataRequired()], description=_( 'Selected events will be moved into a new sub-category with this ' 'title.')) second_category = StringField( _('Category name #2'), description= _('Events that were not selected will be moved into a new sub-category ' 'with this title. If omitted, those events will remain in the current ' 'category.')) event_id = HiddenFieldList() all_selected = BooleanField(widget=HiddenCheckbox()) submitted = HiddenField() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if self.all_selected.data: self.event_id.data = [] self.first_category.label.text = _('Category name') self.first_category.description = _( 'The events will be moved into a new sub-category with this title.' ) del self.second_category def is_submitted(self): return super().is_submitted() and 'submitted' in request.form
class BookingForm(Form): clientName = StringField('Вас зовут', validators=[validators.input_required()]) clientPhone = StringField('Ваш телефон', validators=[validators.input_required()]) clientWeekday = HiddenField() clientTime = HiddenField() clientTeacher = HiddenField() def save(self): with open("db/booking.json", "r+") as f: booking = load(f) booking[str(self.clientTeacher.data)][self.clientWeekday.data][ self.clientTime.data] = False f.seek(0) f.write(dumps(booking))
class ContractMetadataForm(FlaskForm): '''Edit a contract's metadata during the renewal process Attributes: financial_id: The :py:class:`~purchasing.data.contracts.ContractBase` financial_id spec_number: The spec number for a contrat. See :py:meth:`~purchasing.data.contracts.ContractBase.get_spec_number` for more information about spec numbers department: The :py:class:`~purchasing.users.models.Department` to set for the contract all_blank: Placeholder to indicate if all other fields are blank ''' financial_id = IntegerField(validators=[Optional()]) spec_number = TextField(validators=[Optional()], filters=[lambda x: x or None]) department = QuerySelectField(query_factory=Department.query_factory, get_pk=lambda i: i.id, get_label=lambda i: i.name, allow_blank=True, blank_text='-----') all_blank = HiddenField(validators=[not_all_hidden]) def post_validate_action(self, action, contract, current_stage): '''Update the contract's metadata Arguments: action: A :py:class:`~purchasing.data.contract_stages.ContractStageActionItem` that needs to be updated with details for the action log contract: A :py:class:`~purchasing.data.contracts.ContractBase` object current_stage: The current :py:class:`~purchasing.data.contract_stages.ContractStage` Returns: The modified :py:class:`~purchasing.data.contract_stages.ContractStageActionItem` with the action detail updated to include the form's data ''' current_app.logger.info( 'CONDUCTOR UPDATE METADATA | Contract update metadata on stage "{}" from contract "{}" (ID: {})' .format(current_stage.name, contract.description, contract.id)) # remove the blank hidden field -- we don't need it data = self.data del data['all_blank'] contract.update_with_spec_number(data) # this process pops off the spec number, so get it back data['spec_number'] = self.data.get('spec_number') # get department if self.data.get('department', None): data['department'] = self.data.get('department').name action.action_detail = data return action
class LocalCredentialsForm(FlaskForm): """Local credentials form, on a per device basis.""" local_creds_used = HiddenField('LocalCredsUsed') user = StringField('Username', validators=[DataRequired()]) pw = PasswordField('Login Password', validators=[DataRequired()]) privpw = PasswordField('Privileged Password (if applicable)')