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
@@ -1,2 +1,4 @@
1
1
  from .ae_review_model_mixin import AeReviewModelMixin
2
2
  from .death_report_model_mixin import DeathReportModelMixin
3
+
4
+ __all__ = ["AeReviewModelMixin", "DeathReportModelMixin"]
@@ -44,25 +44,25 @@ class AeReviewModelMixin(models.Model):
44
44
  verbose_name="Relationship to study drug:",
45
45
  max_length=25,
46
46
  choices=STUDY_DRUG_RELATIONSHIP,
47
- null=True,
47
+ default="",
48
48
  )
49
49
 
50
50
  ae_expected = models.CharField(
51
51
  verbose_name="Based on the protocol, do you believe this event is expected?",
52
52
  max_length=25,
53
53
  choices=YES_NO,
54
- null=True,
54
+ default="",
55
55
  )
56
56
 
57
57
  ae_action_required = models.CharField(
58
58
  verbose_name="If unexpected, do you believe further action is required?",
59
59
  max_length=25,
60
60
  choices=YES_NO,
61
- null=True,
61
+ default="",
62
62
  )
63
63
 
64
64
  investigator_comments = models.TextField(
65
- blank=True, null=True, verbose_name="This Clinical Reviewer's comments:"
65
+ blank=True, default="", verbose_name="This Clinical Reviewer's comments:"
66
66
  )
67
67
 
68
68
  original_report_agreed = models.CharField(
@@ -70,11 +70,11 @@ class AeReviewModelMixin(models.Model):
70
70
  max_length=15,
71
71
  choices=YES_NO,
72
72
  blank=False,
73
- null=True,
73
+ default="",
74
74
  help_text="If No, explain in the narrative below",
75
75
  )
76
76
 
77
- narrative = models.TextField(verbose_name="Narrative", blank=True, null=True)
77
+ narrative = models.TextField(verbose_name="Narrative", blank=True, default="")
78
78
 
79
79
  officials_notified = models.DateTimeField(
80
80
  blank=True,
@@ -20,7 +20,7 @@ class DeathReportModelMixin(models.Model):
20
20
  "If death occurred at hospital / clinic, please give name of the facility"
21
21
  ),
22
22
  max_length=150,
23
- null=True,
23
+ default="",
24
24
  blank=True,
25
25
  )
26
26
 
@@ -46,14 +46,14 @@ class DeathReportModelMixin(models.Model):
46
46
  related_name="secondary_cause_of_death",
47
47
  verbose_name="Secondary cause of death",
48
48
  help_text=(
49
- "Secondary cause of death in the opinion of the " "local study doctor and local PI"
49
+ "Secondary cause of death in the opinion of the local study doctor and local PI"
50
50
  ),
51
51
  )
52
52
 
53
53
  secondary_cause_of_death_other = models.CharField(
54
54
  max_length=100,
55
55
  blank=True,
56
- null=True,
56
+ default="",
57
57
  verbose_name='If "Other" above, please specify',
58
58
  )
59
59
 
@@ -8,3 +8,16 @@ from .death_report import DeathReport
8
8
  from .death_report_tmg import DeathReportTmg
9
9
  from .death_report_tmg_second import DeathReportTmgSecond
10
10
  from .hospitalization import Hospitalization
