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 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)]) 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"}) 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 (Users.query.filter(Users.username.ilike(f'%{input.data}%')).first()): raise ValidationError('This User Name is alredy registered') # 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 (Users.query.filter(Users.email_account.ilike(f'%{input.data}%')).first()): raise ValidationError('This E-mail is alredy registered') 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 (Users.query.filter(Users.username.ilike(f'%{input.data}%')).first()): raise ValidationError('This User Name is alredy registered') # 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 (Users.query.filter(Users.email_account.ilike(f'%{input.data}%')).first()): raise ValidationError('This E-mail is alredy registered') class loginForm(FlaskForm): # Defines the form class to be used for the user login email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) remember = BooleanField('Remember Me') submit = SubmitField('Log In') class updateAccountForm(FlaskForm): # Defines the form class to be used for the user update username = StringField('User Name', validators=[DataRequired(), Length(min=3, max=20)]) email_account = StringField('Email Account', validators=[DataRequired(), Email()]) email_comm = StringField('Email Communication', validators=[DataRequired(), Email()]) picture = FileField('Update Profile Picture', validators=[FileAllowed(['jpg', 'png'])]) submit = SubmitField('Update') # Queries to be made in order to validate the form : If username exists def validate_username(self, username): if username.data != current_user.username: user = Users.query.filter_by(username=username.data).first() if user: raise ValidationError('That username is taken please choose another one') # Queries to be made in order to validate the form : If Email exists def validate_email(self, email): if email.data != current_user.email_account: email = Users.query.filter_by(email_account=email.data).first() if email: raise ValidationError('That email is taken do you have an acocunt ?') class requestResetForm(FlaskForm): # Defines the form class to be used for the reset form email = StringField('Email', 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, email): email = Users.query.filter_by(email_account=email.data).first() if email is None: raise ValidationError('There is no Account with this email your must register first.') 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()