meta-edc 1.2.6__py3-none-any.whl → 1.2.7__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.

Potentially problematic release.


This version of meta-edc might be problematic. Click here for more details.

Files changed (40) hide show
  1. meta_analytics/dataframes/constants.py +3 -1
  2. meta_analytics/dataframes/get_glucose_df.py +13 -3
  3. meta_analytics/dataframes/glucose_endpoints/endpoint_by_date.py +27 -5
  4. meta_analytics/dataframes/glucose_endpoints/glucose_endpoints_by_date.py +61 -8
  5. meta_analytics/dataframes/screening/get_screening_df.py +1 -5
  6. meta_consent/migrations/0035_alter_historicalsubjectconsent_consent_definition_name_and_more.py +43 -0
  7. meta_dashboard/navbars.py +2 -6
  8. meta_dashboard/urls.py +5 -5
  9. meta_dashboard/views/screening/listboard_view.py +2 -3
  10. meta_dashboard/views/subject/dashboard/dashboard_view.py +4 -5
  11. meta_dashboard/views/subject/listboard/listboard_view.py +2 -3
  12. meta_edc/settings/debug.py +2 -2
  13. {meta_edc-1.2.6.dist-info → meta_edc-1.2.7.dist-info}/METADATA +5 -5
  14. {meta_edc-1.2.6.dist-info → meta_edc-1.2.7.dist-info}/RECORD +40 -28
  15. {meta_edc-1.2.6.dist-info → meta_edc-1.2.7.dist-info}/WHEEL +1 -1
  16. meta_prn/forms/offschedule_form.py +25 -0
  17. meta_screening/admin/subject_screening_admin.py +4 -3
  18. meta_subject/admin/__init__.py +2 -0
  19. meta_subject/admin/glucose_fbg_admin.py +12 -1
  20. meta_subject/admin/hiv_exit_review_admin.py +49 -0
  21. meta_subject/form_validators/__init__.py +4 -0
  22. meta_subject/form_validators/glucose_fbg_form_validator.py +77 -0
  23. meta_subject/form_validators/glucose_form_validator.py +10 -82
  24. meta_subject/form_validators/hiv_exit_review_form_validator.py +18 -0
  25. meta_subject/form_validators/mixins.py +95 -0
  26. meta_subject/forms/__init__.py +2 -0
  27. meta_subject/forms/glucose_fbg_form.py +1 -46
  28. meta_subject/forms/hiv_exit_review_form.py +13 -0
  29. meta_subject/migrations/0235_glucosefbg_endpoint_today_and_more.py +606 -0
  30. meta_subject/migrations/0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more.py +58 -0
  31. meta_subject/migrations/0237_historicalhivexitreview_singleton_field_and_more.py +68 -0
  32. meta_subject/migrations/0238_historicalhivexitreview_available_and_more.py +88 -0
  33. meta_subject/model_mixins/__init__.py +2 -0
  34. meta_subject/model_mixins/arv_history_model_mixin.py +3 -44
  35. meta_subject/model_mixins/arv_review_model_mixin.py +53 -0
  36. meta_subject/models/__init__.py +2 -0
  37. meta_subject/models/glucose_fbg.py +15 -1
  38. meta_subject/models/hiv_exit_review.py +44 -0
  39. meta_visit_schedule/visit_schedules/phase_three/crfs.py +14 -0
  40. {meta_edc-1.2.6.dist-info → meta_edc-1.2.7.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,68 @@
1
+ # Generated by Django 5.2.7 on 2025-10-14 00:32
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ (
10
+ "meta_subject",
11
+ "0236_alter_historicalhivexitreview_other_current_arv_regimen_and_more",
12
+ ),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AddField(
17
+ model_name="historicalhivexitreview",
18
+ name="singleton_field",
19
+ field=models.CharField(
20
+ db_index=True,
21
+ default="",
22
+ editable=False,
23
+ help_text="auto updated for unique constraint",
24
+ max_length=50,
25
+ verbose_name="subject identifier",
26
+ ),
27
+ preserve_default=False,
28
+ ),
29
+ migrations.AddField(
30
+ model_name="hivexitreview",
31
+ name="singleton_field",
32
+ field=models.CharField(
33
+ default="",
34
+ editable=False,
35
+ help_text="auto updated for unique constraint",
36
+ max_length=50,
37
+ unique=True,
38
+ verbose_name="subject identifier",
39
+ ),
40
+ preserve_default=False,
41
+ ),
42
+ migrations.AlterField(
43
+ model_name="healtheconomicsupdate",
44
+ name="singleton_field",
45
+ field=models.CharField(
46
+ default="",
47
+ editable=False,
48
+ help_text="auto updated for unique constraint",
49
+ max_length=50,
50
+ unique=True,
51
+ verbose_name="subject identifier",
52
+ ),
53
+ preserve_default=False,
54
+ ),
55
+ migrations.AlterField(
56
+ model_name="historicalhealtheconomicsupdate",
57
+ name="singleton_field",
58
+ field=models.CharField(
59
+ db_index=True,
60
+ default="",
61
+ editable=False,
62
+ help_text="auto updated for unique constraint",
63
+ max_length=50,
64
+ verbose_name="subject identifier",
65
+ ),
66
+ preserve_default=False,
67
+ ),
68
+ ]
@@ -0,0 +1,88 @@
1
+ # Generated by Django 5.2.7 on 2025-10-14 12:56
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
+ (
11
+ "meta_lists",
12
+ "0020_alter_abnormalfootappearanceobservations_extra_value_and_more",
13
+ ),
14
+ ("meta_subject", "0237_historicalhivexitreview_singleton_field_and_more"),
15
+ ]
16
+
17
+ operations = [
18
+ migrations.AddField(
19
+ model_name="historicalhivexitreview",
20
+ name="available",
21
+ field=models.CharField(
22
+ choices=[("Yes", "Yes"), ("No", "No")],
23
+ default="Yes",
24
+ max_length=25,
25
+ verbose_name="Are HIV test result and treatment information available?",
26
+ ),
27
+ ),
28
+ migrations.AddField(
29
+ model_name="historicalhivexitreview",
30
+ name="comment",
31
+ field=models.TextField(
32
+ blank=True,
33
+ default="",
34
+ help_text="May be left blank.",
35
+ verbose_name="Any other comment?",
36
+ ),
37
+ ),
38
+ migrations.AddField(
39
+ model_name="historicalhivexitreview",
40
+ name="not_available_reason",
41
+ field=models.TextField(
42
+ blank=True,
43
+ default="",
44
+ verbose_name="If not available, please explain ...",
45
+ ),
46
+ ),
47
+ migrations.AddField(
48
+ model_name="hivexitreview",
49
+ name="available",
50
+ field=models.CharField(
51
+ choices=[("Yes", "Yes"), ("No", "No")],
52
+ default="Yes",
53
+ max_length=25,
54
+ verbose_name="Are HIV test result and treatment information available?",
55
+ ),
56
+ ),
57
+ migrations.AddField(
58
+ model_name="hivexitreview",
59
+ name="comment",
60
+ field=models.TextField(
61
+ blank=True,
62
+ default="",
63
+ help_text="May be left blank.",
64
+ verbose_name="Any other comment?",
65
+ ),
66
+ ),
67
+ migrations.AddField(
68
+ model_name="hivexitreview",
69
+ name="not_available_reason",
70
+ field=models.TextField(
71
+ blank=True,
72
+ default="",
73
+ verbose_name="If not available, please explain ...",
74
+ ),
75
+ ),
76
+ migrations.AlterField(
77
+ model_name="hivexitreview",
78
+ name="current_arv_regimen",
79
+ field=models.ForeignKey(
80
+ blank=True,
81
+ null=True,
82
+ on_delete=django.db.models.deletion.PROTECT,
83
+ related_name="last_arv_regimen",
84
+ to="meta_lists.arvregimens",
85
+ verbose_name="Which antiretroviral therapy regimen is the patient currently on?",
86
+ ),
87
+ ),
88
+ ]
@@ -1,4 +1,5 @@
1
1
  from .arv_history_model_mixin import ArvHistoryModelMixin
