meta-edc 0.3.15__py3-none-any.whl → 0.3.50__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (333) hide show
  1. meta_ae/action_items.py +2 -2
  2. meta_ae/migrations/0017_auto_20221130_2257.py +12 -7
  3. meta_ae/tests/holidays.csv +1 -1
  4. meta_analytics/README.rst +17 -0
  5. meta_analytics/dataframes/__init__.py +19 -0
  6. meta_analytics/dataframes/constants.py +33 -0
  7. meta_analytics/dataframes/enrolled/__init__.py +1 -0
  8. meta_analytics/dataframes/enrolled/get_glucose_df.py +122 -0
  9. meta_analytics/dataframes/get_eos_df.py +26 -0
  10. meta_analytics/dataframes/get_last_imp_visits_df.py +101 -0
  11. meta_analytics/dataframes/glucose_endpoints/__init__.py +2 -0
  12. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +183 -0
  13. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +531 -0
  14. meta_analytics/dataframes/screening/__init__.py +2 -0
  15. meta_analytics/dataframes/screening/get_glucose_tested_only_df.py +20 -0
  16. meta_analytics/dataframes/screening/get_screening_df.py +163 -0
  17. meta_analytics/dataframes/utils.py +65 -0
  18. meta_analytics/get_tables.py +81 -0
  19. meta_analytics/tables/__init__.py +2 -0
  20. meta_analytics/tables/eligible.py +106 -0
  21. meta_analytics/tables/enrolled/__init__.py +0 -0
  22. meta_analytics/tables/enrolled/glucose.py +28 -0
  23. meta_analytics/tables/has_dm.py +61 -0
  24. meta_analytics/tests/__init__.py +0 -0
  25. meta_analytics/tests/test_endpoints_by_date.py +94 -0
  26. meta_auth/auth_objects.py +22 -0
  27. meta_auth/auths.py +18 -3
  28. meta_consent/action_items.py +18 -1
  29. meta_consent/admin/__init__.py +1 -0
  30. meta_consent/admin/subject_consent_v1_ext_admin.py +45 -0
  31. meta_consent/baker_recipes.py +1 -0
  32. meta_consent/consents.py +20 -1
  33. meta_consent/constants.py +1 -0
  34. meta_consent/forms/__init__.py +1 -0
  35. meta_consent/forms/subject_consent_v1_ext_form.py +16 -0
  36. meta_consent/locale/lg/LC_MESSAGES/django.po +69 -0
  37. meta_consent/locale/sw/LC_MESSAGES/django.po +12 -12
  38. meta_consent/migrations/0026_historicalsubjectconsentv1ext_subjectconsentv1ext.py +544 -0
  39. meta_consent/migrations/0027_auto_20250111_0344.py +30 -0
  40. meta_consent/models/__init__.py +1 -0
  41. meta_consent/models/signals.py +18 -0
  42. meta_consent/models/subject_consent_v1_ext.py +29 -0
  43. meta_consent/tests/holidays.csv +1 -1
  44. meta_dashboard/locale/lg/LC_MESSAGES/django.po +30 -0
  45. meta_dashboard/locale/sw/LC_MESSAGES/django.po +11 -2
  46. meta_dashboard/navbars.py +3 -1
  47. meta_dashboard/templates/meta_dashboard/bootstrap3/buttons/eligibility_button.html +1 -1
  48. meta_dashboard/templates/meta_dashboard/bootstrap3/buttons/screening_button.html +1 -1
  49. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard/sidebar.html +24 -0
  50. meta_dashboard/templates/meta_dashboard/bootstrap3/subject/dashboard.html +3 -0
  51. meta_dashboard/templatetags/meta_dashboard_extras.py +1 -1
  52. meta_dashboard/tests/holidays.csv +1 -1
  53. meta_dashboard/tests/urls.py +0 -1
  54. meta_dashboard/view_utils/__init__.py +6 -0
  55. meta_dashboard/view_utils/subject_screening_button.py +2 -2
  56. meta_dashboard/views/subject/dashboard/dashboard_view.py +38 -0
  57. meta_edc/__init__.py +7 -0
  58. meta_edc/celery.py +4 -13
  59. meta_edc/celery_live.py +18 -0
  60. meta_edc/celery_uat.py +24 -0
  61. meta_edc/management/commands/update_forms_reference.py +6 -2
  62. meta_edc/migrations/__init__.py +0 -0
  63. meta_edc/navbars.py +2 -1
  64. meta_edc/settings/debug.py +10 -2
  65. meta_edc/settings/defaults.py +58 -43
  66. meta_edc/templates/meta_edc/bootstrap3/home.html +5 -2
  67. meta_edc/tests/tests/test_endpoints.py +2 -0
  68. meta_edc/urls.py +4 -1
  69. meta_edc/wsgi.py +1 -1
  70. meta_edc/wsgi_live.py +1 -1
  71. meta_edc/wsgi_uat.py +1 -1
  72. meta_edc-0.3.50.dist-info/AUTHORS +0 -0
  73. meta_edc-0.3.50.dist-info/METADATA +766 -0
  74. {meta_edc-0.3.15.dist-info → meta_edc-0.3.50.dist-info}/RECORD +316 -127
  75. {meta_edc-0.3.15.dist-info → meta_edc-0.3.50.dist-info}/WHEEL +1 -1
  76. {meta_edc-0.3.15.dist-info → meta_edc-0.3.50.dist-info}/top_level.txt +1 -0
  77. meta_pharmacy/admin/__init__.py +2 -0
  78. meta_pharmacy/admin/rx_admin.py +75 -0
  79. meta_pharmacy/admin/substitutions_admin.py +67 -0
  80. meta_pharmacy/admin_site.py +9 -0
  81. meta_pharmacy/apps.py +5 -0
  82. meta_pharmacy/constants.py +10 -0
  83. meta_pharmacy/forms/__init__.py +2 -0
  84. meta_pharmacy/forms/rx_form.py +16 -0
  85. meta_pharmacy/forms/substitutions_form.py +54 -0
  86. meta_pharmacy/label_configs.py +30 -0
  87. meta_pharmacy/labels/__init__.py +5 -0
  88. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +62 -0
  89. meta_pharmacy/labels/draw_label_for_subject_with_code128.py +14 -0
  90. meta_pharmacy/labels/draw_label_with_test_data.py +26 -0
  91. meta_pharmacy/labels/label_data.py +14 -0
  92. meta_pharmacy/labels/print_sheets.py +97 -0
  93. meta_pharmacy/list_data.py +8 -0
  94. meta_pharmacy/management/__init__.py +0 -0
  95. meta_pharmacy/management/commands/__init__.py +0 -0
  96. meta_pharmacy/management/commands/update_initial_pharmacy_data.py +10 -0
  97. meta_pharmacy/migrations/0002_initial.py +695 -0
  98. meta_pharmacy/migrations/0003_auto_20240909_2335.py +64 -0
  99. meta_pharmacy/migrations/0004_alter_historicalsubstitutions_report_datetime_and_more.py +23 -0
  100. meta_pharmacy/migrations/0005_auto_20240911_0352.py +17 -0
  101. meta_pharmacy/migrations/0006_lotnumber_label.py +289 -0
  102. meta_pharmacy/migrations/0007_lotnumber_medication.py +24 -0
  103. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +390 -0
  104. meta_pharmacy/migrations/0009_remove_historicalrx_slug.py +17 -0
  105. meta_pharmacy/models/__init__.py +3 -0
  106. meta_pharmacy/models/label_data.py +38 -0
  107. meta_pharmacy/models/rx.py +18 -0
  108. meta_pharmacy/models/rx_label.py +39 -0
  109. meta_pharmacy/models/substitutions.py +88 -0
  110. meta_pharmacy/urls.py +8 -0
  111. meta_pharmacy/utils/__init__.py +1 -0
  112. meta_pharmacy/utils/update_initial_pharmacy_data.py +146 -0
  113. meta_prn/action_items.py +9 -1
  114. meta_prn/admin/pregnancy_notification_admin.py +6 -2
  115. meta_prn/migrations/0034_auto_20220630_1110.py +3 -3
  116. meta_prn/migrations/0035_auto_20220630_1140.py +59 -56
  117. meta_prn/tests/tests/test_dm_referral.py +3 -6
  118. meta_reports/__init__.py +1 -0
  119. meta_reports/admin/__init__.py +15 -0
  120. meta_reports/admin/dbviews/__init__.py +14 -0
  121. meta_reports/admin/dbviews/glucose_summary_admin.py +116 -0
  122. meta_reports/admin/dbviews/imp_substitutions_admin.py +101 -0
  123. meta_reports/admin/dbviews/missing_screening_ogtt_admin/__init__.py +2 -0
  124. meta_reports/admin/dbviews/missing_screening_ogtt_admin/note_model_admin.py +53 -0
  125. meta_reports/admin/dbviews/missing_screening_ogtt_admin/unmanaged_model_admin.py +84 -0
  126. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/__init__.py +1 -0
  127. meta_reports/admin/dbviews/on_study_missing_lab_values_admin/unmanaged_model_admin.py +13 -0
  128. meta_reports/admin/dbviews/on_study_missing_values_admin/__init__.py +1 -0
  129. meta_reports/admin/dbviews/on_study_missing_values_admin/unmanaged_model_admin.py +13 -0
  130. meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py +58 -0
  131. meta_reports/admin/dbviews/unattended_three_in_row2_admin.py +47 -0
  132. meta_reports/admin/dbviews/unattended_three_in_row_admin.py +35 -0
  133. meta_reports/admin/dbviews/unattended_two_in_row_admin.py +34 -0
  134. meta_reports/admin/endpoints_admin.py +14 -0
  135. meta_reports/admin/endpoints_all_admin.py +13 -0
  136. meta_reports/admin/last_imp_refill_admin.py +181 -0
  137. meta_reports/admin/list_filters.py +30 -0
  138. meta_reports/admin/modeladmin_mixins.py +112 -0
  139. meta_reports/admin_site.py +5 -0
  140. meta_reports/apps.py +1 -16
  141. meta_reports/forms/__init__.py +1 -0
  142. meta_reports/forms/missing_ogtt_note_form.py +33 -0
  143. meta_reports/management/__init__.py +0 -0
  144. meta_reports/management/commands/__init__.py +0 -0
  145. meta_reports/management/commands/generate_endpoints.py +13 -0
  146. meta_reports/migrations/0001_initial.py +87 -0
  147. meta_reports/migrations/0002_patienthistorymissingbaselinecd4_and_more.py +64 -0
  148. meta_reports/migrations/0003_auto_20240618_0505.py +12 -0
  149. meta_reports/migrations/0004_alter_patienthistorymissingbaselinecd4_table.py +17 -0
  150. meta_reports/migrations/0005_endpoints.py +47 -0
  151. meta_reports/migrations/0006_endpoints_baseline_datetime.py +18 -0
  152. meta_reports/migrations/0007_alter_endpoints_endpoint_label_and_more.py +43 -0
  153. meta_reports/migrations/0008_alter_endpoints_endpoint_label.py +18 -0
  154. meta_reports/migrations/0009_alter_endpoints_options.py +21 -0
  155. meta_reports/migrations/0010_alter_patienthistorymissingbaselinecd4_options_and_more.py +49 -0
  156. meta_reports/migrations/0011_auto_20240813_0156.py +54 -0
  157. meta_reports/migrations/0012_auto_20240813_1516.py +48 -0
  158. meta_reports/migrations/0013_auto_20240813_1516.py +48 -0
  159. meta_reports/migrations/0014_auto_20240813_1517.py +48 -0
  160. meta_reports/migrations/0015_alter_endpoints_site.py +22 -0
  161. meta_reports/migrations/0016_missingscreeningogtt.py +47 -0
  162. meta_reports/migrations/0017_auto_20240819_1711.py +166 -0
  163. meta_reports/migrations/0018_auto_20240819_1713.py +54 -0
  164. meta_reports/migrations/0019_auto_20240819_1721.py +54 -0
  165. meta_reports/migrations/0020_auto_20240819_1811.py +54 -0
  166. meta_reports/migrations/0021_auto_20240819_1817.py +54 -0
  167. meta_reports/migrations/0022_auto_20240819_1832.py +54 -0
  168. meta_reports/migrations/0023_endpoints_meta_report_subject_a56b22_idx.py +20 -0
  169. meta_reports/migrations/0024_glucosesummary.py +38 -0
  170. meta_reports/migrations/0025_auto_20240822_0115.py +87 -0
  171. meta_reports/migrations/0026_auto_20240822_0120.py +54 -0
  172. meta_reports/migrations/0027_auto_20240822_0140.py +54 -0
  173. meta_reports/migrations/0028_alter_glucosesummary_options.py +22 -0
  174. meta_reports/migrations/0029_auto_20240822_0149.py +54 -0
  175. meta_reports/migrations/0030_auto_20240822_1637.py +54 -0
  176. meta_reports/migrations/0031_endpointsproxy.py +25 -0
  177. meta_reports/migrations/0032_alter_endpointsproxy_options.py +21 -0
  178. meta_reports/migrations/0033_auto_20240823_0012.py +54 -0
  179. meta_reports/migrations/0034_auto_20240823_1642.py +54 -0
  180. meta_reports/migrations/0035_historicalmissingogttnote_missingogttnote.py +457 -0
  181. meta_reports/migrations/0036_historicalmissingogttnote_fasting_and_more.py +86 -0
  182. meta_reports/migrations/0037_historicalmissingogttnote_result_status_and_more.py +51 -0
  183. meta_reports/migrations/0038_alter_historicalmissingogttnote_fasting_and_more.py +33 -0
  184. meta_reports/migrations/0039_onstudymissingvalues.py +44 -0
  185. meta_reports/migrations/0040_auto_20240824_0412.py +282 -0
  186. meta_reports/migrations/0041_auto_20240828_2229.py +14 -0
  187. meta_reports/migrations/0042_onstudymissinglabvalues.py +43 -0
  188. meta_reports/migrations/0043_auto_20240828_2309.py +88 -0
  189. meta_reports/migrations/0044_auto_20240828_2323.py +93 -0
  190. meta_reports/migrations/0045_auto_20240829_0248.py +54 -0
  191. meta_reports/migrations/0046_auto_20240829_0250.py +54 -0
  192. meta_reports/migrations/0047_impsubstitutions.py +56 -0
  193. meta_reports/migrations/0048_auto_20240909_2338.py +48 -0
  194. meta_reports/migrations/0049_auto_20240911_0327.py +54 -0
  195. meta_reports/migrations/0050_alter_endpoints_created.py +19 -0
  196. meta_reports/migrations/0051_remove_endpoints_baseline_datetime_and_more.py +40 -0
  197. meta_reports/migrations/0052_lastimpvisit.py +57 -0
  198. meta_reports/migrations/0053_rename_lastimpvisit_lastimprefill_and_more.py +31 -0
  199. meta_reports/models/__init__.py +16 -0
  200. meta_reports/models/dbviews/README +14 -0
  201. meta_reports/models/dbviews/__init__.py +9 -0
  202. meta_reports/models/dbviews/glucose_summary/__init__.py +2 -0
  203. meta_reports/models/dbviews/glucose_summary/unmanaged_model.py +35 -0
  204. meta_reports/models/dbviews/glucose_summary/view_definition.py +28 -0
  205. meta_reports/models/dbviews/imp_substitutions/__init__.py +1 -0
  206. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +41 -0
  207. meta_reports/models/dbviews/imp_substitutions/view_definition.py +21 -0
  208. meta_reports/models/dbviews/missing_screening_ogtt/__init__.py +2 -0
  209. meta_reports/models/dbviews/missing_screening_ogtt/note_model.py +57 -0
  210. meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py +41 -0
  211. meta_reports/models/dbviews/missing_screening_ogtt/view_definition.py +20 -0
  212. meta_reports/models/dbviews/on_study_missing_lab_values/__init__.py +1 -0
  213. meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py +53 -0
  214. meta_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py +20 -0
  215. meta_reports/models/dbviews/on_study_missing_lab_values/view_definition.py +17 -0
  216. meta_reports/models/dbviews/on_study_missing_values/__init__.py +1 -0
  217. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +54 -0
  218. meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py +20 -0
  219. meta_reports/models/dbviews/on_study_missing_values/view_definition.py +17 -0
  220. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py +1 -0
  221. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/unmanaged_model.py +31 -0
  222. meta_reports/models/dbviews/patient_history_missing_baseline_cd4/view_definition.py +21 -0
  223. meta_reports/models/dbviews/unattended_three_in_row/__init__.py +1 -0
  224. meta_reports/models/dbviews/unattended_three_in_row/unmanaged_model.py +29 -0
  225. meta_reports/models/dbviews/unattended_three_in_row/view_definition.py +31 -0
  226. meta_reports/models/dbviews/unattended_three_in_row2/__init__.py +1 -0
  227. meta_reports/models/dbviews/unattended_three_in_row2/unmanaged_model.py +29 -0
  228. meta_reports/models/dbviews/unattended_three_in_row2/view_definition.py +50 -0
  229. meta_reports/models/dbviews/unattended_two_in_row/__init__.py +1 -0
  230. meta_reports/models/dbviews/unattended_two_in_row/unmanaged_model.py +27 -0
  231. meta_reports/models/dbviews/unattended_two_in_row/view_definition.py +30 -0
  232. meta_reports/models/endpoints.py +31 -0
  233. meta_reports/models/endpoints_proxy.py +11 -0
  234. meta_reports/models/last_imp_refill.py +34 -0
  235. meta_reports/tasks.py +12 -0
  236. meta_reports/templates/meta_reports/columns/subject_identifier_column.html +1 -0
  237. meta_reports/templates/meta_reports/endpoints_all_change_list_note.html +12 -0
  238. meta_reports/templates/meta_reports/endpoints_change_list_note.html +12 -0
  239. meta_reports/tests/test_sql_gen.py +5 -0
  240. meta_reports/urls.py +8 -0
  241. meta_reports/utils.py +0 -0
  242. meta_screening/admin/subject_screening_admin.py +1 -0
  243. meta_screening/migrations/0067_alter_historicalscreeningpartone_report_datetime_and_more.py +84 -0
  244. meta_screening/tests/holidays.csv +1 -1
  245. meta_screening/tests/meta_test_case_mixin.py +15 -0
  246. meta_sites/tests/test_sites.py +1 -1
  247. meta_subject/action_items.py +2 -2
  248. meta_subject/admin/__init__.py +2 -1
  249. meta_subject/admin/birth_outcome_admin.py +2 -0
  250. meta_subject/admin/blood_results/__init__.py +1 -1
  251. meta_subject/admin/blood_results/{blood_results_lipid_admin.py → blood_results_lipids_admin.py} +7 -7
  252. meta_subject/admin/diabetes/__init__.py +1 -1
  253. meta_subject/admin/diabetes/dm_endpoint_admin.py +35 -0
  254. meta_subject/admin/glucose_fbg_admin.py +4 -0
  255. meta_subject/admin/other_arv_regimens_admin.py +2 -0
  256. meta_subject/admin/study_medication_admin.py +10 -0
  257. meta_subject/form_validators/__init__.py +1 -1
  258. meta_subject/form_validators/dm_endpoint_form_validator.py +35 -0
  259. meta_subject/forms/__init__.py +2 -2
  260. meta_subject/forms/blood_results/__init__.py +1 -1
  261. meta_subject/forms/blood_results/{blood_results_lipid_form.py → blood_results_lipids_form.py} +5 -5
  262. meta_subject/forms/diabetes/__init__.py +1 -2
  263. meta_subject/forms/diabetes/dm_endpoint_form.py +13 -0
  264. meta_subject/forms/study_medication_form.py +35 -0
  265. meta_subject/locale/lg/LC_MESSAGES/django.po +470 -0
  266. meta_subject/locale/sw/LC_MESSAGES/django.po +191 -89
  267. meta_subject/metadata_rules/metadata_rules.py +7 -0
  268. meta_subject/metadata_rules/predicates.py +45 -8
  269. meta_subject/migrations/0107_auto_20220415_0043.py +28 -22
  270. meta_subject/migrations/0126_auto_20220719_2142.py +4 -4
  271. meta_subject/migrations/0131_auto_20220722_0411.py +28 -23
  272. meta_subject/migrations/0132_auto_20220722_1825.py +10 -6
  273. meta_subject/migrations/0135_auto_20220722_2212.py +39 -35
  274. meta_subject/migrations/0150_auto_20220914_0039.py +15 -11
  275. meta_subject/migrations/0207_alter_historicalphysicalexam_waist_circumference_and_more.py +46 -0
  276. meta_subject/migrations/0208_birthoutcomes_crf_status_and_more.py +62 -0
  277. meta_subject/migrations/0209_remove_historicaldmdxresult_dm_diagnosis_and_more.py +37 -0
  278. meta_subject/migrations/0210_remove_dmdxresult_dm_diagnosis_and_more.py +123 -0
  279. meta_subject/migrations/0211_dmendpoint_endpoint_reached_and_more.py +45 -0
  280. meta_subject/migrations/0212_auto_20240827_2222.py +23 -0
  281. meta_subject/migrations/0213_rename_bloodresultslipid_bloodresultslipids_and_more.py +35 -0
  282. meta_subject/migrations/0214_historicalstudymedication_stock_codes_and_more.py +44 -0
  283. meta_subject/migrations/0215_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
  284. meta_subject/model_mixins/arv_history_model_mixin.py +3 -3
  285. meta_subject/models/__init__.py +3 -2
  286. meta_subject/models/birth_outcomes.py +6 -1
  287. meta_subject/models/blood_results/__init__.py +1 -1
  288. meta_subject/models/blood_results/{blood_results_lipid.py → blood_results_lipids.py} +3 -3
  289. meta_subject/models/diabetes/__init__.py +1 -2
  290. meta_subject/models/diabetes/dm_endpoint.py +61 -0
  291. meta_subject/models/glucose.py +4 -1
  292. meta_subject/models/physical_exam.py +1 -0
  293. meta_subject/models/signals.py +19 -0
  294. meta_subject/models/todo.txt +1 -1
  295. meta_subject/static/meta_subject/slider.css +1 -1
  296. meta_subject/templates/meta_subject/endpoint_review_instructions.html +1 -1
  297. meta_subject/templates/meta_subject/widgets/slider.html +0 -1
  298. meta_subject/tests/holidays.csv +1 -1
  299. meta_subject/tests/tests/test_medication_adherence.py +5 -1
  300. meta_subject/tests/tests/test_metadata_rules.py +2 -2
  301. meta_subject/tests/tests/test_mnsi.py +212 -121
  302. meta_subject/tests/tests/test_sf12.py +0 -12
  303. meta_visit_schedule/constants.py +4 -0
  304. meta_visit_schedule/tests/tests/test_schedule.py +4 -0
  305. meta_visit_schedule/visit_schedules/phase_three/crfs.py +75 -13
  306. meta_visit_schedule/visit_schedules/phase_three/requisitions.py +12 -0
  307. meta_visit_schedule/visit_schedules/phase_three/schedule.py +65 -2
  308. meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py +1 -1
  309. tests/etc/randomization_list.csv +1 -1
  310. {meta_edc/tests → tests}/etc/randomization_list_phase_three.csv +4 -4
  311. tests/holidays.csv +1 -1
  312. {meta_edc/tests → tests}/test_settings.py +16 -6
  313. meta_edc/tests/etc/user-aes-local.key +0 -1
  314. meta_edc/tests/etc/user-aes-restricted.key +0 -0
  315. meta_edc/tests/etc/user-rsa-local-private.pem +0 -27
  316. meta_edc/tests/etc/user-rsa-local-public.pem +0 -9
  317. meta_edc/tests/etc/user-rsa-restricted-private.pem +0 -27
  318. meta_edc/tests/etc/user-rsa-restricted-public.pem +0 -9
  319. meta_edc/tests/etc/user-salt-local.key +0 -0
  320. meta_edc/tests/etc/user-salt-restricted.key +0 -0
  321. meta_edc-0.3.15.dist-info/METADATA +0 -88
  322. meta_reports/tests/holidays.csv +0 -15
  323. meta_subject/admin/diabetes/dm_diagnosis_admin.py +0 -89
  324. meta_subject/form_validators/dm_diagnosis_form_validator.py +0 -38
  325. meta_subject/form_validators/dm_dx_result_form_validator.py +0 -7
  326. meta_subject/forms/diabetes/dm_diagnosis_form.py +0 -13
  327. meta_subject/forms/diabetes/dm_dx_result_form.py +0 -11
  328. meta_subject/models/diabetes/dm_diagnosis.py +0 -50
  329. meta_subject/models/diabetes/dm_dx_result.py +0 -70
  330. /meta_edc-0.3.15.dist-info/AUTHORS → /meta_analytics/__init__.py +0 -0
  331. /meta_pharmacy/models.py → /meta_analytics/constants.py +0 -0
  332. /meta_reports/models.py → /meta_analytics/notebooks/cleaning/__init__.py +0 -0
  333. {meta_edc-0.3.15.dist-info → meta_edc-0.3.50.dist-info}/LICENSE +0 -0
