meta-edc 0.3.36__py3-none-any.whl → 0.3.38__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 (37) hide show
  1. meta_analytics/__init__.py +1 -1
  2. meta_analytics/dataframes/__init__.py +1 -0
  3. meta_analytics/dataframes/constants.py +1 -1
  4. meta_analytics/dataframes/get_eos_df.py +26 -0
  5. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +102 -79
  6. meta_analytics/dataframes/screening/get_screening_df.py +42 -6
  7. meta_analytics/get_tables.py +4 -28
  8. meta_edc/settings/debug.py +2 -2
  9. meta_edc-0.3.38.dist-info/METADATA +766 -0
  10. {meta_edc-0.3.36.dist-info → meta_edc-0.3.38.dist-info}/RECORD +36 -20
  11. {meta_edc-0.3.36.dist-info → meta_edc-0.3.38.dist-info}/WHEEL +1 -1
  12. meta_pharmacy/admin/__init__.py +3 -0
  13. meta_pharmacy/admin/label_admin.py +0 -0
  14. meta_pharmacy/admin/lot_number_admin.py +43 -0
  15. meta_pharmacy/admin/rx_admin.py +75 -0
  16. meta_pharmacy/{admin.py → admin/substitutions_admin.py} +3 -71
  17. meta_pharmacy/labels/__init__.py +2 -0
  18. meta_pharmacy/labels/get_label_data.py +30 -0
  19. meta_pharmacy/labels/print_sheets.py +86 -0
  20. meta_pharmacy/migrations/0006_lotnumber_label.py +289 -0
  21. meta_pharmacy/migrations/0007_lotnumber_medication.py +24 -0
  22. meta_pharmacy/models/__init__.py +4 -0
  23. meta_pharmacy/models/label.py +50 -0
  24. meta_pharmacy/models/lot_number.py +25 -0
  25. meta_pharmacy/models/rx.py +18 -0
  26. meta_pharmacy/{models.py → models/substitutions.py} +2 -16
  27. meta_reports/admin/endpoints_admin.py +1 -1
  28. meta_reports/admin/modeladmin_mixins.py +5 -5
  29. meta_reports/migrations/0050_alter_endpoints_created.py +19 -0
  30. meta_reports/migrations/0051_remove_endpoints_baseline_datetime_and_more.py +40 -0
  31. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +3 -1
  32. meta_reports/models/endpoints.py +3 -3
  33. meta_visit_schedule/visit_schedules/phase_three/crfs.py +1 -0
  34. meta_edc-0.3.36.dist-info/METADATA +0 -94
  35. {meta_edc-0.3.36.dist-info → meta_edc-0.3.38.dist-info}/AUTHORS +0 -0
  36. {meta_edc-0.3.36.dist-info → meta_edc-0.3.38.dist-info}/LICENSE +0 -0
  37. {meta_edc-0.3.36.dist-info → meta_edc-0.3.38.dist-info}/top_level.txt +0 -0
@@ -82,20 +82,21 @@ 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
83
  meta_ae/tests/tests/test_actions.py,sha256=W4UglCSs4GLU0_I5grpCz3xprk2OQso2Q6c_9aYWiu8,4915
84
84
  meta_analytics/README.rst,sha256=x5KDks1P2bSPdyq3f9CNkynAAgJaXl7AX_3rnmC16HU,357
85
- meta_analytics/__init__.py,sha256=kw_E-hvxNPuGxraTF6L5MFzADYn3vTSmww1vcGr96CQ,104
85
+ meta_analytics/__init__.py,sha256=O4Fkrtyo15GEfghFcb5u_5MRt5J0BvKvtU_mqUX5_yU,116
86
86
  meta_analytics/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
- meta_analytics/get_tables.py,sha256=KDCFdzQmwtCdTrMrODpEDHQXVNzztOa8UiqV6C4hzlc,3043
88
- meta_analytics/dataframes/__init__.py,sha256=EsDu7Dn6mz4yz2enKyrdZiQKN224VwcD7VqTzYGdYjs,453
89
- meta_analytics/dataframes/constants.py,sha256=XIt19uf5aSxiOVzkvHtUHs1RJo-1XqJLQOySOJvhQb8,789
87
+ meta_analytics/get_tables.py,sha256=3jFmvLXWHY3FPd1u5OPVpAKWUcruCH0-A0KdKiiFGpc,2219
88
+ meta_analytics/dataframes/__init__.py,sha256=lTRGk8ctu02SFDTVLoLOUHja2_bzvTQyRgqqUuvCWfg,488
89
+ meta_analytics/dataframes/constants.py,sha256=Wcub_3U5xHa027ykotySiUxMECjmswGIADVeT0iJXXs,792
90
+ meta_analytics/dataframes/get_eos_df.py,sha256=YJ0YB93FkqwpNfWDphzFbX6B7BannbvfScc0WEgtn2w,778
90
91
  meta_analytics/dataframes/utils.py,sha256=2V3nFFnaysuJvNrcHUOLqOk8e_3aP71079kB_YBXcQw,2014
