Skip to content

Commit 0b6a1bf

Browse files
committed
Add eligibility methods to models
Can be used to enforce other questions from being answered if users are not eligible
1 parent 1ed4a2b commit 0b6a1bf

11 files changed

Lines changed: 175 additions & 9 deletions

lung_cancer_screening/questions/models/check_need_appointment_response.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@
77
class CheckNeedAppointmentResponse(BaseModel):
88
response_set = models.OneToOneField(ResponseSet, on_delete=models.CASCADE, related_name='check_need_appointment_response')
99
value = models.BooleanField()
10+
11+
def is_eligible(self):
12+
return not self.value

lung_cancer_screening/questions/models/date_of_birth_response.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class DateOfBirthResponse(BaseModel):
1010
response_set = models.OneToOneField(ResponseSet, on_delete=models.CASCADE, related_name='date_of_birth_response')
1111
value = models.DateField()
1212

13-
def is_currently_in_age_range(self):
13+
def is_eligible(self):
1414
fifty_five_years_ago = date.today() - relativedelta(years=55)
1515
seventy_five_years_ago = date.today() - relativedelta(years=75)
1616

lung_cancer_screening/questions/models/have_you_ever_smoked_response.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ class HaveYouEverSmokedValues(models.IntegerChoices):
1212

1313

1414
class HaveYouEverSmokedResponse(BaseModel):
15+
ELIGIBLE_VALUES = [
16+
HaveYouEverSmokedValues.YES_I_USED_TO_SMOKE_REGULARLY.value,
17+
HaveYouEverSmokedValues.YES_I_CURRENTLY_SMOKE.value
18+
]
19+
INELIGIBLE_VALUES = [
20+
HaveYouEverSmokedValues.YES_BUT_ONLY_A_FEW_TIMES.value,
21+
HaveYouEverSmokedValues.NO_I_HAVE_NEVER_SMOKED.value
22+
]
23+
1524
response_set = models.OneToOneField(ResponseSet, on_delete=models.CASCADE, related_name='have_you_ever_smoked_response')
1625
value = models.IntegerField(choices=HaveYouEverSmokedValues.choices)
1726

@@ -22,7 +31,4 @@ def has_smoked_regularly(self):
2231
]
2332

2433
def is_eligible(self):
25-
return self.value in [
26-
HaveYouEverSmokedValues.YES_I_USED_TO_SMOKE_REGULARLY.value,
27-
HaveYouEverSmokedValues.YES_I_CURRENTLY_SMOKE.value
28-
]
34+
return self.value in self.ELIGIBLE_VALUES

lung_cancer_screening/questions/models/response_set.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,20 @@ def _response_attrs(self):
8888

8989
def is_complete(self):
9090
return all(hasattr(self, attr) for attr in self._response_attrs())
91+
92+
93+
def is_eligible(self):
94+
if not all(
95+
hasattr(self, attr) for attr in [
96+
'have_you_ever_smoked_response',
97+
'date_of_birth_response',
98+
'check_need_appointment_response'
99+
]
100+
):
101+
return False
102+
103+
return all([
104+
self.have_you_ever_smoked_response.is_eligible(),
105+
self.date_of_birth_response.is_eligible(),
106+
self.check_need_appointment_response.is_eligible()
107+
])

lung_cancer_screening/questions/tests/factories/check_need_appointment_response_factory.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,12 @@ class Meta:
1010

1111
response_set = factory.SubFactory(ResponseSetFactory)
1212
value = factory.Faker('boolean')
13+
14+
class Params:
15+
eligible = factory.Trait(
16+
value=False
17+
)
18+
19+
ineligible = factory.Trait(
20+
value=True
21+
)

lung_cancer_screening/questions/tests/factories/date_of_birth_response_factory.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,12 @@ class Meta:
1010

1111
response_set = factory.SubFactory(ResponseSetFactory)
1212
value = factory.Faker('date_of_birth')
13+
14+
class Params:
15+
eligible = factory.Trait(
16+
value=factory.Faker('date_of_birth', minimum_age=55, maximum_age=74)
17+
)
18+
19+
ineligible = factory.Trait(
20+
value=factory.Faker('date_of_birth', maximum_age=54)
21+
)

