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 ContributionBaseForm(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()] ) compatible_service_versions = SelectMultipleField( 'Compatible service versions' ) shared = BooleanField( 'Shared' ) submit = SubmitField() class CreateTesseractOCRPipelineModelForm(ContributionBaseForm): tesseract_model_file = FileField( 'File', validators=[FileRequired()] ) 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 CreateSpaCyNLPPipelineModelForm(ContributionBaseForm): spacy_model_file = FileField( 'File', validators=[FileRequired()] ) 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): super().__init__(*args, **kwargs) service_manifest = SERVICES['spacy-nlp-pipeline'] 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 EditContributionBaseForm(ContributionBaseForm): pass class EditTesseractOCRPipelineModelForm(EditContributionBaseForm): 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 EditSpaCyNLPPipelineModelForm(EditContributionBaseForm): pipeline_name = StringField( 'Pipeline name', validators=[InputRequired(), Length(max=64)] ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) service_manifest = SERVICES['spacy-nlp-pipeline'] 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 = ''