meta-edc 1.1.8__py3-none-any.whl → 1.1.12__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.

Potentially problematic release.


This version of meta-edc might be problematic. Click here for more details.

Files changed (475) hide show
  1. meta_ae/action_items.py +2 -1
  2. meta_ae/admin/__init__.py +11 -0
  3. meta_ae/admin/ae_susar_admin.py +1 -1
  4. meta_ae/admin/death_report_admin.py +1 -1
  5. meta_ae/admin/modeladmin_mixins.py +10 -12
  6. meta_ae/baker_recipes.py +3 -3
  7. meta_ae/forms/__init__.py +13 -0
  8. meta_ae/forms/modelform_mixins.py +2 -2
  9. meta_ae/migrations/0001_initial.py +27 -27
  10. meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -5
  11. meta_ae/migrations/0022_historicalhospitalization_hospitalization.py +5 -13
  12. meta_ae/migrations/0023_alter_aefollowup_action_identifier_and_more.py +2017 -0
  13. meta_ae/model_mixins/__init__.py +2 -0
  14. meta_ae/model_mixins/ae_review_model_mixin.py +6 -6
  15. meta_ae/model_mixins/death_report_model_mixin.py +3 -3
  16. meta_ae/models/__init__.py +13 -0
  17. meta_ae/models/hospitalization.py +3 -3
  18. meta_ae/pdf_reports/__init__.py +2 -0
  19. meta_analytics/.DS_Store +0 -0
  20. meta_analytics/dataframes/__init__.py +24 -0
  21. meta_analytics/dataframes/get_eos_df.py +1 -2
  22. meta_analytics/dataframes/get_glucose_df.py +6 -7
  23. meta_analytics/dataframes/get_glucose_fbg_df.py +2 -3
  24. meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +1 -2
  25. meta_analytics/dataframes/get_last_imp_visits_df.py +5 -6
  26. meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
  27. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +13 -20
  28. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +9 -10
  29. meta_analytics/dataframes/screening/__init__.py +2 -0
  30. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +1 -2
  31. meta_analytics/dataframes/screening/get_screening_df.py +6 -10
  32. meta_analytics/dataframes/utils.py +3 -8
  33. meta_analytics/get_tables.py +1 -2
  34. meta_analytics/tables/__init__.py +2 -0
  35. meta_consent/action_items.py +2 -1
  36. meta_consent/admin/__init__.py +6 -0
  37. meta_consent/admin/actions/__init__.py +2 -0
  38. meta_consent/admin/actions/create_missing_prescriptions.py +1 -1
  39. meta_consent/admin/list_filters.py +2 -2
  40. meta_consent/admin/modeladmin_mixins.py +3 -4
  41. meta_consent/admin/subject_consent_v1_ext_admin.py +2 -2
  42. meta_consent/baker_recipes.py +7 -8
  43. meta_consent/form_validators/__init__.py +2 -0
  44. meta_consent/forms/__init__.py +7 -0
  45. meta_consent/forms/subject_consent_v1_ext_form.py +2 -3
  46. meta_consent/forms/subject_reconsent_form.py +4 -4
  47. meta_consent/management/commands/create_missing_prescriptions.py +4 -2
  48. meta_consent/migrations/0001_initial.py +9 -9
  49. meta_consent/migrations/0024_historicalsubjectconsentv1.py +3 -8
  50. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +5 -14
  51. meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
  52. meta_consent/models/__init__.py +9 -0
  53. meta_consent/models/model_mixins.py +1 -2
  54. meta_consent/models/signals.py +9 -10
  55. meta_consent/models/subject_consent.py +1 -1
  56. meta_consent/models/subject_reconsent.py +3 -3
  57. meta_dashboard/patterns.py +1 -1
  58. meta_dashboard/templatetags/meta_dashboard_extras.py +1 -1
  59. meta_dashboard/view_utils/__init__.py +7 -0
  60. meta_dashboard/view_utils/subject_screening_button.py +9 -16
  61. meta_dashboard/views/__init__.py +8 -0
  62. meta_dashboard/views/ae/__init__.py +2 -0
  63. meta_dashboard/views/ae/ae_listboard_view.py +1 -1
  64. meta_dashboard/views/ae/death_report_listboard_view.py +1 -1
  65. meta_dashboard/views/screening/__init__.py +2 -0
  66. meta_dashboard/views/subject/__init__.py +2 -0
  67. meta_dashboard/views/subject/dashboard/__init__.py +2 -0
  68. meta_dashboard/views/subject/dashboard/dashboard_view.py +1 -1
  69. meta_dashboard/views/subject/listboard/__init__.py +2 -0
  70. meta_edc/__init__.py +5 -9
  71. meta_edc/celery.py +1 -1
  72. meta_edc/celery_live.py +1 -1
  73. meta_edc/celery_uat.py +1 -1
  74. meta_edc/management/commands/update_forms_reference.py +10 -12
  75. meta_edc/settings/debug.py +5 -4
  76. meta_edc/settings/defaults.py +18 -3
  77. meta_edc/settings/live.py +3 -1
  78. meta_edc/settings/logging.py +9 -4
  79. meta_edc/settings/minimal.py +4 -5
  80. meta_edc/settings/uat.py +3 -1
  81. meta_edc/views/__init__.py +2 -0
  82. meta_edc-1.1.12.dist-info/METADATA +174 -0
  83. {meta_edc-1.1.8.dist-info → meta_edc-1.1.12.dist-info}/RECORD +413 -526
  84. meta_edc-1.1.12.dist-info/WHEEL +4 -0
  85. meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
  86. meta_pharmacy/admin/__init__.py +5 -0
  87. meta_pharmacy/admin/substitutions_admin.py +2 -2
  88. meta_pharmacy/forms/__init__.py +2 -0
  89. meta_pharmacy/forms/substitutions_form.py +6 -4
  90. meta_pharmacy/labels/__init__.py +4 -2
  91. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +1 -2
  92. meta_pharmacy/labels/draw_label_with_test_data.py +2 -2
  93. meta_pharmacy/labels/label_data.py +1 -2
  94. meta_pharmacy/labels/print_sheets.py +4 -6
  95. meta_pharmacy/migrations/0002_initial.py +7 -20
  96. meta_pharmacy/migrations/0003_auto_20240909_2335.py +3 -2
  97. meta_pharmacy/migrations/0006_lotnumber_label.py +5 -14
  98. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +5 -6
  99. meta_pharmacy/migrations/0010_alter_historicallabeldata_device_created_and_more.py +382 -0
  100. meta_pharmacy/models/__init__.py +7 -0
  101. meta_pharmacy/models/label_data.py +4 -5
  102. meta_pharmacy/models/substitutions.py +3 -3
  103. meta_pharmacy/prepare_meta_pharmacy.py +1 -1
  104. meta_pharmacy/utils/__init__.py +2 -0
  105. meta_pharmacy/utils/update_initial_pharmacy_data.py +1 -1
  106. meta_prn/admin/__init__.py +16 -0
  107. meta_prn/admin/dm_referral_admin.py +2 -1
  108. meta_prn/admin/end_of_study_admin.py +6 -7
  109. meta_prn/admin/loss_to_followup_admin.py +3 -2
  110. meta_prn/admin/off_study_medication_admin.py +5 -6
  111. meta_prn/admin/offschedule_admin.py +5 -6
  112. meta_prn/admin/offschedule_dm_referral_admin.py +6 -6
  113. meta_prn/admin/offschedule_postnatal_admin.py +7 -7
  114. meta_prn/admin/offschedule_pregnancy_admin.py +8 -7
  115. meta_prn/admin/onschedule_admin.py +7 -8
  116. meta_prn/admin/onschedule_dm_referral_admin.py +6 -7
  117. meta_prn/admin/pregnancy_notification_admin.py +5 -6
  118. meta_prn/admin/protocol_incident_admin.py +1 -1
  119. meta_prn/admin/subject_transfer_admin.py +1 -1
  120. meta_prn/baker_recipes.py +4 -4
  121. meta_prn/form_validators/__init__.py +5 -0
  122. meta_prn/form_validators/end_of_study.py +2 -2
  123. meta_prn/forms/__init__.py +13 -0
  124. meta_prn/migrations/0001_initial.py +25 -25
  125. meta_prn/migrations/0017_auto_20220307_1929.py +5 -5
  126. meta_prn/migrations/0018_auto_20220309_2106.py +9 -9
  127. meta_prn/migrations/0021_auto_20220316_2147.py +13 -13
  128. meta_prn/migrations/0022_auto_20220318_0133.py +9 -9
  129. meta_prn/migrations/0032_historicalegfrnotification_egfrnotification.py +5 -13
  130. meta_prn/migrations/0038_alter_endofstudy_delivery_date_and_more.py +5 -13
  131. meta_prn/migrations/0041_endofstudy_transfer_date_and_more.py +5 -13
  132. meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +13 -38
  133. meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
  134. meta_prn/models/__init__.py +20 -0
  135. meta_prn/models/offschedule.py +4 -4
  136. meta_prn/models/protocol_incident.py +1 -1
  137. meta_prn/models/subject_transfer.py +8 -0
  138. meta_rando/migrations/0001_initial.py +5 -5
  139. meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
  140. meta_reports/__init__.py +2 -0
  141. meta_reports/admin/__init__.py +16 -0
  142. meta_reports/admin/dbviews/__init__.py +13 -0
  143. meta_reports/admin/dbviews/glucose_summary_admin.py +6 -6
  144. meta_reports/admin/dbviews/imp_substitutions_admin.py +12 -11
  145. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +5 -0
  146. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +27 -3
  147. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +6 -6
  148. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +2 -0
  149. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +0 -3
  150. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +2 -0
  151. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +8 -8
  152. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +6 -6
  153. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +5 -5
  154. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +5 -5
  155. meta_reports/admin/endpoints_admin.py +1 -1
  156. meta_reports/admin/last_imp_refill_admin.py +9 -9
  157. meta_reports/admin/list_filters.py +2 -2
  158. meta_reports/admin/modeladmin_mixins.py +9 -16
  159. meta_reports/death_report.py +1 -1
  160. meta_reports/forms/__init__.py +2 -0
  161. meta_reports/forms/missing_ogtt_note_form.py +2 -3
  162. meta_reports/management/commands/generate_endpoints.py +5 -4
  163. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +5 -14
  164. meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
  165. meta_reports/models/__init__.py +17 -0
  166. meta_reports/models/dbviews/__init__.py +14 -0
  167. meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
  168. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +4 -5
  169. meta_reports/models/dbviews/imp_substitutions/__init__.py +2 -0
  170. meta_reports/models/dbviews/imp_substitutions/view_definition.py +1 -1
  171. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
  172. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +1 -1
  173. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +4 -3
  174. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +2 -0
  175. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +13 -11
  176. meta_reports/models/dbviews/on_study_missing_values/__init__.py +2 -0
  177. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +18 -0
  178. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +2 -0
  179. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +2 -0
  180. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +2 -0
  181. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +2 -0
  182. meta_reports/models/endpoints.py +4 -4
  183. meta_reports/models/last_imp_refill.py +2 -3
  184. meta_reports/pdf_report.py +2 -2
  185. meta_reports/tasks.py +1 -1
  186. meta_screening/admin/__init__.py +8 -0
  187. meta_screening/admin/fieldsets.py +13 -14
  188. meta_screening/admin/list_filters.py +6 -4
  189. meta_screening/admin/screening_part_one_admin.py +1 -2
  190. meta_screening/admin/screening_part_three_admin.py +2 -3
  191. meta_screening/admin/screening_part_two_admin.py +7 -10
  192. meta_screening/admin/subject_refusal_admin.py +5 -3
  193. meta_screening/admin/subject_screening_admin.py +4 -4
  194. meta_screening/baker_recipes.py +9 -9
  195. meta_screening/eligibility/__init__.py +9 -0
  196. meta_screening/eligibility/eligibility.py +7 -7
  197. meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
  198. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +8 -8
  199. meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +13 -14
  200. meta_screening/form_validators/__init__.py +8 -0
  201. meta_screening/forms/__init__.py +20 -0
  202. meta_screening/forms/field_lists.py +16 -17
  203. meta_screening/forms/screening_part_one_form.py +2 -2
  204. meta_screening/forms/screening_part_three_form.py +5 -3
  205. meta_screening/forms/screening_part_two_form.py +1 -5
  206. meta_screening/forms/subject_refusal_form.py +0 -4
  207. meta_screening/forms/subject_screening_form.py +0 -4
  208. meta_screening/migrations/0001_initial.py +15 -15
  209. meta_screening/migrations/0010_auto_20191106_0828.py +5 -5
  210. meta_screening/migrations/0068_alter_historicalscreeningpartone_acute_condition_and_more.py +1579 -0
  211. meta_screening/model_mixins/__init__.py +8 -0
  212. meta_screening/model_mixins/eligibility_model_mixin.py +5 -3
  213. meta_screening/model_mixins/part_one_fields_model_mixin.py +5 -9
  214. meta_screening/model_mixins/part_three_fields_model_mixin.py +5 -6
  215. meta_screening/model_mixins/part_two_fields_model_mixin.py +18 -16
  216. meta_screening/models/__init__.py +9 -0
  217. meta_screening/models/icp_referral.py +5 -5
  218. meta_screening/models/signals.py +10 -11
  219. meta_screening/models/subject_refusal.py +1 -1
  220. meta_screening/models/subject_screening.py +1 -3
  221. meta_subject/action_items.py +13 -15
  222. meta_subject/admin/__init__.py +39 -0
  223. meta_subject/admin/birth_outcome_admin.py +4 -8
  224. meta_subject/admin/blood_results/__init__.py +9 -0
  225. meta_subject/admin/blood_results/blood_results_fbc_admin.py +1 -1
  226. meta_subject/admin/blood_results/blood_results_hba1c_admin.py +1 -1
  227. meta_subject/admin/blood_results/blood_results_ins_admin.py +1 -1
  228. meta_subject/admin/blood_results/blood_results_lft_admin.py +1 -1
  229. meta_subject/admin/blood_results/blood_results_lipids_admin.py +1 -1
  230. meta_subject/admin/blood_results/blood_results_rft_admin.py +3 -5
  231. meta_subject/admin/complications_glycemia_admin.py +1 -1
  232. meta_subject/admin/delivery_admin.py +7 -10
  233. meta_subject/admin/diabetes/__init__.py +2 -0
  234. meta_subject/admin/diabetes/dm_endpoint_admin.py +2 -2
  235. meta_subject/admin/diabetes/dm_followup_admin.py +3 -2
  236. meta_subject/admin/egfr_drop_notification_admin.py +1 -1
  237. meta_subject/admin/followup_examination_admin.py +10 -9
  238. meta_subject/admin/followup_vitals_admin.py +4 -5
  239. meta_subject/admin/glucose_admin.py +2 -4
  240. meta_subject/admin/glucose_fbg_admin.py +1 -3
  241. meta_subject/admin/health_economics/__init__.py +2 -0
  242. meta_subject/admin/health_economics/health_economics_simple_admin.py +1 -1
  243. meta_subject/admin/health_economics/health_economics_update_admin.py +1 -1
  244. meta_subject/admin/hepatitis_test_admin.py +1 -1
  245. meta_subject/admin/list_filters.py +1 -1
  246. meta_subject/admin/mnsi_admin.py +7 -5
  247. meta_subject/admin/other_arv_regimens_admin.py +3 -3
  248. meta_subject/admin/patient_history_admin.py +4 -4
  249. meta_subject/admin/physical_exam_admin.py +1 -1
  250. meta_subject/admin/pregnancy_update_admin.py +1 -1
  251. meta_subject/admin/study_medication_admin.py +8 -15
  252. meta_subject/admin/subject_requisition_admin.py +1 -1
  253. meta_subject/admin/subject_visit_admin.py +1 -1
  254. meta_subject/admin/subject_visit_missed_admin.py +1 -1
  255. meta_subject/admin/urine_dipstick_test_admin.py +1 -1
  256. meta_subject/admin/urine_pregnancy_admin.py +1 -1
  257. meta_subject/baker_recipes.py +15 -15
  258. meta_subject/form_validators/__init__.py +11 -0
  259. meta_subject/form_validators/delivery_form_validator.py +2 -3
  260. meta_subject/form_validators/dm_endpoint_form_validator.py +1 -1
  261. meta_subject/form_validators/dm_followup_form_validator.py +7 -6
  262. meta_subject/form_validators/glucose_form_validator.py +3 -5
  263. meta_subject/forms/__init__.py +41 -0
  264. meta_subject/forms/blood_results/__init__.py +9 -0
  265. meta_subject/forms/blood_results/blood_results_rft_form.py +1 -2
  266. meta_subject/forms/diabetes/__init__.py +2 -0
  267. meta_subject/forms/diabetes/dm_followup_form.py +2 -2
  268. meta_subject/forms/followup_vitals_form.py +3 -8
  269. meta_subject/forms/health_economics/__init__.py +2 -0
  270. meta_subject/forms/next_appointment_form.py +2 -3
  271. meta_subject/forms/slider_widget.py +1 -1
  272. meta_subject/forms/study_medication_form.py +11 -8
  273. meta_subject/management/commands/create_missing_refills.py +3 -3
  274. meta_subject/management/commands/create_missing_rx.py +1 -1
  275. meta_subject/management/commands/missed.py +20 -23
  276. meta_subject/metadata_rules/__init__.py +2 -0
  277. meta_subject/metadata_rules/predicates.py +25 -32
  278. meta_subject/migrations/0001_initial.py +61 -61
  279. meta_subject/migrations/0002_auto_20191021_0353.py +5 -5
  280. meta_subject/migrations/0012_auto_20200118_2334.py +5 -5
  281. meta_subject/migrations/0014_auto_20200120_1622.py +5 -5
  282. meta_subject/migrations/0018_coronakap_historicalcoronakap.py +5 -5
  283. meta_subject/migrations/0033_auto_20200516_2356.py +5 -5
  284. meta_subject/migrations/0038_auto_20200520_0020.py +5 -5
  285. meta_subject/migrations/0040_auto_20200527_2155.py +1 -1
  286. meta_subject/migrations/0045_auto_20200530_1801.py +1 -1
  287. meta_subject/migrations/0051_auto_20200617_2117.py +5 -5
  288. meta_subject/migrations/0063_auto_20210715_0337.py +5 -5
  289. meta_subject/migrations/0066_auto_20210721_0335.py +9 -9
  290. meta_subject/migrations/0067_auto_20210726_0340.py +5 -5
  291. meta_subject/migrations/0068_auto_20210728_1809.py +5 -5
  292. meta_subject/migrations/0072_auto_20210805_1545.py +7 -7
  293. meta_subject/migrations/0073_auto_20210809_0055.py +5 -5
  294. meta_subject/migrations/0077_auto_20210809_2323.py +3 -3
  295. meta_subject/migrations/0082_auto_20210823_1612.py +3 -3
  296. meta_subject/migrations/0083_auto_20210823_1620.py +3 -3
  297. meta_subject/migrations/0088_auto_20210924_0027.py +5 -5
  298. meta_subject/migrations/0090_auto_20210924_0424.py +5 -5
  299. meta_subject/migrations/0093_auto_20211117_0352.py +5 -5
  300. meta_subject/migrations/0095_auto_20220128_1719.py +5 -5
  301. meta_subject/migrations/0098_auto_20220309_2106.py +5 -5
  302. meta_subject/migrations/0101_auto_20220316_2147.py +13 -13
  303. meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -13
  304. meta_subject/migrations/0164_dmreferralfollowup_historicaldmreferralfollowup.py +5 -5
  305. meta_subject/migrations/0172_remove_historicalbloodresultsglu_action_item_and_more.py +1 -2
  306. meta_subject/migrations/0177_alter_bloodresultslft_alp_value_and_more.py +1 -2
  307. meta_subject/migrations/0178_historicalhealtheconomicsupdate_and_more.py +5 -14
  308. meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +1 -2
  309. meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +5 -14
  310. meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +5 -14
  311. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +1 -2
  312. meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +5 -6
  313. meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +5 -14
  314. meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
  315. meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +9297 -0
  316. meta_subject/model_mixins/__init__.py +8 -0
  317. meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
  318. meta_subject/model_mixins/vitals_fields_model_mixin.py +1 -1
  319. meta_subject/models/__init__.py +48 -0
  320. meta_subject/models/birth_outcomes.py +3 -3
  321. meta_subject/models/blood_results/__init__.py +11 -0
  322. meta_subject/models/delivery.py +3 -3
  323. meta_subject/models/diabetes/__init__.py +2 -0
  324. meta_subject/models/diabetes/dm_endpoint.py +4 -4
  325. meta_subject/models/diabetes/dm_followup.py +3 -4
  326. meta_subject/models/diet_and_lifestyle.py +2 -2
  327. meta_subject/models/followup_examination.py +11 -11
  328. meta_subject/models/glucose.py +4 -4
  329. meta_subject/models/glucose_fbg.py +2 -3
  330. meta_subject/models/health_economics/__init__.py +2 -0
  331. meta_subject/models/health_economics/health_economics.py +7 -7
  332. meta_subject/models/health_economics/health_economics_update.py +2 -1
  333. meta_subject/models/hepatitis_test.py +2 -2
  334. meta_subject/models/other_arv_regimens_detail.py +1 -1
  335. meta_subject/models/patient_history.py +5 -6
  336. meta_subject/models/physical_exam.py +2 -2
  337. meta_subject/models/pregnancy_update.py +1 -1
  338. meta_subject/models/signals.py +14 -12
  339. meta_subject/models/subject_visit.py +1 -1
  340. meta_subject/models/urine_dipstick_test.py +1 -1
  341. meta_subject/models/urine_pregnancy.py +1 -1
  342. meta_visit_schedule/visit_schedules/__init__.py +2 -0
  343. meta_visit_schedule/visit_schedules/phase_three/__init__.py +2 -0
  344. meta_visit_schedule/visit_schedules/phase_three/schedule.py +2 -2
  345. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -2
  346. meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +1 -2
  347. meta_ae/tests/holidays.csv +0 -15
  348. meta_ae/tests/tests/test_actions.py +0 -126
  349. meta_ae/tests/urls.py +0 -10
  350. meta_analytics/dataframes/glucose_endpoints/utils.py +0 -0
  351. meta_analytics/notebooks/anu.ipynb +0 -95
  352. meta_analytics/notebooks/appointment_planning.ipynb +0 -329
  353. meta_analytics/notebooks/arvs.ipynb +0 -103
  354. meta_analytics/notebooks/cleaning/__init__.py +0 -0
  355. meta_analytics/notebooks/cleaning/consent_v1_ext.ipynb +0 -227
  356. meta_analytics/notebooks/cleaning/offschedule_eos.ipynb +0 -353
  357. meta_analytics/notebooks/dsmc/renal_dysfunction.ipynb +0 -435
  358. meta_analytics/notebooks/endpoints/meta_endpoints_by_date.ipynb +0 -656
  359. meta_analytics/notebooks/followup_examination.ipynb +0 -141
  360. meta_analytics/notebooks/hba1c.ipynb +0 -136
  361. meta_analytics/notebooks/hiv_regimens.ipynb +0 -429
  362. meta_analytics/notebooks/incidence.ipynb +0 -232
  363. meta_analytics/notebooks/liver.ipynb +0 -389
  364. meta_analytics/notebooks/magreth.ipynb +0 -645
  365. meta_analytics/notebooks/monitoring_report.ipynb +0 -1834
  366. meta_analytics/notebooks/pharmacy.ipynb +0 -1061
  367. meta_analytics/notebooks/pharmacy_stock_202410.ipynb +0 -306
  368. meta_analytics/notebooks/qa.ipynb +0 -273
  369. meta_analytics/notebooks/steering.ipynb +0 -61
  370. meta_analytics/notebooks/undiagnosed/meta3_screening_consort_chart.ipynb +0 -1176
  371. meta_analytics/notebooks/undiagnosed/meta3_screening_undiagnosed.ipynb +0 -519
  372. meta_analytics/notebooks/undiagnosed/meta_screening_table2.ipynb +0 -964
  373. meta_analytics/notebooks/undiagnosed/screen_undiagnosed_or.ipynb +0 -296
  374. meta_analytics/notebooks/undiagnosed/screening.ipynb +0 -273
  375. meta_analytics/notebooks/undiagnosed/screening2.ipynb +0 -958
  376. meta_analytics/notebooks/undiagnosed/screening_undiagnosed_20241002.ipynb +0 -958
  377. meta_analytics/notebooks/ven.ipynb +0 -191
  378. meta_analytics/notebooks/vitals.ipynb +0 -263
  379. meta_analytics/tests/__init__.py +0 -0
  380. meta_analytics/tests/test_endpoints_by_date.py +0 -94
  381. meta_consent/tests/__init__.py +0 -0
  382. meta_consent/tests/holidays.csv +0 -15
  383. meta_consent/tests/tests/__init__.py +0 -0
  384. meta_consent/tests/tests/test_form_validators.py +0 -110
  385. meta_consent/tests/tests/test_subject_consent.py +0 -10
  386. meta_consent/tests/urls.py +0 -17
  387. meta_dashboard/tests/__init__.py +0 -0
  388. meta_dashboard/tests/admin.py +0 -22
  389. meta_dashboard/tests/holidays.csv +0 -15
  390. meta_dashboard/tests/tests/__init__.py +0 -0
  391. meta_dashboard/tests/urls.py +0 -55
  392. meta_edc/tests/__init__.py +0 -0
  393. meta_edc/tests/tests/__init__.py +0 -0
  394. meta_edc/tests/tests/test_endpoints.py +0 -555
  395. meta_edc-1.1.8.dist-info/METADATA +0 -767
  396. meta_edc-1.1.8.dist-info/WHEEL +0 -5
  397. meta_edc-1.1.8.dist-info/licenses/AUTHORS.rst +0 -8
  398. meta_edc-1.1.8.dist-info/top_level.txt +0 -20
  399. meta_labs/tests/__init__.py +0 -0
  400. meta_labs/tests/test_labs.py +0 -27
  401. meta_labs/tests/test_reportables.py +0 -70
  402. meta_labs/tests/urls.py +0 -4
  403. meta_lists/tests/__init__.py +0 -0
  404. meta_lists/tests/test_lists.py +0 -8
  405. meta_pharmacy/notebooks/pharmacy.ipynb +0 -41
  406. meta_prn/tests/__init__.py +0 -0
  407. meta_prn/tests/tests/__init__.py +0 -0
  408. meta_prn/tests/tests/test_actions.py +0 -97
  409. meta_prn/tests/tests/test_dm_referral.py +0 -203
  410. meta_prn/tests/tests/test_eos_events.py +0 -134
  411. meta_prn/tests/tests/test_manager_order.py +0 -14
  412. meta_prn/tests/tests/test_pregnancy_notification.py +0 -93
  413. meta_prn/tests/urls.py +0 -10
  414. meta_rando/tests/__init__.py +0 -0
  415. meta_rando/tests/tests/__init__.py +0 -0
  416. meta_rando/tests/tests/test_randomizers.py +0 -57
  417. meta_reports/tests/__init__.py +0 -0
  418. meta_reports/tests/test_reports.py +0 -35
  419. meta_reports/tests/test_sql_gen.py +0 -5
  420. meta_reports/tests/urls.py +0 -4
  421. meta_screening/offline_models.py +0 -3
  422. meta_screening/tests/__init__.py +0 -0
  423. meta_screening/tests/holidays.csv +0 -15
  424. meta_screening/tests/meta_test_case_mixin.py +0 -234
  425. meta_screening/tests/options.py +0 -127
  426. meta_screening/tests/tests/__init__.py +0 -0
  427. meta_screening/tests/tests/test_forms.py +0 -404
  428. meta_screening/tests/tests/test_screening_part_one.py +0 -108
  429. meta_screening/tests/tests/test_screening_part_three.py +0 -433
  430. meta_screening/tests/tests/test_screening_part_two.py +0 -84
  431. meta_sites/tests/__init__.py +0 -0
  432. meta_sites/tests/test_sites.py +0 -12
  433. meta_sites/tests/urls.py +0 -4
  434. meta_stats/__init__.py +0 -0
  435. meta_stats/incidence.py +0 -16
  436. meta_stats/models.py +0 -0
  437. meta_stats/tests/__init__.py +0 -0
  438. meta_stats/tests/tests/__init__.py +0 -0
  439. meta_stats/tests/tests/test_incidence.py +0 -10
  440. meta_subject/tests/__init__.py +0 -0
  441. meta_subject/tests/holidays.csv +0 -15
  442. meta_subject/tests/tests/__init__.py +0 -0
  443. meta_subject/tests/tests/test_egfr.py +0 -234
  444. meta_subject/tests/tests/test_fixes.py +0 -64
  445. meta_subject/tests/tests/test_followup.py +0 -52
  446. meta_subject/tests/tests/test_manager_order.py +0 -11
  447. meta_subject/tests/tests/test_medication_adherence.py +0 -79
  448. meta_subject/tests/tests/test_metadata_rules.py +0 -135
  449. meta_subject/tests/tests/test_mnsi.py +0 -341
  450. meta_subject/tests/tests/test_next_appointment.py +0 -231
  451. meta_subject/tests/tests/test_patient_history_form.py +0 -74
  452. meta_subject/tests/tests/test_physical_exam.py +0 -84
  453. meta_subject/tests/tests/test_sf12.py +0 -161
  454. meta_subject/tests/tests/test_study_medication.py +0 -229
  455. meta_subject/tests/urls.py +0 -24
  456. meta_visit_schedule/tests/__init__.py +0 -0
  457. meta_visit_schedule/tests/tests/__init__.py +0 -0
  458. meta_visit_schedule/tests/tests/test_schedule.py +0 -181
  459. meta_visit_schedule/tests/urls.py +0 -4
  460. tests/__init__.py +0 -0
  461. tests/etc/randomization_list.csv +0 -241
  462. tests/etc/randomization_list_phase_three.csv +0 -241
  463. tests/etc/user-aes-local.key +0 -0
  464. tests/etc/user-aes-restricted.key +0 -1
  465. tests/etc/user-rsa-local-private.pem +0 -27
  466. tests/etc/user-rsa-local-public.pem +0 -9
  467. tests/etc/user-rsa-restricted-private.pem +0 -27
  468. tests/etc/user-rsa-restricted-public.pem +0 -9
  469. tests/etc/user-salt-local.key +0 -0
  470. tests/etc/user-salt-restricted.key +0 -0
  471. tests/holidays.csv +0 -15
  472. tests/test_settings.py +0 -185
  473. {meta_edc-1.1.8.dist-info → meta_edc-1.1.12.dist-info}/licenses/LICENSE +0 -0
  474. /meta_ae/tests/__init__.py → /meta_subject/management/__init__py.py +0 -0
  475. /meta_ae/tests/tests/__init__.py → /meta_subject/management/commands/__init__py.py +0 -0
