meta-edc 1.6.4__py3-none-any.whl → 1.6.5__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meta-edc
3
- Version: 1.6.4
3
+ Version: 1.6.5
4
4
  Summary: META Trial EDC (https://www.isrctn.com/ISRCTN76157257)
5
5
  Keywords: django,clinicedc,META EDC,EDC,clinical trials,META Trial,ISRCTN76157257
6
6
  Author: Erik van Widenfelt, Jonathan Willitts
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
19
  Requires-Dist: django==5.2.10
20
20
  Requires-Dist: celery>=5.6.2
21
- Requires-Dist: clinicedc==2.3.5
21
+ Requires-Dist: clinicedc==2.3.6
22
22
  Requires-Dist: edc-he>=1.5.2
23
23
  Requires-Dist: edc-microscopy>=1.4.2
24
24
  Requires-Dist: edc-mnsi>=1.4.0
@@ -92,8 +92,8 @@ Assuming you are logged into the account ``myaccount``:
92
92
  mkdir ~/edc && \
93
93
  cd ~/edc && \
94
94
  uv venv && \
95
- uv pip install -U meta-edc==1.6.3 && \
96
- wget https://raw.githubusercontent.com/meta-trial/meta-edc/1.6.3/manage.py && \
95
+ uv pip install -U meta-edc==1.6.4 && \
96
+ wget https://raw.githubusercontent.com/meta-trial/meta-edc/1.6.4/manage.py && \
97
97
  uv pip freeze | grep meta-edc
98
98
 
99
99
  Copy your ``.env`` file to ``~/.etc``.
@@ -143,7 +143,7 @@ From the above example:
143
143
 
144
144
  cd ~/edc && \
145
145
  uv venv --clear && \
146
- uv pip install -U meta-edc==1.6.3 && \
146
+ uv pip install -U meta-edc==1.6.4 && \
147
147
  wget -O manage.py https://raw.githubusercontent.com/meta-trial/meta-edc/1.1.10/manage.py && \
148
148
  uv pip freeze | grep meta-edc && \
149
149
  python manage.py check
@@ -259,10 +259,10 @@ meta_labs/list_data.py,sha256=Cbu8yBpogDno1B10MtC8HCXLRbtxqUGjLxuAjUbyLYg,473
259
259
  meta_labs/processing_profiles.py,sha256=fRX72FOl2rsnOJYhgup5QacfGSXKtWqn2gD3Giz2GDA,500
260
260
  meta_labs/reportables.py,sha256=DB8jyeTHWuRz3ZPCnevLjTuqnsSpFKsrgYJ0XDNVZzU,2201
261
261
  meta_lists/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
262
- meta_lists/admin.py,sha256=g05vpXfVIEBVG03aiPD8Vn-AnR7gL60MbPJAfzsO6R8,2157
262
+ meta_lists/admin.py,sha256=_Ww9dkT8BiXwbBFAAUuFYjsWmrF22FEVyR_8E5FsH_g,2318
263
263
  meta_lists/admin_site.py,sha256=M4uorELumZDIKD8SHs-AEX1doQFqXhRy-eCcRWYEu9k,165
264
264
  meta_lists/apps.py,sha256=aegHpyrHw188UxhNVFd-v35HP9wO7J7G9BYmliOOE0c,278
265
- meta_lists/list_data.py,sha256=5wP4B2tITPrfBXFfLRgD47BmNvzErBmDTBjWNzPNFtY,9865
265
+ meta_lists/list_data.py,sha256=i9JsXMsWImB9ajvS31hyiDu2omtjwm0oOXAq0WZvrPw,10014
266
266
  meta_lists/migrations/0001_initial.py,sha256=87crhJGEUzUxe9TaNTzzKM6AjE3Pjw032PkhYrnRz9k,13881
267
267
  meta_lists/migrations/0002_auto_20191026_2231.py,sha256=lV7keU3h-MC7O_RJLYxSY_Gr2T7ROtCf0qm_WkS2s3g,4608
268
268
  meta_lists/migrations/0003_auto_20191102_0033.py,sha256=LkLUHM5zTj6vg3l1997g57uhncZPLHW-jrJgiUSe6rM,2555
@@ -283,8 +283,9 @@ meta_lists/migrations/0017_complications_dmmedications_dmtreatments_and_more.py,
283
283
  meta_lists/migrations/0018_missedreferralreasons.py,sha256=E_-Jrkwz_nAc3SND6EPdkWKeobi6q308J--mDM8JgHA,2639
284
284
  meta_lists/migrations/0019_auto_20250128_0143.py,sha256=NtS06qHmBQnoGZhZTR-OAfmoyllmMAyyTozXGl1JdbM,1577
285
285
  meta_lists/migrations/0020_alter_abnormalfootappearanceobservations_extra_value_and_more.py,sha256=exhYddnIS8101GWd7o_9Z_pqzU99KoYhuIgwu5INGWI,12991
286
+ meta_lists/migrations/0021_diagnosticdevices.py,sha256=S5_GodQ789ouStyZf08d4hEk-9lvYCli_8MCUx77fRE,2918
286
287
  meta_lists/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
287
- meta_lists/models.py,sha256=3amfYtGe4GGtSpLXs36On8k_ZmpDzNs5ga54O-SIABs,3032
288
+ meta_lists/models.py,sha256=Z12cgQl8lKSX9HiyOaov24ywpTh8ZIx1MHHGpinSSfs,3206
288
289
  meta_lists/urls.py,sha256=9NCrRvdkPXzH3L7VMCa0iQnz-j5tujzhvvtRRAGunV8,204
289
290
  meta_pharmacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
290
291
  meta_pharmacy/admin/__init__.py,sha256=oR5RGRlUqHN0kZMuW8j1n5f2e7akQMZR6hj9TuLlaTY,138
@@ -747,8 +748,8 @@ meta_subject/admin/fields.py,sha256=wlKr_x8-PWL4urv6N0L4ti5yG3D7FnLy2U_hH6Baqzc,
747
748
  meta_subject/admin/fieldsets.py,sha256=NjFKDAMvzePa9TijR_-zTLsDbawfBQDuws2BzWDzeZQ,1516
748
749
  meta_subject/admin/followup_examination_admin.py,sha256=nNFQvW_zipgJCd1RDa2A2UOQkcPIq8cirwM2f3Ih0ZY,5278
749
750
  meta_subject/admin/followup_vitals_admin.py,sha256=a2bwBwFsQ1sMmnBgmeCOEv6wNCXuKeIqIwEZB-Lqt_E,2297
750
- meta_subject/admin/glucose_admin.py,sha256=5K9rMFE8jCZRTJBsORJi0aKJF1xizh0303iwdJCrTLM,2902
751
- meta_subject/admin/glucose_fbg_admin.py,sha256=z9m9xGMnIgagqe-BWSRgUJngEN2OYbjKIsQva410BGE,2852
751
+ meta_subject/admin/glucose_admin.py,sha256=76j7mGttcJEn4R-futfUt7LDiBFE3ffR_DnIqNzUwmE,3332
752
+ meta_subject/admin/glucose_fbg_admin.py,sha256=O5GaNjBR0bZQcbbw1ZrgWHzcRCWRA8viNkOfwk1fVSk,2964
752
753
  meta_subject/admin/health_economics/__init__.py,sha256=t0vFauE3auk7FESIvk5tFjc3-Jtshl9eiAJswQBG1gw,212
753
754
  meta_subject/admin/health_economics/health_economics_simple_admin.py,sha256=nL0CvjWQsFsR19ine14iItt9e8Px53Ln_tSppMN8UQ4,1053
754
755
  meta_subject/admin/health_economics/health_economics_update_admin.py,sha256=mtsd1fJ8yvTK1eol5f03fZ8jk1afeYKSxEydPGmma7w,3905
@@ -1081,6 +1082,8 @@ meta_subject/migrations/0235_glucosefbg_endpoint_today_and_more.py,sha256=ctq-Np
1081
1082
  meta_subject/migrations/0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more.py,sha256=YU8IC-nONmzwV6jJ3P-f5jpp9HUEMyKKhRpWgl8HjHo,1883
1082
1083
  meta_subject/migrations/0237_historicalhivexitreview_singleton_field_and_more.py,sha256=V_6u5YMGCRYgwrwqJpQam53fZcYWHHWDRWBhPtTkTuw,2115
1083
1084
  meta_subject/migrations/0238_historicalhivexitreview_available_and_more.py,sha256=r2kSbcMSbKzQswJSfMP1CqRAZSdDayHjjQzsv6p-D3I,2900
1085
+ meta_subject/migrations/0239_glucosefbg_diagnostic_device_and_more.py,sha256=SIU3VMAIOwwvYtKOx6MmHlyAX6QnWi5VC9wtib-OVcI,1220
1086
+ meta_subject/migrations/0240_glucose_diagnostic_device_and_more.py,sha256=GzJJSbGU4cHvkRRZQyB94Gfiu8nKJyBJjZQkp2XTcig,2111
1084
1087
  meta_subject/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1085
1088
  meta_subject/model_mixins/__init__.py,sha256=2Dae7t4r2f3YubLevk_HH_GVTDrZREOpCDDMYthLV5U,522
1086
1089
  meta_subject/model_mixins/arv_history_model_mixin.py,sha256=Ync4oLFng1OQW3pVxNxbEhKplWVNpUY5BiXy47lv6pk,1573
@@ -1106,13 +1109,14 @@ meta_subject/models/delivery.py,sha256=IMMrTtWrMtBL2Kn8jJ4ACkGE0RYq4sAxym46zL0Bn
1106
1109
  meta_subject/models/diabetes/__init__.py,sha256=jJi8M56-D4jVx3Q6fkDqMWg9XfeJOw_l6Ge864OyNSA,112
1107
1110
  meta_subject/models/diabetes/dm_endpoint.py,sha256=DPfLru5u6wBbu_JiEyrRJRbmcF5nKox0U4A07dRNayY,1846
1108
1111
  meta_subject/models/diabetes/dm_followup.py,sha256=n1KqEkt38vxJDXVEsdffjD2A1YOxGM31m_HdgZWpuLc,6414
1112
+ meta_subject/models/diagnostic.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1109
1113
  meta_subject/models/diet_and_lifestyle.py,sha256=4QVNVyF813AC9Rp2xm3Gr3nRtHSZmCsuGx0PWOcMpuc,1061
1110
1114
  meta_subject/models/egfr_drop_notification.py,sha256=LSA0s4klzQ69CwPDI_q89eQ49XbcBOQ-Q21IEyXdgOk,557
1111
1115
  meta_subject/models/eq5d3l.py,sha256=itRrbfzL7Jsg9u7ml0SXwsw4nMoMcNyG0-YCD2VeXB0,291
1112
1116
  meta_subject/models/followup_examination.py,sha256=ZNapm_-fofIQiWZtWbtVnmSY4NJ3OdktmY_16rVxvrs,8072
1113
1117
  meta_subject/models/followup_vitals.py,sha256=pBZt4xrw7eVUfHBRtotUh9orJdNjOGxSuNa6JeWQRqA,903
1114
- meta_subject/models/glucose.py,sha256=3EJAIetRpUqJpx9VVIpZNNbOkwqkxGqnF8exZPZYgzU,2248
1115
- meta_subject/models/glucose_fbg.py,sha256=3itY4k8xITRz276UDTNL014KsgZi7lnl1_WBlxCJWEg,2103
1118
+ meta_subject/models/glucose.py,sha256=X4ujhc71RHINwFaoN1JrpwiGNkGOnJFQwr_u-WXaA-4,2526
1119
+ meta_subject/models/glucose_fbg.py,sha256=T4jFKB3LeEZ0ujjMEH670-fHrWRSAmfpBgWM6PG17c4,2381
1116
1120
  meta_subject/models/glucose_review.py,sha256=bCnSBe_C3LeBy1XrZpV9rv-hOk8onZ_Tl37t7dqm-sw,450
1117
1121
  meta_subject/models/health_economics/__init__.py,sha256=J557vTjzK1EvUAM4mx9zDVQ7Zr0W25stnWXz_zE2a-c,245
1118
1122
  meta_subject/models/health_economics/health_economics.py,sha256=lZE6sMmYQTPjz9QbXZ2rznlbgW61G0JYYIQ07IueJvw,9705
@@ -1158,7 +1162,7 @@ meta_visit_schedule/visit_schedules/phase_three/schedule.py,sha256=LO9HqV6r_LUEY
1158
1162
  meta_visit_schedule/visit_schedules/phase_three/schedule_dm_referral.py,sha256=q12p5wXc2D7lSiJVBnoSQw8Q3vL6uDx1t3PuDJO-Z-U,1735
1159
1163
  meta_visit_schedule/visit_schedules/phase_three/schedule_pregnancy.py,sha256=bEpbpCX3vfZmnsqudr0z8PU5kiaX4ws1sO5Im98Mo28,1106
1160
1164
  meta_visit_schedule/visit_schedules/phase_three/visit_schedule.py,sha256=ak4qazeKlpIlvpqrK9hDDO0fwWuWyvb4Ec-JU31IJxc,654
1161
- meta_edc-1.6.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1162
- meta_edc-1.6.4.dist-info/WHEEL,sha256=XV0cjMrO7zXhVAIyyc8aFf1VjZ33Fen4IiJk5zFlC3g,80
1163
- meta_edc-1.6.4.dist-info/METADATA,sha256=xPE4Kg9X6_5hUYU41p1ooEJY9KbKnLZ128c6truDNpQ,5260
1164
- meta_edc-1.6.4.dist-info/RECORD,,
1165
+ meta_edc-1.6.5.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1166
+ meta_edc-1.6.5.dist-info/WHEEL,sha256=XV0cjMrO7zXhVAIyyc8aFf1VjZ33Fen4IiJk5zFlC3g,80
1167
+ meta_edc-1.6.5.dist-info/METADATA,sha256=5hB7Sx67nWaeOpC-tD1v8e1o1WbvyRfZnDEZ1HXwd44,5260
1168
+ meta_edc-1.6.5.dist-info/RECORD,,
meta_lists/admin.py CHANGED
@@ -7,6 +7,7 @@ from .models import (
7
7
  BaselineSymptoms,
8
8
  Complications,
9
9
  DiabetesSymptoms,
10
+ DiagnosticDevices,
10
11
  DmMedications,
11
12
  DmTreatments,
12
13
  HealthcareWorkers,
@@ -82,3 +83,8 @@ class InvestigationsAdmin(ListModelAdminMixin, admin.ModelAdmin):
82
83
  @admin.register(HealthcareWorkers, site=meta_lists_admin)
83
84
  class HealthcareWorkersAdmin(ListModelAdminMixin, admin.ModelAdmin):
84
85
  pass
86
+
87
+
88
+ @admin.register(DiagnosticDevices, site=meta_lists_admin)
89
+ class DiagnosticDevicesAdmin(ListModelAdminMixin, admin.ModelAdmin):
90
+ pass
meta_lists/list_data.py CHANGED
@@ -240,4 +240,9 @@ list_data = {
240
240
  "edc_facility.healthfacilitytypes": [
241
241
  (CLINIC, "META Study Clinic"),
242
242
  ],
243
+ "meta_lists.diagnosticdevices": [
244
+ ("hemocue", "Hemocue"),
245
+ ("accuchek", "Accu-Chek"),
246
+ (OTHER, "Other not listed"),
247
+ ],
243
248
  }
@@ -0,0 +1,88 @@
1
+ # Generated by Django 5.2.10 on 2026-01-22 19:43
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ (
10
+ "meta_lists",
11
+ "0020_alter_abnormalfootappearanceobservations_extra_value_and_more",
12
+ ),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name="DiagnosticDevices",
18
+ fields=[
19
+ (
20
+ "name",
21
+ models.CharField(
22
+ help_text="This is the stored value, required",
23
+ max_length=250,
24
+ unique=True,
25
+ verbose_name="Stored value",
26
+ ),
27
+ ),
28
+ (
29
+ "plural_name",
30
+ models.CharField(
31
+ default="", max_length=250, verbose_name="Plural name"
32
+ ),
33
+ ),
34
+ (
35
+ "display_name",
36
+ models.CharField(
37
+ help_text="(suggest 40 characters max.)",
38
+ max_length=250,
39
+ unique=True,
40
+ verbose_name="Name",
41
+ ),
42
+ ),
43
+ (
44
+ "display_index",
45
+ models.IntegerField(
46
+ default=0,
47
+ help_text="Index to control display order if not alphabetical, not required",
48
+ verbose_name="display index",
49
+ ),
50
+ ),
51
+ (
52
+ "field_name",
53
+ models.CharField(
54
+ blank=True,
55
+ default="",
56
+ editable=False,
57
+ help_text="Not required",
58
+ max_length=25,
59
+ ),
60
+ ),
61
+ ("extra_value", models.CharField(default="", max_length=250)),
62
+ (
63
+ "version",
64
+ models.CharField(default="1.0", editable=False, max_length=35),
65
+ ),
66
+ ("id", models.AutoField(primary_key=True, serialize=False)),
67
+ ],
68
+ options={
69
+ "verbose_name": "Diagnostic device",
70
+ "verbose_name_plural": "Diagnostic devices",
71
+ "abstract": False,
72
+ "default_permissions": (
73
+ "add",
74
+ "change",
75
+ "delete",
76
+ "view",
77
+ "export",
78
+ "import",
79
+ ),
80
+ "indexes": [
81
+ models.Index(
82
+ fields=["display_index", "display_name"],
83
+ name="meta_lists__display_e9a915_idx",
84
+ )
85
+ ],
86
+ },
87
+ ),
88
+ ]
meta_lists/models.py CHANGED
@@ -101,3 +101,9 @@ class MissedReferralReasons(ListModelMixin):
101
101
  class Meta(ListModelMixin.Meta):
