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
@@ -8,7 +8,7 @@ msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: PACKAGE VERSION\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2023-09-07 09:34-0500\n"
11
+ "POT-Creation-Date: 2024-11-19 23:35+0300\n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,352 +18,454 @@ msgstr ""
18
18
  "Content-Transfer-Encoding: 8bit\n"
19
19
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
20
20
 
21
- #: choices.py:38 choices.py:47
21
+ #: meta_subject/admin/health_economics/health_economics_update_admin.py:18
22
+ msgid ""
23
+ "We want to learn about the household and we use these\n"
24
+ " questions to get an understanding of wealth and opportunities\n"
25
+ " in the community. A person or persons (people/ members) who share\n"
26
+ " the same kitchen (pot), live together, and run the household\n"
27
+ " expenditure from the same income is known as a 'household'. "
28
+ "Household\n"
29
+ " members should be identified on the basis that they shared a place "
30
+ "of\n"
31
+ " living together most of time for the past one year. When it is\n"
32
+ " difficult to demarcate 'most of the time', living together for the\n"
33
+ " past six months or more should be used to find out whether or not\n"
34
+ " the person is a household member. For polygamous households, the\n"
35
+ " household head should think about all the households and respond\n"
36
+ " with respect to all households."
37
+ msgstr ""
38
+
39
+ #: meta_subject/admin/health_economics/health_economics_update_admin.py:58
40
+ msgid ""
41
+ "Before asking about household income, we would first liketo know about the "
42
+ "number of rooms in the home and number of beds. "
43
+ msgstr ""
44
+
45
+ #: meta_subject/admin/health_economics/health_economics_update_admin.py:72
46
+ msgid ""
47
+ "Now, I will ask about income for the household from paid workor other "
48
+ "sources. Please think of the total income for the household, including "
49
+ "income from all household members as defined above. I know it may be "
50
+ "difficult to estimate, but please do try to give amounts as accurately as "
51
+ "possible. Please note that all information will be kept strictly "
52
+ "confidential. This information is important to assess overall health and "
53
+ "well-being of people in your household, compared to other similar households."
54
+ msgstr ""
55
+
56
+ #: meta_subject/choices.py:39 meta_subject/choices.py:48
22
57
  msgid "Working"
23
58
  msgstr ""
24
59
 
25
- #: choices.py:39 choices.py:48
60
+ #: meta_subject/choices.py:40 meta_subject/choices.py:49
26
61
  msgid "Studying"
27
62
  msgstr ""
28
63
 
29
- #: choices.py:40 choices.py:49
64
+ #: meta_subject/choices.py:41 meta_subject/choices.py:50
30
65
  msgid "Caring for children"
31
66
  msgstr ""
32
67
 
33
- #: choices.py:41
68
+ #: meta_subject/choices.py:42
34
69
  msgid "Other, please specify"
35
70
  msgstr ""
36
71
 
37
- #: choices.py:46 choices.py:58 choices.py:65 choices.py:80 choices.py:110
38
- #: choices.py:132 choices.py:159 choices.py:167 choices.py:212
72
+ #: meta_subject/choices.py:47 meta_subject/choices.py:59
73
+ #: meta_subject/choices.py:66 meta_subject/choices.py:81
74
+ #: meta_subject/choices.py:88 meta_subject/choices.py:118
75
+ #: meta_subject/choices.py:140 meta_subject/choices.py:167
76
+ #: meta_subject/choices.py:175 meta_subject/choices.py:220
39
77
  msgid "Not applicable"
40
78
  msgstr ""
41
79
 
42
- #: choices.py:50
80
+ #: meta_subject/choices.py:51
43
81
  msgid "House maintenance"
44
82
  msgstr ""
45
83
 
46
- #: choices.py:51
84
+ #: meta_subject/choices.py:52
47
85
  msgid "Nothing"
48
86
  msgstr ""
49
87
 
50
- #: choices.py:52 choices.py:202
88
+ #: meta_subject/choices.py:53 meta_subject/choices.py:210
51
89
  msgid "Other, specify"
52
90
  msgstr ""
53
91
 
54
- #: choices.py:56
92
+ #: meta_subject/choices.py:57
55
93
  msgid "Study participant"
56
94
  msgstr ""
