Skip to content

Commit af1e8fe

Browse files
committed
Move AsbestosExposureResponse to its own model
1 parent a40f609 commit af1e8fe

File tree

8 files changed

+128
-35
lines changed

8 files changed

+128
-35
lines changed
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from django import forms
22
from ...nhsuk_forms.typed_choice_field import TypedChoiceField
3-
from ..models.response_set import ResponseSet
3+
from ..models.asbestos_exposure_response import AsbestosExposureResponse
44

55

66
class AsbestosExposureForm(forms.ModelForm):
77
def __init__(self, *args, **kwargs):
88
super().__init__(*args, **kwargs)
99

10-
self.fields["asbestos_exposure"] = TypedChoiceField(
10+
self.fields["value"] = TypedChoiceField(
1111
choices=[(True, 'Yes'), (False, 'No')],
1212
widget=forms.RadioSelect,
1313
label="Have you ever worked in a job where you might have been exposed to asbestos?",
@@ -19,5 +19,5 @@ def __init__(self, *args, **kwargs):
1919
)
2020

2121
class Meta:
22-
model = ResponseSet
23-
fields = ['asbestos_exposure']
22+
model = AsbestosExposureResponse
23+
fields = ['value']
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Generated manually to create AsbestosExposureResponse and copy data
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
def copy_asbestos_exposure_data(apps, schema_editor):
8+
with schema_editor.connection.cursor() as cursor:
9+
cursor.execute("""
10+
INSERT INTO questions_asbestosexposureresponse (created_at, updated_at, value, response_set_id)
11+
SELECT NOW(), NOW(), asbestos_exposure, id
12+
FROM questions_responseset
13+
WHERE asbestos_exposure IS NOT NULL
14+
ON CONFLICT (response_set_id) DO NOTHING
15+
""")
16+
17+
18+
def reverse_copy_asbestos_exposure_data(apps, schema_editor):
19+
with schema_editor.connection.cursor() as cursor:
20+
cursor.execute("""
21+
UPDATE questions_responseset rs
22+
SET asbestos_exposure = a.value
23+
FROM questions_asbestosexposureresponse a
24+
WHERE rs.id = a.response_set_id
25+
""")
26+
27+
28+
class Migration(migrations.Migration):
29+
30+
dependencies = [
31+
('questions', '0025_haveyoueversmokedresponse'),
32+
]
33+
34+
operations = [
35+
migrations.CreateModel(
36+
name='AsbestosExposureResponse',
37+
fields=[
38+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
39+
('created_at', models.DateTimeField(auto_now_add=True)),
40+
('updated_at', models.DateTimeField(auto_now=True)),
41+
('value', models.BooleanField()),
42+
('response_set', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='asbestos_exposure_response', to='questions.responseset')),
43+
],
44+
options={
45+
'abstract': False,
46+
},
47+
),
48+
migrations.RunPython(copy_asbestos_exposure_data, reverse_copy_asbestos_exposure_data),
49+
migrations.RemoveField(
50+
model_name='responseset',
51+
name='asbestos_exposure',
52+
),
53+
]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from .response_set import ResponseSet # noqa: F401
22
from .user import User # noqa: F401
33
from .have_you_ever_smoked_response import HaveYouEverSmokedResponse # noqa: F401
4+
from .asbestos_exposure_response import AsbestosExposureResponse # noqa: F401
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from django.db import models
2+
3+
from .base import BaseModel
4+
from .response_set import ResponseSet
5+
6+
7+
class AsbestosExposureResponse(BaseModel):
8+
response_set = models.OneToOneField(ResponseSet, on_delete=models.CASCADE, related_name='asbestos_exposure_response')
9+
value = models.BooleanField()
Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,54 @@
11
from django.test import TestCase
22