2
+ from .arv_review_model_mixin import ArvReviewModelMixin
2
3
  from .crf_model_mixin import CrfModelMixin
3
4
  from .crf_with_action_model_mixin import CrfWithActionModelMixin
4
5
  from .search_slug_model_mixin import SearchSlugModelMixin
@@ -6,6 +7,7 @@ from .vitals_fields_model_mixin import VitalsFieldsModelMixin
6
7
 
7
8
  __all__ = [
8
9
  "ArvHistoryModelMixin",
10
+ "ArvReviewModelMixin",
9
11
  "CrfModelMixin",
10
12
  "CrfWithActionModelMixin",
11
13
  "SearchSlugModelMixin",
@@ -1,13 +1,13 @@
1
- from django.core.validators import MaxValueValidator, MinValueValidator
2
1
  from django.db import models
3
2
  from edc_constants.choices import YES_NO
4
3
  from edc_model.models import OtherCharField
5
- from edc_reportable import CELLS_PER_MILLIMETER_CUBED_DISPLAY, COPIES_PER_MILLILITER
6
4
 
7
5
  from meta_lists.models import ArvRegimens, OiProphylaxis
8
6
 
7
+ from .arv_review_model_mixin import ArvReviewModelMixin
9
8
 
10
- class ArvHistoryModelMixin(models.Model):
9
+
10
+ class ArvHistoryModelMixin(ArvReviewModelMixin, models.Model):
11
11
  hiv_diagnosis_date = models.DateField(
12
12
  verbose_name="When was the diagnosis of HIV made?", null=True, blank=True
13
13
  )
@@ -18,47 +18,6 @@ class ArvHistoryModelMixin(models.Model):
18
18
  blank=True,
19
19
  )
