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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1169) hide show
  1. meta_ae/action_items.py +40 -29
  2. meta_ae/admin/__init__.py +12 -2
  3. meta_ae/admin/ae_followup_admin.py +2 -2
  4. meta_ae/admin/ae_initial_admin.py +7 -4
  5. meta_ae/admin/ae_local_review_admin.py +2 -2
  6. meta_ae/admin/ae_sponsor_review_admin.py +2 -2
  7. meta_ae/admin/ae_susar_admin.py +3 -3
  8. meta_ae/admin/ae_tmg_admin.py +2 -2
  9. meta_ae/admin/death_report_admin.py +3 -3
  10. meta_ae/admin/death_report_tmg_admin.py +4 -2
  11. meta_ae/admin/death_report_tmg_second_admin.py +4 -2
  12. meta_ae/admin/hospitalization_admin.py +15 -0
  13. meta_ae/admin/modeladmin_mixins.py +14 -16
  14. meta_ae/baker_recipes.py +5 -6
  15. meta_ae/choices.py +1 -1
  16. meta_ae/forms/__init__.py +14 -0
  17. meta_ae/forms/death_report_form.py +1 -2
  18. meta_ae/forms/hospitalization_form.py +11 -0
  19. meta_ae/forms/modelform_mixins.py +2 -2
  20. meta_ae/list_data.py +2 -1
  21. meta_ae/migrations/0001_initial.py +27 -28
  22. meta_ae/migrations/0002_auto_20191024_1000.py +0 -1
  23. meta_ae/migrations/0003_auto_20191102_0033.py +0 -1
  24. meta_ae/migrations/0004_auto_20191114_0821.py +0 -1
  25. meta_ae/migrations/0005_auto_20210624_0225.py +0 -1
  26. meta_ae/migrations/0006_aelocalreview_aesponsorreview.py +5 -6
  27. meta_ae/migrations/0007_auto_20210911_2036.py +0 -1
  28. meta_ae/migrations/0008_auto_20211011_1657.py +0 -1
  29. meta_ae/migrations/0009_auto_20220307_1929.py +0 -1
  30. meta_ae/migrations/0010_auto_20220704_1841.py +0 -1
  31. meta_ae/migrations/0011_alter_aefollowup_action_identifier_and_more.py +0 -1
  32. meta_ae/migrations/0012_auto_20220826_0258.py +0 -1
  33. meta_ae/migrations/0013_auto_20220826_0322.py +0 -1
  34. meta_ae/migrations/0014_auto_20220826_0406.py +0 -1
  35. meta_ae/migrations/0015_auto_20220907_0157.py +0 -1
  36. meta_ae/migrations/0016_rename_narrative_aetmg_investigator_narrative_and_more.py +128 -0
  37. meta_ae/migrations/0017_auto_20221130_2257.py +29 -0
  38. meta_ae/migrations/0018_alter_deathreporttmg_cause_of_death_agreed_and_more.py +45 -0
  39. meta_ae/migrations/0019_alter_aefollowup_managers_alter_aeinitial_managers_and_more.py +529 -0
  40. meta_ae/migrations/0020_alter_aesusar_options_alter_aetmg_options_and_more.py +532 -0
  41. meta_ae/migrations/0021_alter_aefollowup_site_alter_aeinitial_site_and_more.py +158 -0
  42. meta_ae/migrations/0022_historicalhospitalization_hospitalization.py +590 -0
  43. meta_ae/migrations/0023_alter_aefollowup_action_identifier_and_more.py +2017 -0
  44. meta_ae/model_mixins/__init__.py +2 -0
  45. meta_ae/model_mixins/ae_review_model_mixin.py +8 -8
  46. meta_ae/model_mixins/death_report_model_mixin.py +3 -4
  47. meta_ae/models/__init__.py +14 -0
  48. meta_ae/models/ae_initial.py +4 -0
  49. meta_ae/models/death_report.py +0 -1
  50. meta_ae/models/death_report_tmg_second.py +0 -1
  51. meta_ae/models/hospitalization.py +21 -0
  52. meta_ae/models/managers.py +1 -4
  53. meta_ae/pdf_reports/__init__.py +4 -2
  54. meta_ae/pdf_reports/ae_pdf_report.py +7 -0
  55. meta_ae/pdf_reports/death_pdf_report.py +7 -0
  56. meta_ae/pdf_reports/meta_pdf_report_mixin.py +4 -2
  57. meta_ae/templatetags/meta_ae_extras.py +5 -6
  58. meta_analytics/.DS_Store +0 -0
  59. meta_analytics/README.rst +16 -0
  60. meta_analytics/dataframes/__init__.py +46 -0
  61. meta_analytics/dataframes/constants.py +36 -0
  62. meta_analytics/dataframes/get_eos_df.py +38 -0
  63. meta_analytics/dataframes/get_glucose_df.py +166 -0
  64. meta_analytics/dataframes/get_glucose_fbg_df.py +26 -0
  65. meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py +21 -0
  66. meta_analytics/dataframes/get_last_imp_visits_df.py +103 -0
  67. meta_analytics/dataframes/glucose_endpoints/__init__.py +4 -0
  68. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +184 -0
  69. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +407 -0
  70. meta_analytics/dataframes/screening/__init__.py +4 -0
  71. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +19 -0
  72. meta_analytics/dataframes/screening/get_screening_df.py +156 -0
  73. meta_analytics/dataframes/utils.py +74 -0
  74. meta_analytics/get_tables.py +80 -0
  75. meta_analytics/tables/__init__.py +4 -0
  76. meta_analytics/tables/eligible.py +106 -0
  77. meta_analytics/tables/enrolled/glucose.py +27 -0
  78. meta_analytics/tables/has_dm.py +61 -0
  79. meta_analytics/utils.py +81 -0
  80. meta_auth/auth_objects.py +34 -5
  81. meta_auth/auths.py +21 -6
  82. meta_consent/action_items.py +22 -3
  83. meta_consent/admin/__init__.py +8 -1
  84. meta_consent/admin/actions/__init__.py +2 -0
  85. meta_consent/admin/actions/create_missing_prescriptions.py +2 -2
  86. meta_consent/admin/list_filters.py +22 -0
  87. meta_consent/admin/modeladmin_mixins.py +148 -0
  88. meta_consent/admin/subject_consent_admin.py +6 -134
  89. meta_consent/admin/subject_consent_v1_admin.py +19 -0
  90. meta_consent/admin/subject_consent_v1_ext_admin.py +93 -0
  91. meta_consent/baker_recipes.py +11 -11
  92. meta_consent/consents.py +27 -8
  93. meta_consent/constants.py +1 -0
  94. meta_consent/form_validators/__init__.py +3 -0
  95. meta_consent/form_validators/subject_consent_form_validator.py +30 -0
  96. meta_consent/forms/__init__.py +10 -1
  97. meta_consent/forms/subject_consent_form.py +26 -46
  98. meta_consent/forms/subject_consent_v1_ext_form.py +47 -0
  99. meta_consent/forms/subject_consent_v1_form.py +26 -0
  100. meta_consent/forms/subject_reconsent_form.py +4 -4
  101. meta_consent/locale/lg/LC_MESSAGES/django.po +69 -0
  102. meta_consent/locale/sw/LC_MESSAGES/django.po +70 -0
  103. meta_consent/management/commands/create_missing_prescriptions.py +5 -3
  104. meta_consent/migrations/0001_initial.py +9 -10
  105. meta_consent/migrations/0002_auto_20191024_1000.py +0 -1
  106. meta_consent/migrations/0003_auto_20200325_0901.py +0 -1
  107. meta_consent/migrations/0004_auto_20210624_0225.py +0 -1
  108. meta_consent/migrations/0005_alter_subjectconsent_options.py +0 -1
  109. meta_consent/migrations/0006_auto_20210911_2036.py +0 -1
  110. meta_consent/migrations/0007_auto_20220128_1719.py +0 -1
  111. meta_consent/migrations/0008_auto_20220412_2151.py +0 -1
  112. meta_consent/migrations/0009_auto_20220704_1841.py +0 -1
  113. meta_consent/migrations/0010_alter_historicalsubjectreconsent_action_identifier_and_more.py +0 -1
  114. meta_consent/migrations/0011_auto_20220826_0258.py +0 -1
  115. meta_consent/migrations/0012_auto_20220826_0322.py +0 -1
  116. meta_consent/migrations/0013_auto_20220826_0406.py +0 -1
  117. meta_consent/migrations/0014_alter_subjectconsent_managers.py +1 -2
  118. meta_consent/migrations/0015_auto_20220914_0542.py +0 -1
  119. meta_consent/migrations/0016_auto_20220914_0547.py +0 -2
  120. meta_consent/migrations/0017_auto_20220929_1742.py +3 -3
  121. meta_consent/migrations/0018_alter_subjectconsent_options_and_more.py +170 -0
  122. meta_consent/migrations/0019_alter_subjectconsent_options_and_more.py +191 -0
  123. meta_consent/migrations/0020_historicalsubjectconsent_model_name_and_more.py +34 -0
  124. meta_consent/migrations/0021_auto_20240111_0442.py +17 -0
  125. meta_consent/migrations/0022_alter_historicalsubjectconsent_site_and_more.py +36 -0
  126. meta_consent/migrations/0023_subjectconsentv1_and_more.py +86 -0
  127. meta_consent/migrations/0024_historicalsubjectconsentv1.py +595 -0
  128. meta_consent/migrations/0025_alter_historicalsubjectconsent_first_name_and_more.py +151 -0
  129. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +535 -0
  130. meta_consent/migrations/0027_auto_20250111_0344.py +30 -0
  131. meta_consent/migrations/0028_historicalsubjectconsentv1ext_assessment_score_and_more.py +162 -0
  132. meta_consent/migrations/0029_alter_historicalsubjectconsentv1ext_agrees_to_extension_and_more.py +33 -0
  133. meta_consent/migrations/0030_auto_20250120_2114.py +40 -0
  134. meta_consent/migrations/0031_alter_historicalsubjectconsent_guardian_name_and_more.py +124 -0
  135. meta_consent/migrations/0032_alter_historicalsubjectconsent_device_created_and_more.py +678 -0
  136. meta_consent/migrations/0033_historicalsubjectconsentspfq_subjectconsentspfq.py +615 -0
  137. meta_consent/migrations/0034_remove_subjectconsentspfq_site_and_more.py +23 -0
  138. meta_consent/migrations/0035_alter_historicalsubjectconsent_consent_definition_name_and_more.py +43 -0
  139. meta_consent/models/__init__.py +11 -0
  140. meta_consent/models/model_mixins.py +1 -2
  141. meta_consent/models/signals.py +68 -52
  142. meta_consent/models/subject_consent.py +9 -20
  143. meta_consent/models/subject_consent_v1.py +15 -0
  144. meta_consent/models/subject_consent_v1_ext.py +34 -0
  145. meta_consent/models/subject_reconsent.py +6 -7
  146. meta_dashboard/apps.py +0 -40
  147. meta_dashboard/locale/lg/LC_MESSAGES/django.po +30 -0
  148. meta_dashboard/locale/sw/LC_MESSAGES/django.po +31 -0
  149. meta_dashboard/navbars.py +12 -14
  150. meta_dashboard/patterns.py +1 -1
  151. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/dashboard_button.html +1 -1
  152. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/eligibility_button.html +1 -1
  153. meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/screening_button.html +1 -1
  154. meta_dashboard/templates/meta_dashboard/{bootstrap3/screening → screening}/listboard.html +18 -17
  155. meta_dashboard/templates/meta_dashboard/subject/dashboard/sidebar.html +24 -0
  156. meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/dashboard/top_bar.html +1 -1
  157. meta_dashboard/templates/meta_dashboard/subject/dashboard.html +14 -0
  158. meta_dashboard/templates/meta_dashboard/{bootstrap3/subject → subject}/listboard.html +14 -6
  159. meta_dashboard/templatetags/meta_dashboard_extras.py +77 -78
  160. meta_dashboard/urls.py +10 -10
  161. meta_dashboard/view_utils/__init__.py +13 -0
  162. meta_dashboard/view_utils/subject_screening_button.py +114 -0
  163. meta_dashboard/views/__init__.py +8 -0
  164. meta_dashboard/views/ae/__init__.py +2 -0
  165. meta_dashboard/views/ae/ae_listboard_view.py +3 -4
  166. meta_dashboard/views/ae/death_report_listboard_view.py +4 -4
  167. meta_dashboard/views/screening/__init__.py +2 -0
  168. meta_dashboard/views/screening/listboard_view.py +5 -16
  169. meta_dashboard/views/subject/__init__.py +2 -0
  170. meta_dashboard/views/subject/dashboard/__init__.py +2 -0
  171. meta_dashboard/views/subject/dashboard/dashboard_view.py +41 -3
  172. meta_dashboard/views/subject/listboard/__init__.py +2 -0
  173. meta_dashboard/views/subject/listboard/listboard_view.py +8 -12
  174. meta_data_manager/handlers.py +0 -1
  175. meta_edc/__init__.py +10 -0
  176. meta_edc/admin.py +3 -4
  177. meta_edc/celery.py +6 -14
  178. meta_edc/celery_live.py +19 -0
  179. meta_edc/celery_uat.py +25 -0
  180. meta_edc/management/commands/update_forms_reference.py +16 -17
  181. meta_edc/meta_version.py +2 -2
  182. meta_edc/navbars.py +17 -12
  183. meta_edc/settings/debug.py +30 -9
  184. meta_edc/settings/defaults.py +145 -94
  185. meta_edc/settings/live.py +5 -10
  186. meta_edc/settings/logging.py +10 -3
  187. meta_edc/settings/minimal.py +5 -5
  188. meta_edc/settings/uat.py +4 -13
  189. meta_edc/templates/meta_edc/{bootstrap3/base.html → base.html} +1 -1
  190. meta_edc/templates/meta_edc/{bootstrap3/home.html → home.html} +14 -8
  191. meta_edc/urls.py +10 -4
  192. meta_edc/utils.py +3 -1
  193. meta_edc/views/__init__.py +2 -0
  194. meta_edc/views/home_view.py +6 -7
  195. meta_edc/wsgi.py +1 -1
  196. meta_edc/wsgi_live.py +1 -1
  197. meta_edc/wsgi_uat.py +1 -1
  198. meta_edc-1.4.0.dist-info/METADATA +174 -0
  199. meta_edc-1.4.0.dist-info/RECORD +1164 -0
  200. meta_edc-1.4.0.dist-info/WHEEL +4 -0
  201. meta_labs/list_data.py +2 -2
  202. meta_labs/reportables.py +80 -11
  203. meta_lists/admin.py +30 -0
  204. meta_lists/list_data.py +60 -5
  205. meta_lists/migrations/0001_initial.py +0 -1
  206. meta_lists/migrations/0002_auto_20191026_2231.py +0 -1
  207. meta_lists/migrations/0003_auto_20191102_0033.py +0 -1
  208. meta_lists/migrations/0004_auto_20191102_1859.py +0 -1
  209. meta_lists/migrations/0005_auto_20191104_0930.py +0 -1
  210. meta_lists/migrations/0006_auto_20200514_1959.py +0 -1
  211. meta_lists/migrations/0007_auto_20200516_2356.py +0 -1
  212. meta_lists/migrations/0008_auto_20200528_1517.py +3 -4
  213. meta_lists/migrations/0009_auto_20200613_2041.py +0 -1
  214. meta_lists/migrations/0010_auto_20200617_1738.py +0 -1
  215. meta_lists/migrations/0011_auto_20210624_0225.py +0 -1
  216. meta_lists/migrations/0012_auto_20210728_1809.py +0 -1
  217. meta_lists/migrations/0013_transferreasons_and_more.py +0 -1
  218. meta_lists/migrations/0014_auto_20220913_2139.py +0 -1
  219. meta_lists/migrations/0015_abnormalfootappearanceobservations_extra_value_and_more.py +67 -0
  220. meta_lists/migrations/0016_alter_abnormalfootappearanceobservations_options_and_more.py +617 -0
  221. meta_lists/migrations/0017_complications_dmmedications_dmtreatments_and_more.py +365 -0
  222. meta_lists/migrations/0018_missedreferralreasons.py +73 -0
  223. meta_lists/migrations/0019_auto_20250128_0143.py +48 -0
  224. meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py +404 -0
  225. meta_lists/models.py +36 -0
  226. meta_pharmacy/admin/__init__.py +7 -0
  227. meta_pharmacy/admin/rx_admin.py +76 -0
  228. meta_pharmacy/admin/substitutions_admin.py +67 -0
  229. meta_pharmacy/admin_site.py +9 -0
  230. meta_pharmacy/apps.py +5 -0
  231. meta_pharmacy/constants.py +10 -0
  232. meta_pharmacy/forms/__init__.py +4 -0
  233. meta_pharmacy/forms/rx_form.py +15 -0
  234. meta_pharmacy/forms/substitutions_form.py +56 -0
  235. meta_pharmacy/label_configs.py +30 -0
  236. meta_pharmacy/labels/__init__.py +7 -0
  237. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +61 -0
  238. meta_pharmacy/labels/draw_label_for_subject_with_code128.py +14 -0
  239. meta_pharmacy/labels/draw_label_with_test_data.py +26 -0
  240. meta_pharmacy/labels/label_data.py +13 -0
  241. meta_pharmacy/labels/print_sheets.py +95 -0
  242. meta_pharmacy/list_data.py +8 -0
  243. meta_pharmacy/management/commands/update_initial_pharmacy_data.py +11 -0
  244. meta_pharmacy/migrations/0001_initial.py +32 -0
  245. meta_pharmacy/migrations/0002_initial.py +682 -0
  246. meta_pharmacy/migrations/0003_auto_20240909_2335.py +65 -0
  247. meta_pharmacy/migrations/0004_alter_historicalsubstitutions_report_datetime_and_more.py +23 -0
  248. meta_pharmacy/migrations/0005_auto_20240911_0352.py +17 -0
  249. meta_pharmacy/migrations/0006_lotnumber_label.py +280 -0
  250. meta_pharmacy/migrations/0007_lotnumber_medication.py +24 -0
  251. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +389 -0
  252. meta_pharmacy/migrations/0009_remove_historicalrx_slug.py +17 -0
  253. meta_pharmacy/migrations/0010_alter_historicallabeldata_device_created_and_more.py +382 -0
  254. meta_pharmacy/models/__init__.py +10 -0
  255. meta_pharmacy/models/label_data.py +37 -0
  256. meta_pharmacy/models/rx.py +18 -0
  257. meta_pharmacy/models/rx_label.py +38 -0
  258. meta_pharmacy/models/substitutions.py +88 -0
  259. meta_pharmacy/prepare_meta_pharmacy.py +1 -1
  260. meta_pharmacy/urls.py +8 -0
  261. meta_pharmacy/utils/__init__.py +3 -0
  262. meta_pharmacy/utils/update_initial_pharmacy_data.py +146 -0
  263. meta_prn/action_items.py +76 -27
  264. meta_prn/admin/__init__.py +20 -1
  265. meta_prn/admin/dm_referral_admin.py +50 -0
  266. meta_prn/admin/end_of_study_admin.py +28 -18
  267. meta_prn/admin/loss_to_followup_admin.py +5 -5
  268. meta_prn/admin/off_study_medication_admin.py +7 -9
  269. meta_prn/admin/offschedule_admin.py +14 -14
  270. meta_prn/admin/offschedule_dm_referral_admin.py +48 -0
  271. meta_prn/admin/offschedule_postnatal_admin.py +17 -10
  272. meta_prn/admin/offschedule_pregnancy_admin.py +20 -12
  273. meta_prn/admin/onschedule_admin.py +9 -11
  274. meta_prn/admin/onschedule_dm_referral_admin.py +38 -0
  275. meta_prn/admin/pregnancy_notification_admin.py +13 -11
  276. meta_prn/admin/protocol_incident_admin.py +6 -104
  277. meta_prn/admin/subject_transfer_admin.py +3 -2
  278. meta_prn/baker_recipes.py +15 -8
  279. meta_prn/choices.py +15 -10
  280. meta_prn/constants.py +5 -2
  281. meta_prn/form_validators/__init__.py +5 -0
  282. meta_prn/form_validators/end_of_study.py +65 -21
  283. meta_prn/form_validators/protocol_incident.py +1 -2
  284. meta_prn/forms/__init__.py +15 -0
  285. meta_prn/forms/dm_referral_form.py +34 -0
  286. meta_prn/forms/end_of_study_form.py +1 -2
  287. meta_prn/forms/loss_to_followup_form.py +1 -2
  288. meta_prn/forms/off_study_medication_form.py +2 -3
  289. meta_prn/forms/offschedule_dm_referral_form.py +35 -0
  290. meta_prn/forms/offschedule_form.py +31 -1
  291. meta_prn/forms/offschedule_pregnancy_form.py +0 -1
  292. meta_prn/forms/pregnancy_notification_form.py +16 -19
  293. meta_prn/forms/subject_transfer_form.py +0 -1
  294. meta_prn/list_data.py +3 -3
  295. meta_prn/migrations/0001_initial.py +25 -26
  296. meta_prn/migrations/0002_auto_20191024_1000.py +0 -1
  297. meta_prn/migrations/0003_auto_20200120_2020.py +0 -1
  298. meta_prn/migrations/0004_auto_20200403_0332.py +0 -1
  299. meta_prn/migrations/0005_auto_20200524_1944.py +0 -1
  300. meta_prn/migrations/0006_auto_20210624_0225.py +0 -1
  301. meta_prn/migrations/0007_auto_20210721_0335.py +0 -1
  302. meta_prn/migrations/0008_auto_20210910_0238.py +0 -1
  303. meta_prn/migrations/0009_auto_20210910_0239.py +0 -1
  304. meta_prn/migrations/0010_auto_20210910_1906.py +0 -1
  305. meta_prn/migrations/0011_auto_20210910_1911.py +1 -2
  306. meta_prn/migrations/0012_auto_20210911_0004.py +1 -2
  307. meta_prn/migrations/0013_auto_20210911_2036.py +0 -1
  308. meta_prn/migrations/0014_auto_20211003_1709.py +0 -1
  309. meta_prn/migrations/0015_auto_20211104_1447.py +0 -1
  310. meta_prn/migrations/0016_auto_20220128_1719.py +0 -1
  311. meta_prn/migrations/0017_auto_20220307_1929.py +5 -6
  312. meta_prn/migrations/0018_auto_20220309_2106.py +9 -10
  313. meta_prn/migrations/0019_auto_20220309_2230.py +0 -1
  314. meta_prn/migrations/0020_auto_20220310_0439.py +0 -1
  315. meta_prn/migrations/0021_auto_20220316_2147.py +13 -14
  316. meta_prn/migrations/0022_auto_20220318_0133.py +9 -10
  317. meta_prn/migrations/0023_auto_20220415_1747.py +0 -1
  318. meta_prn/migrations/0024_alter_protocoldeviationviolation_violation.py +0 -1
  319. meta_prn/migrations/0025_alter_historicalprotocoldeviationviolation_options_and_more.py +0 -1
  320. meta_prn/migrations/0026_remove_historicalprotocoldeviationviolation_violation_type_and_more.py +0 -1
  321. meta_prn/migrations/0027_rename_historicalprotocoldeviationviolation_historicalprotocolincident_and_more.py +0 -1
  322. meta_prn/migrations/0028_historicalpregnancynotification_bhcg_date_and_more.py +0 -1
  323. meta_prn/migrations/0029_alter_historicalpregnancynotification_edd_and_more.py +0 -1
  324. meta_prn/migrations/0030_auto_20220627_1119.py +0 -1
  325. meta_prn/migrations/0031_alter_historicaloffschedule_options_and_more.py +0 -1
  326. meta_prn/migrations/0032_historicalegfrnotification_egfrnotification.py +5 -14
  327. meta_prn/migrations/0033_remove_historicalegfrnotification_action_item_and_more.py +0 -1
  328. meta_prn/migrations/0034_auto_20220630_1110.py +4 -5
  329. meta_prn/migrations/0035_auto_20220630_1140.py +61 -60
  330. meta_prn/migrations/0036_remove_endofstudy_meta_prn_en_id_a50384_idx_and_more.py +0 -1
  331. meta_prn/migrations/0037_endofstudy_delivery_date_endofstudy_pregnancy_date_and_more.py +0 -1
  332. meta_prn/migrations/0038_alter_endofstudy_delivery_date_and_more.py +5 -14
  333. meta_prn/migrations/0039_historicaloffstudymedication_reason_other_and_more.py +0 -1
  334. meta_prn/migrations/0040_remove_historicaloffstudymedication_expected_restart_date_and_more.py +0 -1
  335. meta_prn/migrations/0041_endofstudy_transfer_date_and_more.py +5 -14
  336. meta_prn/migrations/0042_remove_endofstudy_investigator_decision_and_more.py +0 -1
  337. meta_prn/migrations/0043_auto_20220704_1841.py +0 -1
  338. meta_prn/migrations/0044_alter_endofstudy_action_identifier_and_more.py +0 -1
  339. meta_prn/migrations/0045_auto_20220826_0258.py +0 -1
  340. meta_prn/migrations/0046_auto_20220826_0322.py +0 -1
  341. meta_prn/migrations/0047_auto_20220826_0406.py +0 -1
  342. meta_prn/migrations/0048_auto_20220922_2236.py +0 -1
  343. meta_prn/migrations/0049_auto_20220929_1742.py +0 -1
  344. meta_prn/migrations/0050_auto_20221004_0629.py +0 -1
  345. meta_prn/migrations/0051_historicalprotocolincident_reasons_withdrawn_and_more.py +54 -0
  346. meta_prn/migrations/0052_alter_historicalprotocolincident_reasons_withdrawn_and_more.py +22 -0
  347. meta_prn/migrations/0053_alter_losstofollowup_options_and_more.py +975 -0
  348. meta_prn/migrations/0054_alter_losstofollowup_options_and_more.py +834 -0
  349. meta_prn/migrations/0055_alter_endofstudy_site_and_more.py +278 -0
  350. meta_prn/migrations/0056_alter_endofstudy_clinical_withdrawal_reason_and_more.py +97 -0
  351. meta_prn/migrations/0057_historicalonscheduledmreferral_and_more.py +1131 -0
  352. meta_prn/migrations/0058_dmreferral_referral_note_and_more.py +29 -0
  353. meta_prn/migrations/0059_alter_historicaloffstudymedication_reason_and_more.py +53 -0
  354. meta_prn/migrations/0060_alter_onschedule_managers_and_more.py +55 -0
  355. meta_prn/migrations/0061_auto_20250115_2025.py +56 -0
  356. meta_prn/migrations/0062_alter_endofstudy_offstudy_reason_and_more.py +72 -0
  357. meta_prn/migrations/0063_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  358. meta_prn/migrations/0064_auto_20250602_2143.py +18 -0
  359. meta_prn/migrations/0065_alter_historicaloffstudymedication_subject_identifier_and_more.py +23 -0
  360. meta_prn/migrations/0066_alter_historicallosstofollowup_subject_identifier_and_more.py +23 -0
  361. meta_prn/migrations/0067_alter_offschedule_managers_and_more.py +2557 -0
  362. meta_prn/migrations/0068_alter_dmreferral_referral_note_and_more.py +235 -0
  363. meta_prn/migrations/0069_alter_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  364. meta_prn/models/__init__.py +33 -2
  365. meta_prn/models/dm_referral.py +39 -0
  366. meta_prn/models/end_of_study.py +29 -25
  367. meta_prn/models/loss_to_followup.py +10 -13
  368. meta_prn/models/off_study_medication.py +8 -6
  369. meta_prn/models/offschedule.py +16 -8
  370. meta_prn/models/onschedule.py +10 -5
  371. meta_prn/models/pregnancy_notification.py +4 -7
  372. meta_prn/models/protocol_incident.py +6 -4
  373. meta_prn/models/signals.py +56 -16
  374. meta_prn/models/subject_transfer.py +7 -0
  375. meta_prn/pregnancy_action_item_mixin.py +2 -1
  376. meta_prn/templates/meta_prn/eos/additional_instructions.html +3 -0
  377. meta_prn/templates/meta_prn/offschedule/additional_instructions.html +2 -0
  378. meta_rando/migrations/0001_initial.py +5 -6
  379. meta_rando/migrations/0002_auto_20220704_1841.py +0 -1
  380. meta_rando/migrations/0003_auto_20220826_1640.py +0 -1
  381. meta_rando/migrations/0004_alter_randomizationlist_options_and_more.py +95 -0
  382. meta_rando/migrations/0005_alter_randomizationlist_options_and_more.py +98 -0
  383. meta_rando/migrations/0006_alter_historicalrandomizationlist_allocated_user_and_more.py +130 -0
  384. meta_rando/migrations/0007_spfqlist.py +197 -0
  385. meta_rando/migrations/0008_delete_spfqlist.py +16 -0
  386. meta_rando/models/__init__.py +1 -0
  387. meta_rando/{models.py → models/randomization_list.py} +3 -4
  388. meta_rando/randomizers.py +2 -3
  389. meta_reports/__init__.py +3 -0
  390. meta_reports/admin/__init__.py +31 -0
  391. meta_reports/admin/dbviews/__init__.py +27 -0
  392. meta_reports/admin/dbviews/glucose_summary_admin.py +116 -0
  393. meta_reports/admin/dbviews/imp_substitutions_admin.py +102 -0
  394. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +7 -0
  395. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +77 -0
  396. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +84 -0
  397. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +3 -0
  398. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +10 -0
  399. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +3 -0
  400. meta_reports/admin/dbviews/on_study_missing_values_admin/unmanaged_model_admin.py +12 -0
  401. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +58 -0
  402. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +47 -0
  403. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +35 -0
  404. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +34 -0
  405. meta_reports/admin/endpoints_admin.py +14 -0
  406. meta_reports/admin/endpoints_all_admin.py +12 -0
  407. meta_reports/admin/last_imp_refill_admin.py +178 -0
  408. meta_reports/admin/list_filters.py +30 -0
  409. meta_reports/admin/modeladmin_mixins.py +105 -0
  410. meta_reports/admin_site.py +5 -0
  411. meta_reports/ae_report.py +2 -3
  412. meta_reports/apps.py +1 -17
  413. meta_reports/death_report.py +3 -5
  414. meta_reports/forms/__init__.py +3 -0
  415. meta_reports/forms/missing_ogtt_note_form.py +32 -0
  416. meta_reports/management/commands/generate_endpoints.py +14 -0
  417. meta_reports/migrations/0001_initial.py +87 -0
  418. meta_reports/migrations/0002_patienthistorymissingbaselinecd4_and_more.py +64 -0
  419. meta_reports/migrations/0003_auto_20240618_0505.py +12 -0
  420. meta_reports/migrations/0004_alter_patienthistorymissingbaselinecd4_table.py +17 -0
  421. meta_reports/migrations/0005_endpoints.py +47 -0
  422. meta_reports/migrations/0006_endpoints_baseline_datetime.py +18 -0
  423. meta_reports/migrations/0007_alter_endpoints_endpoint_label_and_more.py +43 -0
  424. meta_reports/migrations/0008_alter_endpoints_endpoint_label.py +18 -0
  425. meta_reports/migrations/0009_alter_endpoints_options.py +21 -0
  426. meta_reports/migrations/0010_alter_patienthistorymissingbaselinecd4_options_and_more.py +49 -0
  427. meta_reports/migrations/0011_auto_20240813_0156.py +54 -0
  428. meta_reports/migrations/0012_auto_20240813_1516.py +48 -0
  429. meta_reports/migrations/0013_auto_20240813_1516.py +48 -0
  430. meta_reports/migrations/0014_auto_20240813_1517.py +48 -0
  431. meta_reports/migrations/0015_alter_endpoints_site.py +22 -0
  432. meta_reports/migrations/0016_missingscreeningogtt.py +47 -0
  433. meta_reports/migrations/0017_auto_20240819_1711.py +166 -0
  434. meta_reports/migrations/0018_auto_20240819_1713.py +54 -0
  435. meta_reports/migrations/0019_auto_20240819_1721.py +54 -0
  436. meta_reports/migrations/0020_auto_20240819_1811.py +54 -0
  437. meta_reports/migrations/0021_auto_20240819_1817.py +54 -0
  438. meta_reports/migrations/0022_auto_20240819_1832.py +54 -0
  439. meta_reports/migrations/0023_endpoints_meta_report_subject_a56b22_idx.py +20 -0
  440. meta_reports/migrations/0024_glucosesummary.py +38 -0
  441. meta_reports/migrations/0025_auto_20240822_0115.py +87 -0
  442. meta_reports/migrations/0026_auto_20240822_0120.py +54 -0
  443. meta_reports/migrations/0027_auto_20240822_0140.py +54 -0
  444. meta_reports/migrations/0028_alter_glucosesummary_options.py +22 -0
  445. meta_reports/migrations/0029_auto_20240822_0149.py +54 -0
  446. meta_reports/migrations/0030_auto_20240822_1637.py +54 -0
  447. meta_reports/migrations/0031_endpointsproxy.py +25 -0
  448. meta_reports/migrations/0032_alter_endpointsproxy_options.py +21 -0
  449. meta_reports/migrations/0033_auto_20240823_0012.py +54 -0
  450. meta_reports/migrations/0034_auto_20240823_1642.py +54 -0
  451. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +448 -0
  452. meta_reports/migrations/0036_historicalmissingogttnote_fasting_and_more.py +86 -0
  453. meta_reports/migrations/0037_historicalmissingogttnote_result_status_and_more.py +51 -0
  454. meta_reports/migrations/0038_alter_historicalmissingogttnote_fasting_and_more.py +33 -0
  455. meta_reports/migrations/0039_onstudymissingvalues.py +44 -0
  456. meta_reports/migrations/0040_auto_20240824_0412.py +282 -0
  457. meta_reports/migrations/0041_auto_20240828_2229.py +14 -0
  458. meta_reports/migrations/0042_onstudymissinglabvalues.py +43 -0
  459. meta_reports/migrations/0043_auto_20240828_2309.py +88 -0
  460. meta_reports/migrations/0044_auto_20240828_2323.py +93 -0
  461. meta_reports/migrations/0045_auto_20240829_0248.py +54 -0
  462. meta_reports/migrations/0046_auto_20240829_0250.py +54 -0
  463. meta_reports/migrations/0047_impsubstitutions.py +56 -0
  464. meta_reports/migrations/0048_auto_20240909_2338.py +48 -0
  465. meta_reports/migrations/0049_auto_20240911_0327.py +54 -0
  466. meta_reports/migrations/0050_alter_endpoints_created.py +19 -0
  467. meta_reports/migrations/0051_remove_endpoints_baseline_datetime_and_more.py +40 -0
  468. meta_reports/migrations/0052_lastimpvisit.py +57 -0
  469. meta_reports/migrations/0053_rename_lastimpvisit_lastimprefill_and_more.py +31 -0
  470. meta_reports/migrations/0054_auto_20250422_2003.py +81 -0
  471. meta_reports/migrations/0055_alter_glucosesummary_table.py +17 -0
  472. meta_reports/migrations/0056_auto_20250422_2214.py +54 -0
  473. meta_reports/migrations/0057_auto_20250422_2224.py +54 -0
  474. meta_reports/migrations/0058_auto_20250422_2232.py +54 -0
  475. meta_reports/migrations/0059_alter_endpoints_created_and_more.py +161 -0
  476. meta_reports/migrations/0060_auto_20250926_0242.py +366 -0
  477. meta_reports/migrations/0061_auto_20251004_0043.py +21 -0
  478. meta_reports/migrations/0062_auto_20251004_0106.py +21 -0
  479. meta_reports/models/__init__.py +33 -0
  480. meta_reports/models/dbviews/README +14 -0
  481. meta_reports/models/dbviews/__init__.py +23 -0
  482. meta_reports/models/dbviews/glucose_summary/__init__.py +4 -0
  483. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +47 -0
  484. meta_reports/models/dbviews/glucose_summary/view_definition.py +31 -0
  485. meta_reports/models/dbviews/imp_substitutions/__init__.py +3 -0
  486. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +40 -0
  487. meta_reports/models/dbviews/imp_substitutions/view_definition.py +21 -0
  488. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +4 -0
  489. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +57 -0
  490. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +42 -0
  491. meta_reports/models/dbviews/missing_screening_ogtt/view_definition.py +20 -0
  492. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +3 -0
  493. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +55 -0
  494. meta_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py +19 -0
  495. meta_reports/models/dbviews/on_study_missing_lab_values/view_definition.py +17 -0
  496. meta_reports/models/dbviews/on_study_missing_values/__init__.py +3 -0
  497. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +72 -0
  498. meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py +19 -0
  499. meta_reports/models/dbviews/on_study_missing_values/view_definition.py +17 -0
  500. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +3 -0
  501. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/unmanaged_model.py +30 -0
  502. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/view_definition.py +21 -0
  503. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +3 -0
  504. meta_reports/models/dbviews/unattended_three_in_row/unmanaged_model.py +28 -0
  505. meta_reports/models/dbviews/unattended_three_in_row/view_definition.py +31 -0
  506. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +3 -0
  507. meta_reports/models/dbviews/unattended_three_in_row2/unmanaged_model.py +28 -0
  508. meta_reports/models/dbviews/unattended_three_in_row2/view_definition.py +50 -0
  509. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +3 -0
  510. meta_reports/models/dbviews/unattended_two_in_row/unmanaged_model.py +26 -0
  511. meta_reports/models/dbviews/unattended_two_in_row/view_definition.py +30 -0
  512. meta_reports/models/endpoints.py +35 -0
  513. meta_reports/models/endpoints_proxy.py +11 -0
  514. meta_reports/models/last_imp_refill.py +33 -0
  515. meta_reports/pdf_report.py +2 -4
  516. meta_reports/tasks.py +13 -0
  517. meta_reports/templates/meta_reports/columns/subject_identifier_column.html +1 -0
  518. meta_reports/templates/meta_reports/endpoints_all_change_list_note.html +12 -0
  519. meta_reports/templates/meta_reports/endpoints_change_list_note.html +12 -0
  520. meta_reports/templates/meta_reports/last_imp_refill/changelist_note.html +13 -0
  521. meta_reports/urls.py +8 -0
  522. meta_screening/admin/__init__.py +8 -0
  523. meta_screening/admin/fieldsets.py +13 -16
  524. meta_screening/admin/list_filters.py +7 -15
  525. meta_screening/admin/screening_part_one_admin.py +3 -5
  526. meta_screening/admin/screening_part_three_admin.py +4 -5
  527. meta_screening/admin/screening_part_two_admin.py +9 -10
  528. meta_screening/admin/subject_refusal_admin.py +9 -5
  529. meta_screening/admin/subject_screening_admin.py +28 -11
  530. meta_screening/baker_recipes.py +18 -10
  531. meta_screening/calculators.py +1 -1
  532. meta_screening/choices.py +1 -1
  533. meta_screening/constants.py +1 -1
  534. meta_screening/eligibility/__init__.py +9 -0
  535. meta_screening/eligibility/eligibility.py +21 -14
  536. meta_screening/eligibility/eligibility_part_one.py +3 -3
  537. meta_screening/eligibility/eligibility_part_three/__init__.py +2 -0
  538. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +72 -50
  539. meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py +15 -16
  540. meta_screening/eligibility/eligibility_part_two.py +3 -3
  541. meta_screening/form_validators/__init__.py +8 -0
  542. meta_screening/form_validators/screening_part_one.py +2 -8
  543. meta_screening/form_validators/screening_part_three.py +6 -7
  544. meta_screening/form_validators/screening_part_two.py +3 -5
  545. meta_screening/form_validators/subject_refusal.py +1 -1
  546. meta_screening/forms/__init__.py +20 -0
  547. meta_screening/forms/field_lists.py +17 -18
  548. meta_screening/forms/screening_part_one_form.py +11 -2
  549. meta_screening/forms/screening_part_three_form.py +5 -4
  550. meta_screening/forms/screening_part_two_form.py +1 -6
  551. meta_screening/forms/subject_refusal_form.py +0 -5
  552. meta_screening/forms/subject_screening_form.py +4 -6
  553. meta_screening/migrations/0001_initial.py +15 -16
  554. meta_screening/migrations/0002_auto_20191020_0612.py +0 -1
  555. meta_screening/migrations/0003_auto_20191020_0627.py +0 -1
  556. meta_screening/migrations/0004_auto_20191020_0738.py +0 -1
  557. meta_screening/migrations/0005_auto_20191021_0353.py +0 -1
  558. meta_screening/migrations/0006_auto_20191022_0134.py +0 -1
  559. meta_screening/migrations/0007_auto_20191024_1000.py +0 -1
  560. meta_screening/migrations/0008_auto_20191031_0745.py +0 -1
  561. meta_screening/migrations/0009_auto_20191105_0122.py +0 -1
  562. meta_screening/migrations/0010_auto_20191106_0828.py +5 -6
  563. meta_screening/migrations/0011_auto_20191107_0342.py +2 -3
  564. meta_screening/migrations/0012_auto_20191107_0427.py +3 -4
  565. meta_screening/migrations/0013_auto_20191107_0442.py +0 -1
  566. meta_screening/migrations/0014_auto_20191107_0528.py +0 -1
  567. meta_screening/migrations/0015_auto_20191107_2249.py +0 -1
  568. meta_screening/migrations/0016_auto_20191119_2331.py +0 -1
  569. meta_screening/migrations/0017_auto_20191213_0314.py +0 -1
  570. meta_screening/migrations/0018_auto_20200118_1854.py +0 -1
  571. meta_screening/migrations/0019_auto_20200120_2256.py +0 -1
  572. meta_screening/migrations/0020_auto_20200524_1944.py +0 -1
  573. meta_screening/migrations/0021_auto_20210628_2105.py +0 -1
  574. meta_screening/migrations/0022_auto_20210702_0426.py +0 -1
  575. meta_screening/migrations/0023_auto_20210702_0533.py +0 -1
  576. meta_screening/migrations/0024_auto_20210710_1929.py +0 -1
  577. meta_screening/migrations/0025_auto_20210710_2247.py +0 -1
  578. meta_screening/migrations/0026_auto_20210712_0433.py +0 -1
  579. meta_screening/migrations/0027_auto_20210804_0438.py +0 -1
  580. meta_screening/migrations/0028_auto_20210823_2353.py +0 -1
  581. meta_screening/migrations/0029_auto_20211123_1645.py +0 -1
  582. meta_screening/migrations/0030_auto_20220128_1719.py +0 -1
  583. meta_screening/migrations/0031_auto_20220304_0448.py +0 -1
  584. meta_screening/migrations/0032_auto_20220304_0501.py +0 -1
  585. meta_screening/migrations/0033_auto_20220304_0504.py +0 -1
  586. meta_screening/migrations/0034_auto_20220304_0508.py +0 -1
  587. meta_screening/migrations/0035_auto_20220304_2233.py +0 -1
  588. meta_screening/migrations/0036_auto_20220304_2307.py +0 -1
  589. meta_screening/migrations/0037_auto_20220312_0339.py +0 -1
  590. meta_screening/migrations/0038_auto_20220312_1929.py +0 -1
  591. meta_screening/migrations/0039_auto_20220312_1938.py +0 -1
  592. meta_screening/migrations/0040_auto_20220316_2147.py +0 -1
  593. meta_screening/migrations/0041_auto_20220403_1227.py +0 -1
  594. meta_screening/migrations/0042_auto_20220403_1402.py +0 -1
  595. meta_screening/migrations/0043_auto_20220407_1713.py +0 -1
  596. meta_screening/migrations/0044_alter_historicalscreeningpartone_severe_htn_and_more.py +0 -1
  597. meta_screening/migrations/0045_historicalscreeningpartone_contact_number_and_more.py +0 -1
  598. meta_screening/migrations/0046_historicalscreeningpartone_hba1c_datetime_and_more.py +0 -1
  599. meta_screening/migrations/0047_historicalscreeningpartone_appt_datetime_repeat_and_more.py +0 -1
  600. meta_screening/migrations/0048_rename_appt_datetime_repeat_historicalscreeningpartone_repeat_appt_datetime_and_more.py +0 -1
  601. meta_screening/migrations/0049_historicalscreeningpartone_p3_ltfu_and_more.py +0 -1
  602. meta_screening/migrations/0050_historicalscreeningpartone_agree_to_p3_and_more.py +0 -1
  603. meta_screening/migrations/0051_alter_historicalscreeningpartone_advised_to_fast_and_more.py +0 -1
  604. meta_screening/migrations/0052_alter_historicalscreeningpartone_p3_ltfu_and_more.py +0 -1
  605. meta_screening/migrations/0053_auto_20220704_1841.py +0 -1
  606. meta_screening/migrations/0054_auto_20220722_2130.py +0 -1
  607. meta_screening/migrations/0055_alter_historicalscreeningpartone_creatinine_value_and_more.py +0 -1
  608. meta_screening/migrations/0056_alter_historicalscreeningpartone_agree_to_p3_and_more.py +0 -1
  609. meta_screening/migrations/0057_alter_historicalscreeningpartone_calculated_egfr_value_and_more.py +397 -0
  610. meta_screening/migrations/0058_alter_historicalscreeningpartone_eligibility_datetime_and_more.py +210 -0
  611. meta_screening/migrations/0059_alter_icpreferral_managers_and_more.py +323 -0
  612. meta_screening/migrations/0060_historicalicpreferral_locale_created_and_more.py +210 -0
  613. meta_screening/migrations/0061_alter_historicalicpreferral_site_and_more.py +128 -0
  614. meta_screening/migrations/0062_remove_icpreferral_site_and_more.py +27 -0
  615. meta_screening/migrations/0063_alter_historicalscreeningpartone_fasting_duration_str_and_more.py +184 -0
  616. meta_screening/migrations/0064_remove_historicalscreeningpartone_fasting_duration_minutes_and_more.py +126 -0
  617. meta_screening/migrations/0065_auto_20240516_0352.py +31 -0
  618. meta_screening/migrations/0066_alter_historicalscreeningpartone_fasting_duration_delta_and_more.py +103 -0
  619. meta_screening/migrations/0067_alter_historicalscreeningpartone_report_datetime_and_more.py +84 -0
  620. meta_screening/migrations/0068_alter_historicalscreeningpartone_acute_condition_and_more.py +1579 -0
  621. meta_screening/model_mixins/__init__.py +8 -0
  622. meta_screening/model_mixins/calculated_model_mixin.py +8 -9
  623. meta_screening/model_mixins/creatinine_fields_model_mixin.py +2 -4
  624. meta_screening/model_mixins/eligibility_model_mixin.py +6 -5
  625. meta_screening/model_mixins/part_one_fields_model_mixin.py +17 -21
  626. meta_screening/model_mixins/part_three_fields_model_mixin.py +19 -33
  627. meta_screening/model_mixins/part_two_fields_model_mixin.py +19 -18
  628. meta_screening/models/__init__.py +10 -1
  629. meta_screening/models/icp_referral.py +9 -8
  630. meta_screening/models/proxy_models.py +9 -1
  631. meta_screening/models/signals.py +10 -11
  632. meta_screening/models/subject_refusal.py +5 -5
  633. meta_screening/models/subject_screening.py +19 -3
  634. meta_sites/__init__.py +0 -1
  635. meta_sites/apps.py +0 -23
  636. meta_sites/sites.py +61 -53
  637. meta_subject/action_items.py +58 -27
  638. meta_subject/admin/__init__.py +46 -2
  639. meta_subject/admin/birth_outcome_admin.py +13 -15
  640. meta_subject/admin/blood_results/__init__.py +10 -2
  641. meta_subject/admin/blood_results/blood_results_fbc_admin.py +6 -3
  642. meta_subject/admin/blood_results/blood_results_hba1c_admin.py +6 -3
  643. meta_subject/admin/blood_results/blood_results_ins_admin.py +6 -3
  644. meta_subject/admin/blood_results/blood_results_lft_admin.py +6 -3
  645. meta_subject/admin/blood_results/blood_results_lipids_admin.py +24 -0
  646. meta_subject/admin/blood_results/blood_results_rft_admin.py +8 -8
  647. meta_subject/admin/complications_admin.py +3 -4
  648. meta_subject/admin/complications_glycemia_admin.py +4 -4
  649. meta_subject/admin/concomitant_medication_admin.py +3 -3
  650. meta_subject/admin/delivery_admin.py +8 -13
  651. meta_subject/admin/diabetes/__init__.py +4 -0
  652. meta_subject/admin/diabetes/dm_endpoint_admin.py +35 -0
  653. meta_subject/admin/diabetes/dm_followup_admin.py +97 -0
  654. meta_subject/admin/egfr_drop_notification_admin.py +1 -4
  655. meta_subject/admin/eq5d3l_admin.py +4 -4
  656. meta_subject/admin/fields.py +5 -5
  657. meta_subject/admin/fieldsets.py +5 -5
  658. meta_subject/admin/followup_examination_admin.py +12 -11
  659. meta_subject/admin/followup_vitals_admin.py +31 -7
  660. meta_subject/admin/glucose_admin.py +37 -5
  661. meta_subject/admin/glucose_fbg_admin.py +89 -0
  662. meta_subject/admin/health_economics/__init__.py +4 -0
  663. meta_subject/admin/{health_economics_simple_admin.py → health_economics/health_economics_simple_admin.py} +7 -7
  664. meta_subject/admin/health_economics/health_economics_update_admin.py +101 -0
  665. meta_subject/admin/hepatitis_test_admin.py +4 -4
  666. meta_subject/admin/hiv_exit_review_admin.py +55 -0
  667. meta_subject/admin/list_filters.py +76 -0
  668. meta_subject/admin/malaria_test_admin.py +4 -29
  669. meta_subject/admin/medication_adherence_admin.py +5 -10
  670. meta_subject/admin/mnsi_admin.py +9 -8
  671. meta_subject/admin/modeladmin.py +9 -8
  672. meta_subject/admin/next_appointment_admin.py +19 -0
  673. meta_subject/admin/other_arv_regimens_admin.py +10 -14
  674. meta_subject/admin/patient_history_admin.py +7 -7
  675. meta_subject/admin/physical_exam_admin.py +4 -4
  676. meta_subject/admin/pregnancy_update_admin.py +4 -4
  677. meta_subject/admin/sf12_admin.py +3 -3
  678. meta_subject/admin/study_medication_admin.py +56 -11
  679. meta_subject/admin/subject_requisition_admin.py +5 -5
  680. meta_subject/admin/subject_visit_admin.py +5 -3
  681. meta_subject/admin/subject_visit_missed_admin.py +5 -4
  682. meta_subject/admin/urine_dipstick_test_admin.py +4 -4
  683. meta_subject/admin/urine_pregnancy_admin.py +4 -4
  684. meta_subject/apps.py +1 -1
  685. meta_subject/baker_recipes.py +20 -14
  686. meta_subject/choices.py +125 -123
  687. meta_subject/constants.py +4 -0
  688. meta_subject/form_validators/__init__.py +23 -0
  689. meta_subject/form_validators/birth_outcomes_form_validator.py +13 -0
  690. meta_subject/form_validators/delivery_form_validator.py +83 -0
  691. meta_subject/form_validators/dm_endpoint_form_validator.py +37 -0
  692. meta_subject/form_validators/dm_followup_form_validator.py +236 -0
  693. meta_subject/form_validators/egfr_drop_notification_form_validator.py +12 -0
  694. meta_subject/form_validators/followup_examination_form_validator.py +105 -0
  695. meta_subject/form_validators/glucose_fbg_form_validator.py +76 -0
  696. meta_subject/form_validators/glucose_form_validator.py +26 -0
  697. meta_subject/form_validators/health_economics_form_validator.py +7 -0
  698. meta_subject/form_validators/hiv_exit_review_form_validator.py +18 -0
  699. meta_subject/form_validators/mixins.py +95 -0
  700. meta_subject/forms/__init__.py +48 -3
  701. meta_subject/forms/birth_outcomes_form.py +1 -13
  702. meta_subject/forms/blood_results/__init__.py +10 -2
  703. meta_subject/forms/blood_results/blood_results_fbc_form.py +0 -1
  704. meta_subject/forms/blood_results/blood_results_hba1c_form.py +1 -2
  705. meta_subject/forms/blood_results/blood_results_ins_form.py +0 -1
  706. meta_subject/forms/blood_results/blood_results_lft_form.py +0 -1
  707. meta_subject/forms/blood_results/{blood_results_lipid_form.py → blood_results_lipids_form.py} +5 -6
  708. meta_subject/forms/blood_results/blood_results_rft_form.py +60 -5
  709. meta_subject/forms/complications_glycemia_form.py +1 -7
  710. meta_subject/forms/concomitant_medication_form.py +1 -7
  711. meta_subject/forms/delivery_form.py +2 -82
  712. meta_subject/forms/diabetes/__init__.py +4 -0
  713. meta_subject/forms/diabetes/dm_endpoint_form.py +13 -0
  714. meta_subject/forms/diabetes/dm_followup_form.py +25 -0
  715. meta_subject/forms/egfr_drop_notification_form.py +1 -13
  716. meta_subject/forms/eq53d3l_form.py +1 -5
  717. meta_subject/forms/followup_examination_form.py +1 -103
  718. meta_subject/forms/followup_vitals_form.py +23 -2
  719. meta_subject/forms/glucose_fbg_form.py +13 -0
  720. meta_subject/forms/glucose_form.py +1 -7
  721. meta_subject/forms/health_economics/__init__.py +4 -0
  722. meta_subject/forms/health_economics/health_economics_simple_form.py +13 -0
  723. meta_subject/forms/health_economics/health_economics_update_form.py +12 -0
  724. meta_subject/forms/hepatitis_test_form.py +1 -3
  725. meta_subject/forms/hiv_exit_review_form.py +13 -0
  726. meta_subject/forms/malaria_test_form.py +1 -13
  727. meta_subject/forms/medication_adherence_form.py +0 -1
  728. meta_subject/forms/mixins.py +1 -1
  729. meta_subject/forms/mnsi_form.py +0 -1
  730. meta_subject/forms/next_appointment_form.py +36 -0
  731. meta_subject/forms/other_arv_regimens_detail_form.py +3 -1
  732. meta_subject/forms/other_arv_regimens_form.py +1 -2
  733. meta_subject/forms/patient_history_form.py +1 -3
  734. meta_subject/forms/physical_exam_form.py +1 -3
  735. meta_subject/forms/pregnancy_update_form.py +1 -2
  736. meta_subject/forms/slider_widget.py +1 -2
  737. meta_subject/forms/study_medication_form.py +47 -8
  738. meta_subject/forms/subject_requisition_form.py +1 -2
  739. meta_subject/forms/subject_visit_form.py +18 -3
  740. meta_subject/forms/subject_visit_missed_form.py +1 -3
  741. meta_subject/forms/urine_dipstick_test_form.py +1 -3
  742. meta_subject/forms/urine_pregnancy_form.py +1 -3
  743. meta_subject/locale/lg/LC_MESSAGES/django.po +470 -0
  744. meta_subject/locale/sw/LC_MESSAGES/django.po +471 -0
  745. meta_subject/management/commands/create_missing_refills.py +3 -3
  746. meta_subject/management/commands/create_missing_rx.py +2 -2
  747. meta_subject/management/commands/missed.py +251 -0
  748. meta_subject/metadata_rules/__init__.py +2 -0
  749. meta_subject/metadata_rules/metadata_rules.py +49 -8
  750. meta_subject/metadata_rules/predicates.py +122 -27
  751. meta_subject/migrations/0001_initial.py +61 -62
  752. meta_subject/migrations/0002_auto_20191021_0353.py +5 -6
  753. meta_subject/migrations/0003_auto_20191021_0534.py +0 -1
  754. meta_subject/migrations/0004_auto_20191022_0134.py +0 -1
  755. meta_subject/migrations/0005_auto_20191024_1000.py +0 -1
  756. meta_subject/migrations/0006_auto_20191104_0756.py +0 -1
  757. meta_subject/migrations/0007_auto_20191107_2249.py +0 -1
  758. meta_subject/migrations/0008_auto_20191115_0132.py +0 -1
  759. meta_subject/migrations/0009_auto_20191119_2331.py +0 -1
  760. meta_subject/migrations/0010_auto_20191213_0314.py +0 -1
  761. meta_subject/migrations/0011_auto_20200118_1854.py +0 -1
  762. meta_subject/migrations/0012_auto_20200118_2334.py +5 -6
  763. meta_subject/migrations/0013_auto_20200119_0013.py +0 -1
  764. meta_subject/migrations/0014_auto_20200120_1622.py +5 -6
  765. meta_subject/migrations/0015_auto_20200120_1943.py +0 -1
  766. meta_subject/migrations/0016_auto_20200123_1508.py +0 -1
  767. meta_subject/migrations/0017_auto_20200325_0901.py +0 -1
  768. meta_subject/migrations/0018_coronakap_historicalcoronakap.py +5 -6
  769. meta_subject/migrations/0019_auto_20200417_0315.py +0 -1
  770. meta_subject/migrations/0020_auto_20200417_0329.py +0 -1
  771. meta_subject/migrations/0021_auto_20200417_0332.py +0 -1
  772. meta_subject/migrations/0022_auto_20200419_2223.py +0 -1
  773. meta_subject/migrations/0023_auto_20200419_2305.py +0 -1
  774. meta_subject/migrations/0024_auto_20200419_2331.py +0 -1
  775. meta_subject/migrations/0025_auto_20200420_1455.py +0 -1
  776. meta_subject/migrations/0026_auto_20200420_1524.py +0 -1
  777. meta_subject/migrations/0027_auto_20200420_1645.py +0 -1
  778. meta_subject/migrations/0028_auto_20200420_1732.py +0 -1
  779. meta_subject/migrations/0029_auto_20200420_1751.py +0 -1
  780. meta_subject/migrations/0030_auto_20200420_1816.py +0 -1
  781. meta_subject/migrations/0031_auto_20200422_2039.py +0 -1
  782. meta_subject/migrations/0032_auto_20200515_0307.py +0 -1
  783. meta_subject/migrations/0033_auto_20200516_2356.py +5 -6
  784. meta_subject/migrations/0034_auto_20200517_0125.py +0 -1
  785. meta_subject/migrations/0035_auto_20200517_0128.py +0 -1
  786. meta_subject/migrations/0036_auto_20200517_0150.py +0 -1
  787. meta_subject/migrations/0037_auto_20200517_0207.py +0 -1
  788. meta_subject/migrations/0038_auto_20200520_0020.py +5 -6
  789. meta_subject/migrations/0039_auto_20200524_1944.py +0 -1
  790. meta_subject/migrations/0040_auto_20200527_2155.py +1 -2
  791. meta_subject/migrations/0041_auto_20200528_0242.py +0 -1
  792. meta_subject/migrations/0042_auto_20200528_0252.py +0 -1
  793. meta_subject/migrations/0043_auto_20200528_1555.py +0 -1
  794. meta_subject/migrations/0044_auto_20200528_1853.py +0 -1
  795. meta_subject/migrations/0045_auto_20200530_1801.py +1 -2
  796. meta_subject/migrations/0046_auto_20200530_1804.py +0 -1
  797. meta_subject/migrations/0047_auto_20200530_1819.py +0 -1
  798. meta_subject/migrations/0048_auto_20200530_1819.py +0 -1
  799. meta_subject/migrations/0049_auto_20200613_2041.py +0 -1
  800. meta_subject/migrations/0050_auto_20200614_1934.py +0 -1
  801. meta_subject/migrations/0051_auto_20200617_2117.py +5 -6
  802. meta_subject/migrations/0052_auto_20210624_0225.py +0 -1
  803. meta_subject/migrations/0053_auto_20210628_2105.py +0 -1
  804. meta_subject/migrations/0054_auto_20210628_2314.py +0 -1
  805. meta_subject/migrations/0055_auto_20210628_2331.py +0 -1
  806. meta_subject/migrations/0056_auto_20210702_0426.py +0 -1
  807. meta_subject/migrations/0057_auto_20210702_0458.py +0 -1
  808. meta_subject/migrations/0058_auto_20210702_0533.py +0 -1
  809. meta_subject/migrations/0059_auto_20210709_2056.py +0 -1
  810. meta_subject/migrations/0060_auto_20210709_2241.py +0 -1
  811. meta_subject/migrations/0061_auto_20210710_1929.py +0 -1
  812. meta_subject/migrations/0062_auto_20210713_0616.py +0 -1
  813. meta_subject/migrations/0063_auto_20210715_0337.py +5 -6
  814. meta_subject/migrations/0064_auto_20210715_2336.py +0 -1
  815. meta_subject/migrations/0065_auto_20210716_0813.py +0 -1
  816. meta_subject/migrations/0066_auto_20210721_0335.py +9 -10
  817. meta_subject/migrations/0067_auto_20210726_0340.py +5 -6
  818. meta_subject/migrations/0068_auto_20210728_1809.py +5 -6
  819. meta_subject/migrations/0069_auto_20210801_2021.py +0 -1
  820. meta_subject/migrations/0070_auto_20210804_0438.py +0 -1
  821. meta_subject/migrations/0071_auto_20210804_0715.py +0 -1
  822. meta_subject/migrations/0072_auto_20210805_1545.py +7 -8
  823. meta_subject/migrations/0073_auto_20210809_0055.py +5 -6
  824. meta_subject/migrations/0075_auto_20210809_1744.py +0 -1
  825. meta_subject/migrations/0076_auto_20210809_1854.py +0 -1
  826. meta_subject/migrations/0077_auto_20210809_2323.py +3 -4
  827. meta_subject/migrations/0078_auto_20210810_0857.py +0 -1
  828. meta_subject/migrations/0079_auto_20210812_0335.py +0 -1
  829. meta_subject/migrations/0080_auto_20210812_0400.py +0 -1
  830. meta_subject/migrations/0081_auto_20210817_2306.py +0 -1
  831. meta_subject/migrations/0082_auto_20210823_1612.py +3 -4
  832. meta_subject/migrations/0083_auto_20210823_1620.py +3 -4
  833. meta_subject/migrations/0084_auto_20210910_0234.py +0 -1
  834. meta_subject/migrations/0085_auto_20210911_2036.py +0 -1
  835. meta_subject/migrations/0086_auto_20210920_0229.py +0 -1
  836. meta_subject/migrations/0087_auto_20210922_2058.py +0 -1
  837. meta_subject/migrations/0088_auto_20210924_0027.py +5 -6
  838. meta_subject/migrations/0089_auto_20210924_0121.py +0 -1
  839. meta_subject/migrations/0090_auto_20210924_0424.py +5 -6
  840. meta_subject/migrations/0091_auto_20210929_2324.py +0 -1
  841. meta_subject/migrations/0092_auto_20211013_0447.py +0 -1
  842. meta_subject/migrations/0093_auto_20211117_0352.py +5 -6
  843. meta_subject/migrations/0094_auto_20211123_1645.py +0 -1
  844. meta_subject/migrations/0095_auto_20220128_1719.py +5 -6
  845. meta_subject/migrations/0096_auto_20220304_0501.py +0 -1
  846. meta_subject/migrations/0097_auto_20220304_2233.py +0 -1
  847. meta_subject/migrations/0098_auto_20220309_2106.py +5 -6
  848. meta_subject/migrations/0099_auto_20220309_2218.py +0 -1
  849. meta_subject/migrations/0100_auto_20220309_2238.py +0 -1
  850. meta_subject/migrations/0101_auto_20220316_2147.py +13 -14
  851. meta_subject/migrations/0102_auto_20220324_0304.py +0 -1
  852. meta_subject/migrations/0103_auto_20220324_0326.py +0 -1
  853. meta_subject/migrations/0104_auto_20220412_2151.py +0 -1
  854. meta_subject/migrations/0105_auto_20220412_2310.py +0 -1
  855. meta_subject/migrations/0106_auto_20220414_1741.py +0 -1
  856. meta_subject/migrations/0107_auto_20220415_0043.py +28 -23
  857. meta_subject/migrations/0108_auto_20220415_1747.py +0 -1
  858. meta_subject/migrations/0109_auto_20220415_1758.py +0 -1
  859. meta_subject/migrations/0110_auto_20220512_1811.py +0 -1
  860. meta_subject/migrations/0111_alter_followupvitals_severe_htn_and_more.py +0 -1
  861. meta_subject/migrations/0112_historicalsubjectvisit_document_status_comments_and_more.py +0 -1
  862. meta_subject/migrations/0113_bloodresultsrft_egfr_percent_change_and_more.py +0 -1
  863. meta_subject/migrations/0114_alter_bloodresultsrft_egfr_percent_change_and_more.py +0 -1
  864. meta_subject/migrations/0115_historicalegfrnotification_egfrnotification.py +5 -14
  865. meta_subject/migrations/0116_egfrnotification_report_status_and_more.py +0 -1
  866. meta_subject/migrations/0117_alter_egfrnotification_managers_and_more.py +0 -1
  867. meta_subject/migrations/0118_delivery_crf_status_delivery_crf_status_comments_and_more.py +0 -1
  868. meta_subject/migrations/0119_historicalstudymedication_roundup_divisible_by_and_more.py +0 -1
  869. meta_subject/migrations/0120_alter_birthoutcomes_managers_and_more.py +0 -1
  870. meta_subject/migrations/0121_auto_20220704_1841.py +0 -1
  871. meta_subject/migrations/0122_auto_20220708_2144.py +0 -1
  872. meta_subject/migrations/0123_auto_20220714_2136.py +0 -1
  873. meta_subject/migrations/0124_auto_20220714_2303.py +0 -1
  874. meta_subject/migrations/0125_auto_20220719_2134.py +0 -1
  875. meta_subject/migrations/0126_auto_20220719_2142.py +4 -5
  876. meta_subject/migrations/0127_auto_20220720_0053.py +0 -1
  877. meta_subject/migrations/0128_auto_20220720_0055.py +1 -2
  878. meta_subject/migrations/0129_auto_20220720_0108.py +0 -1
  879. meta_subject/migrations/0130_auto_20220720_0216.py +0 -1
  880. meta_subject/migrations/0131_auto_20220722_0411.py +29 -25
  881. meta_subject/migrations/0132_auto_20220722_1825.py +10 -7
  882. meta_subject/migrations/0133_auto_20220722_2140.py +0 -1
  883. meta_subject/migrations/0134_auto_20220722_2211.py +0 -1
  884. meta_subject/migrations/0135_auto_20220722_2212.py +41 -37
  885. meta_subject/migrations/0136_egfrdropnotification_creatinine_quantifier_and_more.py +0 -1
  886. meta_subject/migrations/0137_alter_egfrdropnotification_egfr_percent_change_and_more.py +0 -1
  887. meta_subject/migrations/0138_alter_glucose_fbg_datetime_and_more.py +0 -1
  888. meta_subject/migrations/0139_alter_bloodresultsins_ins_units_and_more.py +0 -1
  889. meta_subject/migrations/0140_alter_bloodresultsfbc_action_identifier_and_more.py +0 -1
  890. meta_subject/migrations/0141_auto_20220826_0258.py +0 -1
  891. meta_subject/migrations/0142_auto_20220826_0322.py +0 -1
  892. meta_subject/migrations/0143_auto_20220826_0406.py +0 -1
  893. meta_subject/migrations/0144_auto_20220907_0157.py +0 -1
  894. meta_subject/migrations/0145_auto_20220907_0202.py +0 -1
  895. meta_subject/migrations/0146_auto_20220907_0207.py +0 -1
  896. meta_subject/migrations/0147_auto_20220907_1505.py +0 -1
  897. meta_subject/migrations/0148_auto_20220908_1826.py +0 -1
  898. meta_subject/migrations/0149_auto_20220913_2139.py +0 -1
  899. meta_subject/migrations/0150_auto_20220914_0039.py +15 -13
  900. meta_subject/migrations/0151_auto_20220918_0508.py +0 -1
  901. meta_subject/migrations/0152_auto_20220925_0509.py +0 -1
  902. meta_subject/migrations/0153_auto_20220928_0250.py +0 -1
  903. meta_subject/migrations/0154_auto_20220928_0419.py +0 -1
  904. meta_subject/migrations/0155_auto_20220929_1742.py +0 -1
  905. meta_subject/migrations/0156_alter_bloodresultsfbc_assay_datetime_and_more.py +153 -0
  906. meta_subject/migrations/0157_remove_bloodresultsfbc_crf_status_and_more.py +512 -0
  907. meta_subject/migrations/0158_alter_followupexamination_attended_clinic_and_more.py +52 -0
  908. meta_subject/migrations/0159_alter_bloodresultsfbc_results_abnormal_and_more.py +152 -0
  909. meta_subject/migrations/0160_alter_healtheconomicssimple_education_certificate_and_more.py +44 -0
  910. meta_subject/migrations/0161_alter_birthoutcomes_options_and_more.py +3307 -0
  911. meta_subject/migrations/0162_alter_followupexamination_abdominal_tenderness_and_more.py +66 -0
  912. meta_subject/migrations/0163_alter_birthoutcomes_options_and_more.py +3470 -0
  913. meta_subject/migrations/0164_dmreferralfollowup_historicaldmreferralfollowup.py +709 -0
  914. meta_subject/migrations/0165_alter_dmreferralfollowup_healthcare_workers.py +22 -0
  915. meta_subject/migrations/0166_rename_dm_medications_other_dmreferralfollowup_other_dm_medications_and_more.py +184 -0
  916. meta_subject/migrations/0167_rename_healthcare_workers_other_dmreferralfollowup_other_healthcare_workers_and_more.py +25 -0
  917. meta_subject/migrations/0168_alter_dmreferralfollowup_last_missed_pill_and_more.py +53 -0
  918. meta_subject/migrations/0169_alter_dmreferralfollowup_options_and_more.py +94 -0
  919. meta_subject/migrations/0170_remove_glucose_repeat_fbg_and_more.py +52 -0
  920. meta_subject/migrations/0171_alter_glucose_endpoint_today_and_more.py +80 -0
  921. meta_subject/migrations/0172_remove_historicalbloodresultsglu_action_item_and_more.py +67 -0
  922. meta_subject/migrations/0173_alter_glucosefbg_options_and_more.py +117 -0
  923. meta_subject/migrations/0174_remove_glucosefbg_glucose_abnormal_and_more.py +105 -0
  924. meta_subject/migrations/0175_auto_20240214_2239.py +23 -0
  925. meta_subject/migrations/0176_alter_glucosefbg_glucose_value_and_more.py +44 -0
  926. meta_subject/migrations/0177_alter_bloodresultslft_alp_value_and_more.py +91 -0
  927. meta_subject/migrations/0178_historicalhealtheconomicsupdate_and_more.py +719 -0
  928. meta_subject/migrations/0179_alter_birthoutcomes_consent_model_and_more.py +835 -0
  929. meta_subject/migrations/0180_dmreferralfollowup_missed_referral_reasons_and_more.py +62 -0
  930. meta_subject/migrations/0181_dmreferralfollowup_action_identifier_and_more.py +143 -0
  931. meta_subject/migrations/0182_rename_dmreferralfollowup_dmfollowup_and_more.py +54 -0
  932. meta_subject/migrations/0183_alter_dmfollowup_on_dm_medications_and_more.py +31 -0
  933. meta_subject/migrations/0184_alter_glucose_options_and_more.py +31 -0
  934. meta_subject/migrations/0185_alter_bloodresultsins_fasting_duration_str_and_more.py +82 -0
  935. meta_subject/migrations/0186_healtheconomicsupdate_singleton_field_and_more.py +54 -0
  936. meta_subject/migrations/0187_dmdiagnosis_historicaldmdiagnosis_dmdxresult_and_more.py +442 -0
  937. meta_subject/migrations/0188_historicaldmdxresult_dmdxresult.py +394 -0
  938. meta_subject/migrations/0189_alter_dmdxresult_options_and_more.py +116 -0
  939. meta_subject/migrations/0190_dmdiagnosis_dx_no_tmg_reason_and_more.py +65 -0
  940. meta_subject/migrations/0191_alter_dmdiagnosis_dx_no_tmg_reason_and_more.py +70 -0
  941. meta_subject/migrations/0192_rename_glucose_quantifier_glucosefbg_fbg_quantifier_and_more.py +44 -0
  942. meta_subject/migrations/0193_alter_glucosefbg_fbg_value_and_more.py +44 -0
  943. meta_subject/migrations/0194_remove_glucosefbg_assay_datetime_and_more.py +166 -0
  944. meta_subject/migrations/0195_alter_glucosefbg_fbg_datetime_and_more.py +27 -0
  945. meta_subject/migrations/0196_glucosefbg_fbg_not_performed_reason_and_more.py +49 -0
  946. meta_subject/migrations/0197_glucosefbg_fasting_duration_estimated_and_more.py +33 -0
  947. meta_subject/migrations/0198_alter_glucosefbg_fasting_duration_estimated_and_more.py +33 -0
  948. meta_subject/migrations/0199_auto_20240516_0247.py +18 -0
  949. meta_subject/migrations/0200_rename_fasting_duration_minutes_bloodresultsins_fasting_duration_delta_and_more.py +43 -0
  950. meta_subject/migrations/0201_alter_bloodresultsins_fasting_duration_delta_and_more.py +58 -0
  951. meta_subject/migrations/0202_auto_20240516_0315.py +32 -0
  952. meta_subject/migrations/0203_alter_bloodresultsins_fasting_duration_delta_and_more.py +67 -0
  953. meta_subject/migrations/0204_glucosefbg_repeat_fbg_date_and_more.py +27 -0
  954. meta_subject/migrations/0205_historicalsubjectrequisition_crf_status_and_more.py +80 -0
  955. meta_subject/migrations/0206_bloodresultsfbc_crf_status_and_more.py +62 -0
  956. meta_subject/migrations/0207_alter_historicalphysicalexam_waist_circumference_and_more.py +46 -0
  957. meta_subject/migrations/0208_birthoutcomes_crf_status_and_more.py +62 -0
  958. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +36 -0
  959. meta_subject/migrations/0210_remove_dmdxresult_dm_diagnosis_and_more.py +123 -0
  960. meta_subject/migrations/0211_dmendpoint_endpoint_reached_and_more.py +45 -0
  961. meta_subject/migrations/0212_auto_20240827_2222.py +23 -0
  962. meta_subject/migrations/0213_rename_bloodresultslipid_bloodresultslipids_and_more.py +35 -0
  963. meta_subject/migrations/0214_historicalstudymedication_stock_codes_and_more.py +44 -0
  964. meta_subject/migrations/0215_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
  965. meta_subject/migrations/0216_historicalnextappointment_nextappointment.py +553 -0
  966. meta_subject/migrations/0217_alter_historicalnextappointment_appt_datetime_and_more.py +42 -0
  967. meta_subject/migrations/0218_alter_historicalnextappointment_appt_date_and_more.py +53 -0
  968. meta_subject/migrations/0219_remove_historicalnextappointment_allow_create_interim_and_more.py +92 -0
  969. meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py +825 -0
  970. meta_subject/migrations/0221_auto_20250402_1913.py +42 -0
  971. meta_subject/migrations/0222_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
  972. meta_subject/migrations/0223_bloodresultsfbc_errors_bloodresultsgludummy_errors_and_more.py +83 -0
  973. meta_subject/migrations/0224_bloodresultsfbc_abnormal_summary_and_more.py +153 -0
  974. meta_subject/migrations/0225_followupvitals_waist_circumference_and_more.py +46 -0
  975. meta_subject/migrations/0226_followupvitals_waist_circumference_comment_and_more.py +97 -0
  976. meta_subject/migrations/0227_alter_followupvitals_waist_circumference_comment_and_more.py +97 -0
  977. meta_subject/migrations/0228_bloodresultshba1c_hba1c_datetime_and_more.py +2518 -0
  978. meta_subject/migrations/0229_alter_glucosefbg_consent_model_and_more.py +1918 -0
  979. meta_subject/migrations/0230_alter_historicaldelivery_action_identifier_and_more.py +1733 -0
  980. meta_subject/migrations/0231_alter_historicalmedicationadherence_consent_model_and_more.py +2054 -0
  981. meta_subject/migrations/0232_alter_patienthistory_concomitant_conditions_and_more.py +1170 -0
  982. meta_subject/migrations/0233_historicalspfq_spfq.py +1066 -0
  983. meta_subject/migrations/0234_remove_spfq_site_remove_spfq_subject_visit_and_more.py +27 -0
  984. meta_subject/migrations/0235_glucosefbg_endpoint_today_and_more.py +606 -0
  985. meta_subject/migrations/0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more.py +58 -0
  986. meta_subject/migrations/0237_historicalhivexitreview_singleton_field_and_more.py +68 -0
  987. meta_subject/migrations/0238_historicalhivexitreview_available_and_more.py +88 -0
  988. meta_subject/model_mixins/__init__.py +10 -0
  989. meta_subject/model_mixins/arv_history_model_mixin.py +5 -46
  990. meta_subject/model_mixins/arv_review_model_mixin.py +53 -0
  991. meta_subject/model_mixins/search_slug_model_mixin.py +1 -2
  992. meta_subject/model_mixins/vitals_fields_model_mixin.py +33 -1
  993. meta_subject/models/__init__.py +61 -4
  994. meta_subject/models/birth_outcomes.py +17 -8
  995. meta_subject/models/blood_results/__init__.py +12 -2
  996. meta_subject/models/blood_results/blood_results_fbc.py +9 -4
  997. meta_subject/models/blood_results/blood_results_glu.py +9 -4
  998. meta_subject/models/blood_results/blood_results_hba1c.py +8 -2
  999. meta_subject/models/blood_results/blood_results_ins.py +8 -2
  1000. meta_subject/models/blood_results/blood_results_lft.py +8 -2
  1001. meta_subject/models/blood_results/{blood_results_lipid.py → blood_results_lipids.py} +11 -4
  1002. meta_subject/models/blood_results/blood_results_rft.py +7 -1
  1003. meta_subject/models/complications.py +1 -3
  1004. meta_subject/models/complications_glycemia.py +3 -4
  1005. meta_subject/models/concomitant_medication.py +0 -1
  1006. meta_subject/models/delivery.py +4 -6
  1007. meta_subject/models/diabetes/__init__.py +4 -0
  1008. meta_subject/models/diabetes/dm_endpoint.py +61 -0
  1009. meta_subject/models/diabetes/dm_followup.py +215 -0
  1010. meta_subject/models/diet_and_lifestyle.py +5 -5
  1011. meta_subject/models/egfr_drop_notification.py +0 -1
  1012. meta_subject/models/followup_examination.py +28 -32
  1013. meta_subject/models/followup_vitals.py +3 -4
  1014. meta_subject/models/glucose.py +50 -15
  1015. meta_subject/models/glucose_fbg.py +74 -0
  1016. meta_subject/models/glucose_review.py +15 -0
  1017. meta_subject/models/health_economics/__init__.py +5 -0
  1018. meta_subject/models/{health_economics.py → health_economics/health_economics.py} +13 -14
  1019. meta_subject/models/{health_economics_simple.py → health_economics/health_economics_simple.py} +3 -4
  1020. meta_subject/models/health_economics/health_economics_update.py +97 -0
  1021. meta_subject/models/hepatitis_test.py +2 -3
  1022. meta_subject/models/hiv_exit_review.py +44 -0
  1023. meta_subject/models/malaria_test.py +3 -31
  1024. meta_subject/models/next_appointment.py +15 -0
  1025. meta_subject/models/off_study_drug.py +0 -1
  1026. meta_subject/models/other_arv_regimens_detail.py +3 -5
  1027. meta_subject/models/patient_history.py +6 -8
  1028. meta_subject/models/physical_exam.py +6 -6
  1029. meta_subject/models/pregnancy_update.py +1 -2
  1030. meta_subject/models/sf12.py +0 -3
  1031. meta_subject/models/signals.py +32 -11
  1032. meta_subject/models/study_medication.py +0 -1
  1033. meta_subject/models/subject_requisition.py +3 -5
  1034. meta_subject/models/subject_visit.py +5 -8
  1035. meta_subject/models/subject_visit_missed.py +0 -1
  1036. meta_subject/models/todo.txt +1 -1
  1037. meta_subject/models/urine_dipstick_test.py +2 -3
  1038. meta_subject/models/urine_pregnancy.py +1 -2
  1039. meta_subject/static/meta_subject/slider.css +1 -1
  1040. meta_subject/templates/meta_subject/endpoint_review_instructions.html +6 -0
  1041. meta_subject/templates/meta_subject/widgets/slider.html +0 -1
  1042. meta_visit_schedule/constants.py +7 -1
  1043. meta_visit_schedule/visit_schedules/__init__.py +3 -1
  1044. meta_visit_schedule/visit_schedules/phase_three/__init__.py +2 -0
  1045. meta_visit_schedule/visit_schedules/phase_three/crfs.py +212 -95
  1046. meta_visit_schedule/visit_schedules/phase_three/crfs_pregnancy.py +2 -2
  1047. meta_visit_schedule/visit_schedules/phase_three/requisitions.py +30 -51
  1048. meta_visit_schedule/visit_schedules/phase_three/schedule.py +72 -7
  1049. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +59 -0
  1050. meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py +7 -5
  1051. meta_visit_schedule/visit_schedules/phase_three/visit_schedule.py +3 -1
  1052. meta_ae/pdf_reports/ae_report.py +0 -8
  1053. meta_ae/pdf_reports/death_report.py +0 -8
  1054. meta_ae/tests/holidays.csv +0 -15
  1055. meta_ae/tests/tests/test_actions.py +0 -127
  1056. meta_ae/tests/urls.py +0 -10
  1057. meta_consent/admin/subject_reconsent_admin.py +0 -77
  1058. meta_consent/tests/holidays.csv +0 -15
  1059. meta_consent/tests/tests/test_form_validators.py +0 -85
  1060. meta_consent/tests/tests/test_subject_consent.py +0 -10
  1061. meta_consent/tests/urls.py +0 -18
  1062. meta_dashboard/model_wrappers/__init__.py +0 -8
  1063. meta_dashboard/model_wrappers/ae_initial_model_wrapper.py +0 -6
  1064. meta_dashboard/model_wrappers/death_report_model_wrapper.py +0 -15
  1065. meta_dashboard/model_wrappers/subject_refusal_model_wrapper.py +0 -16
  1066. meta_dashboard/model_wrappers/subject_screening_model_wrapper.py +0 -85
  1067. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard.html +0 -11
  1068. meta_dashboard/tests/admin.py +0 -22
  1069. meta_dashboard/tests/holidays.csv +0 -15
  1070. meta_dashboard/tests/tests/test_model_wrappers.py +0 -71
  1071. meta_dashboard/tests/urls.py +0 -59
  1072. meta_edc/tests/etc/randomization_list_phase_three.csv +0 -241
  1073. meta_edc/tests/etc/user-aes-local.key +0 -1
  1074. meta_edc/tests/etc/user-aes-restricted.key +0 -0
  1075. meta_edc/tests/etc/user-rsa-local-private.pem +0 -27
  1076. meta_edc/tests/etc/user-rsa-local-public.pem +0 -9
  1077. meta_edc/tests/etc/user-rsa-restricted-private.pem +0 -27
  1078. meta_edc/tests/etc/user-rsa-restricted-public.pem +0 -9
  1079. meta_edc/tests/etc/user-salt-local.key +0 -0
  1080. meta_edc/tests/etc/user-salt-restricted.key +0 -0
  1081. meta_edc/tests/tests/test_endpoints.py +0 -525
  1082. meta_edc-0.2.24.dist-info/METADATA +0 -180
  1083. meta_edc-0.2.24.dist-info/RECORD +0 -849
  1084. meta_edc-0.2.24.dist-info/WHEEL +0 -5
  1085. meta_edc-0.2.24.dist-info/top_level.txt +0 -19
  1086. meta_labs/tests/test_labs.py +0 -27
  1087. meta_labs/tests/test_reportables.py +0 -16
  1088. meta_labs/tests/urls.py +0 -4
  1089. meta_lists/tests/test_lists.py +0 -8
  1090. meta_pharmacy/models.py +0 -0
  1091. meta_prn/tests/__init__.py +0 -0
  1092. meta_prn/tests/tests/__init__.py +0 -0
  1093. meta_prn/tests/tests/test_actions.py +0 -97
  1094. meta_prn/tests/tests/test_manager_order.py +0 -15
  1095. meta_prn/tests/tests/test_pregnancy_notification.py +0 -94
  1096. meta_prn/tests/urls.py +0 -10
  1097. meta_rando/tests/__init__.py +0 -0
  1098. meta_rando/tests/tests/__init__.py +0 -0
  1099. meta_rando/tests/tests/test_randomizers.py +0 -58
  1100. meta_reference/__init__.py +0 -0
  1101. meta_reference/apps.py +0 -6
  1102. meta_reference/migrations/__init__.py +0 -0
  1103. meta_reference/reference_model_configs.py +0 -5
  1104. meta_reports/models.py +0 -0
  1105. meta_reports/tests/__init__.py +0 -0
  1106. meta_reports/tests/holidays.csv +0 -15
  1107. meta_reports/tests/test_reports.py +0 -36
  1108. meta_reports/tests/urls.py +0 -4
  1109. meta_screening/offline_models.py +0 -3
  1110. meta_screening/tests/__init__.py +0 -0
  1111. meta_screening/tests/holidays.csv +0 -15
  1112. meta_screening/tests/meta_test_case_mixin.py +0 -214
  1113. meta_screening/tests/options.py +0 -124
  1114. meta_screening/tests/tests/__init__.py +0 -0
  1115. meta_screening/tests/tests/test_forms.py +0 -397
  1116. meta_screening/tests/tests/test_screening_part_one.py +0 -108
  1117. meta_screening/tests/tests/test_screening_part_three.py +0 -437
  1118. meta_screening/tests/tests/test_screening_part_two.py +0 -86
  1119. meta_sites/tests/__init__.py +0 -0
  1120. meta_sites/tests/test_sites.py +0 -16
  1121. meta_sites/tests/urls.py +0 -4
  1122. meta_subject/admin/blood_results/blood_results_glu_admin.py +0 -30
  1123. meta_subject/admin/blood_results/blood_results_lipid_admin.py +0 -21
  1124. meta_subject/forms/blood_results/blood_results_glu_form.py +0 -26
  1125. meta_subject/forms/health_economics_simple_form.py +0 -19
  1126. meta_subject/tests/__init__.py +0 -0
  1127. meta_subject/tests/holidays.csv +0 -15
  1128. meta_subject/tests/tests/__init__.py +0 -0
  1129. meta_subject/tests/tests/test_egfr.py +0 -222
  1130. meta_subject/tests/tests/test_followup.py +0 -50
  1131. meta_subject/tests/tests/test_manager_order.py +0 -31
  1132. meta_subject/tests/tests/test_medication_adherence.py +0 -72
  1133. meta_subject/tests/tests/test_metadata_rules.py +0 -105
  1134. meta_subject/tests/tests/test_mnsi.py +0 -246
  1135. meta_subject/tests/tests/test_patient_history_form.py +0 -71
  1136. meta_subject/tests/tests/test_physical_exam.py +0 -81
  1137. meta_subject/tests/tests/test_sf12.py +0 -164
  1138. meta_subject/tests/tests/test_study_medication.py +0 -230
  1139. meta_subject/tests/urls.py +0 -25
  1140. meta_visit_schedule/tests/__init__.py +0 -0
  1141. meta_visit_schedule/tests/tests/__init__.py +0 -0
  1142. meta_visit_schedule/tests/tests/test_schedule.py +0 -177
  1143. meta_visit_schedule/tests/urls.py +0 -4
  1144. tests/__init__.py +0 -0
  1145. tests/etc/randomization_list.csv +0 -241
  1146. tests/etc/user-aes-local.key +0 -0
  1147. tests/etc/user-aes-restricted.key +0 -1
  1148. tests/etc/user-rsa-local-private.pem +0 -27
  1149. tests/etc/user-rsa-local-public.pem +0 -9
  1150. tests/etc/user-rsa-restricted-private.pem +0 -27
  1151. tests/etc/user-rsa-restricted-public.pem +0 -9
  1152. tests/etc/user-salt-local.key +0 -0
  1153. tests/etc/user-salt-restricted.key +0 -0
  1154. tests/holidays.csv +0 -15
  1155. /meta_ae/templates/meta_ae/{bootstrap3/ae_initial_description.html → aeinitial_description.html} +0 -0
  1156. {meta_ae/tests → meta_analytics}/__init__.py +0 -0
  1157. /meta_ae/tests/tests/__init__.py → /meta_analytics/constants.py +0 -0
  1158. {meta_consent/tests → meta_analytics/tables/enrolled}/__init__.py +0 -0
  1159. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/add_consent_button.html +0 -0
  1160. /meta_dashboard/templates/meta_dashboard/{bootstrap3/buttons → buttons}/refusal_button.html +0 -0
  1161. {meta_consent/tests/tests → meta_edc/migrations}/__init__.py +0 -0
  1162. {meta_edc-0.2.24.dist-info → meta_edc-1.4.0.dist-info/licenses}/LICENSE +0 -0
  1163. {meta_dashboard/tests → meta_pharmacy/management}/__init__.py +0 -0
  1164. {meta_dashboard/tests/tests → meta_pharmacy/management/commands}/__init__.py +0 -0
  1165. {meta_edc/tests → meta_reports/management}/__init__.py +0 -0
  1166. {meta_edc/tests/tests → meta_reports/management/commands}/__init__.py +0 -0
  1167. /meta_edc-0.2.24.dist-info/AUTHORS → /meta_reports/utils.py +0 -0
  1168. /meta_labs/tests/__init__.py → /meta_subject/management/__init__py.py +0 -0
  1169. /meta_lists/tests/__init__.py → /meta_subject/management/commands/__init__py.py +0 -0