@@ -3,3 +3,11 @@ from .crf_model_mixin import CrfModelMixin
3
3
  from .crf_with_action_model_mixin import CrfWithActionModelMixin
4
4
  from .search_slug_model_mixin import SearchSlugModelMixin
5
5
  from .vitals_fields_model_mixin import VitalsFieldsModelMixin
6
+
7
+ __all__ = [
8
+ "ArvHistoryModelMixin",
9
+ "CrfModelMixin",
10
+ "CrfWithActionModelMixin",
11
+ "SearchSlugModelMixin",
12
+ "VitalsFieldsModelMixin",
13
+ ]
@@ -4,8 +4,7 @@ from edc_search.model_mixins import SearchSlugModelMixin as Base
4
4
  class SearchSlugModelMixin(Base):
5
5
  def get_search_slug_fields(self):
6
6
  fields = super().get_search_slug_fields()
7
- fields.append("subject_identifier")
8
- return fields
7
+ return *fields, "subject_identifier"
9
8
 
10
9
  class Meta:
11
10
  abstract = True
@@ -35,7 +35,7 @@ class VitalsFieldsModelMixin(models.Model):
35
35
  "A reason not measured may be provided at anytime "
36
36
  "but is required at 36 and 48 months"
37
37
  ),
38
- null=True,
38
+ default="",
39
39
  blank=True,
