from flask_wtf import FlaskForm from wtforms import (BooleanField, MultipleFileField, SelectField, StringField, SubmitField, ValidationError) from wtforms.validators import DataRequired, Length from . import SERVICES class AddJobForm(FlaskForm): description = StringField('Description', validators=[DataRequired(), Length(1, 255)]) submit = SubmitField() title = StringField('Title', validators=[DataRequired(), Length(1, 32)]) version = SelectField('Version', validators=[DataRequired()]) class AddNLPJobForm(AddJobForm): check_encoding = BooleanField('Check encoding') files = MultipleFileField('Files', validators=[DataRequired()]) language = SelectField('Language', choices=[('', 'Choose your option')], default='', validators=[DataRequired()]) def validate_check_encoding(self, field): if field.data and 'check_encoding' not in SERVICES['nlp']['versions'][self.version.data]: # noqa raise ValidationError('Check encoding is not available in this version') # noqa def validate_files(form, field): for file in field.data: if not file.filename.lower().endswith('.txt'): raise ValidationError('File does not have an approved ' 'extension: .txt') def __init__(self, *args, **kwargs): version = kwargs.pop('version', SERVICES['nlp']['versions']['latest']) super().__init__(*args, **kwargs) if 'check_encoding' not in SERVICES['nlp']['versions'][version]: self.check_encoding.render_kw = {'disabled': True} self.language.choices += [(x, y) for x, y in SERVICES['nlp']['versions'][version]['models'].items()] # noqa self.version.choices = [(x, x) for x in SERVICES['nlp']['versions'] if x != 'latest'] # noqa self.version.default = version class AddOCRJobForm(AddJobForm): binarization = BooleanField('Binarazation') files = MultipleFileField('Files', validators=[DataRequired()]) language = SelectField('Language', choices=[('', 'Choose your option')], default='', validators=[DataRequired()]) def validate_binarization(self, field): if field.data and 'binarization' not in SERVICES['ocr']['versions'][self.version.data]: # noqa raise ValidationError('Binarization is not available in this version') # noqa def validate_files(self, field): for file in field.data: if not file.filename.lower().endswith('.pdf'): raise ValidationError('File does not have an approved ' 'extension: .pdf') def __init__(self, *args, **kwargs): version = kwargs.pop('version', SERVICES['ocr']['versions']['latest']) super().__init__(*args, **kwargs) if 'binarization' not in SERVICES['ocr']['versions'][version]: self.binarization.render_kw = {'disabled': True} self.language.choices += [(x, y) for x, y in SERVICES['ocr']['versions'][version]['models'].items()] # noqa self.version.choices = [(x, x) for x in SERVICES['ocr']['versions'] if x != 'latest'] # noqa self.version.default = version class AddFileSetupJobForm(AddJobForm): files = MultipleFileField('Files', validators=[DataRequired()]) def validate_files(form, field): for file in field.data: if not file.filename.lower().endswith(('.jpeg', '.jpg', '.png', '.tiff', '.tif')): raise ValidationError('File does not have an approved ' 'extension: .jpeg | .jpg | .png | .tiff ' '| .tif') def __init__(self, *args, **kwargs): version = kwargs.pop('version', SERVICES['file-setup']['versions']['latest']) super().__init__(*args, **kwargs) self.version.choices = [(x, x) for x in SERVICES['file-setup']['versions'] if x != 'latest'] # noqa self.version.default = version AddJobForms = { 'file-setup': AddFileSetupJobForm, 'ocr': AddOCRJobForm, 'nlp': AddNLPJobForm }