57
95
 
58
- #: choices.py:57 choices.py:125 choices.py:211
96
+ #: meta_subject/choices.py:58 meta_subject/choices.py:133
97
+ #: meta_subject/choices.py:219
59
98
  msgid "Other"
60
99
  msgstr ""
61
100
 
62
- #: choices.py:62
101
+ #: meta_subject/choices.py:63
63
102
  msgid "At home"
64
103
  msgstr ""
65
104
 
66
- #: choices.py:63
105
+ #: meta_subject/choices.py:64
67
106
  msgid "Hospital / Clinic"
68
107
  msgstr ""
69
108
 
70
- #: choices.py:64
109
+ #: meta_subject/choices.py:65
71
110
  msgid "Other location, specify"
72
111
  msgstr ""
73
112
 
74
- #: choices.py:69
113
+ #: meta_subject/choices.py:70
75
114
  msgid "Excellent"
76
115
  msgstr ""
77
116
 
78
- #: choices.py:70
117
+ #: meta_subject/choices.py:71
79
118
  msgid "Very good"
80
119
  msgstr ""
81
120
 
82
- #: choices.py:71
121
+ #: meta_subject/choices.py:72
83
122
  msgid "Good"
84
123
  msgstr ""
85
124
 
86
- #: choices.py:72
125
+ #: meta_subject/choices.py:73
87
126
  msgid "Fair"
88
127
  msgstr ""
89
128
 
90
- #: choices.py:73
129
+ #: meta_subject/choices.py:74
91
130
  msgid "Poor"
92
131
  msgstr ""
93
132
 
94
- #: choices.py:79
133
+ #: meta_subject/choices.py:80
95
134
  msgid "Other, specify below ..."
96
135
  msgstr ""
97
136
 
98
- #: choices.py:84 choices.py:138
137
+ #: meta_subject/choices.py:86
138
+ msgid "No. A repeat FBG will be scheduled"
139
+ msgstr ""
140
+
141
+ #: meta_subject/choices.py:92 meta_subject/choices.py:146
99
142
  msgid "All of the time"
100
143
  msgstr ""
101
144
 
102
- #: choices.py:85 choices.py:139
145
+ #: meta_subject/choices.py:93 meta_subject/choices.py:147
103
146
  msgid "Most of the time"
104
147
  msgstr ""
105
148
 
106
- #: choices.py:86
149
+ #: meta_subject/choices.py:94
107
150
  msgid "A good bit of the time"
108
151
  msgstr ""
109
152
 
110
- #: choices.py:87 choices.py:140
153
+ #: meta_subject/choices.py:95 meta_subject/choices.py:148
111
154
  msgid "Some of the time"
112
155
  msgstr ""
113
156
 
114
- #: choices.py:88 choices.py:141
157
+ #: meta_subject/choices.py:96 meta_subject/choices.py:149
115
158
  msgid "A little of the time"
116
159
  msgstr ""
117
160
 
118
- #: choices.py:89 choices.py:142
161
+ #: meta_subject/choices.py:97 meta_subject/choices.py:150
119
162
  msgid "None of the time"
120
163
  msgstr ""
121
164
 
122
- #: choices.py:94
165
+ #: meta_subject/choices.py:102
123
166
  msgid "Live birth at term"
124
167
  msgstr ""
125
168
 
126
- #: choices.py:95
169
+ #: meta_subject/choices.py:103
127
170
  msgid "Live birth preterm"
128
171
  msgstr ""
129
172
 
130
- #: choices.py:96
173
+ #: meta_subject/choices.py:104
131
174
  msgid "Stillbirth"
132
175
  msgstr ""
133
176
 
134
- #: choices.py:97
177
+ #: meta_subject/choices.py:105
135
178
  msgid "Miscarriage"
136
179
  msgstr ""
137
180
 
138
- #: choices.py:101
181
+ #: meta_subject/choices.py:109
139
182
  msgid "Study appointment"
140
183
  msgstr ""
141
184
 
142
- #: choices.py:102
185
+ #: meta_subject/choices.py:110
143
186
  msgid "Other routine appointment"
144
187
  msgstr ""
145
188
 
146
- #: choices.py:103
189
+ #: meta_subject/choices.py:111
147
190
  msgid "Unschedule visit"
