meta-edc 0.3.39__py3-none-any.whl → 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. meta_ae/action_items.py +38 -27
  2. meta_ae/admin/__init__.py +11 -0
  3. meta_ae/admin/ae_initial_admin.py +5 -2
  4. meta_ae/admin/ae_susar_admin.py +1 -1
  5. meta_ae/admin/death_report_admin.py +1 -1
  6. meta_ae/admin/modeladmin_mixins.py +14 -15
  7. meta_ae/baker_recipes.py +4 -6
  8. meta_ae/choices.py +1 -1
  9. meta_ae/forms/__init__.py +13 -0
  10. meta_ae/forms/death_report_form.py +1 -1
  11. meta_ae/forms/modelform_mixins.py +2 -2
  12. meta_ae/list_data.py +1 -1
  13. meta_ae/migrations/0001_initial.py +27 -27
  14. meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -5
  15. meta_ae/migrations/0017_auto_20221130_2257.py +1 -1
  16. meta_ae/migrations/0022_historicalhospitalization_hospitalization.py +5 -13
  17. meta_ae/migrations/0023_alter_aefollowup_action_identifier_and_more.py +2017 -0
  18. meta_ae/model_mixins/__init__.py +2 -0
  19. meta_ae/model_mixins/ae_review_model_mixin.py +6 -6
  20. meta_ae/model_mixins/death_report_model_mixin.py +3 -3
  21. meta_ae/models/__init__.py +13 -0
  22. meta_ae/models/hospitalization.py +3 -3
  23. meta_ae/pdf_reports/__init__.py +2 -0
  24. meta_ae/templatetags/meta_ae_extras.py +4 -6
  25. meta_analytics/.DS_Store +0 -0
  26. meta_analytics/README.rst +1 -2
  27. meta_analytics/dataframes/__init__.py +27 -0
  28. meta_analytics/dataframes/constants.py +5 -2
  29. meta_analytics/dataframes/get_eos_df.py +16 -4
  30. meta_analytics/dataframes/get_glucose_df.py +166 -0
  31. meta_analytics/dataframes/get_glucose_fbg_df.py +26 -0
  32. meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +21 -0
  33. meta_analytics/dataframes/get_last_imp_visits_df.py +12 -10
  34. meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
  35. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +125 -124
  36. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +111 -235
  37. meta_analytics/dataframes/screening/__init__.py +2 -0
  38. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +1 -2
  39. meta_analytics/dataframes/screening/get_screening_df.py +9 -15
  40. meta_analytics/dataframes/utils.py +21 -12
  41. meta_analytics/get_tables.py +1 -2
  42. meta_analytics/tables/__init__.py +2 -0
  43. meta_analytics/tables/enrolled/glucose.py +2 -1
  44. meta_analytics/utils.py +81 -0
  45. meta_auth/auths.py +1 -1
  46. meta_consent/action_items.py +22 -3
  47. meta_consent/admin/__init__.py +7 -0
  48. meta_consent/admin/actions/__init__.py +2 -0
  49. meta_consent/admin/actions/create_missing_prescriptions.py +2 -2
  50. meta_consent/admin/list_filters.py +22 -0
  51. meta_consent/admin/modeladmin_mixins.py +4 -5
  52. meta_consent/admin/subject_consent_v1_ext_admin.py +93 -0
  53. meta_consent/baker_recipes.py +7 -7
  54. meta_consent/consents.py +15 -2
  55. meta_consent/constants.py +1 -0
  56. meta_consent/form_validators/__init__.py +2 -0
  57. meta_consent/forms/__init__.py +8 -0
  58. meta_consent/forms/subject_consent_v1_ext_form.py +47 -0
  59. meta_consent/forms/subject_reconsent_form.py +4 -4
  60. meta_consent/management/commands/create_missing_prescriptions.py +5 -3
  61. meta_consent/migrations/0001_initial.py +9 -9
  62. meta_consent/migrations/0024_historicalsubjectconsentv1.py +3 -8
  63. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +535 -0
  64. meta_consent/migrations/0027_auto_20250111_0344.py +30 -0
  65. meta_consent/migrations/0028_historicalsubjectconsentv1ext_assessment_score_and_more.py +162 -0
  66. meta_consent/migrations/0029_alter_historicalsubjectconsentv1ext_agrees_to_extension_and_more.py +33 -0
  67. meta_consent/migrations/0030_auto_20250120_2114.py +40 -0
  68. meta_consent/migrations/0031_alter_historicalsubjectconsent_guardian_name_and_more.py +124 -0
  69. meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
  70. meta_consent/migrations/0033_historicalsubjectconsentspfq_subjectconsentspfq.py +615 -0
  71. meta_consent/migrations/0034_remove_subjectconsentspfq_site_and_more.py +23 -0
  72. meta_consent/migrations/0035_alter_historicalsubjectconsent_consent_definition_name_and_more.py +43 -0
  73. meta_consent/models/__init__.py +10 -0
  74. meta_consent/models/model_mixins.py +1 -2
  75. meta_consent/models/signals.py +25 -11
  76. meta_consent/models/subject_consent.py +2 -2
  77. meta_consent/models/subject_consent_v1.py +0 -1
  78. meta_consent/models/subject_consent_v1_ext.py +34 -0
  79. meta_consent/models/subject_reconsent.py +4 -4
  80. meta_dashboard/navbars.py +2 -6
  81. meta_dashboard/patterns.py +1 -1
  82. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/eligibility_button.html +1 -1
  83. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/screening_button.html +1 -1
  84. meta_dashboard/templates/meta_dashboard/subject/dashboard/sidebar.html +24 -0
  85. meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/dashboard/top_bar.html +1 -1
  86. meta_dashboard/templates/meta_dashboard/subject/dashboard.html +14 -0
  87. meta_dashboard/templatetags/meta_dashboard_extras.py +9 -14
  88. meta_dashboard/urls.py +5 -5
  89. meta_dashboard/view_utils/__init__.py +13 -0
  90. meta_dashboard/view_utils/subject_screening_button.py +13 -20
  91. meta_dashboard/views/__init__.py +8 -0
  92. meta_dashboard/views/ae/__init__.py +2 -0
  93. meta_dashboard/views/ae/ae_listboard_view.py +1 -1
  94. meta_dashboard/views/ae/death_report_listboard_view.py +1 -1
  95. meta_dashboard/views/screening/__init__.py +2 -0
  96. meta_dashboard/views/screening/listboard_view.py +2 -3
  97. meta_dashboard/views/subject/__init__.py +2 -0
  98. meta_dashboard/views/subject/dashboard/__init__.py +2 -0
  99. meta_dashboard/views/subject/dashboard/dashboard_view.py +19 -8
  100. meta_dashboard/views/subject/listboard/__init__.py +2 -0
  101. meta_dashboard/views/subject/listboard/listboard_view.py +2 -3
  102. meta_edc/__init__.py +5 -9
  103. meta_edc/admin.py +3 -4
  104. meta_edc/celery.py +2 -2
  105. meta_edc/celery_live.py +19 -0
  106. meta_edc/celery_uat.py +25 -0
  107. meta_edc/management/commands/update_forms_reference.py +16 -14
  108. meta_edc/meta_version.py +2 -2
  109. meta_edc/navbars.py +7 -5
  110. meta_edc/settings/debug.py +13 -4
  111. meta_edc/settings/defaults.py +55 -18
  112. meta_edc/settings/live.py +4 -1
  113. meta_edc/settings/logging.py +9 -4
  114. meta_edc/settings/minimal.py +4 -5
  115. meta_edc/settings/uat.py +3 -1
  116. meta_edc/templates/meta_edc/{bootstrap3/base.html → base.html} +1 -1
  117. meta_edc/templates/meta_edc/{bootstrap3/home.html → home.html} +2 -2
  118. meta_edc/urls.py +3 -1
  119. meta_edc/utils.py +3 -1
  120. meta_edc/views/__init__.py +2 -0
  121. meta_edc/views/home_view.py +1 -2
  122. meta_edc-1.4.0.dist-info/METADATA +174 -0
  123. {meta_edc-0.3.39.dist-info → meta_edc-1.4.0.dist-info}/RECORD +578 -586
  124. meta_edc-1.4.0.dist-info/WHEEL +4 -0
  125. meta_labs/list_data.py +2 -2
  126. meta_labs/reportables.py +80 -11
  127. meta_lists/list_data.py +13 -4
  128. meta_lists/migrations/0008_auto_20200528_1517.py +2 -2
  129. meta_lists/migrations/0019_auto_20250128_0143.py +48 -0
  130. meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
  131. meta_pharmacy/admin/__init__.py +5 -0
  132. meta_pharmacy/admin/rx_admin.py +1 -0
  133. meta_pharmacy/admin/substitutions_admin.py +3 -3
  134. meta_pharmacy/constants.py +1 -1
  135. meta_pharmacy/forms/__init__.py +2 -0
  136. meta_pharmacy/forms/rx_form.py +0 -1
  137. meta_pharmacy/forms/substitutions_form.py +6 -4
  138. meta_pharmacy/labels/__init__.py +5 -2
  139. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +4 -1
  140. meta_pharmacy/labels/draw_label_with_test_data.py +2 -2
  141. meta_pharmacy/labels/label_data.py +1 -2
  142. meta_pharmacy/labels/print_sheets.py +4 -6
  143. meta_pharmacy/management/commands/update_initial_pharmacy_data.py +4 -3
  144. meta_pharmacy/migrations/0002_initial.py +7 -20
  145. meta_pharmacy/migrations/0003_auto_20240909_2335.py +3 -2
  146. meta_pharmacy/migrations/0006_lotnumber_label.py +5 -14
  147. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +5 -6
  148. meta_pharmacy/migrations/0010_alter_historicallabeldata_device_created_and_more.py +382 -0
  149. meta_pharmacy/models/__init__.py +7 -0
  150. meta_pharmacy/models/label_data.py +4 -5
  151. meta_pharmacy/models/rx_label.py +0 -1
  152. meta_pharmacy/models/substitutions.py +4 -4
  153. meta_pharmacy/prepare_meta_pharmacy.py +1 -1
  154. meta_pharmacy/utils/__init__.py +2 -0
  155. meta_pharmacy/utils/update_initial_pharmacy_data.py +1 -1
  156. meta_prn/action_items.py +44 -45
  157. meta_prn/admin/__init__.py +16 -0
  158. meta_prn/admin/dm_referral_admin.py +2 -1
  159. meta_prn/admin/end_of_study_admin.py +26 -15
  160. meta_prn/admin/loss_to_followup_admin.py +3 -2
  161. meta_prn/admin/off_study_medication_admin.py +5 -6
  162. meta_prn/admin/offschedule_admin.py +12 -11
  163. meta_prn/admin/offschedule_dm_referral_admin.py +11 -10
  164. meta_prn/admin/offschedule_postnatal_admin.py +15 -7
  165. meta_prn/admin/offschedule_pregnancy_admin.py +18 -9
  166. meta_prn/admin/onschedule_admin.py +7 -8
  167. meta_prn/admin/onschedule_dm_referral_admin.py +11 -12
  168. meta_prn/admin/pregnancy_notification_admin.py +5 -6
  169. meta_prn/admin/protocol_incident_admin.py +1 -1
  170. meta_prn/admin/subject_transfer_admin.py +1 -1
  171. meta_prn/baker_recipes.py +10 -10
  172. meta_prn/choices.py +11 -7
  173. meta_prn/constants.py +1 -0
  174. meta_prn/form_validators/__init__.py +5 -0
  175. meta_prn/form_validators/end_of_study.py +65 -20
  176. meta_prn/form_validators/protocol_incident.py +1 -1
  177. meta_prn/forms/__init__.py +13 -0
  178. meta_prn/forms/dm_referral_form.py +2 -8
  179. meta_prn/forms/end_of_study_form.py +1 -1
  180. meta_prn/forms/loss_to_followup_form.py +1 -1
  181. meta_prn/forms/off_study_medication_form.py +2 -2
  182. meta_prn/forms/offschedule_form.py +25 -0
  183. meta_prn/forms/pregnancy_notification_form.py +15 -17
  184. meta_prn/list_data.py +3 -3
  185. meta_prn/migrations/0001_initial.py +25 -25
  186. meta_prn/migrations/0017_auto_20220307_1929.py +5 -5
  187. meta_prn/migrations/0018_auto_20220309_2106.py +9 -9
  188. meta_prn/migrations/0021_auto_20220316_2147.py +13 -13
  189. meta_prn/migrations/0022_auto_20220318_0133.py +9 -9
  190. meta_prn/migrations/0032_historicalegfrnotification_egfrnotification.py +5 -13
  191. meta_prn/migrations/0034_auto_20220630_1110.py +1 -1
  192. meta_prn/migrations/0035_auto_20220630_1140.py +1 -1
  193. meta_prn/migrations/0038_alter_endofstudy_delivery_date_and_more.py +5 -13
  194. meta_prn/migrations/0041_endofstudy_transfer_date_and_more.py +5 -13
  195. meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +13 -38
  196. meta_prn/migrations/0060_alter_onschedule_managers_and_more.py +55 -0
  197. meta_prn/migrations/0061_auto_20250115_2025.py +56 -0
  198. meta_prn/migrations/0062_alter_endofstudy_offstudy_reason_and_more.py +72 -0
  199. meta_prn/migrations/0063_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  200. meta_prn/migrations/0064_auto_20250602_2143.py +18 -0
  201. meta_prn/migrations/0065_alter_historicaloffstudymedication_subject_identifier_and_more.py +23 -0
  202. meta_prn/migrations/0066_alter_historicallosstofollowup_subject_identifier_and_more.py +23 -0
  203. meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
  204. meta_prn/migrations/0068_alter_dmreferral_referral_note_and_more.py +235 -0
  205. meta_prn/migrations/0069_alter_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  206. meta_prn/models/__init__.py +20 -0
  207. meta_prn/models/dm_referral.py +2 -2
  208. meta_prn/models/end_of_study.py +28 -23
  209. meta_prn/models/loss_to_followup.py +8 -10
  210. meta_prn/models/off_study_medication.py +7 -4
  211. meta_prn/models/offschedule.py +4 -4
  212. meta_prn/models/pregnancy_notification.py +3 -5
  213. meta_prn/models/protocol_incident.py +5 -2
  214. meta_prn/models/signals.py +16 -14
  215. meta_prn/models/subject_transfer.py +7 -0
  216. meta_prn/templates/meta_prn/eos/additional_instructions.html +3 -0
  217. meta_prn/templates/meta_prn/offschedule/additional_instructions.html +2 -0
  218. meta_rando/migrations/0001_initial.py +5 -5
  219. meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
  220. meta_rando/migrations/0007_spfqlist.py +197 -0
  221. meta_rando/migrations/0008_delete_spfqlist.py +16 -0
  222. meta_rando/models/__init__.py +1 -0
  223. meta_rando/{models.py → models/randomization_list.py} +3 -3
  224. meta_rando/randomizers.py +2 -2
  225. meta_reports/__init__.py +2 -0
  226. meta_reports/admin/__init__.py +16 -0
  227. meta_reports/admin/dbviews/__init__.py +13 -0
  228. meta_reports/admin/dbviews/glucose_summary_admin.py +7 -7
  229. meta_reports/admin/dbviews/imp_substitutions_admin.py +14 -13
  230. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +5 -0
  231. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +27 -3
  232. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +7 -7
  233. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +2 -0
  234. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +0 -3
  235. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +2 -0
  236. meta_reports/admin/dbviews/on_study_missing_values_admin/unmanaged_model_admin.py +0 -1
  237. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +9 -9
  238. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +6 -6
  239. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +5 -5
  240. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +5 -5
  241. meta_reports/admin/endpoints_admin.py +1 -1
  242. meta_reports/admin/endpoints_all_admin.py +0 -1
  243. meta_reports/admin/last_imp_refill_admin.py +33 -36
  244. meta_reports/admin/list_filters.py +3 -3
  245. meta_reports/admin/modeladmin_mixins.py +10 -17
  246. meta_reports/death_report.py +2 -2
  247. meta_reports/forms/__init__.py +2 -0
  248. meta_reports/forms/missing_ogtt_note_form.py +3 -4
  249. meta_reports/management/commands/generate_endpoints.py +5 -4
  250. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +5 -14
  251. meta_reports/migrations/0054_auto_20250422_2003.py +81 -0
  252. meta_reports/migrations/0055_alter_glucosesummary_table.py +17 -0
  253. meta_reports/migrations/0056_auto_20250422_2214.py +54 -0
  254. meta_reports/migrations/0057_auto_20250422_2224.py +54 -0
  255. meta_reports/migrations/0058_auto_20250422_2232.py +54 -0
  256. meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
  257. meta_reports/migrations/0060_auto_20250926_0242.py +366 -0
  258. meta_reports/migrations/0061_auto_20251004_0043.py +21 -0
  259. meta_reports/migrations/0062_auto_20251004_0106.py +21 -0
  260. meta_reports/models/__init__.py +17 -0
  261. meta_reports/models/dbviews/__init__.py +14 -0
  262. meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
  263. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +15 -3
  264. meta_reports/models/dbviews/glucose_summary/view_definition.py +8 -5
  265. meta_reports/models/dbviews/imp_substitutions/__init__.py +2 -0
  266. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +1 -2
  267. meta_reports/models/dbviews/imp_substitutions/view_definition.py +1 -1
  268. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
  269. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +2 -2
  270. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +4 -3
  271. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +2 -0
  272. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +13 -11
  273. meta_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py +0 -1
  274. meta_reports/models/dbviews/on_study_missing_values/__init__.py +2 -0
  275. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +19 -1
  276. meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py +0 -1
  277. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +2 -0
  278. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/unmanaged_model.py +0 -1
  279. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +2 -0
  280. meta_reports/models/dbviews/unattended_three_in_row/unmanaged_model.py +0 -1
  281. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +2 -0
  282. meta_reports/models/dbviews/unattended_three_in_row2/unmanaged_model.py +0 -1
  283. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +2 -0
  284. meta_reports/models/dbviews/unattended_two_in_row/unmanaged_model.py +0 -1
  285. meta_reports/models/endpoints.py +8 -4
  286. meta_reports/models/last_imp_refill.py +2 -3
  287. meta_reports/pdf_report.py +2 -2
  288. meta_reports/tasks.py +4 -3
  289. meta_reports/templates/meta_reports/columns/subject_identifier_column.html +1 -1
  290. meta_reports/templates/meta_reports/endpoints_all_change_list_note.html +1 -1
  291. meta_reports/templates/meta_reports/endpoints_change_list_note.html +1 -1
  292. meta_reports/templates/meta_reports/last_imp_refill/changelist_note.html +13 -0
  293. meta_screening/admin/__init__.py +8 -0
  294. meta_screening/admin/fieldsets.py +13 -15
  295. meta_screening/admin/list_filters.py +7 -5
  296. meta_screening/admin/screening_part_one_admin.py +1 -3
  297. meta_screening/admin/screening_part_three_admin.py +2 -3
  298. meta_screening/admin/screening_part_two_admin.py +7 -10
  299. meta_screening/admin/subject_refusal_admin.py +5 -3
  300. meta_screening/admin/subject_screening_admin.py +21 -10
  301. meta_screening/baker_recipes.py +18 -10
  302. meta_screening/calculators.py +1 -1
  303. meta_screening/choices.py +1 -1
  304. meta_screening/constants.py +1 -1
  305. meta_screening/eligibility/__init__.py +9 -0
  306. meta_screening/eligibility/eligibility.py +21 -14
  307. meta_screening/eligibility/eligibility_part_one.py +1 -1
  308. meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
  309. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +68 -49
  310. meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +14 -15
  311. meta_screening/eligibility/eligibility_part_two.py +1 -1
  312. meta_screening/form_validators/__init__.py +8 -0
  313. meta_screening/form_validators/screening_part_one.py +1 -1
  314. meta_screening/form_validators/screening_part_three.py +6 -2
  315. meta_screening/form_validators/screening_part_two.py +1 -1
  316. meta_screening/form_validators/subject_refusal.py +1 -1
  317. meta_screening/forms/__init__.py +20 -0
  318. meta_screening/forms/field_lists.py +16 -18
  319. meta_screening/forms/screening_part_one_form.py +2 -2
  320. meta_screening/forms/screening_part_three_form.py +5 -3
  321. meta_screening/forms/screening_part_two_form.py +1 -5
  322. meta_screening/forms/subject_refusal_form.py +0 -4
  323. meta_screening/forms/subject_screening_form.py +0 -4
  324. meta_screening/migrations/0001_initial.py +15 -15
  325. meta_screening/migrations/0010_auto_20191106_0828.py +5 -5
  326. meta_screening/migrations/0012_auto_20191107_0427.py +1 -1
  327. meta_screening/migrations/0068_alter_historicalscreeningpartone_acute_condition_and_more.py +1579 -0
  328. meta_screening/model_mixins/__init__.py +8 -0
  329. meta_screening/model_mixins/calculated_model_mixin.py +2 -2
  330. meta_screening/model_mixins/creatinine_fields_model_mixin.py +1 -1
  331. meta_screening/model_mixins/eligibility_model_mixin.py +6 -4
  332. meta_screening/model_mixins/part_one_fields_model_mixin.py +16 -19
  333. meta_screening/model_mixins/part_three_fields_model_mixin.py +6 -7
  334. meta_screening/model_mixins/part_two_fields_model_mixin.py +19 -17
  335. meta_screening/models/__init__.py +9 -0
  336. meta_screening/models/icp_referral.py +5 -5
  337. meta_screening/models/proxy_models.py +1 -1
  338. meta_screening/models/signals.py +10 -11
  339. meta_screening/models/subject_refusal.py +1 -1
  340. meta_screening/models/subject_screening.py +2 -4
  341. meta_subject/action_items.py +18 -14
  342. meta_subject/admin/__init__.py +42 -0
  343. meta_subject/admin/birth_outcome_admin.py +7 -9
  344. meta_subject/admin/blood_results/__init__.py +9 -0
  345. meta_subject/admin/blood_results/blood_results_fbc_admin.py +1 -1
  346. meta_subject/admin/blood_results/blood_results_hba1c_admin.py +1 -1
  347. meta_subject/admin/blood_results/blood_results_ins_admin.py +1 -1
  348. meta_subject/admin/blood_results/blood_results_lft_admin.py +1 -1
  349. meta_subject/admin/blood_results/blood_results_lipids_admin.py +1 -1
  350. meta_subject/admin/blood_results/blood_results_rft_admin.py +3 -5
  351. meta_subject/admin/complications_glycemia_admin.py +1 -1
  352. meta_subject/admin/delivery_admin.py +8 -11
  353. meta_subject/admin/diabetes/__init__.py +2 -0
  354. meta_subject/admin/diabetes/dm_endpoint_admin.py +2 -2
  355. meta_subject/admin/diabetes/dm_followup_admin.py +3 -2
  356. meta_subject/admin/egfr_drop_notification_admin.py +1 -1
  357. meta_subject/admin/fields.py +5 -5
  358. meta_subject/admin/fieldsets.py +5 -5
  359. meta_subject/admin/followup_examination_admin.py +11 -9
  360. meta_subject/admin/followup_vitals_admin.py +31 -6
  361. meta_subject/admin/glucose_admin.py +4 -8
  362. meta_subject/admin/glucose_fbg_admin.py +18 -11
  363. meta_subject/admin/health_economics/__init__.py +2 -0
  364. meta_subject/admin/health_economics/health_economics_simple_admin.py +1 -1
  365. meta_subject/admin/health_economics/health_economics_update_admin.py +1 -1
  366. meta_subject/admin/hepatitis_test_admin.py +1 -1
  367. meta_subject/admin/hiv_exit_review_admin.py +55 -0
  368. meta_subject/admin/list_filters.py +5 -5
  369. meta_subject/admin/mnsi_admin.py +7 -5
  370. meta_subject/admin/next_appointment_admin.py +19 -0
  371. meta_subject/admin/other_arv_regimens_admin.py +3 -3
  372. meta_subject/admin/patient_history_admin.py +4 -4
  373. meta_subject/admin/physical_exam_admin.py +1 -1
  374. meta_subject/admin/pregnancy_update_admin.py +1 -1
  375. meta_subject/admin/study_medication_admin.py +8 -15
  376. meta_subject/admin/subject_requisition_admin.py +2 -2
  377. meta_subject/admin/subject_visit_admin.py +1 -1
  378. meta_subject/admin/subject_visit_missed_admin.py +1 -1
  379. meta_subject/admin/urine_dipstick_test_admin.py +1 -1
  380. meta_subject/admin/urine_pregnancy_admin.py +1 -1
  381. meta_subject/baker_recipes.py +15 -15
  382. meta_subject/choices.py +4 -3
  383. meta_subject/form_validators/__init__.py +15 -0
  384. meta_subject/form_validators/delivery_form_validator.py +3 -3
  385. meta_subject/form_validators/dm_endpoint_form_validator.py +3 -1
  386. meta_subject/form_validators/dm_followup_form_validator.py +8 -7
  387. meta_subject/form_validators/egfr_drop_notification_form_validator.py +1 -1
  388. meta_subject/form_validators/followup_examination_form_validator.py +1 -1
  389. meta_subject/form_validators/glucose_fbg_form_validator.py +76 -0
  390. meta_subject/form_validators/glucose_form_validator.py +10 -67
  391. meta_subject/form_validators/hiv_exit_review_form_validator.py +18 -0
  392. meta_subject/form_validators/mixins.py +95 -0
  393. meta_subject/forms/__init__.py +44 -0
  394. meta_subject/forms/blood_results/__init__.py +9 -0
  395. meta_subject/forms/blood_results/blood_results_hba1c_form.py +1 -1
  396. meta_subject/forms/blood_results/blood_results_rft_form.py +60 -4
  397. meta_subject/forms/delivery_form.py +2 -0
  398. meta_subject/forms/diabetes/__init__.py +2 -0
  399. meta_subject/forms/diabetes/dm_followup_form.py +2 -2
  400. meta_subject/forms/followup_vitals_form.py +27 -1
  401. meta_subject/forms/glucose_fbg_form.py +1 -46
  402. meta_subject/forms/health_economics/__init__.py +2 -0
  403. meta_subject/forms/hepatitis_test_form.py +1 -1
  404. meta_subject/forms/hiv_exit_review_form.py +13 -0
  405. meta_subject/forms/mixins.py +1 -1
  406. meta_subject/forms/next_appointment_form.py +36 -0
  407. meta_subject/forms/other_arv_regimens_form.py +1 -1
  408. meta_subject/forms/patient_history_form.py +1 -1
  409. meta_subject/forms/physical_exam_form.py +1 -1
  410. meta_subject/forms/pregnancy_update_form.py +1 -1
  411. meta_subject/forms/slider_widget.py +1 -1
  412. meta_subject/forms/study_medication_form.py +18 -12
  413. meta_subject/forms/subject_requisition_form.py +1 -1
  414. meta_subject/forms/subject_visit_missed_form.py +1 -1
  415. meta_subject/forms/urine_dipstick_test_form.py +1 -1
  416. meta_subject/forms/urine_pregnancy_form.py +1 -1
  417. meta_subject/management/commands/create_missing_refills.py +3 -3
  418. meta_subject/management/commands/create_missing_rx.py +2 -2
  419. meta_subject/management/commands/missed.py +20 -23
  420. meta_subject/metadata_rules/__init__.py +2 -0
  421. meta_subject/metadata_rules/metadata_rules.py +14 -0
  422. meta_subject/metadata_rules/predicates.py +44 -25
  423. meta_subject/migrations/0001_initial.py +61 -61
  424. meta_subject/migrations/0002_auto_20191021_0353.py +5 -5
  425. meta_subject/migrations/0012_auto_20200118_2334.py +5 -5
  426. meta_subject/migrations/0014_auto_20200120_1622.py +5 -5
  427. meta_subject/migrations/0018_coronakap_historicalcoronakap.py +5 -5
  428. meta_subject/migrations/0033_auto_20200516_2356.py +5 -5
  429. meta_subject/migrations/0038_auto_20200520_0020.py +5 -5
  430. meta_subject/migrations/0040_auto_20200527_2155.py +1 -1
  431. meta_subject/migrations/0045_auto_20200530_1801.py +1 -1
  432. meta_subject/migrations/0051_auto_20200617_2117.py +5 -5
  433. meta_subject/migrations/0063_auto_20210715_0337.py +5 -5
  434. meta_subject/migrations/0066_auto_20210721_0335.py +9 -9
  435. meta_subject/migrations/0067_auto_20210726_0340.py +5 -5
  436. meta_subject/migrations/0068_auto_20210728_1809.py +5 -5
  437. meta_subject/migrations/0072_auto_20210805_1545.py +7 -7
  438. meta_subject/migrations/0073_auto_20210809_0055.py +5 -5
  439. meta_subject/migrations/0077_auto_20210809_2323.py +3 -3
  440. meta_subject/migrations/0082_auto_20210823_1612.py +3 -3
  441. meta_subject/migrations/0083_auto_20210823_1620.py +3 -3
  442. meta_subject/migrations/0088_auto_20210924_0027.py +5 -5
  443. meta_subject/migrations/0090_auto_20210924_0424.py +5 -5
  444. meta_subject/migrations/0093_auto_20211117_0352.py +5 -5
  445. meta_subject/migrations/0095_auto_20220128_1719.py +5 -5
  446. meta_subject/migrations/0098_auto_20220309_2106.py +5 -5
  447. meta_subject/migrations/0101_auto_20220316_2147.py +13 -13
  448. meta_subject/migrations/0107_auto_20220415_0043.py +1 -1
  449. meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -13
  450. meta_subject/migrations/0128_auto_20220720_0055.py +1 -1
  451. meta_subject/migrations/0131_auto_20220722_0411.py +1 -1
  452. meta_subject/migrations/0135_auto_20220722_2212.py +2 -1
  453. meta_subject/migrations/0164_dmreferralfollowup_historicaldmreferralfollowup.py +5 -5
  454. meta_subject/migrations/0172_remove_historicalbloodresultsglu_action_item_and_more.py +1 -2
  455. meta_subject/migrations/0177_alter_bloodresultslft_alp_value_and_more.py +1 -2
  456. meta_subject/migrations/0178_historicalhealtheconomicsupdate_and_more.py +5 -14
  457. meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +1 -2
  458. meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +5 -14
  459. meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +5 -14
  460. meta_subject/migrations/0199_auto_20240516_0247.py +1 -1
  461. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +1 -2
  462. meta_subject/migrations/0212_auto_20240827_2222.py +1 -1
  463. meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +553 -0
  464. meta_subject/migrations/0217_alter_historicalnextappointment_appt_datetime_and_more.py +42 -0
  465. meta_subject/migrations/0218_alter_historicalnextappointment_appt_date_and_more.py +53 -0
  466. meta_subject/migrations/0219_remove_historicalnextappointment_allow_create_interim_and_more.py +92 -0
  467. meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +825 -0
  468. meta_subject/migrations/0221_auto_20250402_1913.py +42 -0
  469. meta_subject/migrations/0222_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
  470. meta_subject/migrations/0223_bloodresultsfbc_errors_bloodresultsgludummy_errors_and_more.py +83 -0
  471. meta_subject/migrations/0224_bloodresultsfbc_abnormal_summary_and_more.py +153 -0
  472. meta_subject/migrations/0225_followupvitals_waist_circumference_and_more.py +46 -0
  473. meta_subject/migrations/0226_followupvitals_waist_circumference_comment_and_more.py +97 -0
  474. meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
  475. meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +2518 -0
  476. meta_subject/migrations/0229_alter_glucosefbg_consent_model_and_more.py +1918 -0
  477. meta_subject/migrations/0230_alter_historicaldelivery_action_identifier_and_more.py +1733 -0
  478. meta_subject/migrations/0231_alter_historicalmedicationadherence_consent_model_and_more.py +2054 -0
  479. meta_subject/migrations/0232_alter_patienthistory_concomitant_conditions_and_more.py +1170 -0
  480. meta_subject/migrations/0233_historicalspfq_spfq.py +1066 -0
  481. meta_subject/migrations/0234_remove_spfq_site_remove_spfq_subject_visit_and_more.py +27 -0
  482. meta_subject/migrations/0235_glucosefbg_endpoint_today_and_more.py +606 -0
  483. meta_subject/migrations/0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more.py +58 -0
  484. meta_subject/migrations/0237_historicalhivexitreview_singleton_field_and_more.py +68 -0
  485. meta_subject/migrations/0238_historicalhivexitreview_available_and_more.py +88 -0
  486. meta_subject/model_mixins/__init__.py +10 -0
  487. meta_subject/model_mixins/arv_history_model_mixin.py +3 -44
  488. meta_subject/model_mixins/arv_review_model_mixin.py +53 -0
  489. meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
  490. meta_subject/model_mixins/vitals_fields_model_mixin.py +33 -0
  491. meta_subject/models/__init__.py +52 -0
  492. meta_subject/models/birth_outcomes.py +3 -3
  493. meta_subject/models/blood_results/__init__.py +11 -0
  494. meta_subject/models/blood_results/blood_results_glu.py +29 -0
  495. meta_subject/models/blood_results/blood_results_hba1c.py +0 -1
  496. meta_subject/models/blood_results/blood_results_ins.py +0 -1
  497. meta_subject/models/blood_results/blood_results_lft.py +0 -1
  498. meta_subject/models/delivery.py +4 -6
  499. meta_subject/models/diabetes/__init__.py +2 -0
  500. meta_subject/models/diabetes/dm_endpoint.py +5 -5
  501. meta_subject/models/diabetes/dm_followup.py +7 -8
  502. meta_subject/models/diet_and_lifestyle.py +2 -2
  503. meta_subject/models/followup_examination.py +12 -14
  504. meta_subject/models/glucose.py +5 -5
  505. meta_subject/models/glucose_fbg.py +17 -4
  506. meta_subject/models/health_economics/__init__.py +2 -0
  507. meta_subject/models/health_economics/health_economics.py +8 -8
  508. meta_subject/models/health_economics/health_economics_simple.py +2 -2
  509. meta_subject/models/health_economics/health_economics_update.py +3 -2
  510. meta_subject/models/hepatitis_test.py +2 -2
  511. meta_subject/models/hiv_exit_review.py +44 -0
  512. meta_subject/models/next_appointment.py +15 -0
  513. meta_subject/models/other_arv_regimens_detail.py +1 -1
  514. meta_subject/models/patient_history.py +6 -7
  515. meta_subject/models/physical_exam.py +2 -2
  516. meta_subject/models/pregnancy_update.py +1 -1
  517. meta_subject/models/signals.py +15 -13
  518. meta_subject/models/subject_visit.py +2 -2
  519. meta_subject/models/todo.txt +1 -1
  520. meta_subject/models/urine_dipstick_test.py +2 -2
  521. meta_subject/models/urine_pregnancy.py +1 -1
  522. meta_subject/static/meta_subject/slider.css +1 -1
  523. meta_subject/templates/meta_subject/endpoint_review_instructions.html +1 -1
  524. meta_subject/templates/meta_subject/widgets/slider.html +0 -1
  525. meta_visit_schedule/visit_schedules/__init__.py +2 -0
  526. meta_visit_schedule/visit_schedules/phase_three/__init__.py +2 -0
  527. meta_visit_schedule/visit_schedules/phase_three/crfs.py +34 -1
  528. meta_visit_schedule/visit_schedules/phase_three/schedule.py +4 -4
  529. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -2
  530. meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +2 -3
  531. meta_ae/tests/holidays.csv +0 -15
  532. meta_ae/tests/tests/test_actions.py +0 -127
  533. meta_ae/tests/urls.py +0 -10
  534. meta_analytics/dataframes/enrolled/__init__.py +0 -1
  535. meta_analytics/dataframes/enrolled/get_glucose_df.py +0 -122
  536. meta_analytics/tests/__init__.py +0 -0
  537. meta_analytics/tests/test_endpoints_by_date.py +0 -94
  538. meta_consent/tests/__init__.py +0 -0
  539. meta_consent/tests/holidays.csv +0 -15
  540. meta_consent/tests/tests/__init__.py +0 -0
  541. meta_consent/tests/tests/test_form_validators.py +0 -110
  542. meta_consent/tests/tests/test_subject_consent.py +0 -10
  543. meta_consent/tests/urls.py +0 -17
  544. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard.html +0 -11
  545. meta_dashboard/tests/__init__.py +0 -0
  546. meta_dashboard/tests/admin.py +0 -22
  547. meta_dashboard/tests/holidays.csv +0 -15
  548. meta_dashboard/tests/tests/__init__.py +0 -0
  549. meta_dashboard/tests/urls.py +0 -55
  550. meta_edc/tests/__init__.py +0 -0
  551. meta_edc/tests/tests/__init__.py +0 -0
  552. meta_edc/tests/tests/test_endpoints.py +0 -554
  553. meta_edc-0.3.39.dist-info/AUTHORS +0 -0
  554. meta_edc-0.3.39.dist-info/METADATA +0 -766
  555. meta_edc-0.3.39.dist-info/WHEEL +0 -5
  556. meta_edc-0.3.39.dist-info/top_level.txt +0 -20
  557. meta_labs/tests/__init__.py +0 -0
  558. meta_labs/tests/test_labs.py +0 -27
  559. meta_labs/tests/test_reportables.py +0 -16
  560. meta_labs/tests/urls.py +0 -4
  561. meta_lists/tests/__init__.py +0 -0
  562. meta_lists/tests/test_lists.py +0 -8
  563. meta_pharmacy/admin/actions.py +0 -38
  564. meta_prn/tests/__init__.py +0 -0
  565. meta_prn/tests/tests/__init__.py +0 -0
  566. meta_prn/tests/tests/test_actions.py +0 -97
  567. meta_prn/tests/tests/test_dm_referral.py +0 -206
  568. meta_prn/tests/tests/test_manager_order.py +0 -14
  569. meta_prn/tests/tests/test_pregnancy_notification.py +0 -93
  570. meta_prn/tests/urls.py +0 -10
  571. meta_rando/tests/__init__.py +0 -0
  572. meta_rando/tests/tests/__init__.py +0 -0
  573. meta_rando/tests/tests/test_randomizers.py +0 -57
  574. meta_reports/tests/__init__.py +0 -0
  575. meta_reports/tests/test_reports.py +0 -35
  576. meta_reports/tests/test_sql_gen.py +0 -5
  577. meta_reports/tests/urls.py +0 -4
  578. meta_screening/offline_models.py +0 -3
  579. meta_screening/tests/__init__.py +0 -0
  580. meta_screening/tests/holidays.csv +0 -15
  581. meta_screening/tests/meta_test_case_mixin.py +0 -216
  582. meta_screening/tests/options.py +0 -127
  583. meta_screening/tests/tests/__init__.py +0 -0
  584. meta_screening/tests/tests/test_forms.py +0 -397
  585. meta_screening/tests/tests/test_screening_part_one.py +0 -108
  586. meta_screening/tests/tests/test_screening_part_three.py +0 -436
  587. meta_screening/tests/tests/test_screening_part_two.py +0 -84
  588. meta_sites/tests/__init__.py +0 -0
  589. meta_sites/tests/test_sites.py +0 -12
  590. meta_sites/tests/urls.py +0 -4
  591. meta_stats/__init__.py +0 -0
  592. meta_stats/incidence.py +0 -16
  593. meta_stats/models.py +0 -0
  594. meta_stats/tests/__init__.py +0 -0
  595. meta_stats/tests/tests/__init__.py +0 -0
  596. meta_stats/tests/tests/test_incidence.py +0 -10
  597. meta_subject/tests/__init__.py +0 -0
  598. meta_subject/tests/holidays.csv +0 -15
  599. meta_subject/tests/tests/__init__.py +0 -0
  600. meta_subject/tests/tests/test_egfr.py +0 -234
  601. meta_subject/tests/tests/test_fixes.py +0 -64
  602. meta_subject/tests/tests/test_followup.py +0 -52
  603. meta_subject/tests/tests/test_manager_order.py +0 -11
  604. meta_subject/tests/tests/test_medication_adherence.py +0 -75
  605. meta_subject/tests/tests/test_metadata_rules.py +0 -135
  606. meta_subject/tests/tests/test_mnsi.py +0 -317
  607. meta_subject/tests/tests/test_patient_history_form.py +0 -74
  608. meta_subject/tests/tests/test_physical_exam.py +0 -84
  609. meta_subject/tests/tests/test_sf12.py +0 -173
  610. meta_subject/tests/tests/test_study_medication.py +0 -230
  611. meta_subject/tests/urls.py +0 -24
  612. meta_visit_schedule/tests/__init__.py +0 -0
  613. meta_visit_schedule/tests/tests/__init__.py +0 -0
  614. meta_visit_schedule/tests/tests/test_schedule.py +0 -181
  615. meta_visit_schedule/tests/urls.py +0 -4
  616. tests/__init__.py +0 -0
  617. tests/etc/randomization_list.csv +0 -241
  618. tests/etc/randomization_list_phase_three.csv +0 -241
  619. tests/etc/user-aes-local.key +0 -0
  620. tests/etc/user-aes-restricted.key +0 -1
  621. tests/etc/user-rsa-local-private.pem +0 -27
  622. tests/etc/user-rsa-local-public.pem +0 -9
  623. tests/etc/user-rsa-restricted-private.pem +0 -27
  624. tests/etc/user-rsa-restricted-public.pem +0 -9
  625. tests/etc/user-salt-local.key +0 -0
  626. tests/etc/user-salt-restricted.key +0 -0
  627. tests/holidays.csv +0 -15
  628. tests/test_settings.py +0 -186
  629. /meta_ae/templates/meta_ae/{bootstrap3/ae_initial_description.html → aeinitial_description.html} +0 -0
  630. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/add_consent_button.html +0 -0
  631. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/dashboard_button.html +0 -0
  632. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/refusal_button.html +0 -0
  633. /meta_dashboard/templates/meta_dashboard/{bootstrap3/screening → screening}/listboard.html +0 -0
  634. /meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/listboard.html +0 -0
  635. {meta_edc-0.3.39.dist-info → meta_edc-1.4.0.dist-info/licenses}/LICENSE +0 -0
  636. /meta_ae/tests/__init__.py → /meta_subject/management/__init__py.py +0 -0
  637. /meta_ae/tests/tests/__init__.py → /meta_subject/management/commands/__init__py.py +0 -0
