from flask import session, current_app from flask_wtf import FlaskForm from wtforms import (StringField, BooleanField, SubmitField, DateField, SelectField, FieldList, FormField, TextAreaField, URLField) from wtforms.validators import DataRequired, Length, Optional, URL, ValidationError from flask_wtf.file import FileField, FileAllowed, FileRequired import json def allowed_file(form, field): if field.data: filename = field.data.filename allowed_extensions = current_app.config.get('SUPPORTED_FILE_TYPES', []) if not ('.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_extensions): raise ValidationError('Unsupported file type.') def validate_json(form, field): if field.data: try: json.loads(field.data) except json.JSONDecodeError: raise ValidationError('Invalid JSON format') class AddDocumentForm(FlaskForm): file = FileField('File', validators=[FileRequired(), allowed_file]) name = StringField('Name', validators=[Length(max=100)]) language = SelectField('Language', choices=[], validators=[Optional()]) user_context = TextAreaField('User Context', validators=[Optional()]) valid_from = DateField('Valid from', id='form-control datepicker', validators=[Optional()]) user_metadata = TextAreaField('User Metadata', validators=[Optional(), validate_json]) submit = SubmitField('Submit') def __init__(self): super().__init__() self.language.choices = [(language, language) for language in session.get('tenant').get('allowed_languages')] if not self.language.data: self.language.data = session.get('tenant').get('default_language') class AddURLForm(FlaskForm): url = URLField('URL', validators=[DataRequired(), URL()]) name = StringField('Name', validators=[Length(max=100)]) language = SelectField('Language', choices=[], validators=[Optional()]) user_context = TextAreaField('User Context', validators=[Optional()]) valid_from = DateField('Valid from', id='form-control datepicker', validators=[Optional()]) user_metadata = TextAreaField('User Metadata', validators=[Optional(), validate_json]) submit = SubmitField('Submit') def __init__(self): super().__init__() self.language.choices = [(language, language) for language in session.get('tenant').get('allowed_languages')] if not self.language.data: self.language.data = session.get('tenant').get('default_language') class AddURLsForm(FlaskForm): urls = TextAreaField('URL(s) (one per line)', validators=[DataRequired()]) name = StringField('Name Prefix', validators=[Length(max=100)]) language = SelectField('Language', choices=[], validators=[Optional()]) user_context = TextAreaField('User Context', validators=[Optional()]) valid_from = DateField('Valid from', id='form-control datepicker', validators=[Optional()]) submit = SubmitField('Submit') def __init__(self): super().__init__() self.language.choices = [(language, language) for language in session.get('tenant').get('allowed_languages')] if not self.language.data: self.language.data = session.get('tenant').get('default_language') class EditDocumentForm(FlaskForm): name = StringField('Name', validators=[Length(max=100)]) valid_from = DateField('Valid from', id='form-control datepicker', validators=[Optional()]) valid_to = DateField('Valid to', id='form-control datepicker', validators=[Optional()]) submit = SubmitField('Submit') class EditDocumentVersionForm(FlaskForm): language = StringField('Language') user_context = TextAreaField('User Context', validators=[Optional()]) system_context = TextAreaField('System Context', validators=[Optional()]) user_metadata = TextAreaField('User Metadata', validators=[Optional(), validate_json]) system_metadata = TextAreaField('System Metadata', validators=[Optional(), validate_json]) submit = SubmitField('Submit')