meta-edc 0.3.33__py3-none-any.whl → 0.3.34__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 (41) hide show
  1. meta_auth/auth_objects.py +15 -0
  2. meta_auth/auths.py +5 -2
  3. meta_edc/settings/debug.py +2 -2
  4. meta_edc/settings/defaults.py +4 -0
  5. meta_edc/urls.py +1 -0
  6. {meta_edc-0.3.33.dist-info → meta_edc-0.3.34.dist-info}/METADATA +6 -3
  7. {meta_edc-0.3.33.dist-info → meta_edc-0.3.34.dist-info}/RECORD +40 -29
  8. {meta_edc-0.3.33.dist-info → meta_edc-0.3.34.dist-info}/WHEEL +1 -1
  9. meta_pharmacy/admin.py +128 -0
  10. meta_pharmacy/admin_site.py +5 -0
  11. meta_pharmacy/apps.py +3 -0
  12. meta_pharmacy/constants.py +10 -0
  13. meta_pharmacy/forms.py +65 -0
  14. meta_pharmacy/migrations/0002_initial.py +693 -0
  15. meta_pharmacy/migrations/0003_auto_20240909_2335.py +64 -0
  16. meta_pharmacy/models.py +102 -0
  17. meta_pharmacy/urls.py +8 -0
  18. meta_prn/action_items.py +9 -1
  19. meta_reports/admin/__init__.py +1 -0
  20. meta_reports/admin/dbviews/__init__.py +1 -0
  21. meta_reports/admin/dbviews/imp_substitutions_admin.py +88 -0
  22. meta_reports/migrations/0017_auto_20240819_1711.py +1 -0
  23. meta_reports/migrations/0047_impsubstitutions.py +56 -0
  24. meta_reports/migrations/0048_auto_20240909_2338.py +48 -0
  25. meta_reports/models/__init__.py +1 -0
  26. meta_reports/models/dbviews/__init__.py +1 -0
  27. meta_reports/models/dbviews/imp_substitutions/__init__.py +1 -0
  28. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +37 -0
  29. meta_reports/models/dbviews/imp_substitutions/view_definition.py +20 -0
  30. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +0 -1
  31. meta_sites/tests/test_sites.py +1 -1
  32. meta_subject/migrations/0107_auto_20220415_0043.py +28 -22
  33. meta_subject/migrations/0126_auto_20220719_2142.py +4 -4
  34. meta_subject/migrations/0131_auto_20220722_0411.py +28 -23
  35. meta_subject/migrations/0132_auto_20220722_1825.py +10 -6
  36. meta_subject/migrations/0135_auto_20220722_2212.py +39 -35
  37. meta_subject/migrations/0150_auto_20220914_0039.py +15 -11
  38. meta_analytics/notebooks/meta_endpoints.ipynb +0 -286
  39. {meta_edc-0.3.33.dist-info → meta_edc-0.3.34.dist-info}/AUTHORS +0 -0
  40. {meta_edc-0.3.33.dist-info → meta_edc-0.3.34.dist-info}/LICENSE +0 -0
  41. {meta_edc-0.3.33.dist-info → meta_edc-0.3.34.dist-info}/top_level.txt +0 -0
meta_auth/auth_objects.py CHANGED
@@ -3,6 +3,7 @@ from edc_auth.get_app_codenames import get_app_codenames
3
3
 
4
4
  META_REPORTS = "META_REPORTS"
5
5
  META_REPORTS_AUDIT = "META_REPORTS_AUDIT"
6
+ META_PHARMACIST = "META_PHARMACIST"
6
7
 
7
8
 
