Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitleaksignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@ infrastructure/bootstrap/main.bicep:generic-api-key:30
infrastructure/bootstrap/main.bicep:generic-api-key:31
infrastructure/bootstrap/main.bicep:generic-api-key:32
infrastructure/bootstrap/main.bicep:generic-api-key:33
infrastructure/bootstrap/modules/storage.bicep:generic-api-key:59
infrastructure/bootstrap/modules/keyVault.bicep:generic-api-key:10
infrastructure/bootstrap/modules/storage.bicep:generic-api-key:59

This file was deleted.

23 changes: 23 additions & 0 deletions lung_cancer_screening/questions/forms/cancer_diagnosis_form.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from django import forms
from ...nhsuk_forms.typed_choice_field import TypedChoiceField
from ..models.cancer_diagnosis_response import CancerDiagnosisResponse


class CancerDiagnosisForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.fields["value"] = TypedChoiceField(
choices=[(True, 'Yes'), (False, 'No')],
widget=forms.RadioSelect,
label="If you have ever been diagnosed with cancer",
label_classes="nhsuk-fieldset__legend--l",
coerce=lambda x: x == 'True',
error_messages={
'required': 'Select if you have been diagnosed with cancer'
}
)

class Meta:
model = CancerDiagnosisResponse
fields = ['value']
9 changes: 9 additions & 0 deletions lung_cancer_screening/questions/jinja2/cancer_diagnosis.jinja
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{% extends 'question_form.jinja' %}

{% block prelude %}

<h1 class="nhsuk-heading-l">If you have ever been diagnosed with cancer</h1>

<p>If you have ever been diagnosed with any type of cancer it may impact your chances of developing lung cancer.

{% endblock prelude %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 5.2.9 on 2025-12-30 09:30

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('questions', '0033_weightresponse'),
]

operations = [
migrations.AlterField(
model_name='haveyoueversmokedresponse',
name='response_set',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='have_you_ever_smoked_response', to='questions.responseset'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 5.2.9 on 2025-12-30 09:41

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('questions', '0034_alter_haveyoueversmokedresponse_response_set'),
]

operations = [
migrations.CreateModel(
name='CancerDiagnosisResponse',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('value', models.BooleanField()),
('response_set', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='cancer_diagnosis_response', to='questions.responseset')),
],
options={
'abstract': False,
},
),
]
10 changes: 0 additions & 10 deletions lung_cancer_screening/questions/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1 @@
from .response_set import ResponseSet # noqa: F401
from .user import User # noqa: F401
from .have_you_ever_smoked_response import HaveYouEverSmokedResponse # noqa: F401
from .asbestos_exposure_response import AsbestosExposureResponse # noqa: F401
from .date_of_birth_response import DateOfBirthResponse # noqa: F401
from .ethnicity_response import EthnicityResponse # noqa: F401
from .gender_response import GenderResponse # noqa: F401
from .height_response import HeightResponse # noqa: F401
from .respiratory_conditions_response import RespiratoryConditionsResponse # noqa: F401
from .sex_at_birth_response import SexAtBirthResponse # noqa: F401
from .weight_response import WeightResponse # noqa: F401
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.db import models

from .base import BaseModel
from .response_set import ResponseSet


class CancerDiagnosisResponse(BaseModel):
response_set = models.OneToOneField(ResponseSet, on_delete=models.CASCADE, related_name='cancer_diagnosis_response')
value = models.BooleanField()
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@ def asbestos_exposure(self):

return "Yes" if self.response_set.asbestos_exposure_response.value else "No"

@property
def cancer_diagnosis(self):
if not hasattr(self.response_set, 'cancer_diagnosis_response'):
return None

return "Yes" if self.response_set.cancer_diagnosis_response.value else "No"

@property
def respiratory_conditions(self):
if not hasattr(self.response_set, 'respiratory_conditions_response'):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import factory

from .response_set_factory import ResponseSetFactory
from ...models.cancer_diagnosis_response import CancerDiagnosisResponse


class CancerDiagnosisResponseFactory(factory.django.DjangoModelFactory):
class Meta:
model = CancerDiagnosisResponse

response_set = factory.SubFactory(ResponseSetFactory)
value = factory.Faker('boolean')
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
from django.test import TestCase, tag

from ...factories.response_set_factory import ResponseSetFactory
from ....models.cancer_diagnosis_response import CancerDiagnosisResponse
from ....forms.cancer_diagnosis_form import CancerDiagnosisForm

@tag("CancerDiagnosis")
class TestCancerDiagnosisForm(TestCase):
def setUp(self):
self.response_set = ResponseSetFactory()
self.response = CancerDiagnosisResponse.objects.create(
response_set=self.response_set,
value=False
)