@@ -8,7 +8,7 @@ msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: PACKAGE VERSION\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2023-09-07 09:34-0500\n"
11
+ "POT-Creation-Date: 2024-11-19 23:35+0300\n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,352 +18,454 @@ msgstr ""
18
18
  "Content-Transfer-Encoding: 8bit\n"
19
19
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
20
20
 
21
- #: choices.py:38 choices.py:47
21
+ #: meta_subject/admin/health_economics/health_economics_update_admin.py:18
22
+ msgid ""
23
+ "We want to learn about the household and we use these\n"
24
+ " questions to get an understanding of wealth and opportunities\n"
25
+ " in the community. A person or persons (people/ members) who share\n"
26
+ " the same kitchen (pot), live together, and run the household\n"
27
+ " expenditure from the same income is known as a 'household'. "
28
+ "Household\n"
29
+ " members should be identified on the basis that they shared a place "
30
+ "of\n"
31
+ " living together most of time for the past one year. When it is\n"
32
+ " difficult to demarcate 'most of the time', living together for the\n"
33
+ " past six months or more should be used to find out whether or not\n"
34
+ " the person is a household member. For polygamous households, the\n"
35
+ " household head should think about all the households and respond\n"
36
+ " with respect to all households."
37
+ msgstr ""
38
+
39
+ #: meta_subject/admin/health_economics/health_economics_update_admin.py:58
40
+ msgid ""
41
+ "Before asking about household income, we would first liketo know about the "
42
+ "number of rooms in the home and number of beds. "
43
+ msgstr ""
44
+
45
+ #: meta_subject/admin/health_economics/health_economics_update_admin.py:72
46
+ msgid ""
47
+ "Now, I will ask about income for the household from paid workor other "
48
+ "sources. Please think of the total income for the household, including "
49
+ "income from all household members as defined above. I know it may be "
50
+ "difficult to estimate, but please do try to give amounts as accurately as "
51
+ "possible. Please note that all information will be kept strictly "
52
+ "confidential. This information is important to assess overall health and "
53
+ "well-being of people in your household, compared to other similar households."
54
+ msgstr ""
55
+
56
+ #: meta_subject/choices.py:39 meta_subject/choices.py:48
22
57
  msgid "Working"