3-
from ...factories.user_factory import UserFactory
4-
from ....models.response_set import ResponseSet
3+
from ...factories.response_set_factory import ResponseSetFactory
4+
from ....models.asbestos_exposure_response import AsbestosExposureResponse
55
from ....forms.asbestos_exposure_form import AsbestosExposureForm
66

77

88
class TestAsbestosExposureForm(TestCase):
99
def setUp(self):
10-
self.user = UserFactory()
11-
self.response_set = ResponseSet(user=self.user)
10+
self.response_set = ResponseSetFactory()
11+
self.response = AsbestosExposureResponse.objects.create(
12+
response_set=self.response_set,
13+
value=False
14+
)
1215

1316

1417
def test_is_valid_with_a_valid_value(self):
1518
form = AsbestosExposureForm(
16-
instance=self.response_set,
19+
instance=self.response,
1720
data={
18-
"asbestos_exposure": False
21+
"value": False
1922
}
2023
)
2124
self.assertTrue(form.is_valid())
2225
self.assertEqual(
23-
form.cleaned_data["asbestos_exposure"],
26+
form.cleaned_data["value"],
2427
False
2528
)
2629

2730
def test_is_invalid_with_an_invalid_value(self):
2831
form = AsbestosExposureForm(
29-
instance=self.response_set,
32+
instance=self.response,
3033
data={
31-
"user": self.user,
32-
"asbestos_exposure": "invalid"
34+
"value": "invalid"
3335
}
3436
)
3537
self.assertFalse(form.is_valid())
3638
self.assertEqual(
37-
form.errors["asbestos_exposure"],
39+
form.errors["value"],
3840
["Select a valid choice. invalid is not one of the available choices."]
3941
)
4042