91
92
  meta_analytics/dataframes/enrolled/__init__.py,sha256=uKniE7L86umlSmGOjAFuwwsbyZj31mELGUpY3hByo4s,43
92
93
  meta_analytics/dataframes/enrolled/get_glucose_df.py,sha256=L4gzszNjYzu-QmYu4gs1c7_Edcv7FgAjucihxHtANSY,5004
93
94
  meta_analytics/dataframes/glucose_endpoints/__init__.py,sha256=a9RlAnFM0Z4AKw-WztBvnGMo3tLLe1dx3292A2n_CnA,107
94
95
  meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py,sha256=aOadsfeclOEGFo5agSZUbY2NdM8iZDsOLdg-5j8aelg,7011
95
- meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py,sha256=rWbCTg4D35Gp2BI3DjWZcfBOiMCwwTMyjewXsRNk1YE,20489
96
+ meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py,sha256=052BpLJoJezjr2tMXI5-GBRk_e6gT0bZZsjhx_Uhlm8,21550
96
97
  meta_analytics/dataframes/screening/__init__.py,sha256=onGpmB4474gu_JcyRGdRy09YQyP2Np-mX-rYZTFdJoA,114
97
98
  meta_analytics/dataframes/screening/get_glucose_tested_only_df.py,sha256=0oMJIsIJRjurfpPONuJ4Aoab1UJikezGe3lQNWRoOo4,660
98
- meta_analytics/dataframes/screening/get_screening_df.py,sha256=_6AmaHvH06ubFGiQB6XbVRkVGE5kvtbVbDfs7k5TPX8,4854
99
+ meta_analytics/dataframes/screening/get_screening_df.py,sha256=esR15RRNhgCaZzZpYEv3LzIkz5S4ly1bmGOJbpqwKeU,6144
99
100
  meta_analytics/tables/__init__.py,sha256=mhESCt0Lq4RJU-lbQ5fVfIbXzrEsootGYp7EzQIqDBI,70
100
101
  meta_analytics/tables/eligible.py,sha256=2q-SMbAsrBgOVc4Ttq5P3bpjsUKwP5hYhJBMgyH6GGI,3389
101
102
  meta_analytics/tables/has_dm.py,sha256=W6pObFI7k2hpL46Q7t2QIfYDVfo7-PHJMdCv6Q5EUQk,1739
@@ -231,7 +232,7 @@ meta_edc/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
231
232
  meta_edc/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
233
  meta_edc/management/commands/update_forms_reference.py,sha256=_DiCqhHUk8lGhDGlsjOA069EE-g7UBDlZQCH6L1xiHo,1003
233
234
  meta_edc/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
234
- meta_edc/settings/debug.py,sha256=PUUzyXtMyiKYCyqHeD-mT6PjEKJS8ASDcSxtiG84E1Y,947
235
+ meta_edc/settings/debug.py,sha256=-PvZN-nPpEBr49ndpBHFcV71SDu1tAXmVfKESDFIr4Q,947
235
236
  meta_edc/settings/defaults.py,sha256=Q1WJEfWQF5A-IvFoMeyQi0n5BaPmXSgpfAkJ011B_SY,18764
236
237
  meta_edc/settings/live.py,sha256=uLTlsIc3H6gdE_7pkL6vyOVa6V_74hnXFkiojqGFAYY,264
237
238
  meta_edc/settings/logging.py,sha256=6qVUE37OMkf5rzwTmMq4krFsZ2jcyCpWdFtGih_Cs4U,1938
@@ -289,20 +290,33 @@ meta_lists/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
289
290
  meta_lists/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
290
291
  meta_lists/tests/test_lists.py,sha256=qcp2emRyd5-cP2oLluy8MpUucBDQ8_GdUxjh2KbZPv4,212
291
292
  meta_pharmacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
