meta-edc 1.0.7__py3-none-any.whl → 1.1.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 (56) hide show
  1. meta_ae/action_items.py +10 -2
  2. meta_ae/baker_recipes.py +1 -2
  3. meta_ae/tests/tests/test_actions.py +1 -2
  4. meta_analytics/notebooks/anu.ipynb +95 -0
  5. meta_analytics/notebooks/appointment_planning.ipynb +329 -0
  6. meta_analytics/notebooks/arvs.ipynb +103 -0
  7. meta_analytics/notebooks/cleaning/consent_v1_ext.ipynb +227 -0
  8. meta_analytics/notebooks/cleaning/offschedule_eos.ipynb +353 -0
  9. meta_analytics/notebooks/dsmc/renal_dysfunction.ipynb +435 -0
  10. meta_analytics/notebooks/endpoints/meta_endpoints_by_date.ipynb +664 -0
  11. meta_analytics/notebooks/followup_examination.ipynb +141 -0
  12. meta_analytics/notebooks/hba1c.ipynb +136 -0
  13. meta_analytics/notebooks/hiv_regimens.ipynb +122 -118
  14. meta_analytics/notebooks/incidence.ipynb +232 -0
  15. meta_analytics/notebooks/liver.ipynb +389 -0
  16. meta_analytics/notebooks/magreth.ipynb +645 -0
  17. meta_analytics/notebooks/monitoring_report.ipynb +435 -245
  18. meta_analytics/notebooks/pharmacy.ipynb +405 -306
  19. meta_analytics/notebooks/pharmacy_stock_202410.ipynb +306 -0
  20. meta_analytics/notebooks/steering.ipynb +61 -0
  21. meta_analytics/notebooks/undiagnosed/meta3_screening_consort_chart.ipynb +1176 -0
  22. meta_analytics/notebooks/undiagnosed/meta3_screening_undiagnosed.ipynb +519 -0
  23. meta_analytics/notebooks/undiagnosed/meta_screening_table2.ipynb +964 -0
  24. meta_analytics/notebooks/undiagnosed/screen_undiagnosed_or.ipynb +296 -0
  25. meta_analytics/notebooks/undiagnosed/screening.ipynb +273 -0
  26. meta_analytics/notebooks/undiagnosed/screening2.ipynb +958 -0
  27. meta_analytics/notebooks/undiagnosed/screening_undiagnosed_20241002.ipynb +958 -0
  28. meta_analytics/notebooks/ven.ipynb +191 -0
  29. meta_analytics/notebooks/vitals.ipynb +263 -0
  30. meta_edc/settings/debug.py +3 -2
  31. meta_edc/urls.py +1 -0
  32. {meta_edc-1.0.7.dist-info → meta_edc-1.1.0.dist-info}/METADATA +3 -3
  33. {meta_edc-1.0.7.dist-info → meta_edc-1.1.0.dist-info}/RECORD +55 -28
  34. {meta_edc-1.0.7.dist-info → meta_edc-1.1.0.dist-info}/WHEEL +1 -1
  35. meta_labs/reportables.py +14 -11
  36. meta_labs/tests/test_reportables.py +33 -12
  37. meta_pharmacy/notebooks/pharmacy.ipynb +41 -0
  38. meta_prn/migrations/0063_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  39. meta_prn/migrations/0064_auto_20250602_2143.py +18 -0
  40. meta_prn/models/end_of_study.py +2 -0
  41. meta_prn/models/off_study_medication.py +2 -0
  42. meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py +59 -47
  43. meta_screening/form_validators/screening_part_three.py +6 -1
  44. meta_screening/tests/meta_test_case_mixin.py +3 -0
  45. meta_screening/tests/tests/test_forms.py +9 -2
  46. meta_screening/tests/tests/test_screening_part_three.py +11 -14
  47. meta_subject/action_items.py +1 -2
  48. meta_subject/choices.py +2 -1
  49. meta_subject/forms/blood_results/blood_results_rft_form.py +60 -3
  50. meta_subject/migrations/0223_bloodresultsfbc_errors_bloodresultsgludummy_errors_and_more.py +83 -0
  51. meta_subject/migrations/0224_bloodresultsfbc_abnormal_summary_and_more.py +153 -0
  52. meta_subject/tests/tests/test_egfr.py +5 -5
  53. meta_analytics/dataframes/enrolled/__init__.py +0 -0
  54. {meta_edc-1.0.7.dist-info → meta_edc-1.1.0.dist-info}/licenses/AUTHORS.rst +0 -0
  55. {meta_edc-1.0.7.dist-info → meta_edc-1.1.0.dist-info}/licenses/LICENSE +0 -0
  56. {meta_edc-1.0.7.dist-info → meta_edc-1.1.0.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,8 @@
1
1
  meta_ae/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- meta_ae/action_items.py,sha256=2XKK9K4f9irwyrNb9e0_JzZcEaHd0P1ZNGmMf5waGXo,11372
2
+ meta_ae/action_items.py,sha256=JnJ2_JbnrMh6zNpXgWxQGAAfImShlELcc9-a_1GDdF4,11383
3
3
  meta_ae/admin_site.py,sha256=5nx3fbd14u5KJbpFXow_XpG9gfYhdoYe4NFasFVKMMs,159
4
4
  meta_ae/apps.py,sha256=tSj7MhDY6SxB0f1nXGPvodeTPiGFoRtrQGQd6M42egI,284
5
- meta_ae/baker_recipes.py,sha256=q4VWJRy2n-qSGQA9IskF3OvzorcQqYs_vO3vYkHYOjs,1184
5
+ meta_ae/baker_recipes.py,sha256=TPJeXRMgUYjcfTVFj084VQFyoLBT9SyXg9vOCJYekAw,1148
6
6
  meta_ae/choices.py,sha256=uPs2jdXEoS4eeTJAJlQ-_cFiMQESNJecwUChxv5mHX0,756
7
7
  meta_ae/constants.py,sha256=_x4gMjI0PflPZo9X2NOAitPGh-pOZn4oYBf-_bDlGQ8,36
8
8
  meta_ae/list_data.py,sha256=liF-AksUZkDoIcgHqtXNR7a3YOWGGrD2JFTlwJUDcXk,1416
@@ -80,7 +80,7 @@ meta_ae/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  meta_ae/tests/holidays.csv,sha256=Ywr5pK_caGUJMgRwLzjMeSEUuyEpUWyJE5aJkfbg3bg,539
81
81
  meta_ae/tests/urls.py,sha256=BKiCB7JZCxtZFh6Ym-Y-Hdq92NECIt-GqMDyt6_B7o0,260
82
82
  meta_ae/tests/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- meta_ae/tests/tests/test_actions.py,sha256=W4UglCSs4GLU0_I5grpCz3xprk2OQso2Q6c_9aYWiu8,4915
83
+ meta_ae/tests/tests/test_actions.py,sha256=BrSbtCudm0ZZ8KGHA36exOx9mYfCslPk3JMRlcAOB8s,4879
84
84
  meta_analytics/README.rst,sha256=x5KDks1P2bSPdyq3f9CNkynAAgJaXl7AX_3rnmC16HU,357
85
85
  meta_analytics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  meta_analytics/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -94,7 +94,6 @@ meta_analytics/dataframes/get_glucose_fbg_df.py,sha256=iVWHRDwUeSt1PuUBRgJOyZKIV
94
94
  meta_analytics/dataframes/get_glucose_fbg_ogtt_df.py,sha256=ouRXlQKOws1CK38OgnKjGGEKf3sgG4e8Ktf9MP_SYzU,669
95
95
  meta_analytics/dataframes/get_last_imp_visits_df.py,sha256=cScwy_nBGHg04_AYpjz_pTq13Q4iyb33SiKk6CltbyQ,3803
96
96
  meta_analytics/dataframes/utils.py,sha256=NNJ2EZmpSXJqa7jCoNgqd4F3irQ_93ZsNnv6PPIm7S8,2383
97
- meta_analytics/dataframes/enrolled/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
97
  meta_analytics/dataframes/glucose_endpoints/__init__.py,sha256=a9RlAnFM0Z4AKw-WztBvnGMo3tLLe1dx3292A2n_CnA,107
99
98
  meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py,sha256=4Qd3i9hfSSkn_El7QAjuJDUbzQ1LBpkmFw0rHSlBfG0,6531
100
99
  meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py,sha256=Nr92PmfmaS_OPPp6hmK1OWZsOr3eQ5FMD5u_oDF8Ylk,13682
@@ -102,10 +101,33 @@ meta_analytics/dataframes/glucose_endpoints/utils.py,sha256=47DEQpj8HBSa-_TImW-5
102
101
  meta_analytics/dataframes/screening/__init__.py,sha256=onGpmB4474gu_JcyRGdRy09YQyP2Np-mX-rYZTFdJoA,114
103
102
  meta_analytics/dataframes/screening/get_glucose_tested_only_df.py,sha256=0oMJIsIJRjurfpPONuJ4Aoab1UJikezGe3lQNWRoOo4,660
104
103
  meta_analytics/dataframes/screening/get_screening_df.py,sha256=t_xxr7YId3QsXbwjPpi7nIgkleKprmZSqAin2cuB2Vc,6273
105
- meta_analytics/notebooks/hiv_regimens.ipynb,sha256=wmwhZnbP1HkVbk8yaHzrLikpNAHHNCXvVBhdyN-8TJw,15231
106
- meta_analytics/notebooks/monitoring_report.ipynb,sha256=wUbL6-ljGZFbbt87lU6AvnBB_RyNj10PB7BJO0WHeUU,66290
107
- meta_analytics/notebooks/pharmacy.ipynb,sha256=3PKWRNjx-uDMrrpkQth368d9hdtKrYijvv5RJW2TgEw,32585
104
+ meta_analytics/notebooks/anu.ipynb,sha256=zrkC0tzKZqDRD310BW1ua8cwdSa6qQzOF2vzmUFKnSc,2263
105
+ meta_analytics/notebooks/appointment_planning.ipynb,sha256=RUI2h4Bd67hgUH9qof356XybZIStwsRNzy2BMKQAUlE,13100
106
+ meta_analytics/notebooks/arvs.ipynb,sha256=NSxKb0c9w-kN9WRx4ixNlNOHcD4BJ-1SxFQXR9cehQI,2390
107
+ meta_analytics/notebooks/followup_examination.ipynb,sha256=Ng90rFarYCBzqj3VzOPqyNLMmP0JvCSCN-mRHR_pw-A,3986
108
+ meta_analytics/notebooks/hba1c.ipynb,sha256=qrajG5zoAjT1scxAh_6C069VAHqugQnYZRg-VLzZFuo,2756
109
+ meta_analytics/notebooks/hiv_regimens.ipynb,sha256=qqRq5befPPiPQ8sheFhe6iGxPicajQBw46Kwnya77Dk,14908
110
+ meta_analytics/notebooks/incidence.ipynb,sha256=-kd0Mp67dk8ECoNEcKMTn92iBxuNLBIOC6-qLvz-31U,8101
111
+ meta_analytics/notebooks/liver.ipynb,sha256=s19AAV6vmtGqYAfN1cqVIcBeU7ptSGU94uZaeaz32qU,13985
112
+ meta_analytics/notebooks/magreth.ipynb,sha256=u4BWz6swBFLXcrOQDi_iSuFkp9NiISFk5uPahh7iXug,20773
113
+ meta_analytics/notebooks/monitoring_report.ipynb,sha256=skRJrbuLSoQcKRdy-aYV--7lN0QfkCiQ0nOUmFbZWo4,74734
114
+ meta_analytics/notebooks/pharmacy.ipynb,sha256=rAxMyPDZIyx-Qizgrdueq-rUYyeN3zMYVqDPkbjtnSs,34298
115
+ meta_analytics/notebooks/pharmacy_stock_202410.ipynb,sha256=Kx9QVmiDW-5DWuaoSvLM2vJGHRCam-im9ZVdJsOBFfs,8823
116
+ meta_analytics/notebooks/steering.ipynb,sha256=pqJrH_Zdwp7sPgHwhahKK-XmNMQjk7bHJv7vHJaeTek,1112
117
+ meta_analytics/notebooks/ven.ipynb,sha256=JR1_BW2QGqsqteCSORS7Zz7yD3u8JeU9r4H7KJ6nRN4,5182
118
+ meta_analytics/notebooks/vitals.ipynb,sha256=mHlO6QbhD28aGUhVI0tF06MJm_JjUsKLdSpnz5NhbQI,5787
108
119
  meta_analytics/notebooks/cleaning/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
+ meta_analytics/notebooks/cleaning/consent_v1_ext.ipynb,sha256=HIo8lKtyAs3blx-UXEJful5iXT-0fGQcb5vAT-o7umk,6403
121
+ meta_analytics/notebooks/cleaning/offschedule_eos.ipynb,sha256=U5KS7GzWKsWkJWIN4pXhKN9GJMCpkGVxrIEBaRoaah8,10620
122
+ meta_analytics/notebooks/dsmc/renal_dysfunction.ipynb,sha256=vy40GuSA2HH3OoCBLaHx5fxYzS3mOV5C2L7BqSUGemM,11116
123
+ meta_analytics/notebooks/endpoints/meta_endpoints_by_date.ipynb,sha256=4UxnO4ijILwKlRvYd2D7_XE5fqBj3puQqYbggu4Ouf0,22526
124
+ meta_analytics/notebooks/undiagnosed/meta3_screening_consort_chart.ipynb,sha256=B79ZyqWzsxhrBJZhajyqjJ3vP10eNzX2C3_ojc3jOIY,34653
125
+ meta_analytics/notebooks/undiagnosed/meta3_screening_undiagnosed.ipynb,sha256=MmyQzBCR63GAQlKsQ1CPxmPtgMlJYWggfEBDI81me64,11912
126
+ meta_analytics/notebooks/undiagnosed/meta_screening_table2.ipynb,sha256=bRoJbboAnkfXo6MeKmedP4j6eAVHdH4q62o35p9--No,36421
127
+ meta_analytics/notebooks/undiagnosed/screen_undiagnosed_or.ipynb,sha256=JJkQKVOSrDqqLecM-5OOrVgqe-TshdK4q52DU1zWUtU,6984
128
+ meta_analytics/notebooks/undiagnosed/screening.ipynb,sha256=8v5FPvJYTo1N4zTP1nwA0uJoaWlLEs3RsY7_I3fXdLY,6769
129
+ meta_analytics/notebooks/undiagnosed/screening2.ipynb,sha256=r4QMsNfuLMzFgTorVLY-doB32fAvl4zCfCKbujRbH38,24794
130
+ meta_analytics/notebooks/undiagnosed/screening_undiagnosed_20241002.ipynb,sha256=GiATH1CyZaS3kXvcT9aYpbCO4VPmPkBWPOtz67j4Y-Y,22182
109
131
  meta_analytics/tables/__init__.py,sha256=mhESCt0Lq4RJU-lbQ5fVfIbXzrEsootGYp7EzQIqDBI,70
110
132
  meta_analytics/tables/eligible.py,sha256=2q-SMbAsrBgOVc4Ttq5P3bpjsUKwP5hYhJBMgyH6GGI,3389
111
133
  meta_analytics/tables/has_dm.py,sha256=W6pObFI7k2hpL46Q7t2QIfYDVfo7-PHJMdCv6Q5EUQk,1739
@@ -244,7 +266,7 @@ meta_edc/meta_version.py,sha256=8IASYGnr43t18oDhNAPNnQoKvFYVAUnPILl6a05HAoc,211
244
266
  meta_edc/model_callers.py,sha256=PjQEW7Kp5HHcUMdmz7dvxg53HvGJHXUKr6QTd-4hsyE,1339
245
267
  meta_edc/models.py,sha256=DLA-hDdFszAVNCe1sZqVoLmIXifFW0HeZsipP9D1Ic4,46
246
268
  meta_edc/navbars.py,sha256=XOuo4QEUCBtabYpW0IorT4Hs6GtJgVk7NkB0H_Bb7Vs,1191
247
- meta_edc/urls.py,sha256=hLeGIjUDoYiCFOao3jCpFL6nkBllEyJ-oV07xR_tsYc,3578
269
+ meta_edc/urls.py,sha256=vTpmCfcRTaYo_kv2zmuPMLh-EO5MlwzcKc2PV-0eWd8,3624
248
270
  meta_edc/utils.py,sha256=FdGGHT0zCUM9FLovLanH_ultcxbVitCvvPAwq0U3yYc,342
249
271
  meta_edc/wsgi.py,sha256=Ns9vu_jcEqpOLM5tb-hwVUh3ciInocrG3kUPAxh7nJg,165
250
272
  meta_edc/wsgi_live.py,sha256=EprgdsDiEvNN033w6lUQHaS8Y3ntpPrWHDTOgZcjaCQ,164
@@ -254,7 +276,7 @@ meta_edc/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
254
276
  meta_edc/management/commands/update_forms_reference.py,sha256=jvCU9YdMtp9wbmjqKQsB9gxNw4DcAP97sZD-kfIxOns,1071
255
277
  meta_edc/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
256
278
  meta_edc/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
257
- meta_edc/settings/debug.py,sha256=5WkxxapNtYDi9XKXCOCnlZ3q9--zktBtRyGhCVUaMEs,1296
279
+ meta_edc/settings/debug.py,sha256=t44__VfifcaagPTcm7lUVcjaIsBuM4IRyWz9xyNubDg,1297
258
280
  meta_edc/settings/defaults.py,sha256=USh91oF6HKdUXWZ5xf5dDCwAYINSIdOPkgHCxDCsGP4,19633
259
281
  meta_edc/settings/live.py,sha256=uLTlsIc3H6gdE_7pkL6vyOVa6V_74hnXFkiojqGFAYY,264
260
282
  meta_edc/settings/logging.py,sha256=6qVUE37OMkf5rzwTmMq4krFsZ2jcyCpWdFtGih_Cs4U,1938
@@ -267,8 +289,8 @@ meta_edc/tests/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
267
289
  meta_edc/tests/tests/test_endpoints.py,sha256=5FdIHTd1xhUIgQLBzMV-Ml3VoFrlBrLLUbNarme5raw,23541
268
290
  meta_edc/views/__init__.py,sha256=TBXTih4Mpsg5Oh2jbyXqL9kH7bu3vWNRgVe93hvLCl8,32
269
291
  meta_edc/views/home_view.py,sha256=BXydy77TcdcM0-R3S_uHI4DtfnLMIzPJMyqjFJZFSsA,916
270
- meta_edc-1.0.7.dist-info/licenses/AUTHORS.rst,sha256=wL4KUOd7FAFThhkLAJxSLQ2BPzd3ikG9q0UVZr3BbLg,244
271
- meta_edc-1.0.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
292
+ meta_edc-1.1.0.dist-info/licenses/AUTHORS.rst,sha256=wL4KUOd7FAFThhkLAJxSLQ2BPzd3ikG9q0UVZr3BbLg,244
293
+ meta_edc-1.1.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
272
294
  meta_export/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
273
295
  meta_export/admin_site.py,sha256=CiKAf0gDFvBKVc-1VM6KwM905ayVZuiY1tgaTeUeCi0,167
274
296
  meta_export/apps.py,sha256=3_5LB1MLtzfKekI2vT9Cm6puAx6t6AjtIfTTVdItdKg,226
@@ -280,10 +302,10 @@ meta_labs/lab_profiles.py,sha256=I3s07bzAQaRzNSAqBuprx6uIO048ovffL5gD28ZE2N0,957
280
302
  meta_labs/labs.py,sha256=0mpfORDUsjxBeyJdEC5NiF4kQHSQTfKiQuMKZ9Svaqw,128
281
303
  meta_labs/list_data.py,sha256=ZWvQ7ZuOgNZ8Cz-y5lzrAYCZC2HarlnlleFXdsI1P9c,477
282
304
  meta_labs/processing_profiles.py,sha256=fRX72FOl2rsnOJYhgup5QacfGSXKtWqn2gD3Giz2GDA,500
283
- meta_labs/reportables.py,sha256=Eg95Jyv7N6oh5w6QKfcvRN6jk88c0DSYRq1gqBTs2xo,512
305
+ meta_labs/reportables.py,sha256=OX1rxiWKmsi7_ODxH1O8yBGgOq56HAaiG1XTEDGaOhM,586
284
306
  meta_labs/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
285
307
  meta_labs/tests/test_labs.py,sha256=49COK2X8F5kvwsIuuPaxBSzDo665J2ctd1DZzo-O4Cs,967
286
- meta_labs/tests/test_reportables.py,sha256=lcjWhwo6MLDPv_7yTRGGdSUUVsbXq25aDl0RFy3avB0,516
308
+ meta_labs/tests/test_reportables.py,sha256=nmNR7wumpkI84BqE3pCRqz7TuvprJXv9Kbtxs8P8U90,1302
287
309
  meta_labs/tests/urls.py,sha256=_sVCnQeiAFRYKhxga3_DjoKj_4bgs1s2gjcynDiapvA,111
288
310
  meta_lists/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
289
311
  meta_lists/admin.py,sha256=g05vpXfVIEBVG03aiPD8Vn-AnR7gL60MbPJAfzsO6R8,2157
@@ -352,6 +374,7 @@ meta_pharmacy/models/label_data.py,sha256=dV8fpmJ6QpKidHVRfN3IdWEciEGQch8Q8jqJgq
352
374
  meta_pharmacy/models/rx.py,sha256=cx0T9j2Vb-6tEotWA7ohsn2OGHnQpxiFQnu7__hx7Ts,379
353
375
  meta_pharmacy/models/rx_label.py,sha256=iBqy3c-DvoPnw1g8BAVGQcY5OpI9Ie2YT78rYY0G7WM,1202
354
376
  meta_pharmacy/models/substitutions.py,sha256=9FjjD4x66B8SxABZR5atan2S5uE4nJH0tn0ujB4xEbA,3071
377
+ meta_pharmacy/notebooks/pharmacy.ipynb,sha256=QK7Uaqr-3MbCmzaHq4PhTd4Xn4R3JLG3TjZZ3g5Cz3I,697
355
378
  meta_pharmacy/utils/__init__.py,sha256=PiPRCZqgxPiudXWEvQmXOqFZMoj56NEiOeRuYEyE_9w,71
356
379
  meta_pharmacy/utils/update_initial_pharmacy_data.py,sha256=Od0QL41unsDEGDBYsVCe8k-T3GpMae0DtHt61vz4sYM,4621
357
380
  meta_prn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -454,12 +477,14 @@ meta_prn/migrations/0059_alter_historicaloffstudymedication_reason_and_more.py,s
454
477
  meta_prn/migrations/0060_alter_onschedule_managers_and_more.py,sha256=zTlobJgliy-LuQ3z_BE_cwpdVddrvpHRvhDH4Hj64zY,1791
455
478
  meta_prn/migrations/0061_auto_20250115_2025.py,sha256=u7F2GsXo-9pIN5z0VM1aXW_KoRjS82BaBqqj2xWwWzo,1937
456
479
  meta_prn/migrations/0062_alter_endofstudy_offstudy_reason_and_more.py,sha256=L1ZDX1IMS0nIs77lF4QZ0SX-ye4rXvouTLnijob8SAQ,2421
480
+ meta_prn/migrations/0063_historicaloffstudymedication_singleton_field_and_more.py,sha256=l8pNm7G0O_7hWMb7smU5wbbsjE7es-WZfCkET7zyuXw,1081
481
+ meta_prn/migrations/0064_auto_20250602_2143.py,sha256=S8-7kSWfJSFtzKrq5_puYIC0UA32wRZH_-xnQ6mt--w,512
457
482
  meta_prn/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
458
483
  meta_prn/models/__init__.py,sha256=l06P7L2_Aye2h2VmAyb1XRcIbQAOyxws08IMc8sIops,717
459
484
  meta_prn/models/dm_referral.py,sha256=XyyB5ylcaMRCumGRFPlh2Op5VvT9ROJ1A9x5q55vUuc,1096
460
- meta_prn/models/end_of_study.py,sha256=3ZzuJfhZD5MONM8kS2nJQ7H76y2orqpGsVT3sT4O8uw,5379
485
+ meta_prn/models/end_of_study.py,sha256=wg2Y8Q_via6GozskaCzqkky_jOrtSLNek77-X2KLJME,5444
461
486
  meta_prn/models/loss_to_followup.py,sha256=qo2RrK5cVC1wLE7DdE6rTCCtYn7iAMomov9IbSCFuWg,2397
462
- meta_prn/models/off_study_medication.py,sha256=qq8DadWCNvFOYLkx9VoDMyLnbuZiRGc7-gmPSb-QVFk,1701
487
+ meta_prn/models/off_study_medication.py,sha256=7PzUkyrBWTybTWcNMU5EioApbOoiIaUDnCiEcjgX-II,1779
463
488
  meta_prn/models/offschedule.py,sha256=DjQvXteecXJOzN6ijdH36FCxXoR1halzxl9EliqQJk8,1717
464
489
  meta_prn/models/onschedule.py,sha256=xAlKzvcM5VzVfzaayjUEvUSL6rsALQQSm9iFCs1rnWc,930
465
490
  meta_prn/models/pregnancy_notification.py,sha256=HqRsonJ0F1nxLczVtgPkvGb7kWQOkJDz3w67jOxi5j4,3090
@@ -648,11 +673,11 @@ meta_screening/eligibility/eligibility.py,sha256=he-5p7hzUY0Apd98TSTUgzHSosgW6ff
648
673
  meta_screening/eligibility/eligibility_part_one.py,sha256=5SMmVx17lUonfcItUepapJmZnbiF2dZ4WrwGllhoKl0,1769
649
674
  meta_screening/eligibility/eligibility_part_two.py,sha256=xyCPn4wUQZu0uvBSpFSpSMsB_80IPI1PRC2wOQWB1Uk,1808
650
675
  meta_screening/eligibility/eligibility_part_three/__init__.py,sha256=UfdNfJ7SW5wTvYo_0KUxn1KrlgjCwOmY539VXQvU-rE,79
651
- meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py,sha256=-aDLPR-UBNsFrTHmXrTpOWcBVshI-QvH1Zsj0A5Rs1E,5405
676
+ meta_screening/eligibility/eligibility_part_three/base_eligibility_part_three.py,sha256=vGloYoc6VhROst_idpwmULvik9mRPjAWo2Z3ZE2IxNk,6224
652
677
  meta_screening/eligibility/eligibility_part_three/eligibility_part_three_phase_three.py,sha256=9YOPxMH8jdOeEljCNcNB_i2e69HJOnMLtPSkhCtRewo,4296
653
678
  meta_screening/form_validators/__init__.py,sha256=42qN1LhCpXvgA0WhzmXfSVaESp9DaHnlQDrE0sjmo-A,308
654
679
  meta_screening/form_validators/screening_part_one.py,sha256=-CCe24UPhgFusVOkWzGJZ1uMszqmePkKsfF0hN54y0A,1213
655
- meta_screening/form_validators/screening_part_three.py,sha256=DS7lL7u8p9EA-t3IszWt4_mYYG1s9zkPxbk22I7cy0I,7606
680
+ meta_screening/form_validators/screening_part_three.py,sha256=6i_uoMMpVWZ0EElaM3dGELBOHLud09y2MoeQGugdklU,7815
656
681
  meta_screening/form_validators/screening_part_two.py,sha256=ZR9ApZfhXDOfmwxqsX-UkaN4FXVMVHVzklVp3CxNg34,4738
657
682
  meta_screening/form_validators/subject_refusal.py,sha256=QGIUkCobHEAlE1R1gDmPfAIlBBQqpzpIuArUkop8yDk,322
658
683
  meta_screening/form_validators/subject_screening.py,sha256=F4m8CrhQW2O1AmdkuvlJRki39Ha_XYGyxczP2-TBE_A,309
@@ -746,12 +771,12 @@ meta_screening/models/subject_refusal.py,sha256=oLC9FKR1C01pwy5fEM_35itOYCDQZXmW
746
771
  meta_screening/models/subject_screening.py,sha256=j-0U5zcErwEv0qYEn9ktaPiNfce-CFe67NpaYyX1lew,2269
747
772
  meta_screening/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
748
773
  meta_screening/tests/holidays.csv,sha256=Ywr5pK_caGUJMgRwLzjMeSEUuyEpUWyJE5aJkfbg3bg,539
749
- meta_screening/tests/meta_test_case_mixin.py,sha256=m9XeLYST666MWiWQcT6nCg9feEgt6TCXxh6M5tGAVAY,8779
774
+ meta_screening/tests/meta_test_case_mixin.py,sha256=dBdYp1U9mW9J7ghrgchXOOWeZPhiVcQ09mV3GHbiors,8949
750
775
  meta_screening/tests/options.py,sha256=VpRQWWPwlVUReFi4KHuJdHXTBCsWvR2IlHs4yTDxQVA,4097
751
776
  meta_screening/tests/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
752
- meta_screening/tests/tests/test_forms.py,sha256=Uvie3DOGbzNKfg1tUtNLFv0VtkZuMQeK3p-zw92lQAA,16710
777
+ meta_screening/tests/tests/test_forms.py,sha256=wTR3fe4-v6L5sw_eApdcCn6xnu_I6Q6fpOIZlUVvcXA,16903
753
778
  meta_screening/tests/tests/test_screening_part_one.py,sha256=EyG3SRVpR6-bFB0bn9UEA4hL8638e-Kx7K0_AeaBntE,4723
754
- meta_screening/tests/tests/test_screening_part_three.py,sha256=6sPFIDme4jaehZCCiPCgH6U3UqLAHVcscHl0OwbDQvM,16774
779
+ meta_screening/tests/tests/test_screening_part_three.py,sha256=OWzfonzIgl-g59oK33VCcRuUnjzDbd2uUKRv7XHNiyM,16739
755
780
  meta_screening/tests/tests/test_screening_part_two.py,sha256=BjPJKwujqlKO-bHhMIS5OFAomInKm34fKjU6d-8QlTY,3126
756
781
  meta_sites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
757
782
  meta_sites/apps.py,sha256=tFzSEULZZYXupXrO7B2RAh_N--joVS4E_UOykXoOKNA,278
@@ -768,11 +793,11 @@ meta_stats/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
768
793
  meta_stats/tests/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
769
794
  meta_stats/tests/tests/test_incidence.py,sha256=Uxv05_xZ0hZKtTBDow3goRcQrK5644j9NQwyW9d_CX8,313
770
795
  meta_subject/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
771
- meta_subject/action_items.py,sha256=eRONfgYX0DbSCI5JqFbMojiy86jDRvQgV-BUlQpmNog,6895
796
+ meta_subject/action_items.py,sha256=3wwqxwxYGApbfucy1hmemG6H-HzZNTMkwnOV_8Q4cYk,6869
772
797
  meta_subject/admin_site.py,sha256=fxUn5QKgo6wYUG18HW11kVrPqWvmWV2_PzKbgZQM4pU,169
773
798
  meta_subject/apps.py,sha256=iAQ8lizUpKa4gJnCGkTsuRQPtGWmSjnshZn8rZUguO8,289
774
799
  meta_subject/baker_recipes.py,sha256=C8ag5z5MRczzb3MkYGL37DccQg1FykiLgxepBlitlh0,2741
775
- meta_subject/choices.py,sha256=LjKRsEG0uGJow2BHshV_oKXdNYktNGn1Xj9H8SbGtBA,6782
800
+ meta_subject/choices.py,sha256=lFseBsxliIRshCmqsIwdPnYXs1p_WT5D_Dfn2PcWONs,6754
776
801
  meta_subject/constants.py,sha256=6rpHsHj3CPV7ntdWxYScRhPVoj4YIxX2lUZdZ9lrFN0,704
777
802
  meta_subject/identifiers.py,sha256=pBYvMFXK7N2oNDMJJM2xLCvk0NuzLzzm15VqQ2Cp7Og,325
778
803
  meta_subject/urls.py,sha256=v2fM0R9gvt8MWdZj9cRnYU8xvqecLK5b_8leYVEtYZI,206
@@ -867,7 +892,7 @@ meta_subject/forms/blood_results/blood_results_hba1c_form.py,sha256=IoQSS8MnK8C9
867
892
  meta_subject/forms/blood_results/blood_results_ins_form.py,sha256=zKwobon8wRBrwpAMxonbXtR-Bg2wsJbcHraLjsqcAhY,722
868
893
  meta_subject/forms/blood_results/blood_results_lft_form.py,sha256=WKCGZXTk9ndlASymnKKIAo0rBtE9uoE_gzKsx19p-LQ,714
869
894
  meta_subject/forms/blood_results/blood_results_lipids_form.py,sha256=YcqETGjN1LH_kKTGVD0a-gW4z6X3PmM8z1xQmI0-Yfg,735
870
- meta_subject/forms/blood_results/blood_results_rft_form.py,sha256=y0pyR_Y2LTVhyVnf_VjpPAJhm2xDVuWwExhedfJrTYM,1362
895
+ meta_subject/forms/blood_results/blood_results_rft_form.py,sha256=UVVfDpwdUskiV6ut-cJdzec_jHamsBNdPajzJwZ3vdg,3459
871
896
  meta_subject/forms/diabetes/__init__.py,sha256=oOtxUWSSI4aZVk5BBSKV44SGMwpw7zKZGrAk-dljPSk,90
872
897
  meta_subject/forms/diabetes/dm_endpoint_form.py,sha256=ngmDqAauO_oLsTxEVtbT9-2jWFYYagSXAcBf66pT81I,349
873
898
  meta_subject/forms/diabetes/dm_followup_form.py,sha256=ToJwQ1NViZn_CX-0YUyLQ5SSiDayKpp6bb16NBp-cKU,828
@@ -1104,6 +1129,8 @@ meta_subject/migrations/0219_remove_historicalnextappointment_allow_create_inter
1104
1129
  meta_subject/migrations/0220_historicalbloodresultsgludummy_bloodresultsgludummy.py,sha256=6TT5p5hQAhkL-vc3mo7xAAoZlQSoPAQ_KBTWNxYkr-0,34009
1105
1130
  meta_subject/migrations/0221_auto_20250402_1913.py,sha256=4quuKgAvnd-_yRhyC211x6bMsCCI7csioPJoImrVn24,1486
1106
1131
  meta_subject/migrations/0222_alter_historicalstudymedication_stock_codes_and_more.py,sha256=hxGQ5E2_DG8RmBeg7rRxtODsigUOZANop8GJYHPNVqg,1544
1132
+ meta_subject/migrations/0223_bloodresultsfbc_errors_bloodresultsgludummy_errors_and_more.py,sha256=twzCzmB230Fd2Os2WOkLHyodfWGgHPBYBkDas7lhG7A,2714
1133
+ meta_subject/migrations/0224_bloodresultsfbc_abnormal_summary_and_more.py,sha256=U_-nNqH6AHwGDoCEqogGZ9GMdPK92s_hCrJWVeUMyrY,5471
1107
1134
  meta_subject/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1108
1135
  meta_subject/model_mixins/__init__.py,sha256=6DdDDOwDdagrz6Q7X9lxuAVszsFWFhwPqLz4JOD85Wo,286
1109
1136
  meta_subject/model_mixins/arv_history_model_mixin.py,sha256=6ILacF2koyYmwZIFHmmQO1uIT1eWzrahXxhAlxpQiX0,2898
@@ -1168,7 +1195,7 @@ meta_subject/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
1168
1195
  meta_subject/tests/holidays.csv,sha256=Ywr5pK_caGUJMgRwLzjMeSEUuyEpUWyJE5aJkfbg3bg,539
1169
1196
  meta_subject/tests/urls.py,sha256=LBuQGFG4-omBramGVGmKFtRTQosQhZLx-vBvZipMujw,1109
1170
1197
  meta_subject/tests/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1171
- meta_subject/tests/tests/test_egfr.py,sha256=eBtt6--VDMfACcJLnL6RVz4xkJj7aUIiig1Z6HAbXgI,9994
1198
+ meta_subject/tests/tests/test_egfr.py,sha256=m4-9I3g5tue6Ed5ggI2EJwxagd009Gxxv7Ex09AfH-Q,9994
1172
1199
  meta_subject/tests/tests/test_fixes.py,sha256=2jOB0lcEonJft5rWEbrDEtGCuGLaaUN8zAj2qZjQwoU,2454
1173
1200
  meta_subject/tests/tests/test_followup.py,sha256=rembohm-ecEp9rGFdjc2CkvXGfYZ8A8BOX0MdBBZSF0,1871
1174
1201
  meta_subject/tests/tests/test_manager_order.py,sha256=wmVxMd85mJ6HGAL_3Z_mSp_mqeNQvK7MW_6mvQPDeO8,454
@@ -1211,7 +1238,7 @@ tests/etc/user-rsa-restricted-private.pem,sha256=CUcHW9bznWdmmASN00hCzvxFPAFl4N2
1211
1238
  tests/etc/user-rsa-restricted-public.pem,sha256=mt84djoL-uHw6Wc5SJh0zml6VzXulnf8eQSFg7-fheg,450
1212
1239
  tests/etc/user-salt-local.key,sha256=x5anBw9fvbHurczouT3CjrkWb_xs7Ypm1htIJsgiuiw,256
1213
1240
  tests/etc/user-salt-restricted.key,sha256=pxmpcfBRNB-4C6wTvHXz-9fOfJgKIFOjaAF8ZFfa4q4,256
1214
- meta_edc-1.0.7.dist-info/METADATA,sha256=mIBIIbzD6U-aFyZ2rBrvnv60vNJM12xHlZa2-_avjFE,43555
1215
- meta_edc-1.0.7.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
1216
- meta_edc-1.0.7.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1217
- meta_edc-1.0.7.dist-info/RECORD,,
1241
+ meta_edc-1.1.0.dist-info/METADATA,sha256=y4ko2psjFD5hmV78bD3F57hp9ijr8ftfVDLjneZqm5I,43555
1242
+ meta_edc-1.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1243
+ meta_edc-1.1.0.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1244
+ meta_edc-1.1.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
meta_labs/reportables.py CHANGED
@@ -1,16 +1,19 @@
1
- from edc_reportable import GRADE3, GRADE4, site_reportables
2
- from edc_reportable.grading_data.daids_july_2017 import chemistries, dummies, hematology
3
- from edc_reportable.normal_data.africa import normal_data
1
+ from edc_reportable.data import africa, daids_july_2017
4
2
 
5
3
  grading_data = {}
6
- grading_data.update(**dummies)
7
- grading_data.update(**chemistries)
8
- grading_data.update(**hematology)
4
+ grading_data.update(**daids_july_2017.dummies)
5
+ grading_data.update(**daids_july_2017.chemistries)
6
+ grading_data.update(**daids_july_2017.hematology)
9
7
 
10
- site_reportables.register(
11
- name="meta",
12
- normal_data=normal_data,
8
+ collection_name = "meta"
9
+ normal_data = africa.normal_data
10
+ reportable_grades = [3, 4]
11
+ reportable_grades_exceptions = {}
12
+
13
+ reference_range_options = dict(
14
+ collection_name=collection_name,
15
+ normal_data=africa.normal_data,
13
16
  grading_data=grading_data,
14
- reportable_grades=[GRADE3, GRADE4],
15
- reportable_grades_exceptions=None,
17
+ reportable_grades=reportable_grades,
18
+ reportable_grades_exceptions=reportable_grades_exceptions,
16
19
  )
@@ -1,16 +1,37 @@
1
- from tempfile import mkdtemp
2
-
3
1
  from django.test import TestCase
4
- from edc_reportable import ParserError, site_reportables
2
+ from edc_reportable.models import GradingData, NormalData, ReferenceRangeCollection
3
+ from edc_reportable.utils import load_reference_ranges
5
4
 
6
5
 
7
6
  class TestReportables(TestCase):
8
- def test(self):
9
- try:
10
- from meta_labs import reportables # noqa
11
- except ParserError:
12
- self.fail("ParserError unexpectedly raised.")
13
- self.assertIsNotNone(site_reportables.get("meta"))
14
- filename1, filename2 = site_reportables.to_csv("meta", path=mkdtemp())
15
- print(filename1)
16
- print(filename2)
7
+ def test_load_reference_ranges(self):
8
+
9
+ from meta_labs.reportables import (
10
+ collection_name,
11
+ grading_data,
12
+ normal_data,
13
+ reportable_grades,
14
+ reportable_grades_exceptions,
15
+ )
16
+
17
+ load_reference_ranges(
18
+ collection_name=collection_name,
19
+ grading_data=grading_data,
20
+ normal_data=normal_data,
21
+ reportable_grades=reportable_grades,
22
+ reportable_grades_exceptions=reportable_grades_exceptions,
23
+ )
24
+ self.assertTrue(ReferenceRangeCollection.objects.filter(name=collection_name).exists())
25
+ reference_range_collection = ReferenceRangeCollection.objects.get(name=collection_name)
26
+ self.assertEqual(
27
+ NormalData.objects.filter(
28
+ reference_range_collection=reference_range_collection
29
+ ).count(),
30
+ 82,
31
+ )
32
+ self.assertEqual(
33
+ GradingData.objects.filter(
34
+ reference_range_collection=reference_range_collection
35
+ ).count(),
36
+ 172,
37
+ )
@@ -0,0 +1,41 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "id": "0",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": []
10
+ },
11
+ {
12
+ "cell_type": "code",
13
+ "execution_count": null,
14
+ "id": "1",
15
+ "metadata": {},
16
+ "outputs": [],
17
+ "source": []
18
+ }
19
+ ],
20
+ "metadata": {
21
+ "kernelspec": {
22
+ "display_name": "Python 3",
23
+ "language": "python",
24
+ "name": "python3"
25
+ },
26
+ "language_info": {
27
+ "codemirror_mode": {
28
+ "name": "ipython",
29
+ "version": 2
30
+ },
31
+ "file_extension": ".py",
32
+ "mimetype": "text/x-python",
33
+ "name": "python",
34
+ "nbconvert_exporter": "python",
35
+ "pygments_lexer": "ipython2",
36
+ "version": "2.7.6"
37
+ }
38
+ },
39
+ "nbformat": 4,
40
+ "nbformat_minor": 5
41
+ }
@@ -0,0 +1,37 @@
1
+ # Generated by Django 5.2.1 on 2025-06-02 18:20
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("meta_prn", "0062_alter_endofstudy_offstudy_reason_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="historicaloffstudymedication",
15
+ name="singleton_field",
16
+ field=models.CharField(
17
+ db_index=True,
18
+ editable=False,
19
+ help_text="auto updated for unique constraint",
20
+ max_length=50,
21
+ null=True,
22
+ verbose_name="subject identifier",
23
+ ),
24
+ ),
25
+ migrations.AddField(
26
+ model_name="offstudymedication",
27
+ name="singleton_field",
28
+ field=models.CharField(
29
+ editable=False,
30
+ help_text="auto updated for unique constraint",
31
+ max_length=50,
32
+ null=True,
33
+ unique=True,
34
+ verbose_name="subject identifier",
35
+ ),
36
+ ),
37
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.1 on 2025-06-02 18:43
2
+
3
+ from django.db import migrations
4
+ from django.db.models import F
5
+
6
+
7
+ def update_singeton_field(apps, schema_editor):
8
+ model_cls = apps.get_model("meta_prn.offstudymedication")
9
+ model_cls.objects.update(singleton_field=F("subject_identifier"))
10
+
11
+
12
+ class Migration(migrations.Migration):
13
+
14
+ dependencies = [
15
+ ("meta_prn", "0063_historicaloffstudymedication_singleton_field_and_more"),
16
+ ]
17
+
18
+ operations = [migrations.RunPython(update_singeton_field)]
@@ -32,6 +32,8 @@ from ..constants import CLINICAL_WITHDRAWAL, COMPLETED_FOLLOWUP_48
32
32
  # TODO: take off study meds but coninue followup (WITHDRAWAL)