102
102
  verbose_name = "Missed Referral Reasons"
103
103
  verbose_name_plural = "Missed Referral Reasons"
104
+
105
+
106
+ class DiagnosticDevices(ListModelMixin):
107
+ class Meta(ListModelMixin.Meta):
108
+ verbose_name = "Diagnostic device"
109
+ verbose_name_plural = "Diagnostic devices"
@@ -38,6 +38,7 @@ class GlucoseAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
38
38
  "fbg_datetime",
39
39
  "fbg_value",
40
40
  "fbg_units",
41
+ "diagnostic_device",
41
42
  )
42
43
  },
43
44
  ),
@@ -77,18 +78,29 @@ class GlucoseAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
77
78
  "ogtt_performed": admin.VERTICAL,
78
79
  "ogtt_units": admin.VERTICAL,
79
80
  "endpoint_today": admin.VERTICAL,
81
+ "diagnostic_device": admin.VERTICAL,
80
82
  }
81
83
 
82
84
  def get_list_display(self, request) -> tuple[str, ...]:
83
85
  list_display = super().get_list_display(request)
84
86
  list_display = list(list_display)
85
- list_display.insert(3, "ogtt_value")
87
+ list_display.insert(3, "ogtt")
86
88
  list_display.insert(3, "fbg_value")