292
- meta_pharmacy/admin.py,sha256=-HCVaaDFtt_uHzdaSQfM5yDfP44_VgIl-s-IcrPQqzg,3535
293
293
  meta_pharmacy/admin_site.py,sha256=Ekq8Z13f1w4Llm6exO5w4Jk4Bvt-5WN1ydy_BS2rbdI,171
294
294
  meta_pharmacy/apps.py,sha256=VNiKT23F5d5nkXxzu1L-kAqovNOdfxzp-cUC6qcioVQ,732
295
295
  meta_pharmacy/constants.py,sha256=d3NAZwpxCDm9LLQ_QGKBG2txooYg748Ajh8a2deF0kw,263
296
296
  meta_pharmacy/forms.py,sha256=4BX6rB7FWBWYlOB2BX4hh3scz5eeKaxt2OCyQBCBO-E,2162
297
- meta_pharmacy/models.py,sha256=qwjsvsCr7ryb8DRn1aYD1_wOpAQR6ffumLuYNGxeNEs,3395
298
297
  meta_pharmacy/prepare_meta_pharmacy.py,sha256=5gNiPkmOzWwCW-_q6hgIzj_0tnPuN4Tl1lVI6FygNgs,2945
299
298
  meta_pharmacy/urls.py,sha256=jncXssL_SeRhb_OJVXLdGFvPT3BqtrkSPdq-eyJnGfY,207
299
+ meta_pharmacy/admin/__init__.py,sha256=64RWTeC6qO1G800qe2V7vgeQQ5qo5yEKXTnvviKUBQ4,127
300
+ meta_pharmacy/admin/label_admin.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
301
+ meta_pharmacy/admin/lot_number_admin.py,sha256=q35jVWzqyqup_NtLUa0b_c3_3H3S30U5DroCdbGkyy0,981
302
+ meta_pharmacy/admin/rx_admin.py,sha256=SQGsugSnhbU3YUk_ssSTMmCH6no8ZkHoqLLkbZbBbk0,1851
303
+ meta_pharmacy/admin/substitutions_admin.py,sha256=N2WcuC4REAEX0zrNqQHsPbZI82I4T5UM7EP-ohDOSSI,1934
304
+ meta_pharmacy/labels/__init__.py,sha256=fT7pVRKOJGbW4RLqfTP1UsdmZpI1k2tG1G53XVKQZHw,82
305
+ meta_pharmacy/labels/get_label_data.py,sha256=QsveAPMlb_LKnltP5Hxsk1mdCkSGhn-cQ_nDkHE3QD0,1088
306
+ meta_pharmacy/labels/print_sheets.py,sha256=Z72s2Uu-nWSk2ETlkc6TA59XHgrloIh4t5F9jihoCuU,2540
300
307
  meta_pharmacy/migrations/0001_initial.py,sha256=2uyWhZ-Qkjum1gJJA5v-BWUdpmKhkf8BcuDQMl8895s,1115
301
308
  meta_pharmacy/migrations/0002_initial.py,sha256=zkPXmGhdEi-EM0HJRBaTUAltdiLRjW1BhU4GEydoBM8,27355
302
309
  meta_pharmacy/migrations/0003_auto_20240909_2335.py,sha256=_hbzV6HaBm-VS_jQMhl3w5srvyaYOQclLBvr_8f79uk,2227
303
310
  meta_pharmacy/migrations/0004_alter_historicalsubstitutions_report_datetime_and_more.py,sha256=33SpQ4UtFs3gblj4WG3KtKtalo8Wynv3uyUOqBe7_Zo,585
304
311
  meta_pharmacy/migrations/0005_auto_20240911_0352.py,sha256=ZwjFlBX_ubNDbTnDny7cvgCb4aSiqhVKhTYDWd6oQmg,534
312
+ meta_pharmacy/migrations/0006_lotnumber_label.py,sha256=hdxvRC-v6appuLFzBJg-PAY30qgkdA_XdAZP6mwq7Mo,11279
313
+ meta_pharmacy/migrations/0007_lotnumber_medication.py,sha256=uTR_ZYm22n8C1uiWJGfWgtEcYBQ8DdEGvNhQAH_PqNA,646
305
314
  meta_pharmacy/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