148
191
  msgstr ""
149
192
 
150
- #: choices.py:104
193
+ #: meta_subject/choices.py:112
151
194
  msgid "Other reason, specify below ..."
152
195
  msgstr ""
153
196
 
154
- #: choices.py:108 choices.py:109
197
+ #: meta_subject/choices.py:116 meta_subject/choices.py:117
155
198
  #, python-format
156
199
  msgid "Grade %(num)s"
157
200
  msgstr ""
158
201
 
159
- #: choices.py:114
202
+ #: meta_subject/choices.py:122
160
203
  msgid "YES, limited a lot"
161
204
  msgstr ""
162
205
 
163
- #: choices.py:115
206
+ #: meta_subject/choices.py:123
164
207
  msgid "YES, limited a little"
165
208
  msgstr ""
166
209
 
167
- #: choices.py:116
210
+ #: meta_subject/choices.py:124
168
211
  msgid "NO, not at all limited"
169
212
  msgstr ""
170
213
 
171
- #: choices.py:120
214
+ #: meta_subject/choices.py:128
172
215
  msgid "Hospital notes"
173
216
  msgstr ""
174
217
 
175
- #: choices.py:121
218
+ #: meta_subject/choices.py:129
176
219
  msgid "Outpatient cards"
177
220
  msgstr ""
178
221
 
179
- #: choices.py:122
222
+ #: meta_subject/choices.py:130
180
223
  msgid "Patient"
181
224
  msgstr ""
182
225
 
183
- #: choices.py:123
226
+ #: meta_subject/choices.py:131
184
227
  msgid "Collateral History from relative/guardian"
185
228
  msgstr ""
186
229
 
187
- #: choices.py:124
230
+ #: meta_subject/choices.py:132
188
231
  msgid "Not applicable (if missed)"
189
232
  msgstr ""
190
233
 
191
- #: choices.py:131
234
+ #: meta_subject/choices.py:139
192
235
  msgid "Hospital / Clinic records"
193
236
  msgstr ""
194
237
 
195
- #: choices.py:146
238
+ #: meta_subject/choices.py:154
196
239
  msgid "No retinopathy"
197
240
  msgstr ""
198
241
 
199
- #: choices.py:147
242
+ #: meta_subject/choices.py:155
200
243
  msgid "Background retinopathy"
201
244
  msgstr ""
202
245
 
203
- #: choices.py:148
246
+ #: meta_subject/choices.py:156
204
247
  msgid "Pre-proliferative retinopathy"
205
248
  msgstr ""
206
249
 
207
- #: choices.py:149
250
+ #: meta_subject/choices.py:157
208
251
  msgid "Proliferative retinopathy"
209
252
  msgstr ""
210
253
 
211
- #: choices.py:150
254
+ #: meta_subject/choices.py:158
212
255
  msgid "Maculopathy"
213
256
  msgstr ""
214
257
 
215
- #: choices.py:151 choices.py:173 choices.py:180 choices.py:234
258
+ #: meta_subject/choices.py:159 meta_subject/choices.py:181
259
+ #: meta_subject/choices.py:188 meta_subject/choices.py:242
216
260
  msgid "Exam not performed"
217
261
  msgstr ""
218
262
 
219
- #: choices.py:155
263
+ #: meta_subject/choices.py:163
220
264
  msgid "No complications"
221
265
  msgstr ""
222
266
 
223
- #: choices.py:156
267
+ #: meta_subject/choices.py:164
224
268
  msgid "Complications with full recovery"
225
269
  msgstr ""
226
270
 
227
- #: choices.py:157
271
+ #: meta_subject/choices.py:165
228
272
  msgid "Complications with ongoing recovery"
229
273
  msgstr ""
230
274
 
231
- #: choices.py:158
275
+ #: meta_subject/choices.py:166
232
276
  msgid "Maternal mortality"
233
277
  msgstr ""
234
278
 
235
- #: choices.py:163
279
+ #: meta_subject/choices.py:171
236
280
  msgid "Own cash"
237
281
  msgstr ""
238
282
 
239
- #: choices.py:164
283
+ #: meta_subject/choices.py:172
240
284
  msgid "Insurance"
241
285
  msgstr ""
242
286
 
