meta-edc 0.3.38__py3-none-any.whl → 0.3.40__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 (89) hide show
  1. meta_analytics/__init__.py +0 -2
  2. meta_analytics/dataframes/__init__.py +1 -0
  3. meta_analytics/dataframes/get_last_imp_visits_df.py +101 -0
  4. meta_auth/auth_objects.py +1 -0
  5. meta_consent/consents.py +6 -0
  6. meta_consent/locale/lg/LC_MESSAGES/django.po +69 -0
  7. meta_consent/locale/sw/LC_MESSAGES/django.po +12 -12
  8. meta_dashboard/locale/lg/LC_MESSAGES/django.po +30 -0
  9. meta_dashboard/locale/sw/LC_MESSAGES/django.po +11 -2
  10. meta_dashboard/navbars.py +2 -0
  11. meta_dashboard/templatetags/meta_dashboard_extras.py +1 -1
  12. meta_dashboard/tests/urls.py +0 -1
  13. meta_dashboard/view_utils/__init__.py +6 -0
  14. meta_dashboard/view_utils/subject_screening_button.py +2 -2
  15. meta_edc/__init__.py +3 -10
  16. meta_edc/{celery/debug.py → celery.py} +2 -2
  17. meta_edc/navbars.py +2 -0
  18. meta_edc/settings/debug.py +8 -0
  19. meta_edc/settings/defaults.py +29 -16
  20. meta_edc/templates/meta_edc/bootstrap3/home.html +2 -2
  21. meta_edc/tests/tests/test_endpoints.py +1 -0
  22. meta_edc/urls.py +1 -0
  23. {meta_edc-0.3.38.dist-info → meta_edc-0.3.40.dist-info}/METADATA +6 -6
  24. {meta_edc-0.3.38.dist-info → meta_edc-0.3.40.dist-info}/RECORD +74 -64
  25. {meta_edc-0.3.38.dist-info → meta_edc-0.3.40.dist-info}/WHEEL +1 -1
  26. meta_pharmacy/admin/__init__.py +0 -1
  27. meta_pharmacy/admin_site.py +5 -1
  28. meta_pharmacy/apps.py +2 -0
  29. meta_pharmacy/forms/__init__.py +2 -0
  30. meta_pharmacy/forms/rx_form.py +16 -0
  31. meta_pharmacy/{forms.py → forms/substitutions_form.py} +1 -14
  32. meta_pharmacy/label_configs.py +30 -0
  33. meta_pharmacy/labels/__init__.py +5 -2
  34. meta_pharmacy/labels/draw_label_for_subject_with_barcode.py +58 -0
  35. meta_pharmacy/labels/draw_label_for_subject_with_code128.py +14 -0
  36. meta_pharmacy/labels/draw_label_with_test_data.py +26 -0
  37. meta_pharmacy/labels/label_data.py +14 -0
  38. meta_pharmacy/labels/print_sheets.py +22 -11
  39. meta_pharmacy/list_data.py +8 -0
  40. meta_pharmacy/management/commands/__init__.py +0 -0
  41. meta_pharmacy/management/commands/update_initial_pharmacy_data.py +10 -0
  42. meta_pharmacy/migrations/0002_initial.py +7 -5
  43. meta_pharmacy/migrations/0008_remove_lotnumber_medication_and_more.py +390 -0
  44. meta_pharmacy/migrations/0009_remove_historicalrx_slug.py +17 -0
  45. meta_pharmacy/models/__init__.py +1 -2
  46. meta_pharmacy/models/label_data.py +38 -0
  47. meta_pharmacy/models/{label.py → rx_label.py} +8 -19
  48. meta_pharmacy/utils/__init__.py +1 -0
  49. meta_pharmacy/utils/update_initial_pharmacy_data.py +146 -0
  50. meta_prn/admin/pregnancy_notification_admin.py +6 -2
  51. meta_reports/admin/__init__.py +1 -0
  52. meta_reports/admin/dbviews/glucose_summary_admin.py +1 -1
  53. meta_reports/admin/last_imp_refill_admin.py +181 -0
  54. meta_reports/migrations/0052_lastimpvisit.py +57 -0
  55. meta_reports/migrations/0053_rename_lastimpvisit_lastimprefill_and_more.py +31 -0
  56. meta_reports/models/__init__.py +1 -0
  57. meta_reports/models/last_imp_refill.py +34 -0
  58. meta_subject/admin/study_medication_admin.py +10 -0
  59. meta_subject/forms/study_medication_form.py +35 -0
  60. meta_subject/locale/lg/LC_MESSAGES/django.po +470 -0
  61. meta_subject/locale/sw/LC_MESSAGES/django.po +191 -89
  62. meta_subject/metadata_rules/predicates.py +34 -7
  63. meta_subject/migrations/0214_historicalstudymedication_stock_codes_and_more.py +44 -0
  64. meta_subject/migrations/0215_alter_historicalstudymedication_stock_codes_and_more.py +46 -0
  65. meta_subject/tests/tests/test_metadata_rules.py +2 -2
  66. meta_subject/tests/tests/test_mnsi.py +180 -113
  67. meta_subject/tests/tests/test_sf12.py +0 -12
  68. meta_visit_schedule/visit_schedules/phase_three/crfs.py +18 -6
  69. tests/test_settings.py +4 -1
  70. meta_edc/celery/__init__.py +0 -2
  71. meta_edc/celery/live.py +0 -17
  72. meta_edc/celery/uat.py +0 -17
  73. meta_pharmacy/admin/lot_number_admin.py +0 -43
  74. meta_pharmacy/labels/get_label_data.py +0 -30
  75. meta_pharmacy/models/lot_number.py +0 -25
  76. meta_reports/models/unmanaged/README +0 -14
  77. meta_reports/models/unmanaged/patient_history_missing_baseline_cd4.py +0 -26
  78. meta_reports/models/unmanaged/patient_history_missing_baseline_cd4.sql +0 -10
  79. meta_reports/models/unmanaged/unattended_three_in_row.py +0 -24
  80. meta_reports/models/unmanaged/unattended_three_in_row.sql +0 -19
  81. meta_reports/models/unmanaged/unattended_three_in_row2.py +0 -24
  82. meta_reports/models/unmanaged/unattended_three_in_row2.sql +0 -39
  83. meta_reports/models/unmanaged/unattended_two_in_row.py +0 -22
  84. meta_reports/models/unmanaged/unattended_two_in_row.sql +0 -19
  85. {meta_reports/models/unmanaged → meta_edc/migrations}/__init__.py +0 -0
  86. {meta_edc-0.3.38.dist-info → meta_edc-0.3.40.dist-info}/AUTHORS +0 -0
  87. {meta_edc-0.3.38.dist-info → meta_edc-0.3.40.dist-info}/LICENSE +0 -0
  88. {meta_edc-0.3.38.dist-info → meta_edc-0.3.40.dist-info}/top_level.txt +0 -0
  89. /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 meta_pharmacy.models import Label