23
58
  msgstr ""
24
59
 
25
- #: choices.py:39 choices.py:48
60
+ #: meta_subject/choices.py:40 meta_subject/choices.py:49
26
61
  msgid "Studying"
27
62
  msgstr ""
28
63
 
29
- #: choices.py:40 choices.py:49
64
+ #: meta_subject/choices.py:41 meta_subject/choices.py:50
30
65
  msgid "Caring for children"
31
66
  msgstr ""
32
67
 
33
- #: choices.py:41
68
+ #: meta_subject/choices.py:42
34
69
  msgid "Other, please specify"
35
70
  msgstr ""
36
71
 
37
- #: choices.py:46 choices.py:58 choices.py:65 choices.py:80 choices.py:110
38
- #: choices.py:132 choices.py:159 choices.py:167 choices.py:212
72
+ #: meta_subject/choices.py:47 meta_subject/choices.py:59
73
+ #: meta_subject/choices.py:66 meta_subject/choices.py:81
74
+ #: meta_subject/choices.py:88 meta_subject/choices.py:118
75
+ #: meta_subject/choices.py:140 meta_subject/choices.py:167
76
+ #: meta_subject/choices.py:175 meta_subject/choices.py:220
39
77
  msgid "Not applicable"
40
78
  msgstr ""
