3232)
3333import sqlalchemy
3434import sqlalchemy .exc
35+ from sqlalchemy import Boolean , Column , Integer , String
3536from sqlalchemy .orm import Session
3637
3738from ..utils import get_normalized_locations_list_string , hash_password , verify_password
@@ -233,10 +234,10 @@ class Token(BaseModel):
233234
234235def authenticate_user (username : str , password : str , db : Session ) -> Optional [User ]:
235236 """Authenticate user with username and password"""
236- user : User = db .query (User ).filter (User .email == username ).first ()
237+ user = db .query (User ).filter (User .email == username ).first ()
237238 if not user :
238239 return None
239- if not verify_password (password , user .hashed_password ):
240+ if not verify_password (password , str ( user .hashed_password ) ):
240241 return None
241242 return user
242243
@@ -260,10 +261,11 @@ def create_access_token(
260261 response_description = "User data for myself" ,
261262)
262263def get_myself (email : user_dependency , db : db_dependency ):
263- user : User = db .query (User ).filter (User .email == email ["email" ]).first ()
264+ user = db .query (User ).filter (User .email == email ["email" ]).first ()
264265 if not user :
265266 raise HTTPException (
266- status_code = status .HTTP_401_UNAUTHORIZED , detail = "User not authenticated"
267+ status_code = status .HTTP_401_UNAUTHORIZED ,
268+ detail = "User not authenticated"
267269 )
268270 return user
269271
@@ -276,7 +278,7 @@ def get_myself(email: user_dependency, db: db_dependency):
276278 response_description = "User data for the the user with given email." ,
277279)
278280def get_user (email : user_dependency , db : db_dependency , user_email : str ):
279- user : User = db .query (User ).filter (User .email == user_email ).first ()
281+ user = db .query (User ).filter (User .email == user_email ).first ()
280282 if not user :
281283 raise HTTPException (
282284 status_code = status .HTTP_404_NOT_FOUND , detail = "User not found"
@@ -315,6 +317,11 @@ async def create_user(
315317 status_code = status .HTTP_400_BAD_REQUEST ,
316318 detail = "Only PDF files are supported for resumes" ,
317319 )
320+ if not resume .filename :
321+ raise HTTPException (
322+ status_code = status .HTTP_400_BAD_REQUEST ,
323+ detail = "Resume filename not specified" ,
324+ )
318325 try :
319326 # Save the file to the uploads directory
320327 resume_file_path = os .path .join (
@@ -355,7 +362,7 @@ async def create_user(
355362 is_admin = False ,
356363 resume_url = (
357364 os .path .join ("static" , user_obj .email , resume .filename )
358- if resume and not isinstance (resume , str )
365+ if resume and not isinstance (resume , str ) and resume . filename is not None
359366 else None
360367 ),
361368 resume_text = resume_text ,
@@ -468,7 +475,11 @@ async def update_user(
468475 detail = json .loads (e .json ()),
469476 )
470477
471- user : User = db .query (User ).filter (User .email == email ["email" ]).first ()
478+ user = db .query (User ).filter (User .email == email ["email" ]).first ()
479+ if not user :
480+ raise HTTPException (
481+ status_code = status .HTTP_401_UNAUTHORIZED , detail = "User not authenticated"
482+ )
472483 resume_text = None
473484 resume_file_path = None
474485
@@ -479,6 +490,11 @@ async def update_user(
479490 detail = "Only PDF files are supported for resumes" ,
480491 )
481492 try :
493+ if not resume .filename :
494+ raise HTTPException (
495+ status_code = status .HTTP_400_BAD_REQUEST ,
496+ detail = "Resume filename not specified" ,
497+ )
482498 resume_file_path = os .path .join (
483499 STATIC_DIR_PATH , user .email , resume .filename
484500 )
@@ -504,32 +520,33 @@ async def update_user(
504520 )
505521
506522 try :
507- user .full_name = user_obj .full_name or user .full_name
508- user .experience_years = user_obj .experience_years or user .experience_years
523+ user .full_name = Column ( String , default = user_obj .full_name ) if user_obj . full_name is not None else user .full_name
524+ user .experience_years = Column ( Integer , default = user_obj .experience_years ) if user_obj . experience_years is not None else user .experience_years
509525 user .preferred_roles = (
510- json .dumps (user_obj .preferred_roles )
526+ Column ( String , default = json .dumps (user_obj .preferred_roles ) )
511527 if user_obj .preferred_roles
512528 else user .preferred_roles
513529 )
514530 user .preferred_locations = (
515- json .dumps (user_obj .preferred_locations )
531+ Column ( String , default = json .dumps (user_obj .preferred_locations ) )
516532 if user_obj .preferred_locations
517533 else user .preferred_locations
518534 )
519535 user .preferred_sources = (
520- json .dumps (user_obj .preferred_sources )
536+ Column ( String , default = json .dumps (user_obj .preferred_sources ) )
521537 if user_obj .preferred_sources
522538 else user .preferred_sources
523539 )
524540 user .receive_email_alerts = (
525- user_obj .receive_email_alerts
541+ Column ( Boolean , default = user_obj .receive_email_alerts )
526542 if user_obj .receive_email_alerts is not None
527543 else user .receive_email_alerts
528544 )
529545
530- if resume and not isinstance (resume , str ):
531- user .resume_url = os .path .join ("static" , user .email , resume .filename )
532- user .resume_text = resume_text
546+ if resume and not isinstance (resume , str ) and resume .filename :
547+ user .resume_url = Column (String , default = os .path .join ("static" , user .email , resume .filename ))
548+ if resume_text :
549+ user .resume_text = Column (String , default = resume_text )
533550
534551 db .commit ()
535552 db .refresh (user )
@@ -555,5 +572,5 @@ def login_for_access_token(
555572 status_code = status .HTTP_401_UNAUTHORIZED ,
556573 detail = "Incorrect username or password" ,
557574 )
558- access_token = create_access_token (email = user .email )
575+ access_token = create_access_token (email = str ( user .email ) )
559576 return {"access_token" : access_token , "token_type" : "bearer" , "user" : user }
0 commit comments