315
+ meta_pharmacy/models/__init__.py,sha256=lMchriYF--D3oW_nFVd9n6VuFNRdDbrlWQj8ARyyVuA,130
316
+ meta_pharmacy/models/label.py,sha256=FlnBQyXZmPUrT_Ibg0L-FQ6oPwBGxFWvf_pMSKDxs-s,1546
317
+ meta_pharmacy/models/lot_number.py,sha256=JUT-TXsM_2U3UO6VDz7D10WTNupIjYYAlBVBlzi2VmU,693
318
+ meta_pharmacy/models/rx.py,sha256=cx0T9j2Vb-6tEotWA7ohsn2OGHnQpxiFQnu7__hx7Ts,379
319
+ meta_pharmacy/models/substitutions.py,sha256=9FjjD4x66B8SxABZR5atan2S5uE4nJH0tn0ujB4xEbA,3071
306
320
  meta_prn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
307
321
  meta_prn/action_items.py,sha256=wz6X7Ve8ibqPBO5kB6S9rYYkWfx8JxsoYRVppzIGAzk,9110
308
322
  meta_prn/admin_site.py,sha256=E4dJ6ofu9Kp-1SIWIuY3PraVPbEJSWBBqhorJPGUNqU,161
@@ -442,10 +456,10 @@ meta_reports/tasks.py,sha256=wPzfm99Hox1AIvt1KxYg1r6g9v8ta2AHOHesoN6AxEk,370
442
456
  meta_reports/urls.py,sha256=_c6AMrK4U5MsyFSU2JSPNfiZlbhuw24C7CyPNYpqGd0,206
443
457
  meta_reports/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
444
458
  meta_reports/admin/__init__.py,sha256=3GDQM-HA1h8FdsmGSAiPaCd1paMGGJHTq6Ivd4Ob9bA,434
445
- meta_reports/admin/endpoints_admin.py,sha256=L4mDLNIkR6203RI3ImBYel2kevaH_Nwa6KMYuoDwyNU,518
459
+ meta_reports/admin/endpoints_admin.py,sha256=7wZCdC-D-QHI1bb_ucgyDZYlnYD7mWtcZpcH_LftkLs,514
446
460
  meta_reports/admin/endpoints_all_admin.py,sha256=_czdezZf9fSjwZJmO-3HbmdXrXP6nk8-HdiweqUzPRE,476
447
461
  meta_reports/admin/list_filters.py,sha256=pByBzz9-qGwqBfdZFlByxJUZDTJQXOTWfNLjmK8KF00,870
448
- meta_reports/admin/modeladmin_mixins.py,sha256=RhdkF5W9ccuwaX5NTMF4b9shQJgDFaOlj7ENOTBAG0g,3669
462
+ meta_reports/admin/modeladmin_mixins.py,sha256=tEZYw0xNMfBvo2RLDrYfi_S9lbZU02dwtLxdRDZob4Q,3663
449
463
  meta_reports/admin/dbviews/__init__.py,sha256=2yPu0SO7ZX9yjan0OS9izzws14YYoXcGXmZhwJhax1I,675
450
464
  meta_reports/admin/dbviews/glucose_summary_admin.py,sha256=NqnDKx5l0Q-2xxRGdnf50DaRX1Sn8-DC0jHSk96LkRo,4005
451
465
  meta_reports/admin/dbviews/imp_substitutions_admin.py,sha256=-poOw3fJK7jQERB1PNXNDrWNthwEQpiwmrxoWOsDtjI,3622
@@ -514,9 +528,11 @@ meta_reports/migrations/0046_auto_20240829_0250.py,sha256=lKVlj7LrkOJ49LJxccYvQd
514
528
  meta_reports/migrations/0047_impsubstitutions.py,sha256=VPTb5j2t9IvwR-Bq0lnVBGLAVKdL7IbY8DD-cjl_m5o,2088
515
529
  meta_reports/migrations/0048_auto_20240909_2338.py,sha256=mYAOUzJohv9eW9y93fpZTmlgmx_eOBRhUBMr0F3_-_M,3169
516
530
  meta_reports/migrations/0049_auto_20240911_0327.py,sha256=APBkFY9kwzEmhTXkK2-bu6csikh_dVEMH6t2dv_Iz9M,4760
531
+ meta_reports/migrations/0050_alter_endpoints_created.py,sha256=nqNIgK_cek2gtEhopdy0Sm1HuIjL3-PscYPN16ma474,439
532
+ meta_reports/migrations/0051_remove_endpoints_baseline_datetime_and_more.py,sha256=jq5N4un7QTCLe54WKJjfCL32X_QnyCiDRV3spwgseJI,1053
517
533
  meta_reports/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