41
79
 
42
- #: choices.py:50
80
+ #: meta_subject/choices.py:51
43
81
  msgid "House maintenance"
44
82
  msgstr ""
45
83
 
46
- #: choices.py:51
84
+ #: meta_subject/choices.py:52
47
85
  msgid "Nothing"
48
86
  msgstr ""
49
87
 
50
- #: choices.py:52 choices.py:202
88
+ #: meta_subject/choices.py:53 meta_subject/choices.py:210
51
89
  msgid "Other, specify"
52
90
  msgstr ""
53
91
 
54
- #: choices.py:56
92
+ #: meta_subject/choices.py:57
55
93
  msgid "Study participant"
56
94
  msgstr ""
57
95
 
58
- #: choices.py:57 choices.py:125 choices.py:211
96
+ #: meta_subject/choices.py:58 meta_subject/choices.py:133
97
+ #: meta_subject/choices.py:219
59
98
  msgid "Other"
60
99
  msgstr ""
61
100
 
62
- #: choices.py:62
101
+ #: meta_subject/choices.py:63
63
102
  msgid "At home"
64
103
  msgstr ""
65
104
 
66
- #: choices.py:63
105
+ #: meta_subject/choices.py:64
67
106
  msgid "Hospital / Clinic"
68
107
  msgstr ""
