from flask import current_app from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileRequired from wtforms import ( BooleanField, StringField, SubmitField, SelectMultipleField, IntegerField, ValidationError ) from wtforms.validators import InputRequired, Length from app.services import SERVICES class CreateContributionBaseForm(FlaskForm): title = StringField( 'Title', validators=[InputRequired(), Length(max=64)] ) description = StringField( 'Description', validators=[InputRequired(), Length(max=255)] ) version = StringField( 'Version', validators=[InputRequired(), Length(max=16)] ) publisher = StringField( 'Publisher', validators=[InputRequired(), Length(max=128)] ) publisher_url = StringField( 'Publisher URL', validators=[InputRequired(), Length(max=512)] ) publishing_url = StringField( 'Publishing URL', validators=[InputRequired(), Length(max=512)] ) publishing_year = IntegerField( 'Publishing year', validators=[InputRequired()] ) shared = BooleanField( 'Shared' ) submit = SubmitField() class EditForm(CreateContributionBaseForm): def prefill(self, model_file): ''' Pre-fill the form with data of an exististing corpus file ''' self.title.data = model_file.title self.description.data = model_file.description self.publisher.data = model_file.publisher self.publishing_year.data = model_file.publishing_year self.publisher_url.data = model_file.publisher_url self.publishing_url.data = model_file.publishing_url self.version.data = model_file.version self.shared.data = model_file.shared class EditTesseractOCRModelForm(EditForm): pass class EditSpaCyNLPPipelineModelForm(EditForm): pipeline_name = StringField( 'Pipeline name', validators=[InputRequired(), Length(max=64)] ) def prefill(self, model_file): super().prefill(model_file) self.pipeline_name.data = model_file.pipeline_name class TesseractOCRModelContributionForm(CreateContributionBaseForm): tesseract_model_file = FileField( 'File', validators=[FileRequired()] ) compatible_service_versions = SelectMultipleField( 'Compatible service versions' ) def validate_tesseract_model_file(self, field): current_app.logger.warning(field.data.filename) if not field.data.filename.lower().endswith('.traineddata'): raise ValidationError('traineddata files only!') def __init__(self, *args, **kwargs): service_manifest = SERVICES['tesseract-ocr-pipeline'] super().__init__(*args, **kwargs) self.compatible_service_versions.choices = [('', 'Choose your option')] self.compatible_service_versions.choices += [ (x, x) for x in service_manifest['versions'].keys() ] self.compatible_service_versions.default = '' class SpacyNLPModelContributionForm(CreateContributionBaseForm): spacy_model_file = FileField( 'File', validators=[FileRequired()] ) compatible_service_versions = SelectMultipleField( 'Compatible service versions' ) pipeline_name = StringField( 'Pipeline name', validators=[InputRequired(), Length(max=64)] ) def validate_spacy_model_file(self, field): current_app.logger.warning(field.data.filename) if not field.data.filename.lower().endswith('.tar.gz'): raise ValidationError('.tar.gz files only!') def __init__(self, *args, **kwargs): service_manifest = SERVICES['spacy-nlp-pipeline'] super().__init__(*args, **kwargs) self.compatible_service_versions.choices = [('', 'Choose your option')] self.compatible_service_versions.choices += [ (x, x) for x in service_manifest['versions'].keys() ] self.compatible_service_versions.default = ''