518
534
  meta_reports/models/__init__.py,sha256=8JnKMG9devIPboCCGj423x77Ylry2ROdGOnDSk5Xo4w,380
519
- meta_reports/models/endpoints.py,sha256=HfxQuKkzu883xbTeVfIEktN-ARoGe1qC6KgEAzRtV5E,925
535
+ meta_reports/models/endpoints.py,sha256=iMx8QIi_hLANIwZmAw1OJ_jPuDdml8s181Skh8UF9bM,901
520
536
  meta_reports/models/endpoints_proxy.py,sha256=3h3JGaPmnJedFPVWGrk4idV4YtdihqiCI5W7QomwG4E,318
521
537
  meta_reports/models/dbviews/README,sha256=GdeboB7Xqb-Qo_rE1ondcxP8Ps93MIjLzCePQCePig0,686
522
538
  meta_reports/models/dbviews/__init__.py,sha256=C5YGOKwVAexjWxLh5vl0m561TBMWDM_yAvIrwqG_M70,559
@@ -524,7 +540,7 @@ meta_reports/models/dbviews/glucose_summary/__init__.py,sha256=Tfgjso4TpxMCidAdR
524
540
  meta_reports/models/dbviews/glucose_summary/unmanaged_model.py,sha256=uqhD5JLXtyQ94zpG5Puxodjzli3quE4GgiFi7en6EeM,1055
525
541
  meta_reports/models/dbviews/glucose_summary/view_definition.py,sha256=Fc5KN-It9dcBvRta-b26kUl8uQEHA19vrYIhNRqe2Xo,1512
526
542
  meta_reports/models/dbviews/imp_substitutions/__init__.py,sha256=N0507JzoVRtNA9W9_RoiAQYEQZGdvP2U8P83ZJMeZxQ,46
527
- meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py,sha256=ozrkfZFBHAnBBlEY19gRVj6eFiZrVfAnAV6E8OBwnP8,1223
543
+ meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py,sha256=U3ZIggcWAokmeCFV6w-0TOwZQ6tjzH4ZGYwoqVPrd7M,1240
528
544
  meta_reports/models/dbviews/imp_substitutions/view_definition.py,sha256=1t6znTYQJxM_-nTRjMgEY3T2L_ZDFvh2tw-zT8fmxQU,897
529
545
  meta_reports/models/dbviews/missing_screening_ogtt/__init__.py,sha256=7uX_2HfVU-3G1O_xecfGnE5_pcX5eceiRaapeDQtzIw,105
530
546
  meta_reports/models/dbviews/missing_screening_ogtt/note_model.py,sha256=JHItVS11WDFg3lTe7ayH9T7Epd-VvXXD_79FssrmAwc,1813
@@ -1117,7 +1133,7 @@ meta_visit_schedule/tests/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
1117
1133
  meta_visit_schedule/tests/tests/test_schedule.py,sha256=858fXo-PvbppgIsCAGll05fqnuWW6f-vMIwnvRLZgnc,7351
1118
1134
  meta_visit_schedule/visit_schedules/__init__.py,sha256=j0Q8tAGhHHbFBd3R-iLRy4QB47WgtucWG7xCLLfVvFU,339
1119
1135
  meta_visit_schedule/visit_schedules/phase_three/__init__.py,sha256=18ken4S10X0dkEFHj1EFO2M4xblXD04cjfhzIEkhYUQ,74
1120
- meta_visit_schedule/visit_schedules/phase_three/crfs.py,sha256=OxTgjIxS1hNJwsGGeJlGcY7KJW0DDuo3wavXt_7BneY,15339
1136
+ meta_visit_schedule/visit_schedules/phase_three/crfs.py,sha256=Gi9H3RmgNbrtgNCkDwkV3EXnE0Drct8dpsVA5AQhoFs,15402
1121
1137
  meta_visit_schedule/visit_schedules/phase_three/crfs_pregnancy.py,sha256=_I6IVLMC3-KlpI86eii790mlx-p2vxWxvNRKD927rXo,169
1122
1138
  meta_visit_schedule/visit_schedules/phase_three/requisitions.py,sha256=Noeki8zX2MCwQVmCCWfuOyh_aN4YC-cyhUmrAZP8d5g,4579
1123
1139
  meta_visit_schedule/visit_schedules/phase_three/schedule.py,sha256=J91AMawOdKWLJz_WAH897PJYr8264_Q_b8pZhI0Pj38,8228