33
33
  # TODO: follow on new schedule, if permanently off drug (Single 36m visit)
34
34
 
35
+ # TODO: add label for "End of followup as per protocol FEB2026"
36
+
35
37
 
36
38
  class EndOfStudy(ActionModelMixin, SiteModelMixin, OffstudyModelMixin, BaseUuidModel):
37
39
  action_name = END_OF_STUDY_ACTION
@@ -3,6 +3,7 @@ from edc_action_item.models import ActionModelMixin
3
3
  from edc_identifier.model_mixins import NonUniqueSubjectIdentifierFieldMixin
4
4
  from edc_model.models import BaseUuidModel
5
5
  from edc_pharmacy.models import Medication
6
+ from edc_prn.models import SingletonPrnModelMixin
6
7
  from edc_sites.model_mixins import SiteModelMixin
7
8
  from edc_utils import get_utcnow
8
9
 
@@ -16,6 +17,7 @@ class OffStudyMedication(
16
17
  NonUniqueSubjectIdentifierFieldMixin,
17
18
  SiteModelMixin,
18
19
  ActionModelMixin,
20
+ SingletonPrnModelMixin,
19
21
  BaseUuidModel,
20
22
  ):
21
23
  action_name = OFFSTUDY_MEDICATION_ACTION
@@ -1,15 +1,12 @@
1
1
  from edc_constants.constants import NEG, NO, NOT_APPLICABLE
