class ImageForm(FlaskForm): image = FileField('Choose File', validators=[ file_required(), file_allowed(['pdf', 'doc', 'docx', 'jpg']) ]) language = SelectField('Language', default='English', choices=[('English', 'English'), ('France', 'France'), ('Arabic', 'Arabic')]) submit = SubmitField('Secure')
class NewProductForm(FlaskForm): productOwner = SelectField('Username of owner:', validators=[DataRequired()]) productName = StringField('Product name:', validators=[DataRequired()]) imageFile = FileField("Image", validators=[file_required()]) productPrice = DecimalField("Product price:", widget=NumberInput(0.01, 0.01), validators=[DataRequired()]) create = SubmitField('Create Product')
class ContactImportForm(Form): filename = FileField( _('File'), validators=[file_required(), file_allowed(['csv', 'CSV'])]) def validate_filename(form, field): data = field.data.readlines() linenum = 1 for line in data: if not len(line.split(',')) == 2: msg = _('CSV file is broken, line %(linenum)s', linenum=linenum) raise ValidationError(msg) elif not line[0].isdigit(): raise ValidationError( _( 'The first column does not contain phone ' 'number, line %(linenum)s', linenum=linenum)) linenum += 1 field.data.seek(0)
class UploadForm(Form): file = FileField(validators=(file_required(), ))
class TextUploadForm(Form): upload = FileField("Upload file", validators=[file_required(), file_allowed(['txt'])])
class ImageUploadForm(Form): upload = FileField("Upload file", validators=[file_required(), file_allowed(images)])
class BulkSyncDagenForm(FlaskForm): template_id = SelectField( 'Template ID', validators=(validators.required(), ), ) csv_data = FileField( 'Choose CSV file', validators=(file_required(), cron_dump_csv), description= 'Please pick a CSV file containing all the required DAGs (relevant to this template) to generate' ) mark_approved = BooleanField( 'Mark approved?', default=False, description= 'Additionally mark all the new DAG versions as approved if checked.') def __init__(self, templates=[], has_approve_perm=True, **kwargs): super().__init__(**kwargs) if not has_approve_perm: del self.mark_approved self.template_id.choices = tuple(zip(templates, templates)) async def process_row(self, row) -> (bool, str): form = self.tmpl_clazz.as_form(data=row) is_valid = form.validate() if is_valid: cleaned_data = form.process_form_data(**form.data) dag_id = cleaned_data['dag_id'] dbDag = self.dagmap.get(dag_id, None) is_update = dbDag is not None if is_update: is_success = form.update(dbDag, self.user) else: dbDag = form.create(self.template_id.data, self.user) is_success = dbDag is not None if is_success: self.dagmap[dbDag.dag_id] = dbDag msg = None if is_valid and is_success: msg = f'{dbDag.version_str} {"updated" if is_update else "created"} successfully' elif is_valid: if is_update: msg = f'{dbDag.version_str} unchanged' # version unchanged is a success condition and should be shown to user # as such, hence set it to True here is_success = True if msg is None: msg = f'Encounted errors: {json.dumps(form.errors)}' is_success = is_valid and is_success # handle missing 'mark_approved' field f_mark_approved = getattr(self, 'mark_approved', None) if f_mark_approved and f_mark_approved.data and is_success: try: self.version_qs.approve_live_version(dag_id, self.user.id) except ValueError as e: msg = f'{msg}\nApproval failed: {e}' else: msg = f'{msg}\nApproved successfully' return is_success, msg async def asyncSave(self): # dag_qs needed to load versions later self.version_qs = DagenDagVersionQueryset() # HACK: eager load versions here so update works existing = DagenDagQueryset().get_all(eager_load_versions=True) self.dagmap = {dbDag.dag_id: dbDag for dbDag in existing} self.tmpl_clazz = get_template_loader().get_template_class( self.template_id.data) # FileStorage uses BytesIO stream so first read, decode and convert to StringIO stream stream = StringIO(self.csv_data.data.read().decode('UTF-8')) # Close the file object self.csv_data.data.close() cronreader = csv.DictReader(stream) result = await async_gather_dict( {row['dag_id']: self.process_row(row) for row in cronreader}) self.version_qs.done() return result def save(self, user): self.user = user return async_loop.run_until_complete(self.asyncSave())
class UploadForm(Form): avatar = FileField( validators=[file_required(), file_allowed(['jpg', 'gif', 'png'])]) desc = StringField(validators=[InputRequired()])
class UploadForm(FlaskForm): photo = FileField( 'Upload Image', validators=[file_required(), file_allowed(['png', 'jpg'])]) submit = SubmitField('Upload')