Skip to content

Commit 5062640

Browse files
committedAug 1, 2023
remove consent_version from object create
1 parent a15c6ab commit 5062640

File tree

6 files changed

+129
-60
lines changed

6 files changed

+129
-60
lines changed
 

‎edc_egfr/egfr.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from datetime import date, datetime
44
from decimal import Decimal
5-
from typing import Any, Optional
5+
from typing import TYPE_CHECKING, Any, Optional
66
from zoneinfo import ZoneInfo
77

88
from dateutil.relativedelta import relativedelta
@@ -16,6 +16,9 @@
1616
from .calculators import EgfrCkdEpi, EgfrCockcroftGault, egfr_percent_change
1717
from .get_drop_notification_model import get_egfr_drop_notification_model_cls
1818

19+
if TYPE_CHECKING:
20+
from edc_visit_tracking.typing_stubs import RelatedVisitProtocol
21+
1922

2023
class EgfrError(Exception):
2124
pass
@@ -40,7 +43,7 @@ def __init__(
4043
percent_drop_threshold: Decimal | float | None = None,
4144
reference_range_collection_name: str | None = None,
4245
calling_crf: Any | None = None,
43-
subject_visit: Any | None = None,
46+
related_visit: RelatedVisitProtocol | None = None,
4447
assay_datetime: datetime | None = None,
4548
egfr_drop_notification_model: str | None = None,
4649
):
@@ -49,7 +52,7 @@ def __init__(
4952
self._egfr_drop_value: Decimal | None = None
5053
self._egfr_drop_grade = None
5154
self.assay_date: date | None = None
52-
self.subject_visit = None
55+
self.related_visit = None
5356

5457
self.baseline_egfr_value = baseline_egfr_value
5558
if formula_name not in self.calculators:
@@ -88,14 +91,14 @@ def __init__(
8891
self.creatinine_units = calling_crf.creatinine_units
8992
self.creatinine_value = calling_crf.creatinine_value
9093
self.percent_drop_threshold = calling_crf.percent_drop_threshold
91-
self.subject_visit = calling_crf.subject_visit
94+
self.related_visit = calling_crf.related_visit
9295
self.report_datetime = calling_crf.report_datetime
9396
self.assay_date = calling_crf.assay_datetime.astimezone(ZoneInfo("UTC")).date()
9497
else:
9598
self.creatinine_units = creatinine_units
9699
self.creatinine_value = creatinine_value
97100
self.percent_drop_threshold = percent_drop_threshold
98-
self.subject_visit = subject_visit
101+
self.related_visit = related_visit
99102
self.report_datetime = report_datetime
100103
if assay_datetime:
101104
self.assay_date = assay_datetime.astimezone(ZoneInfo("UTC")).date()
@@ -191,11 +194,11 @@ def create_or_update_egfr_drop_notification(self):
191194
with transaction.atomic():
192195
try:
193196
obj = self.egfr_drop_notification_model_cls.objects.get(
194-
subject_visit__id=self.subject_visit.id
197+
subject_visit__id=self.related_visit.id
195198
)
196199
except ObjectDoesNotExist:
197200
obj = self.egfr_drop_notification_model_cls.objects.create(
198-
subject_visit_id=self.subject_visit.id,
201+
subject_visit_id=self.related_visit.id,
199202
report_datetime=self.report_datetime,
200203
egfr_value=self.egfr_value,
201204
creatinine_date=self.assay_date,
@@ -204,8 +207,7 @@ def create_or_update_egfr_drop_notification(self):
204207
weight=self.get_weight_in_kgs(),
205208
egfr_percent_change=self.egfr_drop_value,
206209
report_status=NEW,
207-
consent_version=self.subject_visit.consent_version,
208-
site_id=self.subject_visit.site.id,
210+
site_id=self.related_visit.site.id,
209211
)
210212
else:
211213
obj.egfr_value = self.egfr_value

‎edc_egfr/tests/tests/test_drop_notification.py

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,39 @@
11
from dateutil.relativedelta import relativedelta
22
from django.test import TestCase, override_settings
3+
from edc_appointment.constants import SCHEDULED_APPT
4+
from edc_appointment.models import Appointment
35
from edc_constants.constants import BLACK, CLOSED, COMPLETE, INCOMPLETE, MALE, OPEN
46
from edc_lab import site_labs
57
from edc_lab.models import Panel
68
from edc_lab_panel.panels import rft_panel
9+
from edc_reference import site_reference_configs
710
from edc_registration.models import RegisteredSubject
811
from edc_reportable import MICROMOLES_PER_LITER, site_reportables
912
from edc_reportable.grading_data.daids_july_2017 import grading_data
1013
from edc_reportable.normal_data.africa import normal_data
1114
from edc_utils import get_utcnow
15+
from edc_visit_schedule import site_visit_schedules
16+
from edc_visit_schedule.constants import DAY1
17+
from edc_visit_tracking.constants import SCHEDULED
1218

1319
from edc_egfr.egfr import Egfr
1420
from egfr_app.lab_profiles import lab_profile
1521
from egfr_app.models import (
16-
Appointment,
1722
EgfrDropNotification,
1823
ResultCrf,
1924
SubjectRequisition,
2025
SubjectVisit,
2126
)
27+
from egfr_app.visit_schedules import visit_schedule
2228

2329

2430
class TestEgfr(TestCase):
2531
def setUp(self) -> None:
32+
site_visit_schedules._registry = {}
33+
site_visit_schedules.register(visit_schedule)
34+
site_reference_configs.register_from_visit_schedule(
35+
visit_models={"edc_appointment.appointment": "edc_visit_tracking.subjectvisit"}
36+
)
2637
RegisteredSubject.objects.create(
2738
subject_identifier="1234",
2839
gender=MALE,
@@ -33,11 +44,21 @@ def setUp(self) -> None:
3344
subject_identifier="1234",
3445
appt_datetime=get_utcnow(),
3546
timepoint=0,
47+
visit_code=DAY1,
48+
visit_code_sequence=0,
49+
visit_schedule_name="visit_schedule",
50+
schedule_name="schedule",
51+
appt_reason=SCHEDULED_APPT,
3652
)
3753
self.subject_visit = SubjectVisit.objects.create(
3854
subject_identifier="1234",
3955
appointment=appointment,
4056
report_datetime=appointment.appt_datetime,
57+
visit_code=DAY1,
58+
visit_code_sequence=0,
59+
visit_schedule_name="visit_schedule",
60+
schedule_name="schedule",
61+
reason=SCHEDULED,
4162
)
4263

4364
panel = Panel.objects.get(name=rft_panel.name)

‎edc_egfr/tests/tests/test_egfr.py

+23-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
from _decimal import Decimal
12
from dateutil.relativedelta import relativedelta
23
from django.test import TestCase, override_settings
4+
from edc_appointment.models import Appointment
35
from edc_constants.constants import BLACK, MALE
46
from edc_lab import site_labs
57
from edc_lab.models import Panel
68
from edc_lab_panel.panels import rft_panel
9+
from edc_reference import site_reference_configs
710
from edc_registration.models import RegisteredSubject
811
from edc_reportable import (
912
MICROMOLES_PER_LITER,
@@ -14,21 +17,24 @@
1417
from edc_reportable.normal_data.africa import normal_data
1518
from edc_utils import get_utcnow
1619
from edc_utils.round_up import round_half_away_from_zero
20+
from edc_visit_schedule import site_visit_schedules
21+
from edc_visit_tracking.constants import SCHEDULED
22+
from edc_visit_tracking.models import SubjectVisit
1723

1824
from edc_egfr.calculators import EgfrCalculatorError
1925
from edc_egfr.egfr import Egfr, EgfrError
2026
from egfr_app.lab_profiles import lab_profile
21-
from egfr_app.models import (
22-
Appointment,
23-
EgfrDropNotification,
24-
ResultCrf,
25-
SubjectRequisition,
26-
SubjectVisit,
27-
)
27+
from egfr_app.models import EgfrDropNotification, ResultCrf, SubjectRequisition
28+
from egfr_app.visit_schedules import visit_schedule
2829

2930

3031
class TestEgfr(TestCase):
3132
def setUp(self) -> None:
33+
site_visit_schedules._registry = {}
34+
site_visit_schedules.register(visit_schedule)
35+
site_reference_configs.register_from_visit_schedule(
36+
visit_models={"edc_appointment.appointment": "edc_visit_tracking.subjectvisit"}
37+
)
3238
RegisteredSubject.objects.create(
3339
subject_identifier="1234",
3440
gender=MALE,
@@ -187,12 +193,21 @@ def test_egfr_drop_with_notify(self):
187193
appointment = Appointment.objects.create(
188194
subject_identifier="1234",
189195
appt_datetime=get_utcnow(),
190-
timepoint=0,
196+
visit_code="1000",
197+
visit_code_sequence=0,
198+
timepoint=Decimal("0.0"),
199+
schedule_name="schedule",
200+
visit_schedule_name="visit_schedule",
191201
)
192202
subject_visit = SubjectVisit.objects.create(
193203
subject_identifier="1234",
194204
appointment=appointment,
195205
report_datetime=appointment.appt_datetime,
206+
visit_code="1000",
207+
visit_code_sequence=0,
208+
reason=SCHEDULED,
209+
schedule_name="schedule",
210+
visit_schedule_name="visit_schedule",
196211
)
197212

198213
panel = Panel.objects.get(name=rft_panel.name)

‎egfr_app/models.py

+1-41
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from edc_screening.model_mixins import ScreeningIdentifierModelMixin
1010
from edc_sites.models import SiteModelMixin
1111
from edc_utils import get_utcnow
12+
from edc_visit_tracking.models import SubjectVisit
1213

1314
from edc_egfr.model_mixins import EgfrDropNotificationModelMixin, EgfrModelMixin
1415

@@ -33,47 +34,6 @@ class SubjectScreening(ScreeningIdentifierModelMixin, BaseUuidModel):
3334
)
3435

3536

36-
class Appointment(BaseUuidModel):
37-
subject_identifier = models.CharField(max_length=25, null=True)
38-
39-
appt_datetime = models.DateTimeField(
40-
verbose_name="Appointment date and time", db_index=True
41-
)
42-
43-
timepoint = models.IntegerField(default=0)
44-
45-
visit_code_sequence = models.IntegerField(default=0)
46-
47-
visit_schedule_name = models.CharField(max_length=25, default="visit_schedule")
48-
49-
schedule_name = models.CharField(max_length=25, default="schedule")
50-
51-
class Meta(BaseUuidModel.Meta):
52-
pass
53-
54-
55-
class SubjectVisit(SiteModelMixin, BaseUuidModel):
56-
appointment = models.OneToOneField(
57-
Appointment,
58-
on_delete=PROTECT,
59-
)
60-
61-
subject_identifier = models.CharField(max_length=25, null=True)
62-
63-
consent_version = models.CharField(max_length=5, default="1")
64-
65-
report_datetime = models.DateTimeField()
66-
67-
visit_code_sequence = models.IntegerField(default=0)
68-
69-
visit_schedule_name = models.CharField(max_length=25, default="visit_schedule")
70-
71-
schedule_name = models.CharField(max_length=25, default="schedule")
72-
73-
class Meta(BaseUuidModel.Meta):
74-
app_label = "egfr_app"
75-
76-
7737
class SubjectRequisition(PanelModelMixin, BaseUuidModel):
7838
subject_visit = models.ForeignKey(SubjectVisit, on_delete=PROTECT)
7939

‎egfr_app/visit_schedules.py

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from dateutil.relativedelta import relativedelta
2+
from edc_visit_schedule.schedule import Schedule
3+
from edc_visit_schedule.visit import Crf, FormsCollection, Visit
4+
from edc_visit_schedule.visit_schedule import VisitSchedule
5+
6+
crfs = FormsCollection(Crf(show_order=1, model="egfr_app.ResultCrf", required=True))
7+
8+
visit0 = Visit(
9+
code="1000",
10+
title="Day 1",
11+
timepoint=0,
12+
rbase=relativedelta(days=0),
13+
rlower=relativedelta(days=0),
14+
rupper=relativedelta(days=6),
15+
crfs=crfs,
16+
)
17+
18+
visit1 = Visit(
19+
code="2000",
20+
title="Day 2",
21+
timepoint=1,
22+
rbase=relativedelta(days=1),
23+
rlower=relativedelta(days=0),
24+
rupper=relativedelta(days=6),
25+
crfs=crfs,
26+
)
27+
28+
visit2 = Visit(
29+
code="3000",
30+
title="Day 3",
31+
timepoint=2,
32+
rbase=relativedelta(days=2),
33+
rlower=relativedelta(days=0),
34+
rupper=relativedelta(days=6),
35+
crfs=crfs,
36+
)
37+
38+
visit3 = Visit(
39+
code="4000",
40+
title="Day 4",
41+
timepoint=3,
42+
rbase=relativedelta(days=3),
43+
rlower=relativedelta(days=0),
44+
rupper=relativedelta(days=6),
45+
crfs=crfs,
46+
)
47+
48+
schedule = Schedule(
49+
name="schedule",
50+
onschedule_model="visit_schedule_app.onschedule",
51+
offschedule_model="visit_schedule_app.offschedule",
52+
appointment_model="edc_appointment.appointment",
53+
consent_model="visit_schedule_app.subjectconsent",
54+
)
55+
56+
schedule.add_visit(visit0)
57+
schedule.add_visit(visit1)
58+
schedule.add_visit(visit2)
59+
schedule.add_visit(visit3)
60+
61+
visit_schedule = VisitSchedule(
62+
name="visit_schedule",
63+
offstudy_model="visit_schedule_app.subjectoffstudy",
64+
death_report_model="visit_schedule_app.deathreport",
65+
)
66+
67+
visit_schedule.add_schedule(schedule)

‎runtests.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
BASE_DIR=base_dir,
1818
APP_NAME=app_name,
1919
ETC_DIR=os.path.join(base_dir, app_name, "tests", "etc"),
20+
SUBJECT_VISIT_MODEL="edc_visit_tracking.subjectvisit",
2021
INSTALLED_APPS=[
2122
"django.contrib.admin",
2223
"django.contrib.auth",
@@ -27,17 +28,20 @@
2728
"django.contrib.sites",
2829
"django_crypto_fields.apps.AppConfig",
2930
"edc_appointment.apps.AppConfig",
30-
# "edc_auth.apps.AppConfig",
31+
"edc_metadata.apps.AppConfig",
3132
"edc_action_item.apps.AppConfig",
3233
"edc_lab.apps.AppConfig",
3334
"edc_lab_results.apps.AppConfig",
35+
"edc_reference.apps.AppConfig",
3436
"edc_registration.apps.AppConfig",
3537
"edc_sites.apps.AppConfig",
3638
"edc_notification.apps.AppConfig",
3739
"edc_protocol.apps.AppConfig",
3840
"edc_reportable.apps.AppConfig",
41+
"edc_visit_tracking.apps.AppConfig",
3942
"edc_visit_schedule.apps.AppConfig",
4043
"edc_timepoint.apps.AppConfig",
44+
"visit_schedule_app.apps.AppConfig",
4145
"edc_egfr.apps.AppConfig",
4246
"egfr_app.apps.AppConfig",
4347
],

0 commit comments

Comments
 (0)
Please sign in to comment.