Merge pull request #2233 from cisagov/za/2164-preamble-domain-return

Ticket #2164: Add request link for preamble
This commit is contained in:
zandercymatics 2024-06-03 12:21:05 -06:00 committed by GitHub
commit 07bfac4ffd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 91 additions and 19 deletions

View file

@ -2,6 +2,7 @@
import time
import logging
from urllib.parse import urlparse, urlunparse, urlencode
logger = logging.getLogger(__name__)
@ -266,3 +267,34 @@ class CreateOrUpdateOrganizationTypeHelper:
return False
else:
return True
def replace_url_queryparams(url_to_modify: str, query_params, convert_list_to_csv=False):
"""
Replaces the query parameters of a given URL.
Because this replaces them, this can be used to either add, delete, or modify.
Args:
url_to_modify (str): The URL whose query parameters need to be modified.
query_params (dict): Dictionary of query parameters to use.
convert_list_to_csv (bool): If the queryparam contains a list of items,
convert it to a csv representation instead.
Returns:
str: The modified URL with the updated query parameters.
"""
# Ensure each key in query_params maps to a single value, not a list
if convert_list_to_csv:
for key, value in query_params.items():
if isinstance(value, list):
query_params[key] = ",".join(value)
# Split the URL into parts
url_parts = list(urlparse(url_to_modify))
# Modify the query param bit
url_parts[4] = urlencode(query_params)
# Reassemble the URL
new_url = urlunparse(url_parts)
return new_url

View file

@ -13,12 +13,12 @@
<p>Well use the information you provide to verify your organizations eligibility for a .gov domain. Well also verify that the domain you request meets our guidelines.</p>
<h2>Time to complete the form</h2>
<p>If you have <a href="{% public_site_url 'domains/before/#information-you%E2%80%99ll-need-to-complete-the-domain-request-form' %}" target="_blank" class="usa-link">all the information you need</a>,
completing your domain request might take around 15 minutes.</p>
{% if has_profile_feature_flag %}
<h2>How well reach you</h2>
<p>While reviewing your domain request, we may need to reach out with questions. Well also email you when we complete our review If the contact information below is not correct, visit <a href="" target="_blank" class="usa-link">your profile</a> to make updates.</p>
{% include "includes/profile_information.html" with user=user%}
{% endif %}
completing your domain request might take around 15 minutes.</p>
{% if has_profile_feature_flag %}
<h2>How well reach you</h2>
<p>While reviewing your domain request, we may need to reach out with questions. Well also email you when we complete our review If the contact information below is not correct, visit <a href="{% url 'user-profile' %}?return_to_request=True" class="usa-link">your profile</a> to make updates.</p>
{% include "includes/profile_information.html" with user=user%}
{% endif %}
{% block form_buttons %}

View file

@ -10,16 +10,7 @@ Edit your User Profile |
{% block content %}
<main id="main-content" class="grid-container">
<div class="grid-col desktop:grid-offset-2 desktop:grid-col-8">
<a href="{% url 'home' %}" class="breadcrumb__back">
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img">
<use xlink:href="{% static 'img/sprite.svg' %}#arrow_back"></use>
</svg>
<p class="margin-left-05 margin-top-0 margin-bottom-0 line-height-sans-1">
Back to manage your domains
</p>
</a>
{# messages block is under the back breadcrumb link #}
{# messages block #}
{% if messages %}
{% for message in messages %}
<div class="usa-alert usa-alert--{{ message.tags }} usa-alert--slim margin-bottom-3">
@ -30,6 +21,21 @@ Edit your User Profile |
{% endfor %}
{% endif %}
{% include "includes/form_errors.html" with form=form %}
<a href="{% if not return_to_request %}{% url 'home' %}{% else %}{% url 'domain-request:' %}{% endif %}" class="breadcrumb__back">
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img">
<use xlink:href="{% static 'img/sprite.svg' %}#arrow_back"></use>
</svg>
{% if not return_to_request %}
<p class="margin-left-05 margin-top-0 margin-bottom-0 line-height-sans-1">
Back to manage your domains
</p>
{% else %}
<p class="margin-left-05 margin-top-0 margin-bottom-0 line-height-sans-1">
Go back to your domain request
</p>
{% endif %}
</a>
<h1>Your profile</h1>
<p>We <a href="{% public_site_url 'domains/requirements/#what-.gov-domain-registrants-must-do' %}" target="_blank">require</a> that you maintain accurate contact information. The details you provide will only be used to support the administration of .gov and wont be made public.</p>

View file

@ -560,6 +560,16 @@ class UserProfileTests(TestWithUser, WebTest):
response = self.client.get("/user-profile")
self.assertEqual(response.status_code, 404)
@less_console_noise_decorator
def test_user_profile_back_button_when_coming_from_domain_request(self):
"""tests user profile when profile_feature is on,
and when they are redirected from the domain request page"""
with override_flag("profile_feature", active=True):
response = self.client.get("/user-profile?return_to_request=True")
self.assertContains(response, "Your profile")
self.assertContains(response, "Go back to your domain request")
self.assertNotContains(response, "Back to manage your domains")
@less_console_noise_decorator
def test_domain_detail_profile_feature_on(self):
"""test that domain detail view when profile_feature is on"""

View file

@ -3,6 +3,7 @@
"""
import logging
from urllib.parse import parse_qs, unquote
from django.contrib import messages
from django.views.generic.edit import FormMixin
@ -11,6 +12,7 @@ from django.urls import reverse
from registrar.models import (
Contact,
)
from registrar.models.utility.generic_helper import replace_url_queryparams
from registrar.views.utility.permission_views import UserProfilePermissionView
from waffle.decorators import flag_is_active, waffle_flag
@ -30,13 +32,26 @@ class UserProfileView(UserProfilePermissionView, FormMixin):
def get(self, request, *args, **kwargs):
"""Handle get requests by getting user's contact object and setting object
and form to context before rendering."""
self.object = self.get_object()
self._refresh_session_and_object(request)
form = self.form_class(instance=self.object)
context = self.get_context_data(object=self.object, form=form)
return_to_request = request.GET.get("return_to_request")
if return_to_request:
context["return_to_request"] = True
return self.render_to_response(context)
def _refresh_session_and_object(self, request):
"""Sets the current session to self.session and the current object to self.object"""
self.session = request.session
self.object = self.get_object()
@waffle_flag("profile_feature") # type: ignore
def dispatch(self, request, *args, **kwargs): # type: ignore
# Store the original queryparams to persist them
query_params = request.META["QUERY_STRING"]
request.session["query_params"] = query_params
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
@ -48,11 +63,20 @@ class UserProfileView(UserProfilePermissionView, FormMixin):
def get_success_url(self):
"""Redirect to the user's profile page."""
return reverse("user-profile")
query_params = {}
if "query_params" in self.session:
params = unquote(self.session["query_params"])
query_params = parse_qs(params)
# Preserve queryparams and add them back to the url
base_url = reverse("user-profile")
new_redirect = replace_url_queryparams(base_url, query_params, convert_list_to_csv=True)
return new_redirect
def post(self, request, *args, **kwargs):
"""Handle post requests (form submissions)"""
self.object = self.get_object()
self._refresh_session_and_object(request)
form = self.form_class(request.POST, instance=self.object)
if form.is_valid():