@@ -1137,9 +1153,9 @@ tests/etc/user-rsa-restricted-private.pem,sha256=CUcHW9bznWdmmASN00hCzvxFPAFl4N2
1137
1153
  tests/etc/user-rsa-restricted-public.pem,sha256=mt84djoL-uHw6Wc5SJh0zml6VzXulnf8eQSFg7-fheg,450
1138
1154
  tests/etc/user-salt-local.key,sha256=x5anBw9fvbHurczouT3CjrkWb_xs7Ypm1htIJsgiuiw,256
1139
1155
  tests/etc/user-salt-restricted.key,sha256=pxmpcfBRNB-4C6wTvHXz-9fOfJgKIFOjaAF8ZFfa4q4,256
1140
- meta_edc-0.3.36.dist-info/AUTHORS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1141
- meta_edc-0.3.36.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1142
- meta_edc-0.3.36.dist-info/METADATA,sha256=VHTHIO2rIvXqsAZTTzUCz3jqXvjcUXG8qWlwlgwHgPY,3015
1143
- meta_edc-0.3.36.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
1144
- meta_edc-0.3.36.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1145
- meta_edc-0.3.36.dist-info/RECORD,,
1156
+ meta_edc-0.3.38.dist-info/AUTHORS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1157
+ meta_edc-0.3.38.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1158
+ meta_edc-0.3.38.dist-info/METADATA,sha256=7pQ_LETLSQ6O_1bbVxu21m_GUXdMm4Ef251Z1Fd_d7g,43436
1159
+ meta_edc-0.3.38.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
1160
+ meta_edc-0.3.38.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1161
+ meta_edc-0.3.38.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.2)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,3 @@
1
+ from .lot_number_admin import LotNumberAdmin
2
+ from .rx_admin import RxAdmin
3
+ from .substitutions_admin import SubstitutionsAdmin
File without changes
@@ -0,0 +1,43 @@
1
+ from django.contrib import admin
2
+ from django_audit_fields import audit_fieldset_tuple
3
+ from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
4
+
5
+ from ..admin_site import meta_pharmacy_admin
6
+ from ..models import LotNumber
7
+
8
+
9
+ @admin.register(LotNumber, site=meta_pharmacy_admin)
10
+ class LotNumberAdmin(ModelAdminSubjectDashboardMixin, admin.ModelAdmin):
11
+ """Admin class for proxy model of edc_pharmacy.Rx"""
12
+
13
+ show_object_tools = True
14
+
15
+ # form = LotNumberForm
16
+
17
+ fieldsets = (
18
+ (
19
+ None,
20
+ {
21
+ "fields": (
22
+ "lot_no",
23
+ "expiration_date",
24
+ "allocation",
25
+ "qty",
26
+ )
27
+ },
28
+ ),
29
+ audit_fieldset_tuple,
30
+ )
31
+
32
+ list_display = (
33
+ "lot_no",
34
+ "expiration_date",
35
+ )
36
+
37
+ radio_fields = {"allocation": admin.VERTICAL}
38
+
39
+ list_filter = ("allocation",)
40
+
41
+ search_fields = [
42
+ "lot_no",
43
+ ]
@@ -0,0 +1,75 @@
1
+ from django.contrib import admin
2
+ from django_audit_fields.admin import audit_fieldset_tuple
3
+ from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
4
+ from edc_pharmacy.admin.list_filters import MedicationsListFilter
5
+
6
+ from ..admin_site import meta_pharmacy_admin
7
+ from ..forms import RxForm
8
+ from ..models import Rx
9
+
10
+
11
+ @admin.register(Rx, site=meta_pharmacy_admin)
12
+ class RxAdmin(ModelAdminSubjectDashboardMixin, admin.ModelAdmin):
13
+ """Admin class for proxy model of edc_pharmacy.Rx"""
14
+
15
+ show_object_tools = True
16
+
17
+ form = RxForm
18
+
19
+ fieldsets = (
20
+ (
21
+ None,
22
+ {
23
+ "fields": (
24
+ "subject_identifier",
25
+ "report_datetime",
26
+ "rx_name",
27
+ "rx_date",
28
+ "medications",
29
+ "clinician_initials",
30
+ "notes",
31
+ )
32
+ },
33
+ ),
34
+ (
35
+ "Randomization",
36
+ {
37
+ "fields": ("rando_sid", "randomizer_name", "weight_in_kgs"),
38
+ },
39
+ ),
40
+ audit_fieldset_tuple,
41
+ )
42
+
43
+ filter_horizontal = ("medications",)
44
+
45
+ list_display = (
46
+ "subject_identifier",
47
+ "dashboard",
48
+ "rx_medications",
49
+ "rando_sid",
50
+ "rx_date",
51
+ "weight_in_kgs",
52
+ "rx_name",
53
+ )
54
+
55
+ list_filter = ("report_datetime", MedicationsListFilter, "site")
56
+
57
+ search_fields = (
58
+ "id",
59
+ "subject_identifier",
60
+ "rando_sid",
61
+ "registered_subject__initials",
62
+ "medications__name",
63
+ "site__id",
64
+ "rx_name",
65
+ )
66
+
67
+ readonly_fields = (
68
+ "rando_sid",
69
+ "weight_in_kgs",
70
+ "rx_name",
71
+ )
72
+
73
+ @admin.display
74
+ def rx_medications(self, obj):
75
+ return ", ".join([obj.display_name for obj in obj.medications.all()])
@@ -3,12 +3,11 @@ from django_audit_fields.admin import audit_fieldset_tuple
3
3
  from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