40
40
  )
41
41
 
@@ -48,3 +48,51 @@ from .subject_visit import SubjectVisit
48
48
  from .subject_visit_missed import SubjectVisitMissed
49
49
  from .urine_dipstick_test import UrineDipstickTest
50
50
  from .urine_pregnancy import UrinePregnancy
51
+
52
+ __all__ = [
53
+ "BirthOutcomes",
54
+ "BloodResultsFbc",
55
+ "BloodResultsGluDummy",
56
+ "BloodResultsHba1c",
57
+ "BloodResultsIns",
58
+ "BloodResultsLft",
59
+ "BloodResultsLipids",
60
+ "BloodResultsRft",
61
+ "Complications",
62
+ "ComplicationsGlycemia",
63
+ "ConcomitantMedication",
64
+ "Delivery",
65
+ "DietAndLifestyle",
66
+ "DmEndpoint",
67
+ "DmFollowup",
68
+ "EgfrDropNotification",
69
+ "Eq5d3l",
70
+ "FollowupExamination",
71
+ "FollowupVitals",
72
+ "Glucose",
73
+ "GlucoseFbg",
74
+ "HealthEconomics",
75
+ "HealthEconomicsSimple",
76
+ "HealthEconomicsUpdate",
77
+ "HepatitisTest",
78
+ "MalariaTest",
79
+ "MedicationAdherence",
80
+ "Mnsi",
81
+ "NextAppointment",
82
+ "OtherArvRegimens",
83
+ "OtherArvRegimensDetail",
84
+ "PatientHistory",
85
+ "PhysicalExam",
86
+ "PregnancyUpdate",
87
+ "Sf12",
88
+ "StudyMedication",
89
+ "SubjectRequisition",
90
+ "SubjectVisit",
91
+ "SubjectVisitMissed",
92
+ "UrineDipstickTest",
93
+ "UrinePregnancy",
94
+ "study_medication_on_pre_save",
95
+ "update_glucose_endpoints_for_subject_on_post_save",
96
+ "update_pregnancy_notification_on_delivery_post_save",
97
+ "update_schedule_on_delivery_post_save",
98
+ ]
@@ -15,7 +15,7 @@ from .delivery import Delivery
15
15
  class Manager(models.Manager):
