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
@@ -21,3 +21,23 @@ from .signals import (
21
21
  update_urine_pregnancy_on_pregnancy_notification_on_post_save,
22
22
  )
23
23
  from .subject_transfer import SubjectTransfer
24
+
25
+ __all__ = [
26
+ "DmReferral",
27
+ "EndOfStudy",
28
+ "LossToFollowup",
29
+ "OffSchedule",
30
+ "OffScheduleDmReferral",
31
+ "OffSchedulePostnatal",
32
+ "OffSchedulePregnancy",
33
+ "OffStudyMedication",
34
+ "OnSchedule",
35
+ "OnScheduleDmReferral",
36
+ "OnSchedulePostnatal",
37
+ "OnSchedulePregnancy",
38
+ "PregnancyNotification",
39
+ "ProtocolIncident",
40
+ "SubjectTransfer",
41
+ "update_schedule_on_pregnancy_notification_post_save",
42
+ "update_urine_pregnancy_on_pregnancy_notification_on_post_save",
43
+ ]
@@ -11,7 +11,7 @@ from ..constants import (
11
11
  )
12
12
 
13
13
 
14
- class OffSchedule(SiteModelMixin, ActionModelMixin, OffScheduleModelMixin, BaseUuidModel):
14
+ class OffSchedule(SiteModelMixin, OffScheduleModelMixin, ActionModelMixin, BaseUuidModel):
15
15
  action_name = OFFSCHEDULE_ACTION
16
16
  offschedule_compare_dates_as_datetimes = False
17
17
 