4
4
  from edc_model_admin.history import SimpleHistoryAdmin
5
5
  from edc_model_admin.list_filters import ReportDateListFilter
6
- from edc_pharmacy.admin.list_filters import MedicationsListFilter
7
6
  from edc_sites.admin import SiteModelAdminMixin
8
7
 
9
- from .admin_site import meta_pharmacy_admin
10
- from .forms import RxForm, SubstitutionsForm
11
- from .models import Rx, Substitutions
8
+ from ..admin_site import meta_pharmacy_admin
9
+ from ..forms import SubstitutionsForm
10
+ from ..models import Substitutions
12
11
 
13
12
 
14
13
  @admin.register(Substitutions, site=meta_pharmacy_admin)
@@ -66,70 +65,3 @@ class SubstitutionsAdmin(
66
65
  if obj.report_datetime:
67
66
  return obj.report_datetime.date()
68
67
  return None
69
-
70
-
71
- @admin.register(Rx, site=meta_pharmacy_admin)
72
- class RxAdmin(ModelAdminSubjectDashboardMixin, admin.ModelAdmin):
73
- """Admin class for proxy model of edc_pharmacy.Rx"""
74
-
75
- show_object_tools = True
76
-
77
- form = RxForm
78
-
79
- fieldsets = (
80
- (
81
- None,
82
- {
83
- "fields": (
84
- "subject_identifier",
85
- "report_datetime",
86
- "rx_name",
87
- "rx_date",
88
- "medications",
89
- "clinician_initials",
90
- "notes",
91
- )
92
- },
93
- ),
94
- (
95
- "Randomization",
96
- {
97
- "fields": ("rando_sid", "randomizer_name", "weight_in_kgs"),
98
- },
99
- ),
100
- audit_fieldset_tuple,
101
- )
102
-
103
- filter_horizontal = ("medications",)
104
-
105
- list_display = (
106
- "subject_identifier",
107
- "dashboard",
108
- "rx_medications",
109
- "rando_sid",
110
- "rx_date",
111
- "weight_in_kgs",
112
- "rx_name",
113
- )
114
-
115
- list_filter = ("report_datetime", MedicationsListFilter, "site")
116
-
117
- search_fields = (
118
- "id",
119
- "subject_identifier",
120
- "rando_sid",
121
- "registered_subject__initials",
122
- "medications__name",
123
- "site__id",
124
- "rx_name",
125
- )
126
-
127
- readonly_fields = (
128
- "rando_sid",
129
- "weight_in_kgs",
130
- "rx_name",
131
- )
132
-
133
- @admin.display
134
- def rx_medications(self, obj):
135
- return ", ".join([obj.display_name for obj in obj.medications.all()])
@@ -0,0 +1,2 @@
1
+ from .get_label_data import get_label_data
2
+ from .print_sheets import print_sheets
@@ -0,0 +1,30 @@
1
+ from django.core.exceptions import ObjectDoesNotExist
2
+ from tqdm import tqdm
3
+
4
+ from meta_consent.models import SubjectConsent
5
+ from meta_rando.models import RandomizationList
6
+
7
+ from ..models import Label, LotNumber, Rx
8
+
9
+
10
+ class InvalidLotNumber(Exception):
11
+ pass
12
+
13
+
14
+ def get_label_data(lot_no, max_labels: int | None = None) -> list[Label]:
15
+ try:
16
+ lot_no = LotNumber.objects.get(lot_no=lot_no)
17
+ except ObjectDoesNotExist:
18
+ raise ObjectDoesNotExist("The lot number given is invalid")
19
+ else:
20
+ labels = []
21
+ qs = SubjectConsent.objects.values("subject_identifier", "site_id", "gender").all()
22
+ for obj in tqdm(qs, total=qs.count()):
23
+ if max_labels and len(labels) >= max_labels:
24
+ break
25
+ rando = RandomizationList.objects.get(subject_identifier=obj["subject_identifier"])
26
+ if rando.assignment != lot_no.allocation:
27
+ continue
28
+ rx = Rx.objects.get(subject_identifier=obj["subject_identifier"])
29
+ labels.append(Label.objects.create(rx=rx, lot_no=lot_no))
30
+ return labels
@@ -0,0 +1,86 @@
1
+ import os.path
2
+ from pathlib import Path
3
+
4
+ from edc_sites.site import sites
5
+ from pylabels import Sheet, Specification
6
+ from reportlab.graphics.barcode.widgets import BarcodeStandard39
7
+ from reportlab.graphics.charts.textlabels import Label as RlLabel
8
+ from reportlab.graphics.shapes import String
9
+
10
+ from meta_pharmacy.models import Label
11
+
12
+
13
+ class LabelData:
14
+
15
+ def __init__(self, label: Label):
16
+ self.label = label
17
+ self.gender = label.rx.registered_subject.gender
18
+ self.site_id = label.rx.site_id
19
+ self.subject_identifier = label.rx.subject_identifier
20
+ self.reference = label.rx_label_reference
21
+ self.sid = label.rx.rando_sid
22
+ self.site_name = sites.get(self.site_id).title
23
+
24
+
25
+ def draw_label(label, width, height, data: Label):
26
+ data = LabelData(data)
27
+ br = BarcodeStandard39(
28
+ humanReadable=True, checksum=False, barHeight=30, barWidth=0.7, gap=1.7
29
+ )
30
+ br.value = data.reference
31
+ br.x = width - 140
32
+ br.y = 25
33
+ label.add(br)
34
+ label.add(String(15, height - 20, f"META III Study - {data.site_name}", fontSize=10))
35
+ label.add(
36
+ String(
37
+ width - 120, height - 40, f"{data.subject_identifier}{data.gender}", fontSize=12
38
+ )
39
+ )
40
+ label.add(String(15, height - 40, "Dawa kwa ajili ya utafiti", fontSize=10))
41
+ label.add(String(15, height - 50, "wa META III.", fontSize=10))
42
+ label.add(String(15, height - 70, "Meza vidonge vinne usiku tu.", fontSize=10))
43
+ label.add(String(15, 20, "128 tabs", fontSize=10))
44
+ lab = RlLabel(x=width - 20, y=40, fontSize=10, angle=90)
45
+ # lab.boxAnchor = "ne"
46
+ # lab.dx = 0
47
+ # lab.dy = -20
48
+ lab.setText(data.sid)
49
+ label.add(lab)
50
+ return label
51
+
52
+
53
+ def print_sheets(labels: list[Label], path: Path | None = None, verbose: bool | None = None):
54
+ specs = Specification(
55
+ 210,
56
+ 297,
57
+ 2,
58
+ 6,
59
+ 96,
60
+ 42,
61
+ corner_radius=0,
62
+ top_margin=21,
63
+ left_margin=8,
64
+ right_margin=8,
65
+ bottom_margin=22,
66
+ left_padding=2,
67
+ right_padding=2,
68
+ top_padding=2,
69
+ bottom_padding=2,
70
+ )
71
+
72
+ if not path:
73
+ path = Path(os.path.dirname(__file__))
74
+ path = str(path / "meta_labels.pdf")
75
+ sheet = Sheet(specs, draw_label, border=True)
76
+
77
+ sheet.add_labels(labels)
78
+
79
+ # Save the file and we are done.
80
+ sheet.save(path)
81
+ msg = "{0:d} label(s) output on {1:d} page(s) to {2}.".format(
82
+ sheet.label_count, sheet.page_count, path
83
+ )
84
+ if verbose:
85
+ print(msg)
86
+ return msg