11
+
12
+ __all__ = [
13
+ "AeFollowup",
14
+ "AeInitial",
15
+ "AeLocalReview",
16
+ "AeSponsorReview",
17
+ "AeSusar",
18
+ "AeTmg",
19
+ "DeathReport",
20
+ "DeathReportTmg",
21
+ "DeathReportTmgSecond",
22
+ "Hospitalization",
23
+ ]
@@ -15,7 +15,7 @@ class Hospitalization(
15
15
  verbose_name = "Hospitalization"
16
16
  verbose_name_plural = "Hospitalization"
17
17
  indexes = (
18
- HospitalizationModelMixin.Meta.indexes
19
- + BaseUuidModel.Meta.indexes
20
- + [models.Index(fields=["subject_identifier", "site"])]
18
+ *HospitalizationModelMixin.Meta.indexes,
19
+ *BaseUuidModel.Meta.indexes,
20
+ models.Index(fields=["subject_identifier", "site"]),
21
21
  )
@@ -1,2 +1,4 @@
1
1
  from .ae_pdf_report import AePdfReport
2
2
  from .death_pdf_report import DeathPdfReport
3
+
4
+ __all__ = ["AePdfReport", "DeathPdfReport"]
Binary file
@@ -20,3 +20,27 @@ from .utils import (
20
20
  get_unique_subject_identifiers,
21
21
  get_unique_visit_codes,
22
22
  )
23
+
24
+ __all__ = [
25
+ "CASE_EOS",
26
+ "CASE_FBGS_WITH_FIRST_OGTT",
27
+ "CASE_FBGS_WITH_SECOND_OGTT",
28
+ "CASE_FBG_ONLY",
29
+ "CASE_OGTT",
30
+ "EndpointByDate",
31
+ "GlucoseEndpointsByDate",
32
+ "endpoint_cases",
33
+ "endpoint_columns",
34
+ "get_empty_endpoint_df",
35
+ "get_eos_df",
36
+ "get_glucose_df",
37
+ "get_glucose_fbg_df",
38
+ "get_glucose_fbg_ogtt_df",
39
+ "get_glucose_tested_only_df",
40
+ "get_last_imp_visits_df",
41
+ "get_screening_df",
42
+ "get_test_string",
43
+ "get_unique_subject_identifiers",
44
+ "get_unique_visit_codes",
45
+ "glucose_endpoints",
46
+ ]
@@ -31,9 +31,8 @@ def get_eos_df() -> pd.DataFrame:
31
31
  df_visit_grp["followup_days"] = (
32
32
  df_visit_grp["visit_datetime"] - df_visit_grp["baseline_datetime"]
33
33
  ).dt.days
34
- df_eos = df_eos.merge(
34
+ return df_eos.merge(
35
35
  df_visit_grp[["subject_identifier", "followup_days"]],
36
36
  on="subject_identifier",
37
37
  how="left",
38
38
  ).reset_index(drop=True)
39
- return df_eos
@@ -25,7 +25,9 @@ def get_glucose_df() -> pd.DataFrame:
25
25
  ["ogtt_value", "ogtt_units", "ogtt_datetime"],
26
26
  ] = [np.nan, None, pd.NaT]
27
27
  df_glucose_fbg["source"] = "meta_subject.glucosefbg"
28
- df_glucose_fbg = pd.merge(
28
+ df_glucose_fbg = df_glucose_fbg[
29
+ [col for col in df_glucose_fbg.columns if "site_id" not in col]
30
+ ].merge(
29
31
  subject_visit_df[
30
32
  [
31
33
  "subject_identifier",
@@ -36,7 +38,6 @@ def get_glucose_df() -> pd.DataFrame:
36
38
  "subject_visit_id",
37
39
  ]
38
40
  ],
39
- df_glucose_fbg[[col for col in df_glucose_fbg.columns if "site_id" not in col]],
40
41
  on="subject_visit_id",
41
42
  how="left",
42
43
  )
@@ -50,7 +51,7 @@ def get_glucose_df() -> pd.DataFrame:
50
51
  )
51
52
  df_glucose["source"] = "meta_subject.glucose"
52
53
 
53
- df_glucose = pd.merge(
54
+ df_glucose = df_glucose.merge(
54
55
  subject_visit_df[
55
56
  [
56
57
  "subject_identifier",
@@ -85,8 +86,7 @@ def get_glucose_df() -> pd.DataFrame:
85
86
  "revision",
86
87
  "report_datetime",
87
88
  ]
88
- df = pd.merge(
89
- df_glucose[keep_cols],
89
+ df = df_glucose[keep_cols].merge(
90
90
  df_glucose_fbg[keep_cols],
91
91
  on="subject_visit_id",
92
92
  how="outer",
@@ -136,7 +136,7 @@ def get_glucose_df() -> pd.DataFrame:
136
136
  df["fgb_days"] = pd.to_numeric(df["fgb_days"], downcast="integer")
137
137
  df["ogtt_days"] = pd.to_numeric(df["ogtt_days"], downcast="integer")
138
138
 
139
- df = (
139
+ return (
140
140
  df.query(
141
141
  "offstudy_reason != 'Patient fulfilled late exclusion criteria "
142
142
  "(due to abnormal blood values or raised blood pressure at enrolment'"
@@ -146,4 +146,3 @@ def get_glucose_df() -> pd.DataFrame:
146
146
  .sort_values(by=["subject_identifier", "visit_code"])
147
147
  .reset_index(drop=True)
148
148
  )
149
- return df
@@ -19,9 +19,8 @@ def get_glucose_fbg_df(subject_identifiers: list[str] | None = None) -> pd.DataF
19
19
  subject_visit_model="meta_subject.subjectvisit",
20
20
  )
21
21
  df["source"] = "meta_subject.glucosefbg"
22
- df.rename(columns={"fbg_fasting": "fasting"}, inplace=True)
22
+ df = df.rename(columns={"fbg_fasting": "fasting"})
23
23
  df.loc[(df["fasting"] == "fasting"), "fasting"] = YES
24
24
  df.loc[(df["fasting"] == "non_fasting"), "fasting"] = NO
25
25
  df = calculate_fasting_hrs(df)
26
- df = df.reset_index(drop=True)
27
- return df
26
+ return df.reset_index(drop=True)
@@ -18,5 +18,4 @@ def get_glucose_fbg_ogtt_df(subject_identifiers: list[str] | None = None) -> pd.
18
18
  )
19
19
  df["source"] = "meta_subject.glucose"
20
20
  df = calculate_fasting_hrs(df)
21
- df = df.reset_index(drop=True)
22
- return df
21
+ return df.reset_index(drop=True)
@@ -5,12 +5,12 @@ from django_pandas.io import read_frame
5
5
  from edc_pdutils.dataframes import get_appointments, get_crf
6
6
 
7
7
 
8
- class InvalidLotNumber(Exception):
8
+ class InvalidLotNumber(Exception): # noqa: N818
9
9
  pass
10
10
 
11
11
 
12
12
  def site_cond(df, site_id):
13
- return (0 == 0) if not site_id else df.site_id == site_id
13
+ return (0 == 0) if not site_id else df.site_id == site_id # noqa: PLR0133
14
14
 
15
15
 
16
16
  def get_last_imp_visits_df(
@@ -28,8 +28,8 @@ def get_last_imp_visits_df(
28
28
  lot_number_model_cls = django_apps.get_model("meta_pharmacy.lotnumber")
29
29
  try:
30
30
  lot_obj = lot_number_model_cls.objects.get(lot_no=lot_no)
31
- except ObjectDoesNotExist:
32
- raise ObjectDoesNotExist("The lot number given is invalid")
31
+ except ObjectDoesNotExist as e:
32
+ raise ObjectDoesNotExist("The lot number given is invalid") from e
33
33
 
34
34
  df_meds = get_crf(
35
35
  "meta_subject.studymedication", subject_visit_model="meta_subject.subjectvisit"
@@ -100,5 +100,4 @@ def get_last_imp_visits_df(
100
100
  # calculate days since the IMP visit
101
101
  df_final["days_since"] = pd.to_datetime("today").normalize() - df_final.imp_visit_date
102
102
  df_final["days_until"] = df_final.next_appt_datetime - pd.to_datetime("today").normalize()
103
- df_final = df_final.reset_index()
104
- return df_final
103
+ return df_final.reset_index()
@@ -1,2 +1,4 @@
1
1
  from .endpoint_by_date import EndpointByDate
2
2
  from .glucose_endpoints_by_date import GlucoseEndpointsByDate
3
+
4
+ __all__ = ["EndpointByDate", "GlucoseEndpointsByDate"]
@@ -11,7 +11,7 @@ class EndpointTdeltaError(Exception):
11
11
  pass
12
12
 
13
13
 
14
- class InvalidCaseList(Exception):
14
+ class InvalidCaseList(Exception): # noqa: N818
15
15
  pass
16
16
 
17
17
 
@@ -68,42 +68,36 @@ class CaseData:
68
68
 
69
69
  def case_two(self) -> bool:
70
70
  """ "FBG >= 7 x 2, first OGTT<=11.1"""
71
- if (
71
+ return bool(
72
72
  self.fbg_value >= self.fbg_threshold
73
73
  and self.next_fbg_value >= self.fbg_threshold
74
74
  and 0.0 < self.ogtt_value < self.ogtt_threshold
75
75
  and self.fasted == YES
76
76
  and self.next_fasted == YES
77
77
  and (self.next_fbg_datetime.date() - self.fbg_datetime.date()).days > 6
78
- ):
79
- return True
80
- return False
78
+ )
81
79
 
82
80
  def case_three(self) -> bool:
83
81
  """ "FBG >= 7 x 2, second OGTT<=11.1"""
84
- if (
82
+ return bool(
85
83
  self.fbg_value >= self.fbg_threshold
86
84
  and self.next_fbg_value >= self.fbg_threshold
87
85
  and 0.0 < self.next_ogtt_value < self.ogtt_threshold
88
86
  and self.fasted == YES
89
87
  and self.next_fasted == YES
90
88
  and (self.next_fbg_datetime.date() - self.fbg_datetime.date()).days > 6
91
- ):
92
- return True
93
- return False
89
+ )
94
90
 
95
91
  def case_two_reversed(self) -> bool:
96
92
  """Same as case 2, but with the previous FBG reading."""
97
- if (
93
+ return bool(
98
94
  self.fbg_value >= self.fbg_threshold
99
95
  and self.previous_fbg_value >= self.fbg_threshold
100
96
  and 0.0 < self.previous_ogtt_value < self.ogtt_threshold
101
97
  and self.fasted == YES
102
98
  and self.previous_fasted == YES
103
99
  and (self.fbg_datetime.date() - self.previous_fbg_datetime.date()).days > 6
104
- ):
105
- return True
106
- return False
100
+ )
107
101
 
108
102
 
109
103
  class EndpointByDate:
@@ -132,8 +126,8 @@ class EndpointByDate:
132
126
  def __init__(
133
127
  self,
134
128
  subject_df: pd.DataFrame = None,
135
- fbg_threshhold: float = None,
136
- ogtt_threshhold: float = None,
129
+ fbg_threshhold: float | None = None,
130
+ ogtt_threshhold: float | None = None,
137
131
  ):
138
132
  self.row = None
139
133
  self.index = None
@@ -148,16 +142,15 @@ class EndpointByDate:
148
142
  if case_data.case_two():
149
143
  self.endpoint_reached(index, case=2, fbg_datetime=case_data.next_fbg_datetime)
150
144
  break
151
- elif case_data.case_three():
145
+ if case_data.case_three():
152
146
  self.endpoint_reached(index, case=3, fbg_datetime=case_data.next_fbg_datetime)
153
147
  break
154
- elif case_data.case_two_reversed():
148
+ if case_data.case_two_reversed():
155
149
  self.endpoint_reached(index, case=2, fbg_datetime=case_data.fbg_datetime)
156
150
  break
157
- else:
158
- pass
151
+ pass
159
152
 
160
- def endpoint_reached(self, index: int, case: int, fbg_datetime: pd.Timestamp):
153
+ def endpoint_reached(self, index: int, case: int, fbg_datetime: pd.Timestamp): # noqa: ARG002
161
154
  """Update the subject_df"""
162
155
  self.subject_df.loc[self.subject_df["fbg_datetime"] == fbg_datetime, "endpoint"] = 1
163
156
  self.subject_df["interval_in_days"] = np.nan
@@ -1,8 +1,8 @@
1
1
  import numpy as np
2
2
  import pandas as pd
3
3
  from django.apps import apps as django_apps
4
+ from django.utils import timezone
4
5
  from edc_constants.constants import YES
5
- from edc_utils import get_utcnow
6
6
 
7
7
  from ..constants import (
8
8
  CASE_EOS,
@@ -42,7 +42,7 @@ class GlucoseEndpointsByDate:
42
42
  fbg_threshhold = 7.0
43
43
  ogtt_threshhold = 11.1
44
44
  endpoint_cls = EndpointByDate
45
- keep_cols = [
45
+ keep_cols = [ # noqa: RUF012
46
46
  "fasted",
47
47
  "fasting_hrs",
48
48
  "fbg_value",
@@ -64,7 +64,6 @@ class GlucoseEndpointsByDate:
64
64
  def __init__(
65
65
  self, subject_identifiers: list[str] | None = None, case_list: list[int] | None = None
66
66
  ):
67
-
68
67
  self._glucose_fbg_df = pd.DataFrame()
69
68
  self._glucose_fbg_ogtt_df = pd.DataFrame()
70
69
  self.endpoint_only_df = pd.DataFrame()
@@ -93,7 +92,7 @@ class GlucoseEndpointsByDate:
93
92
  def run(self):
94
93
  self.process_by_ogtt_only()
95
94
  subject_identifiers_df = get_unique_subject_identifiers(self.df)
96
- for index, row in subject_identifiers_df.iterrows():
95
+ for _, row in subject_identifiers_df.iterrows():
97
96
  subject_df = self.get_subject_df(row["subject_identifier"])
98
97
  subject_df = self.endpoint_cls(
99
98
  subject_df=subject_df,
@@ -215,11 +214,12 @@ class GlucoseEndpointsByDate:
215
214
  [col for col in subject_df if "value" in col]
216
215
  ].fillna(0.0)
217
216
 
218
- subject_df = subject_df.reset_index(drop=True)
219
- return subject_df
217
+ return subject_df.reset_index(drop=True)
220
218
 
221
219
  def check_endpoint_by_fbg_for_subject(
222
- self, subject_df: pd.DataFrame, case_list: list[int] | None = None
220
+ self,
221
+ subject_df: pd.DataFrame,
222
+ case_list: list[int] | None = None, # noqa: ARG002
223
223
  ) -> pd.DataFrame:
224
224
  endpoint = self.endpoint_cls(
225
225
  subject_df=subject_df,
@@ -286,8 +286,7 @@ class GlucoseEndpointsByDate:
286
286
  self.endpoint_only_df = pd.concat([df1, df2])
287
287
  self.endpoint_only_df = self.endpoint_only_df.reset_index(drop=True)
288
288
 
289
- self.df = pd.merge(
290
- self.df,
289
+ self.df = self.df.merge(
291
290
  self.endpoint_only_df[["subject_identifier", "visit_code", "endpoint"]],
292
291
  on=["subject_identifier", "visit_code"],
293
292
  how="left",
@@ -300,7 +299,7 @@ class GlucoseEndpointsByDate:
300
299
  """Write endpoint_only_df to the Endpoints model"""
301
300
  df = self.endpoint_only_df
302
301
  model = "meta_reports.endpoints"
303
- now = get_utcnow()
302
+ now = timezone.now()
304
303
  model_cls = django_apps.get_model(model)
305
304
  if self.subject_identifiers:
306
305
  model_cls.objects.filter(subject_identifier__in=self.subject_identifiers).delete()
@@ -1,2 +1,4 @@
1
1
  from .get_glucose_tested_only_df import get_glucose_tested_only_df
2
2
  from .get_screening_df import get_screening_df
3
+
4
+ __all__ = ["get_glucose_tested_only_df", "get_screening_df"]
@@ -16,5 +16,4 @@ def get_glucose_tested_only_df(df: pd.DataFrame | None = None):
16
16
  | (df["ogtt2_value"].notna())
17
17
  )
18
18
  cond = (df["eligible_part_one"] == "Yes") & (df["eligible_part_two"] == "Yes") & cond_glu
19
- df = df[cond]
20
- return df
19
+ return df[cond]
@@ -72,7 +72,7 @@ def get_screening_df(df: pd.DataFrame | None = None) -> pd.DataFrame:
72
72
  # condition to include any glucose test
73
73
 
74
74
  # has_dm fillna with unk
75
- df["has_dm"] = df["has_dm"].apply(lambda x: "unk" if not x else x)
75
+ df["has_dm"] = df["has_dm"].apply(lambda x: x if x else "unk")
76
76
 
77
77
  na = "Not applicable, subject is not eligible based on the criteria above"
78
78
  df["already_fasted"] = df["already_fasted"].apply(lambda x: "N/A" if x == na else x)
@@ -117,13 +117,13 @@ def get_screening_df(df: pd.DataFrame | None = None) -> pd.DataFrame:
117
117
  subject_identifiers = list(df["subject_identifier"])
118
118
  qs_subject_visit = SubjectVisit.objects.filter(subject_identifier__in=subject_identifiers)
119
119
  df_subject_visit = read_frame(qs_subject_visit)
120
- df_subject_visit.rename(columns={"id": "subject_visit"}, inplace=True)
120
+ df_subject_visit = df_subject_visit.rename(columns={"id": "subject_visit"})
121
121
  qs_physical_exam = PhysicalExam.objects.filter(
122
122
  subject_visit__subject_identifier__in=subject_identifiers
123
123
  )
124
124
  df_physical_exam = read_frame(qs_physical_exam)
125
125
  # merge w/ subject visit to get subject_identifier
126
- df_physical_exam = pd.merge(
126
+ df_physical_exam = df_physical_exam.merge(
127
127
  df_physical_exam,
128
128
  df_subject_visit[
129
129
  ["subject_visit", "subject_identifier", "visit_code", "visit_code_sequence"]
@@ -144,13 +144,11 @@ def get_screening_df(df: pd.DataFrame | None = None) -> pd.DataFrame:
144
144
  ["waist_circumference_baseline"]
145
145
  ].apply(pd.to_numeric)
146
146
  # merge on subject_identifier with main DF
147
- df = pd.merge(
148
- df,
147
+ df = df.merge(
149
148
  df_physical_exam[["subject_identifier", "waist_circumference_baseline"]],
150
149
  on="subject_identifier",
151
150
  how="left",
152
- )
153
- df.reset_index(drop=True, inplace=True)
151
+ ).reset_index(drop=True)
154
152
  # set waist_circumference=waist_circumference_baseline
155
153
  # if `waist_circumference` is none and `waist_circumference_baseline` is not
156
154
  df.loc[
@@ -159,6 +157,4 @@ def get_screening_df(df: pd.DataFrame | None = None) -> pd.DataFrame:
159
157
  ] = df["waist_circumference_baseline"]
160
158
 
161
159
  # drop waist_circumference_baseline
162
- df.drop(columns=["waist_circumference_baseline"], inplace=True)
163
-
164
- return df
160
+ return df.drop(columns=["waist_circumference_baseline"])
@@ -37,16 +37,12 @@ def get_empty_endpoint_df() -> pd.DataFrame:
37
37
  "endpoint",
38
38
  "endpoint_type",
39
39
  ]
40
- ].apply(
41
- pd.to_numeric
42
- )
40
+ ].apply(pd.to_numeric)
43
41
  endpoint_df[
44
42
  ["baseline_datetime", "visit_datetime", "fbg_datetime", "offstudy_datetime"]
45
43
  ] = endpoint_df[
46
44
  ["baseline_datetime", "visit_datetime", "fbg_datetime", "offstudy_datetime"]
47
- ].apply(
48
- pd.to_datetime
49
- )
45
+ ].apply(pd.to_datetime)
50
46
  endpoint_df["visit_code"] = endpoint_df["visit_code"].astype(float)
51
47
  return endpoint_df
52
48
 
@@ -56,8 +52,7 @@ def get_unique_visit_codes(df: pd.DataFrame) -> pd.DataFrame:
56
52
  stats_df = stats_df.reset_index()
57
53
  stats_df["visit_code"] = stats_df["visit_code"].astype(float)
58
54
  stats_df = stats_df.sort_values(["visit_code"])
59
- stats_df = stats_df.reset_index(drop=True)
60
- return stats_df
55
+ return stats_df.reset_index(drop=True)
61
56
 
62
57
 
63
58
  def get_unique_subject_identifiers(df: pd.DataFrame) -> pd.DataFrame:
@@ -35,8 +35,7 @@ def get_tables() -> dict[str, Data]:
35
35
  & (df_not_tested["eligible_part_two"] == "Yes")
36
36
  )
37
37
  ]
38
- df_not_tested.drop(df_not_eligible_p1p2.index, inplace=True)
39
- df_not_tested.drop(df_fbg.index, inplace=True)
38
+ df_not_tested = df_not_tested.drop(df_not_eligible_p1p2.index).drop(df_fbg.index)
40
39
 
41
40
  df_stats = pd.DataFrame(
42
41
  {
@@ -1,2 +1,4 @@
1
1
  from .eligible import EligibleP12Table
2
2
  from .has_dm import HasDmTable
3
+
4
+ __all__ = ["EligibleP12Table", "HasDmTable"]
@@ -1,4 +1,5 @@
1
- from edc_action_item import Action, site_action_items
1
+ from edc_action_item.action import Action
2
+ from edc_action_item.site_action_items import site_action_items
2
3
  from edc_constants.constants import HIGH_PRIORITY
3
4
 
4
5
  from .constants import CONSENT_V1_EXTENSION_ACTION, RECONSENT_ACTION
@@ -1,3 +1,9 @@
1
1
  from .subject_consent_admin import SubjectConsentAdmin
2
2
  from .subject_consent_v1_admin import SubjectConsentV1Admin
3
3
  from .subject_consent_v1_ext_admin import SubjectConsentV1ExtAdmin
4
+
5
+ __all__ = [
6
+ "SubjectConsentAdmin",
7
+ "SubjectConsentV1Admin",
8
+ "SubjectConsentV1ExtAdmin",
9
+ ]
@@ -1 +1,3 @@
1
1
  from .create_missing_prescriptions import create_missing_metformin_rx
2
+
3
+ __all__ = ["create_missing_metformin_rx"]
@@ -9,7 +9,7 @@ from meta_pharmacy.constants import METFORMIN
9
9
 
10
10
 
11
11
  @admin.action(permissions=["view"], description="Create missing METFORMIN prescription")
12
- def create_missing_metformin_rx(modeladmin, request, queryset):
12
+ def create_missing_metformin_rx(modeladmin, request, queryset): # noqa: ARG001
13
13
  medication = Medication.objects.get(name=METFORMIN)
14
14
  total = queryset.count()
15
15
  subject_identifiers = queryset.values_list("subject_identifier", flat=True)
@@ -7,10 +7,10 @@ class AgreesListFilter(SimpleListFilter):
7
7
  title = "Agrees"
8
8
  parameter_name = "agrees"
9
9
 
10
- def lookups(self, request, model_admin):
10
+ def lookups(self, request, model_admin): # noqa: ARG002
11
11
  return YES_NO_NA
12
12
 
13
- def queryset(self, request, queryset):
13
+ def queryset(self, request, queryset): # noqa: ARG002
14
14
  qs = None
15
15
  if self.value():
16
16
  if self.value() == YES:
@@ -21,14 +21,13 @@ from ..models import SubjectConsent
21
21
 
22
22
 
23
23
  class SubjectConsentModelAdminMixin:
24
-
25
24
  form = SubjectConsentForm
26
25
 
27
- actions = [
26
+ actions = (
28
27
  flag_as_verified_against_paper,
29
28
  unflag_as_verified_against_paper,
30
29
  "create_missing_metformin_rx",
31
- ]
30
+ )
32
31
 
33
32
  fieldsets = (
34
33
  (
@@ -73,7 +72,7 @@ class SubjectConsentModelAdminMixin:
73
72
 
74
73
  search_fields = ("subject_identifier", "screening_identifier", "identity")
75
74
 
76
- radio_fields = {
75
+ radio_fields = { # noqa: RUF012
77
76
  "gender": admin.VERTICAL,
78
77
  "assessment_score": admin.VERTICAL,
79
78
  "consent_copy": admin.VERTICAL,
@@ -60,7 +60,7 @@ class SubjectConsentV1ExtAdmin(
60
60
  AgreesListFilter,
61
61
  )
62
62
 
63
- radio_fields = {
63
+ radio_fields = { # noqa: RUF012
64
64
  "agrees_to_extension": admin.VERTICAL,
65
65
  "consent_reviewed": admin.VERTICAL,
66
66
  "study_questions": admin.VERTICAL,
@@ -69,7 +69,7 @@ class SubjectConsentV1ExtAdmin(
69
69
  "consent_copy": admin.VERTICAL,
70
70
  }
71
71
 
72
- def get_readonly_fields(self, request, obj=None) -> tuple[str, ...]:
72
+ def get_readonly_fields(self, request, obj=None) -> tuple[str, ...]: # noqa: ARG002
73
73
  if obj:
74
74
  return ("subject_consent",)
75
75
  return ()