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
1 change: 1 addition & 0 deletions infrastructure/environments/poc/variables.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
OIDC_RP_CLIENT_ID: lcrc
OIDC_OP_FQDN: https://auth.sandpit.signin.nhs.uk
DISABLE_RECENT_SUBMISSION_LIMITATION: true
20 changes: 13 additions & 7 deletions lung_cancer_screening/questions/models/response_set.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.conf import settings
from django.db import models
from django.core.exceptions import ValidationError
from dateutil.relativedelta import relativedelta
Expand All @@ -13,10 +14,13 @@ def unsubmitted(self):
def submitted(self):
return self.filter(submitted_at__isnull=False)

def submitted_in_last_year(self):
return self.submitted().filter(submitted_at__gte=timezone.now() - relativedelta(years=1))
def recently_submitted(self):
submitted_since = timezone.now() - relativedelta(days=ResponseSet.RECENTLY_SUBMITTED_PERIOD_DAYS)
return self.submitted().filter(submitted_at__gte=submitted_since)

class ResponseSet(BaseModel):
RECENTLY_SUBMITTED_PERIOD_DAYS = 0 if settings.DISABLE_RECENT_SUBMISSION_LIMITATION else 365

# Query managers
objects = ResponseSetQuerySet.as_manager()

Expand All @@ -37,13 +41,15 @@ class Meta:

def clean(self):
super().clean()
self._validate_any_submitted_response_set_recently()


def has_user_submitted_response_set_recently(self):
return self.user and self.user.responseset_set.recently_submitted().exists()

one_year_ago = timezone.now() - relativedelta(years=1)
submitted_response_sets_in_last_year = self.user and self.user.responseset_set.filter(submitted_at__gte=one_year_ago)

if submitted_response_sets_in_last_year:
def _validate_any_submitted_response_set_recently(self):
if self.has_user_submitted_response_set_recently():
raise ValidationError(
"Responses have already been submitted for this user"
)


Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,10 @@ def test_is_invalid_if_another_unsubmitted_response_set_exists(self):
"An unsubmitted response set already exists for this user"
)

def test_is_invalid_if_another_response_set_was_submitted_within_the_last_year(self):
def test_is_invalid_if_another_response_set_was_submitted_within_the_recently_submitted_period(self):
user = UserFactory()
user.responseset_set.create(
submitted_at=timezone.now() - relativedelta(days=364)
submitted_at=timezone.now() - relativedelta(days=ResponseSet.RECENTLY_SUBMITTED_PERIOD_DAYS - 1)
)

with self.assertRaises(ValidationError) as context:
Expand Down Expand Up @@ -123,20 +123,24 @@ def test_submitted_returns_only_submitted_response_sets(self):
submitted_response_sets,
)

def test_submitted_in_last_year_returns_only_submitted_response_sets_in_the_last_year(self):
submitted_response_set_in_last_year = ResponseSetFactory(
submitted_at=timezone.now() - relativedelta(days=364)
def test_submitted_recently_returns_only_submitted_response_sets_in_the_recently_submitted_period(self):
recently_submitted_response = ResponseSetFactory(
submitted_at=timezone.now() - relativedelta(
days=ResponseSet.RECENTLY_SUBMITTED_PERIOD_DAYS - 1
)
)
submitted_response_set_older_than_last_year = ResponseSetFactory(
submitted_at=timezone.now() - relativedelta(years=1)
old_submitted_response = ResponseSetFactory(
submitted_at=timezone.now() - relativedelta(
days=ResponseSet.RECENTLY_SUBMITTED_PERIOD_DAYS + 1
)
)

submitted_response_sets_in_last_year = ResponseSet.objects.submitted_in_last_year().all()
recently_submitted_response_sets = ResponseSet.objects.recently_submitted().all()
self.assertIn(
submitted_response_set_in_last_year,
submitted_response_sets_in_last_year,
recently_submitted_response,
recently_submitted_response_sets,
)
self.assertNotIn(
submitted_response_set_older_than_last_year,
submitted_response_sets_in_last_year,
old_submitted_response,
recently_submitted_response_sets,
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
class EnsureResponseSet:

def dispatch(self, request, *args, **kwargs):
if request.user and request.user.responseset_set.submitted_in_last_year().count() > 0:
if request.user and request.user.responseset_set.recently_submitted().count() > 0:
return redirect(reverse("questions:start"))
else:
if request.method == "POST":
Expand Down
1 change: 1 addition & 0 deletions lung_cancer_screening/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,3 +253,4 @@ def list_env(key):
SECURE_SSL_REDIRECT = False
SESSION_COOKIE_SECURE = True

DISABLE_RECENT_SUBMISSION_LIMITATION = boolean_env("DISABLE_RECENT_SUBMISSION_LIMITATION", default=False)