11from pathlib import Path
2+ from dataclasses import dataclass
3+ from typing import Optional
24
35from flask import Flask , json , render_template , request , jsonify
46import requests
1921CONFIG_PATH = Path (__file__ ).resolve ().with_name ("study_configs.yaml" )
2022STUDIES = yaml .safe_load (CONFIG_PATH .read_text (encoding = "utf-8" ))
2123
22- def get_study_settings (study_key : str ):
23- study = STUDIES .get (study_key )
24- if not study :
25- return None , None , None
2624
27- return study , study .get ("ldot_variables" , {}), study .get ("qualtrics_variables" , {})
25+ @dataclass
26+ class StudySettings :
27+ study_id : str
28+ name : str
29+ ldot_study_id : Optional [str ] = None
30+ id_deelnemer_entity : Optional [str ] = None
31+ id_location : Optional [str ] = None
32+ custom_var_qualtrics_link : Optional [str ] = None
33+ eaid_qualtrics_survey_link_creation_to_do_date : Optional [str ] = None
34+ eaid_qualtrics_survey_link_creation_completed : Optional [str ] = None
35+ eaid_survey_invitation_completed : Optional [str ] = None
36+ eaid_survey_progress_completed : Optional [str ] = None
37+ survey_id : Optional [str ] = None
38+ mailing_list_id : Optional [str ] = None
39+ embedded_data_field : Optional [str ] = None
40+ directory_id : Optional [str ] = None
41+ distribution_id : Optional [str ] = None
42+
43+ def get_study_settings (study_key : str ):
44+ study_variables = STUDIES .get (study_key )
45+ if not study_variables :
46+ return None
47+
48+ ldot_vars = study_variables .get ("ldot_variables" , {})
49+ qualtrics_vars = study_variables .get ("qualtrics_variables" , {})
50+ return StudySettings (
51+ study_id = study_key ,
52+ name = study_variables .get ("name" , study_key ),
53+ ldot_study_id = ldot_vars .get ("ldot_study_id" ),
54+ id_deelnemer_entity = ldot_vars .get ("id_deelnemer_entity" ),
55+ id_location = ldot_vars .get ("id_location" ),
56+ custom_var_qualtrics_link = ldot_vars .get ("custom_var_qualtrics_link" ),
57+ eaid_qualtrics_survey_link_creation_to_do_date = ldot_vars .get ("eaid_qualtrics_survey_link_creation_to_do_date" ),
58+ eaid_qualtrics_survey_link_creation_completed = ldot_vars .get ("eaid_qualtrics_survey_link_creation_completed" ),
59+ eaid_survey_invitation_completed = ldot_vars .get ("eaid_survey_invitation_completed" ),
60+ eaid_survey_progress_completed = ldot_vars .get ("eaid_survey_progress_completed" ),
61+ survey_id = qualtrics_vars .get ("survey_id" ),
62+ mailing_list_id = qualtrics_vars .get ("mailing_list_id" ),
63+ embedded_data_field = qualtrics_vars .get ("embedded_data_field" ),
64+ directory_id = qualtrics_vars .get ("directory_id" ),
65+ distribution_id = qualtrics_vars .get ("distribution_id" ),
66+ )
2867
2968
3069with open ("new_ldot_workflows/ldot_config.json" ) as f :
@@ -53,16 +92,17 @@ def button1():
5392 data = request .json
5493 study_id = data .get ("study_id" )
5594
56- study , ldot_vars , qualtrics_vars = get_study_settings (study_id )
57- if not study :
95+ study_variables = get_study_settings (study_id )
96+ if not study_variables :
5897 return jsonify ({"success" : False , "message" : f"Unknown study_id: { study_id } " }), 400
5998
60- ldot_study_id = ldot_vars .get ("ldot_study_id" )
61- link_creation_eaid = ldot_vars .get ("eaid_qualtrics_survey_link_creation_to_do_date" )
62- link_completed_eaid = ldot_vars .get ("eaid_qualtrics_survey_link_creation_completed" )
63-
6499 try :
65- new_subjects_ids = get_new_subjects (ldot_client , ldot_study_id , link_creation_eaid , link_completed_eaid )
100+ new_subjects_ids = get_new_subjects (
101+ ldot_client ,
102+ study_variables .get ("ldot_study_id" ),
103+ study_variables .get ("eaid_qualtrics_survey_link_creation_to_do_date" ),
104+ study_variables .get ("eaid_qualtrics_survey_link_creation_completed" ),
105+ )
66106 except QualtricsAPIError as e :
67107 return jsonify ({"success" : False , "message" : str (e )}), 502
68108 except requests .RequestException as e :
@@ -94,36 +134,45 @@ def button2():
94134 })
95135
96136 # Lookup study variables from STUDIES config
97- study , ldot_vars , qualtrics_vars = get_study_settings (study_id )
137+ study_variables = get_study_settings (study_id )
98138
99- ldot_study_id = ldot_vars .get ("ldot_study_id" )
100- id_deelnemer_entity = ldot_vars .get ("id_deelnemer_entity" )
101- id_location = ldot_vars .get ("id_location" )
102- custom_var_qualtrics_link = ldot_vars .get ("custom_var_qualtrics_link" )
103- link_completed_eaid = ldot_vars .get ("eaid_qualtrics_survey_link_creation_completed" )
104-
105- qualtrics_survey_id = qualtrics_vars .get ("survey_id" )
106- mailing_list_id = qualtrics_vars .get ("mailing_list_id" )
107- embedded_data_field = qualtrics_vars .get ("embedded_data_field" )
108- directory_id = qualtrics_vars .get ("directory_id" )
109- distribution_id = qualtrics_vars .get ("distribution_id" )
139+ if not study_variables :
140+ return jsonify ({"success" : False , "message" : f"Unknown study_id: { study_id } " }), 400
110141
111142 debug_inputs = {
112143 "study_id" : study_id ,
113- "ldot_study_id" : ldot_study_id ,
114- "id_deelnemer_entity" : id_deelnemer_entity ,
115- "id_location" : id_location ,
144+ "ldot_study_id" : study_variables . get ( " ldot_study_id" ) ,
145+ "id_deelnemer_entity" : study_variables . get ( " id_deelnemer_entity" ) ,
146+ "id_location" : study_variables . get ( " id_location" ) ,
116147 "new_subject_ids" : new_subject_ids ,
117- "qualtrics_survey_id" : qualtrics_survey_id ,
118- "mailing_list_id" : mailing_list_id ,
119- "embedded_data_field" : embedded_data_field ,
120- "directory_id" : directory_id ,
121- "distribution_id" : distribution_id
148+ "qualtrics_survey_id" : study_variables . get ( " qualtrics_survey_id" ) ,
149+ "mailing_list_id" : study_variables . get ( " mailing_list_id" ) ,
150+ "embedded_data_field" : study_variables . get ( " embedded_data_field" ) ,
151+ "directory_id" : study_variables . get ( " directory_id" ) ,
152+ "distribution_id" : study_variables . get ( " distribution_id" ),
122153 }
123154
124155 try :
125- subject_id_to_link_dict = add_individuals_to_survey (ldot_client , new_subject_ids , ldot_study_id , id_deelnemer_entity , embedded_data_field , distribution_id , qualtrics_survey_id , mailing_list_id , directory_id )
126- send_links_to_ldot (ldot_client , ldot_study_id , id_deelnemer_entity , id_location , custom_var_qualtrics_link , link_completed_eaid , subject_id_to_link_dict )
156+ subject_id_to_link_dict = add_individuals_to_survey (
157+ ldot_client ,
158+ new_subject_ids ,
159+ study_variables .get ("ldot_study_id" ),
160+ study_variables .get ("id_deelnemer_entity" ),
161+ study_variables .get ("embedded_data_field" ),
162+ study_variables .get ("distribution_id" ),
163+ study_variables .get ("qualtrics_survey_id" ),
164+ study_variables .get ("mailing_list_id" ),
165+ study_variables .get ("directory_id" ),
166+ )
167+ send_links_to_ldot (
168+ ldot_client ,
169+ study_variables .get ("ldot_study_id" ),
170+ study_variables .get ("id_deelnemer_entity" ),
171+ study_variables .get ("id_location" ),
172+ study_variables .get ("custom_var_qualtrics_link" ),
173+ study_variables .get ("eaid_qualtrics_survey_link_creation_completed" ),
174+ subject_id_to_link_dict ,
175+ )
127176 except QualtricsAPIError as e :
128177 return jsonify ({"success" : False , "message" : str (e ), "debug_inputs" : debug_inputs }), 502
129178 except Exception as e :
@@ -142,17 +191,18 @@ def button3():
142191 """Third API call - returns list of subjectIDs"""
143192 data = request .json
144193 study_id = data .get ("study_id" )
145- study , ldot_vars , qualtrics_vars = get_study_settings (study_id )
194+ study_variables = get_study_settings (study_id )
146195
147- if not study :
196+ if not study_variables :
148197 return jsonify ({"success" : False , "message" : f"Unknown study_id: { study_id } " }), 400
149-
150- ldot_study_id = ldot_vars .get ("ldot_study_id" )
151- eaid_survey_invitation_completed = ldot_vars .get ("eaid_survey_invitation_completed" )
152- eaid_survey_progress_completed = ldot_vars .get ("eaid_survey_progress_completed" )
153198
154199 try :
155- subjects_not_completed_survey = get_incomplete_subjects (ldot_client , ldot_study_id , eaid_survey_invitation_completed , eaid_survey_progress_completed )
200+ subjects_not_completed_survey = get_incomplete_subjects (
201+ ldot_client ,
202+ study_variables .get ("ldot_study_id" ),
203+ study_variables .get ("eaid_survey_invitation_completed" ),
204+ study_variables .get ("eaid_survey_progress_completed" ),
205+ )
156206 message = f"Found { len (subjects_not_completed_survey )} subjects who have not completed the survey"
157207 return jsonify ({"success" : True , "message" : message , "subject_ids" : subjects_not_completed_survey })
158208 except QualtricsAPIError as e :
@@ -171,16 +221,21 @@ def button4():
171221 if not study_id :
172222 return jsonify ({"success" : False , "message" : "Missing study_id in request" }), 400
173223
174- study , ldot_vars , qualtrics_vars = get_study_settings (study_id )
224+ study_variables = get_study_settings (study_id )
175225
176- ldot_study_id = ldot_vars .get ("ldot_study_id" )
177- id_deelnemer_entity = ldot_vars .get ("id_deelnemer_entity" )
178- id_location = ldot_vars .get ("id_location" )
179- qualtrics_survey_id = qualtrics_vars .get ("qualtrics_survey_id" )
180- embedded_data_field = qualtrics_vars .get ("embedded_data_field" )
226+ if not study_variables :
227+ return jsonify ({"success" : False , "message" : f"Unknown study_id: { study_id } " }), 400
181228
182229 try :
183- participant_to_progress_dict = get_individual_progress (ldot_client , ldot_study_id , id_deelnemer_entity , id_location , subject_ids , embedded_data_field , qualtrics_survey_id )
230+ participant_to_progress_dict = get_individual_progress (
231+ ldot_client ,
232+ study_variables .get ("ldot_study_id" ),
233+ study_variables .get ("id_deelnemer_entity" ),
234+ study_variables .get ("id_location" ),
235+ subject_ids ,
236+ study_variables .get ("embedded_data_field" ),
237+ study_variables .get ("qualtrics_survey_id" ),
238+ )
184239 except QualtricsAPIError as e :
185240 return jsonify ({"success" : False , "message" : str (e )}), 502
186241 except Exception as e :
@@ -190,8 +245,8 @@ def button4():
190245 "success" : True ,
191246 "message" : f"Retrieved progress for { len (participant_to_progress_dict )} subjects" ,
192247 "study_id" : study_id ,
193- "qualtrics_survey_id" : qualtrics_survey_id ,
194- "embedded_data_field" : embedded_data_field ,
248+ "qualtrics_survey_id" : study_variables . get ( " qualtrics_survey_id" ) ,
249+ "embedded_data_field" : study_variables . get ( " embedded_data_field" ) ,
195250 "progress_results" : participant_to_progress_dict ,
196251 })
197252
0 commit comments