@@ -1,12 +1,12 @@
1
- from typing import Tuple
2
-
3
1
  from django.contrib import admin
4
- from django.utils.html import format_html
2
+ from django.template.loader import render_to_string
3
+ from django.utils.safestring import mark_safe
5
4
  from django_audit_fields import audit_fieldset_tuple
6
- from edc_action_item import ActionItemModelAdminMixin, action_fieldset_tuple
7
- from edc_data_manager.modeladmin_mixins import DataManagerModelAdminMixin
5
+ from edc_action_item.fieldsets import action_fieldset_tuple
6
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
8
7
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
9
8
  from edc_model_admin.history import SimpleHistoryAdmin
9
+ from edc_sites.admin import SiteModelAdminMixin
10
10
 
11
11
  from ..admin_site import meta_prn_admin
12
12
  from ..forms import OffScheduleForm
@@ -15,19 +15,19 @@ from ..models import EndOfStudy, OffSchedule
15
15
 
16
16
  @admin.register(OffSchedule, site=meta_prn_admin)
17
17
  class OffScheduleAdmin(
18
- DataManagerModelAdminMixin,
18
+ SiteModelAdminMixin,
19
19
  ActionItemModelAdminMixin,
20
20
  ModelAdminSubjectDashboardMixin,
21
21
  SimpleHistoryAdmin,
22
22
  ):