89
+ list_display = [f for f in list_display if f != "__str__"]
87
90
  return tuple(list_display)
88
91
 
89
92
  def get_list_filter(self, request) -> tuple[str | type[SimpleListFilter], ...]:
90
93
  list_filter = super().get_list_filter(request)
91
94
  list_filter = list(list_filter)
95
+ list_filter.insert(2, "diagnostic_device")
92
96
  list_filter.insert(2, OgttListFilter)
93
97
  list_filter.insert(2, FbgListFilter)
94
98
  return tuple(list_filter)
99
+
100
+ @admin.display(description="FBG", ordering="fbg_value")
101
+ def fbg(self, obj):
102
+ return obj.fbg_value
103
+
104
+ @admin.display(description="OGTT", ordering="ogtt_value")
105
+ def ogtt(self, obj):
106
+ return obj.ogtt_value
@@ -38,6 +38,7 @@ class GlucoseFbgAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
38
38
  "fbg_datetime",
39
39
  "fbg_value",
40
40
  "fbg_units",
41
+ "diagnostic_device",
41
42
  )
42
43
  },
43
44
  ),
@@ -70,6 +71,7 @@ class GlucoseFbgAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
70
71
  "fbg_units": admin.VERTICAL,
71
72
  "fbg_performed": admin.VERTICAL,
