Skip to content

Commit 816b931

Browse files
committed
PPHA-475: Add email to user model and pull from NHS Login
1 parent 5be7923 commit 816b931

File tree

5 files changed

+81
-4
lines changed

5 files changed

+81
-4
lines changed

lung_cancer_screening/questions/auth.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,18 @@ def create_user(self, claims):
3737
nhs_number = claims.get('nhs_number')
3838
if not nhs_number:
3939
raise ValueError("Missing 'nhs_number' claim in OIDC token")
40-
return user_class.objects.create_user(nhs_number=nhs_number)
4140

41+
email = claims.get('email')
42+
return user_class.objects.create_user(
43+
nhs_number=nhs_number,
44+
email=email
45+
)
4246

43-
def update_user(self, user, _claims):
47+
def update_user(self, user, claims):
48+
email = claims.get('email')
49+
if email and user.email != email:
50+
user.email = email
51+
user.save()
4452
return user
4553

4654
def _create_client_assertion(self):
@@ -64,15 +72,18 @@ def _create_client_assertion(self):
6472
'iss': client_id,
6573
'sub': client_id,
6674
'aud': token_endpoint,
67-
'jti': f"{client_id}-{now}",
75+
'jti': f"{client_id}-{now}", # noqa: E501
6876
'iat': now,
6977
'exp': now + 300,
7078
}
7179

7280
headers = {'alg': settings.OIDC_RP_SIGN_ALGO}
7381

7482
assertion = jwt.encode(
75-
claims, private_key, algorithm=settings.OIDC_RP_SIGN_ALGO, headers=headers
83+
claims,
84+
private_key,
85+
algorithm=settings.OIDC_RP_SIGN_ALGO,
86+
headers=headers
7687
)
7788

7889
if isinstance(assertion, bytes):
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.2.9 on 2025-12-17 15:37
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('questions', '0023_rename_height_responseset_height_metric'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='user',
15+
name='email',
16+
field=models.EmailField(blank=True, max_length=254, null=True),
17+
),
18+
]

lung_cancer_screening/questions/models/user.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def create_user(self, nhs_number, **extra_fields):
1919

2020
class User(AbstractBaseUser):
2121
nhs_number = models.CharField(max_length=10, unique=True)
22+
email = models.EmailField(blank=True, null=True)
2223
created_at = models.DateTimeField(auto_now_add=True)
2324
updated_at = models.DateTimeField(auto_now=True)
2425

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ def test_has_nhs_number_as_a_string(self):
1515
str
1616
)
1717

18+
19+
def test_has_email_as_a_string(self):
20+
self.user.email = '[email protected]'
21+
self.assertIsInstance(
22+
self.user.email,
23+
str
24+
)
25+
26+
1827
def test_has_created_at_as_a_datetime(self):
1928
self.assertIsInstance(
2029
self.user.created_at,

lung_cancer_screening/questions/tests/unit/test_auth.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,17 @@ def test_create_user_when_nhs_number_claim_is_provided(self):
5959

6060
self.assertEqual(user.nhs_number, '1234567890')
6161

62+
def test_create_user_with_email_claim(self):
63+
claims = {
64+
'nhs_number': '1234567890',
65+
'email': '[email protected]'
66+
}
67+
68+
user = self.backend.create_user(claims)
69+
70+
self.assertEqual(user.nhs_number, '1234567890')
71+
self.assertEqual(user.email, '[email protected]')
72+
6273
def test_create_user_without_nhs_number_raises_error(self):
6374
claims = {}
6475

@@ -75,6 +86,33 @@ def test_update_user_returns_user(self):
7586
result = self.backend.update_user(user, claims)
7687

7788
self.assertEqual(result, user)
89+
self.assertEqual(user.email, '[email protected]')
90+
91+
def test_update_user_updates_email_when_provided(self):
92+
user = User.objects.create_user(
93+
nhs_number='1234567890',
94+
95+
)
96+
claims = {'nhs_number': '1234567890', 'email': '[email protected]'}
97+
98+
result = self.backend.update_user(user, claims)
99+
100+
user.refresh_from_db()
101+
self.assertEqual(user.email, '[email protected]')
102+
self.assertEqual(result, user)
103+
104+
def test_update_user_does_not_update_email_when_not_provided(self):
105+
user = User.objects.create_user(
106+
nhs_number='1234567890',
107+
108+
)
109+
claims = {'nhs_number': '1234567890'}
110+
111+
result = self.backend.update_user(user, claims)
112+
113+
user.refresh_from_db()
114+
self.assertEqual(user.email, '[email protected]')
115+
self.assertEqual(result, user)
78116

79117
@patch('lung_cancer_screening.questions.auth.requests.post')
80118
def test_get_token_success(self, mock_post):

0 commit comments

Comments
 (0)