2
2
  from edc_egfr import EgfrCkdEpi
3
3
  from edc_egfr.calculators import EgfrCalculatorError
4
- from edc_reportable import (
5
- MICROMOLES_PER_LITER,
6
- MILLIMOLES_PER_LITER,
7
- ConversionNotHandled,
8
- calculate_bmi,
9
- convert_units,
10
- )
4
+ from edc_reportable.exceptions import ConversionNotHandled
5
+ from edc_reportable.units import MICROMOLES_PER_LITER, MILLIMOLES_PER_LITER
6
+ from edc_reportable.utils import convert_units
11
7
  from edc_screening.fc import FC
12
8
  from edc_screening.screening_eligibility import ScreeningEligibility
9
+ from edc_vitals.calculators import calculate_bmi
13
10
 
14
11
 
15
12
  class BaseEligibilityPartThree(ScreeningEligibility):
@@ -82,64 +79,79 @@ class BaseEligibilityPartThree(ScreeningEligibility):
82
79
 
83
80
  @property
84
81
  def converted_creatinine_value(self):
85
- try:
86
- value = convert_units(
87
- self.creatinine_value,
88
- units_from=self.creatinine_units,
89
- units_to=MICROMOLES_PER_LITER,
90
- )
91
- except ConversionNotHandled as e:
92
- raise ConversionNotHandled(f"Creatinine. {e}")
82
+ value = None
83
+ if self.creatinine_value and self.creatinine_units:
84
+ try:
85
+ value = convert_units(
86
+ label="creatinine",
87
+ value=self.creatinine_value,
88
+ units_from=self.creatinine_units,
89
+ units_to=MICROMOLES_PER_LITER,
90
+ )
91
+ except ConversionNotHandled as e:
92
+ raise ConversionNotHandled(f"Creatinine. {e}")
93
93
  if value and float(value) > 999999.9999:
94
94
  raise ConversionNotHandled("Creatinine value is absurd.")
95
95
  return value
96
96
 
97
97
  @property
98
98
  def converted_fbg_value(self):
99
- try:
100
- value = convert_units(
101
- self.fbg_value,
102
- units_from=self.fbg_units,
103
- units_to=MILLIMOLES_PER_LITER,
104
- )
105
- except ConversionNotHandled as e:
106
- raise ConversionNotHandled(f"FBG. {e}")
99
+ value = None
100
+ if self.fbg_value and self.fbg_units:
101
+ try:
102
+ value = convert_units(
103
+ label="glucose",
104
+ value=self.fbg_value,
105
+ units_from=self.fbg_units,
106
+ units_to=MILLIMOLES_PER_LITER,
107
+ )
108
+ except ConversionNotHandled as e:
109
+ raise ConversionNotHandled(f"FBG. {e}")
107
110
  return value
108
111
 
109
112
  @property
110
113
  def converted_fbg2_value(self):
111
- try:
112
- value = convert_units(
113
- self.fbg2_value,
114
- units_from=self.fbg2_units,
115
- units_to=MILLIMOLES_PER_LITER,
116
- )
117
- except ConversionNotHandled as e:
118
- raise ConversionNotHandled(f"FBG2. {e}")
114
+ value = None
115
+ if self.fbg2_value and self.fbg2_units:
116
+ try:
117
+ value = convert_units(
118
+ label="glucose",
119
+ value=self.fbg2_value,
120
+ units_from=self.fbg2_units,
121
+ units_to=MILLIMOLES_PER_LITER,
122
+ )
123
+ except ConversionNotHandled as e:
124
+ raise ConversionNotHandled(f"FBG2. {e}")
119
125
  return value