243
- #: choices.py:165
287
+ #: meta_subject/choices.py:173
244
288
  msgid "Relative of others paying"
245
289
  msgstr ""
246
290
 
247
- #: choices.py:166
291
+ #: meta_subject/choices.py:174
248
292
  msgid "Free drugs from the pharmacy"
249
293
  msgstr ""
250
294
 
251
- #: choices.py:171 choices.py:177
295
+ #: meta_subject/choices.py:179 meta_subject/choices.py:185
252
296
  msgid "Present"
253
297
  msgstr ""
254
298
 
255
- #: choices.py:172 choices.py:179
299
+ #: meta_subject/choices.py:180 meta_subject/choices.py:187
256
300
  msgid "Absent"
257
301
  msgstr ""
258
302
 
259
- #: choices.py:178
303
+ #: meta_subject/choices.py:186
260
304
  msgid "Present with reinforcement"
261
305
  msgstr ""
262
306
 
263
- #: choices.py:185
307
+ #: meta_subject/choices.py:193
264
308
  msgid "New"
265
309
  msgstr ""
266
310
 
267
- #: choices.py:186
311
+ #: meta_subject/choices.py:194
268
312
  msgid "Open. Some information is still pending."
269
313
  msgstr ""
270
314
 
271
- #: choices.py:187
315
+ #: meta_subject/choices.py:195
272
316
  msgid "Closed. This report is complete"
273
317
  msgstr ""
274
318
 
275
- #: choices.py:192
319
+ #: meta_subject/choices.py:200
276
320
  msgid "Bus"
277
321
  msgstr ""
278
322
 
279
- #: choices.py:193
323
+ #: meta_subject/choices.py:201
280
324
  msgid "Train"
281
325
  msgstr ""
282
326
 
283
- #: choices.py:194
327
+ #: meta_subject/choices.py:202
284
328
  msgid "Ambulance"
285
329
  msgstr ""
286
330
 
287
- #: choices.py:195
331
+ #: meta_subject/choices.py:203
288
332
  msgid "Private taxi"
289
333
  msgstr ""
290
334
 
291
- #: choices.py:196
335
+ #: meta_subject/choices.py:204
292
336
  msgid "Own bicycle"
293
337
  msgstr ""
294
338
 
295
- #: choices.py:197
339
+ #: meta_subject/choices.py:205
296
340
  msgid "Hired motorbike"
297
341
  msgstr ""
298
342
 
299
- #: choices.py:198
343
+ #: meta_subject/choices.py:206
300
344
  msgid "Own car"
301
345
  msgstr ""
302
346
 
303
- #: choices.py:199
347
+ #: meta_subject/choices.py:207
304
348
  msgid "Own motorbike"
305
349
  msgstr ""
306
350
 
307
- #: choices.py:200
351
+ #: meta_subject/choices.py:208
308
352
  msgid "Hired bicycle"
309
353
  msgstr ""
310
354
 
311
- #: choices.py:201
355
+ #: meta_subject/choices.py:209
312
356
  msgid "Foot"
313
357
  msgstr ""
314
358
 
315
- #: choices.py:207
359
+ #: meta_subject/choices.py:215
316
360
  msgid "Patient unwell (outpatient)"
317
361
  msgstr ""
318
362
 
319
- #: choices.py:208
363
+ #: meta_subject/choices.py:216
320
364
  msgid "Patient hospitalised"
321
365
  msgstr ""
322
366
 
323
- #: choices.py:209
367
+ #: meta_subject/choices.py:217
324
368
  msgid "Routine appointment (non-study)"
325
369
  msgstr ""
326
370
 
327
- #: choices.py:210
371
+ #: meta_subject/choices.py:218
328
372
  msgid "Recurrence of symptoms"
329
373
  msgstr ""
330
374
 
331
- #: choices.py:216
375
+ #: meta_subject/choices.py:224
332
376
  msgid "Scheduled visit"
333
377
  msgstr ""
334
378
 
335
- #: choices.py:217
379
+ #: meta_subject/choices.py:225
336
380
  msgid "Unscheduled visit"
337
381
  msgstr ""
338
382
 
339
- #: choices.py:218
383
+ #: meta_subject/choices.py:226
340
384
  msgid "Missed visit"
341
385
  msgstr ""