10
+ from ..models import LabelData
11
11
 
12
12
 
13
- class LabelData:
13
+ class Label:
14
+ """
15
+ this should be based on a generated dataset using the stock transfer
16
+ request data.
14
17
 
15
- def __init__(self, label: Label):
16
- self.label = label
17
- self.gender = label.rx.registered_subject.gender
18
- self.site_id = label.rx.site_id
19
- self.subject_identifier = label.rx.subject_identifier
20
- self.reference = label.rx_label_reference
21
- self.sid = label.rx.rando_sid
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: Label):
26
- data = LabelData(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
  )
@@ -0,0 +1,8 @@
1
+ from edc_sites.site import sites as site_sites
2
+
3
+ list_data = {
4
+ "edc_pharmacy.location": [
5
+ ("central", "Central"),
6
+ *[(ss.name, ss.description) for ss in site_sites.all(aslist=True)],
7
+ ],
8
+ }
File without changes
@@ -0,0 +1,10 @@
1
+ from django.core.management import BaseCommand
2
+
3
+ from meta_pharmacy.utils import update_initial_pharmacy_data
4
+
5
+
6
+ class Command(BaseCommand):
7
+
8
+ def handle(self, *args, **options):
9
+ update_initial_pharmacy_data()
10
+ print("Done")
@@ -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="edc_pharmacy.subject",
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
+ ]
@@ -1,4 +1,3 @@
1
- from .label import Label
2
- from .lot_number import LotNumber
1
+ from .label_data import LabelData
3
2
  from .rx import Rx
4
3
  from .substitutions import MyManager, Substitutions
@@ -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 Label(BaseUuidModel):
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
- lot_no = models.ForeignKey(LotNumber, on_delete=models.PROTECT)
22
- rx_label_reference = models.CharField(max_length=15, unique=True)
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.rx_label_reference
29
+ return self.label_identifier
31
30
 
32
31
  def save(self, *args, **kwargs):
33
- """Label referenceis always allocated."""
32
+ """Label reference is always allocated."""
34
33
  if not self.id:
35
- setattr(
36
- self,
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