meta-edc 0.3.38__py3-none-any.whl → 0.3.39__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.
- meta_analytics/__init__.py +0 -2
- meta_analytics/dataframes/__init__.py +1 -0
- meta_analytics/dataframes/get_last_imp_visits_df.py +101 -0
- meta_auth/auth_objects.py +1 -0
- meta_consent/consents.py +6 -0
- meta_consent/locale/lg/LC_MESSAGES/django.po +69 -0
- meta_consent/locale/sw/LC_MESSAGES/django.po +12 -12
- meta_dashboard/locale/lg/LC_MESSAGES/django.po +30 -0
- meta_dashboard/locale/sw/LC_MESSAGES/django.po +11 -2
- meta_dashboard/navbars.py +2 -0
- meta_dashboard/tests/urls.py +0 -1
- meta_dashboard/view_utils/subject_screening_button.py +2 -2
- meta_edc/__init__.py +3 -10
- meta_edc/{celery/debug.py → celery.py} +2 -2
- meta_edc/navbars.py +2 -0
- meta_edc/settings/debug.py +4 -0
- meta_edc/settings/defaults.py +29 -16
- meta_edc/templates/meta_edc/bootstrap3/home.html +1 -1
- meta_edc/urls.py +1 -0
- {meta_edc-0.3.38.dist-info → meta_edc-0.3.39.dist-info}/METADATA +6 -6
- {meta_edc-0.3.38.dist-info → meta_edc-0.3.39.dist-info}/RECORD +70 -59
- {meta_edc-0.3.38.dist-info → meta_edc-0.3.39.dist-info}/WHEEL +1 -1
- meta_pharmacy/admin/__init__.py +0 -1
- meta_pharmacy/admin/actions.py +38 -0
- meta_pharmacy/admin_site.py +5 -1
- meta_pharmacy/apps.py +2 -0
- meta_pharmacy/forms/__init__.py +2 -0
- meta_pharmacy/forms/rx_form.py +16 -0
- meta_pharmacy/{forms.py → forms/substitutions_form.py} +1 -14
- meta_pharmacy/label_configs.py +30 -0
- meta_pharmacy/labels/__init__.py +3 -1
- meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +58 -0
- meta_pharmacy/labels/draw_label_for_subject_with_code128.py +14 -0
- meta_pharmacy/labels/draw_label_with_test_data.py +26 -0
- meta_pharmacy/labels/label_data.py +14 -0
- meta_pharmacy/labels/print_sheets.py +22 -11
- meta_pharmacy/list_data.py +8 -0
- meta_pharmacy/management/commands/__init__.py +0 -0
- meta_pharmacy/management/commands/update_initial_pharmacy_data.py +10 -0
- meta_pharmacy/migrations/0002_initial.py +7 -5
- meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +390 -0
- meta_pharmacy/migrations/0009_remove_historicalrx_slug.py +17 -0
- meta_pharmacy/models/__init__.py +1 -2
- meta_pharmacy/models/label_data.py +38 -0
- meta_pharmacy/models/{label.py → rx_label.py} +8 -19
- meta_pharmacy/utils/__init__.py +1 -0
- meta_pharmacy/utils/update_initial_pharmacy_data.py +146 -0
- meta_prn/admin/pregnancy_notification_admin.py +6 -2
- meta_reports/admin/__init__.py +1 -0
- meta_reports/admin/dbviews/glucose_summary_admin.py +1 -1
- meta_reports/admin/last_imp_refill_admin.py +181 -0
- meta_reports/migrations/0052_lastimpvisit.py +57 -0
- meta_reports/migrations/0053_rename_lastimpvisit_lastimprefill_and_more.py +31 -0
- meta_reports/models/__init__.py +1 -0
- meta_reports/models/last_imp_refill.py +34 -0
- meta_subject/admin/study_medication_admin.py +10 -0
- meta_subject/forms/study_medication_form.py +35 -0
- meta_subject/locale/lg/LC_MESSAGES/django.po +470 -0
- meta_subject/locale/sw/LC_MESSAGES/django.po +191 -89
- meta_subject/metadata_rules/predicates.py +34 -7
- meta_subject/migrations/0214_historicalstudymedication_stock_codes_and_more.py +44 -0
- meta_subject/migrations/0215_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
- meta_subject/tests/tests/test_mnsi.py +180 -113
- meta_visit_schedule/visit_schedules/phase_three/crfs.py +18 -6
- tests/test_settings.py +4 -1
- meta_edc/celery/__init__.py +0 -2
- meta_edc/celery/live.py +0 -17
- meta_edc/celery/uat.py +0 -17
- meta_pharmacy/admin/lot_number_admin.py +0 -43
- meta_pharmacy/labels/get_label_data.py +0 -30
- meta_pharmacy/models/lot_number.py +0 -25
- meta_reports/models/unmanaged/README +0 -14
- meta_reports/models/unmanaged/patient_history_missing_baseline_cd4.py +0 -26
- meta_reports/models/unmanaged/patient_history_missing_baseline_cd4.sql +0 -10
- meta_reports/models/unmanaged/unattended_three_in_row.py +0 -24
- meta_reports/models/unmanaged/unattended_three_in_row.sql +0 -19
- meta_reports/models/unmanaged/unattended_three_in_row2.py +0 -24
- meta_reports/models/unmanaged/unattended_three_in_row2.sql +0 -39
- meta_reports/models/unmanaged/unattended_two_in_row.py +0 -22
- meta_reports/models/unmanaged/unattended_two_in_row.sql +0 -19
- {meta_reports/models/unmanaged → meta_edc/migrations}/__init__.py +0 -0
- {meta_edc-0.3.38.dist-info → meta_edc-0.3.39.dist-info}/AUTHORS +0 -0
- {meta_edc-0.3.38.dist-info → meta_edc-0.3.39.dist-info}/LICENSE +0 -0
- {meta_edc-0.3.38.dist-info → meta_edc-0.3.39.dist-info}/top_level.txt +0 -0
- /meta_pharmacy/{admin/label_admin.py → management/__init__.py} +0 -0
@@ -7,23 +7,34 @@ from reportlab.graphics.barcode.widgets import BarcodeStandard39
|
|
7
7
|
from reportlab.graphics.charts.textlabels import Label as RlLabel
|
8
8
|
from reportlab.graphics.shapes import String
|
9
9
|
|
10
|
-
from
|
10
|
+
from ..models import LabelData
|
11
11
|
|
12
12
|
|
13
|
-
class
|
13
|
+
class Label:
|
14
|
+
"""
|
15
|
+
this should be based on a generated dataset using the stock transfer
|
16
|
+
request data.
|
14
17
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
maybe include a printout for the site to review the IN-STOCK vs ORDER
|
19
|
+
status for each subject in a stock transfer request
|
20
|
+
|
21
|
+
subject1 IN-STOCK
|
22
|
+
subject2 ORDER
|
23
|
+
subject3 ORDER
|
24
|
+
"""
|
25
|
+
|
26
|
+
def __init__(self, obj: LabelData):
|
27
|
+
self.label = obj
|
28
|
+
self.gender = obj.gender
|
29
|
+
self.site_id = obj.site_id
|
30
|
+
self.subject_identifier = obj.subject_identifier
|
31
|
+
self.reference = obj.reference
|
32
|
+
self.sid = obj.sid
|
22
33
|
self.site_name = sites.get(self.site_id).title
|
23
34
|
|
24
35
|
|
25
|
-
def draw_label(label, width, height, data:
|
26
|
-
data =
|
36
|
+
def draw_label(label, width, height, data: LabelData):
|
37
|
+
data = Label(data)
|
27
38
|
br = BarcodeStandard39(
|
28
39
|
humanReadable=True, checksum=False, barHeight=30, barWidth=0.7, gap=1.7
|
29
40
|
)
|
File without changes
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# Generated by Django 5.1 on 2024-09-09 20:35
|
2
2
|
|
3
|
+
import uuid
|
4
|
+
|
3
5
|
import _socket
|
4
6
|
import django.db.models.deletion
|
5
7
|
import django_audit_fields.fields.hostname_modification_field
|
@@ -7,15 +9,15 @@ import django_audit_fields.fields.userfield
|
|
7
9
|
import django_audit_fields.fields.uuid_auto_field
|
8
10
|
import django_audit_fields.models.audit_model_mixin
|
9
11
|
import django_revision.revision_field
|
10
|
-
import edc_pharmacy.models.rx
|
12
|
+
import edc_pharmacy.models.prescription.rx
|
11
13
|
import edc_sites.managers
|
12
14
|
import edc_utils.date
|
13
|
-
import meta_pharmacy.models
|
14
15
|
import simple_history.models
|
15
|
-
import uuid
|
16
16
|
from django.conf import settings
|
17
17
|
from django.db import migrations, models
|
18
18
|
|
19
|
+
import meta_pharmacy.models
|
20
|
+
|
19
21
|
|
20
22
|
class Migration(migrations.Migration):
|
21
23
|
|
@@ -40,7 +42,7 @@ class Migration(migrations.Migration):
|
|
40
42
|
},
|
41
43
|
bases=("edc_pharmacy.rx",),
|
42
44
|
managers=[
|
43
|
-
("objects", edc_pharmacy.models.rx.Manager()),
|
45
|
+
("objects", edc_pharmacy.models.prescription.rx.Manager()),
|
44
46
|
("on_site", edc_sites.managers.CurrentSiteManager()),
|
45
47
|
],
|
46
48
|
),
|
@@ -293,7 +295,7 @@ class Migration(migrations.Migration):
|
|
293
295
|
null=True,
|
294
296
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
295
297
|
related_name="+",
|
296
|
-
to="
|
298
|
+
to="edc_registration.registeredsubject",
|
297
299
|
verbose_name="Subject Identifier",
|
298
300
|
),
|
299
301
|
),
|
@@ -0,0 +1,390 @@
|
|
1
|
+
# Generated by Django 5.1.2 on 2024-11-14 20:53
|
2
|
+
|
3
|
+
import _socket
|
4
|
+
import django.db.models.deletion
|
5
|
+
import django_audit_fields.fields.hostname_modification_field
|
6
|
+
import django_audit_fields.fields.userfield
|
7
|
+
import django_audit_fields.fields.uuid_auto_field
|
8
|
+
import django_audit_fields.models.audit_model_mixin
|
9
|
+
import django_revision.revision_field
|
10
|
+
import edc_sites.managers
|
11
|
+
import simple_history.models
|
12
|
+
import uuid
|
13
|
+
from django.conf import settings
|
14
|
+
from django.db import migrations, models
|
15
|
+
|
16
|
+
|
17
|
+
class Migration(migrations.Migration):
|
18
|
+
|
19
|
+
dependencies = [
|
20
|
+
("edc_registration", "0031_alter_historicalregisteredsubject_site_and_more"),
|
21
|
+
("meta_pharmacy", "0007_lotnumber_medication"),
|
22
|
+
("sites", "0002_alter_domain_unique"),
|
23
|
+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
24
|
+
]
|
25
|
+
|
26
|
+
operations = [
|
27
|
+
migrations.RemoveField(
|
28
|
+
model_name="lotnumber",
|
29
|
+
name="medication",
|
30
|
+
),
|
31
|
+
migrations.AlterField(
|
32
|
+
model_name="historicalrx",
|
33
|
+
name="registered_subject",
|
34
|
+
field=models.ForeignKey(
|
35
|
+
blank=True,
|
36
|
+
db_constraint=False,
|
37
|
+
null=True,
|
38
|
+
on_delete=django.db.models.deletion.DO_NOTHING,
|
39
|
+
related_name="+",
|
40
|
+
to="edc_registration.registeredsubject",
|
41
|
+
verbose_name="Subject Identifier",
|
42
|
+
),
|
43
|
+
),
|
44
|
+
migrations.CreateModel(
|
45
|
+
name="HistoricalLabelData",
|
46
|
+
fields=[
|
47
|
+
(
|
48
|
+
"revision",
|
49
|
+
django_revision.revision_field.RevisionField(
|
50
|
+
blank=True,
|
51
|
+
editable=False,
|
52
|
+
help_text="System field. Git repository tag:branch:commit.",
|
53
|
+
max_length=75,
|
54
|
+
null=True,
|
55
|
+
verbose_name="Revision",
|
56
|
+
),
|
57
|
+
),
|
58
|
+
(
|
59
|
+
"created",
|
60
|
+
models.DateTimeField(
|
61
|
+
blank=True,
|
62
|
+
default=django_audit_fields.models.audit_model_mixin.utcnow,
|
63
|
+
),
|
64
|
+
),
|
65
|
+
(
|
66
|
+
"modified",
|
67
|
+
models.DateTimeField(
|
68
|
+
blank=True,
|
69
|
+
default=django_audit_fields.models.audit_model_mixin.utcnow,
|
70
|
+
),
|
71
|
+
),
|
72
|
+
(
|
73
|
+
"user_created",
|
74
|
+
django_audit_fields.fields.userfield.UserField(
|
75
|
+
blank=True,
|
76
|
+
help_text="Updated by admin.save_model",
|
77
|
+
max_length=50,
|
78
|
+
verbose_name="user created",
|
79
|
+
),
|
80
|
+
),
|
81
|
+
(
|
82
|
+
"user_modified",
|
83
|
+
django_audit_fields.fields.userfield.UserField(
|
84
|
+
blank=True,
|
85
|
+
help_text="Updated by admin.save_model",
|
86
|
+
max_length=50,
|
87
|
+
verbose_name="user modified",
|
88
|
+
),
|
89
|
+
),
|
90
|
+
(
|
91
|
+
"hostname_created",
|
92
|
+
models.CharField(
|
93
|
+
blank=True,
|
94
|
+
default=_socket.gethostname,
|
95
|
+
help_text="System field. (modified on create only)",
|
96
|
+
max_length=60,
|
97
|
+
verbose_name="Hostname created",
|
98
|
+
),
|
99
|
+
),
|
100
|
+
(
|
101
|
+
"hostname_modified",
|
102
|
+
django_audit_fields.fields.hostname_modification_field.HostnameModificationField(
|
103
|
+
blank=True,
|
104
|
+
help_text="System field. (modified on every save)",
|
105
|
+
max_length=50,
|
106
|
+
verbose_name="Hostname modified",
|
107
|
+
),
|
108
|
+
),
|
109
|
+
(
|
110
|
+
"device_created",
|
111
|
+
models.CharField(blank=True, max_length=10, verbose_name="Device created"),
|
112
|
+
),
|
113
|
+
(
|
114
|
+
"device_modified",
|
115
|
+
models.CharField(
|
116
|
+
blank=True, max_length=10, verbose_name="Device modified"
|
117
|
+
),
|
118
|
+
),
|
119
|
+
(
|
120
|
+
"locale_created",
|
121
|
+
models.CharField(
|
122
|
+
blank=True,
|
123
|
+
help_text="Auto-updated by Modeladmin",
|
124
|
+
max_length=10,
|
125
|
+
null=True,
|
126
|
+
verbose_name="Locale created",
|
127
|
+
),
|
128
|
+
),
|
129
|
+
(
|
130
|
+
"locale_modified",
|
131
|
+
models.CharField(
|
132
|
+
blank=True,
|
133
|
+
help_text="Auto-updated by Modeladmin",
|
134
|
+
max_length=10,
|
135
|
+
null=True,
|
136
|
+
verbose_name="Locale modified",
|
137
|
+
),
|
138
|
+
),
|
139
|
+
(
|
140
|
+
"id",
|
141
|
+
django_audit_fields.fields.uuid_auto_field.UUIDAutoField(
|
142
|
+
blank=True,
|
143
|
+
db_index=True,
|
144
|
+
editable=False,
|
145
|
+
help_text="System auto field. UUID primary key.",
|
146
|
+
),
|
147
|
+
),
|
148
|
+
("subject_identifier", models.CharField(max_length=15, null=True)),
|
149
|
+
("sid", models.IntegerField(help_text="Pharmacy reference", null=True)),
|
150
|
+
(
|
151
|
+
"reference",
|
152
|
+
models.CharField(
|
153
|
+
db_index=True,
|
154
|
+
help_text="Bottle reference",
|
155
|
+
max_length=10,
|
156
|
+
null=True,
|
157
|
+
),
|
158
|
+
),
|
159
|
+
("site_name", models.CharField(max_length=15, null=True)),
|
160
|
+
("gender", models.CharField(max_length=5, null=True)),
|
161
|
+
("pills_per_bottle", models.IntegerField(default=128, null=True)),
|
162
|
+
("printed_datetime", models.DateTimeField(null=True)),
|
163
|
+
("printed", models.BooleanField(default=False)),
|
164
|
+
("scanned", models.BooleanField(default=False)),
|
165
|
+
("scanned_datetime", models.DateTimeField(null=True)),
|
166
|
+
("received_datetime", models.DateTimeField(null=True)),
|
167
|
+
(
|
168
|
+
"received",
|
169
|
+
models.BooleanField(default=False, help_text="Received at site"),
|
170
|
+
),
|
171
|
+
(
|
172
|
+
"dispensed",
|
173
|
+
models.BooleanField(default=False, help_text="Dispensed to clinic"),
|
174
|
+
),
|
175
|
+
("dispensed_datetime", models.DateTimeField(null=True)),
|
176
|
+
(
|
177
|
+
"crf",
|
178
|
+
models.BooleanField(default=False, help_text="Entered into subject's CRF"),
|
179
|
+
),
|
180
|
+
("crf_datetime", models.DateTimeField(null=True)),
|
181
|
+
(
|
182
|
+
"history_id",
|
183
|
+
models.UUIDField(
|
184
|
+
default=uuid.uuid4,
|
185
|
+
editable=False,
|
186
|
+
primary_key=True,
|
187
|
+
serialize=False,
|
188
|
+
),
|
189
|
+
),
|
190
|
+
("history_date", models.DateTimeField(db_index=True)),
|
191
|
+
("history_change_reason", models.CharField(max_length=100, null=True)),
|
192
|
+
(
|
193
|
+
"history_type",
|
194
|
+
models.CharField(
|
195
|
+
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
|
196
|
+
max_length=1,
|
197
|
+
),
|
198
|
+
),
|
199
|
+
(
|
200
|
+
"history_user",
|
201
|
+
models.ForeignKey(
|
202
|
+
null=True,
|
203
|
+
on_delete=django.db.models.deletion.SET_NULL,
|
204
|
+
related_name="+",
|
205
|
+
to=settings.AUTH_USER_MODEL,
|
206
|
+
),
|
207
|
+
),
|
208
|
+
(
|
209
|
+
"site",
|
210
|
+
models.ForeignKey(
|
211
|
+
blank=True,
|
212
|
+
db_constraint=False,
|
213
|
+
null=True,
|
214
|
+
on_delete=django.db.models.deletion.DO_NOTHING,
|
215
|
+
related_name="+",
|
216
|
+
to="sites.site",
|
217
|
+
),
|
218
|
+
),
|
219
|
+
],
|
220
|
+
options={
|
221
|
+
"verbose_name": "historical Label Data",
|
222
|
+
"verbose_name_plural": "historical Label Data",
|
223
|
+
"ordering": ("-history_date", "-history_id"),
|
224
|
+
"get_latest_by": ("history_date", "history_id"),
|
225
|
+
},
|
226
|
+
bases=(simple_history.models.HistoricalChanges, models.Model),
|
227
|
+
),
|
228
|
+
migrations.CreateModel(
|
229
|
+
name="LabelData",
|
230
|
+
fields=[
|
231
|
+
(
|
232
|
+
"revision",
|
233
|
+
django_revision.revision_field.RevisionField(
|
234
|
+
blank=True,
|
235
|
+
editable=False,
|
236
|
+
help_text="System field. Git repository tag:branch:commit.",
|
237
|
+
max_length=75,
|
238
|
+
null=True,
|
239
|
+
verbose_name="Revision",
|
240
|
+
),
|
241
|
+
),
|
242
|
+
(
|
243
|
+
"created",
|
244
|
+
models.DateTimeField(
|
245
|
+
blank=True,
|
246
|
+
default=django_audit_fields.models.audit_model_mixin.utcnow,
|
247
|
+
),
|
248
|
+
),
|
249
|
+
(
|
250
|
+
"modified",
|
251
|
+
models.DateTimeField(
|
252
|
+
blank=True,
|
253
|
+
default=django_audit_fields.models.audit_model_mixin.utcnow,
|
254
|
+
),
|
255
|
+
),
|
256
|
+
(
|
257
|
+
"user_created",
|
258
|
+
django_audit_fields.fields.userfield.UserField(
|
259
|
+
blank=True,
|
260
|
+
help_text="Updated by admin.save_model",
|
261
|
+
max_length=50,
|
262
|
+
verbose_name="user created",
|
263
|
+
),
|
264
|
+
),
|
265
|
+
(
|
266
|
+
"user_modified",
|
267
|
+
django_audit_fields.fields.userfield.UserField(
|
268
|
+
blank=True,
|
269
|
+
help_text="Updated by admin.save_model",
|
270
|
+
max_length=50,
|
271
|
+
verbose_name="user modified",
|
272
|
+
),
|
273
|
+
),
|
274
|
+
(
|
275
|
+
"hostname_created",
|
276
|
+
models.CharField(
|
277
|
+
blank=True,
|
278
|
+
default=_socket.gethostname,
|
279
|
+
help_text="System field. (modified on create only)",
|
280
|
+
max_length=60,
|
281
|
+
verbose_name="Hostname created",
|
282
|
+
),
|
283
|
+
),
|
284
|
+
(
|
285
|
+
"hostname_modified",
|
286
|
+
django_audit_fields.fields.hostname_modification_field.HostnameModificationField(
|
287
|
+
blank=True,
|
288
|
+
help_text="System field. (modified on every save)",
|
289
|
+
max_length=50,
|
290
|
+
verbose_name="Hostname modified",
|
291
|
+
),
|
292
|
+
),
|
293
|
+
(
|
294
|
+
"device_created",
|
295
|
+
models.CharField(blank=True, max_length=10, verbose_name="Device created"),
|
296
|
+
),
|
297
|
+
(
|
298
|
+
"device_modified",
|
299
|
+
models.CharField(
|
300
|
+
blank=True, max_length=10, verbose_name="Device modified"
|
301
|
+
),
|
302
|
+
),
|
303
|
+
(
|
304
|
+
"locale_created",
|
305
|
+
models.CharField(
|
306
|
+
blank=True,
|
307
|
+
help_text="Auto-updated by Modeladmin",
|
308
|
+
max_length=10,
|
309
|
+
null=True,
|
310
|
+
verbose_name="Locale created",
|
311
|
+
),
|
312
|
+
),
|
313
|
+
(
|
314
|
+
"locale_modified",
|
315
|
+
models.CharField(
|
316
|
+
blank=True,
|
317
|
+
help_text="Auto-updated by Modeladmin",
|
318
|
+
max_length=10,
|
319
|
+
null=True,
|
320
|
+
verbose_name="Locale modified",
|
321
|
+
),
|
322
|
+
),
|
323
|
+
(
|
324
|
+
"id",
|
325
|
+
django_audit_fields.fields.uuid_auto_field.UUIDAutoField(
|
326
|
+
blank=True,
|
327
|
+
editable=False,
|
328
|
+
help_text="System auto field. UUID primary key.",
|
329
|
+
primary_key=True,
|
330
|
+
serialize=False,
|
331
|
+
),
|
332
|
+
),
|
333
|
+
("subject_identifier", models.CharField(max_length=15, null=True)),
|
334
|
+
("sid", models.IntegerField(help_text="Pharmacy reference", null=True)),
|
335
|
+
(
|
336
|
+
"reference",
|
337
|
+
models.CharField(
|
338
|
+
help_text="Bottle reference",
|
339
|
+
max_length=10,
|
340
|
+
null=True,
|
341
|
+
unique=True,
|
342
|
+
),
|
343
|
+
),
|
344
|
+
("site_name", models.CharField(max_length=15, null=True)),
|
345
|
+
("gender", models.CharField(max_length=5, null=True)),
|
346
|
+
("pills_per_bottle", models.IntegerField(default=128, null=True)),
|
347
|
+
("printed_datetime", models.DateTimeField(null=True)),
|
348
|
+
("printed", models.BooleanField(default=False)),
|
349
|
+
("scanned", models.BooleanField(default=False)),
|
350
|
+
("scanned_datetime", models.DateTimeField(null=True)),
|
351
|
+
("received_datetime", models.DateTimeField(null=True)),
|
352
|
+
(
|
353
|
+
"received",
|
354
|
+
models.BooleanField(default=False, help_text="Received at site"),
|
355
|
+
),
|
356
|
+
(
|
357
|
+
"dispensed",
|
358
|
+
models.BooleanField(default=False, help_text="Dispensed to clinic"),
|
359
|
+
),
|
360
|
+
("dispensed_datetime", models.DateTimeField(null=True)),
|
361
|
+
(
|
362
|
+
"crf",
|
363
|
+
models.BooleanField(default=False, help_text="Entered into subject's CRF"),
|
364
|
+
),
|
365
|
+
("crf_datetime", models.DateTimeField(null=True)),
|
366
|
+
(
|
367
|
+
"site",
|
368
|
+
models.ForeignKey(
|
369
|
+
null=True,
|
370
|
+
on_delete=django.db.models.deletion.PROTECT,
|
371
|
+
related_name="+",
|
372
|
+
to="sites.site",
|
373
|
+
),
|
374
|
+
),
|
375
|
+
],
|
376
|
+
options={
|
377
|
+
"verbose_name": "Label Data",
|
378
|
+
"verbose_name_plural": "Label Data",
|
379
|
+
},
|
380
|
+
managers=[
|
381
|
+
("on_site", edc_sites.managers.CurrentSiteManager()),
|
382
|
+
],
|
383
|
+
),
|
384
|
+
migrations.DeleteModel(
|
385
|
+
name="Label",
|
386
|
+
),
|
387
|
+
migrations.DeleteModel(
|
388
|
+
name="LotNumber",
|
389
|
+
),
|
390
|
+
]
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Generated by Django 5.1.2 on 2024-11-19 11:42
|
2
|
+
|
3
|
+
from django.db import migrations
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
|
8
|
+
dependencies = [
|
9
|
+
("meta_pharmacy", "0008_remove_lotnumber_medication_and_more"),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.RemoveField(
|
14
|
+
model_name="historicalrx",
|
15
|
+
name="slug",
|
16
|
+
),
|
17
|
+
]
|
meta_pharmacy/models/__init__.py
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
import random
|
2
|
+
|
3
|
+
import edc_model.models
|
4
|
+
from django.db import models
|
5
|
+
from edc_model.models import BaseUuidModel
|
6
|
+
from edc_sites.model_mixins import SiteModelMixin
|
7
|
+
|
8
|
+
random.seed(237548)
|
9
|
+
|
10
|
+
|
11
|
+
class LabelData(SiteModelMixin, BaseUuidModel):
|
12
|
+
|
13
|
+
subject_identifier = models.CharField(max_length=15, null=True)
|
14
|
+
sid = models.IntegerField(null=True, help_text="Pharmacy reference")
|
15
|
+
reference = models.CharField(
|
16
|
+
max_length=10, null=True, unique=True, help_text="Bottle reference"
|
17
|
+
)
|
18
|
+
site_name = models.CharField(max_length=15, null=True)
|
19
|
+
gender = models.CharField(max_length=5, null=True)
|
20
|
+
pills_per_bottle = models.IntegerField(null=True, default=128)
|
21
|
+
|
22
|
+
printed_datetime = models.DateTimeField(null=True)
|
23
|
+
printed = models.BooleanField(default=False)
|
24
|
+
scanned = models.BooleanField(default=False)
|
25
|
+
scanned_datetime = models.DateTimeField(null=True)
|
26
|
+
|
27
|
+
received_datetime = models.DateTimeField(null=True)
|
28
|
+
received = models.BooleanField(default=False, help_text="Received at site")
|
29
|
+
dispensed = models.BooleanField(default=False, help_text="Dispensed to clinic")
|
30
|
+
dispensed_datetime = models.DateTimeField(null=True)
|
31
|
+
crf = models.BooleanField(default=False, help_text="Entered into subject's CRF")
|
32
|
+
crf_datetime = models.DateTimeField(null=True)
|
33
|
+
|
34
|
+
history = edc_model.models.HistoricalRecords()
|
35
|
+
|
36
|
+
class Meta:
|
37
|
+
verbose_name = "Label Data"
|
38
|
+
verbose_name_plural = "Label Data"
|
@@ -1,8 +1,8 @@
|
|
1
1
|
from django.db import models
|
2
2
|
from edc_identifier.simple_identifier import SimpleUniqueIdentifier
|
3
3
|
from edc_model.models import BaseUuidModel
|
4
|
+
from edc_pharmacy.models import Lot
|
4
5
|
|
5
|
-
from .lot_number import LotNumber
|
6
6
|
from .rx import Rx
|
7
7
|
|
8
8
|
|
@@ -12,14 +12,13 @@ class LabelIdentifier(SimpleUniqueIdentifier):
|
|
12
12
|
template = "{random_string}"
|
13
13
|
|
14
14
|
|
15
|
-
class
|
15
|
+
class RxLabel(BaseUuidModel):
|
16
16
|
|
17
17
|
identifier_cls = LabelIdentifier
|
18
|
-
identifier_field_name: str = "rx_label_reference"
|
19
18
|
|
20
19
|
rx = models.ForeignKey(Rx, on_delete=models.PROTECT)
|
21
|
-
|
22
|
-
|
20
|
+
lot = models.ForeignKey(Lot, on_delete=models.PROTECT)
|
21
|
+
label_identifier = models.CharField(max_length=15, unique=True)
|
23
22
|
|
24
23
|
printed_datetime = models.DateTimeField(null=True)
|
25
24
|
printed = models.BooleanField(default=False)
|
@@ -27,23 +26,13 @@ class Label(BaseUuidModel):
|
|
27
26
|
scanned_datetime = models.DateTimeField(null=True)
|
28
27
|
|
29
28
|
def __str__(self):
|
30
|
-
return self.
|
29
|
+
return self.label_identifier
|
31
30
|
|
32
31
|
def save(self, *args, **kwargs):
|
33
|
-
"""Label
|
32
|
+
"""Label reference is always allocated."""
|
34
33
|
if not self.id:
|
35
|
-
|
36
|
-
|
37
|
-
self.identifier_field_name,
|
38
|
-
self.identifier_cls().identifier,
|
39
|
-
)
|
40
|
-
super().save(*args, **kwargs) # type:ignore
|
41
|
-
|
42
|
-
@property
|
43
|
-
def human_readable_identifier(self):
|
44
|
-
"""Returns a humanized screening identifier."""
|
45
|
-
x = self.screening_identifier
|
46
|
-
return f"{x[0:4]}-{x[4:]}"
|
34
|
+
self.label_identifier = self.identifier_cls().identifier
|
35
|
+
super().save(*args, **kwargs)
|
47
36
|
|
48
37
|
class Meta(BaseUuidModel.Meta):
|
49
38
|
verbose_name = "Label"
|
@@ -0,0 +1 @@
|
|
1
|
+
from .update_initial_pharmacy_data import update_initial_pharmacy_data
|