from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileAllowed from wtforms import StringField, PasswordField, SubmitField, BooleanField, URLField, IntegerField, SelectField from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError from flask_login import current_user from minibase.blueprints.user.models import Users, User_Roles import minibase.blueprints.geography.utils as geoUtils import minibase.blueprints.database.utils as dbUtils class registrationForm(FlaskForm): # Defines the form class to be used for the user registretion # Decalarion of the fields for the form and it's propereties username = StringField('User Name', validators=[DataRequired(), Length(min=4, max=20)], unique=True) name = StringField('Name', validators=[DataRequired(), Length(min=4, max=20)]) surname = StringField('Surname', validators=[DataRequired(), Length(min=4, max=20)]) email_account = StringField('Email: Account', validators=[DataRequired(), Email()], unique=True) email_comm = StringField('Email: Communication', validators=[DataRequired(), Email()]) street = StringField('Street', validators=[DataRequired()]) street_no = IntegerField('No', validators=[DataRequired()]) post_code = IntegerField('Post', validators=[DataRequired()]) city_id = SelectField('City', validators=[DataRequired()], render_kw={"hx-get": "/geography/get_states", "hx-target": "#state_id"}) state_id = SelectField('State', validators=[]) country_id = SelectField('Country', validators=[DataRequired()], render_kw={"hx-get": "/geography/get_cities", "hx-target": "#city_id"}) password = PasswordField('Password', validators=[DataRequired()]) password_confirm= PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField() def populate_for_adding(self, user): self.originalModel = user self.submit.label.text = "Add" self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNames()] # This is for the htmx implementation. please be careful how of there is data we first take from the database an then from the from(containing th htmx call) if self.country_id.data: self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryId(self.country_id.data)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryId(self.country_id.data)] else: self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryIdWithDefault(user.city_id, user.country_id)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryIdWithDefault(user.state_id, user.country_id)] # Queries to be made in order to validate the form : If username exists def validate_username(self, input): if input.data != self.originalModel.username: if (dbUtils.queryIlikeFromTable(Users, Users.username, input.data)): raise ValidationError(f'This {self.username.name} already exists.') # Queries to be made in order to validate the form : If username exists def validate_email_account(self, input): if input.data != self.originalModel.email_account: if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)): raise ValidationError(f'This {self.email_account.name} already exists.') class accountUpdateForm(FlaskForm): # Defines the form class to be used for the user registretion # Decalarion of the fields for the form and it's propereties username = StringField('User Name', validators=[DataRequired(), Length(min=4, max=20)]) name = StringField('Name', validators=[DataRequired(), Length(min=4, max=20)]) surname = StringField('Surname', validators=[DataRequired(), Length(min=4, max=20)]) email_account = StringField('Email: Account', validators=[DataRequired(), Email()]) email_comm = StringField('Email: Communication', validators=[DataRequired(), Email()]) street = StringField('Street', validators=[DataRequired()]) street_no = IntegerField('No', validators=[DataRequired()]) post_code = IntegerField('Post', validators=[DataRequired()]) city_id = SelectField('City', validators=[DataRequired()], render_kw={"hx-get": "/geography/get_states", "hx-target": "#state_id"}) state_id = SelectField('State', validators=[]) country_id = SelectField('Country', validators=[DataRequired()], render_kw={"hx-get": "/geography/get_cities", "hx-target": "#city_id"}) image_file = FileField('Update Avatar', validators=[FileAllowed(['jpg', 'png'])]) password = PasswordField('Password') password_confirm= PasswordField('Confirm Password', validators=[EqualTo('password')]) submit = SubmitField() def populate_for_update(self, user): self.originalModel = user self.submit.label.text = "Update" self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNamesWithDefault(user.country_id)] # This is for the htmx implementation. please be careful how of there is data we first take from the database an then from the from(containing th htmx call) if self.country_id.data: self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryId(self.country_id.data)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryId(self.country_id.data)] else: self.city_id.choices = [(row.id, row.name) for row in geoUtils.queryCityNamesWithCountryIdWithDefault(user.city_id, user.country_id)] self.state_id.choices = [(row.id, row.name) for row in geoUtils.queryStateNamesWithCountryIdWithDefault(user.state_id, user.country_id)] # Queries to be made in order to validate the form : If username exists def validate_username(self, input): if input.data != self.originalModel.username: if (dbUtils.queryIlikeFromTable(Users, Users.username, input.data)): raise ValidationError(f'This {self.username.name} already exists.') # Queries to be made in order to validate the form : If username exists def validate_email_account(self, input): if input.data != self.originalModel.email_account: if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)): raise ValidationError(f'This {self.email_account.name} already exists.') class loginForm(FlaskForm): # Defines the form class to be used for the user login email = StringField('Email: Account', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) remember = BooleanField('Remember Me') submit = SubmitField('Log In') class requestResetForm(FlaskForm): # Defines the form class to be used for the reset form email = StringField('Email: Account', validators=[DataRequired(), Email()]) submit = SubmitField('Request Password Reset') # Queries to be made in order to validate the form : If Email exists def validate_email(self, input): if (dbUtils.queryIlikeFromTable(Users, Users.email_account, input.data)) is None: raise ValidationError(f"This {self.email.name} doesn't exists.") class resetPasswordForm(FlaskForm): # Defines the form class to be used for password reset form password = PasswordField('Password', validators=[DataRequired()]) password_confirm = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Reset Password') class updateRoleForm(FlaskForm): id = StringField('ID', render_kw={'disabled':''}) role = StringField('Role', validators=[DataRequired(), Length(min=4, max=20)]) description = StringField('Description', validators=[DataRequired(), Length(min=4, max=200)]) submit = SubmitField()