from flask import current_app from flask_wtf import FlaskForm from wtforms import (StringField, PasswordField, BooleanField, SubmitField, EmailField, IntegerField, DateField, SelectField, SelectMultipleField, FieldList, FormField) from wtforms.validators import DataRequired, Length, Email, NumberRange, Optional from ..models.user import User, Role class TenantForm(FlaskForm): name = StringField('Name', validators=[DataRequired(), Length(max=80)]) website = StringField('Website', validators=[DataRequired(), Length(max=255)]) # language fields default_language = SelectField('Default Language', choices=[], validators=[DataRequired()]) allowed_languages = SelectMultipleField('Allowed Languages', choices=[], validators=[DataRequired()]) # LLM fields default_embedding_model = SelectField('Default Embedding Model', choices=[], validators=[DataRequired()]) allowed_embedding_models = SelectMultipleField('Allowed Embedding Models', choices=[], validators=[DataRequired()]) default_llm_model = SelectField('Default Large Language Model', choices=[], validators=[DataRequired()]) allowed_llm_models = SelectMultipleField('Allowed Large Language Models', choices=[], validators=[DataRequired()]) # license fields license_start_date = DateField('License Start Date', id='form-control datepicker', validators=[Optional()]) license_end_date = DateField('License End Date', id='form-control datepicker', validators=[Optional()]) allowed_monthly_interactions = IntegerField('Allowed Monthly Interactions', validators=[NumberRange(min=0)]) submit = SubmitField('Submit') def __init__(self, *args, **kwargs): super(TenantForm, self).__init__(*args, **kwargs) # initialise language fields self.default_language.choices = [(lang, lang.lower()) for lang in current_app.config['SUPPORTED_LANGUAGES']] self.allowed_languages.choices = [(lang, lang.lower()) for lang in current_app.config['SUPPORTED_LANGUAGES']] # initialise LLM fields self.default_embedding_model.choices = [(model, model) for model in current_app.config['SUPPORTED_EMBEDDINGS']] self.allowed_embedding_models.choices = [(model, model) for model in current_app.config['SUPPORTED_EMBEDDINGS']] self.default_llm_model.choices = [(model, model) for model in current_app.config['SUPPORTED_LLMS']] self.allowed_llm_models.choices = [(model, model) for model in current_app.config['SUPPORTED_LLMS']] class BaseUserForm(FlaskForm): user_name = StringField('Name', validators=[DataRequired(), Length(max=80)]) email = EmailField('Email', validators=[DataRequired(), Email()]) first_name = StringField('First Name', validators=[DataRequired(), Length(max=80)]) last_name = StringField('Last Name', validators=[DataRequired(), Length(max=80)]) is_active = BooleanField('Is Active', id='flexSwitchCheckDefault') valid_to = DateField('Valid to', id='datepicker') tenant_id = IntegerField('Tenant ID', validators=[NumberRange(min=0)]) roles = SelectMultipleField('Roles', coerce=int) def __init__(self, *args, **kwargs): super(BaseUserForm, self).__init__(*args, **kwargs) self.roles.choices = [(role.id, role.name) for role in Role.query.all()] class CreateUserForm(BaseUserForm): password = PasswordField('Password', validators=[DataRequired(), Length(min=8)]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), Length(min=8)]) submit = SubmitField('Create User') class EditUserForm(BaseUserForm): submit = SubmitField('Save User') class RoleForm(FlaskForm): # This subform will represent a single checkbox for each role role_id = StringField('Role ID') checked = BooleanField('Assigned') class UserRoleForm(FlaskForm): email = EmailField('Email', validators=[DataRequired(), Email()]) roles = FieldList(FormField(RoleForm), min_entries=1) submit = SubmitField('Update Roles')