from flask_wtf import FlaskForm from werkzeug.utils import secure_filename from wtforms import (BooleanField, FileField, StringField, SubmitField, ValidationError, IntegerField, SelectField) from wtforms.validators import DataRequired, Length, NumberRange class AddCorpusFileForm(FlaskForm): ''' Form to add a .vrt corpus file to the current corpus. ''' # Required fields author = StringField('Author', validators=[DataRequired(), Length(1, 255)]) file = FileField('File', validators=[DataRequired()]) publishing_year = IntegerField('Publishing year', validators=[DataRequired()]) title = StringField('Title', validators=[DataRequired(), Length(1, 255)]) # Optional fields address = StringField('Adress', validators=[Length(0, 255)]) booktitle = StringField('Booktitle', validators=[Length(0, 255)]) chapter = StringField('Chapter', validators=[Length(0, 255)]) editor = StringField('Editor', validators=[Length(0, 255)]) institution = StringField('Institution', validators=[Length(0, 255)]) journal = StringField('Journal', validators=[Length(0, 255)]) pages = StringField('Pages', validators=[Length(0, 255)]) publisher = StringField('Publisher', validators=[Length(0, 255)]) school = StringField('School', validators=[Length(0, 255)]) submit = SubmitField() def __init__(self, corpus, *args, **kwargs): super().__init__(*args, **kwargs) self.corpus = corpus def validate_file(self, field): if not field.data.filename.lower().endswith('.vrt'): raise ValidationError('File does not have an approved extension: ' '.vrt') field.data.filename = secure_filename(field.data.filename) for corpus_file in self.corpus.files: if field.data.filename == corpus_file.filename: raise ValidationError('File already registered to corpus.') class EditCorpusFileForm(FlaskForm): ''' Form to edit meta data of one corpus file. ''' # Required fields author = StringField('Author', validators=[DataRequired(), Length(1, 255)]) publishing_year = IntegerField('Publishing year', validators=[DataRequired()]) title = StringField('Title', validators=[DataRequired(), Length(1, 255)]) # Optional fields address = StringField('Adress', validators=[Length(0, 255)]) booktitle = StringField('Booktitle', validators=[Length(0, 255)]) chapter = StringField('Chapter', validators=[Length(0, 255)]) editor = StringField('Editor', validators=[Length(0, 255)]) institution = StringField('Institution', validators=[Length(0, 255)]) journal = StringField('Journal', validators=[Length(0, 255)]) pages = StringField('Pages', validators=[Length(0, 255)]) publisher = StringField('Publisher', validators=[Length(0, 255)]) school = StringField('School', validators=[Length(0, 255)]) submit = SubmitField() class AddCorpusForm(FlaskForm): ''' Form to add a a new corpus. ''' description = StringField('Description', validators=[DataRequired(), Length(1, 255)]) submit = SubmitField() title = StringField('Title', validators=[DataRequired(), Length(1, 32)]) class ImportCorpusForm(FlaskForm): ''' Form to import a corpus. ''' description = StringField('Description', validators=[DataRequired(), Length(1, 255)]) file = FileField('File', validators=[DataRequired()]) submit = SubmitField() title = StringField('Title', validators=[DataRequired(), Length(1, 32)]) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def validate_file(self, field): if not field.data.filename.lower().endswith('.zip'): raise ValidationError('File does not have an approved extension: ' '.zip') field.data.filename = secure_filename(field.data.filename) class QueryForm(FlaskForm): ''' Form to submit a query to the server which is executed via cqi-py. ''' query = StringField('Query', validators=[DataRequired(), Length(1, 1024)]) submit = SubmitField('Search') class DisplayOptionsForm(FlaskForm): ''' Form to alter how the matches are represented to the user by the user. ''' expert_mode = BooleanField('Expert mode') result_context = SelectField('Result context', choices=[('', 'Choose your option'), ('10', '10'), ('20', '20'), ('30', '30'), ('40', '40'), ('50', '50')]) results_per_page = SelectField('Results per page', choices=[('', 'Choose your option'), ('10', '10'), ('20', '20'), ('30', '30'), ('40', '40'), ('50', '50')]) class InspectDisplayOptionsForm(FlaskForm): ''' Form for the inspect modal where the user can interact with how the current match is being represented to him. ''' expert_mode_inspect = BooleanField('Expert mode') highlight_sentences = BooleanField('Split sentences') context_sentences = IntegerField('Context sentences', validators=[NumberRange(min=0, max=10)], default=3) class QueryDownloadForm(FlaskForm): ''' Form to choose in what file format the analysis results are being downloaded. WIP. ''' file_type = SelectField('File type', choices=[('', 'Choose file type'), ('csv', 'csv'), ('json', 'json'), ('excel', 'excel'), ('html', 'html-table')], validators=[DataRequired()]) class AddQueryResultForm(FlaskForm): ''' Form used to import one result json file. ''' description = StringField('Description', validators=[DataRequired(), Length(1, 255)]) file = FileField('File', validators=[DataRequired()]) title = StringField('Title', validators=[DataRequired(), Length(1, 32)]) submit = SubmitField() def validate_file(self, field): if not field.data.filename.lower().endswith('.json'): raise ValidationError('File does not have an approved extension: ' '.json') field.data.filename = secure_filename(field.data.filename)