@@ -0,0 +1,1066 @@
1
+ # Generated by Django 5.2.6 on 2025-09-30 00:41
2
+
3
+ import _socket
4
+ import django.db.models.deletion
5
+ import django.utils.timezone
6
+ import django_audit_fields.fields.hostname_modification_field
7
+ import django_audit_fields.fields.userfield
8
+ import django_audit_fields.fields.uuid_auto_field
9
+ import django_revision.revision_field
10
+ import edc_crf.model_mixins.crf_status_model_mixin
11
+ import edc_model.validators.date
12
+ import edc_protocol.validators
13
+ import edc_visit_tracking.managers
14
+ import simple_history.models
15
+ import uuid
16
+ from django.conf import settings
17
+ from django.db import migrations, models
18
+
19
+
20
+ class Migration(migrations.Migration):
21
+
22
+ dependencies = [
23
+ ("meta_subject", "0232_alter_patienthistory_concomitant_conditions_and_more"),
24
+ ("sites", "0002_alter_domain_unique"),
25
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
26
+ ]
27
+
28
+ operations = [
29
+ migrations.CreateModel(
30
+ name="HistoricalSpfq",
31
+ fields=[
32
+ (
33
+ "revision",
34
+ django_revision.revision_field.RevisionField(
35
+ blank=True,
36
+ default="",
37
+ editable=False,
38
+ help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
39
+ max_length=75,
40
+ verbose_name="Revision",
41
+ ),
42
+ ),
43
+ (
44
+ "created",
45
+ models.DateTimeField(blank=True, default=django.utils.timezone.now),
46
+ ),
47
+ (
48
+ "modified",
49
+ models.DateTimeField(blank=True, default=django.utils.timezone.now),
50
+ ),
51
+ (
52
+ "user_created",
53
+ django_audit_fields.fields.userfield.UserField(
54
+ blank=True,
55
+ default="",
56
+ help_text="Updated by admin.save_model",
57
+ max_length=50,
58
+ verbose_name="user created",
59
+ ),
60
+ ),
61
+ (
62
+ "user_modified",
63
+ django_audit_fields.fields.userfield.UserField(
64
+ blank=True,
65
+ default="",
66
+ help_text="Updated by admin.save_model",
67
+ max_length=50,
68
+ verbose_name="user modified",
69
+ ),
70
+ ),
71
+ (
72
+ "hostname_created",
73
+ models.CharField(
74
+ blank=True,
75
+ default=_socket.gethostname,
76
+ help_text="System field. (modified on create only)",
77
+ max_length=60,
78
+ verbose_name="Hostname created",
79
+ ),
80
+ ),
81
+ (
82
+ "hostname_modified",
83
+ django_audit_fields.fields.hostname_modification_field.HostnameModificationField(
84
+ blank=True,
85
+ default="",
86
+ help_text="System field. (modified on every save)",
87
+ max_length=50,
88
+ verbose_name="Hostname modified",
89
+ ),
90
+ ),
91
+ (
92
+ "device_created",
93
+ models.CharField(
94
+ blank=True,
95
+ default="",
96
+ max_length=10,
97
+ verbose_name="Device created",
98
+ ),
99
+ ),
100
+ (
101
+ "device_modified",
102
+ models.CharField(
103
+ blank=True,
104
+ default="",
105
+ max_length=10,
106
+ verbose_name="Device modified",
107
+ ),
108
+ ),
109
+ (
110
+ "locale_created",
111
+ models.CharField(
112
+ blank=True,
113
+ default="",
114
+ help_text="Auto-updated by Modeladmin",
115
+ max_length=10,
116
+ verbose_name="Locale created",
117
+ ),
118
+ ),
119
+ (
120
+ "locale_modified",
121
+ models.CharField(
122
+ blank=True,
123
+ default="",
124
+ help_text="Auto-updated by Modeladmin",
125
+ max_length=10,
126
+ verbose_name="Locale modified",
127
+ ),
128
+ ),
129
+ (
130
+ "id",
131
+ django_audit_fields.fields.uuid_auto_field.UUIDAutoField(
132
+ blank=True,
133
+ db_index=True,
134
+ editable=False,
135
+ help_text="System auto field. UUID primary key.",
136
+ ),
137
+ ),
138
+ (
139
+ "consent_model",
140
+ models.CharField(blank=True, default="", max_length=50),
141
+ ),
142
+ (
143
+ "consent_version",
144
+ models.CharField(blank=True, default="", max_length=10),
145
+ ),
146
+ (
147
+ "report_datetime",
148
+ models.DateTimeField(
149
+ default=django.utils.timezone.now,
150
+ help_text="If reporting today, use today's date/time, otherwise use the date/time this information was reported.",
151
+ validators=[
152
+ edc_protocol.validators.datetime_not_before_study_start,
153
+ edc_model.validators.date.datetime_not_future,
154
+ ],
155
+ verbose_name="Report Date",
156
+ ),
157
+ ),
158
+ (
159
+ "crf_status",
160
+ models.CharField(
161
+ choices=[
162
+ ("INCOMPLETE", "Incomplete (some data pending)"),
163
+ ("COMPLETE", "Complete"),
164
+ ],
165
+ default=edc_crf.model_mixins.crf_status_model_mixin.get_crf_status_default,
166
+ help_text="If some data is still pending, flag this CRF as incomplete",
167
+ max_length=25,
168
+ verbose_name="CRF status",
169
+ ),
170
+ ),
171
+ (
172
+ "crf_status_comments",
173
+ models.TextField(
174
+ blank=True,
175
+ default="",
176
+ help_text="for example, why some data is still pending",
177
+ verbose_name="Any comments related to status of this CRF",
178
+ ),
179
+ ),
180
+ (
181
+ "a01",
182
+ models.CharField(
183
+ choices=[
184
+ ("strongly_disagree", "Strongly disagree"),
185
+ ("disagree", "disagree"),
186
+ ("neutral", "Neutral"),
187
+ ("agree", "Agree"),
188
+ ("strongly_agree", "Strongly agree"),
189
+ ],
190
+ help_text="for example: when and how to take or use a treatment",
191
+ max_length=25,
192
+ verbose_name="I understood the treatment process in this trial",
193
+ ),
194
+ ),
195
+ (
196
+ "a02",
197
+ models.CharField(
198
+ choices=[
199
+ ("strongly_disagree", "Strongly disagree"),
200
+ ("disagree", "disagree"),
201
+ ("neutral", "Neutral"),
202
+ ("agree", "Agree"),
203
+ ("strongly_agree", "Strongly agree"),
204
+ ],
205
+ help_text="for example: visits and procedures, time commitment, who to contact with questions",
206
+ max_length=25,
207
+ verbose_name="The information given to me before I joined the trial was everything I wanted to know",
208
+ ),
209
+ ),
210
+ (
211
+ "a03",
212
+ models.CharField(
213
+ choices=[
214
+ ("strongly_disagree", "Strongly disagree"),
215
+ ("disagree", "disagree"),
216
+ ("neutral", "Neutral"),
217
+ ("agree", "Agree"),
218
+ ("strongly_agree", "Strongly agree"),
219
+ ],
220
+ help_text="for example: visits and procedures, time commitment, who to contact with questions",
221
+ max_length=25,
222
+ verbose_name="The information given to me before I joined the trial was easy for me to understand",
223
+ ),
224
+ ),
225
+ (
226
+ "a04",
227
+ models.CharField(
228
+ choices=[
229
+ ("strongly_disagree", "Strongly disagree"),
230
+ ("disagree", "disagree"),
231
+ ("neutral", "Neutral"),
232
+ ("agree", "Agree"),
233
+ ("strongly_agree", "Strongly agree"),
234
+ ],
235
+ max_length=25,
236
+ verbose_name="I felt comfortable that I could ask any questions before I joined the trial",
237
+ ),
238
+ ),
239
+ (
240
+ "b01",
241
+ models.CharField(
242
+ choices=[
243
+ ("strongly_disagree", "Strongly disagree"),
244
+ ("disagree", "disagree"),
245
+ ("neutral", "Neutral"),
246
+ ("agree", "Agree"),
247
+ ("strongly_agree", "Strongly agree"),
248
+ ],
249
+ help_text="for example: comfort and privacy of treatment area, waiting area, parking, ease of access to the site",
250
+ max_length=25,
251
+ verbose_name="Overall I was satisfied with the trial site",
252
+ ),
253
+ ),
254
+ (
255
+ "b02",
256
+ models.CharField(
257
+ choices=[
258
+ ("strongly_disagree", "Strongly disagree"),
259
+ ("disagree", "disagree"),
260
+ ("neutral", "Neutral"),
261
+ ("agree", "Agree"),
262
+ ("strongly_agree", "Strongly agree"),
263
+ ],
264
+ max_length=25,
265
+ verbose_name="My trial visits were well organized",
266
+ ),
267
+ ),
268
+ (
269
+ "b03",
270
+ models.CharField(
271
+ choices=[
272
+ ("strongly_disagree", "Strongly disagree"),
273
+ ("disagree", "disagree"),
274
+ ("neutral", "Neutral"),
275
+ ("agree", "Agree"),
276
+ ("strongly_agree", "Strongly agree"),
277
+ ],
278
+ max_length=25,
279
+ verbose_name="My trial visits were scheduled at a convenient time for me",
280
+ ),
281
+ ),
282
+ (
283
+ "b04",
284
+ models.CharField(
285
+ choices=[
286
+ ("strongly_disagree", "Strongly disagree"),
287
+ ("disagree", "disagree"),
288
+ ("neutral", "Neutral"),
289
+ ("agree", "Agree"),
290
+ ("strongly_agree", "Strongly agree"),
291
+ ],
292
+ max_length=25,
293
+ verbose_name="The staff treated me with respect",
294
+ ),
295
+ ),
296
+ (
297
+ "b05",
298
+ models.CharField(
299
+ choices=[
300
+ ("strongly_disagree", "Strongly disagree"),
301
+ ("disagree", "disagree"),
302
+ ("neutral", "Neutral"),
303
+ ("agree", "Agree"),
304
+ ("strongly_agree", "Strongly agree"),
305
+ ],
306
+ max_length=25,
307
+ verbose_name="I felt comfortable that I could ask questions during the trial",
308
+ ),
309
+ ),
310
+ (
311
+ "b06",
312
+ models.CharField(
313
+ choices=[
314
+ ("strongly_disagree", "Strongly disagree"),
315
+ ("disagree", "disagree"),
316
+ ("neutral", "Neutral"),
317
+ ("agree", "Agree"),
318
+ ("strongly_agree", "Strongly agree"),
319
+ ],
320
+ max_length=25,
321
+ verbose_name="I was satisfied with the answers I have received to my questions during the trial",
322
+ ),
323
+ ),
324
+ (
325
+ "b07",
326
+ models.CharField(
327
+ choices=[("Yes", "Yes"), ("No", "No")],
328
+ help_text="for example: in person visits, questionnaires, forms",
329
+ max_length=25,
330
+ verbose_name="The time taken to collect data was acceptable to me",
331
+ ),
332
+ ),
333
+ (
334
+ "b08",
335
+ models.CharField(
336
+ choices=[("Yes", "Yes"), ("No", "No")],
337
+ help_text="for example: household chores, work commitments, eating",
338
+ max_length=25,
339
+ verbose_name="The impact the trial has had on my daily activities is acceptable",
340
+ ),
341
+ ),
342
+ (
343
+ "b09",
344
+ models.CharField(
345
+ choices=[("Yes", "Yes"), ("No", "No")],
346
+ help_text="for example: in person, online questionnaire, diary, wearable sensors, monitoring machines, technology",
347
+ max_length=25,
348
+ verbose_name="The way in which trial data is being collected is acceptable to me",
349
+ ),
350
+ ),
351
+ (
352
+ "b10",
353
+ models.CharField(
354
+ choices=[
355
+ ("strongly_disagree", "Strongly disagree"),
356
+ ("disagree", "disagree"),
357
+ ("neutral", "Neutral"),
358
+ ("agree", "Agree"),
359
+ ("strongly_agree", "Strongly agree"),
360
+ ],
361
+ help_text="for example: blood tests, scans etc.",
362
+ max_length=25,
363
+ verbose_name="Optional: I am being kept informed of the results of my medical tests done during the trial, including during screening",
364
+ ),
365
+ ),
366
+ (
367
+ "c01",
368
+ models.CharField(
369
+ choices=[("Yes", "Yes"), ("No", "No")],
370
+ max_length=25,
371
+ verbose_name="I was informed when I had completed the trial",
372
+ ),
373
+ ),
374
+ (
375
+ "c02",
376
+ models.CharField(
377
+ choices=[("Yes", "Yes"), ("No", "No")],
378
+ max_length=25,
379
+ verbose_name="I was informed of any future opportunities to access the overall trial results if I wanted to",
380
+ ),
381
+ ),
382
+ (
383
+ "c03",
384
+ models.CharField(
385
+ choices=[
386
+ ("very_difficult", "Very difficult"),
387
+ ("difficult", "Difficult"),
388
+ ("neutral", "Neutral"),
389
+ ("easy", "Easy"),
390
+ ("very_easy", "Very easy"),
391
+ ],
392
+ max_length=25,
393
+ verbose_name="How easy was it to take the medication?",
394
+ ),
395
+ ),
396
+ (
397
+ "c04",
398
+ models.CharField(
399
+ choices=[
400
+ ("not_at_all", "Not at all"),
401
+ ("slight", "Slight"),
402
+ ("moderate", "Moderate"),
403
+ ("extreme", "Extreme"),
404
+ ("severe", "Severe"),
405
+ ],
406
+ max_length=25,
407
+ verbose_name="Did you experience any burden or side effects?",
408
+ ),
409
+ ),
410
+ (
411
+ "c05",
412
+ models.CharField(
413
+ choices=[
414
+ ("not_at_all", "Not at all"),
415
+ ("slightly", "Slightly"),
416
+ ("moderately", "Moderately"),
417
+ ("highly", "Highly"),
418
+ ("very_highly", "Very highly"),
419
+ ],
420
+ max_length=25,
421
+ verbose_name="How acceptable was it to take the drug?",
422
+ ),
423
+ ),
424
+ (
425
+ "c06",
426
+ models.CharField(
427
+ choices=[
428
+ ("very_difficult", "Very difficult"),
429
+ ("difficult", "Difficult"),
430
+ ("neutral", "Neutral"),
431
+ ("easy", "Easy"),
432
+ ("very_easy", "Very easy"),
433
+ ],
434
+ max_length=25,
435
+ verbose_name="How easy was it to fit the medication into your routine?",
436
+ ),
437
+ ),
438
+ (
439
+ "c07",
440
+ models.CharField(
441
+ choices=[
442
+ ("not_at_all", "Not at all"),
443
+ ("slight", "Slight"),
444
+ ("moderate", "Moderate"),
445
+ ("extreme", "Extreme"),
446
+ ("severe", "Severe"),
447
+ ],
448
+ max_length=25,
449
+ verbose_name="How burdensome was taking part in the trial?",
450
+ ),
451
+ ),
452
+ (
453
+ "c08",
454
+ models.CharField(
455
+ choices=[
456
+ ("strongly_disagree", "Strongly disagree"),
457
+ ("disagree", "disagree"),
458
+ ("neutral", "Neutral"),
459
+ ("agree", "Agree"),
460
+ ("strongly_agree", "Strongly agree"),
461
+ ],
462
+ help_text="for example: future treatment, follow-up contact details",
463
+ max_length=25,
464
+ verbose_name="Overall, I was satisfied with the information I received about future support after the trial",
465
+ ),
466
+ ),
467
+ (
468
+ "c09",
469
+ models.CharField(
470
+ choices=[
471
+ ("strongly_disagree", "Strongly disagree"),
472
+ ("disagree", "disagree"),
473
+ ("neutral", "Neutral"),
474
+ ("agree", "Agree"),
475
+ ("strongly_agree", "Strongly agree"),
476
+ ],
477
+ max_length=25,
478
+ verbose_name="Overall, I was satisfied with my trial experience",
479
+ ),
480
+ ),
481
+ (
482
+ "c10",
483
+ models.CharField(
484
+ choices=[
485
+ ("much_less_expected", "Much less than expected"),
486
+ ("somewhat_less_expected", "Somewhat less than expected"),
487
+ ("same_as_expected", "Same as expected"),
488
+ ("somewhat_more_expected", "Somewhat more than expected"),
489
+ ("much_more_expected", "Much more than expected"),
490
+ ],
491
+ max_length=25,
492
+ verbose_name="Compared to when the trial started, the overall commitment required was similar to what I expected",
493
+ ),
494
+ ),
495
+ (
496
+ "history_id",
497
+ models.UUIDField(
498
+ default=uuid.uuid4,
499
+ editable=False,
500
+ primary_key=True,
501
+ serialize=False,
502
+ ),
503
+ ),
504
+ ("history_date", models.DateTimeField(db_index=True)),
505
+ ("history_change_reason", models.CharField(max_length=100, null=True)),
506
+ (
507
+ "history_type",
508
+ models.CharField(
509
+ choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
510
+ max_length=1,
511
+ ),
512
+ ),
513
+ (
514
+ "history_user",
515
+ models.ForeignKey(
516
+ null=True,
517
+ on_delete=django.db.models.deletion.SET_NULL,
518
+ related_name="+",
519
+ to=settings.AUTH_USER_MODEL,
520
+ ),
521
+ ),
522
+ (
523
+ "site",
524
+ models.ForeignKey(
525
+ blank=True,
526
+ db_constraint=False,
527
+ null=True,
528
+ on_delete=django.db.models.deletion.DO_NOTHING,
529
+ related_name="+",
530
+ to="sites.site",
531
+ ),
532
+ ),
533
+ (
534
+ "subject_visit",
535
+ models.ForeignKey(
536
+ blank=True,
537
+ db_constraint=False,
538
+ null=True,
539
+ on_delete=django.db.models.deletion.DO_NOTHING,
540
+ related_name="+",
541
+ to="meta_subject.subjectvisit",
542
+ ),
543
+ ),
544
+ ],
545
+ options={
546
+ "verbose_name": "historical Feedback Questionnaire (SPFQ)",
547
+ "verbose_name_plural": "historical Feedback Questionnaires (SPFQ)",
548
+ "ordering": ("-history_date", "-history_id"),
549
+ "get_latest_by": ("history_date", "history_id"),
550
+ },
551
+ bases=(simple_history.models.HistoricalChanges, models.Model),
552
+ ),
553
+ migrations.CreateModel(
554
+ name="Spfq",
555
+ fields=[
556
+ (
557
+ "revision",
558
+ django_revision.revision_field.RevisionField(
559
+ blank=True,
560
+ default="",
561
+ editable=False,
562
+ help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
563
+ max_length=75,
564
+ verbose_name="Revision",
565
+ ),
566
+ ),
567
+ (
568
+ "created",
569
+ models.DateTimeField(blank=True, default=django.utils.timezone.now),
570
+ ),
571
+ (
572
+ "modified",
573
+ models.DateTimeField(blank=True, default=django.utils.timezone.now),
574
+ ),
575
+ (
576
+ "user_created",
577
+ django_audit_fields.fields.userfield.UserField(
578
+ blank=True,
579
+ default="",
580
+ help_text="Updated by admin.save_model",
581
+ max_length=50,
582
+ verbose_name="user created",
583
+ ),
584
+ ),
585
+ (
586
+ "user_modified",
587
+ django_audit_fields.fields.userfield.UserField(
588
+ blank=True,
589
+ default="",
590
+ help_text="Updated by admin.save_model",
591
+ max_length=50,
592
+ verbose_name="user modified",
593
+ ),
594
+ ),
595
+ (
596
+ "hostname_created",
597
+ models.CharField(
598
+ blank=True,
599
+ default=_socket.gethostname,
600
+ help_text="System field. (modified on create only)",
601
+ max_length=60,
602
+ verbose_name="Hostname created",
603
+ ),
604
+ ),
605
+ (
606
+ "hostname_modified",
607
+ django_audit_fields.fields.hostname_modification_field.HostnameModificationField(
608
+ blank=True,
609
+ default="",
610
+ help_text="System field. (modified on every save)",
611
+ max_length=50,
612
+ verbose_name="Hostname modified",
613
+ ),
614
+ ),
615
+ (
616
+ "device_created",
617
+ models.CharField(
618
+ blank=True,
619
+ default="",
620
+ max_length=10,
621
+ verbose_name="Device created",
622
+ ),
623
+ ),
624
+ (
625
+ "device_modified",
626
+ models.CharField(
627
+ blank=True,
628
+ default="",
629
+ max_length=10,
630
+ verbose_name="Device modified",
631
+ ),
632
+ ),
633
+ (
634
+ "locale_created",
635
+ models.CharField(
636
+ blank=True,
637
+ default="",
638
+ help_text="Auto-updated by Modeladmin",
639
+ max_length=10,
640
+ verbose_name="Locale created",
641
+ ),
642
+ ),
643
+ (
644
+ "locale_modified",
645
+ models.CharField(
646
+ blank=True,
647
+ default="",
648
+ help_text="Auto-updated by Modeladmin",
649
+ max_length=10,
650
+ verbose_name="Locale modified",
651
+ ),
652
+ ),
653
+ (
654
+ "id",
655
+ django_audit_fields.fields.uuid_auto_field.UUIDAutoField(
656
+ blank=True,
657
+ editable=False,
658
+ help_text="System auto field. UUID primary key.",
659
+ primary_key=True,
660
+ serialize=False,
661
+ ),
662
+ ),
663
+ (
664
+ "consent_model",
665
+ models.CharField(blank=True, default="", max_length=50),
666
+ ),
667
+ (
668
+ "consent_version",
669
+ models.CharField(blank=True, default="", max_length=10),
670
+ ),
671
+ (
672
+ "report_datetime",
673
+ models.DateTimeField(
674
+ default=django.utils.timezone.now,
675
+ help_text="If reporting today, use today's date/time, otherwise use the date/time this information was reported.",
676
+ validators=[
677
+ edc_protocol.validators.datetime_not_before_study_start,
678
+ edc_model.validators.date.datetime_not_future,
679
+ ],
680
+ verbose_name="Report Date",
681
+ ),
682
+ ),
683
+ (
684
+ "crf_status",
685
+ models.CharField(
686
+ choices=[
687
+ ("INCOMPLETE", "Incomplete (some data pending)"),
688
+ ("COMPLETE", "Complete"),
689
+ ],
690
+ default=edc_crf.model_mixins.crf_status_model_mixin.get_crf_status_default,
691
+ help_text="If some data is still pending, flag this CRF as incomplete",
692
+ max_length=25,
693
+ verbose_name="CRF status",
694
+ ),
695
+ ),
696
+ (
697
+ "crf_status_comments",
698
+ models.TextField(
699
+ blank=True,
700
+ default="",
701
+ help_text="for example, why some data is still pending",
702
+ verbose_name="Any comments related to status of this CRF",
703
+ ),
704
+ ),
705
+ (
706
+ "a01",
707
+ models.CharField(
708
+ choices=[
709
+ ("strongly_disagree", "Strongly disagree"),
710
+ ("disagree", "disagree"),
711
+ ("neutral", "Neutral"),
712
+ ("agree", "Agree"),
713
+ ("strongly_agree", "Strongly agree"),
714
+ ],
715
+ help_text="for example: when and how to take or use a treatment",
716
+ max_length=25,
717
+ verbose_name="I understood the treatment process in this trial",
718
+ ),
719
+ ),
720
+ (
721
+ "a02",
722
+ models.CharField(
723
+ choices=[
724
+ ("strongly_disagree", "Strongly disagree"),
725
+ ("disagree", "disagree"),
726
+ ("neutral", "Neutral"),
727
+ ("agree", "Agree"),
728
+ ("strongly_agree", "Strongly agree"),
729
+ ],
730
+ help_text="for example: visits and procedures, time commitment, who to contact with questions",
731
+ max_length=25,
732
+ verbose_name="The information given to me before I joined the trial was everything I wanted to know",
733
+ ),
734
+ ),
735
+ (
736
+ "a03",
737
+ models.CharField(
738
+ choices=[
739
+ ("strongly_disagree", "Strongly disagree"),
740
+ ("disagree", "disagree"),
741
+ ("neutral", "Neutral"),
742
+ ("agree", "Agree"),
743
+ ("strongly_agree", "Strongly agree"),
744
+ ],
745
+ help_text="for example: visits and procedures, time commitment, who to contact with questions",
746
+ max_length=25,
747
+ verbose_name="The information given to me before I joined the trial was easy for me to understand",
748
+ ),
749
+ ),
750
+ (
751
+ "a04",
752
+ models.CharField(
753
+ choices=[
754
+ ("strongly_disagree", "Strongly disagree"),
755
+ ("disagree", "disagree"),
756
+ ("neutral", "Neutral"),
757
+ ("agree", "Agree"),
758
+ ("strongly_agree", "Strongly agree"),
759
+ ],
760
+ max_length=25,
761
+ verbose_name="I felt comfortable that I could ask any questions before I joined the trial",
762
+ ),
763
+ ),
764
+ (
765
+ "b01",
766
+ models.CharField(
767
+ choices=[
768
+ ("strongly_disagree", "Strongly disagree"),
769
+ ("disagree", "disagree"),
770
+ ("neutral", "Neutral"),
771
+ ("agree", "Agree"),
772
+ ("strongly_agree", "Strongly agree"),
773
+ ],
774
+ help_text="for example: comfort and privacy of treatment area, waiting area, parking, ease of access to the site",
775
+ max_length=25,
776
+ verbose_name="Overall I was satisfied with the trial site",
777
+ ),
778
+ ),
779
+ (
780
+ "b02",
781
+ models.CharField(
782
+ choices=[
783
+ ("strongly_disagree", "Strongly disagree"),
784
+ ("disagree", "disagree"),
785
+ ("neutral", "Neutral"),
786
+ ("agree", "Agree"),
787
+ ("strongly_agree", "Strongly agree"),
788
+ ],
789
+ max_length=25,
790
+ verbose_name="My trial visits were well organized",
791
+ ),
792
+ ),
793
+ (
794
+ "b03",
795
+ models.CharField(
796
+ choices=[
797
+ ("strongly_disagree", "Strongly disagree"),
798
+ ("disagree", "disagree"),
799
+ ("neutral", "Neutral"),
800
+ ("agree", "Agree"),
801
+ ("strongly_agree", "Strongly agree"),
802
+ ],
803
+ max_length=25,
804
+ verbose_name="My trial visits were scheduled at a convenient time for me",
805
+ ),
806
+ ),
807
+ (
808
+ "b04",
809
+ models.CharField(
810
+ choices=[
811
+ ("strongly_disagree", "Strongly disagree"),
812
+ ("disagree", "disagree"),
813
+ ("neutral", "Neutral"),
814
+ ("agree", "Agree"),
815
+ ("strongly_agree", "Strongly agree"),
816
+ ],
817
+ max_length=25,
818
+ verbose_name="The staff treated me with respect",
819
+ ),
820
+ ),
821
+ (
822
+ "b05",
823
+ models.CharField(
824
+ choices=[
825
+ ("strongly_disagree", "Strongly disagree"),
826
+ ("disagree", "disagree"),
827
+ ("neutral", "Neutral"),
828
+ ("agree", "Agree"),
829
+ ("strongly_agree", "Strongly agree"),
830
+ ],
831
+ max_length=25,
832
+ verbose_name="I felt comfortable that I could ask questions during the trial",
833
+ ),
834
+ ),
835
+ (
836
+ "b06",
837
+ models.CharField(
838
+ choices=[
839
+ ("strongly_disagree", "Strongly disagree"),
840
+ ("disagree", "disagree"),
841
+ ("neutral", "Neutral"),
842
+ ("agree", "Agree"),
843
+ ("strongly_agree", "Strongly agree"),
844
+ ],
845
+ max_length=25,
846
+ verbose_name="I was satisfied with the answers I have received to my questions during the trial",
847
+ ),
848
+ ),
849
+ (
850
+ "b07",
851
+ models.CharField(
852
+ choices=[("Yes", "Yes"), ("No", "No")],
853
+ help_text="for example: in person visits, questionnaires, forms",
854
+ max_length=25,
855
+ verbose_name="The time taken to collect data was acceptable to me",
856
+ ),
857
+ ),
858
+ (
859
+ "b08",
860
+ models.CharField(
861
+ choices=[("Yes", "Yes"), ("No", "No")],
862
+ help_text="for example: household chores, work commitments, eating",
863
+ max_length=25,
864
+ verbose_name="The impact the trial has had on my daily activities is acceptable",
865
+ ),
866
+ ),
867
+ (
868
+ "b09",
869
+ models.CharField(
870
+ choices=[("Yes", "Yes"), ("No", "No")],
871
+ help_text="for example: in person, online questionnaire, diary, wearable sensors, monitoring machines, technology",
872
+ max_length=25,
873
+ verbose_name="The way in which trial data is being collected is acceptable to me",
874
+ ),
875
+ ),
876
+ (
877
+ "b10",
878
+ models.CharField(
879
+ choices=[
880
+ ("strongly_disagree", "Strongly disagree"),
881
+ ("disagree", "disagree"),
882
+ ("neutral", "Neutral"),
883
+ ("agree", "Agree"),
884
+ ("strongly_agree", "Strongly agree"),
885
+ ],
886
+ help_text="for example: blood tests, scans etc.",
887
+ max_length=25,
888
+ verbose_name="Optional: I am being kept informed of the results of my medical tests done during the trial, including during screening",
889
+ ),
890
+ ),
891
+ (
892
+ "c01",
893
+ models.CharField(
894
+ choices=[("Yes", "Yes"), ("No", "No")],
895
+ max_length=25,
896
+ verbose_name="I was informed when I had completed the trial",
897
+ ),
898
+ ),
899
+ (
900
+ "c02",
901
+ models.CharField(
902
+ choices=[("Yes", "Yes"), ("No", "No")],
903
+ max_length=25,
904
+ verbose_name="I was informed of any future opportunities to access the overall trial results if I wanted to",
905
+ ),
906
+ ),
907
+ (
908
+ "c03",
909
+ models.CharField(
910
+ choices=[
911
+ ("very_difficult", "Very difficult"),
912
+ ("difficult", "Difficult"),
913
+ ("neutral", "Neutral"),
914
+ ("easy", "Easy"),
915
+ ("very_easy", "Very easy"),
916
+ ],
917
+ max_length=25,
918
+ verbose_name="How easy was it to take the medication?",
919
+ ),
920
+ ),
921
+ (
922
+ "c04",
923
+ models.CharField(
924
+ choices=[
925
+ ("not_at_all", "Not at all"),
926
+ ("slight", "Slight"),
927
+ ("moderate", "Moderate"),
928
+ ("extreme", "Extreme"),
929
+ ("severe", "Severe"),
930
+ ],
931
+ max_length=25,
932
+ verbose_name="Did you experience any burden or side effects?",
933
+ ),
934
+ ),
935
+ (
936
+ "c05",
937
+ models.CharField(
938
+ choices=[
939
+ ("not_at_all", "Not at all"),
940
+ ("slightly", "Slightly"),
941
+ ("moderately", "Moderately"),
942
+ ("highly", "Highly"),
943
+ ("very_highly", "Very highly"),
944
+ ],
945
+ max_length=25,
946
+ verbose_name="How acceptable was it to take the drug?",
947
+ ),
948
+ ),
949
+ (
950
+ "c06",
951
+ models.CharField(
952
+ choices=[
953
+ ("very_difficult", "Very difficult"),
954
+ ("difficult", "Difficult"),
955
+ ("neutral", "Neutral"),
956
+ ("easy", "Easy"),
957
+ ("very_easy", "Very easy"),
958
+ ],
959
+ max_length=25,
960
+ verbose_name="How easy was it to fit the medication into your routine?",
961
+ ),
962
+ ),
963
+ (
964
+ "c07",
965
+ models.CharField(
966
+ choices=[
967
+ ("not_at_all", "Not at all"),
968
+ ("slight", "Slight"),
969
+ ("moderate", "Moderate"),
970
+ ("extreme", "Extreme"),
971
+ ("severe", "Severe"),
972
+ ],
973
+ max_length=25,
974
+ verbose_name="How burdensome was taking part in the trial?",
975
+ ),
976
+ ),
977
+ (
978
+ "c08",
979
+ models.CharField(
980
+ choices=[
981
+ ("strongly_disagree", "Strongly disagree"),
982
+ ("disagree", "disagree"),
983
+ ("neutral", "Neutral"),
984
+ ("agree", "Agree"),
985
+ ("strongly_agree", "Strongly agree"),
986
+ ],
987
+ help_text="for example: future treatment, follow-up contact details",
988
+ max_length=25,
989
+ verbose_name="Overall, I was satisfied with the information I received about future support after the trial",
990
+ ),
991
+ ),
992
+ (
993
+ "c09",
994
+ models.CharField(
995
+ choices=[
996
+ ("strongly_disagree", "Strongly disagree"),
997
+ ("disagree", "disagree"),
998
+ ("neutral", "Neutral"),
999
+ ("agree", "Agree"),
1000
+ ("strongly_agree", "Strongly agree"),
1001
+ ],
1002
+ max_length=25,
1003
+ verbose_name="Overall, I was satisfied with my trial experience",
1004
+ ),
1005
+ ),
1006
+ (
1007
+ "c10",
1008
+ models.CharField(
1009
+ choices=[
1010
+ ("much_less_expected", "Much less than expected"),
1011
+ ("somewhat_less_expected", "Somewhat less than expected"),
1012
+ ("same_as_expected", "Same as expected"),
1013
+ ("somewhat_more_expected", "Somewhat more than expected"),
1014
+ ("much_more_expected", "Much more than expected"),
1015
+ ],
1016
+ max_length=25,
1017
+ verbose_name="Compared to when the trial started, the overall commitment required was similar to what I expected",
1018
+ ),
1019
+ ),
1020
+ (
1021
+ "site",
1022
+ models.ForeignKey(
1023
+ null=True,
1024
+ on_delete=django.db.models.deletion.PROTECT,
1025
+ related_name="+",
1026
+ to="sites.site",
1027
+ ),
1028
+ ),
1029
+ (
1030
+ "subject_visit",
1031
+ models.OneToOneField(
1032
+ on_delete=django.db.models.deletion.PROTECT,
1033
+ to="meta_subject.subjectvisit",
1034
+ ),
1035
+ ),
1036
+ ],
1037
+ options={
1038
+ "verbose_name": "Feedback Questionnaire (SPFQ)",
1039
+ "verbose_name_plural": "Feedback Questionnaires (SPFQ)",
1040
+ "abstract": False,
1041
+ "default_permissions": (
1042
+ "add",
1043
+ "change",
1044
+ "delete",
1045
+ "view",
1046
+ "export",
1047
+ "import",
1048
+ ),
1049
+ "default_manager_name": "objects",
1050
+ "indexes": [
1051
+ models.Index(
1052
+ fields=["subject_visit", "site"],
1053
+ name="meta_subjec_subject_7ecbde_idx",
1054
+ ),
1055
+ models.Index(
1056
+ fields=["subject_visit", "report_datetime"],
1057
+ name="meta_subjec_subject_f51f0f_idx",
1058
+ ),
1059
+ ],
1060
+ },
1061
+ managers=[
1062
+ ("objects", edc_visit_tracking.managers.CrfModelManager()),
1063
+ ("on_site", edc_visit_tracking.managers.CrfCurrentSiteManager()),
1064
+ ],
1065
+ ),
1066
+ ]