69
108
 
70
- #: choices.py:64
109
+ #: meta_subject/choices.py:65
71
110
  msgid "Other location, specify"
72
111
  msgstr ""
73
112
 
74
- #: choices.py:69
113
+ #: meta_subject/choices.py:70
75
114
  msgid "Excellent"
76
115
  msgstr ""
77
116
 
78
- #: choices.py:70
117
+ #: meta_subject/choices.py:71
79
118
  msgid "Very good"
80
119
  msgstr ""
81
120
 
82
- #: choices.py:71
121
+ #: meta_subject/choices.py:72
83
122
  msgid "Good"
84
123
  msgstr ""
85
124
 
86
- #: choices.py:72
125
+ #: meta_subject/choices.py:73
87
126
  msgid "Fair"
88
127
  msgstr ""
89
128
 
90
- #: choices.py:73
129
+ #: meta_subject/choices.py:74
91
130
  msgid "Poor"
92
131
  msgstr ""
93
132
 
94
- #: choices.py:79
133
+ #: meta_subject/choices.py:80
95
134
  msgid "Other, specify below ..."
96
135
  msgstr ""
97
136
 
98
- #: choices.py:84 choices.py:138
137
+ #: meta_subject/choices.py:86
138
+ msgid "No. A repeat FBG will be scheduled"
139
+ msgstr ""
140
+
141
+ #: meta_subject/choices.py:92 meta_subject/choices.py:146
99
142
  msgid "All of the time"
100
143
  msgstr ""
101
144
 
102
- #: choices.py:85 choices.py:139
145
+ #: meta_subject/choices.py:93 meta_subject/choices.py:147
103
146
  msgid "Most of the time"