16
16
  use_in_migrations = True
17
17
 
18
- def get_by_natural_key(
18
+ def get_by_natural_key( # noqa: PLR0913
19
19
  self,
20
20
  birth_order,
21
21
  subject_identifier,
@@ -97,5 +97,5 @@ class BirthOutcomes(
97
97
  class Meta(BaseUuidModel.Meta):
98
98
  verbose_name = "Birth Outcomes"
99
99
  verbose_name_plural = "Birth Outcomes"
100
- indexes = [Index(fields=["delivery", "birth_order"])]
101
- unique_together = ["delivery", "birth_order"]
100
+ indexes = (Index(fields=["delivery", "birth_order"]),)
101
+ unique_together = ("delivery", "birth_order")
@@ -5,3 +5,14 @@ from .blood_results_ins import BloodResultsIns
5
5
  from .blood_results_lft import BloodResultsLft
6
6
  from .blood_results_lipids import BloodResultsLipids
7
7
  from .blood_results_rft import BloodResultsRft
8
+
9
+ __all__ = [
10
+ "BloodResultsFbc",
11
+ "BloodResultsGluDummy",
12
+ "BloodResultsHba1c",
13
+ "BloodResultsIns",
14
+ "BloodResultsLft",
15
+ "BloodResultsLipids",
16
+ "BloodResultsRft",
17
+ ]
18
+
@@ -52,7 +52,7 @@ class Delivery(
52
52
 
53
53
  info_not_available_reason = models.TextField(
54
54
  verbose_name="If the report was not available, please explain?",
55
- null=True,
55
+ default="",
56
56
  blank=True,
57
57
  )
58
58
 
@@ -110,7 +110,7 @@ class Delivery(
110
110
  "please give name of the facility"
111
111
  ),
112
112
  max_length=150,
113
- null=True,
113
+ default="",
114
114
  blank=True,
115
115
  )
116
116
 
@@ -160,4 +160,4 @@ class Delivery(
160
160
  class Meta(CrfWithActionModelMixin.Meta, BaseUuidModel.Meta):
161
161
  verbose_name = "Delivery"
162
162
  verbose_name_plural = "Delivery"
163
- unique_together = ["subject_visit", "delivery_datetime"]
163
+ unique_together = ("subject_visit", "delivery_datetime")
@@ -1,2 +1,4 @@
1
1
  from .dm_endpoint import DmEndpoint
2
2
  from .dm_followup import DmFollowup
3
+
4
+ __all__ = ["DmEndpoint", "DmFollowup"]
@@ -16,7 +16,7 @@ class DmEndpoint(CrfModelMixin, BaseUuidModel):
16
16
  verbose_name="Was the patient referred because the diabetes endpoint was reached?",
17
17
  max_length=15,
18
18
  choices=YES_NO,
19
- null=True,
19
+ default="",
20
20
  blank=False,
21
21
  help_text="If YES, the EDC will check for the patient on the Endpoints report.",
22
22
  )
@@ -32,7 +32,7 @@ class DmEndpoint(CrfModelMixin, BaseUuidModel):
32
32
  )
33
33
 
34
34
  # retired
35
- dx_initiated_by_other = OtherCharField(null=True, blank=True)
35
+ dx_initiated_by_other = OtherCharField(blank=True)
36
36
 
37
37
  # retired
38
38
  dx_tmg = models.CharField(
@@ -50,11 +50,11 @@ class DmEndpoint(CrfModelMixin, BaseUuidModel):
50
50
  # retired
51
51
  dx_no_tmg_reason = models.TextField(
52
52
  verbose_name="If NO, please explain why this case was not discussed with the TMG",
53
- null=True,
53
+ default="",
54
54
  blank=True,
55
55
  )
56
56
 
57
- comments = models.TextField(verbose_name="Any other comments", null=True, blank=True)
57
+ comments = models.TextField(verbose_name="Any other comments", default="", blank=True)
58
58
 
59
59
  class Meta(CrfModelMixin.Meta, BaseUuidModel.Meta):
60
60
  verbose_name = "Diabetes endpoint"
@@ -22,7 +22,6 @@ from ...model_mixins import CrfWithActionModelMixin
22
22
 
23
23
 
24
24
  class DmFollowup(CrfWithActionModelMixin, BaseUuidModel):
25
-
26
25
  action_name = DM_FOLLOWUP_ACTION
27
26
 
28
27
  referral_date = models.DateField(
@@ -63,7 +62,7 @@ class DmFollowup(CrfWithActionModelMixin, BaseUuidModel):
63
62
  facility_attended = models.CharField(
64
63
  verbose_name="If 'Yes', please give the name of the facility you attended",
65
64
  max_length=50,
66
- null=True,
65
+ default="",
67
66
  blank=True,
68
67
  )
69
68
 
@@ -181,7 +180,7 @@ class DmFollowup(CrfWithActionModelMixin, BaseUuidModel):
181
180
  verbose_name="Visual score",
182
181
  max_length=3,
183
182
  help_text="%",
184
- null=True,
183
+ default="",
185
184
  blank=True,
186
185
  )
187
186
 
@@ -200,7 +199,7 @@ class DmFollowup(CrfWithActionModelMixin, BaseUuidModel):
200
199
  verbose_name="When was the last time you missed your study pill?",
201
200
  max_length=25,
202
201
  choices=MISSED_PILLS,
203
- null=True,
202
+ default="",
204
203
  blank=True,
205
204
  )
206
205
 
@@ -8,11 +8,11 @@ from ..model_mixins import CrfModelMixin
8
8
  class DietAndLifestyle(CrfModelMixin, BaseUuidModel):
9
9
  diet_and_lifestyle = models.CharField(
10
10
  verbose_name=(
11
- "Has the participant received the META3 " "approved diet and lifetsyle counseling?"
11
+ "Has the participant received the META3 approved diet and lifetsyle counseling?"
12
12
  ),
13
13
  max_length=15,
14
14
  choices=YES_NO,
15
- null=True,
15
+ default="",
16
16
  blank=False,
17
17
  help_text="This response is not criteria for eligibility",
18
18
  )
@@ -40,12 +40,12 @@ class FollowupExamination(CrfWithActionModelMixin, BaseUuidModel):
40
40
  related_name="symptoms_g3",
41
41
  verbose_name="For these symptoms, were any grade 3 events",
42
42
  help_text=(
43
- "Refer to DAIDS toxicity table. " "Please complete Serious Adverse Event form"
43
+ "Refer to DAIDS toxicity table. Please complete Serious Adverse Event form"
44
44
  ),
45
45
  )
46
46
  symptoms_g3_detail = models.TextField(
47
47
  verbose_name="Please provide details on any of the Grade 3 symptoms above.",
48
- null=True,
48
+ default="",
49
49
  blank=True,
50
50
  )
51
51
 
@@ -55,19 +55,19 @@ class FollowupExamination(CrfWithActionModelMixin, BaseUuidModel):
55
55
  related_name="symptoms_g4",
56
56
  verbose_name="For these symptoms, were any grade 4 events",
57
57
  help_text=(
58
- "Refer to DAIDS toxicity table. " "Please complete Serious Adverse Event form"
58
+ "Refer to DAIDS toxicity table. Please complete Serious Adverse Event form"
59
59
  ),
60
60
  )