23
-
24
23
  form = OffScheduleForm
25
24
 
26
- additional_instructions = format_html(
27
- '<span style="color:orange;font-weight:bold">Note:</span> Detailed '
28
- "information about study termination will be asked for on the "
29
- f"<b>{EndOfStudy._meta.verbose_name}</b> form"
30
- )
25
+ additional_instructions = mark_safe( # noqa: S308
26
+ render_to_string(
27
+ "meta_prn/offschedule/additional_instructions.html",
28
+ context=dict(verbose_name=EndOfStudy._meta.verbose_name),
29
+ )
30
+ ) # nosec B703, B308
31
31
 
32
32
  fieldsets = (
33
33
  (None, {"fields": ("subject_identifier", "offschedule_datetime")}),
@@ -35,12 +35,12 @@ class OffScheduleAdmin(
35
35
  audit_fieldset_tuple,
36
36
  )
37
37
 
38
- def get_list_display(self, request) -> Tuple[str, ...]:
38
+ def get_list_display(self, request) -> tuple[str, ...]:
39
39
  list_display = super().get_list_display(request)
40
40
  custom_fields = ("subject_identifier", "dashboard", "offschedule_datetime")
41
41
  return custom_fields + tuple(f for f in list_display if f not in custom_fields)
42
42
 
43
- def get_list_filter(self, request) -> Tuple[str, ...]:
43
+ def get_list_filter(self, request) -> tuple[str, ...]:
44
44
  list_filter = super().get_list_filter(request)
45
45
  custom_fields = ("offschedule_datetime",)
46
46
  return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
@@ -0,0 +1,48 @@
1
+ from django.contrib import admin
2
+ from django.template.loader import render_to_string
3
+ from django.utils.safestring import mark_safe
4
+ from django_audit_fields import audit_fieldset_tuple
5
+ from edc_action_item.fieldsets import action_fieldset_tuple
6
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
7
+ from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
8
+ from edc_model_admin.history import SimpleHistoryAdmin
9
+ from edc_sites.admin import SiteModelAdminMixin
10
+
11
+ from ..admin_site import meta_prn_admin
12
+ from ..forms import OffScheduleDmReferralForm
13
+ from ..models import EndOfStudy, OffScheduleDmReferral
14
+
15
+
16
+ @admin.register(OffScheduleDmReferral, site=meta_prn_admin)
17
+ class OffScheduleDmReferralAdmin(
18
+ SiteModelAdminMixin,
19
+ ActionItemModelAdminMixin,
20
+ ModelAdminSubjectDashboardMixin,
21
+ SimpleHistoryAdmin,
22
+ ):
23
+ instructions = None
24
+
25
+ form = OffScheduleDmReferralForm
26
+
27
+ additional_instructions = mark_safe( # noqa: S308
28
+ render_to_string(
29
+ "meta_prn/offschedule/additional_instructions.html",
30
+ context=dict(verbose_name=EndOfStudy._meta.verbose_name),
31
+ )
32
+ )
33
+
34
+ fieldsets = (
35
+ (None, {"fields": ("subject_identifier", "offschedule_datetime")}),
36
+ action_fieldset_tuple,
37
+ audit_fieldset_tuple,
38
+ )
39
+
40
+ def get_list_display(self, request) -> tuple[str, ...]:
41
+ list_display = super().get_list_display(request)
42
+ custom_fields = ("subject_identifier", "dashboard", "offschedule_datetime")
43
+ return custom_fields + tuple(f for f in list_display if f not in custom_fields)
44
+
45
+ def get_list_filter(self, request) -> tuple[str, ...]:
46
+ list_filter = super().get_list_filter(request)
47
+ custom_fields = ("offschedule_datetime",)
48
+ return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
@@ -1,42 +1,49 @@
1
- from typing import Tuple
2
-
3
1
  from django.contrib import admin
2
+ from django.template.loader import render_to_string
3
+ from django.utils.safestring import mark_safe
4
4
  from django_audit_fields import audit_fieldset_tuple
5
- from edc_action_item import ActionItemModelAdminMixin, action_fieldset_tuple
6
- from edc_data_manager.modeladmin_mixins import DataManagerModelAdminMixin
5
+ from edc_action_item.fieldsets import action_fieldset_tuple
6
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
7
7
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
8
8
  from edc_model_admin.history import SimpleHistoryAdmin
9
+ from edc_sites.admin import SiteModelAdminMixin
9
10
 
10
11
  from ..admin_site import meta_prn_admin
11
- from ..models import OffSchedulePostnatal
12
+ from ..models import EndOfStudy, OffSchedulePostnatal
12
13
 
13
14
 
14
15
  @admin.register(OffSchedulePostnatal, site=meta_prn_admin)
15
16
  class OffSchedulePostnatalAdmin(
16
- DataManagerModelAdminMixin,
17
+ SiteModelAdminMixin,
17
18
  ActionItemModelAdminMixin,
18
19
  ModelAdminSubjectDashboardMixin,
19
20
  SimpleHistoryAdmin,
20
21
  ):
21
-
22
22
  instructions = None
23
23
 
24
+ additional_instructions = mark_safe( # noqa: S308
25
+ render_to_string(
26
+ "meta_prn/offschedule/additional_instructions.html",
27
+ context=dict(verbose_name=EndOfStudy._meta.verbose_name),
28
+ )
29
+ )
30
+
24
31
  fieldsets = (
25
32
  (None, {"fields": ("subject_identifier", "offschedule_datetime")}),
26
33
  action_fieldset_tuple,
27
34
  audit_fieldset_tuple,
28
35
  )
29
36
 
30
- def get_list_display(self, request) -> Tuple[str, ...]:
37
+ def get_list_display(self, request) -> tuple[str, ...]:
31
38
  list_display = super().get_list_display(request)
32
39
  custom_fields = ("subject_identifier", "dashboard", "offschedule_datetime")
33
40
  return custom_fields + tuple(f for f in list_display if f not in custom_fields)
34
41
 
35
- def get_list_filter(self, request) -> Tuple[str, ...]:
42
+ def get_list_filter(self, request) -> tuple[str, ...]:
36
43
  list_filter = super().get_list_filter(request)
37
44
  custom_fields = ("offschedule_datetime",)
38
45
  return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
39
46
 
40
- def get_readonly_fields(self, request, obj=None) -> Tuple[str, ...]:
47
+ def get_readonly_fields(self, request, obj=None) -> tuple[str, ...]:
41
48
  custom_fields = ("subject_identifier", "offschedule_datetime")
42
49
  return tuple(set(super().get_readonly_fields(request, obj=obj) + custom_fields))
@@ -1,27 +1,34 @@
1
- from typing import Tuple
2
-
3
1
  from django.contrib import admin
2
+ from django.template.loader import render_to_string
3
+ from django.utils.safestring import mark_safe
4
4
  from django_audit_fields import audit_fieldset_tuple
5
- from edc_action_item import ActionItemModelAdminMixin, action_fieldset_tuple
6
- from edc_data_manager.modeladmin_mixins import DataManagerModelAdminMixin
5
+ from edc_action_item.fieldsets import action_fieldset_tuple
6
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
7
7
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
8
8
  from edc_model_admin.history import SimpleHistoryAdmin
9
+ from edc_sites.admin import SiteModelAdminMixin
9
10
 
10
11
  from ..admin_site import meta_prn_admin
11
12
  from ..forms import OffSchedulePregnancyForm
12
- from ..models import OffSchedulePregnancy
13
+ from ..models import EndOfStudy, OffSchedulePregnancy
13
14
 
14
15
 
15
16
  @admin.register(OffSchedulePregnancy, site=meta_prn_admin)
16
17
  class OffSchedulePregnancyAdmin(
17
- DataManagerModelAdminMixin,
18
+ SiteModelAdminMixin,
18
19
  ActionItemModelAdminMixin,
19
20
  ModelAdminSubjectDashboardMixin,
20
21
  SimpleHistoryAdmin,
21
22
  ):
22
-
23
23
  instructions = None
24
24
 
25
+ additional_instructions = mark_safe( # noqa: S308
26
+ render_to_string(
27
+ "meta_prn/offschedule/additional_instructions.html",
28
+ context=dict(verbose_name=EndOfStudy._meta.verbose_name),
29
+ )
30
+ )
31
+
25
32
  form = OffSchedulePregnancyForm
26
33
 
27
34
  fieldsets = (
@@ -30,16 +37,17 @@ class OffSchedulePregnancyAdmin(
30
37
  audit_fieldset_tuple,
31
38
  )
32
39
 
33
- def get_list_display(self, request) -> Tuple[str, ...]:
40
+ def get_list_display(self, request) -> tuple[str, ...]:
34
41
  list_display = super().get_list_display(request)
35
42
  custom_fields = ("subject_identifier", "dashboard", "offschedule_datetime")
36
43
  return custom_fields + tuple(f for f in list_display if f not in custom_fields)
37
44
 
38
- def get_list_filter(self, request) -> Tuple[str, ...]:
45
+ def get_list_filter(self, request) -> tuple[str, ...]:
39
46
  list_filter = super().get_list_filter(request)
40
47
  custom_fields = ("offschedule_datetime",)
41
48
  return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
42
49
 
43
- def get_readonly_fields(self, request, obj=None) -> Tuple[str, ...]:
44
- custom_fields = ("subject_identifier", "offschedule_datetime")
45
- return tuple(set(super().get_readonly_fields(request, obj=obj) + custom_fields))
50
+ # def get_readonly_fields(self, request, obj=None) -> Tuple[str, ...]:
51
+ # custom_fields = ("subject_identifier", "offschedule_datetime")
52
+ # return tuple(set(super().get_readonly_fields(request, obj=obj) +
53
+ # custom_fields))
@@ -1,9 +1,7 @@
1
- from typing import Tuple
2
-
3
1
  from django.contrib import admin
4
- from edc_data_manager.modeladmin_mixins import DataManagerModelAdminMixin
5
2
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
6
3
  from edc_model_admin.history import SimpleHistoryAdmin
4
+ from edc_sites.admin import SiteModelAdminMixin
7
5
 
8
6
  from ..admin_site import meta_prn_admin
9
7
  from ..models import OnSchedule
@@ -11,30 +9,30 @@ from ..models import OnSchedule
11
9
 
12
10
  @admin.register(OnSchedule, site=meta_prn_admin)
13
11
  class OnScheduleAdmin(
14
- DataManagerModelAdminMixin, ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin
12
+ SiteModelAdminMixin, ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin
15
13
  ):
16
-
17
14
  instructions = None
18
15
 
19
16
  fields = ("subject_identifier", "onschedule_datetime")
20
17
 
21
- def get_list_display(self, request) -> Tuple[str, ...]:
18
+ def get_list_display(self, request) -> tuple[str, ...]:
22
19
  list_display = super().get_list_display(request)
23
20
  custom_fields = ("subject_identifier", "dashboard", "onschedule_datetime")
24
21
  return custom_fields + tuple(
25
- f for f in list_display if f not in custom_fields + ("__str__",)
22
+ f for f in list_display if f not in (*custom_fields, "__str__")
26
23
  )
27
24
 
28
- def get_list_filter(self, request) -> Tuple[str, ...]:
25
+ def get_list_filter(self, request) -> tuple[str, ...]:
29
26
  list_filter = super().get_list_filter(request)
30
27
  custom_fields = ("onschedule_datetime",)
31
28
  return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
32
29
 
33
- def get_readonly_fields(self, request, obj=None) -> Tuple[str, ...]:
30
+ def get_readonly_fields(self, request, obj=None) -> tuple[str, ...]: # noqa: ARG002
34
31
  return (
35
32
  "subject_identifier",
36
33
  "onschedule_datetime",
37
34
  )
38
35
 
39
- def get_search_fields(self, request) -> Tuple[str, ...]:
40
- return tuple(set(super().get_search_fields(request) + ("subject_identifier",)))
36
+ def get_search_fields(self, request) -> tuple[str, ...]:
37
+ fields = super().get_search_fields(request)
38
+ return tuple({*fields, "subject_identifier"})
@@ -0,0 +1,38 @@
1
+ from django.contrib import admin
2
+ from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
3
+ from edc_model_admin.history import SimpleHistoryAdmin
4
+ from edc_sites.admin import SiteModelAdminMixin
5
+
6
+ from ..admin_site import meta_prn_admin
7
+ from ..models import OnScheduleDmReferral
8
+
9
+
10
+ @admin.register(OnScheduleDmReferral, site=meta_prn_admin)
11
+ class OnScheduleDmReferralAdmin(
12
+ SiteModelAdminMixin, ModelAdminSubjectDashboardMixin, SimpleHistoryAdmin
13
+ ):
14
+ instructions = None
15
+
16
+ fields = ("subject_identifier", "onschedule_datetime")
17
+
18
+ def get_list_display(self, request) -> tuple[str, ...]:
19
+ list_display = super().get_list_display(request)
20
+ custom_fields = ("subject_identifier", "dashboard", "onschedule_datetime")
21
+ return custom_fields + tuple(
22
+ f for f in list_display if f not in (*custom_fields, "__str__")
23
+ )
24
+
25
+ def get_list_filter(self, request) -> tuple[str, ...]:
26
+ list_filter = super().get_list_filter(request)
27
+ custom_fields = ("onschedule_datetime",)
28
+ return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
29
+
30
+ # def get_readonly_fields(self, request, obj=None) -> Tuple[str, ...]:
31
+ # return (
32
+ # "subject_identifier",
33
+ # "onschedule_datetime",
34
+ # )
35
+
36
+ def get_search_fields(self, request) -> tuple[str, ...]:
37
+ fields = super().get_search_fields(request)
38
+ return tuple({*fields, "subject_identifier"})
@@ -1,11 +1,10 @@
1
- from typing import Tuple
2
-
3
1
  from django.contrib import admin
4
2
  from django_audit_fields.admin import audit_fieldset_tuple
5
- from edc_action_item import ActionItemModelAdminMixin, action_fieldset_tuple
6
- from edc_data_manager.modeladmin_mixins import DataManagerModelAdminMixin
3
+ from edc_action_item.fieldsets import action_fieldset_tuple
4
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
7
5
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
8
6
  from edc_model_admin.history import SimpleHistoryAdmin
7
+ from edc_sites.admin import SiteModelAdminMixin
9
8
 
10
9
  from meta_subject.models import UrinePregnancy
11
10
 
@@ -16,12 +15,11 @@ from ..models import PregnancyNotification
16
15
 
17
16
  @admin.register(PregnancyNotification, site=meta_prn_admin)
18
17
  class PregnancyNotificationAdmin(
19
- DataManagerModelAdminMixin,
18
+ SiteModelAdminMixin,
20
19
  ActionItemModelAdminMixin,
21
20
  ModelAdminSubjectDashboardMixin,
22
21
  SimpleHistoryAdmin,
23
22
  ):
24
-
25
23
  form = PregnancyNotificationForm
26
24
 
27
25
  additional_instructions = (
@@ -47,22 +45,26 @@ class PregnancyNotificationAdmin(
47
45
  audit_fieldset_tuple,
48
46
  )
49
47
 
50
- radio_fields = {
48
+ radio_fields = { # noqa: RUF012
51
49
  "bhcg_confirmed": admin.VERTICAL,
52
50
  "may_contact": admin.VERTICAL,
53
51
  }
54
52
 
55
- def get_list_display(self, request) -> Tuple[str, ...]:
53
+ def get_list_display(self, request) -> tuple[str, ...]:
56
54
  list_display = super().get_list_display(request)
57
55
  custom_fields = (
58
56
  "subject_identifier",
59
57
  "dashboard",
60
58
  "edd",
61
- "may_contact",
59
+ "contact_agreed",
62
60
  )
63
61
  return custom_fields + tuple(f for f in list_display if f not in custom_fields)
64
62
 
65
- def get_list_filter(self, request) -> Tuple[str, ...]:
66
- list_filter = super().get_list_display(request)
63
+ def get_list_filter(self, request) -> tuple[str, ...]:
64
+ list_filter = super().get_list_filter(request)
67
65
  custom_fields = ("edd", "may_contact")
68
66
  return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
67
+
68
+ @admin.display(description="May contact?", ordering="may_contact")
69
+ def contact_agreed(self, obj):
70
+ return obj.may_contact
@@ -1,13 +1,9 @@
1
- from typing import Tuple
2
-
3
1
  from django.contrib import admin
4
- from django.utils.html import format_html
5
- from django_audit_fields.admin import audit_fieldset_tuple
6
- from edc_action_item import ActionItemModelAdminMixin, action_fieldset_tuple
7
- from edc_constants.constants import CLOSED, OPEN
8
- from edc_data_manager.modeladmin_mixins import DataManagerModelAdminMixin
2
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
9
3
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
10
4
  from edc_model_admin.history import SimpleHistoryAdmin
5
+ from edc_protocol_incident.modeladmin_mixins import ProtocolIncidentModelAdminMixin
6
+ from edc_sites.admin import SiteModelAdminMixin
11
7
 
12
8
  from ..admin_site import meta_prn_admin
13
9
  from ..forms import ProtocolIncidentForm
@@ -15,105 +11,11 @@ from ..models import ProtocolIncident
15
11
 
16
12
 
17
13
  @admin.register(ProtocolIncident, site=meta_prn_admin)
18
- class ProtocolDeviationViolationAdmin(
19
- DataManagerModelAdminMixin,
14
+ class ProtocolIncidentAdmin(
15
+ ProtocolIncidentModelAdminMixin,
16
+ SiteModelAdminMixin,
20
17
  ActionItemModelAdminMixin,
21
18
  ModelAdminSubjectDashboardMixin,
22
19
  SimpleHistoryAdmin,
23
20
  ):
24
-
25
21
  form = ProtocolIncidentForm
26
-
27
- fieldsets = (
28
- (
29
- None,
30
- {
31
- "fields": (
32
- "subject_identifier",
33
- "report_datetime",
34
- "short_description",
35
- "report_type",
36
- )
37
- },
38
- ),
39
- (
40
- "Details of incident",
41
- {
42
- "fields": (
43
- "safety_impact",
44
- "safety_impact_details",
45
- "study_outcomes_impact",
46
- "study_outcomes_impact_details",
47
- "incident_datetime",
48
- "incident",
49
- "incident_other",
50
- "incident_description",
51
- "incident_reason",
52
- ),
53
- },
54
- ),
55
- (
56
- "Actions taken",
57
- {
58
- "description": (
59
- "The following questions are required before the report is closed."
60
- ),
61
- "fields": (
62
- "corrective_action_datetime",
63
- "corrective_action",
64
- "preventative_action_datetime",
65
- "preventative_action",
66
- "action_required",
67
- ),
68
- },
69
- ),
70
- ("Report status", {"fields": ("report_status", "report_closed_datetime")}),
71
- action_fieldset_tuple,
72
- audit_fieldset_tuple,
73
- )
74
-
75
- radio_fields = {
76
- "action_required": admin.VERTICAL,
77
- "report_status": admin.VERTICAL,
78
- "report_type": admin.VERTICAL,
79
- "safety_impact": admin.VERTICAL,
80
- "study_outcomes_impact": admin.VERTICAL,
81
- "incident": admin.VERTICAL,
82
- }
83
-
84
- search_fields = ("subject_identifier",)
85
-
86
- def get_list_display(self, request) -> Tuple[str, ...]:
87
- list_display = super().get_list_display(request)
88
- custom_fields = (
89
- "subject_identifier",
90
- "dashboard",
91
- "description",
92
- "report_datetime",
93
- "status",
94
- "action_required",
95
- "report_type",
96
- "action_identifier",
97
- "user_created",
98
- )
99
- return custom_fields + tuple(f for f in list_display if f not in custom_fields)
100
-
101
- def get_list_filter(self, request) -> Tuple[str, ...]:
102
- list_filter = super().get_list_filter(request)
103
- custom_fields = ("action_required", "report_status", "report_type")
104
- return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
105
-
106
- def get_search_fields(self, request) -> Tuple[str, ...]:
107
- search_fields = super().get_search_fields(request)
108
- custom_fields = ("short_description",)
109
- return tuple(set(custom_fields + search_fields))
110
-
111
- def status(self, obj=None):
112
- if obj.report_status == CLOSED:
113
- return format_html(f'<font color="green">{obj.report_status.title()}</font>')
114
- elif obj.report_status == OPEN:
115
- return format_html(f'<font color="red">{obj.report_status.title()}</font>')
116
- return obj.report_status.title()
117
-
118
- def description(self, obj=None):
119
- return obj.short_description.title()
@@ -1,7 +1,8 @@
1
1
  from django.contrib import admin
2
- from edc_action_item import ActionItemModelAdminMixin
2
+ from edc_action_item.modeladmin_mixins import ActionItemModelAdminMixin
3
3
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
4
4
  from edc_model_admin.history import SimpleHistoryAdmin
5
+ from edc_sites.admin import SiteModelAdminMixin
5
6
  from edc_transfer.modeladmin_mixins import SubjectTransferModelAdminMixin
6
7
 
7
8
  from ..admin_site import meta_prn_admin
@@ -12,9 +13,9 @@ from ..models import SubjectTransfer
12
13
  @admin.register(SubjectTransfer, site=meta_prn_admin)
13
14
  class SubjectTransferAdmin(
14
15
  SubjectTransferModelAdminMixin,
16
+ SiteModelAdminMixin,
15
17
  ActionItemModelAdminMixin,
16
18
  ModelAdminSubjectDashboardMixin,
17
19
  SimpleHistoryAdmin,
18
20
  ):
19
-
20
21
  form = SubjectTransferForm
meta_prn/baker_recipes.py CHANGED
@@ -1,10 +1,10 @@
1
+ from clinicedc_constants import NULL_STRING, YES
1
2
  from dateutil.relativedelta import relativedelta
2
- from edc_constants.constants import YES
3
- from edc_utils import get_utcnow
3
+ from django.utils import timezone
4
4
  from faker import Faker
5
5
  from model_bakery.recipe import Recipe
6
6
 
7
- from .models import PregnancyNotification
7
+ from .models import DmReferral, PregnancyNotification
8
8
 
9
9
  fake = Faker()
10
10
 
@@ -12,10 +12,17 @@ fake = Faker()
12
12
  pregnancynotification = Recipe(
13
13
  PregnancyNotification,
14
14
  # site=None,
15
- action_identifier=None,
16
- subject_identifier=None,
17
- report_datetime=get_utcnow(),
15
+ action_identifier=NULL_STRING,
16
+ subject_identifier=NULL_STRING,
17
+ report_datetime=timezone.now(),
18
18
  bhcg_confirmed=YES,
19
- unconfirmed_details=None,
20
- edd=get_utcnow() + relativedelta(months=6),
19
+ unconfirmed_details=NULL_STRING,
20
+ edd=timezone.now() + relativedelta(months=6),
21
+ )
22
+
23
+ dmreferral = Recipe(
24
+ DmReferral,
25
+ action_identifier=NULL_STRING,
26
+ subject_identifier=NULL_STRING,
27
+ report_datetime=timezone.now(),
21
28
  )
meta_prn/choices.py CHANGED
@@ -1,6 +1,9 @@
1
- from edc_constants.constants import NOT_APPLICABLE, OTHER, PATIENT, PREGNANCY, UNKNOWN
1
+ from clinicedc_constants import NOT_APPLICABLE, OTHER, PATIENT, PREGNANCY, UNKNOWN
2
+
3
+ from .constants import CLINICIAN, INVESTIGATOR, REFERRAL, SAE
4
+
5
+ # from edc_transfer.constants import TRANSFERRED
2
6
 
3
- from .constants import CLINICIAN, INVESTIGATOR, SAE
4
7
 
5
8
  CLINICAL_WITHDRAWAL_REASONS = (
6
9
  ("kidney_disease", "Development of chronic kidney disease"),
@@ -11,7 +14,7 @@ CLINICAL_WITHDRAWAL_REASONS = (
11
14
  OTHER,
12
15
  (
13
16
  "Other condition that justifies the discontinuation of "
14
- "treatment in the clinicians opinion (specify below)"
17
+ "treatment in the clinician's opinion (specify below)"
15
18
  ),
16
19
  ),
17
20
  (NOT_APPLICABLE, "Not applicable"),
@@ -45,30 +48,30 @@ LOSS_CHOICES = (
45
48
  )
46
49
 
47
50
  PROTOCOL_VIOLATION = (
48
- ("failure_to_obtain_informed_consent", "Failure to obtain informed " "consent"),
51
+ ("failure_to_obtain_informed_consent", "Failure to obtain informed consent"),
49
52
  ("enrollment_of_ineligible_patient", "Enrollment of ineligible patient"),
50
53
  (
51
54
  "screening_procedure not done",
52
- "Screening procedure required by " "protocol not done",
55
+ "Screening procedure required by protocol not done",
53
56
  ),
54
57
  (
55
58
  "screening_or_on-study_procedure",
56
- "Screening or on-study procedure/lab " "work required not done",
59
+ "Screening or on-study procedure/lab work required not done",
57
60
  ),
58
61
  (
59
62
  "incorrect_research_treatment",
60
- "Incorrect research treatment given to " "patient",
63
+ "Incorrect research treatment given to patient",
61
64
  ),
62
65
  (
63
66
  "procedure_not_completed",
64
- "On-study procedure required by protocol not " "completed",
67
+ "On-study procedure required by protocol not completed",
65
68
  ),
66
69
  ("visit_non-compliance", "Visit non-compliance"),
67
70
  ("medication_stopped_early", "Medication stopped early"),
68
71
  ("medication_noncompliance", "Medication_noncompliance"),
69
72
  (
70
73
  "national_regulations_not_met",
71
- "Standard WPD, ICH-GCP, local/national " "regulations not met",
74
+ "Standard WPD, ICH-GCP, local/national regulations not met",
72
75
  ),
73
76
  (OTHER, "Other"),
74
77
  (NOT_APPLICABLE, "Not applicable"),
@@ -92,9 +95,11 @@ WITHDRAWAL_STUDY_MEDICATION_REASONS = (
92
95
  (
93
96
  CLINICIAN,
94
97
  "Other condition that justifies discontinuation of "
95
- "treatment in the clinicians opinion (specify below)",
98
+ "treatment in the clinician's opinion (specify below)",
96
99
  ),
97
100
  (INVESTIGATOR, " Investigator decision"),
101
+ (REFERRAL, "Referral to Diabetes clinic"),
102
+ # (TRANSFERRED, "Patient decision to transfer out of catchment area"),
98
103
  (PATIENT, "Patient decision"),
99
104
  (OTHER, "Other reason (specify below)"),
100
105
  )
meta_prn/constants.py CHANGED
@@ -1,19 +1,22 @@
1
1
  CLINICAL_WITHDRAWAL = "clinical_withdrawal"
2
2
  CLINICIAN = "clinician"
3
+ COMPLETED_FOLLOWUP_48 = "completed_followup_48"
3
4
  DEATH_REPORT_ACTION = "submit_death_report"
4
5
  DEVIATION = "protocol_deviation"
6
+ DM_REFFERAL_ACTION = "dm_refferal_action"
5
7
  INVESTIGATOR = "investigator"
6
8
  INVESTIGATOR_DECISION = "investigator_decision"
7
9
  LATE_EXCLUSION = "late_exclusion"
8
10
  LOSS_TO_FOLLOWUP_ACTION = "submit_loss_to_followup"
9
- OFFSCHEDULE_ACTION = "offschedule_action"
11
+ OFFSCHEDULE_DM_REFERRAL_ACTION = "offschedule_dm_referral_action"
10
12
  OFFSCHEDULE_POSTNATAL_ACTION = "offschedule_postnatal_action"
11
13
  OFFSCHEDULE_PREGNANCY_ACTION = "offschedule_pregnancy_action"
14
+ OFFSTUDY_MEDICATION_ACTION = "withdrawal_study_medication_action"
12
15
  OTHER_RX_DISCONTINUATION = "other_treatment_discontinuation"
13
16
  PREGNANCY_NOTIFICATION_ACTION = "pregancy_notification_action"
14
17
  PROTOCOL_DEVIATION_VIOLATION_ACTION = "submit-protocol-deviation-violation"
18
+ REFERRAL = "referral"
15
19
  SAE = "sae"
16
20
  UNBLINDING_REQUEST_ACTION = "unblinding-request"
17
21
  UNBLINDING_REVIEW_ACTION = "unblinding-review"
18
22
  VIOLATION = "protocol_violation"
19
- OFFSTUDY_MEDICATION_ACTION = "withdrawal_study_medication_action"