120
126
 
121
127
  @property
122
128
  def converted_ogtt_value(self):
123
- try:
124
- value = convert_units(
125
- self.ogtt_value,
126
- units_from=self.ogtt_units,
127
- units_to=MILLIMOLES_PER_LITER,
128
- )
129
- except ConversionNotHandled as e:
130
- raise ConversionNotHandled(f"OGTT. {e}")
129
+ value = None
130
+ if self.ogtt_value and self.ogtt_units:
131
+ try:
132
+ value = convert_units(
133
+ label="glucose",
134
+ value=self.ogtt_value,
135
+ units_from=self.ogtt_units,
136
+ units_to=MILLIMOLES_PER_LITER,
137
+ )
138
+ except ConversionNotHandled as e:
139
+ raise ConversionNotHandled(f"OGTT. {e}")
131
140
  return value
132
141
 
133
142
  @property
134
143
  def converted_ogtt2_value(self):
135
- try:
136
- value = convert_units(
137
- self.ogtt2_value,
138
- units_from=self.ogtt2_units,
139
- units_to=MILLIMOLES_PER_LITER,
140
- )
141
- except ConversionNotHandled as e:
142
- raise ConversionNotHandled(f"OGTT2. {e}")
144
+ value = None
145
+ if self.ogtt2_value and self.ogtt2_units:
146
+ try:
147
+ value = convert_units(
148
+ label="glucose",
149
+ value=self.ogtt2_value,
150
+ units_from=self.ogtt2_units,
151
+ units_to=MILLIMOLES_PER_LITER,
152
+ )
153
+ except ConversionNotHandled as e:
154
+ raise ConversionNotHandled(f"OGTT2. {e}")
143
155
  return value