def test_is_valid_with_a_valid_value(self):
form = CancerDiagnosisForm(
instance=self.response,
data={
"value": False
}
)
self.assertTrue(form.is_valid())
self.assertEqual(
form.cleaned_data["value"],
False
)

def test_is_invalid_with_an_invalid_value(self):
form = CancerDiagnosisForm(
instance=self.response,
data={
"value": "invalid"
}
)
self.assertFalse(form.is_valid())
self.assertEqual(
form.errors["value"],
["Select a valid choice. invalid is not one of the available choices."]
)

def test_is_invalid_when_no_option_is_selected(self):
form = CancerDiagnosisForm(
instance=self.response,
data={
"value": None
}
)
self.assertFalse(form.is_valid())
self.assertEqual(
form.errors["value"],
["Select if you have been diagnosed with cancer"]
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from django.test import TestCase, tag

from ...factories.response_set_factory import ResponseSetFactory
from ...factories.cancer_diagnosis_response_factory import CancerDiagnosisResponseFactory

from ....models.cancer_diagnosis_response import CancerDiagnosisResponse

@tag("CancerDiagnosis")
class TestCancerDiagnosisResponse(TestCase):
def setUp(self):
self.response_set = ResponseSetFactory()

def test_has_a_valid_factory(self):
model = CancerDiagnosisResponseFactory.build(response_set=self.response_set)
model.full_clean()


def test_has_response_set_as_foreign_key(self):
response_set = ResponseSetFactory()
response = CancerDiagnosisResponse.objects.create(
response_set=response_set,
value=True
)

self.assertEqual(response.response_set, response_set)

def test_has_value_as_bool(self):
response_set = ResponseSetFactory()
response = CancerDiagnosisResponse.objects.create(
response_set=response_set,
value=False
)

self.assertIsInstance(response.value, bool)
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from ...factories.ethnicity_response_factory import EthnicityResponseFactory
from ...factories.asbestos_exposure_response_factory import AsbestosExposureResponseFactory
from ...factories.respiratory_conditions_response_factory import RespiratoryConditionsResponseFactory
from ...factories.cancer_diagnosis_response_factory import CancerDiagnosisResponseFactory

from ....models.have_you_ever_smoked_response import HaveYouEverSmokedValues
from ....models.sex_at_birth_response import SexAtBirthValues
Expand Down Expand Up @@ -164,3 +165,16 @@ def test_respiratory_conditions_with_value(self):
)
presenter = ResponseSetPresenter(self.response_set)
self.assertEqual(presenter.respiratory_conditions, RespiratoryConditionValues.COPD.label + " and " + RespiratoryConditionValues.BRONCHITIS.label)

def test_cancer_diagnosis_with_no_value(self):
presenter = ResponseSetPresenter(self.response_set)
self.assertEqual(presenter.cancer_diagnosis, None)


def test_cancer_diagnosis_with_value(self):
CancerDiagnosisResponseFactory(
response_set=self.response_set,
value=True
)
presenter = ResponseSetPresenter(self.response_set)
self.assertEqual(presenter.cancer_diagnosis, "Yes")
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,14 @@ class TestPostCancerDiagnosis(TestCase):
def setUp(self):
self.user = login_user(self.client)

self.valid_params = {"value": True}

def test_post_redirects_if_the_user_is_not_logged_in(self):
self.client.logout()

response = self.client.post(
reverse("questions:cancer_diagnosis")
reverse("questions:cancer_diagnosis"),
self.valid_params
)

self.assertRedirects(
Expand Down Expand Up @@ -83,7 +86,7 @@ def test_post_updates_unsubmitted_response_set_when_one_exists(self):
self.assertEqual(response_set.submitted_at, None)
self.assertEqual(response_set.user, self.user)

def test_post_creates_new_unsubmitted_response_set_when_submitted_exists_over_year_ago( # noqa: E501
def test_post_creates_new_unsubmitted_response_set_when_submitted_exists_over_year_ago(
self
):
self.user.responseset_set.create(
Expand All @@ -101,7 +104,7 @@ def test_post_creates_new_unsubmitted_response_set_when_submitted_exists_over_ye
self.assertEqual(response_set.submitted_at, None)
self.assertEqual(response_set.user, self.user)

def test_post_redirects_when_submitted_response_set_exists_within_last_year( # noqa: E501
def test_post_redirects_when_submitted_response_set_exists_within_last_year(
self
):
self.user.responseset_set.create(
Expand All @@ -116,7 +119,8 @@ def test_post_redirects_when_submitted_response_set_exists_within_last_year( #

def test_post_redirects_to_family_history_lung_cancer_path(self):
response = self.client.post(
reverse("questions:cancer_diagnosis")
reverse("questions:cancer_diagnosis"),
self.valid_params
)

self.assertRedirects(
Expand Down
Loading