61
61
  symptoms_g4_detail = models.TextField(
62
62
  verbose_name="Please provide details on any of the Grade 4 symptoms above.",
63
- null=True,
63
+ default="",
64
64
  blank=True,
65
65
  )
66
66
 
67
67
  # 4c
68
68
  symptoms_detail = models.TextField(
69
69
  verbose_name="Please provide details on any of the symptoms above.",
70
- null=True,
70
+ default="",
71
71
  blank=True,
72
72
  )
73
73
 
@@ -89,7 +89,7 @@ class FollowupExamination(CrfWithActionModelMixin, BaseUuidModel):
89
89
  "If the participant was given a referral letter or "
90
90
  "discharge summary record details here"
91
91
  ),
92
- null=True,
92
+ default="",
93
93
  blank=True,
94
94
  )
95
95
 
@@ -124,9 +124,9 @@ class FollowupExamination(CrfWithActionModelMixin, BaseUuidModel):
124
124
  # 5d
125
125
  prescribed_medication_detail = models.TextField(
126
126
  verbose_name=(
127
- "If YES, prescribed any other medication, " "please provide details of this visit"
127
+ "If YES, prescribed any other medication, please provide details of this visit"
128
128
  ),
129
- null=True,
129
+ default="",
130
130
  blank=True,
131
131
  )