104
147
  msgstr ""
105
148
 
106
- #: choices.py:86
149
+ #: meta_subject/choices.py:94
107
150
  msgid "A good bit of the time"
108
151
  msgstr ""
109
152
 
110
- #: choices.py:87 choices.py:140
153
+ #: meta_subject/choices.py:95 meta_subject/choices.py:148
111
154
  msgid "Some of the time"
112
155
  msgstr ""
113
156
 
114
- #: choices.py:88 choices.py:141
157
+ #: meta_subject/choices.py:96 meta_subject/choices.py:149
115
158
  msgid "A little of the time"
116
159
  msgstr ""
117
160
 
118
- #: choices.py:89 choices.py:142
161
+ #: meta_subject/choices.py:97 meta_subject/choices.py:150
119
162
  msgid "None of the time"
120
163
  msgstr ""
121
164
 
122
- #: choices.py:94
165
+ #: meta_subject/choices.py:102
123
166
  msgid "Live birth at term"
124
167
  msgstr ""
125
168
 
126
- #: choices.py:95
169
+ #: meta_subject/choices.py:103
127
170
  msgid "Live birth preterm"
128
171
  msgstr ""
129
172
 
130
- #: choices.py:96
173
+ #: meta_subject/choices.py:104
131
174
  msgid "Stillbirth"
132
175
  msgstr ""
133
176
 
134
- #: choices.py:97
177
+ #: meta_subject/choices.py:105
135
178
  msgid "Miscarriage"
136
179
  msgstr ""
137
180
 
138
- #: choices.py:101
181
+ #: meta_subject/choices.py:109
139
182
  msgid "Study appointment"
140
183
  msgstr ""
141
184
 
142
- #: choices.py:102
185
+ #: meta_subject/choices.py:110
143
186
  msgid "Other routine appointment"
144
187
  msgstr ""
145
188
 
146
- #: choices.py:103
189
+ #: meta_subject/choices.py:111
147
190
  msgid "Unschedule visit"
148
191
  msgstr ""
149
192
 
150
- #: choices.py:104
193
+ #: meta_subject/choices.py:112
151
194
  msgid "Other reason, specify below ..."
152
195
  msgstr ""
153
196
 
154
- #: choices.py:108 choices.py:109
197
+ #: meta_subject/choices.py:116 meta_subject/choices.py:117
155
198
  #, python-format
156
199
  msgid "Grade %(num)s"
157
200
  msgstr ""
158
201
 
159
- #: choices.py:114
202
+ #: meta_subject/choices.py:122
160
203
  msgid "YES, limited a lot"
161
204
  msgstr ""
162
205
 
163
- #: choices.py:115
206
+ #: meta_subject/choices.py:123
164
207
  msgid "YES, limited a little"
165
208
  msgstr ""
166
209
 
167
- #: choices.py:116
210
+ #: meta_subject/choices.py:124
168
211
  msgid "NO, not at all limited"
169
212
  msgstr ""
170
213
 
171
- #: choices.py:120
214
+ #: meta_subject/choices.py:128
172
215
  msgid "Hospital notes"
173
216
  msgstr ""
174
217
 
175
- #: choices.py:121
218
+ #: meta_subject/choices.py:129
176
219
  msgid "Outpatient cards"
177
220
  msgstr ""
178
221
 
179
- #: choices.py:122
222
+ #: meta_subject/choices.py:130
180
223
  msgid "Patient"
181
224
  msgstr ""
182
225
 
183
- #: choices.py:123
226
+ #: meta_subject/choices.py:131
184
227
  msgid "Collateral History from relative/guardian"
185
228
  msgstr ""
186
229
 
187
- #: choices.py:124
230
+ #: meta_subject/choices.py:132
188
231
  msgid "Not applicable (if missed)"
189
232
  msgstr ""
190
233
 
191
- #: choices.py:131
234
+ #: meta_subject/choices.py:139
192
235
  msgid "Hospital / Clinic records"
193
236
  msgstr ""
194
237
 
195
- #: choices.py:146
238
+ #: meta_subject/choices.py:154
196
239
  msgid "No retinopathy"
197
240
  msgstr ""
198
241
 
199
- #: choices.py:147
242
+ #: meta_subject/choices.py:155
200
243
  msgid "Background retinopathy"
201
244
  msgstr ""
202
245
 
203
- #: choices.py:148
246
+ #: meta_subject/choices.py:156
204
247
  msgid "Pre-proliferative retinopathy"
205
248
  msgstr ""
206
249
 
207
- #: choices.py:149
250
+ #: meta_subject/choices.py:157
208
251
  msgid "Proliferative retinopathy"
209
252
  msgstr ""
210
253
 
211
- #: choices.py:150
254
+ #: meta_subject/choices.py:158
212
255
  msgid "Maculopathy"
213
256
  msgstr ""
214
257
 
215
- #: choices.py:151 choices.py:173 choices.py:180 choices.py:234
258
+ #: meta_subject/choices.py:159 meta_subject/choices.py:181
259
+ #: meta_subject/choices.py:188 meta_subject/choices.py:242
216
260
  msgid "Exam not performed"
217
261
  msgstr ""
218
262
 
219
- #: choices.py:155
263
+ #: meta_subject/choices.py:163
220
264
  msgid "No complications"
221
265
  msgstr ""
222
266
 
223
- #: choices.py:156
267
+ #: meta_subject/choices.py:164
224
268
  msgid "Complications with full recovery"
225
269
  msgstr ""
226
270
 
227
- #: choices.py:157
271
+ #: meta_subject/choices.py:165
228
272
  msgid "Complications with ongoing recovery"
229
273
  msgstr ""
230
274
 
231
- #: choices.py:158
275
+ #: meta_subject/choices.py:166
232
276
  msgid "Maternal mortality"
233
277
  msgstr ""
234
278
 
235
- #: choices.py:163
279
+ #: meta_subject/choices.py:171
236
280
  msgid "Own cash"
237
281
  msgstr ""
238
282
 
239
- #: choices.py:164
283
+ #: meta_subject/choices.py:172
240
284
  msgid "Insurance"
241
285
  msgstr ""
242
286
 
243
- #: choices.py:165
287
+ #: meta_subject/choices.py:173
244
288
  msgid "Relative of others paying"
245
289
  msgstr ""
246
290
 
247
- #: choices.py:166
291
+ #: meta_subject/choices.py:174
248
292
  msgid "Free drugs from the pharmacy"