144
156
 
145
157
  def set_eligible_model_field(self):
@@ -74,7 +74,12 @@ class ScreeningPartThreeFormValidator(
74
74
  self.validate_creatinine_required_fields()
75
75
  self.required_if(YES, field="hba1c_performed", field_required="hba1c_datetime")
76
76
  self.required_if(YES, field="hba1c_performed", field_required="hba1c_value")
77
- self.validate_egfr()
77
+ self.validate_egfr(
78
+ gender=self.instance.gender,
79
+ age_in_years=self.instance.age_in_years,
80
+ weight_in_kgs=self.cleaned_data.get("weight"),
81
+ ethnicity=self.instance.ethnicity,
82
+ )
78
83
  self.validate_suitability_for_study()
79
84
 
80
85
  @property
@@ -14,6 +14,7 @@ from edc_list_data.site_list_data import site_list_data
14
14
  from edc_metadata import REQUIRED
15
15
  from edc_metadata.models import CrfMetadata
16
16
  from edc_randomization.site_randomizers import site_randomizers
17
+ from edc_reportable.utils import load_reference_ranges
17
18
  from edc_sites.site import sites
18
19
  from edc_sites.utils import add_or_update_django_sites
19
20
  from edc_visit_tracking.constants import SCHEDULED
@@ -21,6 +22,7 @@ from model_bakery import baker
21
22
 
22
23
  from meta_consent.models import SubjectConsent, SubjectConsentV1Ext
23
24
  from meta_edc.meta_version import PHASE_THREE
25
+ from meta_labs.reportables import reference_range_options
24
26
  from meta_pharmacy.prepare_meta_pharmacy import prepare_meta_pharmacy
25
27
  from meta_sites.sites import domain_suffix
26
28
  from meta_subject.models import SubjectVisit
@@ -53,6 +55,7 @@ class MetaTestCaseMixin(AppointmentTestCaseMixin):
53
55
 
54
56
  @classmethod
55
57
  def setUpTestData(cls):
58
+ load_reference_ranges(**reference_range_options)
56
59
  import_holidays(test=True)
57
60
  add_or_update_django_sites(single_sites=sites.get_by_country("tanzania", aslist=True))
58
61
  if cls.import_randomization_list:
@@ -3,7 +3,8 @@ from random import choices
3
3
 
4
4
  from dateutil.relativedelta import relativedelta
5
5
  from django.test import TestCase
6
- from edc_constants.constants import FEMALE, MALE, NO, NOT_APPLICABLE, POS, YES
6
+ from edc_constants.constants import BLACK, FEMALE, MALE, NO, NOT_APPLICABLE, POS, YES
7
+ from edc_reportable import MILLIGRAMS_PER_DECILITER
7
8
  from edc_utils.date import get_utcnow
8
9
 
9
10
  from meta_screening.forms import (
@@ -394,4 +395,10 @@ class TestForms(ScreeningTestMixin, TestCase):
394
395
  def test_screening_creatinine(self):
395
396
  instance = self.complete_part_one(hospital_identifier="9678281237")
396
397
  _, instance = self.complete_part_two(instance=instance)
397
- self.complete_part_three(instance=instance, verbose=True, creatinine=9000.0)
398
+ self.complete_part_three(
399
+ instance=instance,
400
+ verbose=True,
401
+ ethnicity=BLACK,
402
+ creatinine_value=1.5,
403
+ creatinine_units=MILLIGRAMS_PER_DECILITER,
404
+ )