Skip to content

Commit ca14455

Browse files
committed
Allow disabling of resubmission time period
1 parent c10fe9b commit ca14455

4 files changed

Lines changed: 31 additions & 20 deletions

File tree

lung_cancer_screening/questions/models/response_set.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.conf import settings
12
from django.db import models
23
from django.core.exceptions import ValidationError
34
from dateutil.relativedelta import relativedelta
@@ -13,10 +14,13 @@ def unsubmitted(self):
1314
def submitted(self):
1415
return self.filter(submitted_at__isnull=False)
1516

16-
def submitted_in_last_year(self):
17-
return self.submitted().filter(submitted_at__gte=timezone.now() - relativedelta(years=1))
17+
def recently_submitted(self):
18+
submitted_since = timezone.now() - relativedelta(days=ResponseSet.RECENTLY_SUBMITTED_PERIOD_DAYS)
19+
return self.submitted().filter(submitted_at__gte=submitted_since)
1820

1921
class ResponseSet(BaseModel):
22+
RECENTLY_SUBMITTED_PERIOD_DAYS = 0 if settings.DISABLE_RECENT_SUBMISSION_LIMITATION else 365
23+
2024
# Query managers
2125
objects = ResponseSetQuerySet.as_manager()
2226

@@ -37,13 +41,15 @@ class Meta:
3741

3842
def clean(self):
3943
super().clean()
44+
self._validate_any_submitted_response_set_recently()
45+
46+
47+
def has_user_submitted_response_set_recently(self):
48+
return self.user and self.user.responseset_set.recently_submitted().exists()
4049

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

44-
if submitted_response_sets_in_last_year:
51+
def _validate_any_submitted_response_set_recently(self):
52+
if self.has_user_submitted_response_set_recently():
4553
raise ValidationError(
4654
"Responses have already been submitted for this user"
4755
)
48-
49-

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ def test_is_invalid_if_another_unsubmitted_response_set_exists(self):
6666
"An unsubmitted response set already exists for this user"
6767
)
6868

69-
def test_is_invalid_if_another_response_set_was_submitted_within_the_last_year(self):
69+
def test_is_invalid_if_another_response_set_was_submitted_within_the_recently_submitted_period(self):
7070
user = UserFactory()
7171
user.responseset_set.create(
72-
submitted_at=timezone.now() - relativedelta(days=364)
72+
submitted_at=timezone.now() - relativedelta(days=ResponseSet.RECENTLY_SUBMITTED_PERIOD_DAYS - 1)
7373
)
7474

7575
with self.assertRaises(ValidationError) as context:
@@ -123,20 +123,24 @@ def test_submitted_returns_only_submitted_response_sets(self):
123123
submitted_response_sets,
124124
)
125125

126-
def test_submitted_in_last_year_returns_only_submitted_response_sets_in_the_last_year(self):
127-
submitted_response_set_in_last_year = ResponseSetFactory(
128-
submitted_at=timezone.now() - relativedelta(days=364)
126+
def test_submitted_recently_returns_only_submitted_response_sets_in_the_recently_submitted_period(self):
127+
recently_submitted_response = ResponseSetFactory(
128+
submitted_at=timezone.now() - relativedelta(
129+
days=ResponseSet.RECENTLY_SUBMITTED_PERIOD_DAYS - 1
130+
)
129131
)
130-
submitted_response_set_older_than_last_year = ResponseSetFactory(
131-
submitted_at=timezone.now() - relativedelta(years=1)
132+
old_submitted_response = ResponseSetFactory(
133+
submitted_at=timezone.now() - relativedelta(
134+
days=ResponseSet.RECENTLY_SUBMITTED_PERIOD_DAYS + 1
135+
)
132136
)
133137

134-
submitted_response_sets_in_last_year = ResponseSet.objects.submitted_in_last_year().all()
138+
recently_submitted_response_sets = ResponseSet.objects.recently_submitted().all()
135139
self.assertIn(
136-
submitted_response_set_in_last_year,
137-
submitted_response_sets_in_last_year,
140+
recently_submitted_response,
141+
recently_submitted_response_sets,
138142
)
139143
self.assertNotIn(
140-
submitted_response_set_older_than_last_year,
141-
submitted_response_sets_in_last_year,
144+
old_submitted_response,
145+
recently_submitted_response_sets,
142146
)

lung_cancer_screening/questions/views/mixins/ensure_response_set.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class EnsureResponseSet:
77

88
def dispatch(self, request, *args, **kwargs):
9-
if request.user and request.user.responseset_set.submitted_in_last_year().count() > 0:
9+
if request.user and request.user.responseset_set.recently_submitted().count() > 0:
1010
return redirect(reverse("questions:start"))
1111
else:
1212
if request.method == "POST":

lung_cancer_screening/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,3 +253,4 @@ def list_env(key):
253253
SECURE_SSL_REDIRECT = False
254254
SESSION_COOKIE_SECURE = True
255255

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

0 commit comments

Comments
 (0)