342
386
 
343
- #: choices.py:221
387
+ #: meta_subject/choices.py:229
344
388
  msgid "Estimated"
345
389
  msgstr ""
346
390
 
347
- #: choices.py:221
391
+ #: meta_subject/choices.py:229
348
392
  msgid "Measured"
349
393
  msgstr ""
350
394
 
351
- #: choices.py:224
395
+ #: meta_subject/choices.py:232
352
396
  msgid "Not at all"
353
397
  msgstr ""
354
398
 
355
- #: choices.py:225
399
+ #: meta_subject/choices.py:233
356
400
  msgid "A little bit"
357
401
  msgstr ""
358
402
 
359
- #: choices.py:226
403
+ #: meta_subject/choices.py:234
360
404
  msgid "Moderately"
361
405
  msgstr ""
362
406
 
363
- #: choices.py:227
407
+ #: meta_subject/choices.py:235
364
408
  msgid "Quite a bit"
365
409
  msgstr ""
366
410
 
367
- #: choices.py:228
411
+ #: meta_subject/choices.py:236
368
412
  msgid "Extremely"
369
413
  msgstr ""
414
+
415
+ #: meta_subject/models/health_economics/health_economics_update.py:20
416
+ msgid ""
417
+ "Thinking over the last 12 months, can you tell me what the average earnings "
418
+ "of the household have been?"
419
+ msgstr ""
420
+
421
+ #: meta_subject/models/health_economics/health_economics_update.py:36
422
+ msgid "Are you the household head?"
423
+ msgstr ""
424
+
425
+ #: meta_subject/models/health_economics/health_economics_update.py:40
426
+ msgid ""
427
+ "By head of the household we mean the main decision maker in the household. "
428
+ "The head can be either male or female. If two people are equal decision-"
429
+ "makers, take the older person."
430
+ msgstr ""
431
+
432
+ #: meta_subject/models/health_economics/health_economics_update.py:48
433
+ msgid "If No, what is your relationship to the household head?"
434
+ msgstr ""
435
+
436
+ #: meta_subject/models/health_economics/health_economics_update.py:52
437
+ msgid "Not applicable if patient is head of household"
438
+ msgstr ""
439
+
440
+ #: meta_subject/models/health_economics/health_economics_update.py:56
441
+ msgid "If OTHER relationship, specify ..."
442
+ msgstr ""
443
+
444
+ #: meta_subject/models/health_economics/health_economics_update.py:61
445
+ msgid ""
446
+ "How many rooms does your dwelling have in total, without counting the "
447
+ "bathrooms/ toilets or hallways/passageways?"
448
+ msgstr ""
449
+
450
+ #: meta_subject/models/health_economics/health_economics_update.py:68
451
+ msgid "How many rooms are used for sleeping in your dwelling?"
452
+ msgstr ""
453
+
454
+ #: meta_subject/models/health_economics/health_economics_update.py:73
455
+ msgid "How many beds does your dwelling have in total?"
456
+ msgstr ""
457
+
458
+ #: meta_subject/models/health_economics/health_economics_update.py:79
459
+ msgid ""
460
+ "Outside of this household, how many other people depend on this household's "
461
+ "income?"
462
+ msgstr ""
463
+
464
+ #: meta_subject/models/health_economics/health_economics_update.py:84
465
+ msgid ""
466
+ "Insert '0' if no dependents other than the members in the household roster"
467
+ msgstr ""
468
+
469
+ #: meta_subject/models/health_economics/health_economics_update.py:89
470
+ msgid "Would you say your household's financial situation is?"
471
+ msgstr ""
@@ -22,7 +22,7 @@ from edc_visit_schedule.constants import (
22
22
  )
23
23
  from edc_visit_schedule.utils import is_baseline
24
24
 
25
- from meta_visit_schedule.constants import MONTH42
25
+ from meta_visit_schedule.constants import MONTH39, MONTH42, MONTH45
26
26
 
27
27
 
28
28
  def hba1c_crf_required_at_baseline(visit):
@@ -206,14 +206,27 @@ class Predicates(PersistantSingletonMixin):
206
206
  return required
207
207
 
208
208
  def mnsi_required(self, visit, **kwargs) -> bool:
