diff --git a/src/registrar/tests/test_views_request.py b/src/registrar/tests/test_views_request.py index d86596cce..748293a8b 100644 --- a/src/registrar/tests/test_views_request.py +++ b/src/registrar/tests/test_views_request.py @@ -110,10 +110,12 @@ class DomainRequestTests(TestWithUser, WebTest): This tests that the domain requests get created only when they should. """ # Get the intro page - intro_page = self.app.get(reverse("domain-request:")) - + self.app.get(reverse("home")) session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + intro_page = self.app.get(reverse("domain-request:")) + # Select the form intro_form = intro_page.forms[0] @@ -129,22 +131,26 @@ class DomainRequestTests(TestWithUser, WebTest): domain_request_count = DomainRequest.objects.count() self.assertEqual(domain_request_count, 1) - # AGAIN right away, this should NOT cause a new request to be created - # as a small threshold between 'Continue' submits indicate a use of the - # browser back button. + # Let's go back to intro and submit again, this should not create a new request + # This is the equivalent of a back button nav from step 1 to intro -> continue intro_form = intro_page.forms[0] self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) - response = intro_form.submit(name="submit_button", value="intro_acknowledge") + type_form = intro_form.submit(name="submit_button", value="intro_acknowledge") self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) - response.follow() + type_form.follow() domain_request_count = DomainRequest.objects.count() self.assertEqual(domain_request_count, 1) - # One more time, dropping session which will set the last_submit_time to 0, - # therefore increasing the threshold and having us expect the creation of a new request + # Go home, which will reset the session flag for new request + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + self.app.get(reverse("home")) + + # This time, clicking continue will create a new request intro_form = intro_page.forms[0] - response = intro_form.submit(name="submit_button", value="intro_acknowledge") - response.follow() + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + intro_result = intro_form.submit(name="submit_button", value="intro_acknowledge") + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + intro_result.follow() domain_request_count = DomainRequest.objects.count() self.assertEqual(domain_request_count, 2) diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 71742f627..6795ede5c 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -1,6 +1,5 @@ import logging from collections import defaultdict -import time from django.http import Http404, HttpResponse, HttpResponseRedirect from django.shortcuts import redirect, render from django.urls import resolve, reverse @@ -108,6 +107,12 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): Step.ABOUT_YOUR_ORGANIZATION: lambda w: w.from_model("show_about_your_organization", False), } + def get_session_data(self, request): + """Retrieve 'global' data from session: + The homepage sets new_request to True for the first Create domain request.""" + is_a_new_request = self.request.session.get("new_request", "No data found") + return is_a_new_request + def __init__(self): super().__init__() self.steps = StepsHelper(self) @@ -436,6 +441,16 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): return step_list def goto(self, step): + if step == "generic_org_type": + # We need to avoid creating a new domain request if the user + # clicks the back button + self.request.session["new_request"] = False + else: + # Reset the above logic to be extra safe; + # we do not want to stumble into a situation where a user + # unkowingly overrites when she thinks she's working on a + # new request + self.request.session["new_request"] = True self.steps.current = step return redirect(reverse(f"{self.URL_NAMESPACE}:{step}")) @@ -458,22 +473,17 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): # which button did the user press? button: str = request.POST.get("submit_button", "") - current_time = time.time() - + # If a user hits the new request url directly + if "new_request" not in request.session: + request.session["new_request"] = True # if user has acknowledged the intro message if button == "intro_acknowledge": if request.path_info == self.NEW_URL_NAME: - last_submit_time = request.session.get("last_submit_time", 0) - - # Check if the last submit was very recent, indicating a back button -> submit sequence - if current_time - last_submit_time > 5: # 5 seconds threshold + if self.request.session["new_request"] is True: # This will trigger the domain_request getter into creating a new DomainRequest del self.storage - # Update the last submit time - request.session["last_submit_time"] = current_time - return self.goto(self.steps.first) # if accessing this class directly, redirect to the first step diff --git a/src/registrar/views/index.py b/src/registrar/views/index.py index d2e554255..3eec1c36b 100644 --- a/src/registrar/views/index.py +++ b/src/registrar/views/index.py @@ -30,6 +30,10 @@ def index(request): ) context["modal_button"] = modal_button + # This controls the creation of a new domain request in the wizard + print("will set session") + request.session["new_request"] = True + return render(request, "home.html", context)