132
132
 
@@ -145,7 +145,7 @@ class FollowupExamination(CrfWithActionModelMixin, BaseUuidModel):
145
145
  # 6a
146
146
  any_other_problems_detail = models.TextField(
147
147
  verbose_name="If YES, please provide details of the event",
148
- null=True,
148
+ default="",
149
149
  blank=True,
150
150
  )
151
151
 
@@ -176,7 +176,7 @@ class FollowupExamination(CrfWithActionModelMixin, BaseUuidModel):
176
176
 
177
177
  # 7b
178
178
  art_change_reason = models.TextField(
179
- verbose_name="If YES, please provide reason for change", null=True, blank=True
179
+ verbose_name="If YES, please provide reason for change", default="", blank=True
180
180
  )
181
181
 
182
182
  # 7c
@@ -241,7 +241,7 @@ class FollowupExamination(CrfWithActionModelMixin, BaseUuidModel):
241
241
 
242
242
  referral_reason = models.TextField(
243
243
  verbose_name="If YES, where are they being referred to",
244
- null=True,
244
+ default="",
245
245
  blank=True,
246
246
  help_text=(
247
247
  "Note: remind participant that admission or discharge information "
@@ -1,7 +1,7 @@
1
1
  from django.db import models
2
2
  from edc_constants.choices import YES_NO
3
3
  from edc_constants.constants import NOT_APPLICABLE
4
- from edc_glucose.model_mixins import (
4
+ from edc_glucose.model_mixin_factories import (
5
5
  fasting_model_mixin_factory,
6
6
  fbg_model_mixin_factory,
7
7
  ogtt_model_mixin_factory,
@@ -22,7 +22,7 @@ class Glucose(
22
22
  verbose_name="Has the participant fasted?",
23
23
  max_length=15,
24
24
  choices=YES_NO,
25
- null=True,
25
+ default="",
26
26
  blank=False,
27
27
  help_text="As reported by patient",
28
28
  ),
@@ -43,7 +43,7 @@ class Glucose(
43
43
  )
44
44
 
45
45
  fbg_not_performed_reason = models.CharField(
46
- verbose_name="If NO, provide reason", max_length=150, null=True, blank=True
46
+ verbose_name="If NO, provide reason", max_length=150, default="", blank=True
47
47
  )
48
48
 
49
49
  ogtt_performed = models.CharField(
@@ -53,7 +53,7 @@ class Glucose(
53
53
  )
54
54
 
55
55
  ogtt_not_performed_reason = models.CharField(
56
- verbose_name="If NO, provide reason", max_length=150, null=True, blank=True
56
+ verbose_name="If NO, provide reason", max_length=150, default="", blank=True
57
57
  )
58
58
 
59
59
  endpoint_today = models.CharField(
@@ -1,7 +1,7 @@
1
1
  from django.db import models
2
2
  from edc_constants.choices import YES_NO
3
3
  from edc_constants.constants import NO
4
- from edc_glucose.model_mixins import (
4
+ from edc_glucose.model_mixin_factories import (
5
5
  fasting_model_mixin_factory,
6
6
  fbg_model_mixin_factory,
7
7
  )
@@ -26,7 +26,6 @@ class GlucoseFbg(
26
26
  fbg_model_mixin_factory("fbg"),
27
27
  BaseUuidModel,
28
28
  ):
29
-
30
29
  fbg_performed = models.CharField(
31
30
  verbose_name="Was the FBG test performed?",
32
31
  max_length=15,
@@ -36,7 +35,7 @@ class GlucoseFbg(
36
35
  fbg_not_performed_reason = models.CharField(
37
36
  verbose_name="If NO, provide reason",
38
37
  max_length=150,
39
- null=True,
38
+ default="",
40
39
  blank=True,
41
40
  )
42
41
 
@@ -1,3 +1,5 @@
1
1
  from .health_economics import HealthEconomics
2
2
  from .health_economics_simple import HealthEconomicsSimple
3
3
  from .health_economics_update import HealthEconomicsUpdate
4
+
5
+ __all__ = ["HealthEconomics", "HealthEconomicsSimple", "HealthEconomicsUpdate"]
@@ -79,17 +79,17 @@ class HealthEconomics(CrfModelMixin, BaseUuidModel):
79
79
  )
80
80
 
81
81
  is_highest_earner = models.CharField(
82
- verbose_name=("Are you the person who earns the highest income in your household?"),
82
+ verbose_name="Are you the person who earns the highest income in your household?",
83
83
  max_length=15,
84
84
  choices=YES_NO,
85
85
  )
86
86
 
87
87
  highest_earner = models.CharField(
88
88
  verbose_name=(
89
- "If NO, what is the profession of the person " "who earns the highest income?"
89
+ "If NO, what is the profession of the person who earns the highest income?"
90
90
  ),
91
91
  max_length=50,
92
- null=True,
92
+ default="",
93
93
  blank=True,
94
94
  )
95
95
 
@@ -99,7 +99,7 @@ class HealthEconomics(CrfModelMixin, BaseUuidModel):
99
99
  )
100
100
 
101
101
  accomodation_per_month = models.IntegerField(
102
- verbose_name=("How much do you/your family spend on rent and utilities in a month?"),
102
+ verbose_name="How much do you/your family spend on rent and utilities in a month?",
103
103
  help_text="in Shilling",
104
104
  )
105
105
 
@@ -180,7 +180,7 @@ class HealthEconomics(CrfModelMixin, BaseUuidModel):
180
180
  )
181
181
 
182
182
  expenditure_other_detail = models.TextField(
183
- verbose_name="If YES, what was the activity", null=True, blank=True
183
+ verbose_name="If YES, what was the activity", default="", blank=True
184
184
  )
185
185
 
186
186
  expenditure_other = models.IntegerField(
@@ -200,7 +200,7 @@ class HealthEconomics(CrfModelMixin, BaseUuidModel):
200
200
  )
201
201
 
202
202
  healthcare_expenditure_month = models.IntegerField(
203
- verbose_name=("How much in total has been spent on your healthcare in the last month?")
203
+ verbose_name="How much in total has been spent on your healthcare in the last month?"
204
204
  )
205
205
 
206
206
  routine_activities = models.CharField(
@@ -210,7 +210,7 @@ class HealthEconomics(CrfModelMixin, BaseUuidModel):
210
210
  )
211
211
 
212
212
  routine_activities_other = models.CharField(
213
- verbose_name="If OTHER, please specify", max_length=50, null=True, blank=True
213
+ verbose_name="If OTHER, please specify", max_length=50, default="", blank=True
214
214
  )
215
215
 
216
216
  off_work_days = models.DecimalField(
@@ -5,7 +5,8 @@ from edc_constants.choices import YES_NO
5
5
  from edc_constants.constants import NOT_APPLICABLE
6
6
  from edc_crf.model_mixins import SingletonCrfModelMixin
7
7
  from edc_he.choices import RELATIONSHIP_CHOICES, STATUS
8
- from edc_he.model_mixins import HouseholdModelMixin, income_model_mixin_factory
8
+ from edc_he.model_mixin_factories import income_model_mixin_factory
9
+ from edc_he.model_mixins import HouseholdModelMixin
9
10
  from edc_model.models import BaseUuidModel
10
11
  from edc_model_fields.fields import OtherCharField
11
12
 
@@ -20,7 +20,7 @@ class HepatitisTest(CrfModelMixin, BaseUuidModel):
20
20
  verbose_name=mark_safe("<u>HbSAg</u>"), # nosec B308
21
21
  max_length=15,
22
22
  choices=POS_NEG,
23
- null=True,
23
+ default="",
24
24
  blank=True,
25
25
  )
26
26
 
@@ -43,7 +43,7 @@ class HepatitisTest(CrfModelMixin, BaseUuidModel):
43
43
  verbose_name=mark_safe("<u>HCV</u>"), # nosec B308
44
44
  max_length=15,
45
45
  choices=POS_NEG,
46
- null=True,
46
+ default="",
47
47
  blank=True,
48
48
  )
49
49
 
@@ -45,7 +45,7 @@ class OtherArvRegimensDetail(CrfInlineModelMixin, BaseUuidModel):
45
45
  blank=True,
46
46
  )
47
47
 
48
- notes = models.CharField(verbose_name="Notes", max_length=100, null=True, blank=True)
48
+ notes = models.CharField(verbose_name="Notes", max_length=100, default="", blank=True)
49
49
 
50
50
  objects = InlineModelManager()
51
51
  on_site = CurrentSiteManager()
@@ -53,7 +53,7 @@ class PatientHistory(ArvHistoryModelMixin, CrfModelMixin, BaseUuidModel):
53
53
  verbose_name="Has the patient been diagnosed with dyslipidaemia?",
54
54
  max_length=15,
55
55
  choices=YES_NO,
56
- null=True,
56
+ default="",
57
57
  blank=False,
58
58
  )
59
59
 
@@ -77,7 +77,7 @@ class PatientHistory(ArvHistoryModelMixin, CrfModelMixin, BaseUuidModel):
77
77
  other_dyslipidaemia_rx = models.CharField(
78
78
  verbose_name="What medication is the patient currently taking for dyslipidaemia?",
79
79
  max_length=50,
80
- null=True,
80
+ default="",
81
81
  blank=True,
82
82
  )
83
83
 
@@ -85,14 +85,14 @@ class PatientHistory(ArvHistoryModelMixin, CrfModelMixin, BaseUuidModel):
85
85
  concomitant_conditions = models.TextField(
86
86
  verbose_name="Does the patient have any other conditions not mentioned above?",
87
87
  max_length=250,
88
- null=True,
88
+ default="",
89
89
  blank=True,
90
90
  )
91
91
  # PHASE_THREE_ONLY
92
92
  concomitant_medications = models.TextField(
93
93
  verbose_name="Is the patient taking any concomitant medications?",
94
94
  max_length=250,
95
- null=True,
95
+ default="",
96
96
  blank=True,
97
97
  )
98
98
 
@@ -129,13 +129,12 @@ class PatientHistory(ArvHistoryModelMixin, CrfModelMixin, BaseUuidModel):
129
129
  verbose_name=mark_safe( # nosec B308
130
130
  "If other symptom in the <u>past year</u>, please specify ..."
131
131
  ),
132
- null=True,
133
132
  blank=True,
134
133
  )
135
134
 
136
135
  dm_in_family = models.CharField(
137
136
  verbose_name=(
138
- "Has anyone in your immediate family " "ever been diagnosed with diabetes?"
137
+ "Has anyone in your immediate family ever been diagnosed with diabetes?"
139
138
  ),
140
139
  max_length=15,
141
140
  choices=YES_NO,
@@ -25,7 +25,7 @@ class PhysicalExam(
25
25
  )
26
26
 
27
27
  irregular_heartbeat_description = models.TextField(
28
- "If the heartbeat is <u>irregular</u>, please describe", null=True, blank=True
28
+ "If the heartbeat is <u>irregular</u>, please describe", default="", blank=True
29
29
  )
30
30
 
31
31
  waist_circumference = models.DecimalField(
@@ -50,7 +50,7 @@ class PhysicalExam(
50
50
 
51
51
  abdominal_tenderness_description = models.TextField(
52
52
  verbose_name="If YES, abdominal tenderness, please describe",
53
- null=True,
53
+ default="",
54
54
  blank=True,
55
55
  )
56
56
 
@@ -23,7 +23,7 @@ class PregnancyUpdate(CrfModelMixin, BaseUuidModel):
23
23
  help_text="If yes, please specify below",
24
24
  )
25
25
 
26
- comment = models.TextField(verbose_name="Comment / Updates", null=True)
26
+ comment = models.TextField(verbose_name="Comment / Updates", default="")
27
27
 
28
28
  class Meta(CrfModelMixin.Meta, BaseUuidModel.Meta):
29
29
  verbose_name = "Pregnancy Update"
@@ -1,3 +1,5 @@
1
+ import contextlib
2
+
1
3
  from django.apps import apps as django_apps
2
4
  from django.core.exceptions import ObjectDoesNotExist
3
5
  from django.db.models.signals import post_save, pre_save
@@ -23,7 +25,7 @@ from .subject_visit import SubjectVisit
23
25
  sender=StudyMedication,
24
26
  dispatch_uid="study_medication_on_pre_save",
25
27
  )
26
- def study_medication_on_pre_save(sender, instance, raw, **kwargs):
28
+ def study_medication_on_pre_save(sender, instance, raw, **kwargs): # noqa: ARG001
27
29
  """Create a prescription if one does not exist
28
30
 
29
31
  All refills are created against the prescription
@@ -35,7 +37,7 @@ def study_medication_on_pre_save(sender, instance, raw, **kwargs):
35
37
  subject_consent = get_consent_model_cls().objects.get(
36
38
  subject_identifier=instance.subject_visit.subject_identifier,
37
39
  )
38
- try:
40
+ with contextlib.suppress(PrescriptionAlreadyExists):
39
41
  create_prescription(
40
42
  subject_identifier=subject_consent.subject_identifier,
41
43
  report_datetime=subject_consent.consent_datetime,
@@ -43,8 +45,6 @@ def study_medication_on_pre_save(sender, instance, raw, **kwargs):
43
45
  medication_names=[METFORMIN],
44
46
  site=subject_consent.site,
45
47
  )
46
- except PrescriptionAlreadyExists:
47
- pass
48
48
 
49
49
 
50
50
  @receiver(
@@ -53,7 +53,7 @@ def study_medication_on_pre_save(sender, instance, raw, **kwargs):
53
53
  sender=Delivery,
54
54
  dispatch_uid="update_pregnancy_notification_on_delivery_post_save",
55
55
  )
56
- def update_pregnancy_notification_on_delivery_post_save(sender, instance, raw, **kwargs):
56
+ def update_pregnancy_notification_on_delivery_post_save(sender, instance, raw, **kwargs): # noqa: ARG001
57
57
  """Updates PregnancyNotification model instance when the delivery form is submitted.
58
58
 
59
59
  Sets delivered=True and delivery_datetime
@@ -73,7 +73,7 @@ def update_pregnancy_notification_on_delivery_post_save(sender, instance, raw, *
73
73
  sender=Delivery,
74
74
  dispatch_uid="update_schedule_on_delivery_post_save",
75
75
  )
76
- def update_schedule_on_delivery_post_save(sender, instance, raw, **kwargs):
76
+ def update_schedule_on_delivery_post_save(sender, instance, raw, **kwargs): # noqa: ARG001
77
77
  """Takes a participant off the SCHEDULE_PREGNANCY schedule when
78
78
  delivery model is submitted.
79
79
 
@@ -97,10 +97,8 @@ def update_schedule_on_delivery_post_save(sender, instance, raw, **kwargs):
97
97
  delivery = Delivery.objects.get(
98
98
  subject_visit__subject_identifier=instance.subject_identifier,
99
99
  )
100
- offschedule_datetime = (
101
- delivery.delivery_datetime
102
- if delivery.delivery_datetime > last_subject_visit.report_datetime
103
- else last_subject_visit.report_datetime
100
+ offschedule_datetime = max(
101
+ last_subject_visit.report_datetime, delivery.delivery_datetime
104
102
  )
105
103
  offschedule_model_cls.objects.create(
106
104
  subject_identifier=instance.subject_identifier,
@@ -114,10 +112,14 @@ def update_schedule_on_delivery_post_save(sender, instance, raw, **kwargs):
114
112
  dispatch_uid="update_glucose_endpoints_for_subject_on_post_save",
115
113
  )
116
114
  def update_glucose_endpoints_for_subject_on_post_save(
117
- sender, instance, raw, update_fields, **kwargs
115
+ sender,
116
+ instance,
117
+ raw,
118
+ update_fields,
119
+ **kwargs, # noqa: ARG001
118
120
  ):
119
121
  if not raw and not update_fields and sender in [Glucose, GlucoseFbg]:
120
- from meta_analytics.dataframes import GlucoseEndpointsByDate
122
+ from meta_analytics.dataframes import GlucoseEndpointsByDate # noqa: PLC0415
121
123
 
122
124
  cls = GlucoseEndpointsByDate(
123
125
  subject_identifiers=[instance.subject_visit.subject_identifier]
@@ -48,7 +48,7 @@ class SubjectVisit(
48
48
 
49
49
  unschedule_detail = models.TextField(
50
50
  verbose_name="If 'unschedule', please provide further details, if any",
51
- null=True,
51
+ default="",
52
52
  blank=True,
53
53
  )
54
54
 
@@ -14,7 +14,7 @@ class UrineDipstickTest(CrfModelMixin, edc_models.BaseUuidModel):
14
14
  )
15
15
 
16
16
  not_performed_reason = models.CharField(
17
- verbose_name="If NO, provide reason", max_length=150, null=True, blank=True
17
+ verbose_name="If NO, provide reason", max_length=150, default="", blank=True
18
18
  )
19
19
 
20
20
  ketones = models.CharField(