209
- """Returns True if MNSI assessment was not performed at the
210
- 1M, 3M or 6M visits.
209
+ """Returns True if:
210
+ - MNSI assessment not performed in the 1, 3 or 6M visits
211
+ - MNSI assessment not performed in the 36, 39, 42, 45M visits
212
+ - MNSI assessment not performed in the 48M visit
211
213
  """
214
+ model_cls = django_apps.get_model(f"{self.app_label}.mnsi")
212
215
  required = True
213
- if (
214
- visit.appointment.visit_code in [MONTH1, MONTH3, MONTH6]
215
- ) and visit.appointment.visit_code_sequence == 0:
216
- model_cls = django_apps.get_model(f"{self.app_label}.mnsi")
216
+ if visit.visit_code_sequence != 0:
217
+ required = False
218
+ elif visit.visit_code not in [
219
+ MONTH1,
220
+ MONTH3,
221
+ MONTH6,
222
+ MONTH36,
223
+ MONTH39,
224
+ MONTH42,
225
+ MONTH45,
226
+ MONTH48,
227
+ ]:
228
+ required = False
229
+ elif visit.visit_code in [MONTH1, MONTH3, MONTH6]:
217
230
  objs = model_cls.objects.filter(
218
231
  subject_visit__subject_identifier=visit.subject_identifier,
219
232
  subject_visit__visit_code__in=[MONTH1, MONTH3, MONTH6],
@@ -223,16 +236,30 @@ class Predicates(PersistantSingletonMixin):
223
236
  if obj.mnsi_performed == YES:
224
237
  required = False
225
238
  break
239
+ elif visit.visit_code in [MONTH36, MONTH39, MONTH42, MONTH45]:
240
+ objs = model_cls.objects.filter(
241
+ subject_visit__subject_identifier=visit.subject_identifier,
242
+ subject_visit__visit_code__in=[MONTH36, MONTH39, MONTH42, MONTH45],
243
+ subject_visit__visit_code_sequence=0,
244
+ )
245
+ for obj in objs:
246
+ if obj.mnsi_performed == YES:
247
+ required = False
248
+ break
226
249
  return required
227
250
 
228
251
  def sf12_required(self, visit, **kwargs):
229
252
  model = f"{self.app_label}.sf12"
253
+ if visit.visit_code_sequence == 0 and visit.visit_code in [MONTH36, MONTH48]:
254
+ return True
230
255
  return self.persistant_singleton_required(
231
256
  visit, model=model, exclude_visit_codes=[DAY1]
232
257
  )
233
258
 
234
259
  def eq5d3l_required(self, visit, **kwargs):
235
260
  model = f"{self.app_label}.eq5d3l"
261
+ if visit.visit_code_sequence == 0 and visit.visit_code in [MONTH36, MONTH48]:
262
+ return True
236
263
  return self.persistant_singleton_required(
237
264
  visit, model=model, exclude_visit_codes=[DAY1]
238
265
  )
@@ -0,0 +1,44 @@
1
+ # Generated by Django 5.1.2 on 2024-11-18 02:18
2
+
3
+ import django.core.validators
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("meta_subject", "0213_rename_bloodresultslipid_bloodresultslipids_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="historicalstudymedication",
16
+ name="stock_codes",
17
+ field=models.CharField(
18
+ blank=True,
19
+ help_text="Enter the medication bottle barcode or bacodes seperated by comma, no spaces",
20
+ max_length=30,
21
+ null=True,
22
+ validators=[
23
+ django.core.validators.RegexValidator(
24
+ regex="^([a-zA-Z0-9]{6})(,[a-zA-Z0-9]{6})*$"
25
+ )
26
+ ],
27
+ ),
28
+ ),
29
+ migrations.AddField(
30
+ model_name="studymedication",
31
+ name="stock_codes",
32
+ field=models.CharField(
33
+ blank=True,
34
+ help_text="Enter the medication bottle barcode or bacodes seperated by comma, no spaces",
35
+ max_length=30,
36
+ null=True,
37
+ validators=[
38
+ django.core.validators.RegexValidator(
39
+ regex="^([a-zA-Z0-9]{6})(,[a-zA-Z0-9]{6})*$"
40
+ )
41
+ ],
42
+ ),
43
+ ),
44
+ ]