diff --git a/infrastructure/environments/poc/variables.yml b/infrastructure/environments/poc/variables.yml index e7908d7e..d2160137 100644 --- a/infrastructure/environments/poc/variables.yml +++ b/infrastructure/environments/poc/variables.yml @@ -1,2 +1,3 @@ OIDC_RP_CLIENT_ID: lcrc OIDC_OP_FQDN: https://auth.sandpit.signin.nhs.uk +DISABLE_RECENT_SUBMISSION_LIMITATION: true diff --git a/lung_cancer_screening/questions/models/response_set.py b/lung_cancer_screening/questions/models/response_set.py index b9c9ba6c..f3a0fbb8 100644 --- a/lung_cancer_screening/questions/models/response_set.py +++ b/lung_cancer_screening/questions/models/response_set.py @@ -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 @@ -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() @@ -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" ) - - diff --git a/lung_cancer_screening/questions/tests/unit/models/test_response_set.py b/lung_cancer_screening/questions/tests/unit/models/test_response_set.py index 76800a43..012534f8 100644 --- a/lung_cancer_screening/questions/tests/unit/models/test_response_set.py +++ b/lung_cancer_screening/questions/tests/unit/models/test_response_set.py @@ -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: @@ -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, ) diff --git a/lung_cancer_screening/questions/views/mixins/ensure_response_set.py b/lung_cancer_screening/questions/views/mixins/ensure_response_set.py index 5350285c..22772abc 100644 --- a/lung_cancer_screening/questions/views/mixins/ensure_response_set.py +++ b/lung_cancer_screening/questions/views/mixins/ensure_response_set.py @@ -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": diff --git a/lung_cancer_screening/settings.py b/lung_cancer_screening/settings.py index dbd1cc78..59556710 100644 --- a/lung_cancer_screening/settings.py +++ b/lung_cancer_screening/settings.py @@ -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)