@ -1,31 +1,97 @@
from flask_wtf import FlaskForm
from flask_wtf import FlaskForm
from flask_wtf . file import FileField , FileAllowed
from flask_wtf . file import FileField , FileAllowed
from wtforms import StringField , PasswordField , SubmitField , BooleanField , URLField
from wtforms import StringField , PasswordField , SubmitField , BooleanField , URLField , IntegerField , SelectField
from wtforms . validators import DataRequired , Length , Email , EqualTo , ValidationError
from wtforms . validators import DataRequired , Length , Email , EqualTo , ValidationError
from flask_login import current_user
from flask_login import current_user
from minibase . blueprints . user . models import Users , User_Roles
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
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
# Decalarion of the fields for the form and it's propereties
username = StringField ( ' User Name ' , validators = [ DataRequired ( ) , Length ( min = 4 , max = 20 ) ] )
username = StringField ( ' User Name ' , validators = [ DataRequired ( ) , Length ( min = 4 , max = 20 ) ] )
email = StringField ( ' Email ' , validators = [ DataRequired ( ) , Email ( ) ] )
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 = PasswordField ( ' Password ' , validators = [ DataRequired ( ) ] )
password_confirm = PasswordField ( ' Confirm Password ' , validators = [ DataRequired ( ) , EqualTo ( ' password ' ) ] )
password_confirm = PasswordField ( ' Confirm Password ' , validators = [ DataRequired ( ) , EqualTo ( ' password ' ) ] )
submit = SubmitField ( ' Sing Up ' )
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
# Queries to be made in order to validate the form : If username exists
def validate_username ( self , username ) :
def validate_username ( self , input ) :
user = Users . query . filter_by ( username = username . data ) . first ( ) # Database Querry
if input . data != self . originalModel . username :
if user :
if ( Users. q uery. filter ( U sers. username . ilike ( f ' % { input . data } % ' ) ) . first ( ) ) :
raise ValidationError ( ' That username is taken please choose another one ' )
raise ValidationError ( ' Th is User Name is alredy registered ' )
# Queries to be made in order to validate the form : If Email exists
# Queries to be made in order to validate the form : If username exists
def validate_email ( self , email ) :
def validate_email_account ( self , input ) :
email = Users . query . filter_by ( email_account = email . data ) . first ( ) # Database Querry
if input . data != self . originalModel . email_account :
if email :
if ( Users . query . filter ( Users . email_account . ilike ( f ' % { input . data } % ' ) ) . first ( ) ) :
raise ValidationError ( ' That email is taken do you have an acocunt ? ' )
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
class loginForm ( FlaskForm ) : # Defines the form class to be used for the user login
email = StringField ( ' Email ' , validators = [ DataRequired ( ) , Email ( ) ] )
email = StringField ( ' Email ' , validators = [ DataRequired ( ) , Email ( ) ] )