249
293
  msgstr ""
250
294
 
251
- #: choices.py:171 choices.py:177
295
+ #: meta_subject/choices.py:179 meta_subject/choices.py:185
252
296
  msgid "Present"
253
297
  msgstr ""
254
298
 
255
- #: choices.py:172 choices.py:179
299
+ #: meta_subject/choices.py:180 meta_subject/choices.py:187
256
300
  msgid "Absent"
257
301
  msgstr ""
258
302
 
259
- #: choices.py:178
303
+ #: meta_subject/choices.py:186
260
304
  msgid "Present with reinforcement"
261
305
  msgstr ""
262
306
 
263
- #: choices.py:185
307
+ #: meta_subject/choices.py:193
264
308
  msgid "New"
265
309
  msgstr ""
266
310
 
267
- #: choices.py:186
311
+ #: meta_subject/choices.py:194
268
312
  msgid "Open. Some information is still pending."
269
313
  msgstr ""
270
314
 
271
- #: choices.py:187
315
+ #: meta_subject/choices.py:195
272
316
  msgid "Closed. This report is complete"
273
317
  msgstr ""
274
318
 
275
- #: choices.py:192
319
+ #: meta_subject/choices.py:200
276
320
  msgid "Bus"
277
321
  msgstr ""
278
322
 
279
- #: choices.py:193
323
+ #: meta_subject/choices.py:201
280
324
  msgid "Train"
281
325
  msgstr ""
282
326
 
283
- #: choices.py:194
327
+ #: meta_subject/choices.py:202
284
328
  msgid "Ambulance"
285
329
  msgstr ""
286
330
 
287
- #: choices.py:195
331
+ #: meta_subject/choices.py:203
288
332
  msgid "Private taxi"
289
333
  msgstr ""
290
334
 
291
- #: choices.py:196
335
+ #: meta_subject/choices.py:204
292
336
  msgid "Own bicycle"
293
337
  msgstr ""
294
338
 
295
- #: choices.py:197
339
+ #: meta_subject/choices.py:205
296
340
  msgid "Hired motorbike"
297
341
  msgstr ""
298
342
 
299
- #: choices.py:198
343
+ #: meta_subject/choices.py:206
300
344
  msgid "Own car"
301
345
  msgstr ""
302
346
 
303
- #: choices.py:199
347
+ #: meta_subject/choices.py:207
304
348
  msgid "Own motorbike"
305
349
  msgstr ""
306
350
 
307
- #: choices.py:200
351
+ #: meta_subject/choices.py:208
308
352
  msgid "Hired bicycle"
309
353
  msgstr ""
310
354
 
311
- #: choices.py:201
355
+ #: meta_subject/choices.py:209
312
356
  msgid "Foot"
313
357
  msgstr ""
314
358
 
315
- #: choices.py:207
359
+ #: meta_subject/choices.py:215
316
360
  msgid "Patient unwell (outpatient)"
317
361
  msgstr ""
318
362
 
319
- #: choices.py:208
363
+ #: meta_subject/choices.py:216
320
364
  msgid "Patient hospitalised"
321
365
  msgstr ""
322
366
 
323
- #: choices.py:209
367
+ #: meta_subject/choices.py:217
324
368
  msgid "Routine appointment (non-study)"
325
369
  msgstr ""
326
370
 
327
- #: choices.py:210
371
+ #: meta_subject/choices.py:218
328
372
  msgid "Recurrence of symptoms"
329
373
  msgstr ""
330
374
 
331
- #: choices.py:216
375
+ #: meta_subject/choices.py:224
332
376
  msgid "Scheduled visit"
333
377
  msgstr ""
334
378
 
335
- #: choices.py:217
379
+ #: meta_subject/choices.py:225
336
380
  msgid "Unscheduled visit"
337
381
  msgstr ""
338
382
 
339
- #: choices.py:218
383
+ #: meta_subject/choices.py:226
340
384
  msgid "Missed visit"
341
385
  msgstr ""
342
386
 
343
- #: choices.py:221
387
+ #: meta_subject/choices.py:229
344
388
  msgid "Estimated"
345
389
  msgstr ""
346
390
 
347
- #: choices.py:221
391
+ #: meta_subject/choices.py:229
348
392
  msgid "Measured"
349
393
  msgstr ""
350
394
 
351
- #: choices.py:224
395
+ #: meta_subject/choices.py:232
352
396
  msgid "Not at all"
353
397
  msgstr ""
354
398
 
355
- #: choices.py:225
399
+ #: meta_subject/choices.py:233
356
400
  msgid "A little bit"
357
401
  msgstr ""
358
402
 
359
- #: choices.py:226
403
+ #: meta_subject/choices.py:234
360
404
  msgid "Moderately"
361
405
  msgstr ""
362
406
 
363
- #: choices.py:227
407
+ #: meta_subject/choices.py:235
364
408
  msgid "Quite a bit"
365
409
  msgstr ""
366
410
 
367
- #: choices.py:228
411
+ #: meta_subject/choices.py:236
368
412
  msgid "Extremely"
369
413
  msgstr ""
414
+
415
+ #: meta_subject/models/health_economics/health_economics_update.py:20
416
+ msgid ""
417
+ "Thinking over the last 12 months, can you tell me what the average earnings "
418
+ "of the household have been?"
419
+ msgstr ""
420
+
421
+ #: meta_subject/models/health_economics/health_economics_update.py:36
422
+ msgid "Are you the household head?"
423
+ msgstr ""
424
+
425
+ #: meta_subject/models/health_economics/health_economics_update.py:40
426
+ msgid ""
427
+ "By head of the household we mean the main decision maker in the household. "
428
+ "The head can be either male or female. If two people are equal decision-"
429
+ "makers, take the older person."
430
+ msgstr ""
431
+
432
+ #: meta_subject/models/health_economics/health_economics_update.py:48
433
+ msgid "If No, what is your relationship to the household head?"
434
+ msgstr ""
435
+
436
+ #: meta_subject/models/health_economics/health_economics_update.py:52
437
+ msgid "Not applicable if patient is head of household"
438
+ msgstr ""
439
+
440
+ #: meta_subject/models/health_economics/health_economics_update.py:56
441
+ msgid "If OTHER relationship, specify ..."
442
+ msgstr ""
443
+
444
+ #: meta_subject/models/health_economics/health_economics_update.py:61
445
+ msgid ""
446
+ "How many rooms does your dwelling have in total, without counting the "
447
+ "bathrooms/ toilets or hallways/passageways?"
448
+ msgstr ""
449
+
450
+ #: meta_subject/models/health_economics/health_economics_update.py:68
451
+ msgid "How many rooms are used for sleeping in your dwelling?"
452
+ msgstr ""
453
+
454
+ #: meta_subject/models/health_economics/health_economics_update.py:73
455
+ msgid "How many beds does your dwelling have in total?"
456
+ msgstr ""
457
+
458
+ #: meta_subject/models/health_economics/health_economics_update.py:79
459
+ msgid ""
460
+ "Outside of this household, how many other people depend on this household's "
461
+ "income?"
462
+ msgstr ""
463
+
464
+ #: meta_subject/models/health_economics/health_economics_update.py:84
465
+ msgid ""
466
+ "Insert '0' if no dependents other than the members in the household roster"
467
+ msgstr ""
468
+
469
+ #: meta_subject/models/health_economics/health_economics_update.py:89
470
+ msgid "Would you say your household's financial situation is?"
471
+ msgstr ""
@@ -22,6 +22,13 @@ class GlucoseRuleGroup(CrfRuleGroup):
22
22
  target_models=["glucose"],