72
73
  "endpoint_today": admin.VERTICAL,
74
+ "diagnostic_device": admin.VERTICAL,
73
75
  }
74
76
 
75
77
  @admin.display(description="FBG", ordering="fbg_value")
@@ -79,8 +81,8 @@ class GlucoseFbgAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
79
81
  def get_list_display(self, request) -> tuple[str, ...]:
80
82
  list_display = super().get_list_display(request)
81
83
  list_display = list(list_display)
82
- # list_display.insert(3, "ogtt")
83
84
  list_display.insert(3, "fbg")
85
+ list_display = [f for f in list_display if f != "__str__"]
84
86
  return tuple(list_display)
85
87
 
86
88
  def get_list_filter(self, request) -> tuple[str | type[SimpleListFilter], ...]:
@@ -0,0 +1,39 @@
1
+ # Generated by Django 5.2.10 on 2026-01-22 19:43
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("meta_lists", "0021_diagnosticdevices"),
11
+ ("meta_subject", "0238_historicalhivexitreview_available_and_more"),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.AddField(
16
+ model_name="glucosefbg",
17
+ name="diagnostic_device",
18
+ field=models.ForeignKey(
19
+ blank=True,
20
+ limit_choices_to={"name__icontains": "FBG"},
21
+ null=True,
22
+ on_delete=django.db.models.deletion.PROTECT,
23
+ to="meta_lists.diagnosticdevices",
24
+ ),
25
+ ),
26
+ migrations.AddField(
27
+ model_name="historicalglucosefbg",
28
+ name="diagnostic_device",
29
+ field=models.ForeignKey(
30
+ blank=True,
31
+ db_constraint=False,
32
+ limit_choices_to={"name__icontains": "FBG"},
33
+ null=True,
34
+ on_delete=django.db.models.deletion.DO_NOTHING,
35
+ related_name="+",
36
+ to="meta_lists.diagnosticdevices",
37
+ ),
38
+ ),
39
+ ]
@@ -0,0 +1,61 @@
1
+ # Generated by Django 5.2.10 on 2026-01-23 01:46
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("meta_lists", "0021_diagnosticdevices"),
11
+ ("meta_subject", "0239_glucosefbg_diagnostic_device_and_more"),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.AddField(
16
+ model_name="glucose",
17
+ name="diagnostic_device",
18
+ field=models.ForeignKey(
19
+ limit_choices_to={"name__in": ["accuchek", "hemocue", "OTHER"]},
20
+ null=True,
21
+ on_delete=django.db.models.deletion.PROTECT,
22
+ to="meta_lists.diagnosticdevices",
23
+ ),
24
+ ),
25
+ migrations.AddField(
26
+ model_name="historicalglucose",
27
+ name="diagnostic_device",
28
+ field=models.ForeignKey(
29
+ blank=True,
30
+ db_constraint=False,
31
+ limit_choices_to={"name__in": ["accuchek", "hemocue", "OTHER"]},
32
+ null=True,
33
+ on_delete=django.db.models.deletion.DO_NOTHING,
34
+ related_name="+",
35
+ to="meta_lists.diagnosticdevices",
36
+ ),
37
+ ),
38
+ migrations.AlterField(
39
+ model_name="glucosefbg",
40
+ name="diagnostic_device",
41
+ field=models.ForeignKey(
42
+ limit_choices_to={"name__in": ["accuchek", "hemocue", "OTHER"]},
43
+ null=True,
44
+ on_delete=django.db.models.deletion.PROTECT,
45
+ to="meta_lists.diagnosticdevices",
46
+ ),
47
+ ),
48
+ migrations.AlterField(
49
+ model_name="historicalglucosefbg",
50
+ name="diagnostic_device",
51
+ field=models.ForeignKey(
52
+ blank=True,
53
+ db_constraint=False,
54
+ limit_choices_to={"name__in": ["accuchek", "hemocue", "OTHER"]},
55
+ null=True,
56
+ on_delete=django.db.models.deletion.DO_NOTHING,
57
+ related_name="+",
58
+ to="meta_lists.diagnosticdevices",
59
+ ),
60
+ ),
61
+ ]
File without changes
@@ -1,4 +1,4 @@
1
- from clinicedc_constants import NOT_APPLICABLE
1
+ from clinicedc_constants import NOT_APPLICABLE, OTHER
2
2
  from django.db import models
