meta-edc 0.3.33__py3-none-any.whl → 0.3.35__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 (44) 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.35.dist-info}/METADATA +6 -3
  7. {meta_edc-0.3.33.dist-info → meta_edc-0.3.35.dist-info}/RECORD +43 -29
  8. {meta_edc-0.3.33.dist-info → meta_edc-0.3.35.dist-info}/WHEEL +1 -1
  9. meta_pharmacy/admin.py +135 -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/migrations/0004_alter_historicalsubstitutions_report_datetime_and_more.py +23 -0
  17. meta_pharmacy/migrations/0005_auto_20240911_0352.py +17 -0
  18. meta_pharmacy/models.py +102 -0
  19. meta_pharmacy/urls.py +8 -0
  20. meta_prn/action_items.py +9 -1
  21. meta_reports/admin/__init__.py +1 -0
  22. meta_reports/admin/dbviews/__init__.py +1 -0
  23. meta_reports/admin/dbviews/imp_substitutions_admin.py +101 -0
  24. meta_reports/migrations/0017_auto_20240819_1711.py +1 -0
  25. meta_reports/migrations/0047_impsubstitutions.py +56 -0
  26. meta_reports/migrations/0048_auto_20240909_2338.py +48 -0
  27. meta_reports/migrations/0049_auto_20240911_0327.py +54 -0
  28. meta_reports/models/__init__.py +1 -0
  29. meta_reports/models/dbviews/__init__.py +1 -0
  30. meta_reports/models/dbviews/imp_substitutions/__init__.py +1 -0
  31. meta_reports/models/dbviews/imp_substitutions/unmanaged_model.py +39 -0
  32. meta_reports/models/dbviews/imp_substitutions/view_definition.py +21 -0
  33. meta_reports/models/dbviews/on_study_missing_values/qa_cases.py +0 -1
  34. meta_sites/tests/test_sites.py +1 -1
  35. meta_subject/migrations/0107_auto_20220415_0043.py +28 -22
  36. meta_subject/migrations/0126_auto_20220719_2142.py +4 -4
  37. meta_subject/migrations/0131_auto_20220722_0411.py +28 -23
  38. meta_subject/migrations/0132_auto_20220722_1825.py +10 -6
  39. meta_subject/migrations/0135_auto_20220722_2212.py +39 -35
  40. meta_subject/migrations/0150_auto_20220914_0039.py +15 -11
  41. meta_analytics/notebooks/meta_endpoints.ipynb +0 -286
  42. {meta_edc-0.3.33.dist-info → meta_edc-0.3.35.dist-info}/AUTHORS +0 -0
  43. {meta_edc-0.3.33.dist-info → meta_edc-0.3.35.dist-info}/LICENSE +0 -0
  44. {meta_edc-0.3.33.dist-info → meta_edc-0.3.35.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.35
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,22 @@ 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=-HCVaaDFtt_uHzdaSQfM5yDfP44_VgIl-s-IcrPQqzg,3535
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=qwjsvsCr7ryb8DRn1aYD1_wOpAQR6ffumLuYNGxeNEs,3395
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
303
+ meta_pharmacy/migrations/0004_alter_historicalsubstitutions_report_datetime_and_more.py,sha256=33SpQ4UtFs3gblj4WG3KtKtalo8Wynv3uyUOqBe7_Zo,585
304
+ meta_pharmacy/migrations/0005_auto_20240911_0352.py,sha256=ZwjFlBX_ubNDbTnDny7cvgCb4aSiqhVKhTYDWd6oQmg,534
298
305
  meta_pharmacy/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
306
  meta_prn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
300
- meta_prn/action_items.py,sha256=kJ5RiMh0btpcDpHxEfqMI4MJ-4fp5Wh3dNTGabzkDBQ,8850
307
+ meta_prn/action_items.py,sha256=wz6X7Ve8ibqPBO5kB6S9rYYkWfx8JxsoYRVppzIGAzk,9110
301
308
  meta_prn/admin_site.py,sha256=E4dJ6ofu9Kp-1SIWIuY3PraVPbEJSWBBqhorJPGUNqU,161
302
309
  meta_prn/apps.py,sha256=NEqrwzEW277BAPGeL1H1KdK9e74FqXfYHK6o46BtaJA,280
303
310
  meta_prn/baker_recipes.py,sha256=jDGg3btxjtvnsph_AnKoZBDUeTfokMs5iQWnQBJD-jw,660
@@ -434,13 +441,14 @@ meta_reports/pdf_report.py,sha256=9lWnRc_BNieDFXC4VgA0QHK6g_ct58u8tupPRsbRvV0,23
434
441
  meta_reports/tasks.py,sha256=wPzfm99Hox1AIvt1KxYg1r6g9v8ta2AHOHesoN6AxEk,370
435
442
  meta_reports/urls.py,sha256=_c6AMrK4U5MsyFSU2JSPNfiZlbhuw24C7CyPNYpqGd0,206
436
443
  meta_reports/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
437
- meta_reports/admin/__init__.py,sha256=W9unT8v7A8yHLn0WS8Wn4ZRk6W32POBS-ePh1UA-DHE,407
444
+ meta_reports/admin/__init__.py,sha256=3GDQM-HA1h8FdsmGSAiPaCd1paMGGJHTq6Ivd4Ob9bA,434
438
445
  meta_reports/admin/endpoints_admin.py,sha256=L4mDLNIkR6203RI3ImBYel2kevaH_Nwa6KMYuoDwyNU,518
439
446
  meta_reports/admin/endpoints_all_admin.py,sha256=_czdezZf9fSjwZJmO-3HbmdXrXP6nk8-HdiweqUzPRE,476
440
447
  meta_reports/admin/list_filters.py,sha256=pByBzz9-qGwqBfdZFlByxJUZDTJQXOTWfNLjmK8KF00,870
441
448
  meta_reports/admin/modeladmin_mixins.py,sha256=RhdkF5W9ccuwaX5NTMF4b9shQJgDFaOlj7ENOTBAG0g,3669
442
- meta_reports/admin/dbviews/__init__.py,sha256=5NoJxTvBaZX0hJnE9Bf-HyJBEgGd59Hebj50Q23gguk,616
449
+ meta_reports/admin/dbviews/__init__.py,sha256=2yPu0SO7ZX9yjan0OS9izzws14YYoXcGXmZhwJhax1I,675
443
450
  meta_reports/admin/dbviews/glucose_summary_admin.py,sha256=NqnDKx5l0Q-2xxRGdnf50DaRX1Sn8-DC0jHSk96LkRo,4005
451
+ meta_reports/admin/dbviews/imp_substitutions_admin.py,sha256=-poOw3fJK7jQERB1PNXNDrWNthwEQpiwmrxoWOsDtjI,3622
444
452
  meta_reports/admin/dbviews/patient_history_missing_baseline_cd4_admin.py,sha256=XyroEqxlX816xrdi0IVSelNPxPBWi96niKa-MQVGkck,2058
445
453
  meta_reports/admin/dbviews/unattended_three_in_row2_admin.py,sha256=0r13KRr0gsH2osmSlffRV11SpSBpWM612AYl-GOoYm0,1347
446
454
  meta_reports/admin/dbviews/unattended_three_in_row_admin.py,sha256=i_-H3pMXRjssf8jFw8gJ8_b0FaM4tX2AI4xfHQDyssU,1121
@@ -473,7 +481,7 @@ meta_reports/migrations/0013_auto_20240813_1516.py,sha256=6m7f0kzDjmQ1WuvTe2YmYc
473
481
  meta_reports/migrations/0014_auto_20240813_1517.py,sha256=73gFSbkF_1Ujj-ynf6kzpVw7-iJjyxBhwTQwek0gbM0,5506
474
482
  meta_reports/migrations/0015_alter_endpoints_site.py,sha256=j3SqxCkI6MO3-SdDkmYPtRJ8tidcXL5RJ_IK42R6soQ,551
475
483
  meta_reports/migrations/0016_missingscreeningogtt.py,sha256=Dmgh4Hmzrye_GHGXNksBCt6p-cI4U5qakj3RHYi4sOw,1962
476
- meta_reports/migrations/0017_auto_20240819_1711.py,sha256=B0QpypzPM5VRL05VuYxdREBXgdNFk1wjrW_uNVvR93Y,36679
484
+ meta_reports/migrations/0017_auto_20240819_1711.py,sha256=OJmsJFp7eMoBOphCNaJEDvwnHzab6Q8tl92Uxdqir20,36773
477
485
  meta_reports/migrations/0018_auto_20240819_1713.py,sha256=BaYwu6TA-wNzKqR-1GJ3fzrZ9b9Oj6C7M5f32QFyPGU,5309
478
486
  meta_reports/migrations/0019_auto_20240819_1721.py,sha256=oxpy4mTbvJoBC2AqDg5FXkjOhTKmr6LiF4x74-yUr_k,5594
479
487
  meta_reports/migrations/0020_auto_20240819_1811.py,sha256=CgjDxYzefPLngSZ8l4XSm3K086-2SCbK6S_8tuMgS6w,6038
@@ -503,15 +511,21 @@ meta_reports/migrations/0043_auto_20240828_2309.py,sha256=ZQUFjpWb6Jl2__ghkXL_gv
503
511
  meta_reports/migrations/0044_auto_20240828_2323.py,sha256=oOuxdpmk3NjdkljjqtSHOPv-C2cFNgHquTz-qjPwff4,143236
504
512
  meta_reports/migrations/0045_auto_20240829_0248.py,sha256=V9F3yLQsbvUL40Fei3FrhBB4t7eReGGW4tnkx2lAjrw,33850
505
513
  meta_reports/migrations/0046_auto_20240829_0250.py,sha256=lKVlj7LrkOJ49LJxccYvQdYEZhnSKTcZEcZMYj7h9q8,30676
514
+ meta_reports/migrations/0047_impsubstitutions.py,sha256=VPTb5j2t9IvwR-Bq0lnVBGLAVKdL7IbY8DD-cjl_m5o,2088
515
+ meta_reports/migrations/0048_auto_20240909_2338.py,sha256=mYAOUzJohv9eW9y93fpZTmlgmx_eOBRhUBMr0F3_-_M,3169
516
+ meta_reports/migrations/0049_auto_20240911_0327.py,sha256=APBkFY9kwzEmhTXkK2-bu6csikh_dVEMH6t2dv_Iz9M,4760
506
517
  meta_reports/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
507
- meta_reports/models/__init__.py,sha256=1tv2jW-ZAwyC6g2SUvrSGkmuLYquupfut1qEQJqm5Z0,358
518
+ meta_reports/models/__init__.py,sha256=8JnKMG9devIPboCCGj423x77Ylry2ROdGOnDSk5Xo4w,380
508
519
  meta_reports/models/endpoints.py,sha256=HfxQuKkzu883xbTeVfIEktN-ARoGe1qC6KgEAzRtV5E,925
509
520
  meta_reports/models/endpoints_proxy.py,sha256=3h3JGaPmnJedFPVWGrk4idV4YtdihqiCI5W7QomwG4E,318
510
521
  meta_reports/models/dbviews/README,sha256=GdeboB7Xqb-Qo_rE1ondcxP8Ps93MIjLzCePQCePig0,686
511
- meta_reports/models/dbviews/__init__.py,sha256=T7HZj0LAVw0kWKDV8c8aLrQj5gwwgEZ0wD5orCxImTQ,511
522
+ meta_reports/models/dbviews/__init__.py,sha256=C5YGOKwVAexjWxLh5vl0m561TBMWDM_yAvIrwqG_M70,559
512
523
  meta_reports/models/dbviews/glucose_summary/__init__.py,sha256=Tfgjso4TpxMCidAdRJp8g1Ykqqa43yWlQSotzAaORAo,93
513
524
  meta_reports/models/dbviews/glucose_summary/unmanaged_model.py,sha256=uqhD5JLXtyQ94zpG5Puxodjzli3quE4GgiFi7en6EeM,1055
514
525
  meta_reports/models/dbviews/glucose_summary/view_definition.py,sha256=Fc5KN-It9dcBvRta-b26kUl8uQEHA19vrYIhNRqe2Xo,1512
526
+ 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
528
+ meta_reports/models/dbviews/imp_substitutions/view_definition.py,sha256=1t6znTYQJxM_-nTRjMgEY3T2L_ZDFvh2tw-zT8fmxQU,897
515
529
  meta_reports/models/dbviews/missing_screening_ogtt/__init__.py,sha256=7uX_2HfVU-3G1O_xecfGnE5_pcX5eceiRaapeDQtzIw,105
516
530
  meta_reports/models/dbviews/missing_screening_ogtt/note_model.py,sha256=JHItVS11WDFg3lTe7ayH9T7Epd-VvXXD_79FssrmAwc,1813
517
531
  meta_reports/models/dbviews/missing_screening_ogtt/unmanaged_model.py,sha256=_XFzpOiMoxr-F0ebKNEnyXqS6dnb3P5tBRnZlbrQ2x8,1346
@@ -521,7 +535,7 @@ meta_reports/models/dbviews/on_study_missing_lab_values/qa_cases.py,sha256=QBptc
521
535
  meta_reports/models/dbviews/on_study_missing_lab_values/unmanged_model.py,sha256=QI9T3K35pAAUMCiIbtwU_cf9kPodBfG9jwNeahPzTMQ,647
522
536
  meta_reports/models/dbviews/on_study_missing_lab_values/view_definition.py,sha256=Z0dnJZZT7EokC0M2TVSCjcLU0SyFfjxydjYmHqZcNag,568
523
537
  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
538
+ meta_reports/models/dbviews/on_study_missing_values/qa_cases.py,sha256=NiqcSU5ZQD6zSgn08yPY0TEFqmeHSpH6DHFX8ns_XaI,1920
525
539
  meta_reports/models/dbviews/on_study_missing_values/unmanged_model.py,sha256=TQptzrx1Xv-sE_3ioO9BZ1ZE7CKZG8JWXsFD6-ZxI8k,632
526
540
  meta_reports/models/dbviews/on_study_missing_values/view_definition.py,sha256=W7MgZo51Y3nzQ7lUDtmZquRnC5ELdKGnpsscaCC9ouM,564
527
541
  meta_reports/models/dbviews/patient_history_missing_baseline_cd4/__init__.py,sha256=eIyKY9mdIE3-J2vtQtY7MOg_RQkwKj7aserwO5PBNQQ,62
@@ -686,7 +700,7 @@ meta_sites/models.py,sha256=DLA-hDdFszAVNCe1sZqVoLmIXifFW0HeZsipP9D1Ic4,46
686
700
  meta_sites/sites.py,sha256=H26Erar3_fLVl5wf2ILDM5C6wGEoi0dQbiSPmzb9OGw,1625
687
701
  meta_sites/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
688
702
  meta_sites/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
689
- meta_sites/tests/test_sites.py,sha256=yWzygYo1vQIBDv1-_ujNtNK6VxnSptf4s874vSAWlto,415
703
+ meta_sites/tests/test_sites.py,sha256=WkI87TUqTsVxbIPh4wQdJ15FOoGE6R5oGPXqUpO0ntE,426
690
704
  meta_sites/tests/urls.py,sha256=_sVCnQeiAFRYKhxga3_DjoKj_4bgs1s2gjcynDiapvA,111
691
705
  meta_stats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
692
706
  meta_stats/incidence.py,sha256=59-BOn4nw-U79Ku4SxiPkJIse2pi467dOMTnLGmZvgI,540
@@ -912,7 +926,7 @@ meta_subject/migrations/0103_auto_20220324_0326.py,sha256=gBiNh4-CElPRQcGqb04t4Y
912
926
  meta_subject/migrations/0104_auto_20220412_2151.py,sha256=lruwZFW9lyRzAJ-13bJZh19ZhFYMKX6k-TUjuXWIZAY,966
913
927
  meta_subject/migrations/0105_auto_20220412_2310.py,sha256=wEJsJDk_cwh-JW8ZPxg9HGE3YKKtOPRQJTo6xywX5nk,1290
914
928
  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
929
+ meta_subject/migrations/0107_auto_20220415_0043.py,sha256=PWxsJHxonC9L0nTWJnNF-oc3dcZfzkJPNvI38DYDbD8,1718
916
930
  meta_subject/migrations/0108_auto_20220415_1747.py,sha256=4HHVMatXiqavoutbzbZY7TlTHxg32uQYP7gHWg27DX8,688
917
931
  meta_subject/migrations/0109_auto_20220415_1758.py,sha256=FNBIWr0sCmXCvzI0yNVeMSrPup7vMQJhnYxrzHu9DSA,556
918
932
  meta_subject/migrations/0110_auto_20220512_1811.py,sha256=iKRSR0qkKbgOGQUT3zyz7SWN7kyrfJtFH98c1QTu8gM,2516
@@ -931,16 +945,16 @@ meta_subject/migrations/0122_auto_20220708_2144.py,sha256=qEaeHaf0Ab3SwvlENZxP4H
931
945
  meta_subject/migrations/0123_auto_20220714_2136.py,sha256=4ZOX8z0-GjWDTNu9DkZNxZtKIyFcMaEHMdzL4zf_pwA,8262
932
946
  meta_subject/migrations/0124_auto_20220714_2303.py,sha256=M_QpUhj8K-LD5HLytzYH7n59bqlruHzCGpozKjPaCY0,1206
933
947
  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
948
+ meta_subject/migrations/0126_auto_20220719_2142.py,sha256=etZtba3l2cN_QQqEKEIrKpKOsotCifX85Y8P6ge2if4,784
935
949
  meta_subject/migrations/0127_auto_20220720_0053.py,sha256=YAJ2xlCKC-0oin-XxnfzyZcsAF9ozNx_a_5cP8WJ1i4,5488
936
950
  meta_subject/migrations/0128_auto_20220720_0055.py,sha256=voqWxaEfSrFSCzXglIfZLRdQpAx_MZ6GZIJmjMr9j50,778
937
951
  meta_subject/migrations/0129_auto_20220720_0108.py,sha256=XBant365dtOEYMtVcbs0yKgbCGP_GIg3azqvX2TGGc8,490
938
952
  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
953
+ meta_subject/migrations/0131_auto_20220722_0411.py,sha256=h0fzn1OsT_tvx5LMDyrh9t3HUsXzcpGwA19regX_jO4,2153
954
+ meta_subject/migrations/0132_auto_20220722_1825.py,sha256=TmWCNPi8rdNvA7qfWZ-iVAzlXBrN_FE5uATEzVNFxXY,979
941
955
  meta_subject/migrations/0133_auto_20220722_2140.py,sha256=Un8wWZeac9RdJ3cUUo43bAHsOAm489wyhXcaeTBeve4,28130
942
956
  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
957
+ meta_subject/migrations/0135_auto_20220722_2212.py,sha256=34qNpdc0c-LkK0MhSh9ofJP50Ckut4c9yWwVyfU5fvY,2463
944
958
  meta_subject/migrations/0136_egfrdropnotification_creatinine_quantifier_and_more.py,sha256=4vWNQUmziJFlktyOekNqC_lx0ybywCx0FMaIE5_9oRE,8660
945
959
  meta_subject/migrations/0137_alter_egfrdropnotification_egfr_percent_change_and_more.py,sha256=OQA1uVxwReY4osMsbhT_MGVfOBaopBI4s7GW56ba3vU,1138
946
960
  meta_subject/migrations/0138_alter_glucose_fbg_datetime_and_more.py,sha256=JdZ1KW-PnapQm81_THgm-ty3_AeOmbujZoxfRE1cjY8,3531
@@ -955,7 +969,7 @@ meta_subject/migrations/0146_auto_20220907_0207.py,sha256=1va3UjUI5bD3yey08Fk3rp
955
969
  meta_subject/migrations/0147_auto_20220907_1505.py,sha256=kRJWQ81XsX_poQBS_u0tuiQBfRhnP4lQeNzfDTOeOmw,1906
956
970
  meta_subject/migrations/0148_auto_20220908_1826.py,sha256=iHN59ZuFFYQCbLYZAebF_kaiP8m-twUnwUAzrgtFOXU,1814
957
971
  meta_subject/migrations/0149_auto_20220913_2139.py,sha256=V27KGY9t6IV8Xzf0wgcLQseM1DBcXGXY3ReNC_iRUe0,1000
958
- meta_subject/migrations/0150_auto_20220914_0039.py,sha256=BmtWEsWQooijWvqQxTlTSq93GLfRM0kwDdUsJQaZEAQ,1222
972
+ meta_subject/migrations/0150_auto_20220914_0039.py,sha256=qB-6YVz3lloQf6JbbwZACGyf68n2LtlGcFX8v_NY9Qc,1322
959
973
  meta_subject/migrations/0151_auto_20220918_0508.py,sha256=tcQ-eyK-2cIqTLDtL9QsfDi4F9fu8UGHVye6QSBDYLA,52998
960
974
  meta_subject/migrations/0152_auto_20220925_0509.py,sha256=Zd_1TRIXLzw323ccrwHT_k76HgEqVCEBqvqbjlNYCto,738
961
975
  meta_subject/migrations/0153_auto_20220928_0250.py,sha256=nmYfG7zYmrRW4JQXoZQlE3aQQBBehDJrtVRIb4AWtK0,1172
@@ -1123,9 +1137,9 @@ tests/etc/user-rsa-restricted-private.pem,sha256=CUcHW9bznWdmmASN00hCzvxFPAFl4N2
1123
1137
  tests/etc/user-rsa-restricted-public.pem,sha256=mt84djoL-uHw6Wc5SJh0zml6VzXulnf8eQSFg7-fheg,450
1124
1138
  tests/etc/user-salt-local.key,sha256=x5anBw9fvbHurczouT3CjrkWb_xs7Ypm1htIJsgiuiw,256
1125
1139
  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,,
1140
+ meta_edc-0.3.35.dist-info/AUTHORS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1141
+ meta_edc-0.3.35.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1142
+ meta_edc-0.3.35.dist-info/METADATA,sha256=dDq2QH8-IJSAsrP9CH2CeRwlGMpaxNTgjYpVEu2pi3A,3015
1143
+ meta_edc-0.3.35.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
1144
+ meta_edc-0.3.35.dist-info/top_level.txt,sha256=RkzjNXwRq2kg_uZ_1bDwPUntijSXoY2YBqtByDwvvrc,244
1145
+ meta_edc-0.3.35.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,135 @@
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_model_admin.list_filters import ReportDateListFilter
6
+ from edc_pharmacy.admin.list_filters import MedicationsListFilter
7
+ from edc_sites.admin import SiteModelAdminMixin
8
+
9
+ from .admin_site import meta_pharmacy_admin
10
+ from .forms import RxForm, SubstitutionsForm
11
+ from .models import Rx, Substitutions
12
+
13
+
14
+ @admin.register(Substitutions, site=meta_pharmacy_admin)
15
+ class SubstitutionsAdmin(
16
+ SiteModelAdminMixin,
17
+ ModelAdminSubjectDashboardMixin,
18
+ SimpleHistoryAdmin,
19
+ ):
20
+ """Admin class for meta_pharmacy.Substitutions"""
21
+
22
+ form = SubstitutionsForm
23
+
24
+ autocomplete_fields = ["rx"]
25
+
26
+ add_instructions = "This form is used to record any substitions made for IMP refills"
27
+
28
+ fieldsets = (
29
+ (
30
+ None,
31
+ {"fields": ("report_datetime",)},
32
+ ),
33
+ ("Original label on bottle", {"fields": ("sid", "visit_no")}),
34
+ (
35
+ "Substitution / Changed label",
36
+ {
37
+ "description": "The label on this bottle has been changed to the following",
38
+ "fields": ("dispensed_sid", "updated_visit_no"),
39
+ },
40
+ ),
41
+ (
42
+ "Subject",
43
+ {
44
+ "fields": ("rx",),
45
+ },
46
+ ),
47
+ audit_fieldset_tuple,
48
+ )
49
+
50
+ list_display = (
51
+ "sid",
52
+ "dispensed_sid",
53
+ "arm_match",
54
+ "subject_identifier",
55
+ "report_date",
56
+ )
57
+
58
+ radio_fields = {"arm_match": admin.VERTICAL}
59
+
60
+ list_filter = ("arm_match", ReportDateListFilter)
61
+
62
+ search_fields = ["subject_identifier", "sid", "dispensed_sid"]
63
+
64
+ @admin.display(description="Report date", ordering="report_datetime")
65
+ def report_date(self, obj) -> str | None:
66
+ if obj.report_datetime:
67
+ return obj.report_datetime.date()
68
+ 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,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__"