23
23
  )
24
24
 
25
+ glucose_fbg = CrfRule(
26
+ predicate=pc.glucose_fbg_required,
27
+ consequence=REQUIRED,
28
+ alternative=NOT_REQUIRED,
29
+ target_models=["glucosefbg"],
30
+ )
31
+
25
32
  class Meta:
26
33
  app_label = "meta_subject"
27
34
  source_model = "meta_subject.subjectvisit"
@@ -12,14 +12,18 @@ from edc_visit_schedule.constants import (
12
12
  MONTH1,
13
13
  MONTH3,
14
14
  MONTH6,
15
+ MONTH12,
15
16
  MONTH18,
16
17
  MONTH24,
17
18
  MONTH30,
18
19
  MONTH36,
20
+ MONTH48,
19
21
  WEEK2,
20
22
  )
21
23
  from edc_visit_schedule.utils import is_baseline
22
24
 
25
+ from meta_visit_schedule.constants import MONTH39, MONTH42, MONTH45
26
+
23
27
 
24
28
  def hba1c_crf_required_at_baseline(visit):
25
29
  model_name = "meta_subject.bloodresultshba1c"
@@ -67,8 +71,14 @@ class Predicates(PersistantSingletonMixin):
67
71
 
68
72
  @staticmethod
69
73
  def glucose_required(visit, **kwargs):
70
- if visit.report_datetime >= datetime(2023, 11, 24, tzinfo=ZoneInfo("UTC")):
71
- if visit.visit_code in [MONTH6, MONTH18, MONTH24, MONTH30, MONTH36]:
74
+ if visit.visit_code in [MONTH12, MONTH24, MONTH36, MONTH48]:
75
+ return True
76
+ return False
77
+
78
+ @staticmethod
79
+ def glucose_fbg_required(visit, **kwargs):
80
+ if visit.report_datetime >= datetime(2024, 3, 4, tzinfo=ZoneInfo("UTC")):
81
+ if visit.visit_code in [MONTH6, MONTH18, MONTH30, MONTH42]:
72
82
  return True
73
83
  return False
74
84
 
@@ -196,14 +206,27 @@ class Predicates(PersistantSingletonMixin):
196
206
  return required
197
207
 
198
208
  def mnsi_required(self, visit, **kwargs) -> bool:
199
- """Returns True if MNSI assessment was not performed at the
200
- 1M, 3M or 6M visits.
209
+ """Returns True if:
210
+ - MNSI assessment not performed in the 1, 3 or 6M visits
211
+ - MNSI assessment not performed in the 36, 39, 42, 45M visits
212
+ - MNSI assessment not performed in the 48M visit
201
213
  """
214
+ model_cls = django_apps.get_model(f"{self.app_label}.mnsi")
202
215
  required = True
203
- if (
204
- visit.appointment.visit_code in [MONTH1, MONTH3, MONTH6]
205
- ) and visit.appointment.visit_code_sequence == 0:
206
- model_cls = django_apps.get_model(f"{self.app_label}.mnsi")
216
+ if visit.visit_code_sequence != 0:
217
+ required = False
218
+ elif visit.visit_code not in [
219
+ MONTH1,
220
+ MONTH3,
221
+ MONTH6,
222
+ MONTH36,
223
+ MONTH39,
224
+ MONTH42,
225
+ MONTH45,
226
+ MONTH48,
227
+ ]:
228
+ required = False
229
+ elif visit.visit_code in [MONTH1, MONTH3, MONTH6]:
207
230
  objs = model_cls.objects.filter(
208
231
  subject_visit__subject_identifier=visit.subject_identifier,
209
232
  subject_visit__visit_code__in=[MONTH1, MONTH3, MONTH6],
@@ -213,16 +236,30 @@ class Predicates(PersistantSingletonMixin):
213
236
  if obj.mnsi_performed == YES:
214
237
  required = False
215
238
  break
239
+ elif visit.visit_code in [MONTH36, MONTH39, MONTH42, MONTH45]:
240
+ objs = model_cls.objects.filter(
241
+ subject_visit__subject_identifier=visit.subject_identifier,
242
+ subject_visit__visit_code__in=[MONTH36, MONTH39, MONTH42, MONTH45],
243
+ subject_visit__visit_code_sequence=0,
244
+ )
245
+ for obj in objs:
246
+ if obj.mnsi_performed == YES:
247
+ required = False
248
+ break
216
249
  return required
217
250
 
218
251
  def sf12_required(self, visit, **kwargs):
219
252
  model = f"{self.app_label}.sf12"
253
+ if visit.visit_code_sequence == 0 and visit.visit_code in [MONTH36, MONTH48]:
254
+ return True
220
255
  return self.persistant_singleton_required(
221
256
  visit, model=model, exclude_visit_codes=[DAY1]
222
257
  )
223
258
 
224
259
  def eq5d3l_required(self, visit, **kwargs):
225
260
  model = f"{self.app_label}.eq5d3l"
261
+ if visit.visit_code_sequence == 0 and visit.visit_code in [MONTH36, MONTH48]:
262
+ return True
226
263
  return self.persistant_singleton_required(
227
264
  visit, model=model, exclude_visit_codes=[DAY1]
228
265
  )