3
3
  from edc_constants.choices import YES_NO
4
4
  from edc_glucose.model_mixin_factories import (
@@ -9,6 +9,8 @@ from edc_glucose.model_mixin_factories import (
9
9
  from edc_model.models import BaseUuidModel
10
10
  from edc_utils import formatted_date
11
11
 
12
+ from meta_lists.models import DiagnosticDevices
13
+
12
14
  from ..choices import ENDPOINT_CHOICES
13
15
  from ..constants import AMENDMENT_DATE
14
16
  from ..model_mixins import CrfModelMixin
@@ -46,6 +48,14 @@ class Glucose(
46
48
  verbose_name="If NO, provide reason", max_length=150, default="", blank=True
47
49
  )
48
50
 
51
+ diagnostic_device = models.ForeignKey(
52
+ DiagnosticDevices,
53
+ on_delete=models.PROTECT,
54
+ null=True,
55
+ blank=False,
56
+ limit_choices_to={"name__in": ["accuchek", "hemocue", OTHER]},
57
+ )
58
+
49
59
  ogtt_performed = models.CharField(
50
60
  verbose_name="Was the OGTT test performed?",
51
61
  max_length=15,
@@ -1,4 +1,4 @@
1
- from clinicedc_constants import NO, NOT_APPLICABLE
1
+ from clinicedc_constants import NO, NOT_APPLICABLE, OTHER
2
2
  from django.db import models
3
3
  from edc_constants.choices import YES_NO
4
4
  from edc_glucose.model_mixin_factories import (
@@ -8,6 +8,8 @@ from edc_glucose.model_mixin_factories import (
8
8
  from edc_model.models import BaseUuidModel
9
9
  from edc_utils import formatted_date
10
10
 
11
+ from meta_lists.models import DiagnosticDevices
12
+
11
13
  from ..choices import ENDPOINT_CHOICES
12
14
  from ..constants import AMENDMENT_DATE
13
15
  from ..model_mixins import CrfModelMixin
@@ -69,6 +71,14 @@ class GlucoseFbg(
69
71
  help_text="Date should be within 1 week of report date",
70
72
  )
71
73
 
74
+ diagnostic_device = models.ForeignKey(
75
+ DiagnosticDevices,
76
+ on_delete=models.PROTECT,
77
+ null=True,
78
+ blank=False,
79
+ limit_choices_to={"name__in": ["accuchek", "hemocue", OTHER]},
80
+ )
81
+
72
82
  class Meta(CrfModelMixin.Meta, BaseUuidModel.Meta):
73
83
  verbose_name = "Glucose (FBG)"
74
84
  verbose_name_plural = "Glucose (FBG)"