@@ -21,7 +21,7 @@ class OffSchedule(SiteModelMixin, ActionModelMixin, OffScheduleModelMixin, BaseU
21
21
 
22
22
 
23
23
  class OffSchedulePregnancy(
24
- SiteModelMixin, ActionModelMixin, OffScheduleModelMixin, BaseUuidModel
24
+ SiteModelMixin, OffScheduleModelMixin, ActionModelMixin, BaseUuidModel
25
25
  ):
26
26
  action_name = OFFSCHEDULE_PREGNANCY_ACTION
27
27
 
@@ -31,7 +31,7 @@ class OffSchedulePregnancy(
31
31
 
32
32
 
33
33
  class OffSchedulePostnatal(
34
- SiteModelMixin, ActionModelMixin, OffScheduleModelMixin, BaseUuidModel
34
+ SiteModelMixin, OffScheduleModelMixin, ActionModelMixin, BaseUuidModel
35
35
  ):
36
36
  action_name = OFFSCHEDULE_POSTNATAL_ACTION
37
37
 
@@ -41,7 +41,7 @@ class OffSchedulePostnatal(
41
41
 
42
42
 
43
43
  class OffScheduleDmReferral(
44
- SiteModelMixin, ActionModelMixin, OffScheduleModelMixin, BaseUuidModel
44
+ SiteModelMixin, OffScheduleModelMixin, ActionModelMixin, BaseUuidModel
45
45
  ):
46
46
  action_name = OFFSCHEDULE_DM_REFERRAL_ACTION
47
47
 
@@ -29,7 +29,7 @@ class ProtocolIncident(
29
29
  action_required_old = models.CharField(max_length=45, choices=ACTION_REQUIRED, null=True)
30
30
 
31
31
  def natural_key(self):
32
- return (self.action_identifier,) # noqa
32
+ return (self.action_identifier,)
33
33
 
34
34
  class Meta(ProtocolIncidentModelMixin.Meta, BaseUuidModel.Meta):
35
35
  pass
@@ -1,3 +1,5 @@
1
+ from django.conf import settings
2
+ from django.db import models
1
3
  from edc_model.models import BaseUuidModel
2
4
  from edc_transfer.model_mixins import SubjectTransferModelMixin
3
5
 
@@ -6,5 +8,11 @@ class SubjectTransfer(
6
8
  SubjectTransferModelMixin,
7
9
  BaseUuidModel,
8
10
  ):
11
+
12
+ transfer_reason = models.ManyToManyField(
13
+ f"{settings.LIST_MODEL_APP_LABEL}.transferreasons",
14
+ verbose_name="Reason for transfer",
15
+ )
16
+
9
17
  class Meta(SubjectTransferModelMixin.Meta, BaseUuidModel.Meta):
10
18
  pass
@@ -8,7 +8,7 @@ import django.db.models.manager
8
8
  import django_audit_fields.fields.hostname_modification_field
9
9
  import django_audit_fields.fields.userfield
10
10
  import django_audit_fields.fields.uuid_auto_field
11
- import django_audit_fields.models.audit_model_mixin
11
+ import django.utils.timezone
12
12
  import django_crypto_fields.fields.encrypted_char_field
13
13
  import django_revision.revision_field
14
14
  import edc_sites.models
@@ -44,14 +44,14 @@ class Migration(migrations.Migration):
44
44
  "created",
45
45
  models.DateTimeField(
46
46
  blank=True,
47
- default=django_audit_fields.models.audit_model_mixin.utcnow,
47
+ default=django.utils.timezone.now,
48
48
  ),
49
49
  ),
50
50
  (
51
51
  "modified",
52
52
  models.DateTimeField(
53
53
  blank=True,
54
- default=django_audit_fields.models.audit_model_mixin.utcnow,
54
+ default=django.utils.timezone.now,
55
55
  ),
56
56
  ),
57
57
  (
@@ -202,14 +202,14 @@ class Migration(migrations.Migration):
202
202
  "created",
203
203
  models.DateTimeField(
204
204
  blank=True,
205
- default=django_audit_fields.models.audit_model_mixin.utcnow,
205
+ default=django.utils.timezone.now,
206
206
  ),
207
207
  ),
208
208
  (
209
209
  "modified",
210
210
  models.DateTimeField(
211
211
  blank=True,
212
- default=django_audit_fields.models.audit_model_mixin.utcnow,
212
+ default=django.utils.timezone.now,
213
213
  ),
214
214
  ),
215
215
  (
@@ -0,0 +1,130 @@
1
+ # Generated by Django 5.2.6 on 2025-09-24 05:45
2
+
3
+ import django_revision.revision_field
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("meta_rando", "0005_alter_randomizationlist_options_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="historicalrandomizationlist",
16
+ name="allocated_user",
17
+ field=models.CharField(default="", max_length=50),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name="historicalrandomizationlist",
21
+ name="device_created",
22
+ field=models.CharField(
23
+ blank=True, default="", max_length=10, verbose_name="Device created"
24
+ ),
25
+ ),
26
+ migrations.AlterField(
27
+ model_name="historicalrandomizationlist",
28
+ name="device_modified",
29
+ field=models.CharField(
30
+ blank=True, default="", max_length=10, verbose_name="Device modified"
31
+ ),
32
+ ),
33
+ migrations.AlterField(
34
+ model_name="historicalrandomizationlist",
35
+ name="locale_created",
36
+ field=models.CharField(
37
+ blank=True,
38
+ default="",
39
+ help_text="Auto-updated by Modeladmin",
40
+ max_length=10,
41
+ verbose_name="Locale created",
42
+ ),
43
+ ),
44
+ migrations.AlterField(
45
+ model_name="historicalrandomizationlist",
46
+ name="locale_modified",
47
+ field=models.CharField(
48
+ blank=True,
49
+ default="",
50
+ help_text="Auto-updated by Modeladmin",
51
+ max_length=10,
52
+ verbose_name="Locale modified",
53
+ ),
54
+ ),
55
+ migrations.AlterField(
56
+ model_name="historicalrandomizationlist",
57
+ name="revision",
58
+ field=django_revision.revision_field.RevisionField(
59
+ blank=True,
60
+ default="",
61
+ editable=False,
62
+ help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
63
+ max_length=75,
64
+ verbose_name="Revision",
65
+ ),
66
+ ),
67
+ migrations.AlterField(
68
+ model_name="historicalrandomizationlist",
69
+ name="verified_user",
70
+ field=models.CharField(default="", max_length=50),
71
+ ),
72
+ migrations.AlterField(
73
+ model_name="randomizationlist",
74
+ name="allocated_user",
75
+ field=models.CharField(default="", max_length=50),
76
+ ),
77
+ migrations.AlterField(
78
+ model_name="randomizationlist",
79
+ name="device_created",
80
+ field=models.CharField(
81
+ blank=True, default="", max_length=10, verbose_name="Device created"
82
+ ),
83
+ ),
84
+ migrations.AlterField(
85
+ model_name="randomizationlist",
86
+ name="device_modified",
87
+ field=models.CharField(
88
+ blank=True, default="", max_length=10, verbose_name="Device modified"
89
+ ),
90
+ ),
91
+ migrations.AlterField(
92
+ model_name="randomizationlist",
93
+ name="locale_created",
94
+ field=models.CharField(
95
+ blank=True,
96
+ default="",
97
+ help_text="Auto-updated by Modeladmin",
98
+ max_length=10,
99
+ verbose_name="Locale created",
100
+ ),
101
+ ),
102
+ migrations.AlterField(
103
+ model_name="randomizationlist",
104
+ name="locale_modified",
105
+ field=models.CharField(
106
+ blank=True,
107
+ default="",
108
+ help_text="Auto-updated by Modeladmin",
109
+ max_length=10,
110
+ verbose_name="Locale modified",
111
+ ),
112
+ ),
113
+ migrations.AlterField(
114
+ model_name="randomizationlist",
115
+ name="revision",
116
+ field=django_revision.revision_field.RevisionField(
117
+ blank=True,
118
+ default="",
119
+ editable=False,
120
+ help_text="System field. From git repository (tag:branch:commit), project metadata, project toml, project VERSION, or settings.",
121
+ max_length=75,
122
+ verbose_name="Revision",
123
+ ),
124
+ ),
125
+ migrations.AlterField(
126
+ model_name="randomizationlist",
127
+ name="verified_user",
128
+ field=models.CharField(default="", max_length=50),
129
+ ),
130
+ ]
meta_reports/__init__.py CHANGED
@@ -1 +1,3 @@
1
1
  from .tasks import update_endpoints_table
2
+
3
+ __all__ = ["update_endpoints_table"]
@@ -13,3 +13,19 @@ from .dbviews import (
13
13
  from .endpoints_admin import EndpointsAdmin
14
14
  from .endpoints_all_admin import EndpointsAllAdmin
15
15
  from .last_imp_refill_admin import LastImpRefillAdmin
16
+
17
+ __all__ = [
18
+ "EndpointsAdmin",
19
+ "EndpointsAllAdmin",
20
+ "GlucoseSummaryAdmin",
21
+ "ImpSubstitutionsAdmin",
22
+ "LastImpRefillAdmin",
23
+ "MissingOgttNoteModelAdmin",
24
+ "MissingScreeningOgttAdmin",
25
+ "OnStudyMissingLabValuesAdmin",
26
+ "OnStudyMissingValuesAdmin",
27
+ "PatientHistoryMissingBaselineCd4Admin",
28
+ "UnattendedThreeInRow2Admin",
29
+ "UnattendedThreeInRowAdmin",
30
+ "UnattendedTwoInRowAdmin",
31
+ ]
@@ -12,3 +12,16 @@ from .patient_history_missing_baseline_cd4_admin import (
12
12
  from .unattended_three_in_row2_admin import UnattendedThreeInRow2Admin
13
13
  from .unattended_three_in_row_admin import UnattendedThreeInRowAdmin
14
14
  from .unattended_two_in_row_admin import UnattendedTwoInRowAdmin
15
+
16
+ __all__ = [
17
+ "GlucoseSummaryAdmin",
18
+ "ImpSubstitutionsAdmin",
19
+ "MissingOgttNoteModelAdmin",
20
+ "MissingScreeningOgttAdmin",
21
+ "OnStudyMissingLabValuesAdmin",
22
+ "OnStudyMissingValuesAdmin",
23
+ "PatientHistoryMissingBaselineCd4Admin",
24
+ "UnattendedThreeInRow2Admin",
25
+ "UnattendedThreeInRowAdmin",
26
+ "UnattendedTwoInRowAdmin",
27
+ ]
@@ -23,9 +23,9 @@ class GlucoseSummaryAdmin(
23
23
  TemplatesModelAdminMixin,
24
24
  admin.ModelAdmin,
25
25
  ):
26
- ordering = ["site", "subject_identifier", "fbg_datetime"]
26
+ ordering = ("site", "subject_identifier", "fbg_datetime")
27
27
  include_note_column = False
28
- list_display = [
28
+ list_display = (
29
29
  "dashboard",
30
30
  "subject_identifier_link",
31
31
  "site",
@@ -37,9 +37,9 @@ class GlucoseSummaryAdmin(
37
37
  "ogtt_date",
38
38
  "endpoint",
39
39
  "offstudy_date",
40
- ]
40
+ )
41
41
 
42
- list_filter = [
42
+ list_filter = (
43
43
  ScheduleStatusListFilter,
44
44
  "fasted",
45
45
  FbgListFilter,
@@ -47,9 +47,9 @@ class GlucoseSummaryAdmin(
47
47
  "fbg_datetime",
48
48
  "ogtt_datetime",
49
49
  EndpointListFilter,
50
- ]
50
+ )
51
51
 
52
- search_fields = ["subject_identifier"]
52
+ search_fields = ("subject_identifier",)
53
53
 
54
54
  @admin.display(description="visit", ordering="visit_code")
55
55
  def visit(self, obj=None):
@@ -1,3 +1,5 @@
1
+ import contextlib
2
+
1
3
  from django.apps import apps as django_apps
2
4
  from django.contrib import admin
3
5
  from django.core.exceptions import ObjectDoesNotExist
@@ -25,8 +27,8 @@ class ImpSubstitutionsAdmin(
25
27
  TemplatesModelAdminMixin,
26
28
  admin.ModelAdmin,
27
29
  ):
28
- ordering = ["site", "subject_identifier"]
29
- list_display = [
30
+ ordering = ("site", "subject_identifier")
31
+ list_display = (
30
32
  "dashboard",
31
33
  "render_button",
32
34
  "subject",
@@ -38,20 +40,20 @@ class ImpSubstitutionsAdmin(
38
40
  "user_created",
39
41
  "user_modified",
40
42
  "modified",
41
- ]
43
+ )
42
44
 
43
- list_filter = [
45
+ list_filter = (
44
46
  "arm_match",
45
47
  ScheduleStatusListFilter,
46
48
  ReportDateListFilter,
47
49
  "allocated_datetime",
48
- ]
50
+ )
49
51
 
50
52
  search_fields = ["subject_identifier", "sid", "dispensed_sid"]
51
53
 
52
54
  def dashboard(self, obj=None, label=None) -> str:
53
55
  kwargs = self.get_subject_dashboard_url_kwargs(obj)
54
- try:
56
+ with contextlib.suppress(ObjectDoesNotExist):
55
57
  kwargs.update(
56
58
  appointment=str(
57
59
  Appointment.objects.get(
@@ -61,8 +63,6 @@ class ImpSubstitutionsAdmin(
61
63
  ).id
62
64
  )
63
65
  )
64
- except ObjectDoesNotExist:
65
- pass
66
66
  url = reverse(self.get_subject_dashboard_url_name(obj=obj), kwargs=kwargs)
67
67
  context = dict(title=_("Go to subject's dashboard@1000"), url=url, label=label)
68
68
  return render_to_string("edc_subject_dashboard/dashboard_button.html", context=context)
@@ -86,13 +86,14 @@ class ImpSubstitutionsAdmin(
86
86
  f"{url}?next={self.admin_site.name}:"
87
87
  f"{self.model._meta.label_lower.replace('.', '_')}_changelist"
88
88
  )
89
- title = _(f"View {crf_model_cls._meta.verbose_name}")
89
+ title = _("View %(verbose_name)s").format(
90
+ verbose_name=crf_model_cls._meta.verbose_name
91
+ )
90
92
  label = _("View")
91
- crf_button = render_to_string(
93
+ return render_to_string(
92
94
  "edc_qareports/columns/change_button.html",
93
95
  context=dict(title=title, url=url, label=label),
94
96
  )
95
- return crf_button
96
97
 
97
98
  @admin.display(description="Report date", ordering="report_datetime")
98
99
  def report_date(self, obj) -> str | None:
@@ -1,2 +1,7 @@
1
1
  from .note_model_admin import MissingOgttNoteModelAdmin
2
2
  from .unmanaged_model_admin import MissingScreeningOgttAdmin
3
+
4
+ __all__ = [
5
+ "MissingOgttNoteModelAdmin",
6
+ "MissingScreeningOgttAdmin",
7
+ ]
@@ -1,6 +1,7 @@
1
1
  from django.contrib import admin
2
2
  from django_audit_fields import audit_fieldset_tuple
3
- from edc_qareports.modeladmin_mixins import NoteModelAdminMixin
3
+ from edc_model_admin.mixins import TemplatesModelAdminMixin
4
+ from edc_sites.admin import SiteModelAdminMixin
4
5
 
5
6
  from ....admin_site import meta_reports_admin
6
7
  from ....forms import MissingOgttNoteForm
@@ -9,7 +10,8 @@ from ....models import MissingOgttNote
9
10
 
10
11
  @admin.register(MissingOgttNote, site=meta_reports_admin)
11
12
  class MissingOgttNoteModelAdmin(
12
- NoteModelAdminMixin,
13
+ SiteModelAdminMixin,
14
+ TemplatesModelAdminMixin,
13
15
  admin.ModelAdmin,
14
16
  ):
15
17
  """A modeladmin class for the Note model."""
@@ -46,8 +48,30 @@ class MissingOgttNoteModelAdmin(
46
48
  audit_fieldset_tuple,
47
49
  )
48
50
 
49
- radio_fields = {
51
+ radio_fields = { # noqa: RUF012
50
52
  "ogtt_units": admin.VERTICAL,
51
53
  "result_status": admin.VERTICAL,
52
54
  "fasting": admin.VERTICAL,
53
55
  }
56
+
57
+ list_display = (
58
+ "subject_identifier",
59
+ "note",
60
+ "status",
61
+ "report_datetime",
62
+ )
63
+
64
+ # radio_fields = {"status": admin.VERTICAL}
65
+
66
+ list_filter = (
67
+ "report_datetime",
68
+ "status",
69
+ "report_model",
70
+ "user_created",
71
+ "user_modified",
72
+ )
73
+
74
+ search_fields = ("subject_identifier", "name")
75
+
76
+ def get_view_only_site_ids_for_user(self, request) -> list[int]:
77
+ return [s.id for s in request.user.userprofile.sites.all() if s.id != request.site.id]
@@ -32,9 +32,9 @@ class MissingScreeningOgttAdmin(
32
32
  note_template = "edc_qareports/columns/notes_column.html"
33
33
  include_note_column = True
34
34
 
35
- ordering = ["site", "subject_identifier"]
35
+ ordering = ("site", "subject_identifier")
36
36
 
37
- list_display = [
37
+ list_display = (
38
38
  "dashboard",
39
39
  "subject_identifier",
40
40
  "site",
@@ -49,17 +49,17 @@ class MissingScreeningOgttAdmin(
49
49
  "fbg2_datetime",
50
50
  "ogtt2_datetime",
51
51
  "consented",
52
- ]
52
+ )
53
53
 
54
- list_filter = [
54
+ list_filter = (
55
55
  ScheduleStatusListFilter,
56
56
  "screening_datetime",
57
57
  "fbg_datetime",
58
58
  "repeated",
59
59
  "p3_ltfu",
60
- ]
60
+ )
61
61
 
62
- search_fields = ["subject_identifier"]
62
+ search_fields = ("subject_identifier",)
63
63
 
64
64
  def dashboard(self, obj=None, label=None) -> str:
65
65
  url = self.get_subject_dashboard_url(obj=obj)
@@ -1 +1,3 @@
1
1
  from .unmanaged_model_admin import OnStudyMissingLabValuesAdmin
2
+
3
+ __all__ = ["OnStudyMissingLabValuesAdmin"]
@@ -7,7 +7,4 @@ from ....models import OnStudyMissingLabValues
7
7
 
8
8
  @admin.register(OnStudyMissingLabValues, site=meta_reports_admin)
9
9
  class OnStudyMissingLabValuesAdmin(OnStudyMissingValuesModelAdminMixin, admin.ModelAdmin):
10
-
11
10
  include_note_column: bool = True
12
-
13
- instructions = ["ello"]
@@ -1 +1,3 @@
1
1
  from .unmanaged_model_admin import OnStudyMissingValuesAdmin
2
+
3
+ __all__ = ["OnStudyMissingValuesAdmin"]
@@ -1,3 +1,5 @@
1
+ import contextlib
2
+
1
3
  from django.contrib import admin
2
4
  from django.core.exceptions import ObjectDoesNotExist
3
5
  from django.template.loader import render_to_string
@@ -23,8 +25,8 @@ class PatientHistoryMissingBaselineCd4Admin(
23
25
  TemplatesModelAdminMixin,
24
26
  admin.ModelAdmin,
25
27
  ):
26
- ordering = ["site", "subject_identifier"]
27
- list_display = [
28
+ ordering = ("site", "subject_identifier")
29
+ list_display = (
28
30
  "dashboard",
29
31
  "subject_identifier",
30
32
  "cd4",
@@ -33,15 +35,15 @@ class PatientHistoryMissingBaselineCd4Admin(
33
35
  "user_created",
34
36
  "user_modified",
35
37
  "modified",
36
- ]
38
+ )
37
39
 
38
- list_filter = [ScheduleStatusListFilter]
40
+ list_filter = (ScheduleStatusListFilter,)
39
41
 
40
- search_fields = ["subject_identifier"]
42
+ search_fields = ("subject_identifier",)
41
43
 
42
44
  def dashboard(self, obj=None, label=None) -> str:
43
45
  kwargs = self.get_subject_dashboard_url_kwargs(obj)
44
- try:
46
+ with contextlib.suppress(ObjectDoesNotExist):
45
47
  kwargs.update(
46
48
  appointment=str(
47
49
  Appointment.objects.get(
@@ -51,8 +53,6 @@ class PatientHistoryMissingBaselineCd4Admin(
51
53
  ).id
52
54
  )
53
55
  )
54
- except ObjectDoesNotExist:
55
- pass
56
56
  url = reverse(self.get_subject_dashboard_url_name(obj=obj), kwargs=kwargs)
57
57
  context = dict(title=_("Go to subject's dashboard@1000"), url=url, label=label)
58
58
  return render_to_string("edc_subject_dashboard/dashboard_button.html", context=context)
@@ -17,9 +17,9 @@ class UnattendedThreeInRow2Admin(
17
17
  TemplatesModelAdminMixin,
18
18
  admin.ModelAdmin,
19
19
  ):
20
- ordering = ["site", "subject_identifier"]
20
+ ordering = ("site", "subject_identifier")
21
21
 
22
- list_display = [
22
+ list_display = (
23
23
  "dashboard",
24
24
  "subject",
25
25
  "first_value",
@@ -30,17 +30,17 @@ class UnattendedThreeInRow2Admin(
30
30
  "site",
31
31
  "missed_count",
32
32
  "created",
33
- ]
33
+ )
34
34
 
35
- list_filter = [
35
+ list_filter = (
36
36
  "missed_count",
37
37
  ScheduleStatusListFilter,
38
38
  "first_value",
39
39
  "second_value",
40
40
  "third_value",
41
- ]
41
+ )
42
42
 
43
- search_fields = ["id", "subject_identifier", "first_value", "second_value", "third_value"]
43
+ search_fields = ("id", "subject_identifier", "first_value", "second_value", "third_value")
44
44
 
45
45
  @admin.display(description="Subject", ordering="subject_identifier")
46
46
  def subject(self, obj):
@@ -17,8 +17,8 @@ class UnattendedThreeInRowAdmin(
17
17
  TemplatesModelAdminMixin,
18
18
  admin.ModelAdmin,
19
19
  ):
20
- ordering = ["site", "subject_identifier"]
21
- list_display = [
20
+ ordering = ("site", "subject_identifier")
21
+ list_display = (
22
22
  "dashboard",
23
23
  "subject_identifier",
24
24
  "first_value",
@@ -28,8 +28,8 @@ class UnattendedThreeInRowAdmin(
28
28
  "from_now_days",
29
29
  "site",
30
30
  "created",
31
- ]
31
+ )
32
32
 
33
- list_filter = [ScheduleStatusListFilter, "first_value", "second_value", "third_value"]
33
+ list_filter = (ScheduleStatusListFilter, "first_value", "second_value", "third_value")
34
34
 
35
- search_fields = ["subject_identifier", "first_value", "second_value", "third_value"]
35
+ search_fields = ("subject_identifier", "first_value", "second_value", "third_value")
@@ -17,8 +17,8 @@ class UnattendedTwoInRowAdmin(
17
17
  TemplatesModelAdminMixin,
18
18
  admin.ModelAdmin,
19
19
  ):
20
- ordering = ["site", "subject_identifier"]
21
- list_display = [
20
+ ordering = ("site", "subject_identifier")
21
+ list_display = (
22
22
  "dashboard",
23
23
  "subject_identifier",
24
24
  "first_value",
@@ -27,8 +27,8 @@ class UnattendedTwoInRowAdmin(
27
27
  "from_now_days",
28
28
  "site",
29
29
  "created",
30
- ]
30
+ )
31
31
 
32
- list_filter = [ScheduleStatusListFilter, "first_value", "second_value"]
32
+ list_filter = (ScheduleStatusListFilter, "first_value", "second_value")
33
33
 
34
- search_fields = ["subject_identifier", "first_value", "second_value"]
34
+ search_fields = ("subject_identifier", "first_value", "second_value")
@@ -8,7 +8,7 @@ from .modeladmin_mixins import EndpointsModelAdminMixin
8
8
 
9
9
  @admin.register(Endpoints, site=meta_reports_admin)
10
10
  class EndpointsAdmin(EndpointsModelAdminMixin, admin.ModelAdmin):
11
- queryset_filter = dict(offstudy_date__isnull=True)
11
+ queryset_filter = dict(offstudy_date__isnull=True) # noqa: RUF012
12
12
 
13
13
  def rendered_change_list_note(self):
14
14
  return render_to_string("meta_reports/endpoints_change_list_note.html")