20
20
 
21
- viral_load = models.IntegerField(
22
- verbose_name="Last viral load",
23
- validators=[MinValueValidator(0), MaxValueValidator(999999)],
24
- null=True,
25
- blank=True,
26
- help_text=COPIES_PER_MILLILITER,
27
- )
28
-
29
- viral_load_date = models.DateField(
30
- verbose_name="Date of last viral load", null=True, blank=True
31
- )
32
-
33
- cd4 = models.IntegerField(
34
- verbose_name="Last CD4",
35
- validators=[MinValueValidator(0), MaxValueValidator(3000)],
36
- null=True,
37
- blank=True,
38
- help_text=CELLS_PER_MILLIMETER_CUBED_DISPLAY,
39
- )
40
-
41
- cd4_date = models.DateField(verbose_name="Date of last CD4", null=True, blank=True)
42
-
43
- current_arv_regimen = models.ForeignKey(
44
- ArvRegimens,
45
- on_delete=models.PROTECT,
46
- related_name="current_arv_regimen",
47
- verbose_name="Which antiretroviral therapy regimen is the patient currently on?",
48
- null=True,
49
- blank=False,
50
- )
51
-
52
- other_current_arv_regimen = OtherCharField(null=True, blank=True)
53
-
54
- current_arv_regimen_start_date = models.DateField(
55
- verbose_name=(
56
- "When did the patient start this current antiretroviral therapy regimen?"
57
- ),
58
- null=True,
59
- blank=True,
60
- )
61
-
62
21
  has_previous_arv_regimen = models.CharField(
63
22
  verbose_name="Has the patient been on any previous regimen?",
64
23
  max_length=15,
@@ -0,0 +1,53 @@
1
+ from django.core.validators import MaxValueValidator, MinValueValidator
2
+ from django.db import models
3
+ from edc_constants.constants import NULL_STRING
4
+ from edc_model.models import OtherCharField
5
+ from edc_reportable import CELLS_PER_MILLIMETER_CUBED_DISPLAY, COPIES_PER_MILLILITER
6
+
7
+ from meta_lists.models import ArvRegimens
8
+
9
+
10
+ class ArvReviewModelMixin(models.Model):
11
+ viral_load = models.IntegerField(
12
+ verbose_name="Last viral load",
13
+ validators=[MinValueValidator(0), MaxValueValidator(999999)],
14
+ null=True,
15
+ blank=True,
16
+ help_text=COPIES_PER_MILLILITER,
17
+ )
18
+
19
+ viral_load_date = models.DateField(
20
+ verbose_name="Date of last viral load", null=True, blank=True
21
+ )
22
+
23
+ cd4 = models.IntegerField(
24
+ verbose_name="Last CD4",
25
+ validators=[MinValueValidator(0), MaxValueValidator(3000)],
26
+ null=True,
27
+ blank=True,
28
+ help_text=CELLS_PER_MILLIMETER_CUBED_DISPLAY,
29
+ )
30
+
31
+ cd4_date = models.DateField(verbose_name="Date of last CD4", null=True, blank=True)
32
+
33
+ current_arv_regimen = models.ForeignKey(
34
+ ArvRegimens,
35
+ on_delete=models.PROTECT,
36
+ related_name="current_arv_regimen",
37
+ verbose_name="Which antiretroviral therapy regimen is the patient currently on?",
38
+ null=True,
39
+ blank=False,
40
+ )
41
+
42
+ other_current_arv_regimen = OtherCharField(default=NULL_STRING, blank=True)
43
+
44
+ current_arv_regimen_start_date = models.DateField(
45
+ verbose_name=(
46
+ "When did the patient start this current antiretroviral therapy regimen?"
47
+ ),
48
+ null=True,
49
+ blank=True,
50
+ )
51
+
52
+ class Meta:
53
+ abstract = True
@@ -26,6 +26,7 @@ from .health_economics import (
26
26
  HealthEconomicsUpdate,
27
27
  )
28
28
  from .hepatitis_test import HepatitisTest
29
+ from .hiv_exit_review import HivExitReview
29
30
  from .malaria_test import MalariaTest
30
31
  from .medication_adherence import MedicationAdherence
31
32
  from .mnsi import Mnsi
@@ -75,6 +76,7 @@ __all__ = [
75
76
  "HealthEconomicsSimple",
76
77
  "HealthEconomicsUpdate",
77
78
  "HepatitisTest",
79
+ "HivExitReview",
78
80
  "MalariaTest",
79
81
  "MedicationAdherence",
80
82
  "Mnsi",
@@ -1,12 +1,15 @@
1
1
  from django.db import models
2
2
  from edc_constants.choices import YES_NO
3
- from edc_constants.constants import NO
3
+ from edc_constants.constants import NO, NOT_APPLICABLE
4
4
  from edc_glucose.model_mixin_factories import (
5
5
  fasting_model_mixin_factory,
6
6
  fbg_model_mixin_factory,
7
7
  )
8
8
  from edc_model.models import BaseUuidModel
9
+ from edc_utils import formatted_date
9
10
 
11
+ from ..choices import ENDPOINT_CHOICES
12
+ from ..constants import AMENDMENT_DATE
10
13
  from ..model_mixins import CrfModelMixin
11
14
 
12
15
 
@@ -49,6 +52,17 @@ class GlucoseFbg(
49
52
  ),
50
53
  )
51
54
 
55
+ endpoint_today = models.CharField(
56
+ verbose_name="Has the participant reached a study endpoint today?",
57
+ max_length=25,
58
+ choices=ENDPOINT_CHOICES,
59
+ default=NOT_APPLICABLE,
60
+ help_text=(
61
+ f"Response is applicable if reporting after {formatted_date(AMENDMENT_DATE)} "
62
+ "and both the FBG and OGTT were performed"
63
+ ),
64
+ )
65
+
52
66
  repeat_fbg_date = models.DateField(
53
67
  null=True,
54
68
  blank=True,
@@ -0,0 +1,44 @@
1
+ from django.db import models
2
+ from edc_constants.choices import YES_NO
3
+ from edc_constants.constants import NULL_STRING, YES
4
+ from edc_crf.model_mixins import SingletonCrfModelMixin
5
+ from edc_model.models import BaseUuidModel
6
+
7
+ from meta_lists.models import ArvRegimens
8
+
9
+ from ..model_mixins import ArvReviewModelMixin, CrfModelMixin
10
+
11
+
12
+ class HivExitReview(SingletonCrfModelMixin, ArvReviewModelMixin, CrfModelMixin, BaseUuidModel):
13
+ available = models.CharField(
14
+ verbose_name="Are HIV test result and treatment information available?",
15
+ max_length=25,
16
+ default=YES,
17
+ choices=YES_NO,
18
+ )
19
+
20
+ not_available_reason = models.TextField(
21
+ verbose_name="If not available, please explain ...",
22
+ default=NULL_STRING,
23
+ blank=True,
24
+ )
25
+
26
+ current_arv_regimen = models.ForeignKey(
27
+ ArvRegimens,
28
+ on_delete=models.PROTECT,
29
+ related_name="last_arv_regimen",
30
+ verbose_name="Which antiretroviral therapy regimen is the patient currently on?",
31
+ null=True,
32
+ blank=True,
33
+ )
34
+
35
+ comment = models.TextField(
36
+ verbose_name="Any other comment?",
37
+ default=NULL_STRING,
38
+ blank=True,
39
+ help_text="May be left blank.",
40
+ )
41
+
42
+ class Meta(CrfModelMixin.Meta, BaseUuidModel.Meta):
43
+ verbose_name = "HIV Exit Review"
44
+ verbose_name_plural = "HIV Exit Review"
@@ -9,6 +9,7 @@ crfs_prn = CrfCollection(
9
9
  Crf(show_order=255, model="meta_subject.bloodresultslft"),
10
10
  Crf(show_order=265, model="meta_subject.bloodresultslipids"),
11
11
  Crf(show_order=268, model="meta_subject.bloodresultsins"),
12
+ Crf(show_order=321, model="meta_subject.hivexitreview"),
12
13
  Crf(show_order=461, model="meta_subject.eq5d3l"),
13
14
  Crf(show_order=466, model="meta_subject.sf12"),
14
15
  Crf(show_order=471, model="meta_subject.mnsi"),
@@ -141,6 +142,7 @@ crfs_12m = CrfCollection(
141
142
  Crf(show_order=250, model="meta_subject.bloodresultslipids"),
142
143
  Crf(show_order=300, model="meta_subject.studymedication"),
143
144
  Crf(show_order=310, model="meta_subject.medicationadherence"),
145
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
144
146
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
145
147
  Crf(show_order=465, model="meta_subject.sf12", required=False),
146
148
  Crf(show_order=500, model="meta_subject.healtheconomicsupdate", required=False),
@@ -155,6 +157,7 @@ crfs_15m = CrfCollection(
155
157
  Crf(show_order=200, model="meta_subject.glucosefbg"),
156
158
  Crf(show_order=300, model="meta_subject.studymedication"),
157
159
  Crf(show_order=310, model="meta_subject.medicationadherence"),
160
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
158
161
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
159
162
  Crf(show_order=465, model="meta_subject.sf12", required=False),
160
163
  Crf(show_order=500, model="meta_subject.healtheconomicsupdate", required=False),
@@ -170,6 +173,7 @@ crfs_18m = CrfCollection(
170
173
  Crf(show_order=220, model="meta_subject.bloodresultsfbc"),
171
174
  Crf(show_order=300, model="meta_subject.studymedication"),
172
175
  Crf(show_order=310, model="meta_subject.medicationadherence"),
176
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
173
177
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
174
178
  Crf(show_order=465, model="meta_subject.sf12", required=False),
175
179
  Crf(show_order=500, model="meta_subject.healtheconomicsupdate", required=False),
@@ -184,6 +188,7 @@ crfs_21m = CrfCollection(
184
188
  Crf(show_order=200, model="meta_subject.glucosefbg"),
185
189
  Crf(show_order=300, model="meta_subject.studymedication"),
186
190
  Crf(show_order=310, model="meta_subject.medicationadherence"),
191
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
187
192
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
188
193
  Crf(show_order=465, model="meta_subject.sf12", required=False),
189
194
  Crf(show_order=500, model="meta_subject.healtheconomicsupdate", required=False),
@@ -202,6 +207,7 @@ crfs_24m = CrfCollection(
202
207
  # Crf(show_order=250, model="meta_subject.bloodresultslipids"),
203
208
  Crf(show_order=300, model="meta_subject.studymedication"),
204
209
  Crf(show_order=310, model="meta_subject.medicationadherence"),
210
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
205
211
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
206
212
  Crf(show_order=465, model="meta_subject.sf12", required=False),
207
213
  Crf(show_order=470, model="meta_subject.mnsi"),
@@ -216,6 +222,7 @@ crfs_27m = CrfCollection(
216
222
  Crf(show_order=155, model="meta_subject.glucose", required=False),
217
223
  Crf(show_order=300, model="meta_subject.studymedication"),
218
224
  Crf(show_order=310, model="meta_subject.medicationadherence"),
225
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
219
226
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
220
227
  Crf(show_order=465, model="meta_subject.sf12", required=False),
221
228
  Crf(show_order=470, model="meta_subject.mnsi", required=False),
@@ -231,6 +238,7 @@ crfs_30m = CrfCollection(
231
238
  Crf(show_order=205, model="meta_subject.glucosefbg"),
232
239
  Crf(show_order=300, model="meta_subject.studymedication"),
233
240
  Crf(show_order=310, model="meta_subject.medicationadherence"),
241
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
234
242
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
235
243
  Crf(show_order=465, model="meta_subject.sf12", required=False),
236
244
  Crf(show_order=470, model="meta_subject.mnsi", required=False),
@@ -245,6 +253,7 @@ crfs_33m = CrfCollection(
245
253
  Crf(show_order=155, model="meta_subject.glucose", required=False),
246
254
  Crf(show_order=300, model="meta_subject.studymedication"),
247
255
  Crf(show_order=310, model="meta_subject.medicationadherence"),
256
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
248
257
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
249
258
  Crf(show_order=465, model="meta_subject.sf12", required=False),
250
259
  Crf(show_order=470, model="meta_subject.mnsi", required=False),
@@ -264,6 +273,7 @@ crfs_36m = CrfCollection(
264
273
  Crf(show_order=250, model="meta_subject.bloodresultslipids"),
265
274
  Crf(show_order=300, model="meta_subject.studymedication"),
266
275
  Crf(show_order=310, model="meta_subject.medicationadherence"),
276
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
267
277
  Crf(show_order=460, model="meta_subject.eq5d3l"),
268
278
  Crf(show_order=465, model="meta_subject.sf12"),
269
279
  Crf(show_order=470, model="meta_subject.mnsi"),
@@ -278,6 +288,7 @@ crfs_39m = CrfCollection(
278
288
  Crf(show_order=155, model="meta_subject.glucose", required=False),
279
289
  Crf(show_order=300, model="meta_subject.studymedication"),
280
290
  Crf(show_order=310, model="meta_subject.medicationadherence"),
291
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
281
292
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
282
293
  Crf(show_order=465, model="meta_subject.sf12", required=False),
283
294
  Crf(show_order=470, model="meta_subject.mnsi", required=False),
@@ -293,6 +304,7 @@ crfs_42m = CrfCollection(
293
304
  Crf(show_order=200, model="meta_subject.glucosefbg"),
294
305
  Crf(show_order=300, model="meta_subject.studymedication"),
295
306
  Crf(show_order=310, model="meta_subject.medicationadherence"),
307
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
296
308
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
297
309
  Crf(show_order=465, model="meta_subject.sf12", required=False),
298
310
  Crf(show_order=470, model="meta_subject.mnsi", required=False),
@@ -307,6 +319,7 @@ crfs_45m = CrfCollection(
307
319
  Crf(show_order=155, model="meta_subject.glucose", required=False),
308
320
  Crf(show_order=300, model="meta_subject.studymedication"),
309
321
  Crf(show_order=310, model="meta_subject.medicationadherence"),
322
+ Crf(show_order=320, model="meta_subject.hivexitreview", required=False),
310
323
  Crf(show_order=460, model="meta_subject.eq5d3l", required=False),
311
324
  Crf(show_order=465, model="meta_subject.sf12", required=False),
312
325
  Crf(show_order=470, model="meta_subject.mnsi", required=False),
@@ -326,6 +339,7 @@ crfs_48m = CrfCollection(
326
339
  Crf(show_order=250, model="meta_subject.bloodresultslipids"),
327
340
  Crf(show_order=300, model="meta_subject.studymedication"),
328
341
  Crf(show_order=310, model="meta_subject.medicationadherence"),
342
+ Crf(show_order=320, model="meta_subject.hivexitreview"),
329
343
  Crf(show_order=460, model="meta_subject.eq5d3l"),
330
344
  Crf(show_order=465, model="meta_subject.sf12"),
331
345
  Crf(show_order=470, model="meta_subject.mnsi"),