lung_cancer_screening/questions/tests/factories/have_you_ever_smoked_response_factory.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,12 @@ class Meta:
1010

1111
response_set = factory.SubFactory(ResponseSetFactory)
1212
value = factory.Iterator(HaveYouEverSmokedValues)
13+
14+
class Params:
15+
eligible = factory.Trait(
16+
value=factory.Iterator(HaveYouEverSmokedResponse.ELIGIBLE_VALUES)
17+
)
18+
19+
ineligible = factory.Trait(
20+
value=factory.Iterator(HaveYouEverSmokedResponse.INELIGIBLE_VALUES)
21+
)

lung_cancer_screening/questions/tests/factories/response_set_factory.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,24 @@ class Meta:
2525
user = factory.SubFactory(UserFactory)
2626

2727
class Params:
28+
eligible = factory.Trait(
29+
have_you_ever_smoked_response=factory.RelatedFactory(
30+
"lung_cancer_screening.questions.tests.factories.have_you_ever_smoked_response_factory.HaveYouEverSmokedResponseFactory",
31+
factory_related_name="response_set",
32+
eligible=True
33+
),
34+
date_of_birth_response=factory.RelatedFactory(
35+
"lung_cancer_screening.questions.tests.factories.date_of_birth_response_factory.DateOfBirthResponseFactory",
36+
factory_related_name="response_set",
37+
eligible=True
38+
),
39+
check_need_appointment_response=factory.RelatedFactory(
40+
"lung_cancer_screening.questions.tests.factories.check_need_appointment_response_factory.CheckNeedAppointmentResponseFactory",
41+
factory_related_name="response_set",
42+
eligible=True
43+
),
44+
)
45+
2846
complete = factory.Trait(
2947
asbestos_exposure_response=factory.RelatedFactory(
3048
"lung_cancer_screening.questions.tests.factories.asbestos_exposure_response_factory.AsbestosExposureResponseFactory",

lung_cancer_screening/questions/tests/unit/models/test_check_need_appointment_response.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,21 @@ def test_has_value_as_bool(self):
3232
)
3333

3434
self.assertIsInstance(response.value, bool)
35+
36+
37+
def test_is_eligible_returns_true_when_value_is_false(self):
38+
response = CheckNeedAppointmentResponse.objects.create(
39+
response_set=self.response_set,
40+
value=False
41+
)
42+
43+
self.assertTrue(response.is_eligible())
44+
45+
46+
def test_is_eligible_returns_false_when_value_is_true(self):
47+
response = CheckNeedAppointmentResponse.objects.create(
48+
response_set=self.response_set,
49+
value=True
50+
)
51+
52+
self.assertFalse(response.is_eligible())

lung_cancer_screening/questions/tests/unit/models/test_date_of_birth_response.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,18 @@ def test_has_value_as_date(self):
3434

3535
self.assertIsInstance(response.value, date)
3636

37-
def test_is_currently_in_age_range_returns_true_when_in_range(self):
37+
def test_is_eligible_returns_true_when_in_range(self):
3838
fifty_five_years_ago = date.today() - relativedelta(years=55)
3939
response = DateOfBirthResponseFactory.build(
4040
value=fifty_five_years_ago
4141
)
4242

43-
self.assertTrue(response.is_currently_in_age_range())
43+
self.assertTrue(response.is_eligible())
4444

45-
def test_is_currently_in_age_range_returns_false_when_too_old(self):
45+
def test_is_eligible_returns_false_when_too_old(self):
4646
fifty_five_years_ago = date.today() - relativedelta(years=55)
4747
response = DateOfBirthResponseFactory.build(
4848
value=fifty_five_years_ago
4949
)
5050

51-
self.assertTrue(response.is_currently_in_age_range())
51+
self.assertTrue(response.is_eligible())

0 commit comments

Comments
 (0)