55
66from sqlalchemy .orm import Session
77
8- from app .models import Experience , Treatment , UserData
8+ from app .models import Experience , Treatment , User , UserData
99
1010logger = logging .getLogger (__name__ )
1111
@@ -48,22 +48,29 @@ def process_form_submission(self, user_id: str, form_data: Dict[str, Any]) -> Us
4848 self .db .flush () # Get ID assigned before processing relationships
4949
5050 # Process different sections of the form
51- self ._process_personal_info (user_data , form_data .get ("personalInfo " , {}))
51+ self ._process_personal_info (user_data , form_data .get ("personal_info " , {}))
5252 self ._process_demographics (user_data , form_data .get ("demographics" , {}))
53- self ._process_cancer_experience (user_data , form_data .get ("cancerExperience " , {}))
53+ self ._process_cancer_experience (user_data , form_data .get ("cancer_experience " , {}))
5454 self ._process_flow_control (user_data , form_data )
5555
5656 # Process treatments and experiences (many-to-many)
57- self ._process_treatments (user_data , form_data .get ("cancerExperience" , {}))
58- self ._process_experiences (user_data , form_data .get ("cancerExperience" , {}))
57+ cancer_exp = form_data .get ("cancer_experience" , {})
58+ self ._process_treatments (user_data , cancer_exp )
59+ self ._process_experiences (user_data , cancer_exp )
5960
6061 # Process caregiver experience for volunteers (separate from cancer experience)
61- if "caregiverExperience " in form_data :
62- self ._process_caregiver_experience (user_data , form_data [ "caregiverExperience" ] )
62+ if "caregiver_experience " in form_data :
63+ self ._process_caregiver_experience (user_data , form_data . get ( "caregiver_experience" , {}) )
6364
6465 # Process loved one data if present
65- if "lovedOne" in form_data :
66- self ._process_loved_one_data (user_data , form_data ["lovedOne" ])
66+ if "loved_one" in form_data :
67+ self ._process_loved_one_data (user_data , form_data .get ("loved_one" , {}))
68+
69+ # Fallback: ensure email is set from the authenticated User if not provided in form
70+ if not user_data .email :
71+ owning_user = self .db .query (User ).filter (User .id == user_data .user_id ).first ()
72+ if owning_user and owning_user .email :
73+ user_data .email = owning_user .email
6774
6875 # Commit all changes
6976 self .db .commit ()
@@ -97,15 +104,23 @@ def _get_or_create_user_data(self, user_id: str) -> Tuple[UserData, bool]:
97104
98105 def _validate_required_fields (self , form_data : Dict [str , Any ]):
99106 """Validate that required fields are present."""
100- if "personalInfo" not in form_data :
101- raise KeyError ("personalInfo section is required" )
102-
103- personal_info = form_data ["personalInfo" ]
104- required_fields = ["firstName" , "lastName" , "dateOfBirth" , "phoneNumber" , "city" , "province" , "postalCode" ]
105-
106- for field in required_fields :
107- if field not in personal_info :
108- raise KeyError (f"Required field missing: personalInfo.{ field } " )
107+ personal_info = form_data .get ("personal_info" )
108+ if not personal_info :
109+ raise KeyError ("personal_info section is required" )
110+
111+ required_fields = [
112+ "first_name" ,
113+ "last_name" ,
114+ "date_of_birth" ,
115+ "phone_number" ,
116+ "city" ,
117+ "province" ,
118+ "postal_code" ,
119+ ]
120+
121+ for key in required_fields :
122+ if key not in personal_info :
123+ raise KeyError (f"Required field missing: personal_info.{ key } " )
109124
110125 def _trim_text (self , text : str ) -> str :
111126 """Trim whitespace from text fields."""
@@ -132,48 +147,50 @@ def _parse_date(self, date_str: str):
132147
133148 def _process_personal_info (self , user_data : UserData , personal_info : Dict [str , Any ]):
134149 """Process personal information fields."""
135- user_data .first_name = self ._trim_text (personal_info .get ("firstName " ))
136- user_data .last_name = self ._trim_text (personal_info .get ("lastName " ))
150+ user_data .first_name = self ._trim_text (personal_info .get ("first_name " ))
151+ user_data .last_name = self ._trim_text (personal_info .get ("last_name " ))
137152 user_data .email = self ._trim_text (personal_info .get ("email" ))
138- user_data .phone = self ._trim_text (personal_info .get ("phoneNumber " ))
153+ user_data .phone = self ._trim_text (personal_info .get ("phone_number " ))
139154 user_data .city = self ._trim_text (personal_info .get ("city" ))
140155 user_data .province = self ._trim_text (personal_info .get ("province" ))
141- user_data .postal_code = self ._trim_text (personal_info .get ("postalCode " ))
156+ user_data .postal_code = self ._trim_text (personal_info .get ("postal_code " ))
142157
143158 # Parse date of birth with strict validation
144- if "dateOfBirth " in personal_info :
159+ if "date_of_birth " in personal_info :
145160 try :
146- user_data .date_of_birth = self ._parse_date (personal_info [ "dateOfBirth" ] )
161+ user_data .date_of_birth = self ._parse_date (personal_info . get ( "date_of_birth" ) )
147162 except ValueError :
148- raise ValueError (f"Invalid date format for dateOfBirth: { personal_info [ 'dateOfBirth' ] } " )
163+ raise ValueError (f"Invalid date format for dateOfBirth: { personal_info . get ( 'date_of_birth' ) } " )
149164
150165 def _process_demographics (self , user_data : UserData , demographics : Dict [str , Any ]):
151166 """Process demographic information."""
152- user_data .gender_identity = self ._trim_text (demographics .get ("genderIdentity " ))
167+ user_data .gender_identity = self ._trim_text (demographics .get ("gender_identity " ))
153168 user_data .pronouns = demographics .get ("pronouns" , [])
154- user_data .ethnic_group = demographics .get ("ethnicGroup " , [])
155- user_data .marital_status = self ._trim_text (demographics .get ("maritalStatus " ))
156- user_data .has_kids = demographics .get ("hasKids " )
157- user_data .other_ethnic_group = self ._trim_text (demographics .get ("ethnicGroupCustom " ))
158- user_data .gender_identity_custom = self ._trim_text (demographics .get ("genderIdentityCustom " ))
169+ user_data .ethnic_group = demographics .get ("ethnic_group " , [])
170+ user_data .marital_status = self ._trim_text (demographics .get ("marital_status " ))
171+ user_data .has_kids = demographics .get ("has_kids " )
172+ user_data .other_ethnic_group = self ._trim_text (demographics .get ("ethnic_group_custom " ))
173+ user_data .gender_identity_custom = self ._trim_text (demographics .get ("gender_identity_custom " ))
159174
160175 def _process_cancer_experience (self , user_data : UserData , cancer_experience : Dict [str , Any ]):
161176 """Process cancer experience information."""
162177 user_data .diagnosis = self ._trim_text (cancer_experience .get ("diagnosis" ))
163- user_data .other_treatment = self ._trim_text (cancer_experience .get ("otherTreatment " ))
164- user_data .other_experience = self ._trim_text (cancer_experience .get ("otherExperience " ))
178+ user_data .other_treatment = self ._trim_text (cancer_experience .get ("other_treatment " ))
179+ user_data .other_experience = self ._trim_text (cancer_experience .get ("other_experience " ))
165180
166181 # Parse diagnosis date with strict validation
167- if "dateOfDiagnosis " in cancer_experience :
182+ if "date_of_diagnosis " in cancer_experience :
168183 try :
169- user_data .date_of_diagnosis = self ._parse_date (cancer_experience [ "dateOfDiagnosis" ] )
184+ user_data .date_of_diagnosis = self ._parse_date (cancer_experience . get ( "date_of_diagnosis" ) )
170185 except ValueError :
171- raise ValueError (f"Invalid date format for dateOfDiagnosis: { cancer_experience ['dateOfDiagnosis' ]} " )
186+ raise ValueError (
187+ f"Invalid date format for dateOfDiagnosis: { cancer_experience .get ('date_of_diagnosis' )} "
188+ )
172189
173190 def _process_flow_control (self , user_data : UserData , form_data : Dict [str , Any ]):
174191 """Process flow control fields."""
175- user_data .has_blood_cancer = form_data .get ("hasBloodCancer " )
176- user_data .caring_for_someone = form_data .get ("caringForSomeone " )
192+ user_data .has_blood_cancer = form_data .get ("has_blood_cancer " )
193+ user_data .caring_for_someone = form_data .get ("caring_for_someone " )
177194
178195 def _process_treatments (self , user_data : UserData , cancer_exp : Dict [str , Any ]):
179196 """
@@ -242,7 +259,7 @@ def _process_caregiver_experience(self, user_data: UserData, caregiver_exp: Dict
242259 return
243260
244261 # Handle "Other" caregiver experience text
245- user_data .other_experience = caregiver_exp .get ("otherExperience " )
262+ user_data .other_experience = caregiver_exp .get ("other_experience " )
246263
247264 # Process caregiver experiences - map to same experiences table
248265 experience_names = caregiver_exp .get ("experiences" , [])
@@ -280,18 +297,18 @@ def _process_loved_one_data(self, user_data: UserData, loved_one_data: Dict[str,
280297 self ._process_loved_one_demographics (user_data , loved_one_data .get ("demographics" , {}))
281298
282299 # Process loved one cancer experience
283- self ._process_loved_one_cancer_experience (user_data , loved_one_data .get ("cancerExperience " , {}))
300+ self ._process_loved_one_cancer_experience (user_data , loved_one_data .get ("cancer_experience " , {}))
284301
285302 # Process loved one treatments and experiences
286- self ._process_loved_one_treatments (user_data , loved_one_data .get ("cancerExperience " , {}))
287- self ._process_loved_one_experiences (user_data , loved_one_data .get ("cancerExperience " , {}))
303+ self ._process_loved_one_treatments (user_data , loved_one_data .get ("cancer_experience " , {}))
304+ self ._process_loved_one_experiences (user_data , loved_one_data .get ("cancer_experience " , {}))
288305
289306 def _process_loved_one_demographics (self , user_data : UserData , demographics : Dict [str , Any ]):
290307 """Process loved one demographic information."""
291308 if not demographics :
292309 return
293310
294- user_data .loved_one_gender_identity = demographics .get ("genderIdentity " )
311+ user_data .loved_one_gender_identity = demographics .get ("gender_identity " )
295312 user_data .loved_one_age = demographics .get ("age" )
296313
297314 def _process_loved_one_cancer_experience (self , user_data : UserData , cancer_exp : Dict [str , Any ]):
@@ -302,15 +319,17 @@ def _process_loved_one_cancer_experience(self, user_data: UserData, cancer_exp:
302319 user_data .loved_one_diagnosis = self ._trim_text (cancer_exp .get ("diagnosis" ))
303320
304321 # Parse loved one diagnosis date with strict validation
305- if "dateOfDiagnosis " in cancer_exp :
322+ if "date_of_diagnosis " in cancer_exp :
306323 try :
307- user_data .loved_one_date_of_diagnosis = self ._parse_date (cancer_exp [ "dateOfDiagnosis" ] )
324+ user_data .loved_one_date_of_diagnosis = self ._parse_date (cancer_exp . get ( "date_of_diagnosis" ) )
308325 except ValueError :
309- raise ValueError (f"Invalid date format for loved one dateOfDiagnosis: { cancer_exp ['dateOfDiagnosis' ]} " )
326+ raise ValueError (
327+ f"Invalid date format for loved one dateOfDiagnosis: { cancer_exp .get ('date_of_diagnosis' )} "
328+ )
310329
311330 # Handle "Other" treatment and experience text for loved one with trimming
312- user_data .loved_one_other_treatment = self ._trim_text (cancer_exp .get ("otherTreatment " ))
313- user_data .loved_one_other_experience = self ._trim_text (cancer_exp .get ("otherExperience " ))
331+ user_data .loved_one_other_treatment = self ._trim_text (cancer_exp .get ("other_treatment " ))
332+ user_data .loved_one_other_experience = self ._trim_text (cancer_exp .get ("other_experience " ))
314333
315334 def _process_loved_one_treatments (self , user_data : UserData , cancer_exp : Dict [str , Any ]):
316335 """Process loved one treatments - map frontend names to database records."""
0 commit comments