4143
def test_is_invalid_when_no_option_is_selected(self):
4244
form = AsbestosExposureForm(
43-
instance=self.response_set,
45+
instance=self.response,
4446
data={
45-
"user": self.user,
46-
"asbestos_exposure": None
47+
"value": None
4748
}
4849
)
4950
self.assertFalse(form.is_valid())
5051
self.assertEqual(
51-
form.errors["asbestos_exposure"],
52+
form.errors["value"],
5253
["Select if you have been exposed to asbestos"]
5354
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from django.test import TestCase
2+
3+
from ...factories.response_set_factory import ResponseSetFactory
4+
from ....models.asbestos_exposure_response import AsbestosExposureResponse
5+
6+
7+
class TestAsbestosExposureResponse(TestCase):
8+
def test_has_response_set_as_foreign_key(self):
9+
response_set = ResponseSetFactory()
10+
response = AsbestosExposureResponse.objects.create(
11+
response_set=response_set,
12+
value=True
13+
)
14+
15+
self.assertEqual(response.response_set, response_set)
16+
17+
def test_has_value_as_bool(self):
18+
response_set = ResponseSetFactory()
19+
response = AsbestosExposureResponse.objects.create(
20+
response_set=response_set,
21+
value=False
22+
)
23+
24+
self.assertIsInstance(response.value, bool)

lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.utils import timezone
55

66
from .helpers.authentication import login_user
7+
from lung_cancer_screening.questions.models.asbestos_exposure_response import AsbestosExposureResponse
78

89

910
class TestGetAsbestosExposure(TestCase):
@@ -49,7 +50,7 @@ class TestPostAsbestosExposure(TestCase):
4950
def setUp(self):
5051
self.user = login_user(self.client)
5152

52-
self.valid_params = {"asbestos_exposure": True}
53+
self.valid_params = {"value": True}
5354

5455

5556
def test_post_redirects_if_the_user_is_not_logged_in(self):
@@ -72,7 +73,7 @@ def test_post_creates_an_unsubmitted_response_set_for_the_user_when_no_response_
7273
response_set = self.user.responseset_set.first()
7374
self.assertEqual(self.user.responseset_set.count(), 1)
7475
self.assertEqual(response_set.submitted_at, None)
75-
self.assertEqual(response_set.asbestos_exposure, self.valid_params["asbestos_exposure"])
76+
self.assertEqual(AsbestosExposureResponse.objects.get(response_set=response_set).value, self.valid_params["value"])
7677
self.assertEqual(response_set.user, self.user)
7778

7879

@@ -87,7 +88,7 @@ def test_post_updates_an_unsubmitted_response_set_for_the_user_when_an_unsubmitt
8788
response_set.refresh_from_db()
8889
self.assertEqual(self.user.responseset_set.count(), 1)
8990
self.assertEqual(response_set.submitted_at, None)
90-
self.assertEqual(response_set.asbestos_exposure, self.valid_params["asbestos_exposure"])
91+
self.assertEqual(AsbestosExposureResponse.objects.get(response_set=response_set).value, self.valid_params["value"])
9192
self.assertEqual(response_set.user, self.user)
9293

9394

@@ -106,7 +107,7 @@ def test_post_creates_an_new_unsubmitted_response_set_for_the_user_when_an_submi
106107

107108
response_set = self.user.responseset_set.last()
108109
self.assertEqual(response_set.submitted_at, None)
109-
self.assertEqual(response_set.asbestos_exposure, self.valid_params["asbestos_exposure"])
110+
self.assertEqual(AsbestosExposureResponse.objects.get(response_set=response_set).value, self.valid_params["value"])
110111
self.assertEqual(response_set.user, self.user)
111112

112113

@@ -135,18 +136,17 @@ def test_post_redirects_to_the_next_page(self):
135136
def test_post_responds_with_422_if_the_response_fails_to_create(self):
136137
response = self.client.post(
137138
reverse("questions:asbestos_exposure"),
138-
{"asbestos_exposure": "something not in list"}
139+
{"value": "something not in list"}
139140
)
140141

141142
self.assertEqual(response.status_code, 422)
142143

143144
def test_post_does_not_update_response_set_on_invalid_data(self):
144145
self.client.post(
145146
reverse("questions:asbestos_exposure"),
146-
{"asbestos_exposure": "invalid"}
147+
{"value": "invalid"}
147148
)
148149

149-
self.assertEqual(
150-
self.user.responseset_set.first().asbestos_exposure,
151-
None
152-
)
150+
response_set = self.user.responseset_set.first()
151+
if response_set:
152+
self.assertFalse(AsbestosExposureResponse.objects.filter(response_set=response_set).exists())

lung_cancer_screening/questions/views/asbestos_exposure.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,31 @@
55

66
from .mixins.ensure_response_set import EnsureResponseSet
77
from ..forms.asbestos_exposure_form import AsbestosExposureForm
8+
from ..models.asbestos_exposure_response import AsbestosExposureResponse
89

910
class AsbestosExposureView(LoginRequiredMixin, EnsureResponseSet, View):
1011
def get(self, request):
12+
response, _ = AsbestosExposureResponse.objects.get_or_build(
13+
response_set=request.response_set
14+
)
1115
return render(
1216
request,
1317
"asbestos_exposure.jinja",
14-
{"form": AsbestosExposureForm(instance=request.response_set)}
18+
{"form": AsbestosExposureForm(instance=response)}
1519
)
1620

1721
def post(self, request):
18-
22+
response, _ = AsbestosExposureResponse.objects.get_or_build(
23+
response_set=request.response_set
24+
)
1925
form = AsbestosExposureForm(
20-
instance=request.response_set,
26+
instance=response,
2127
data=request.POST
2228
)
2329

2430
if form.is_valid():
25-
response_set = request.user.responseset_set.last()
26-
response_set.asbestos_exposure = form.cleaned_data["asbestos_exposure"]
27-
response_set.save()
31+
response.value = form.cleaned_data["value"]
32+
response.save()
2833
return redirect(reverse("questions:cancer_diagnosis"))
2934
else:
3035
return render(

0 commit comments

Comments
 (0)