You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
8.0 KiB

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()