10
10
# Helper functions for validation
11
11
def is_valid_email (email ):
12
12
regex = r'^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w+$'
13
- return re .match (regex , email ) is not None
13
+ return re .match (regex , str ( email ) ) is not None
14
14
15
15
def is_valid_password (password ):
16
16
if len (password ) < 8 :
@@ -29,42 +29,38 @@ def login():
29
29
if request .method == "POST" :
30
30
username = request .form .get ('username' )
31
31
password = request .form .get ('password' )
32
- role = request .form .get ('role' ). lower ()
32
+ role = request .form .get ('role' )
33
33
remember = request .form .get ('remember' ) == "on"
34
34
35
- if not username or not password :
36
- flash ("Username and password are required." , "warning" )
37
- return redirect (url_for ('auth.login' ))
38
-
39
- try :
40
- if role == "customer" :
41
- user = Customer .query .filter_by (username = username ).first ()
42
- elif role == "professional" :
43
- user = Professional .query .filter_by (username = username ).first ()
44
- elif role == "admin" :
45
- user = Admin .query .filter_by (username = username ).first ()
46
- else :
47
- flash ("Invalid role. Please select a role and try again." , "warning" )
48
- return redirect (url_for ('auth.login' ))
49
- except SQLAlchemyError :
50
- flash ("User not found. Please check your details and try again." , "warning" )
35
+ # Validate input
36
+ if not username or not password or not role :
37
+ flash ("All fields are required." , "warning" )
51
38
return redirect (url_for ('auth.login' ))
52
39
40
+ # Fetch user based on role
41
+ user = None
42
+ if role == "customer" :
43
+ user = Customer .query .filter_by (username = username ).first ()
44
+ elif role == "professional" :
45
+ user = Professional .query .filter_by (username = username ).first ()
46
+ elif role == "admin" :
47
+ user = Admin .query .filter_by (username = username ).first ()
48
+
49
+ # Authenticate user
53
50
if user and check_password_hash (user .password_hash , password ):
54
- try :
55
- login_user (user , remember = remember )
56
- flash ("Logged in successfully" , "success" )
57
- next_page = request .args .get ('next' )
58
- session ['role' ] = role
59
-
60
- if next_page in [url_for ('auth.login' ), url_for ('auth.signup' ), url_for ('auth.signup_as_customer' ), url_for ('auth.signup_as_professional' )]:
61
- return redirect (url_for ('customer.home' ))
62
-
63
- return redirect (next_page or url_for ('customer.home' ))
64
- except Exception as e :
65
- flash ("An error occurred during login: " + str (e ), "warning" )
51
+ if user .role != role :
52
+ flash ("Invalid role for this account." , "warning" )
53
+ return redirect (url_for ('auth.login' ))
54
+ if getattr (user , 'is_blocked' , False ): # Check if the user is blocked
55
+ flash ("Your account has been blocked. Please contact support." , "warning" )
56
+ return redirect (url_for ('auth.login' ))
57
+
58
+ login_user (user , remember = remember )
59
+ session ['role' ] = role
60
+ flash ("Logged in successfully!" , "success" )
61
+ return redirect (url_for ('customer.home' ))
66
62
else :
67
- flash ("Invalid username or password" , "warning" )
63
+ flash ("Invalid username or password. " , "warning" )
68
64
return render_template ("login.html" )
69
65
70
66
@@ -143,11 +139,14 @@ def signup_as_professional():
143
139
email = request .form .get ('email' )
144
140
phone = request .form .get ('phone' )
145
141
address = request .form .get ('address' )
142
+ service_type = request .form .get ('service_type' ) # New
143
+ experience = request .form .get ('experience' ) # New
146
144
147
- if not username or not password or not email or not phone :
148
- flash ("Username, password, email, and phone are required." , "warning" )
145
+ # Basic validation
146
+ if not username or not password or not email or not phone or not service_type or not experience :
147
+ flash ("All fields are required." , "warning" )
149
148
return redirect (url_for ('auth.signup_as_professional' ))
150
-
149
+
151
150
if not is_valid_email (email ):
152
151
flash ("Invalid email address." , "warning" )
153
152
return redirect (url_for ('auth.signup_as_professional' ))
@@ -163,7 +162,6 @@ def signup_as_professional():
163
162
if Professional .query .filter_by (email = email ).first ():
164
163
flash ("Email already in use. Please login instead." , "warning" )
165
164
return redirect (url_for ('auth.signup_as_professional' ))
166
-
167
165
try :
168
166
user = Professional (
169
167
username = username ,
@@ -172,11 +170,13 @@ def signup_as_professional():
172
170
password_hash = generate_password_hash (password ),
173
171
email = email ,
174
172
phone = phone ,
175
- address = address
173
+ address = address ,
174
+ service_type = service_type ,
175
+ experience = int (experience ) # Ensure integer
176
176
)
177
177
db .session .add (user )
178
178
db .session .commit ()
179
- flash ("User registered successfully" , "success" )
179
+ flash ("Professional registered successfully! " , "success" )
180
180
return redirect (url_for ('auth.login' ))
181
181
except SQLAlchemyError :
182
182
db .session .rollback ()
0 commit comments