8
9
  clinic_codenames = get_app_codenames(
@@ -10,6 +11,20 @@ clinic_codenames = get_app_codenames(
10
11
  )
11
12
 
12
13
  reports_codenames = get_app_codenames("meta_reports")
14
+ reports_codenames.remove("meta_reports.view_impsubstitutions")
15
+
16
+ meta_pharmacy_codenames = get_app_codenames("meta_pharmacy")
17
+ meta_pharmacy_codenames.append("meta_reports.view_impsubstitutions")
18
+ meta_pharmacy_codenames.append("meta_reports.viewallsites_impsubstitutions")
19
+ excluded_meta_pharmacy_codenames = [
20
+ "meta_pharmacy.add_rx",
21
+ "meta_pharmacy.change_rx",
22
+ "meta_pharmacy.delete_rx",
23
+ ]
24
+
25
+ meta_pharmacy_codenames = [
26
+ c for c in meta_pharmacy_codenames if c not in excluded_meta_pharmacy_codenames
27
+ ]
13
28
 
14
29
  add_perms = []
15
30
  if not settings.LIVE_SYSTEM:
meta_auth/auths.py CHANGED
@@ -28,15 +28,18 @@ from edc_subject_dashboard.auths import SUBJECT_VIEW
28
28
  from edc_unblinding.auth_objects import UNBLINDING_REQUESTORS
29
29
 
30
30
  from .auth_objects import (
31
+ META_PHARMACIST,
31
32
  META_REPORTS,
32
33
  META_REPORTS_AUDIT,
33
34
  clinic_codenames,
35
+ meta_pharmacy_codenames,
34
36
  reports_codenames,
35
37
  screening_codenames,
36
38
  )
37
39
 
38
40
  site_auths.add_group(*reports_codenames, name=META_REPORTS)
39
41
  site_auths.add_group(*reports_codenames, name=META_REPORTS_AUDIT, view_only=True)
42
+ site_auths.add_group(*meta_pharmacy_codenames, name=META_PHARMACIST)
40
43
 
41
44
  # update edc_auth default groups
42
45
  site_auths.update_group(*clinic_codenames, name=AUDITOR, view_only=True)
@@ -69,8 +72,8 @@ site_auths.update_role(
69
72
  DATA_MANAGER_EXPORT,
70
73
  name=DATA_EXPORTER_ROLE,
71
74
  )
72
- site_auths.update_role(RANDO_UNBLINDED, PII, name=PHARMACIST_ROLE)
73
- site_auths.update_role(RANDO_BLINDED, PII, name=SITE_PHARMACIST_ROLE)
75
+ site_auths.update_role(RANDO_UNBLINDED, PII, META_PHARMACIST, name=PHARMACIST_ROLE)
76
+ site_auths.update_role(RANDO_BLINDED, PII, META_PHARMACIST, name=SITE_PHARMACIST_ROLE)
74
77
  site_auths.update_role(SUBJECT_VIEW, SCREENING_VIEW, name=DATA_MANAGER_ROLE)
75
78
  site_auths.update_role(
76
79
  SUBJECT_VIEW, SCREENING_VIEW, ACTION_ITEM, UNBLINDING_REQUESTORS, name=TMG_ROLE
@@ -7,8 +7,8 @@ from .defaults import * # noqa
7
7
  print(f"Settings file {__file__}")
8
8
 
9
9
  # TZ Sites:
10
- SITE_ID = SiteID(default=20) # Amana
11
- # SITE_ID = SiteID(default=10) # Hindu Mandal
10
+ # SITE_ID = SiteID(default=20) # Amana
11
+ SITE_ID = SiteID(default=10) # Hindu Mandal
12
12
  # SITE_ID = SiteID(default=40) # Mwananyamala
13
13
  # SITE_ID = SiteID(default=50) # Mbagala
14
14
  # SITE_ID = SiteID(default=60) # Mnazi-Moja
@@ -188,6 +188,7 @@ MIDDLEWARE = [
188
188
  "django.contrib.sites.middleware.CurrentSiteMiddleware",
189
189
  "django.middleware.csrf.CsrfViewMiddleware",
190
190
  "django.contrib.auth.middleware.AuthenticationMiddleware",
191
+ "django.contrib.auth.middleware.LoginRequiredMiddleware",
191
192
  "defender.middleware.FailedLoginMiddleware",
192
193
  "django.contrib.messages.middleware.MessageMiddleware",
193
194
  "django.middleware.clickjacking.XFrameOptionsMiddleware",
@@ -413,6 +414,9 @@ EDC_RANDOMIZATION_SKIP_VERIFY_CHECKS = True
413
414
  # edc-sites
414
415
  EDC_SITES_MODULE_NAME = env.str("EDC_SITES_MODULE_NAME")
415
416
 
417
+ # meta_pharmacy
418
+ META_PHARMACY_RX_SUBSTITUTION_FILE = env.str("META_PHARMACY_RX_SUBSTITUTION_FILE")
419
+
416
420
  # django-multisite
417
421
  CACHE_MULTISITE_KEY_PREFIX = "meta4"
418
422
  SILENCED_SYSTEM_CHECKS = ["sites.E101"]
meta_edc/urls.py CHANGED
@@ -62,6 +62,7 @@ urlpatterns = [
62
62
  *paths_for_urlpatterns("meta_consent"),
63
63
  *paths_for_urlpatterns("meta_export"),
64
64
  *paths_for_urlpatterns("meta_lists"),
65
+ *paths_for_urlpatterns("meta_pharmacy"),
65
66
  *paths_for_urlpatterns("meta_prn"),
66
67
  *paths_for_urlpatterns("meta_screening"),
67
68
  *paths_for_urlpatterns("meta_subject"),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meta-edc
3
- Version: 0.3.33
3
+ Version: 0.3.34
4
4
  Summary: META Trial EDC (http://www.isrctn.com/ISRCTN76157257)
5
5
  Home-page: https://github.com/meta-trial/meta-edc
6
6
  Author: Erik van Widenfelt
@@ -20,7 +20,7 @@ Requires-Python: >=3.12
20
20
  Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE
22
22
  License-File: AUTHORS
23
- Requires-Dist: edc ==0.6.10
23
+ Requires-Dist: edc ==0.6.11
24
24
  Requires-Dist: edc-microscopy
25
25
  Requires-Dist: beautifulsoup4
26
26
  Requires-Dist: edc-analytics
@@ -35,7 +35,10 @@ META Edc
35
35
 
36
36
  Metformin treatment in Africa- META
37
37
 
38
- https://www.lstmed.ac.uk/research/departments/international-public-health/respond-africa/meta
38
+ * https://www.ucl.ac.uk/global-health/research/z-research/respond-africa/metformin-treatment-africa-meta
39
+ * https://www.inteafrica.org/related-projects/meta-trial/
40
+ * https://www.lstmed.ac.uk/research/departments/international-public-health/respond-africa/meta
41
+ * http://www.isrctn.com/ISRCTN76157257
39
42
 
40
43
  py 3.12 / DJ 5.1 / edc 0.6.0 (META3)
41
44
 
@@ -96,7 +96,6 @@ meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py,sha256=
96
96
  meta_analytics/dataframes/screening/__init__.py,sha256=onGpmB4474gu_JcyRGdRy09YQyP2Np-mX-rYZTFdJoA,114
97
97
  meta_analytics/dataframes/screening/get_glucose_tested_only_df.py,sha256=0oMJIsIJRjurfpPONuJ4Aoab1UJikezGe3lQNWRoOo4,660
98
98
  meta_analytics/dataframes/screening/get_screening_df.py,sha256=_6AmaHvH06ubFGiQB6XbVRkVGE5kvtbVbDfs7k5TPX8,4854
99
- meta_analytics/notebooks/meta_endpoints.ipynb,sha256=cmdGX_sKa32AfwWzOXmSS-9oB3Lxhuy5c-FbQdSgMFs,7118
100
99
  meta_analytics/tables/__init__.py,sha256=mhESCt0Lq4RJU-lbQ5fVfIbXzrEsootGYp7EzQIqDBI,70
101
100
  meta_analytics/tables/eligible.py,sha256=2q-SMbAsrBgOVc4Ttq5P3bpjsUKwP5hYhJBMgyH6GGI,3389
102
101
  meta_analytics/tables/has_dm.py,sha256=W6pObFI7k2hpL46Q7t2QIfYDVfo7-PHJMdCv6Q5EUQk,1739
@@ -106,8 +105,8 @@ meta_analytics/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
106
105
  meta_analytics/tests/test_endpoints_by_date.py,sha256=43uBO5VTcF5zq9I5ow9f6Isn-xs7Km_qOrXELJjaew4,3034
107
106
  meta_auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
107
  meta_auth/apps.py,sha256=AcVJmdM3EuebpqB7A1vXRfYBcovgsqPvE71lnGuM-qo,298
109
- meta_auth/auth_objects.py,sha256=6Y-PHb6SPEg99fOlV5tiL3rwq7eDmnKMpz390qf67VI,1988
110
- meta_auth/auths.py,sha256=keHTn95nxZ3Wm6vN9AxPDibaUOOw2YFAIBn_U-N8zTk,2855
108
+ meta_auth/auth_objects.py,sha256=C9ANQTiqML8oH8DharMc8JQYYKV0At9kGCysehcrTfU,2539
109
+ meta_auth/auths.py,sha256=EBdK6b5b2yduDvqYmnmJFRvuJ0fLDQ_q226iuwHA_QU,3008
111
110
  meta_auth/urls.py,sha256=_sVCnQeiAFRYKhxga3_DjoKj_4bgs1s2gjcynDiapvA,111
112
111
  meta_consent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
112
  meta_consent/action_items.py,sha256=JIU5DCNeenaOk0PVTsDkAvFmHCquXBeFZf4Vw7JONl0,756
@@ -219,7 +218,7 @@ meta_edc/meta_version.py,sha256=8IASYGnr43t18oDhNAPNnQoKvFYVAUnPILl6a05HAoc,211
219
218
  meta_edc/model_callers.py,sha256=PjQEW7Kp5HHcUMdmz7dvxg53HvGJHXUKr6QTd-4hsyE,1339
220
219
  meta_edc/models.py,sha256=DLA-hDdFszAVNCe1sZqVoLmIXifFW0HeZsipP9D1Ic4,46
221
220
  meta_edc/navbars.py,sha256=1E7JzjI9NUGKwOVvyMGE2Gs2FM40vImMcuB_01t5FTs,1099
222
- meta_edc/urls.py,sha256=Lqnu9siL9_Eu38DbgtSq2PxMP8Vv412RwXzbTOf9-yA,3489
221
+ meta_edc/urls.py,sha256=BpDuV2XX7Qe8xkSgjhT7ehiZ7QCVtQwzQiY2YPhta_I,3534
223
222
  meta_edc/utils.py,sha256=FdGGHT0zCUM9FLovLanH_ultcxbVitCvvPAwq0U3yYc,342
224
223
  meta_edc/wsgi.py,sha256=Ns9vu_jcEqpOLM5tb-hwVUh3ciInocrG3kUPAxh7nJg,165
225
224
  meta_edc/wsgi_live.py,sha256=EprgdsDiEvNN033w6lUQHaS8Y3ntpPrWHDTOgZcjaCQ,164
@@ -232,8 +231,8 @@ meta_edc/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
232
231
  meta_edc/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
233
232
  meta_edc/management/commands/update_forms_reference.py,sha256=_DiCqhHUk8lGhDGlsjOA069EE-g7UBDlZQCH6L1xiHo,1003
234
233
  meta_edc/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
235
- meta_edc/settings/debug.py,sha256=-PvZN-nPpEBr49ndpBHFcV71SDu1tAXmVfKESDFIr4Q,947
236
- meta_edc/settings/defaults.py,sha256=V7_2rZ6hQRix_pfzkzM4pAf_RSTQXDX3wCvsqGqadvs,18602
234
+ meta_edc/settings/debug.py,sha256=PUUzyXtMyiKYCyqHeD-mT6PjEKJS8ASDcSxtiG84E1Y,947
235
+ meta_edc/settings/defaults.py,sha256=Q1WJEfWQF5A-IvFoMeyQi0n5BaPmXSgpfAkJ011B_SY,18764
237
236
  meta_edc/settings/live.py,sha256=uLTlsIc3H6gdE_7pkL6vyOVa6V_74hnXFkiojqGFAYY,264
238
237
  meta_edc/settings/logging.py,sha256=6qVUE37OMkf5rzwTmMq4krFsZ2jcyCpWdFtGih_Cs4U,1938
239
238
  meta_edc/settings/minimal.py,sha256=3z-7GBluflnUkuSotKZlYvpL34NZ6tfFNuQNJLCyflo,592
@@ -290,14 +289,20 @@ meta_lists/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
290
289
  meta_lists/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
291
290
  meta_lists/tests/test_lists.py,sha256=qcp2emRyd5-cP2oLluy8MpUucBDQ8_GdUxjh2KbZPv4,212
292
291
  meta_pharmacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
293
- meta_pharmacy/apps.py,sha256=KTBxPWUCPnN_0Vk7D3oJuz2R57TRssi8ftnkd-Yh1-0,599
294
- meta_pharmacy/constants.py,sha256=lxofauPDtINP7PyYbeJ7tY9vozdvH7pQ6jZ9RNXYRtk,24
295
- meta_pharmacy/models.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
292
+ meta_pharmacy/admin.py,sha256=xFFC-xROXqcWBsS1QYSFYJYdUzcTQMkzFHzEMniasNk,3255
293
+ meta_pharmacy/admin_site.py,sha256=Ekq8Z13f1w4Llm6exO5w4Jk4Bvt-5WN1ydy_BS2rbdI,171
294
+ meta_pharmacy/apps.py,sha256=VNiKT23F5d5nkXxzu1L-kAqovNOdfxzp-cUC6qcioVQ,732
295
+ meta_pharmacy/constants.py,sha256=d3NAZwpxCDm9LLQ_QGKBG2txooYg748Ajh8a2deF0kw,263
296
+ meta_pharmacy/forms.py,sha256=b02OM7TbMyQ12qrZ8WptmhIuGj87fgkQQkc0qVxMopw,2104
297
+ meta_pharmacy/models.py,sha256=stj6HnurPlnLKZi0tZKTzy3m24t26TsDMzydJklMQxg,3373
296
298
  meta_pharmacy/prepare_meta_pharmacy.py,sha256=5gNiPkmOzWwCW-_q6hgIzj_0tnPuN4Tl1lVI6FygNgs,2945
299
+ meta_pharmacy/urls.py,sha256=jncXssL_SeRhb_OJVXLdGFvPT3BqtrkSPdq-eyJnGfY,207
297
300
  meta_pharmacy/migrations/0001_initial.py,sha256=2uyWhZ-Qkjum1gJJA5v-BWUdpmKhkf8BcuDQMl8895s,1115
301
+ meta_pharmacy/migrations/0002_initial.py,sha256=zkPXmGhdEi-EM0HJRBaTUAltdiLRjW1BhU4GEydoBM8,27355
302
+ meta_pharmacy/migrations/0003_auto_20240909_2335.py,sha256=_hbzV6HaBm-VS_jQMhl3w5srvyaYOQclLBvr_8f79uk,2227
298
303
  meta_pharmacy/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
304
  meta_prn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
300
- meta_prn/action_items.py,sha256=kJ5RiMh0btpcDpHxEfqMI4MJ-4fp5Wh3dNTGabzkDBQ,8850
305
+ meta_prn/action_items.py,sha256=wz6X7Ve8ibqPBO5kB6S9rYYkWfx8JxsoYRVppzIGAzk,9110
301
306
  meta_prn/admin_site.py,sha256=E4dJ6ofu9Kp-1SIWIuY3PraVPbEJSWBBqhorJPGUNqU,161
302
307
  meta_prn/apps.py,sha256=NEqrwzEW277BAPGeL1H1KdK9e74FqXfYHK6o46BtaJA,280
303
308
  meta_prn/baker_recipes.py,sha256=jDGg3btxjtvnsph_AnKoZBDUeTfokMs5iQWnQBJD-jw,660
@@ -434,13 +439,14 @@ meta_reports/pdf_report.py,sha256=9lWnRc_BNieDFXC4VgA0QHK6g_ct58u8tupPRsbRvV0,23
434
439
  meta_reports/tasks.py,sha256=wPzfm99Hox1AIvt1KxYg1r6g9v8ta2AHOHesoN6AxEk,370
435
440
  meta_reports/urls.py,sha256=_c6AMrK4U5MsyFSU2JSPNfiZlbhuw24C7CyPNYpqGd0,206
436
441
  meta_reports/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
437
- meta_reports/admin/__init__.py,sha256=W9unT8v7A8yHLn0WS8Wn4ZRk6W32POBS-ePh1UA-DHE,407
442
+ meta_reports/admin/__init__.py,sha256=3GDQM-HA1h8FdsmGSAiPaCd1paMGGJHTq6Ivd4Ob9bA,434
438
443
  meta_reports/admin/endpoints_admin.py,sha256=L4mDLNIkR6203RI3ImBYel2kevaH_Nwa6KMYuoDwyNU,518
439
444
  meta_reports/admin/endpoints_all_admin.py,sha256=_czdezZf9fSjwZJmO-3HbmdXrXP6nk8-HdiweqUzPRE,476
440
445
  meta_reports/admin/list_filters.py,sha256=pByBzz9-qGwqBfdZFlByxJUZDTJQXOTWfNLjmK8KF00,870
441
446
  meta_reports/admin/modeladmin_mixins.py,sha256=RhdkF5W9ccuwaX5NTMF4b9shQJgDFaOlj7ENOTBAG0g,3669
442
- meta_reports/admin/dbviews/__init__.py,sha256=5NoJxTvBaZX0hJnE9Bf-HyJBEgGd59Hebj50Q23gguk,616
447
+ meta_reports/admin/dbviews/__init__.py,sha256=2yPu0SO7ZX9yjan0OS9izzws14YYoXcGXmZhwJhax1I,675
443
448
  meta_reports/admin/dbviews/glucose_summary_admin.py,sha256=NqnDKx5l0Q-2xxRGdnf50DaRX1Sn8-DC0jHSk96LkRo,4005
449
+ meta_reports/admin/dbviews/imp_substitutions_admin.py,sha256=um7UEmwQH7V3PH5NASG3lYHqsrIux0mkVgVcU7m7rAI,3257
444
450
  meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py,sha256=XyroEqxlX816xrdi0IVSelNPxPBWi96niKa-MQVGkck,2058
445
451
  meta_reports/admin/dbviews/unattended_three_in_row2_admin.py,sha256=0r13KRr0gsH2osmSlffRV11SpSBpWM612AYl-GOoYm0,1347
446
452
  meta_reports/admin/dbviews/unattended_three_in_row_admin.py,sha256=i_-H3pMXRjssf8jFw8gJ8_b0FaM4tX2AI4xfHQDyssU,1121
@@ -473,7 +479,7 @@ meta_reports/migrations/0013_auto_20240813_1516.py,sha256=6m7f0kzDjmQ1WuvTe2YmYc
473
479
  meta_reports/migrations/0014_auto_20240813_1517.py,sha256=73gFSbkF_1Ujj-ynf6kzpVw7-iJjyxBhwTQwek0gbM0,5506
474
480
  meta_reports/migrations/0015_alter_endpoints_site.py,sha256=j3SqxCkI6MO3-SdDkmYPtRJ8tidcXL5RJ_IK42R6soQ,551
475
481
  meta_reports/migrations/0016_missingscreeningogtt.py,sha256=Dmgh4Hmzrye_GHGXNksBCt6p-cI4U5qakj3RHYi4sOw,1962
476
- meta_reports/migrations/0017_auto_20240819_1711.py,sha256=B0QpypzPM5VRL05VuYxdREBXgdNFk1wjrW_uNVvR93Y,36679
482
+ meta_reports/migrations/0017_auto_20240819_1711.py,sha256=OJmsJFp7eMoBOphCNaJEDvwnHzab6Q8tl92Uxdqir20,36773
477
483
  meta_reports/migrations/0018_auto_20240819_1713.py,sha256=BaYwu6TA-wNzKqR-1GJ3fzrZ9b9Oj6C7M5f32QFyPGU,5309
478
484
  meta_reports/migrations/0019_auto_20240819_1721.py,sha256=oxpy4mTbvJoBC2AqDg5FXkjOhTKmr6LiF4x74-yUr_k,5594
479
485
  meta_reports/migrations/0020_auto_20240819_1811.py,sha256=CgjDxYzefPLngSZ8l4XSm3K086-2SCbK6S_8tuMgS6w,6038
@@ -503,15 +509,20 @@ meta_reports/migrations/0043_auto_20240828_2309.py,sha256=ZQUFjpWb6Jl2__ghkXL_gv
503
509
  meta_reports/migrations/0044_auto_20240828_2323.py,sha256=oOuxdpmk3NjdkljjqtSHOPv-C2cFNgHquTz-qjPwff4,143236
504
510
  meta_reports/migrations/0045_auto_20240829_0248.py,sha256=V9F3yLQsbvUL40Fei3FrhBB4t7eReGGW4tnkx2lAjrw,33850
505
511
  meta_reports/migrations/0046_auto_20240829_0250.py,sha256=lKVlj7LrkOJ49LJxccYvQdYEZhnSKTcZEcZMYj7h9q8,30676
512
+ meta_reports/migrations/0047_impsubstitutions.py,sha256=VPTb5j2t9IvwR-Bq0lnVBGLAVKdL7IbY8DD-cjl_m5o,2088
513
+ meta_reports/migrations/0048_auto_20240909_2338.py,sha256=mYAOUzJohv9eW9y93fpZTmlgmx_eOBRhUBMr0F3_-_M,3169
506
514
  meta_reports/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
507
- meta_reports/models/__init__.py,sha256=1tv2jW-ZAwyC6g2SUvrSGkmuLYquupfut1qEQJqm5Z0,358
515
+ meta_reports/models/__init__.py,sha256=8JnKMG9devIPboCCGj423x77Ylry2ROdGOnDSk5Xo4w,380
508
516
  meta_reports/models/endpoints.py,sha256=HfxQuKkzu883xbTeVfIEktN-ARoGe1qC6KgEAzRtV5E,925
509
517
  meta_reports/models/endpoints_proxy.py,sha256=3h3JGaPmnJedFPVWGrk4idV4YtdihqiCI5W7QomwG4E,318
510
518
  meta_reports/models/dbviews/README,sha256=GdeboB7Xqb-Qo_rE1ondcxP8Ps93MIjLzCePQCePig0,686
511
- meta_reports/models/dbviews/__init__.py,sha256=T7HZj0LAVw0kWKDV8c8aLrQj5gwwgEZ0wD5orCxImTQ,511
519
+ meta_reports/models/dbviews/__init__.py,sha256=C5YGOKwVAexjWxLh5vl0m561TBMWDM_yAvIrwqG_M70,559
512
520
  meta_reports/models/dbviews/glucose_summary/__init__.py,sha256=Tfgjso4TpxMCidAdRJp8g1Ykqqa43yWlQSotzAaORAo,93
513
521
  meta_reports/models/dbviews/glucose_summary/unmanaged_model.py,sha256=uqhD5JLXtyQ94zpG5Puxodjzli3quE4GgiFi7en6EeM,1055
514
522
  meta_reports/models/dbviews/glucose_summary/view_definition.py,sha256=Fc5KN-It9dcBvRta-b26kUl8uQEHA19vrYIhNRqe2Xo,1512
523
+ meta_reports/models/dbviews/imp_substitutions/__init__.py,sha256=N0507JzoVRtNA9W9_RoiAQYEQZGdvP2U8P83ZJMeZxQ,46
524
+ meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py,sha256=KxynevJevXVj0zVHf7_DIjw_EZzDt3BszEcfEHygPGc,1168
525
+ meta_reports/models/dbviews/imp_substitutions/view_definition.py,sha256=FRAssQC9e48ZoBEScGuiRV61ZX3KvuW29l-XqPNsTbg,870
515
526
  meta_reports/models/dbviews/missing_screening_ogtt/__init__.py,sha256=7uX_2HfVU-3G1O_xecfGnE5_pcX5eceiRaapeDQtzIw,105
516
527
  meta_reports/models/dbviews/missing_screening_ogtt/note_model.py,sha256=JHItVS11WDFg3lTe7ayH9T7Epd-VvXXD_79FssrmAwc,1813
517
528
  meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py,sha256=_XFzpOiMoxr-F0ebKNEnyXqS6dnb3P5tBRnZlbrQ2x8,1346
@@ -521,7 +532,7 @@ meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py,sha256=QBptc
521
532
  meta_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py,sha256=QI9T3K35pAAUMCiIbtwU_cf9kPodBfG9jwNeahPzTMQ,647
522
533
  meta_reports/models/dbviews/on_study_missing_lab_values/view_definition.py,sha256=Z0dnJZZT7EokC0M2TVSCjcLU0SyFfjxydjYmHqZcNag,568
523
534
  meta_reports/models/dbviews/on_study_missing_values/__init__.py,sha256=bxRAXRocUIdUCg9jARlztOE2co9LqgHbBOkU1Bykz9M,49
524
- meta_reports/models/dbviews/on_study_missing_values/qa_cases.py,sha256=pbs6VIY6_6gsz-zJqIQeu2U5TagcRmCCAV7OaZdy30A,1956
535
+ meta_reports/models/dbviews/on_study_missing_values/qa_cases.py,sha256=NiqcSU5ZQD6zSgn08yPY0TEFqmeHSpH6DHFX8ns_XaI,1920
525
536
  meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py,sha256=TQptzrx1Xv-sE_3ioO9BZ1ZE7CKZG8JWXsFD6-ZxI8k,632
526
537
  meta_reports/models/dbviews/on_study_missing_values/view_definition.py,sha256=W7MgZo51Y3nzQ7lUDtmZquRnC5ELdKGnpsscaCC9ouM,564
527
538
  meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py,sha256=eIyKY9mdIE3-J2vtQtY7MOg_RQkwKj7aserwO5PBNQQ,62
@@ -686,7 +697,7 @@ meta_sites/models.py,sha256=DLA-hDdFszAVNCe1sZqVoLmIXifFW0HeZsipP9D1Ic4,46
686
697
  meta_sites/sites.py,sha256=H26Erar3_fLVl5wf2ILDM5C6wGEoi0dQbiSPmzb9OGw,1625
687
698
  meta_sites/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
688
699
  meta_sites/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
689
- meta_sites/tests/test_sites.py,sha256=yWzygYo1vQIBDv1-_ujNtNK6VxnSptf4s874vSAWlto,415
700
+ meta_sites/tests/test_sites.py,sha256=WkI87TUqTsVxbIPh4wQdJ15FOoGE6R5oGPXqUpO0ntE,426
690
701
  meta_sites/tests/urls.py,sha256=_sVCnQeiAFRYKhxga3_DjoKj_4bgs1s2gjcynDiapvA,111
691
702
  meta_stats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
692
703
  meta_stats/incidence.py,sha256=59-BOn4nw-U79Ku4SxiPkJIse2pi467dOMTnLGmZvgI,540
@@ -912,7 +923,7 @@ meta_subject/migrations/0103_auto_20220324_0326.py,sha256=gBiNh4-CElPRQcGqb04t4Y
912
923
  meta_subject/migrations/0104_auto_20220412_2151.py,sha256=lruwZFW9lyRzAJ-13bJZh19ZhFYMKX6k-TUjuXWIZAY,966
913
924
  meta_subject/migrations/0105_auto_20220412_2310.py,sha256=wEJsJDk_cwh-JW8ZPxg9HGE3YKKtOPRQJTo6xywX5nk,1290
914
925
  meta_subject/migrations/0106_auto_20220414_1741.py,sha256=tUQQG1JgKa_XrTL2Paz83YaEs8LhIl9gph5OyiV22nk,772
915
- meta_subject/migrations/0107_auto_20220415_0043.py,sha256=8tI8HUNY0jUK5TmyUTMSJ5-HOPGLu8u79GzYXPSq4oc,1492
926
+ meta_subject/migrations/0107_auto_20220415_0043.py,sha256=PWxsJHxonC9L0nTWJnNF-oc3dcZfzkJPNvI38DYDbD8,1718
916
927
  meta_subject/migrations/0108_auto_20220415_1747.py,sha256=4HHVMatXiqavoutbzbZY7TlTHxg32uQYP7gHWg27DX8,688
917
928
  meta_subject/migrations/0109_auto_20220415_1758.py,sha256=FNBIWr0sCmXCvzI0yNVeMSrPup7vMQJhnYxrzHu9DSA,556
918
929
  meta_subject/migrations/0110_auto_20220512_1811.py,sha256=iKRSR0qkKbgOGQUT3zyz7SWN7kyrfJtFH98c1QTu8gM,2516
@@ -931,16 +942,16 @@ meta_subject/migrations/0122_auto_20220708_2144.py,sha256=qEaeHaf0Ab3SwvlENZxP4H
931
942
  meta_subject/migrations/0123_auto_20220714_2136.py,sha256=4ZOX8z0-GjWDTNu9DkZNxZtKIyFcMaEHMdzL4zf_pwA,8262
932
943
  meta_subject/migrations/0124_auto_20220714_2303.py,sha256=M_QpUhj8K-LD5HLytzYH7n59bqlruHzCGpozKjPaCY0,1206
933
944
  meta_subject/migrations/0125_auto_20220719_2134.py,sha256=ijk0rLwlXCxft3tPptVpqfDrtuk6ud5Cxh_EFTZ8FW8,1568
934
- meta_subject/migrations/0126_auto_20220719_2142.py,sha256=56lSoGrf97pUjLmH4GajJKmwkevXtpVZ7QI3s_xTp8I,776
945
+ meta_subject/migrations/0126_auto_20220719_2142.py,sha256=etZtba3l2cN_QQqEKEIrKpKOsotCifX85Y8P6ge2if4,784
935
946
  meta_subject/migrations/0127_auto_20220720_0053.py,sha256=YAJ2xlCKC-0oin-XxnfzyZcsAF9ozNx_a_5cP8WJ1i4,5488
936
947
  meta_subject/migrations/0128_auto_20220720_0055.py,sha256=voqWxaEfSrFSCzXglIfZLRdQpAx_MZ6GZIJmjMr9j50,778
937
948
  meta_subject/migrations/0129_auto_20220720_0108.py,sha256=XBant365dtOEYMtVcbs0yKgbCGP_GIg3azqvX2TGGc8,490
938
949
  meta_subject/migrations/0130_auto_20220720_0216.py,sha256=S7Q7TAl97ZCVpum2zmOtHqeeV4kmo4tbLa-hOKtO-rs,683
939
- meta_subject/migrations/0131_auto_20220722_0411.py,sha256=31XxxCy7ejTqeC9OjrCcb_6otTRb437PrFcxIhbcUgc,1932
940
- meta_subject/migrations/0132_auto_20220722_1825.py,sha256=z_wSesQHtoSTIcKTELb0oH_EhDnXL2HNlOpyhbAmqEI,843
950
+ meta_subject/migrations/0131_auto_20220722_0411.py,sha256=h0fzn1OsT_tvx5LMDyrh9t3HUsXzcpGwA19regX_jO4,2153
951
+ meta_subject/migrations/0132_auto_20220722_1825.py,sha256=TmWCNPi8rdNvA7qfWZ-iVAzlXBrN_FE5uATEzVNFxXY,979
941
952
  meta_subject/migrations/0133_auto_20220722_2140.py,sha256=Un8wWZeac9RdJ3cUUo43bAHsOAm489wyhXcaeTBeve4,28130
942
953
  meta_subject/migrations/0134_auto_20220722_2211.py,sha256=Ez2ur6gngrz2y82Hsgx-Ag3HJXr8htcsGS4BxnjX-eU,1806
943
- meta_subject/migrations/0135_auto_20220722_2212.py,sha256=5g2Odlht0qXpRu-ZAbIB97dXZd8QGDP-lDKArRKfR_Y,2263
954
+ meta_subject/migrations/0135_auto_20220722_2212.py,sha256=34qNpdc0c-LkK0MhSh9ofJP50Ckut4c9yWwVyfU5fvY,2463
944
955
  meta_subject/migrations/0136_egfrdropnotification_creatinine_quantifier_and_more.py,sha256=4vWNQUmziJFlktyOekNqC_lx0ybywCx0FMaIE5_9oRE,8660
945
956
  meta_subject/migrations/0137_alter_egfrdropnotification_egfr_percent_change_and_more.py,sha256=OQA1uVxwReY4osMsbhT_MGVfOBaopBI4s7GW56ba3vU,1138
946
957
  meta_subject/migrations/0138_alter_glucose_fbg_datetime_and_more.py,sha256=JdZ1KW-PnapQm81_THgm-ty3_AeOmbujZoxfRE1cjY8,3531
@@ -955,7 +966,7 @@ meta_subject/migrations/0146_auto_20220907_0207.py,sha256=1va3UjUI5bD3yey08Fk3rp
955
966
  meta_subject/migrations/0147_auto_20220907_1505.py,sha256=kRJWQ81XsX_poQBS_u0tuiQBfRhnP4lQeNzfDTOeOmw,1906
956
967
  meta_subject/migrations/0148_auto_20220908_1826.py,sha256=iHN59ZuFFYQCbLYZAebF_kaiP8m-twUnwUAzrgtFOXU,1814
957
968
  meta_subject/migrations/0149_auto_20220913_2139.py,sha256=V27KGY9t6IV8Xzf0wgcLQseM1DBcXGXY3ReNC_iRUe0,1000
958
- meta_subject/migrations/0150_auto_20220914_0039.py,sha256=BmtWEsWQooijWvqQxTlTSq93GLfRM0kwDdUsJQaZEAQ,1222
969
+ meta_subject/migrations/0150_auto_20220914_0039.py,sha256=qB-6YVz3lloQf6JbbwZACGyf68n2LtlGcFX8v_NY9Qc,1322
959
970
  meta_subject/migrations/0151_auto_20220918_0508.py,sha256=tcQ-eyK-2cIqTLDtL9QsfDi4F9fu8UGHVye6QSBDYLA,52998
960
971
  meta_subject/migrations/0152_auto_20220925_0509.py,sha256=Zd_1TRIXLzw323ccrwHT_k76HgEqVCEBqvqbjlNYCto,738
961
972
  meta_subject/migrations/0153_auto_20220928_0250.py,sha256=nmYfG7zYmrRW4JQXoZQlE3aQQBBehDJrtVRIb4AWtK0,1172
@@ -1123,9 +1134,9 @@ tests/etc/user-rsa-restricted-private.pem,sha256=CUcHW9bznWdmmASN00hCzvxFPAFl4N2
1123
1134
  tests/etc/user-rsa-restricted-public.pem,sha256=mt84djoL-uHw6Wc5SJh0zml6VzXulnf8eQSFg7-fheg,450
1124
1135
  tests/etc/user-salt-local.key,sha256=x5anBw9fvbHurczouT3CjrkWb_xs7Ypm1htIJsgiuiw,256
1125
1136
  tests/etc/user-salt-restricted.key,sha256=pxmpcfBRNB-4C6wTvHXz-9fOfJgKIFOjaAF8ZFfa4q4,256
1126
- meta_edc-0.3.33.dist-info/AUTHORS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1127
- meta_edc-0.3.33.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1128
- meta_edc-0.3.33.dist-info/METADATA,sha256=jWZeykN68G-2vi6uWOB1U6hKVx_BeJ4gEudLbml9sqQ,2811
1129
- meta_edc-0.3.33.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
1130
- meta_edc-0.3.33.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1131
- meta_edc-0.3.33.dist-info/RECORD,,
1137
+ meta_edc-0.3.34.dist-info/AUTHORS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1138
+ meta_edc-0.3.34.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1139
+ meta_edc-0.3.34.dist-info/METADATA,sha256=cIWKUxcvH6QDWYsXm16RB4_qh4XxjQwGUPxSNLSp4nM,3015
1140
+ meta_edc-0.3.34.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
1141
+ meta_edc-0.3.34.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1142
+ meta_edc-0.3.34.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.0.0)
2
+ Generator: setuptools (74.1.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
meta_pharmacy/admin.py ADDED
@@ -0,0 +1,128 @@
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_model_admin.history import SimpleHistoryAdmin
5
+ from edc_pharmacy.admin.list_filters import MedicationsListFilter
6
+ from edc_sites.admin import SiteModelAdminMixin
7
+
8
+ from .admin_site import meta_pharmacy_admin
9
+ from .forms import RxForm, SubstitutionsForm
10
+ from .models import Rx, Substitutions
11
+
12
+
13
+ @admin.register(Substitutions, site=meta_pharmacy_admin)
14
+ class SubstitutionsAdmin(
15
+ SiteModelAdminMixin,
16
+ ModelAdminSubjectDashboardMixin,
17
+ SimpleHistoryAdmin,
18
+ ):
19
+ """Admin class for meta_pharmacy.Substitutions"""
20
+
21
+ form = SubstitutionsForm
22
+
23
+ autocomplete_fields = ["rx"]
24
+
25
+ add_instructions = "This form is used to record any substitions made for IMP refills"
26
+
27
+ fieldsets = (
28
+ (
29
+ None,
30
+ {"fields": ("report_datetime",)},
31
+ ),
32
+ ("Original label on bottle", {"fields": ("sid", "visit_no")}),
33
+ (
34
+ "Substitution / Changed label",
35
+ {
36
+ "description": "The label on this bottle has been changed to the following",
37
+ "fields": ("dispensed_sid", "updated_visit_no"),
38
+ },
39
+ ),
40
+ (
41
+ "Subject",
42
+ {
43
+ "fields": ("rx",),
44
+ },
45
+ ),
46
+ audit_fieldset_tuple,
47
+ )
48
+
49
+ list_display = (
50
+ "sid",
51
+ "dispensed_sid",
52
+ "arm_match",
53
+ "subject_identifier",
54
+ "report_datetime",
55
+ )
56
+
57
+ radio_fields = {"arm_match": admin.VERTICAL}
58
+
59
+ list_filter = ("arm_match", "report_datetime")
60
+
61
+ search_fields = ["subject_identifier", "sid", "dispensed_sid"]
62
+
63
+
64
+ @admin.register(Rx, site=meta_pharmacy_admin)
65
+ class RxAdmin(ModelAdminSubjectDashboardMixin, admin.ModelAdmin):
66
+ """Admin class for proxy model of edc_pharmacy.Rx"""
67
+
68
+ show_object_tools = True
69
+
70
+ form = RxForm
71
+
72
+ fieldsets = (
73
+ (
74
+ None,
75
+ {
76
+ "fields": (
77
+ "subject_identifier",
78
+ "report_datetime",
79
+ "rx_name",
80
+ "rx_date",
81
+ "medications",
82
+ "clinician_initials",
83
+ "notes",
84
+ )
85
+ },
86
+ ),
87
+ (
88
+ "Randomization",
89
+ {
90
+ "fields": ("rando_sid", "randomizer_name", "weight_in_kgs"),
91
+ },
92
+ ),
93
+ audit_fieldset_tuple,
94
+ )
95
+
96
+ filter_horizontal = ("medications",)
97
+
98
+ list_display = (
99
+ "subject_identifier",
100
+ "dashboard",
101
+ "rx_medications",
102
+ "rando_sid",
103
+ "rx_date",
104
+ "weight_in_kgs",
105
+ "rx_name",
106
+ )
107
+
108
+ list_filter = ("report_datetime", MedicationsListFilter, "site")
109
+
110
+ search_fields = (
111
+ "id",
112
+ "subject_identifier",
113
+ "rando_sid",
114
+ "registered_subject__initials",
115
+ "medications__name",
116
+ "site__id",
117
+ "rx_name",
118
+ )
119
+
120
+ readonly_fields = (
121
+ "rando_sid",
122
+ "weight_in_kgs",
123
+ "rx_name",
124
+ )
125
+
126
+ @admin.display
127
+ def rx_medications(self, obj):
128
+ return ", ".join([obj.display_name for obj in obj.medications.all()])
@@ -0,0 +1,5 @@
1
+ from edc_model_admin.admin_site import EdcAdminSite
2
+
3
+ from .apps import AppConfig
4
+
5
+ meta_pharmacy_admin = EdcAdminSite(name="meta_pharmacy_admin", app_label=AppConfig.name)
meta_pharmacy/apps.py CHANGED
@@ -15,6 +15,9 @@ def post_migrate_populate_pharmacy_models(sender=None, **kwargs): # noqa
15
15
  class AppConfig(DjangoAppConfig):
16
16
  name = "meta_pharmacy"
17
17
  verbose_name = "META Pharmacy"
18
+ include_in_administration_section = True
19
+ has_exportable_data = True
20
+ default_auto_field = "django.db.models.BigAutoField"
18
21
 
19
22
  def ready(self):
20
23
  post_migrate.connect(post_migrate_populate_pharmacy_models, sender=self)
@@ -1 +1,11 @@
1
+ from edc_constants.constants import OK
2
+
1
3
  METFORMIN = "metformin"
4
+ REVIEW = "REVIEW"
5
+ MISSING_SUBJECT_IDENTIFIER = "MISSING_SUBJECT_IDENTIFIER"
6
+
7
+ SUBSTITUTION_STATUS = (
8
+ (OK, "ok"),
9
+ (MISSING_SUBJECT_IDENTIFIER, "Missing Subject ID"),
10
+ (REVIEW, "review"),
11
+ )
meta_pharmacy/forms.py ADDED
@@ -0,0 +1,65 @@
1
+ from django import forms
2
+ from django.core.exceptions import ObjectDoesNotExist
3
+ from edc_form_validators.form_validator import FormValidator
4
+ from edc_form_validators.form_validator_mixins import FormValidatorMixin
5
+ from edc_model_form.mixins import BaseModelFormMixin
6
+ from edc_offstudy.modelform_mixins import OffstudyNonCrfModelFormMixin
7
+ from edc_prn.modelform_mixins import PrnFormValidatorMixin
8
+ from edc_sites.forms import SiteModelFormMixin
9
+
10
+ from .models import Rx, Substitutions
11
+
12
+
13
+ class SubstitutionsFormValidator(PrnFormValidatorMixin, FormValidator):
14
+ pass
15
+
16
+
17
+ class SubstitutionsForm(
18
+ SiteModelFormMixin,
19
+ OffstudyNonCrfModelFormMixin,
20
+ BaseModelFormMixin,
21
+ FormValidatorMixin,
22
+ forms.ModelForm,
23
+ ):
24
+ form_validator_cls = SubstitutionsFormValidator
25
+
26
+ def clean(self):
27
+ if self.cleaned_data.get("sid"):
28
+ try:
29
+ obj = Rx.objects.get(rando_sid=self.cleaned_data.get("sid"))
30
+ except ObjectDoesNotExist:
31
+ raise forms.ValidationError({"sid": "Unknown SID for this trial"})
32
+ else:
33
+ if obj.site.id != self.site.id:
34
+ raise forms.ValidationError(
35
+ {
36
+ "sid": (
37
+ "Unknown SID for this trial site. "
38
+ f"Expected SITE {obj.site.id}."
39
+ )
40
+ }
41
+ )
42
+ if self.cleaned_data.get("dispensed_sid"):
43
+ try:
44
+ Rx.objects.get(
45
+ rando_sid=self.cleaned_data.get("dispensed_sid"),
46
+ )
47
+ except ObjectDoesNotExist:
48
+ raise forms.ValidationError({"dispensed_sid": "Unknown SID for this trial"})
49
+
50
+ class Meta:
51
+ model = Substitutions
52
+ fields = "__all__"
53
+
54
+
55
+ class RxForm(forms.ModelForm):
56
+
57
+ subject_identifier = forms.CharField(
58
+ label="Subject Identifier",
59
+ required=False,
60
+ widget=forms.TextInput(attrs={"readonly": "readonly"}),
61
+ )
62
+
63
+ class Meta:
64
+ model = Rx
65
+ fields = "__all__"