From 5a8c271647f1af8ab88968fc7f74c0dc2ea9ad80 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:58:23 -0600 Subject: [PATCH 01/17] base logic --- src/registrar/assets/sass/_theme/_base.scss | 4 + .../assets/sass/_theme/_cisa_colors.scss | 1 + src/registrar/config/urls.py | 5 + src/registrar/models/domain_request.py | 4 +- .../templates/domain_request_status.html | 205 +----------------- .../domain_request_status_viewonly.html | 10 + src/registrar/templates/includes/contact.html | 8 + .../domain_request_status_manage.html | 198 +++++++++++++++++ .../includes/domain_request_status_view.html | 7 + .../includes/organization_address.html | 10 +- .../templates/includes/summary_item.html | 11 +- src/registrar/views/domain_request.py | 32 +++ src/registrar/views/domain_requests_json.py | 2 +- 13 files changed, 288 insertions(+), 209 deletions(-) create mode 100644 src/registrar/templates/domain_request_status_viewonly.html create mode 100644 src/registrar/templates/includes/domain_request_status_manage.html create mode 100644 src/registrar/templates/includes/domain_request_status_view.html diff --git a/src/registrar/assets/sass/_theme/_base.scss b/src/registrar/assets/sass/_theme/_base.scss index 9d2ed4177..a6132312d 100644 --- a/src/registrar/assets/sass/_theme/_base.scss +++ b/src/registrar/assets/sass/_theme/_base.scss @@ -225,3 +225,7 @@ abbr[title] { .break-word { word-break: break-word; } + +.dhs-red-50 { + color: $dhs-red-50; +} diff --git a/src/registrar/assets/sass/_theme/_cisa_colors.scss b/src/registrar/assets/sass/_theme/_cisa_colors.scss index 23ecf7989..2bf045333 100644 --- a/src/registrar/assets/sass/_theme/_cisa_colors.scss +++ b/src/registrar/assets/sass/_theme/_cisa_colors.scss @@ -63,6 +63,7 @@ $dhs-red-90: #080102; $dhs-red-80: #37050d; $dhs-red-70: #660919; $dhs-red-60: #950e24; +$dhs-red-50: #C41131; $dhs-red: #c41230; $dhs-red-40: #d24b62; $dhs-red-30: #e08493; diff --git a/src/registrar/config/urls.py b/src/registrar/config/urls.py index 9b9ed569e..4dcb4d056 100644 --- a/src/registrar/config/urls.py +++ b/src/registrar/config/urls.py @@ -169,6 +169,11 @@ urlpatterns = [ views.DomainRequestStatus.as_view(), name="domain-request-status", ), + path( + "domain-request/viewonly/", + views.DomainRequestStatusViewOnly.as_view(), + name="domain-request-status-viewonly", + ), path( "domain-request//withdraw", views.DomainRequestWithdrawConfirmation.as_view(), diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index 101534034..39cf9e5fb 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -1190,7 +1190,7 @@ class DomainRequest(TimeStampedModel): def _is_creator_complete(self): return self.creator is not None - def _is_organization_name_and_address_complete(self): + def is_organization_name_and_address_complete(self): return not ( self.organization_name is None and self.address_line1 is None @@ -1258,7 +1258,7 @@ class DomainRequest(TimeStampedModel): def _is_general_form_complete(self, request): return ( self._is_creator_complete() - and self._is_organization_name_and_address_complete() + and self.is_organization_name_and_address_complete() and self._is_senior_official_complete() and self._is_requested_domain_complete() and self._is_purpose_complete() diff --git a/src/registrar/templates/domain_request_status.html b/src/registrar/templates/domain_request_status.html index 8bc083835..5f6624f15 100644 --- a/src/registrar/templates/domain_request_status.html +++ b/src/registrar/templates/domain_request_status.html @@ -1,207 +1,10 @@ {% extends 'base.html' %} - {% load custom_filters %} - -{% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %} {% load static url_helpers %} +{% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %} + + {% block content %} -
-
- {% if portfolio %} - {% url 'domain-requests' as url %} - {% else %} - {% url 'home' as url %} - {% endif %} - - -

Domain request for {{ DomainRequest.requested_domain.name }}

-
-
-

- - Status: - - {{ DomainRequest.get_status_display|default:"ERROR Please contact technical support/dev" }} -

-
-
-
- - {% with statuses=DomainRequest.DomainRequestStatus last_submitted=DomainRequest.last_submitted_date|date:"F j, Y" first_submitted=DomainRequest.first_submitted_date|date:"F j, Y" last_status_update=DomainRequest.last_status_update|date:"F j, Y" %} - {% comment %} - These are intentionally seperated this way. - There is some code repetition, but it gives us more flexibility rather than a dense reduction. - Leave it this way until we've solidified our requirements. - {% endcomment %} - {% if DomainRequest.status == statuses.STARTED %} - {% with first_started_date=DomainRequest.get_first_status_started_date|date:"F j, Y" %} -

- {% comment %} - A newly created domain request will not have a value for last_status update. - This is because the status never really updated. - However, if this somehow goes back to started we can default to displaying that new date. - {% endcomment %} - Started on: {{last_status_update|default:first_started_date}} -

- {% endwith %} - {% elif DomainRequest.status == statuses.SUBMITTED %} -

- Submitted on: {{last_submitted|default:first_submitted }} -

-

- Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} -

- {% elif DomainRequest.status == statuses.ACTION_NEEDED %} -

- Submitted on: {{last_submitted|default:first_submitted }} -

-

- Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} -

- {% elif DomainRequest.status == statuses.REJECTED %} -

- Submitted on: {{last_submitted|default:first_submitted }} -

-

- Rejected on: {{last_status_update}} -

- {% elif DomainRequest.status == statuses.WITHDRAWN %} -

- Submitted on: {{last_submitted|default:first_submitted }} -

-

- Withdrawn on: {{last_status_update}} -

- {% else %} - {% comment %} Shown for in_review, approved, ineligible {% endcomment %} -

- Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} -

- {% endif %} - - {% if DomainRequest.status != 'rejected' %} -

{% include "includes/domain_request.html" %}

-

- Withdraw request -

- {% endif %} - {% endwith %} -
- -
-

Summary of your domain request

- {% with heading_level='h3' %} - {% with org_type=DomainRequest.get_generic_org_type_display %} - {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level %} - {% endwith %} - - {% if DomainRequest.tribe_name %} - {% include "includes/summary_item.html" with title='Tribal government' value=DomainRequest.tribe_name heading_level=heading_level %} - - {% if DomainRequest.federally_recognized_tribe %} -

Federally-recognized tribe

- {% endif %} - - {% if DomainRequest.state_recognized_tribe %} -

State-recognized tribe

- {% endif %} - - {% endif %} - - {% if DomainRequest.get_federal_type_display %} - {% include "includes/summary_item.html" with title='Federal government branch' value=DomainRequest.get_federal_type_display heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.is_election_board %} - {% with value=DomainRequest.is_election_board|yesno:"Yes,No,Incomplete" %} - {% include "includes/summary_item.html" with title='Election office' value=value heading_level=heading_level %} - {% endwith %} - {% endif %} - - {% if DomainRequest.organization_name %} - {% include "includes/summary_item.html" with title='Organization name and mailing address' value=DomainRequest address='true' heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.about_your_organization %} - {% include "includes/summary_item.html" with title='About your organization' value=DomainRequest.about_your_organization heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.senior_official %} - {% include "includes/summary_item.html" with title='Senior official' value=DomainRequest.senior_official contact='true' heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.current_websites.all %} - {% include "includes/summary_item.html" with title='Current websites' value=DomainRequest.current_websites.all list='true' heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.requested_domain %} - {% include "includes/summary_item.html" with title='.gov domain' value=DomainRequest.requested_domain heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.alternative_domains.all %} - {% include "includes/summary_item.html" with title='Alternative domains' value=DomainRequest.alternative_domains.all list='true' heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.purpose %} - {% include "includes/summary_item.html" with title='Purpose of your domain' value=DomainRequest.purpose heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.creator %} - {% include "includes/summary_item.html" with title='Your contact information' value=DomainRequest.creator contact='true' heading_level=heading_level %} - {% endif %} - - {% if DomainRequest.other_contacts.all %} - {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.other_contacts.all contact='true' list='true' heading_level=heading_level %} - {% else %} - {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.no_other_contacts_rationale heading_level=heading_level %} - {% endif %} - - {# We always show this field even if None #} - {% if DomainRequest %} -

CISA Regional Representative

-
    - {% if DomainRequest.cisa_representative_first_name %} - {{ DomainRequest.get_formatted_cisa_rep_name }} - {% else %} - No - {% endif %} -
- -

Anything else

-
    - {% if DomainRequest.anything_else %} - {{DomainRequest.anything_else}} - {% else %} - No - {% endif %} -
- {% endif %} - {% endwith %} -
- -
+ {% include "includes/domain_request_status_manage.html" %} {% endblock %} diff --git a/src/registrar/templates/domain_request_status_viewonly.html b/src/registrar/templates/domain_request_status_viewonly.html new file mode 100644 index 000000000..8b5de5475 --- /dev/null +++ b/src/registrar/templates/domain_request_status_viewonly.html @@ -0,0 +1,10 @@ +{% extends 'base.html' %} +{% load custom_filters %} +{% load static url_helpers %} + +{% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %} + + +{% block content %} + {% include "includes/domain_request_status_view.html" %} +{% endblock %} diff --git a/src/registrar/templates/includes/contact.html b/src/registrar/templates/includes/contact.html index 68c243558..9cd1f8dd3 100644 --- a/src/registrar/templates/includes/contact.html +++ b/src/registrar/templates/includes/contact.html @@ -1,6 +1,14 @@ +{% if contact %}
{{ contact.get_formatted_name }}
{% if contact.title %}{{ contact.title }}
{% endif %} {% if contact.email %}{{ contact.email }}
{% endif %} {% if contact.phone %}{{ contact.phone.as_national }}{% endif %}
+{% else %} + {% if custom_text_for_value_none %} + {{ custom_text_for_value_none }} + {% else %} + None + {% endif %} +{% endif %} diff --git a/src/registrar/templates/includes/domain_request_status_manage.html b/src/registrar/templates/includes/domain_request_status_manage.html new file mode 100644 index 000000000..b1edebe6c --- /dev/null +++ b/src/registrar/templates/includes/domain_request_status_manage.html @@ -0,0 +1,198 @@ +{% load custom_filters %} +{% load static url_helpers %} +
+
+ {% block breadcrumb %} + {% if portfolio %} + {% url 'domain-requests' as url %} + {% else %} + {% url 'home' as url %} + {% endif %} + + {% endblock breadcrumb %} + + {% block header %} +

Domain request for {{ DomainRequest.requested_domain.name }}

+ {% endblock header %} + + {% block status_summary %} +
+
+

+ + Status: + + {{ DomainRequest.get_status_display|default:"ERROR Please contact technical support/dev" }} +

+
+
+
+ + {% with statuses=DomainRequest.DomainRequestStatus last_submitted=DomainRequest.last_submitted_date|date:"F j, Y" first_submitted=DomainRequest.first_submitted_date|date:"F j, Y" last_status_update=DomainRequest.last_status_update|date:"F j, Y" %} + {% comment %} + These are intentionally seperated this way. + There is some code repetition, but it gives us more flexibility rather than a dense reduction. + Leave it this way until we've solidified our requirements. + {% endcomment %} + {% if DomainRequest.status == statuses.STARTED %} + {% with first_started_date=DomainRequest.get_first_status_started_date|date:"F j, Y" %} +

+ {% comment %} + A newly created domain request will not have a value for last_status update. + This is because the status never really updated. + However, if this somehow goes back to started we can default to displaying that new date. + {% endcomment %} + Started on: {{last_status_update|default:first_started_date}} +

+ {% endwith %} + {% elif DomainRequest.status == statuses.SUBMITTED %} +

+ Submitted on: {{last_submitted|default:first_submitted }} +

+

+ Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} +

+ {% elif DomainRequest.status == statuses.ACTION_NEEDED %} +

+ Submitted on: {{last_submitted|default:first_submitted }} +

+

+ Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} +

+ {% elif DomainRequest.status == statuses.REJECTED %} +

+ Submitted on: {{last_submitted|default:first_submitted }} +

+

+ Rejected on: {{last_status_update}} +

+ {% elif DomainRequest.status == statuses.WITHDRAWN %} +

+ Submitted on: {{last_submitted|default:first_submitted }} +

+

+ Withdrawn on: {{last_status_update}} +

+ {% else %} + {% comment %} Shown for in_review, approved, ineligible {% endcomment %} +

+ Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} +

+ {% endif %} + {% endwith %} + {% endblock status_summary %} + + {% block modify_request %} + {% if DomainRequest.status != 'rejected' %} +

{% include "includes/domain_request.html" %}

+

+ Withdraw request +

+ {% endif %} + {% endblock modify_request %} +
+ +
+ {% block request_summary_header %} +

Summary of your domain request

+ {% endblock request_summary_header%} + + {% block request_summary %} + {% with heading_level='h3' %} + {% with org_type=DomainRequest.get_generic_org_type_display %} + {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level %} + {% endwith %} + + {% if DomainRequest.show_tribal_government %} + {% include "includes/summary_item.html" with title='Tribal government' value=DomainRequest.tribe_name heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% if DomainRequest.federally_recognized_tribe %} +

Federally-recognized tribe

+ {% endif %} + + {% if DomainRequest.state_recognized_tribe %} +

State-recognized tribe

+ {% endif %} + {% endif %} + + {% if DomainRequest.show_organization_federal %} + {% include "includes/summary_item.html" with title='Federal government branch' value=DomainRequest.get_federal_type_display heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% endif %} + + {% if DomainRequest.show_organization_election %} + {% with value=DomainRequest.is_election_board|yesno:"Yes,No,Incomplete" %} + {% include "includes/summary_item.html" with title='Election office' value=value heading_level=heading_level %} + {% endwith %} + {% endif %} + + {% if not portfolio %} + {% include "includes/summary_item.html" with title='Organization name and mailing address' value=DomainRequest address='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% endif %} + + {% if DomainRequest.show_about_your_organization %} + {% include "includes/summary_item.html" with title='About your organization' value=DomainRequest.about_your_organization heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% endif %} + + {% include "includes/summary_item.html" with title='Senior official' value=DomainRequest.senior_official contact='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% include "includes/summary_item.html" with title='Current websites' value=DomainRequest.current_websites.all list='true' heading_level=heading_level %} + + {% include "includes/summary_item.html" with title='.gov domain' value=DomainRequest.requested_domain heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% include "includes/summary_item.html" with title='Alternative domains' value=DomainRequest.alternative_domains.all list='true' heading_level=heading_level %} + + {% include "includes/summary_item.html" with title='Purpose of your domain' value=DomainRequest.purpose heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% if DomainRequest.other_contacts.all %} + {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.other_contacts.all contact='true' list='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% else %} + {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.no_other_contacts_rationale heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% endif %} + + {# We always show this field even if None #} + {% if DomainRequest %} +

CISA Regional Representative

+
    + {% if DomainRequest.cisa_representative_first_name %} + {{ DomainRequest.get_formatted_cisa_rep_name }} + {% else %} + No + {% endif %} +
+ +

Anything else

+
    + {% if DomainRequest.anything_else %} + {{DomainRequest.anything_else}} + {% else %} + No + {% endif %} +
+ {% endif %} + {% endwith %} + {% endblock request_summary %} +
+
\ No newline at end of file diff --git a/src/registrar/templates/includes/domain_request_status_view.html b/src/registrar/templates/includes/domain_request_status_view.html new file mode 100644 index 000000000..244842321 --- /dev/null +++ b/src/registrar/templates/includes/domain_request_status_view.html @@ -0,0 +1,7 @@ +{% extends 'includes/domain_request_status_manage.html' %} +{% load custom_filters %} +{% load static url_helpers %} + +{% comment %} Do not show the withdraw button {% endcomment %} +{% block modify_request %} +{% endblock modify_request %} \ No newline at end of file diff --git a/src/registrar/templates/includes/organization_address.html b/src/registrar/templates/includes/organization_address.html index c0baf3c9f..720700e81 100644 --- a/src/registrar/templates/includes/organization_address.html +++ b/src/registrar/templates/includes/organization_address.html @@ -1,3 +1,4 @@ +{% if organization.is_organization_name_and_address_complete %}
{% if organization.federal_agency %} {{ organization.federal_agency }}
@@ -25,4 +26,11 @@ {% if organization.urbanization %}
{{ organization.urbanization }} {% endif %} -
\ No newline at end of file + +{% else %} + {% if custom_text_for_value_none %} + {{ custom_text_for_value_none }} + {% else %} + None + {% endif %} +{% endif %} \ No newline at end of file diff --git a/src/registrar/templates/includes/summary_item.html b/src/registrar/templates/includes/summary_item.html index f69bbaf96..bde83db8c 100644 --- a/src/registrar/templates/includes/summary_item.html +++ b/src/registrar/templates/includes/summary_item.html @@ -43,7 +43,7 @@ {% endfor %} {% elif custom_text_for_value_none %} -

+

{{ custom_text_for_value_none }}

{% else %} @@ -96,15 +96,18 @@ {% endif %} {% else %} -

{% if value %} - {{ value }} +

+ {{ value }} +

{% elif custom_text_for_value_none %} +

+ {{ value }} +

{{ custom_text_for_value_none }} {% else %} None {% endif %} -

{% endif %} diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 5fed89215..b2b65a5b4 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -749,6 +749,38 @@ class Finished(DomainRequestWizard): class DomainRequestStatus(DomainRequestPermissionView): template_name = "domain_request_status.html" + def has_permission(self): + """ + Override of the base has_permission class to account for portfolio permissions + """ + has_base_perms = super().has_permission() + if not has_base_perms: + return False + + if self.request.user.is_org_user(self.request): + portfolio = self.request.session.get("portfolio") + if not self.request.user.has_edit_request_portfolio_permission(portfolio): + return False + + return True + + +class DomainRequestStatusViewOnly(DomainRequestPermissionView): + template_name = "domain_request_status_viewonly.html" + def has_permission(self): + """ + Override of the base has_permission class to account for portfolio permissions + """ + has_base_perms = super().has_permission() + if not has_base_perms: + return False + + if self.request.user.is_org_user(self.request): + portfolio = self.request.session.get("portfolio") + if not self.request.user.has_view_all_requests_portfolio_permission(portfolio): + return False + + return True class DomainRequestWithdrawConfirmation(DomainRequestPermissionWithdrawView): diff --git a/src/registrar/views/domain_requests_json.py b/src/registrar/views/domain_requests_json.py index bc880cdaf..840a67f73 100644 --- a/src/registrar/views/domain_requests_json.py +++ b/src/registrar/views/domain_requests_json.py @@ -121,7 +121,7 @@ def serialize_domain_request(request, domain_request, user): action_url_map = { "Edit": reverse("edit-domain-request", kwargs={"id": domain_request.id}), "Manage": reverse("domain-request-status", kwargs={"pk": domain_request.id}), - "View": "#", + "View": reverse("domain-request-status-viewonly", kwargs={"pk": domain_request.id}), } svg_icon_map = {"Edit": "edit", "Manage": "settings", "View": "visibility"} From 2e53ba8c51ff3caa6ef9a3681ec2de87cd8f597e Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 18 Sep 2024 13:22:44 -0600 Subject: [PATCH 02/17] permissions --- .../domain_request_status_manage.html | 34 ++++++++++++++++--- .../includes/domain_request_status_view.html | 2 +- src/registrar/views/domain_request.py | 17 ++-------- src/registrar/views/utility/__init__.py | 1 + src/registrar/views/utility/mixins.py | 23 +++++++++++++ .../views/utility/permission_views.py | 20 +++++++++++ 6 files changed, 76 insertions(+), 21 deletions(-) diff --git a/src/registrar/templates/includes/domain_request_status_manage.html b/src/registrar/templates/includes/domain_request_status_manage.html index b1edebe6c..94b35fe9b 100644 --- a/src/registrar/templates/includes/domain_request_status_manage.html +++ b/src/registrar/templates/includes/domain_request_status_manage.html @@ -29,7 +29,11 @@ {% endblock breadcrumb %} {% block header %} -

Domain request for {{ DomainRequest.requested_domain.name }}

+ {% if not DomainRequest.requested_domain and DomainRequest.status == DomainRequest.DomainRequestStatus.STARTED %} +

New domain request

+ {% else %} +

{{ DomainRequest.requested_domain.name }}

+ {% endif %} {% endblock header %} {% block status_summary %} @@ -50,6 +54,21 @@
+ {% endblock status_summary %} + + {% block status_metadata %} + + {% if portfolio %} + {% if DomainRequest.creator %} +

+ Created by: {{DomainRequest.creator.email|default:DomainRequest.creator.get_formatted_name }} +

+ {% else %} +

+ No creator found: this is an error, please email help@get.gov. +

+ {% endif %} + {% endif %} {% with statuses=DomainRequest.DomainRequestStatus last_submitted=DomainRequest.last_submitted_date|date:"F j, Y" first_submitted=DomainRequest.first_submitted_date|date:"F j, Y" last_status_update=DomainRequest.last_status_update|date:"F j, Y" %} {% comment %} @@ -103,13 +122,18 @@

{% endif %} {% endwith %} - {% endblock status_summary %} + {% endblock status_metadata %} + + {% block status_blurb %} + {% if DomainRequest.status == 'submitted' %} +

{% include "includes/domain_request.html" %}

+ {% endif %} + {% endblock status_blurb %} {% block modify_request %} - {% if DomainRequest.status != 'rejected' %} -

{% include "includes/domain_request.html" %}

+ {% if DomainRequest.status != 'withdrawn' or DomainRequest.status != 'rejected' %}

- Withdraw request + Withdraw request

{% endif %} {% endblock modify_request %} diff --git a/src/registrar/templates/includes/domain_request_status_view.html b/src/registrar/templates/includes/domain_request_status_view.html index 244842321..16e499549 100644 --- a/src/registrar/templates/includes/domain_request_status_view.html +++ b/src/registrar/templates/includes/domain_request_status_view.html @@ -4,4 +4,4 @@ {% comment %} Do not show the withdraw button {% endcomment %} {% block modify_request %} -{% endblock modify_request %} \ No newline at end of file +{% endblock modify_request %} diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index b2b65a5b4..469310850 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -20,6 +20,7 @@ from .utility import ( DomainRequestPermissionView, DomainRequestPermissionWithdrawView, DomainRequestWizardPermissionView, + DomainRequestPortfolioViewonlyView, ) logger = logging.getLogger(__name__) @@ -765,22 +766,8 @@ class DomainRequestStatus(DomainRequestPermissionView): return True -class DomainRequestStatusViewOnly(DomainRequestPermissionView): +class DomainRequestStatusViewOnly(DomainRequestPortfolioViewonlyView): template_name = "domain_request_status_viewonly.html" - def has_permission(self): - """ - Override of the base has_permission class to account for portfolio permissions - """ - has_base_perms = super().has_permission() - if not has_base_perms: - return False - - if self.request.user.is_org_user(self.request): - portfolio = self.request.session.get("portfolio") - if not self.request.user.has_view_all_requests_portfolio_permission(portfolio): - return False - - return True class DomainRequestWithdrawConfirmation(DomainRequestPermissionWithdrawView): diff --git a/src/registrar/views/utility/__init__.py b/src/registrar/views/utility/__init__.py index 7e4e19085..bb135b3d3 100644 --- a/src/registrar/views/utility/__init__.py +++ b/src/registrar/views/utility/__init__.py @@ -8,5 +8,6 @@ from .permission_views import ( DomainInvitationPermissionDeleteView, DomainRequestWizardPermissionView, PortfolioMembersPermission, + DomainRequestPortfolioViewonlyView, ) from .api_views import get_senior_official_from_federal_agency_json diff --git a/src/registrar/views/utility/mixins.py b/src/registrar/views/utility/mixins.py index 4552008de..d8c48e01e 100644 --- a/src/registrar/views/utility/mixins.py +++ b/src/registrar/views/utility/mixins.py @@ -289,6 +289,29 @@ class DomainRequestPermission(PermissionsLoginMixin): return True +class DomainRequestPortfolioViewonlyPermission(PermissionsLoginMixin): + """Permission mixin that redirects to domain request if user + has access, otherwise 403""" + + def has_permission(self): + """Check if this user has access to this domain request. + + The user is in self.request.user and the domain needs to be looked + up from the domain's primary key in self.kwargs["pk"] + """ + if not self.request.user.is_authenticated: + return False + + if not self.request.user.is_org_user(self.request): + return False + + portfolio = self.request.session.get("portfolio") + if not self.request.user.has_view_all_requests_portfolio_permission(portfolio): + return False + + return True + + class UserDeleteDomainRolePermission(PermissionsLoginMixin): """Permission mixin for UserDomainRole if user has access, otherwise 403""" diff --git a/src/registrar/views/utility/permission_views.py b/src/registrar/views/utility/permission_views.py index e7031cf0d..414e58275 100644 --- a/src/registrar/views/utility/permission_views.py +++ b/src/registrar/views/utility/permission_views.py @@ -19,6 +19,7 @@ from .mixins import ( UserProfilePermission, PortfolioBasePermission, PortfolioMembersPermission, + DomainRequestPortfolioViewonlyPermission, ) import logging @@ -100,6 +101,25 @@ class DomainRequestPermissionView(DomainRequestPermission, DetailView, abc.ABC): raise NotImplementedError +class DomainRequestPortfolioViewonlyView(DomainRequestPortfolioViewonlyPermission, DetailView, abc.ABC): + """Abstract base view for domain requests that enforces permissions + + This abstract view cannot be instantiated. Actual views must specify + `template_name`. + """ + + # DetailView property for what model this is viewing + model = DomainRequest + # variable name in template context for the model object + context_object_name = "DomainRequest" + + # Abstract property enforces NotImplementedError on an attribute. + @property + @abc.abstractmethod + def template_name(self): + raise NotImplementedError + + class DomainRequestPermissionWithdrawView(DomainRequestPermissionWithdraw, DetailView, abc.ABC): """Abstract base view for domain request withdraw function From 732c982caa9635d5e084f1f9c6e0f636b7d6aa24 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 18 Sep 2024 15:06:42 -0600 Subject: [PATCH 03/17] incomplete logic --- src/registrar/assets/sass/_theme/_base.scss | 3 ++- src/registrar/templates/includes/contact.html | 4 +++- .../templates/includes/domain_request_status_manage.html | 4 ++-- .../templates/includes/organization_address.html | 4 +++- src/registrar/templates/includes/summary_item.html | 9 ++++----- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/registrar/assets/sass/_theme/_base.scss b/src/registrar/assets/sass/_theme/_base.scss index a6132312d..b55f49f15 100644 --- a/src/registrar/assets/sass/_theme/_base.scss +++ b/src/registrar/assets/sass/_theme/_base.scss @@ -226,6 +226,7 @@ abbr[title] { word-break: break-word; } -.dhs-red-50 { +.red-incomplete-text { color: $dhs-red-50; + font-weight: bold; } diff --git a/src/registrar/templates/includes/contact.html b/src/registrar/templates/includes/contact.html index 9cd1f8dd3..20c15a35f 100644 --- a/src/registrar/templates/includes/contact.html +++ b/src/registrar/templates/includes/contact.html @@ -7,7 +7,9 @@ {% else %} {% if custom_text_for_value_none %} - {{ custom_text_for_value_none }} +

+ {{ custom_text_for_value_none }} +

{% else %} None {% endif %} diff --git a/src/registrar/templates/includes/domain_request_status_manage.html b/src/registrar/templates/includes/domain_request_status_manage.html index 94b35fe9b..714d4bdb3 100644 --- a/src/registrar/templates/includes/domain_request_status_manage.html +++ b/src/registrar/templates/includes/domain_request_status_manage.html @@ -131,7 +131,7 @@ {% endblock status_blurb %} {% block modify_request %} - {% if DomainRequest.status != 'withdrawn' or DomainRequest.status != 'rejected' %} + {% if DomainRequest.status != "started" and DomainRequest.status != 'withdrawn' and DomainRequest.status != 'rejected' %}

Withdraw request

@@ -147,7 +147,7 @@ {% block request_summary %} {% with heading_level='h3' %} {% with org_type=DomainRequest.get_generic_org_type_display %} - {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level %} + {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level custom_text_for_value_none="Incomplete" %} {% endwith %} {% if DomainRequest.show_tribal_government %} diff --git a/src/registrar/templates/includes/organization_address.html b/src/registrar/templates/includes/organization_address.html index 720700e81..2647d5bd1 100644 --- a/src/registrar/templates/includes/organization_address.html +++ b/src/registrar/templates/includes/organization_address.html @@ -29,7 +29,9 @@ {% else %} {% if custom_text_for_value_none %} - {{ custom_text_for_value_none }} +

+ {{ custom_text_for_value_none }} +

{% else %} None {% endif %} diff --git a/src/registrar/templates/includes/summary_item.html b/src/registrar/templates/includes/summary_item.html index bde83db8c..69065768b 100644 --- a/src/registrar/templates/includes/summary_item.html +++ b/src/registrar/templates/includes/summary_item.html @@ -43,12 +43,12 @@ {% endfor %} {% elif custom_text_for_value_none %} -

+

{{ custom_text_for_value_none }}

{% else %}

- None + None

{% endif %} {% endif %} @@ -101,10 +101,9 @@ {{ value }}

{% elif custom_text_for_value_none %} -

- {{ value }} +

+ {{ custom_text_for_value_none }}

- {{ custom_text_for_value_none }} {% else %} None {% endif %} From 81c27330b260b7fd80c1bdb99e20418ee8270eca Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:47:16 -0600 Subject: [PATCH 04/17] Consolidate checks on withdrawable and awaiting review --- src/registrar/models/domain_request.py | 27 +++++++++++++++++++ ...ml => domain_request_awaiting_review.html} | 4 ++- .../domain_request_status_manage.html | 6 ++--- .../includes/domain_request_status_view.html | 9 ++++++- src/registrar/tests/test_models.py | 4 +-- src/registrar/views/domain_request.py | 1 + 6 files changed, 44 insertions(+), 7 deletions(-) rename src/registrar/templates/includes/{domain_request.html => domain_request_awaiting_review.html} (71%) diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index 39cf9e5fb..e19eb21e1 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -50,6 +50,25 @@ class DomainRequest(TimeStampedModel): def get_status_label(cls, status_name: str): """Returns the associated label for a given status name""" return cls(status_name).label if status_name else None + + @classmethod + def statuses_awaiting_review(cls): + """Returns all statuses that are awaiting a review from analysts""" + return [ + cls.SUBMITTED, + cls.IN_REVIEW + ] + + # TODO - a better approach might be to just grab the value of source? + # How?? + @classmethod + def withdrawable_statuses(cls): + """Returns all statuses that are withdrawable""" + return [ + cls.SUBMITTED, + cls.IN_REVIEW, + cls.ACTION_NEEDED + ] class StateTerritoryChoices(models.TextChoices): ALABAMA = "AL", "Alabama (AL)" @@ -583,6 +602,14 @@ class DomainRequest(TimeStampedModel): blank=True, ) + def is_awaiting_review(self) -> bool: + """Checks if the current status is in submitted or in_review""" + return self.status in DomainRequest.DomainRequestStatus.statuses_awaiting_review() + + def is_withdrawable(self): + """Helper function that determines if the request can be withdrawn in its current status""" + return self.status in DomainRequest.DomainRequestStatus.withdrawable_statuses() + def get_first_status_set_date(self, status): """Returns the date when the domain request was first set to the given status.""" log_entry = ( diff --git a/src/registrar/templates/includes/domain_request.html b/src/registrar/templates/includes/domain_request_awaiting_review.html similarity index 71% rename from src/registrar/templates/includes/domain_request.html rename to src/registrar/templates/includes/domain_request_awaiting_review.html index 0e377f35c..6c9305c18 100644 --- a/src/registrar/templates/includes/domain_request.html +++ b/src/registrar/templates/includes/domain_request_awaiting_review.html @@ -9,4 +9,6 @@ Need to make changes? -

If you need to change your request you have to first withdraw it. Once you withdraw the request you can edit it and submit it again. Changing your request might add to the wait time.

+{% if show_withdraw_text %} +

If you need to change your request you have to first withdraw it. Once you withdraw the request you can edit it and submit it again. Changing your request might add to the wait time.

+{% endif %} \ No newline at end of file diff --git a/src/registrar/templates/includes/domain_request_status_manage.html b/src/registrar/templates/includes/domain_request_status_manage.html index 714d4bdb3..8db1bc258 100644 --- a/src/registrar/templates/includes/domain_request_status_manage.html +++ b/src/registrar/templates/includes/domain_request_status_manage.html @@ -125,13 +125,13 @@ {% endblock status_metadata %} {% block status_blurb %} - {% if DomainRequest.status == 'submitted' %} -

{% include "includes/domain_request.html" %}

+ {% if DomainRequest.is_withdrawable %} +

{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=True %}

{% endif %} {% endblock status_blurb %} {% block modify_request %} - {% if DomainRequest.status != "started" and DomainRequest.status != 'withdrawn' and DomainRequest.status != 'rejected' %} + {% if DomainRequest.is_withdrawable %}

Withdraw request

diff --git a/src/registrar/templates/includes/domain_request_status_view.html b/src/registrar/templates/includes/domain_request_status_view.html index 16e499549..2199a76e9 100644 --- a/src/registrar/templates/includes/domain_request_status_view.html +++ b/src/registrar/templates/includes/domain_request_status_view.html @@ -2,6 +2,13 @@ {% load custom_filters %} {% load static url_helpers %} -{% comment %} Do not show the withdraw button {% endcomment %} +{% comment %} Do not show the withdrawal text in viewonly mode {% endcomment %} +{% block status_blurb %} +{% if DomainRequest.is_awaiting_review %} +

{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=False %}

+{% endif %} +{% endblock status_blurb %} + +{% comment %} Do not show action buttons in viewonly mode {% endcomment %} {% block modify_request %} {% endblock modify_request %} diff --git a/src/registrar/tests/test_models.py b/src/registrar/tests/test_models.py index 23eff1edc..5470fbe69 100644 --- a/src/registrar/tests/test_models.py +++ b/src/registrar/tests/test_models.py @@ -2238,11 +2238,11 @@ class TestDomainRequestIncomplete(TestCase): @less_console_noise_decorator def test_is_organization_name_and_address_complete(self): - self.assertTrue(self.domain_request._is_organization_name_and_address_complete()) + self.assertTrue(self.domain_request.is_organization_name_and_address_complete()) self.domain_request.organization_name = None self.domain_request.address_line1 = None self.domain_request.save() - self.assertTrue(self.domain_request._is_organization_name_and_address_complete()) + self.assertTrue(self.domain_request.is_organization_name_and_address_complete()) @less_console_noise_decorator def test_is_senior_official_complete(self): diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 469310850..07026c72d 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -750,6 +750,7 @@ class Finished(DomainRequestWizard): class DomainRequestStatus(DomainRequestPermissionView): template_name = "domain_request_status.html" + def has_permission(self): """ Override of the base has_permission class to account for portfolio permissions From a3fa71659a783680eecdaa4575371fd7646e1168 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:10:32 -0600 Subject: [PATCH 05/17] small cleanup --- src/registrar/models/domain_request.py | 33 ++++++++----------- .../tests/test_views_requests_json.py | 4 ++- src/registrar/views/domain_request.py | 2 +- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index e19eb21e1..5c52288fa 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -50,25 +50,11 @@ class DomainRequest(TimeStampedModel): def get_status_label(cls, status_name: str): """Returns the associated label for a given status name""" return cls(status_name).label if status_name else None - + @classmethod def statuses_awaiting_review(cls): """Returns all statuses that are awaiting a review from analysts""" - return [ - cls.SUBMITTED, - cls.IN_REVIEW - ] - - # TODO - a better approach might be to just grab the value of source? - # How?? - @classmethod - def withdrawable_statuses(cls): - """Returns all statuses that are withdrawable""" - return [ - cls.SUBMITTED, - cls.IN_REVIEW, - cls.ACTION_NEEDED - ] + return [cls.SUBMITTED, cls.IN_REVIEW] class StateTerritoryChoices(models.TextChoices): ALABAMA = "AL", "Alabama (AL)" @@ -606,10 +592,6 @@ class DomainRequest(TimeStampedModel): """Checks if the current status is in submitted or in_review""" return self.status in DomainRequest.DomainRequestStatus.statuses_awaiting_review() - def is_withdrawable(self): - """Helper function that determines if the request can be withdrawn in its current status""" - return self.status in DomainRequest.DomainRequestStatus.withdrawable_statuses() - def get_first_status_set_date(self, status): """Returns the date when the domain request was first set to the given status.""" log_entry = ( @@ -1028,6 +1010,17 @@ class DomainRequest(TimeStampedModel): send_email=send_email, ) + def is_withdrawable(self): + """Helper function that determines if the request can be withdrawn in its current status""" + # This list is equivalent to the source field on withdraw. We need a better way to + # consolidate these two lists - i.e. some sort of method that keeps these two lists in sync. + # django fsm is very picky with what we can define in that field. + return self.status in [ + self.DomainRequestStatus.SUBMITTED, + self.DomainRequestStatus.IN_REVIEW, + self.DomainRequestStatus.ACTION_NEEDED, + ] + @transition( field="status", source=[DomainRequestStatus.SUBMITTED, DomainRequestStatus.IN_REVIEW, DomainRequestStatus.ACTION_NEEDED], diff --git a/src/registrar/tests/test_views_requests_json.py b/src/registrar/tests/test_views_requests_json.py index c6eb8a1dc..28e2a9407 100644 --- a/src/registrar/tests/test_views_requests_json.py +++ b/src/registrar/tests/test_views_requests_json.py @@ -341,7 +341,9 @@ class GetRequestsJsonTest(TestWithUser, WebTest): if creator[i] != self.user.email: # Test case where action is View self.assertEqual("View", action_labels[i]) - self.assertEqual("#", action_urls[i]) + self.assertEqual( + reverse("domain-request-status-viewonly", kwargs={"pk": expected_domain_request.id}), action_urls[i] + ) self.assertEqual("visibility", svg_icons[i]) elif status[i] in [ DomainRequest.DomainRequestStatus.STARTED.label, diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 07026c72d..06c0a7fc7 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -758,7 +758,7 @@ class DomainRequestStatus(DomainRequestPermissionView): has_base_perms = super().has_permission() if not has_base_perms: return False - + if self.request.user.is_org_user(self.request): portfolio = self.request.session.get("portfolio") if not self.request.user.has_edit_request_portfolio_permission(portfolio): From fac35748cc0c39fd149b3b2f6b5eb280d768c2c3 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:30:14 -0600 Subject: [PATCH 06/17] cleanup pt 2 --- src/registrar/models/domain_request.py | 7 +------ .../templates/includes/domain_request_status_manage.html | 6 +++--- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index 5c52288fa..0cd84fb11 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -51,11 +51,6 @@ class DomainRequest(TimeStampedModel): """Returns the associated label for a given status name""" return cls(status_name).label if status_name else None - @classmethod - def statuses_awaiting_review(cls): - """Returns all statuses that are awaiting a review from analysts""" - return [cls.SUBMITTED, cls.IN_REVIEW] - class StateTerritoryChoices(models.TextChoices): ALABAMA = "AL", "Alabama (AL)" ALASKA = "AK", "Alaska (AK)" @@ -590,7 +585,7 @@ class DomainRequest(TimeStampedModel): def is_awaiting_review(self) -> bool: """Checks if the current status is in submitted or in_review""" - return self.status in DomainRequest.DomainRequestStatus.statuses_awaiting_review() + return self.status in [self.DomainRequestStatus.SUBMITTED, self.DomainRequestStatus.IN_REVIEW] def get_first_status_set_date(self, status): """Returns the date when the domain request was first set to the given status.""" diff --git a/src/registrar/templates/includes/domain_request_status_manage.html b/src/registrar/templates/includes/domain_request_status_manage.html index 8db1bc258..75a5ef4ae 100644 --- a/src/registrar/templates/includes/domain_request_status_manage.html +++ b/src/registrar/templates/includes/domain_request_status_manage.html @@ -32,7 +32,7 @@ {% if not DomainRequest.requested_domain and DomainRequest.status == DomainRequest.DomainRequestStatus.STARTED %}

New domain request

{% else %} -

{{ DomainRequest.requested_domain.name }}

+

Domain request for {{ DomainRequest.requested_domain.name }}

{% endif %} {% endblock header %} @@ -125,8 +125,8 @@ {% endblock status_metadata %} {% block status_blurb %} - {% if DomainRequest.is_withdrawable %} -

{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=True %}

+ {% if DomainRequest.is_awaiting_review %} +

{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=DomainRequest.is_withdrawable %}

{% endif %} {% endblock status_blurb %} From 3127f64183e03aaac4f3d82289a43451ce969038 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 19 Sep 2024 13:23:11 -0600 Subject: [PATCH 07/17] Use old manage logic for status summary --- .../domain_request_status_manage.html | 104 ++++++++++-------- .../includes/domain_request_status_view.html | 75 +++++++++++++ 2 files changed, 134 insertions(+), 45 deletions(-) diff --git a/src/registrar/templates/includes/domain_request_status_manage.html b/src/registrar/templates/includes/domain_request_status_manage.html index 75a5ef4ae..2a254df4b 100644 --- a/src/registrar/templates/includes/domain_request_status_manage.html +++ b/src/registrar/templates/includes/domain_request_status_manage.html @@ -147,76 +147,90 @@ {% block request_summary %} {% with heading_level='h3' %} {% with org_type=DomainRequest.get_generic_org_type_display %} - {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level %} {% endwith %} - {% if DomainRequest.show_tribal_government %} - {% include "includes/summary_item.html" with title='Tribal government' value=DomainRequest.tribe_name heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% if DomainRequest.tribe_name %} + {% include "includes/summary_item.html" with title='Tribal government' value=DomainRequest.tribe_name heading_level=heading_level %} + + {% if DomainRequest.federally_recognized_tribe %} +

Federally-recognized tribe

+ {% endif %} + + {% if DomainRequest.state_recognized_tribe %} +

State-recognized tribe

+ {% endif %} - {% if DomainRequest.federally_recognized_tribe %} -

Federally-recognized tribe

- {% endif %} - - {% if DomainRequest.state_recognized_tribe %} -

State-recognized tribe

- {% endif %} {% endif %} - {% if DomainRequest.show_organization_federal %} - {% include "includes/summary_item.html" with title='Federal government branch' value=DomainRequest.get_federal_type_display heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% if DomainRequest.get_federal_type_display %} + {% include "includes/summary_item.html" with title='Federal government branch' value=DomainRequest.get_federal_type_display heading_level=heading_level %} {% endif %} - {% if DomainRequest.show_organization_election %} - {% with value=DomainRequest.is_election_board|yesno:"Yes,No,Incomplete" %} - {% include "includes/summary_item.html" with title='Election office' value=value heading_level=heading_level %} - {% endwith %} + {% if DomainRequest.is_election_board %} + {% with value=DomainRequest.is_election_board|yesno:"Yes,No,Incomplete" %} + {% include "includes/summary_item.html" with title='Election office' value=value heading_level=heading_level %} + {% endwith %} {% endif %} - {% if not portfolio %} - {% include "includes/summary_item.html" with title='Organization name and mailing address' value=DomainRequest address='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% if DomainRequest.organization_name %} + {% include "includes/summary_item.html" with title='Organization' value=DomainRequest address='true' heading_level=heading_level %} {% endif %} - {% if DomainRequest.show_about_your_organization %} - {% include "includes/summary_item.html" with title='About your organization' value=DomainRequest.about_your_organization heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% if DomainRequest.about_your_organization %} + {% include "includes/summary_item.html" with title='About your organization' value=DomainRequest.about_your_organization heading_level=heading_level %} {% endif %} - {% include "includes/summary_item.html" with title='Senior official' value=DomainRequest.senior_official contact='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% if DomainRequest.senior_official %} + {% include "includes/summary_item.html" with title='Senior official' value=DomainRequest.senior_official contact='true' heading_level=heading_level %} + {% endif %} - {% include "includes/summary_item.html" with title='Current websites' value=DomainRequest.current_websites.all list='true' heading_level=heading_level %} + {% if DomainRequest.current_websites.all %} + {% include "includes/summary_item.html" with title='Current websites' value=DomainRequest.current_websites.all list='true' heading_level=heading_level %} + {% endif %} - {% include "includes/summary_item.html" with title='.gov domain' value=DomainRequest.requested_domain heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% if DomainRequest.requested_domain %} + {% include "includes/summary_item.html" with title='.gov domain' value=DomainRequest.requested_domain heading_level=heading_level %} + {% endif %} - {% include "includes/summary_item.html" with title='Alternative domains' value=DomainRequest.alternative_domains.all list='true' heading_level=heading_level %} + {% if DomainRequest.alternative_domains.all %} + {% include "includes/summary_item.html" with title='Alternative domains' value=DomainRequest.alternative_domains.all list='true' heading_level=heading_level %} + {% endif %} - {% include "includes/summary_item.html" with title='Purpose of your domain' value=DomainRequest.purpose heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% if DomainRequest.purpose %} + {% include "includes/summary_item.html" with title='Purpose of your domain' value=DomainRequest.purpose heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.creator %} + {% include "includes/summary_item.html" with title='Your contact information' value=DomainRequest.creator contact='true' heading_level=heading_level %} + {% endif %} {% if DomainRequest.other_contacts.all %} - {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.other_contacts.all contact='true' list='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.other_contacts.all contact='true' list='true' heading_level=heading_level %} {% else %} - {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.no_other_contacts_rationale heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.no_other_contacts_rationale heading_level=heading_level %} {% endif %} {# We always show this field even if None #} {% if DomainRequest %} -

CISA Regional Representative

- - -

Anything else

- +

CISA Regional Representative

+ +

Anything else

+ {% endif %} {% endwith %} - {% endblock request_summary %} + {% endblock request_summary%} \ No newline at end of file diff --git a/src/registrar/templates/includes/domain_request_status_view.html b/src/registrar/templates/includes/domain_request_status_view.html index 2199a76e9..22365e06e 100644 --- a/src/registrar/templates/includes/domain_request_status_view.html +++ b/src/registrar/templates/includes/domain_request_status_view.html @@ -12,3 +12,78 @@ {% comment %} Do not show action buttons in viewonly mode {% endcomment %} {% block modify_request %} {% endblock modify_request %} + + +{% block request_summary %} + {% with heading_level='h3' org_type=DomainRequest.get_generic_org_type_display %} + + {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% if DomainRequest.show_tribal_government %} + {% include "includes/summary_item.html" with title='Tribal government' value=DomainRequest.tribe_name heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% if DomainRequest.federally_recognized_tribe %} +

Federally-recognized tribe

+ {% endif %} + + {% if DomainRequest.state_recognized_tribe %} +

State-recognized tribe

+ {% endif %} + {% endif %} + + {% if DomainRequest.show_organization_federal %} + {% include "includes/summary_item.html" with title='Federal government branch' value=DomainRequest.get_federal_type_display heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% endif %} + + {% if DomainRequest.show_organization_election %} + {% with value=DomainRequest.is_election_board|yesno:"Yes,No,Incomplete" %} + {% include "includes/summary_item.html" with title='Election office' value=value heading_level=heading_level %} + {% endwith %} + {% endif %} + + {% if not portfolio %} + {% include "includes/summary_item.html" with title='Organization' value=DomainRequest address='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% endif %} + + {% if DomainRequest.show_about_your_organization %} + {% include "includes/summary_item.html" with title='About your organization' value=DomainRequest.about_your_organization heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% endif %} + + {% include "includes/summary_item.html" with title='Senior official' value=DomainRequest.senior_official contact='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% include "includes/summary_item.html" with title='Current websites' value=DomainRequest.current_websites.all list='true' heading_level=heading_level %} + + {% include "includes/summary_item.html" with title='.gov domain' value=DomainRequest.requested_domain heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% include "includes/summary_item.html" with title='Alternative domains' value=DomainRequest.alternative_domains.all list='true' heading_level=heading_level %} + + {% include "includes/summary_item.html" with title='Purpose of your domain' value=DomainRequest.purpose heading_level=heading_level custom_text_for_value_none="Incomplete" %} + + {% if DomainRequest.other_contacts.all %} + {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.other_contacts.all contact='true' list='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% else %} + {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.no_other_contacts_rationale heading_level=heading_level custom_text_for_value_none="Incomplete" %} + {% endif %} + + {# We always show this field even if None #} + {% if DomainRequest %} +

CISA Regional Representative

+ + +

Anything else

+ + {% endif %} + {% endwith %} +{% endblock request_summary %} From a70d9d300d298acca8ac7297ccba26eab310c69d Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:12:29 -0600 Subject: [PATCH 08/17] Use domain request wizard instead This is a much better solution as we need to use this in the request experience anyway. This works towards that, but requires a bit of a refactor. --- .../forms/utility/wizard_form_helper.py | 15 +- .../templates/domain_request_review.html | 184 +----------------- .../includes/domain_request_review_steps.html | 168 ++++++++++++++++ .../includes/domain_request_status_view.html | 72 +------ ...portfolio_domain_request_review_steps.html | 86 ++++++++ src/registrar/utility/enums.py | 31 ++- src/registrar/views/domain_request.py | 65 +++---- 7 files changed, 335 insertions(+), 286 deletions(-) create mode 100644 src/registrar/templates/includes/domain_request_review_steps.html create mode 100644 src/registrar/templates/includes/portfolio_domain_request_review_steps.html diff --git a/src/registrar/forms/utility/wizard_form_helper.py b/src/registrar/forms/utility/wizard_form_helper.py index 2ae50f908..e1f7cf94c 100644 --- a/src/registrar/forms/utility/wizard_form_helper.py +++ b/src/registrar/forms/utility/wizard_form_helper.py @@ -4,7 +4,7 @@ from itertools import zip_longest from typing import Callable from django.db.models.fields.related import ForeignObjectRel from django import forms - +from registrar.utility.enums import Step from registrar.models import DomainRequest, Contact @@ -278,3 +278,16 @@ class BaseYesNoForm(RegistrarForm): # No pre-selection for new domain requests initial_value = self.form_is_checked if self.domain_request else None return initial_value + + +def request_step_list(request_wizard): + """Dynamically generated list of steps in the form wizard.""" + step_list = [] + for step in Step: + condition = request_wizard.WIZARD_CONDITIONS.get(step, True) + if callable(condition): + condition = condition(request_wizard) + if condition: + step_list.append(step) + return step_list + diff --git a/src/registrar/templates/domain_request_review.html b/src/registrar/templates/domain_request_review.html index ced20b6b7..f664a3c90 100644 --- a/src/registrar/templates/domain_request_review.html +++ b/src/registrar/templates/domain_request_review.html @@ -19,183 +19,9 @@ {% endblock %} {% block form_fields %} - {% for step in steps.all|slice:":-1" %} -
- - {% if step == Step.ORGANIZATION_TYPE %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% if domain_request.generic_org_type is not None %} - {% with title=form_titles|get_item:step value=domain_request.get_generic_org_type_display|default:"Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% else %} - {% with title=form_titles|get_item:step value="Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - {% endif %} - - {% if step == Step.TRIBAL_GOVERNMENT %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% with title=form_titles|get_item:step value=domain_request.tribe_name|default:"Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% if domain_request.federally_recognized_tribe %}

Federally-recognized tribe

{% endif %} - {% if domain_request.state_recognized_tribe %}

State-recognized tribe

{% endif %} - {% endif %} - - - {% if step == Step.ORGANIZATION_FEDERAL %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% with title=form_titles|get_item:step value=domain_request.get_federal_type_display|default:"Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - - {% if step == Step.ORGANIZATION_ELECTION %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% with title=form_titles|get_item:step value=domain_request.is_election_board|yesno:"Yes,No,Incomplete" %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - - {% if step == Step.ORGANIZATION_CONTACT %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% if domain_request.organization_name %} - {% with title=form_titles|get_item:step value=domain_request %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url address='true' %} - {% endwith %} - {% else %} - {% with title=form_titles|get_item:step value="Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - {% endif %} - - {% if step == Step.ABOUT_YOUR_ORGANIZATION %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% with title=form_titles|get_item:step value=domain_request.about_your_organization|default:"Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - - {% if step == Step.SENIOR_OFFICIAL %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% if domain_request.senior_official is not None %} - {% with title=form_titles|get_item:step value=domain_request.senior_official %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url contact='true' %} - {% endwith %} - {% else %} - {% with title=form_titles|get_item:step value="Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - {% endif %} - - {% if step == Step.CURRENT_SITES %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% if domain_request.current_websites.all %} - {% with title=form_titles|get_item:step value=domain_request.current_websites.all %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url list='true' %} - {% endwith %} - {% else %} - {% with title=form_titles|get_item:step value='None' %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - {% endif %} - - {% if step == Step.DOTGOV_DOMAIN %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% with title=form_titles|get_item:step value=domain_request.requested_domain.name|default:"Incomplete"|safe%} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - - {% if domain_request.alternative_domains.all %} -

Alternative domains

-
    - {% for site in domain_request.alternative_domains.all %} -
  • {{ site.website }}
  • - {% endfor %} -
- {% endif %} - {% endif %} - - {% if step == Step.PURPOSE %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% with title=form_titles|get_item:step value=domain_request.purpose|default:"Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - - {% if step == Step.YOUR_CONTACT %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% if domain_request.creator is not None %} - {% with title=form_titles|get_item:step value=domain_request.creator %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url contact='true' %} - {% endwith %} - {% else %} - {% with title=form_titles|get_item:step value="Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - {% endif %} - - {% if step == Step.OTHER_CONTACTS %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% if domain_request.other_contacts.all %} - {% with title=form_titles|get_item:step value=domain_request.other_contacts.all %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url contact='true' list='true' %} - {% endwith %} - {% else %} - {% with title=form_titles|get_item:step value=domain_request.no_other_contacts_rationale|default:"Incomplete"|safe %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - {% endif %} - - - {% if step == Step.ADDITIONAL_DETAILS %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% with title=form_titles|get_item:step %} - {% if domain_request.has_additional_details %} - {% include "includes/summary_item.html" with title="Additional Details" value=" " heading_level=heading_level editable=True edit_link=domain_request_url %} -

CISA Regional Representative

-
    - {% if domain_request.cisa_representative_first_name %} -
  • {{domain_request.cisa_representative_first_name}} {{domain_request.cisa_representative_last_name}}
  • - {% if domain_request.cisa_representative_email %} -
  • {{domain_request.cisa_representative_email}}
  • - {% endif %} - {% else %} - No - {% endif %} -
- -

Anything else

-
    - {% if domain_request.anything_else %} - {{domain_request.anything_else}} - {% else %} - No - {% endif %} -
- {% else %} - {% include "includes/summary_item.html" with title="Additional Details" value="Incomplete"|safe heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endif %} - {% endwith %} - {% endif %} - - - {% if step == Step.REQUIREMENTS %} - {% namespaced_url 'domain-request' step as domain_request_url %} - {% with title=form_titles|get_item:step value=domain_request.is_policy_acknowledged|yesno:"I agree.,I do not agree.,I do not agree." %} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=True edit_link=domain_request_url %} - {% endwith %} - {% endif %} - - - -
- {% endfor %} + {% if not portfolio %} + {% include "includes/domain_request_review_steps.html" with is_editable=True %} + {% else %} + {% include "includes/portfolio_domain_request_review_steps.html" with is_editable=True %} + {% endif %} {% endblock %} diff --git a/src/registrar/templates/includes/domain_request_review_steps.html b/src/registrar/templates/includes/domain_request_review_steps.html new file mode 100644 index 000000000..d292f61a9 --- /dev/null +++ b/src/registrar/templates/includes/domain_request_review_steps.html @@ -0,0 +1,168 @@ +{% load custom_filters %} +{% load static url_helpers %} + +{% for step in steps %} +
+ {% if is_editable %} + {% namespaced_url 'domain-request' step as domain_request_url %} + {% endif %} + + {% if step == Step.ORGANIZATION_TYPE %} + {% if domain_request.generic_org_type is not None %} + {% with title=form_titles|get_item:step value=domain_request.get_generic_org_type_display|default:"Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% else %} + {% with title=form_titles|get_item:step value="Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + {% endif %} + + {% if step == Step.TRIBAL_GOVERNMENT %} + {% with title=form_titles|get_item:step value=domain_request.tribe_name|default:"Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% if domain_request.federally_recognized_tribe %}

Federally-recognized tribe

{% endif %} + {% if domain_request.state_recognized_tribe %}

State-recognized tribe

{% endif %} + {% endif %} + + + {% if step == Step.ORGANIZATION_FEDERAL %} + {% with title=form_titles|get_item:step value=domain_request.get_federal_type_display|default:"Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + + {% if step == Step.ORGANIZATION_ELECTION %} + {% with title=form_titles|get_item:step value=domain_request.is_election_board|yesno:"Yes,No,Incomplete" %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + + {% if step == Step.ORGANIZATION_CONTACT %} + {% if domain_request.organization_name %} + {% with title=form_titles|get_item:step value=domain_request %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url address='true' %} + {% endwith %} + {% else %} + {% with title=form_titles|get_item:step value="Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + {% endif %} + + {% if step == Step.ABOUT_YOUR_ORGANIZATION %} + {% with title=form_titles|get_item:step value=domain_request.about_your_organization|default:"Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + + {% if step == Step.SENIOR_OFFICIAL %} + {% if domain_request.senior_official is not None %} + {% with title=form_titles|get_item:step value=domain_request.senior_official %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url contact='true' %} + {% endwith %} + {% else %} + {% with title=form_titles|get_item:step value="Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + {% endif %} + + {% if step == Step.CURRENT_SITES %} + {% if domain_request.current_websites.all %} + {% with title=form_titles|get_item:step value=domain_request.current_websites.all %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url list='true' %} + {% endwith %} + {% else %} + {% with title=form_titles|get_item:step value='None' %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + {% endif %} + + {% if step == Step.DOTGOV_DOMAIN %} + {% with title=form_titles|get_item:step value=domain_request.requested_domain.name|default:"Incomplete"|safe%} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + + {% if domain_request.alternative_domains.all %} +

Alternative domains

+
    + {% for site in domain_request.alternative_domains.all %} +
  • {{ site.website }}
  • + {% endfor %} +
+ {% endif %} + {% endif %} + + {% if step == Step.PURPOSE %} + {% with title=form_titles|get_item:step value=domain_request.purpose|default:"Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + + {% if step == Step.YOUR_CONTACT %} + {% if domain_request.creator is not None %} + {% with title=form_titles|get_item:step value=domain_request.creator %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url contact='true' %} + {% endwith %} + {% else %} + {% with title=form_titles|get_item:step value="Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + {% endif %} + + {% if step == Step.OTHER_CONTACTS %} + {% if domain_request.other_contacts.all %} + {% with title=form_titles|get_item:step value=domain_request.other_contacts.all %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url contact='true' list='true' %} + {% endwith %} + {% else %} + {% with title=form_titles|get_item:step value=domain_request.no_other_contacts_rationale|default:"Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + {% endif %} + + + {% if step == Step.ADDITIONAL_DETAILS %} + {% with title=form_titles|get_item:step %} + {% if domain_request.has_additional_details %} + {% include "includes/summary_item.html" with title="Additional Details" value=" " heading_level=heading_level editable=is_editable edit_link=domain_request_url %} +

CISA Regional Representative

+
    + {% if domain_request.cisa_representative_first_name %} +
  • {{domain_request.cisa_representative_first_name}} {{domain_request.cisa_representative_last_name}}
  • + {% if domain_request.cisa_representative_email %} +
  • {{domain_request.cisa_representative_email}}
  • + {% endif %} + {% else %} + No + {% endif %} +
+ +

Anything else

+
    + {% if domain_request.anything_else %} + {{domain_request.anything_else}} + {% else %} + No + {% endif %} +
+ {% else %} + {% include "includes/summary_item.html" with title="Additional Details" value="Incomplete"|safe heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endif %} + {% endwith %} + {% endif %} + + + {% if step == Step.REQUIREMENTS %} + {% with title=form_titles|get_item:step value=domain_request.is_policy_acknowledged|yesno:"I agree.,I do not agree.,I do not agree." %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} +
+{% endfor %} \ No newline at end of file diff --git a/src/registrar/templates/includes/domain_request_status_view.html b/src/registrar/templates/includes/domain_request_status_view.html index 22365e06e..b94623320 100644 --- a/src/registrar/templates/includes/domain_request_status_view.html +++ b/src/registrar/templates/includes/domain_request_status_view.html @@ -15,75 +15,5 @@ {% block request_summary %} - {% with heading_level='h3' org_type=DomainRequest.get_generic_org_type_display %} - - {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level custom_text_for_value_none="Incomplete" %} - - {% if DomainRequest.show_tribal_government %} - {% include "includes/summary_item.html" with title='Tribal government' value=DomainRequest.tribe_name heading_level=heading_level custom_text_for_value_none="Incomplete" %} - - {% if DomainRequest.federally_recognized_tribe %} -

Federally-recognized tribe

- {% endif %} - - {% if DomainRequest.state_recognized_tribe %} -

State-recognized tribe

- {% endif %} - {% endif %} - - {% if DomainRequest.show_organization_federal %} - {% include "includes/summary_item.html" with title='Federal government branch' value=DomainRequest.get_federal_type_display heading_level=heading_level custom_text_for_value_none="Incomplete" %} - {% endif %} - - {% if DomainRequest.show_organization_election %} - {% with value=DomainRequest.is_election_board|yesno:"Yes,No,Incomplete" %} - {% include "includes/summary_item.html" with title='Election office' value=value heading_level=heading_level %} - {% endwith %} - {% endif %} - - {% if not portfolio %} - {% include "includes/summary_item.html" with title='Organization' value=DomainRequest address='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} - {% endif %} - - {% if DomainRequest.show_about_your_organization %} - {% include "includes/summary_item.html" with title='About your organization' value=DomainRequest.about_your_organization heading_level=heading_level custom_text_for_value_none="Incomplete" %} - {% endif %} - - {% include "includes/summary_item.html" with title='Senior official' value=DomainRequest.senior_official contact='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} - - {% include "includes/summary_item.html" with title='Current websites' value=DomainRequest.current_websites.all list='true' heading_level=heading_level %} - - {% include "includes/summary_item.html" with title='.gov domain' value=DomainRequest.requested_domain heading_level=heading_level custom_text_for_value_none="Incomplete" %} - - {% include "includes/summary_item.html" with title='Alternative domains' value=DomainRequest.alternative_domains.all list='true' heading_level=heading_level %} - - {% include "includes/summary_item.html" with title='Purpose of your domain' value=DomainRequest.purpose heading_level=heading_level custom_text_for_value_none="Incomplete" %} - - {% if DomainRequest.other_contacts.all %} - {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.other_contacts.all contact='true' list='true' heading_level=heading_level custom_text_for_value_none="Incomplete" %} - {% else %} - {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.no_other_contacts_rationale heading_level=heading_level custom_text_for_value_none="Incomplete" %} - {% endif %} - - {# We always show this field even if None #} - {% if DomainRequest %} -

CISA Regional Representative

- - -

Anything else

- - {% endif %} - {% endwith %} + {% include "includes/portfolio_domain_request_review_steps.html" with domain_request=DomainRequest is_editable=False %} {% endblock request_summary %} diff --git a/src/registrar/templates/includes/portfolio_domain_request_review_steps.html b/src/registrar/templates/includes/portfolio_domain_request_review_steps.html new file mode 100644 index 000000000..c61c09657 --- /dev/null +++ b/src/registrar/templates/includes/portfolio_domain_request_review_steps.html @@ -0,0 +1,86 @@ +{% load custom_filters %} +{% load static url_helpers %} + +{% for step in steps %} +
+ {% if is_editable %} + {% namespaced_url 'domain-request' step as domain_request_url %} + {% endif %} + + {% comment %} TODO: what is this? {% endcomment %} + {% if step == Step.REQUESTING_ENTITY %} + {% with title=form_titles|get_item:step value=domain_request.portfolio|default:"Incomplete"|safe%} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + + {% if step == Step.CURRENT_SITES %} + {% if domain_request.current_websites.all %} + {% with title=form_titles|get_item:step value=domain_request.current_websites.all %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url list='true' %} + {% endwith %} + {% else %} + {% with title=form_titles|get_item:step value='None' %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + {% endif %} + + {% if step == Step.DOTGOV_DOMAIN %} + {% with title=form_titles|get_item:step value=domain_request.requested_domain.name|default:"Incomplete"|safe%} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + + {% if domain_request.alternative_domains.all %} +

Alternative domains

+
    + {% for site in domain_request.alternative_domains.all %} +
  • {{ site.website }}
  • + {% endfor %} +
+ {% endif %} + {% endif %} + + {% if step == Step.PURPOSE %} + {% with title=form_titles|get_item:step value=domain_request.purpose|default:"Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} + + {% if step == Step.ADDITIONAL_DETAILS %} + {% with title=form_titles|get_item:step %} + {% if domain_request.has_additional_details %} + {% include "includes/summary_item.html" with title="Additional Details" value=" " heading_level=heading_level editable=is_editable edit_link=domain_request_url %} +

CISA Regional Representative

+
    + {% if domain_request.cisa_representative_first_name %} +
  • {{domain_request.cisa_representative_first_name}} {{domain_request.cisa_representative_last_name}}
  • + {% if domain_request.cisa_representative_email %} +
  • {{domain_request.cisa_representative_email}}
  • + {% endif %} + {% else %} + No + {% endif %} +
+ +

Anything else

+
    + {% if domain_request.anything_else %} + {{domain_request.anything_else}} + {% else %} + No + {% endif %} +
+ {% else %} + {% include "includes/summary_item.html" with title="Additional Details" value="Incomplete"|safe heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endif %} + {% endwith %} + {% endif %} + + {% if step == Step.REQUIREMENTS %} + {% with title=form_titles|get_item:step value=domain_request.is_policy_acknowledged|yesno:"I agree.,I do not agree.,I do not agree." %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif %} +
+{% endfor %} \ No newline at end of file diff --git a/src/registrar/utility/enums.py b/src/registrar/utility/enums.py index 706eee1fc..3cc0b2c47 100644 --- a/src/registrar/utility/enums.py +++ b/src/registrar/utility/enums.py @@ -1,7 +1,7 @@ """Used for holding various enums""" from enum import Enum - +from registrar.utility import StrEnum class ValidationReturnType(Enum): """Determines the return value of the validate_and_handle_errors class""" @@ -38,3 +38,32 @@ class DefaultEmail(Enum): PUBLIC_CONTACT_DEFAULT = "dotgov@cisa.dhs.gov" LEGACY_DEFAULT = "registrar@dotgov.gov" + + +class Step(StrEnum): + """ + Names for each page of the domain request wizard. + + As with Django's own `TextChoices` class, steps will + appear in the order they are defined. (Order matters.) + """ + # Portfolio + # TODO - this does not exist yet. + # Fill this in for the portfolio domain request experience. + REQUESTING_ENTITY = "portfolio" + + # Non-Portfolio + ORGANIZATION_TYPE = "generic_org_type" + TRIBAL_GOVERNMENT = "tribal_government" + ORGANIZATION_FEDERAL = "organization_federal" + ORGANIZATION_ELECTION = "organization_election" + ORGANIZATION_CONTACT = "organization_contact" + ABOUT_YOUR_ORGANIZATION = "about_your_organization" + SENIOR_OFFICIAL = "senior_official" + CURRENT_SITES = "current_sites" + DOTGOV_DOMAIN = "dotgov_domain" + PURPOSE = "purpose" + OTHER_CONTACTS = "other_contacts" + ADDITIONAL_DETAILS = "additional_details" + REQUIREMENTS = "requirements" + REVIEW = "review" diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 4fe59c70c..05a7e6827 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -7,14 +7,14 @@ from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django.views.generic import TemplateView from django.contrib import messages - from registrar.forms import domain_request_wizard as forms +from registrar.forms.utility.wizard_form_helper import request_step_list from registrar.models import DomainRequest from registrar.models.contact import Contact from registrar.models.user import User -from registrar.utility import StrEnum from registrar.views.utility import StepsHelper from registrar.views.utility.permission_views import DomainRequestPermissionDeleteView +from registrar.utility.enums import Step from .utility import ( DomainRequestPermissionView, @@ -26,29 +26,6 @@ from .utility import ( logger = logging.getLogger(__name__) -class Step(StrEnum): - """ - Names for each page of the domain request wizard. - - As with Django's own `TextChoices` class, steps will - appear in the order they are defined. (Order matters.) - """ - - ORGANIZATION_TYPE = "generic_org_type" - TRIBAL_GOVERNMENT = "tribal_government" - ORGANIZATION_FEDERAL = "organization_federal" - ORGANIZATION_ELECTION = "organization_election" - ORGANIZATION_CONTACT = "organization_contact" - ABOUT_YOUR_ORGANIZATION = "about_your_organization" - SENIOR_OFFICIAL = "senior_official" - CURRENT_SITES = "current_sites" - DOTGOV_DOMAIN = "dotgov_domain" - PURPOSE = "purpose" - OTHER_CONTACTS = "other_contacts" - ADDITIONAL_DETAILS = "additional_details" - REQUIREMENTS = "requirements" - REVIEW = "review" - class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): """ @@ -440,15 +417,7 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): def get_step_list(self) -> list: """Dynamically generated list of steps in the form wizard.""" - step_list = [] - for step in Step: - condition = self.WIZARD_CONDITIONS.get(step, True) - if callable(condition): - condition = condition(self) - if condition: - step_list.append(step) - - return step_list + return request_step_list(self) def goto(self, step): if step == "generic_org_type": @@ -530,6 +499,24 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): form.to_database(self.domain_request) +# TODO - this is a WIP until the domain request experience for portfolios is complete +class PortfolioDomainRequestWizard(DomainRequestWizard): + TITLES = { + Step.REQUESTING_ENTITY: _("Requesting entity"), + Step.CURRENT_SITES: _("Current websites"), + Step.DOTGOV_DOMAIN: _(".gov domain"), + Step.PURPOSE: _("Purpose of your domain"), + Step.ADDITIONAL_DETAILS: _("Additional details"), + Step.REQUIREMENTS: _("Requirements for operating a .gov domain"), + # Step.REVIEW: _("Review and submit your domain request"), + } + + def __init__(self): + super().__init__() + self.steps = StepsHelper(self) + self._domain_request = None # for caching + + class OrganizationType(DomainRequestWizard): template_name = "domain_request_org_type.html" forms = [forms.OrganizationTypeForm] @@ -770,6 +757,16 @@ class DomainRequestStatus(DomainRequestPermissionView): class DomainRequestStatusViewOnly(DomainRequestPortfolioViewonlyView): template_name = "domain_request_status_viewonly.html" + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + # Create a temp wizard object to grab the step list + wizard = PortfolioDomainRequestWizard() + wizard.request = self.request + context["Step"] = Step.__members__ + context["steps"] = request_step_list(wizard) + context["form_titles"] = wizard.TITLES + return context + class DomainRequestWithdrawConfirmation(DomainRequestPermissionWithdrawView): """This page will ask user to confirm if they want to withdraw From 2c102f94d52ad8bfcb8691501b126ac371318357 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:30:44 -0600 Subject: [PATCH 09/17] cleanup pt 2 --- src/registrar/assets/sass/_theme/_base.scss | 5 -- .../assets/sass/_theme/_cisa_colors.scss | 1 - src/registrar/config/urls.py | 30 +++++----- .../forms/utility/wizard_form_helper.py | 4 +- src/registrar/models/domain_request.py | 4 +- .../templates/domain_request_review.html | 5 +- .../domain_request_status_viewonly.html | 1 - src/registrar/templates/includes/contact.html | 10 ---- .../domain_request_awaiting_review.html | 2 +- .../includes/organization_address.html | 10 ---- src/registrar/tests/test_models.py | 4 +- src/registrar/tests/test_views_request.py | 8 +-- src/registrar/utility/enums.py | 23 ++++++-- src/registrar/views/domain_request.py | 58 ++++++++++--------- 14 files changed, 78 insertions(+), 87 deletions(-) diff --git a/src/registrar/assets/sass/_theme/_base.scss b/src/registrar/assets/sass/_theme/_base.scss index b55f49f15..9d2ed4177 100644 --- a/src/registrar/assets/sass/_theme/_base.scss +++ b/src/registrar/assets/sass/_theme/_base.scss @@ -225,8 +225,3 @@ abbr[title] { .break-word { word-break: break-word; } - -.red-incomplete-text { - color: $dhs-red-50; - font-weight: bold; -} diff --git a/src/registrar/assets/sass/_theme/_cisa_colors.scss b/src/registrar/assets/sass/_theme/_cisa_colors.scss index 2bf045333..23ecf7989 100644 --- a/src/registrar/assets/sass/_theme/_cisa_colors.scss +++ b/src/registrar/assets/sass/_theme/_cisa_colors.scss @@ -63,7 +63,6 @@ $dhs-red-90: #080102; $dhs-red-80: #37050d; $dhs-red-70: #660919; $dhs-red-60: #950e24; -$dhs-red-50: #C41131; $dhs-red: #c41230; $dhs-red-40: #d24b62; $dhs-red-30: #e08493; diff --git a/src/registrar/config/urls.py b/src/registrar/config/urls.py index 4dcb4d056..b8665a4a6 100644 --- a/src/registrar/config/urls.py +++ b/src/registrar/config/urls.py @@ -22,7 +22,7 @@ from registrar.views.report_views import ( ExportDataTypeUser, ) -from registrar.views.domain_request import Step +from registrar.views.domain_request import DomainRequestStep from registrar.views.domain_requests_json import get_domain_requests_json from registrar.views.transfer_user import TransferUserView from registrar.views.utility.api_views import ( @@ -43,20 +43,20 @@ domain_request_urls = [ # dynamically generate the other domain_request_urls for step, view in [ # add/remove steps here - (Step.ORGANIZATION_TYPE, views.OrganizationType), - (Step.TRIBAL_GOVERNMENT, views.TribalGovernment), - (Step.ORGANIZATION_FEDERAL, views.OrganizationFederal), - (Step.ORGANIZATION_ELECTION, views.OrganizationElection), - (Step.ORGANIZATION_CONTACT, views.OrganizationContact), - (Step.ABOUT_YOUR_ORGANIZATION, views.AboutYourOrganization), - (Step.SENIOR_OFFICIAL, views.SeniorOfficial), - (Step.CURRENT_SITES, views.CurrentSites), - (Step.DOTGOV_DOMAIN, views.DotgovDomain), - (Step.PURPOSE, views.Purpose), - (Step.OTHER_CONTACTS, views.OtherContacts), - (Step.ADDITIONAL_DETAILS, views.AdditionalDetails), - (Step.REQUIREMENTS, views.Requirements), - (Step.REVIEW, views.Review), + (DomainRequestStep.ORGANIZATION_TYPE, views.OrganizationType), + (DomainRequestStep.TRIBAL_GOVERNMENT, views.TribalGovernment), + (DomainRequestStep.ORGANIZATION_FEDERAL, views.OrganizationFederal), + (DomainRequestStep.ORGANIZATION_ELECTION, views.OrganizationElection), + (DomainRequestStep.ORGANIZATION_CONTACT, views.OrganizationContact), + (DomainRequestStep.ABOUT_YOUR_ORGANIZATION, views.AboutYourOrganization), + (DomainRequestStep.SENIOR_OFFICIAL, views.SeniorOfficial), + (DomainRequestStep.CURRENT_SITES, views.CurrentSites), + (DomainRequestStep.DOTGOV_DOMAIN, views.DotgovDomain), + (DomainRequestStep.PURPOSE, views.Purpose), + (DomainRequestStep.OTHER_CONTACTS, views.OtherContacts), + (DomainRequestStep.ADDITIONAL_DETAILS, views.AdditionalDetails), + (DomainRequestStep.REQUIREMENTS, views.Requirements), + (DomainRequestStep.REVIEW, views.Review), ]: domain_request_urls.append(path(f"{step}/", view.as_view(), name=step)) diff --git a/src/registrar/forms/utility/wizard_form_helper.py b/src/registrar/forms/utility/wizard_form_helper.py index e1f7cf94c..f4bb9e1a4 100644 --- a/src/registrar/forms/utility/wizard_form_helper.py +++ b/src/registrar/forms/utility/wizard_form_helper.py @@ -4,7 +4,7 @@ from itertools import zip_longest from typing import Callable from django.db.models.fields.related import ForeignObjectRel from django import forms -from registrar.utility.enums import Step +from registrar.utility.enums import DomainRequestStep from registrar.models import DomainRequest, Contact @@ -283,7 +283,7 @@ class BaseYesNoForm(RegistrarForm): def request_step_list(request_wizard): """Dynamically generated list of steps in the form wizard.""" step_list = [] - for step in Step: + for step in request_wizard.StepEnum: condition = request_wizard.WIZARD_CONDITIONS.get(step, True) if callable(condition): condition = condition(request_wizard) diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index 5d1b93be7..bb8693ac1 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -1205,7 +1205,7 @@ class DomainRequest(TimeStampedModel): def _is_creator_complete(self): return self.creator is not None - def is_organization_name_and_address_complete(self): + def _is_organization_name_and_address_complete(self): return not ( self.organization_name is None and self.address_line1 is None @@ -1273,7 +1273,7 @@ class DomainRequest(TimeStampedModel): def _is_general_form_complete(self, request): return ( self._is_creator_complete() - and self.is_organization_name_and_address_complete() + and self._is_organization_name_and_address_complete() and self._is_senior_official_complete() and self._is_requested_domain_complete() and self._is_purpose_complete() diff --git a/src/registrar/templates/domain_request_review.html b/src/registrar/templates/domain_request_review.html index f664a3c90..cf6dfba88 100644 --- a/src/registrar/templates/domain_request_review.html +++ b/src/registrar/templates/domain_request_review.html @@ -19,9 +19,12 @@ {% endblock %} {% block form_fields %} + {% include "includes/domain_request_review_steps.html" with is_editable=True %} + {% comment %} + TODO - uncomment {% if not portfolio %} {% include "includes/domain_request_review_steps.html" with is_editable=True %} {% else %} {% include "includes/portfolio_domain_request_review_steps.html" with is_editable=True %} - {% endif %} + {% endif %} {% endcomment %} {% endblock %} diff --git a/src/registrar/templates/domain_request_status_viewonly.html b/src/registrar/templates/domain_request_status_viewonly.html index 8b5de5475..bed5168ad 100644 --- a/src/registrar/templates/domain_request_status_viewonly.html +++ b/src/registrar/templates/domain_request_status_viewonly.html @@ -4,7 +4,6 @@ {% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %} - {% block content %} {% include "includes/domain_request_status_view.html" %} {% endblock %} diff --git a/src/registrar/templates/includes/contact.html b/src/registrar/templates/includes/contact.html index 20c15a35f..68c243558 100644 --- a/src/registrar/templates/includes/contact.html +++ b/src/registrar/templates/includes/contact.html @@ -1,16 +1,6 @@ -{% if contact %}
{{ contact.get_formatted_name }}
{% if contact.title %}{{ contact.title }}
{% endif %} {% if contact.email %}{{ contact.email }}
{% endif %} {% if contact.phone %}{{ contact.phone.as_national }}{% endif %}
-{% else %} - {% if custom_text_for_value_none %} -

- {{ custom_text_for_value_none }} -

- {% else %} - None - {% endif %} -{% endif %} diff --git a/src/registrar/templates/includes/domain_request_awaiting_review.html b/src/registrar/templates/includes/domain_request_awaiting_review.html index 6c9305c18..18afc9903 100644 --- a/src/registrar/templates/includes/domain_request_awaiting_review.html +++ b/src/registrar/templates/includes/domain_request_awaiting_review.html @@ -11,4 +11,4 @@ {% if show_withdraw_text %}

If you need to change your request you have to first withdraw it. Once you withdraw the request you can edit it and submit it again. Changing your request might add to the wait time.

-{% endif %} \ No newline at end of file +{% endif %} diff --git a/src/registrar/templates/includes/organization_address.html b/src/registrar/templates/includes/organization_address.html index 2647d5bd1..d6126d681 100644 --- a/src/registrar/templates/includes/organization_address.html +++ b/src/registrar/templates/includes/organization_address.html @@ -1,4 +1,3 @@ -{% if organization.is_organization_name_and_address_complete %}
{% if organization.federal_agency %} {{ organization.federal_agency }}
@@ -27,12 +26,3 @@
{{ organization.urbanization }} {% endif %}
-{% else %} - {% if custom_text_for_value_none %} -

- {{ custom_text_for_value_none }} -

- {% else %} - None - {% endif %} -{% endif %} \ No newline at end of file diff --git a/src/registrar/tests/test_models.py b/src/registrar/tests/test_models.py index e24bf3c10..a6e889503 100644 --- a/src/registrar/tests/test_models.py +++ b/src/registrar/tests/test_models.py @@ -2228,11 +2228,11 @@ class TestDomainRequestIncomplete(TestCase): @less_console_noise_decorator def test_is_organization_name_and_address_complete(self): - self.assertTrue(self.domain_request.is_organization_name_and_address_complete()) + self.assertTrue(self.domain_request._is_organization_name_and_address_complete()) self.domain_request.organization_name = None self.domain_request.address_line1 = None self.domain_request.save() - self.assertTrue(self.domain_request.is_organization_name_and_address_complete()) + self.assertTrue(self.domain_request._is_organization_name_and_address_complete()) @less_console_noise_decorator def test_is_senior_official_complete(self): diff --git a/src/registrar/tests/test_views_request.py b/src/registrar/tests/test_views_request.py index 2cb3a381c..140b954a5 100644 --- a/src/registrar/tests/test_views_request.py +++ b/src/registrar/tests/test_views_request.py @@ -22,7 +22,7 @@ from registrar.models import ( Portfolio, UserPortfolioPermission, ) -from registrar.views.domain_request import DomainRequestWizard, Step +from registrar.views.domain_request import DomainRequestWizard, DomainRequestStep from .common import less_console_noise from .test_views import TestWithUser @@ -1098,7 +1098,7 @@ class DomainRequestTests(TestWithUser, WebTest): self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) contact_page = type_result.follow() - self.assertContains(contact_page, self.TITLES[Step.ABOUT_YOUR_ORGANIZATION]) + self.assertContains(contact_page, self.TITLES[DomainRequestStep.ABOUT_YOUR_ORGANIZATION]) @less_console_noise_decorator def test_federal_agency_dropdown_excludes_expected_values(self): @@ -2327,7 +2327,7 @@ class DomainRequestTests(TestWithUser, WebTest): self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) contact_page = type_result.follow() - self.assertContains(contact_page, self.TITLES[Step.ABOUT_YOUR_ORGANIZATION]) + self.assertContains(contact_page, self.TITLES[DomainRequestStep.ABOUT_YOUR_ORGANIZATION]) @less_console_noise_decorator def test_domain_request_tribal_government(self): @@ -2359,7 +2359,7 @@ class DomainRequestTests(TestWithUser, WebTest): tribal_government_page = type_result.follow() # and the step is on the sidebar list. - self.assertContains(tribal_government_page, self.TITLES[Step.TRIBAL_GOVERNMENT]) + self.assertContains(tribal_government_page, self.TITLES[DomainRequestStep.TRIBAL_GOVERNMENT]) @less_console_noise_decorator def test_domain_request_so_dynamic_text(self): diff --git a/src/registrar/utility/enums.py b/src/registrar/utility/enums.py index 3cc0b2c47..51e3f33fb 100644 --- a/src/registrar/utility/enums.py +++ b/src/registrar/utility/enums.py @@ -40,17 +40,13 @@ class DefaultEmail(Enum): LEGACY_DEFAULT = "registrar@dotgov.gov" -class Step(StrEnum): +class DomainRequestStep(StrEnum): """ Names for each page of the domain request wizard. As with Django's own `TextChoices` class, steps will appear in the order they are defined. (Order matters.) """ - # Portfolio - # TODO - this does not exist yet. - # Fill this in for the portfolio domain request experience. - REQUESTING_ENTITY = "portfolio" # Non-Portfolio ORGANIZATION_TYPE = "generic_org_type" @@ -67,3 +63,20 @@ class Step(StrEnum): ADDITIONAL_DETAILS = "additional_details" REQUIREMENTS = "requirements" REVIEW = "review" + +class PortfolioDomainRequestStep(StrEnum): + """ + Names for each page of the portfolio domain request wizard. + + As with Django's own `TextChoices` class, steps will + appear in the order they are defined. (Order matters.) + """ + # Portfolio + # TODO - this does not exist yet. + # Fill this in for the portfolio domain request experience. + REQUESTING_ENTITY = "portfolio" + CURRENT_SITES = "current_sites" + DOTGOV_DOMAIN = "dotgov_domain" + PURPOSE = "purpose" + ADDITIONAL_DETAILS = "additional_details" + REQUIREMENTS = "requirements" diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 05a7e6827..2cc4f0594 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -14,7 +14,7 @@ from registrar.models.contact import Contact from registrar.models.user import User from registrar.views.utility import StepsHelper from registrar.views.utility.permission_views import DomainRequestPermissionDeleteView -from registrar.utility.enums import Step +from registrar.utility.enums import DomainRequestStep, PortfolioDomainRequestStep from .utility import ( DomainRequestPermissionView, @@ -43,7 +43,7 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): Any method not marked as internal can be overridden in a subclass, although not without consulting the base implementation, first. """ - + StepEnum = DomainRequestStep template_name = "" # uniquely namespace the wizard in urls.py @@ -56,29 +56,29 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): NEW_URL_NAME = "/request/" # We need to pass our human-readable step titles as context to the templates. TITLES = { - Step.ORGANIZATION_TYPE: _("Type of organization"), - Step.TRIBAL_GOVERNMENT: _("Tribal government"), - Step.ORGANIZATION_FEDERAL: _("Federal government branch"), - Step.ORGANIZATION_ELECTION: _("Election office"), - Step.ORGANIZATION_CONTACT: _("Organization"), - Step.ABOUT_YOUR_ORGANIZATION: _("About your organization"), - Step.SENIOR_OFFICIAL: _("Senior official"), - Step.CURRENT_SITES: _("Current websites"), - Step.DOTGOV_DOMAIN: _(".gov domain"), - Step.PURPOSE: _("Purpose of your domain"), - Step.OTHER_CONTACTS: _("Other employees from your organization"), - Step.ADDITIONAL_DETAILS: _("Additional details"), - Step.REQUIREMENTS: _("Requirements for operating a .gov domain"), - Step.REVIEW: _("Review and submit your domain request"), + StepEnum.ORGANIZATION_TYPE: _("Type of organization"), + StepEnum.TRIBAL_GOVERNMENT: _("Tribal government"), + StepEnum.ORGANIZATION_FEDERAL: _("Federal government branch"), + StepEnum.ORGANIZATION_ELECTION: _("Election office"), + StepEnum.ORGANIZATION_CONTACT: _("Organization"), + StepEnum.ABOUT_YOUR_ORGANIZATION: _("About your organization"), + StepEnum.SENIOR_OFFICIAL: _("Senior official"), + StepEnum.CURRENT_SITES: _("Current websites"), + StepEnum.DOTGOV_DOMAIN: _(".gov domain"), + StepEnum.PURPOSE: _("Purpose of your domain"), + StepEnum.OTHER_CONTACTS: _("Other employees from your organization"), + StepEnum.ADDITIONAL_DETAILS: _("Additional details"), + StepEnum.REQUIREMENTS: _("Requirements for operating a .gov domain"), + StepEnum.REVIEW: _("Review and submit your domain request"), } # We can use a dictionary with step names and callables that return booleans # to show or hide particular steps based on the state of the process. WIZARD_CONDITIONS = { - Step.ORGANIZATION_FEDERAL: lambda w: w.from_model("show_organization_federal", False), - Step.TRIBAL_GOVERNMENT: lambda w: w.from_model("show_tribal_government", False), - Step.ORGANIZATION_ELECTION: lambda w: w.from_model("show_organization_election", False), - Step.ABOUT_YOUR_ORGANIZATION: lambda w: w.from_model("show_about_your_organization", False), + StepEnum.ORGANIZATION_FEDERAL: lambda w: w.from_model("show_organization_federal", False), + StepEnum.TRIBAL_GOVERNMENT: lambda w: w.from_model("show_tribal_government", False), + StepEnum.ORGANIZATION_ELECTION: lambda w: w.from_model("show_organization_election", False), + StepEnum.ABOUT_YOUR_ORGANIZATION: lambda w: w.from_model("show_about_your_organization", False), } def __init__(self): @@ -501,13 +501,15 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): # TODO - this is a WIP until the domain request experience for portfolios is complete class PortfolioDomainRequestWizard(DomainRequestWizard): + StepEnum = PortfolioDomainRequestStep + TITLES = { - Step.REQUESTING_ENTITY: _("Requesting entity"), - Step.CURRENT_SITES: _("Current websites"), - Step.DOTGOV_DOMAIN: _(".gov domain"), - Step.PURPOSE: _("Purpose of your domain"), - Step.ADDITIONAL_DETAILS: _("Additional details"), - Step.REQUIREMENTS: _("Requirements for operating a .gov domain"), + StepEnum.REQUESTING_ENTITY: _("Requesting entity"), + StepEnum.CURRENT_SITES: _("Current websites"), + StepEnum.DOTGOV_DOMAIN: _(".gov domain"), + StepEnum.PURPOSE: _("Purpose of your domain"), + StepEnum.ADDITIONAL_DETAILS: _("Additional details"), + StepEnum.REQUIREMENTS: _("Requirements for operating a .gov domain"), # Step.REVIEW: _("Review and submit your domain request"), } @@ -696,7 +698,7 @@ class Review(DomainRequestWizard): if DomainRequest._form_complete(self.domain_request, self.request) is False: logger.warning("User arrived at review page with an incomplete form.") context = super().get_context_data() - context["Step"] = Step.__members__ + context["Step"] = DomainRequestStep.__members__ context["domain_request"] = self.domain_request return context @@ -762,7 +764,7 @@ class DomainRequestStatusViewOnly(DomainRequestPortfolioViewonlyView): # Create a temp wizard object to grab the step list wizard = PortfolioDomainRequestWizard() wizard.request = self.request - context["Step"] = Step.__members__ + context["Step"] = wizard.StepEnum.__members__ context["steps"] = request_step_list(wizard) context["form_titles"] = wizard.TITLES return context From 26db5151ca1214062f50a7b70ea7f7f5aca54fbc Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:41:02 -0600 Subject: [PATCH 10/17] Cleanup --- src/registrar/config/urls.py | 30 +++++++++---------- .../forms/utility/wizard_form_helper.py | 2 +- .../templates/includes/summary_item.html | 14 ++++----- src/registrar/tests/test_views_request.py | 8 ++--- src/registrar/utility/enums.py | 2 +- src/registrar/views/domain_request.py | 6 ++-- 6 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/registrar/config/urls.py b/src/registrar/config/urls.py index b8665a4a6..4dcb4d056 100644 --- a/src/registrar/config/urls.py +++ b/src/registrar/config/urls.py @@ -22,7 +22,7 @@ from registrar.views.report_views import ( ExportDataTypeUser, ) -from registrar.views.domain_request import DomainRequestStep +from registrar.views.domain_request import Step from registrar.views.domain_requests_json import get_domain_requests_json from registrar.views.transfer_user import TransferUserView from registrar.views.utility.api_views import ( @@ -43,20 +43,20 @@ domain_request_urls = [ # dynamically generate the other domain_request_urls for step, view in [ # add/remove steps here - (DomainRequestStep.ORGANIZATION_TYPE, views.OrganizationType), - (DomainRequestStep.TRIBAL_GOVERNMENT, views.TribalGovernment), - (DomainRequestStep.ORGANIZATION_FEDERAL, views.OrganizationFederal), - (DomainRequestStep.ORGANIZATION_ELECTION, views.OrganizationElection), - (DomainRequestStep.ORGANIZATION_CONTACT, views.OrganizationContact), - (DomainRequestStep.ABOUT_YOUR_ORGANIZATION, views.AboutYourOrganization), - (DomainRequestStep.SENIOR_OFFICIAL, views.SeniorOfficial), - (DomainRequestStep.CURRENT_SITES, views.CurrentSites), - (DomainRequestStep.DOTGOV_DOMAIN, views.DotgovDomain), - (DomainRequestStep.PURPOSE, views.Purpose), - (DomainRequestStep.OTHER_CONTACTS, views.OtherContacts), - (DomainRequestStep.ADDITIONAL_DETAILS, views.AdditionalDetails), - (DomainRequestStep.REQUIREMENTS, views.Requirements), - (DomainRequestStep.REVIEW, views.Review), + (Step.ORGANIZATION_TYPE, views.OrganizationType), + (Step.TRIBAL_GOVERNMENT, views.TribalGovernment), + (Step.ORGANIZATION_FEDERAL, views.OrganizationFederal), + (Step.ORGANIZATION_ELECTION, views.OrganizationElection), + (Step.ORGANIZATION_CONTACT, views.OrganizationContact), + (Step.ABOUT_YOUR_ORGANIZATION, views.AboutYourOrganization), + (Step.SENIOR_OFFICIAL, views.SeniorOfficial), + (Step.CURRENT_SITES, views.CurrentSites), + (Step.DOTGOV_DOMAIN, views.DotgovDomain), + (Step.PURPOSE, views.Purpose), + (Step.OTHER_CONTACTS, views.OtherContacts), + (Step.ADDITIONAL_DETAILS, views.AdditionalDetails), + (Step.REQUIREMENTS, views.Requirements), + (Step.REVIEW, views.Review), ]: domain_request_urls.append(path(f"{step}/", view.as_view(), name=step)) diff --git a/src/registrar/forms/utility/wizard_form_helper.py b/src/registrar/forms/utility/wizard_form_helper.py index f4bb9e1a4..578d6462d 100644 --- a/src/registrar/forms/utility/wizard_form_helper.py +++ b/src/registrar/forms/utility/wizard_form_helper.py @@ -4,7 +4,7 @@ from itertools import zip_longest from typing import Callable from django.db.models.fields.related import ForeignObjectRel from django import forms -from registrar.utility.enums import DomainRequestStep +from registrar.utility.enums import Step from registrar.models import DomainRequest, Contact diff --git a/src/registrar/templates/includes/summary_item.html b/src/registrar/templates/includes/summary_item.html index 69065768b..f69bbaf96 100644 --- a/src/registrar/templates/includes/summary_item.html +++ b/src/registrar/templates/includes/summary_item.html @@ -43,12 +43,12 @@ {% endfor %} {% elif custom_text_for_value_none %} -

+

{{ custom_text_for_value_none }}

{% else %}

- None + None

{% endif %} {% endif %} @@ -96,17 +96,15 @@ {% endif %} {% else %} +

{% if value %} -

- {{ value }} -

+ {{ value }} {% elif custom_text_for_value_none %} -

- {{ custom_text_for_value_none }} -

+ {{ custom_text_for_value_none }} {% else %} None {% endif %} +

{% endif %} diff --git a/src/registrar/tests/test_views_request.py b/src/registrar/tests/test_views_request.py index 140b954a5..2cb3a381c 100644 --- a/src/registrar/tests/test_views_request.py +++ b/src/registrar/tests/test_views_request.py @@ -22,7 +22,7 @@ from registrar.models import ( Portfolio, UserPortfolioPermission, ) -from registrar.views.domain_request import DomainRequestWizard, DomainRequestStep +from registrar.views.domain_request import DomainRequestWizard, Step from .common import less_console_noise from .test_views import TestWithUser @@ -1098,7 +1098,7 @@ class DomainRequestTests(TestWithUser, WebTest): self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) contact_page = type_result.follow() - self.assertContains(contact_page, self.TITLES[DomainRequestStep.ABOUT_YOUR_ORGANIZATION]) + self.assertContains(contact_page, self.TITLES[Step.ABOUT_YOUR_ORGANIZATION]) @less_console_noise_decorator def test_federal_agency_dropdown_excludes_expected_values(self): @@ -2327,7 +2327,7 @@ class DomainRequestTests(TestWithUser, WebTest): self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) contact_page = type_result.follow() - self.assertContains(contact_page, self.TITLES[DomainRequestStep.ABOUT_YOUR_ORGANIZATION]) + self.assertContains(contact_page, self.TITLES[Step.ABOUT_YOUR_ORGANIZATION]) @less_console_noise_decorator def test_domain_request_tribal_government(self): @@ -2359,7 +2359,7 @@ class DomainRequestTests(TestWithUser, WebTest): tribal_government_page = type_result.follow() # and the step is on the sidebar list. - self.assertContains(tribal_government_page, self.TITLES[DomainRequestStep.TRIBAL_GOVERNMENT]) + self.assertContains(tribal_government_page, self.TITLES[Step.TRIBAL_GOVERNMENT]) @less_console_noise_decorator def test_domain_request_so_dynamic_text(self): diff --git a/src/registrar/utility/enums.py b/src/registrar/utility/enums.py index 51e3f33fb..c39dd61a1 100644 --- a/src/registrar/utility/enums.py +++ b/src/registrar/utility/enums.py @@ -40,7 +40,7 @@ class DefaultEmail(Enum): LEGACY_DEFAULT = "registrar@dotgov.gov" -class DomainRequestStep(StrEnum): +class Step(StrEnum): """ Names for each page of the domain request wizard. diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 2cc4f0594..a3efa260b 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -14,7 +14,7 @@ from registrar.models.contact import Contact from registrar.models.user import User from registrar.views.utility import StepsHelper from registrar.views.utility.permission_views import DomainRequestPermissionDeleteView -from registrar.utility.enums import DomainRequestStep, PortfolioDomainRequestStep +from registrar.utility.enums import Step, PortfolioDomainRequestStep from .utility import ( DomainRequestPermissionView, @@ -43,7 +43,7 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): Any method not marked as internal can be overridden in a subclass, although not without consulting the base implementation, first. """ - StepEnum = DomainRequestStep + StepEnum = Step template_name = "" # uniquely namespace the wizard in urls.py @@ -698,7 +698,7 @@ class Review(DomainRequestWizard): if DomainRequest._form_complete(self.domain_request, self.request) is False: logger.warning("User arrived at review page with an incomplete form.") context = super().get_context_data() - context["Step"] = DomainRequestStep.__members__ + context["Step"] = Step.__members__ context["domain_request"] = self.domain_request return context From 0c19024b3f567abdd4ae75e10f9f3c67743662c4 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Fri, 20 Sep 2024 10:43:34 -0600 Subject: [PATCH 11/17] Rename --- src/registrar/config/urls.py | 2 +- .../templates/domain_request_review.html | 9 +- .../templates/domain_request_status.html | 2 +- ...ml => portfolio_request_review_steps.html} | 1 - ...tml => portfolio_request_status_view.html} | 11 +- ...w_steps.html => request_review_steps.html} | 2 +- .../includes/request_status_manage.html | 236 ++++++++++++++++++ ...folio_domain_request_status_viewonly.html} | 2 +- src/registrar/utility/enums.py | 2 - src/registrar/views/domain_request.py | 30 +-- 10 files changed, 262 insertions(+), 35 deletions(-) rename src/registrar/templates/includes/{portfolio_domain_request_review_steps.html => portfolio_request_review_steps.html} (98%) rename src/registrar/templates/includes/{domain_request_status_view.html => portfolio_request_status_view.html} (52%) rename src/registrar/templates/includes/{domain_request_review_steps.html => request_review_steps.html} (99%) create mode 100644 src/registrar/templates/includes/request_status_manage.html rename src/registrar/templates/{domain_request_status_viewonly.html => portfolio_domain_request_status_viewonly.html} (76%) diff --git a/src/registrar/config/urls.py b/src/registrar/config/urls.py index 4dcb4d056..f45770cf6 100644 --- a/src/registrar/config/urls.py +++ b/src/registrar/config/urls.py @@ -171,7 +171,7 @@ urlpatterns = [ ), path( "domain-request/viewonly/", - views.DomainRequestStatusViewOnly.as_view(), + views.PortfolioDomainRequestStatusViewOnly.as_view(), name="domain-request-status-viewonly", ), path( diff --git a/src/registrar/templates/domain_request_review.html b/src/registrar/templates/domain_request_review.html index cf6dfba88..03624d2ec 100644 --- a/src/registrar/templates/domain_request_review.html +++ b/src/registrar/templates/domain_request_review.html @@ -19,12 +19,5 @@ {% endblock %} {% block form_fields %} - {% include "includes/domain_request_review_steps.html" with is_editable=True %} - {% comment %} - TODO - uncomment - {% if not portfolio %} - {% include "includes/domain_request_review_steps.html" with is_editable=True %} - {% else %} - {% include "includes/portfolio_domain_request_review_steps.html" with is_editable=True %} - {% endif %} {% endcomment %} + {% include "includes/request_review_steps.html" with is_editable=True %} {% endblock %} diff --git a/src/registrar/templates/domain_request_status.html b/src/registrar/templates/domain_request_status.html index 5f6624f15..d332ce54e 100644 --- a/src/registrar/templates/domain_request_status.html +++ b/src/registrar/templates/domain_request_status.html @@ -6,5 +6,5 @@ {% block content %} - {% include "includes/domain_request_status_manage.html" %} + {% include "includes/request_status_manage.html" %} {% endblock %} diff --git a/src/registrar/templates/includes/portfolio_domain_request_review_steps.html b/src/registrar/templates/includes/portfolio_request_review_steps.html similarity index 98% rename from src/registrar/templates/includes/portfolio_domain_request_review_steps.html rename to src/registrar/templates/includes/portfolio_request_review_steps.html index c61c09657..303da4675 100644 --- a/src/registrar/templates/includes/portfolio_domain_request_review_steps.html +++ b/src/registrar/templates/includes/portfolio_request_review_steps.html @@ -7,7 +7,6 @@ {% namespaced_url 'domain-request' step as domain_request_url %} {% endif %} - {% comment %} TODO: what is this? {% endcomment %} {% if step == Step.REQUESTING_ENTITY %} {% with title=form_titles|get_item:step value=domain_request.portfolio|default:"Incomplete"|safe%} {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} diff --git a/src/registrar/templates/includes/domain_request_status_view.html b/src/registrar/templates/includes/portfolio_request_status_view.html similarity index 52% rename from src/registrar/templates/includes/domain_request_status_view.html rename to src/registrar/templates/includes/portfolio_request_status_view.html index b94623320..528c97709 100644 --- a/src/registrar/templates/includes/domain_request_status_view.html +++ b/src/registrar/templates/includes/portfolio_request_status_view.html @@ -1,19 +1,18 @@ -{% extends 'includes/domain_request_status_manage.html' %} +{% extends 'includes/request_status_manage.html' %} {% load custom_filters %} {% load static url_helpers %} {% comment %} Do not show the withdrawal text in viewonly mode {% endcomment %} {% block status_blurb %} -{% if DomainRequest.is_awaiting_review %} -

{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=False %}

-{% endif %} + {% if DomainRequest.is_awaiting_review %} +

{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=False %}

+ {% endif %} {% endblock status_blurb %} {% comment %} Do not show action buttons in viewonly mode {% endcomment %} {% block modify_request %} {% endblock modify_request %} - {% block request_summary %} - {% include "includes/portfolio_domain_request_review_steps.html" with domain_request=DomainRequest is_editable=False %} + {% include "includes/portfolio_request_review_steps.html" with domain_request=DomainRequest is_editable=False %} {% endblock request_summary %} diff --git a/src/registrar/templates/includes/domain_request_review_steps.html b/src/registrar/templates/includes/request_review_steps.html similarity index 99% rename from src/registrar/templates/includes/domain_request_review_steps.html rename to src/registrar/templates/includes/request_review_steps.html index d292f61a9..db1743b34 100644 --- a/src/registrar/templates/includes/domain_request_review_steps.html +++ b/src/registrar/templates/includes/request_review_steps.html @@ -165,4 +165,4 @@ {% endwith %} {% endif %} -{% endfor %} \ No newline at end of file +{% endfor %} diff --git a/src/registrar/templates/includes/request_status_manage.html b/src/registrar/templates/includes/request_status_manage.html new file mode 100644 index 000000000..2a254df4b --- /dev/null +++ b/src/registrar/templates/includes/request_status_manage.html @@ -0,0 +1,236 @@ +{% load custom_filters %} +{% load static url_helpers %} +
+
+ {% block breadcrumb %} + {% if portfolio %} + {% url 'domain-requests' as url %} + {% else %} + {% url 'home' as url %} + {% endif %} + + {% endblock breadcrumb %} + + {% block header %} + {% if not DomainRequest.requested_domain and DomainRequest.status == DomainRequest.DomainRequestStatus.STARTED %} +

New domain request

+ {% else %} +

Domain request for {{ DomainRequest.requested_domain.name }}

+ {% endif %} + {% endblock header %} + + {% block status_summary %} +
+
+

+ + Status: + + {{ DomainRequest.get_status_display|default:"ERROR Please contact technical support/dev" }} +

+
+
+
+ {% endblock status_summary %} + + {% block status_metadata %} + + {% if portfolio %} + {% if DomainRequest.creator %} +

+ Created by: {{DomainRequest.creator.email|default:DomainRequest.creator.get_formatted_name }} +

+ {% else %} +

+ No creator found: this is an error, please email help@get.gov. +

+ {% endif %} + {% endif %} + + {% with statuses=DomainRequest.DomainRequestStatus last_submitted=DomainRequest.last_submitted_date|date:"F j, Y" first_submitted=DomainRequest.first_submitted_date|date:"F j, Y" last_status_update=DomainRequest.last_status_update|date:"F j, Y" %} + {% comment %} + These are intentionally seperated this way. + There is some code repetition, but it gives us more flexibility rather than a dense reduction. + Leave it this way until we've solidified our requirements. + {% endcomment %} + {% if DomainRequest.status == statuses.STARTED %} + {% with first_started_date=DomainRequest.get_first_status_started_date|date:"F j, Y" %} +

+ {% comment %} + A newly created domain request will not have a value for last_status update. + This is because the status never really updated. + However, if this somehow goes back to started we can default to displaying that new date. + {% endcomment %} + Started on: {{last_status_update|default:first_started_date}} +

+ {% endwith %} + {% elif DomainRequest.status == statuses.SUBMITTED %} +

+ Submitted on: {{last_submitted|default:first_submitted }} +

+

+ Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} +

+ {% elif DomainRequest.status == statuses.ACTION_NEEDED %} +

+ Submitted on: {{last_submitted|default:first_submitted }} +

+

+ Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} +

+ {% elif DomainRequest.status == statuses.REJECTED %} +

+ Submitted on: {{last_submitted|default:first_submitted }} +

+

+ Rejected on: {{last_status_update}} +

+ {% elif DomainRequest.status == statuses.WITHDRAWN %} +

+ Submitted on: {{last_submitted|default:first_submitted }} +

+

+ Withdrawn on: {{last_status_update}} +

+ {% else %} + {% comment %} Shown for in_review, approved, ineligible {% endcomment %} +

+ Last updated on: {{DomainRequest.updated_at|date:"F j, Y"}} +

+ {% endif %} + {% endwith %} + {% endblock status_metadata %} + + {% block status_blurb %} + {% if DomainRequest.is_awaiting_review %} +

{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=DomainRequest.is_withdrawable %}

+ {% endif %} + {% endblock status_blurb %} + + {% block modify_request %} + {% if DomainRequest.is_withdrawable %} +

+ Withdraw request +

+ {% endif %} + {% endblock modify_request %} +
+ +
+ {% block request_summary_header %} +

Summary of your domain request

+ {% endblock request_summary_header%} + + {% block request_summary %} + {% with heading_level='h3' %} + {% with org_type=DomainRequest.get_generic_org_type_display %} + {% include "includes/summary_item.html" with title='Type of organization' value=org_type heading_level=heading_level %} + {% endwith %} + + {% if DomainRequest.tribe_name %} + {% include "includes/summary_item.html" with title='Tribal government' value=DomainRequest.tribe_name heading_level=heading_level %} + + {% if DomainRequest.federally_recognized_tribe %} +

Federally-recognized tribe

+ {% endif %} + + {% if DomainRequest.state_recognized_tribe %} +

State-recognized tribe

+ {% endif %} + + {% endif %} + + {% if DomainRequest.get_federal_type_display %} + {% include "includes/summary_item.html" with title='Federal government branch' value=DomainRequest.get_federal_type_display heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.is_election_board %} + {% with value=DomainRequest.is_election_board|yesno:"Yes,No,Incomplete" %} + {% include "includes/summary_item.html" with title='Election office' value=value heading_level=heading_level %} + {% endwith %} + {% endif %} + + {% if DomainRequest.organization_name %} + {% include "includes/summary_item.html" with title='Organization' value=DomainRequest address='true' heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.about_your_organization %} + {% include "includes/summary_item.html" with title='About your organization' value=DomainRequest.about_your_organization heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.senior_official %} + {% include "includes/summary_item.html" with title='Senior official' value=DomainRequest.senior_official contact='true' heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.current_websites.all %} + {% include "includes/summary_item.html" with title='Current websites' value=DomainRequest.current_websites.all list='true' heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.requested_domain %} + {% include "includes/summary_item.html" with title='.gov domain' value=DomainRequest.requested_domain heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.alternative_domains.all %} + {% include "includes/summary_item.html" with title='Alternative domains' value=DomainRequest.alternative_domains.all list='true' heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.purpose %} + {% include "includes/summary_item.html" with title='Purpose of your domain' value=DomainRequest.purpose heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.creator %} + {% include "includes/summary_item.html" with title='Your contact information' value=DomainRequest.creator contact='true' heading_level=heading_level %} + {% endif %} + + {% if DomainRequest.other_contacts.all %} + {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.other_contacts.all contact='true' list='true' heading_level=heading_level %} + {% else %} + {% include "includes/summary_item.html" with title='Other employees from your organization' value=DomainRequest.no_other_contacts_rationale heading_level=heading_level %} + {% endif %} + + {# We always show this field even if None #} + {% if DomainRequest %} +

CISA Regional Representative

+
    + {% if DomainRequest.cisa_representative_first_name %} + {{ DomainRequest.get_formatted_cisa_rep_name }} + {% else %} + No + {% endif %} +
+

Anything else

+
    + {% if DomainRequest.anything_else %} + {{DomainRequest.anything_else}} + {% else %} + No + {% endif %} +
+ {% endif %} + {% endwith %} + {% endblock request_summary%} +
+
\ No newline at end of file diff --git a/src/registrar/templates/domain_request_status_viewonly.html b/src/registrar/templates/portfolio_domain_request_status_viewonly.html similarity index 76% rename from src/registrar/templates/domain_request_status_viewonly.html rename to src/registrar/templates/portfolio_domain_request_status_viewonly.html index bed5168ad..bb6ee1e66 100644 --- a/src/registrar/templates/domain_request_status_viewonly.html +++ b/src/registrar/templates/portfolio_domain_request_status_viewonly.html @@ -5,5 +5,5 @@ {% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %} {% block content %} - {% include "includes/domain_request_status_view.html" %} + {% include "includes/portfolio_domain_request_status_view.html" %} {% endblock %} diff --git a/src/registrar/utility/enums.py b/src/registrar/utility/enums.py index c39dd61a1..ad98489e1 100644 --- a/src/registrar/utility/enums.py +++ b/src/registrar/utility/enums.py @@ -72,8 +72,6 @@ class PortfolioDomainRequestStep(StrEnum): appear in the order they are defined. (Order matters.) """ # Portfolio - # TODO - this does not exist yet. - # Fill this in for the portfolio domain request experience. REQUESTING_ENTITY = "portfolio" CURRENT_SITES = "current_sites" DOTGOV_DOMAIN = "dotgov_domain" diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index a3efa260b..2724ec649 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -756,20 +756,6 @@ class DomainRequestStatus(DomainRequestPermissionView): return True -class DomainRequestStatusViewOnly(DomainRequestPortfolioViewonlyView): - template_name = "domain_request_status_viewonly.html" - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - # Create a temp wizard object to grab the step list - wizard = PortfolioDomainRequestWizard() - wizard.request = self.request - context["Step"] = wizard.StepEnum.__members__ - context["steps"] = request_step_list(wizard) - context["form_titles"] = wizard.TITLES - return context - - class DomainRequestWithdrawConfirmation(DomainRequestPermissionWithdrawView): """This page will ask user to confirm if they want to withdraw @@ -902,3 +888,19 @@ class DomainRequestDeleteView(DomainRequestPermissionDeleteView): duplicates = [item for item, count in object_dict.items() if count > 1] return duplicates + + +# region Portfolio views +class PortfolioDomainRequestStatusViewOnly(DomainRequestPortfolioViewonlyView): + template_name = "portfolio_domain_request_status_viewonly.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + # Create a temp wizard object to grab the step list + wizard = PortfolioDomainRequestWizard() + wizard.request = self.request + context["Step"] = wizard.StepEnum.__members__ + context["steps"] = request_step_list(wizard) + context["form_titles"] = wizard.TITLES + return context +# endregion From 1a8d668fb596a4e1f2b142b45de3d11db470b21a Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:06:06 -0600 Subject: [PATCH 12/17] fix some bugs --- .../includes/domain_request_awaiting_review.html | 8 ++++---- .../includes/portfolio_request_review_steps.html | 13 ++++++++++--- .../portfolio_domain_request_status_viewonly.html | 2 +- src/registrar/utility/enums.py | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/registrar/templates/includes/domain_request_awaiting_review.html b/src/registrar/templates/includes/domain_request_awaiting_review.html index 18afc9903..cc9b31ccb 100644 --- a/src/registrar/templates/includes/domain_request_awaiting_review.html +++ b/src/registrar/templates/includes/domain_request_awaiting_review.html @@ -5,10 +5,10 @@

We received your .gov domain request. Our next step is to review your request. This usually takes 30 business days. We’ll email you if we have questions and when we complete our review. Contact us with any questions.

-

- Need to make changes? -

- {% if show_withdraw_text %} +

+ Need to make changes? +

+

If you need to change your request you have to first withdraw it. Once you withdraw the request you can edit it and submit it again. Changing your request might add to the wait time.

{% endif %} diff --git a/src/registrar/templates/includes/portfolio_request_review_steps.html b/src/registrar/templates/includes/portfolio_request_review_steps.html index 303da4675..8f7dba9ac 100644 --- a/src/registrar/templates/includes/portfolio_request_review_steps.html +++ b/src/registrar/templates/includes/portfolio_request_review_steps.html @@ -8,9 +8,16 @@ {% endif %} {% if step == Step.REQUESTING_ENTITY %} - {% with title=form_titles|get_item:step value=domain_request.portfolio|default:"Incomplete"|safe%} - {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} - {% endwith %} + + {% if domain_request.organization_name %} + {% with title=form_titles|get_item:step value=domain_request %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url address='true' %} + {% endwith %} + {% else %} + {% with title=form_titles|get_item:step value="Incomplete"|safe %} + {% include "includes/summary_item.html" with title=title value=value heading_level=heading_level editable=is_editable edit_link=domain_request_url %} + {% endwith %} + {% endif%} {% endif %} {% if step == Step.CURRENT_SITES %} diff --git a/src/registrar/templates/portfolio_domain_request_status_viewonly.html b/src/registrar/templates/portfolio_domain_request_status_viewonly.html index bb6ee1e66..0378d1b56 100644 --- a/src/registrar/templates/portfolio_domain_request_status_viewonly.html +++ b/src/registrar/templates/portfolio_domain_request_status_viewonly.html @@ -5,5 +5,5 @@ {% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %} {% block content %} - {% include "includes/portfolio_domain_request_status_view.html" %} + {% include "includes/portfolio_request_status_view.html" %} {% endblock %} diff --git a/src/registrar/utility/enums.py b/src/registrar/utility/enums.py index ad98489e1..21c03917c 100644 --- a/src/registrar/utility/enums.py +++ b/src/registrar/utility/enums.py @@ -72,7 +72,7 @@ class PortfolioDomainRequestStep(StrEnum): appear in the order they are defined. (Order matters.) """ # Portfolio - REQUESTING_ENTITY = "portfolio" + REQUESTING_ENTITY = "organization_name" CURRENT_SITES = "current_sites" DOTGOV_DOMAIN = "dotgov_domain" PURPOSE = "purpose" From d56262be07631e0f1857d9a1556c49e92289fc0f Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:30:20 -0600 Subject: [PATCH 13/17] Add unit test for viewonly page --- src/registrar/tests/test_views_request.py | 37 +++++++++++++++++++++++ src/registrar/views/domain_request.py | 4 ++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/registrar/tests/test_views_request.py b/src/registrar/tests/test_views_request.py index 2cb3a381c..71aeb3c1d 100644 --- a/src/registrar/tests/test_views_request.py +++ b/src/registrar/tests/test_views_request.py @@ -3025,3 +3025,40 @@ class TestWizardUnlockingSteps(TestWithUser, WebTest): else: self.fail(f"Expected a redirect, but got a different response: {response}") + + +class TestPortfolioDomainRequestViewonly(TestWithUser, WebTest): + + # Doesn't work with CSRF checking + # hypothesis is that CSRF_USE_SESSIONS is incompatible with WebTest + csrf_checks = False + + def setUp(self): + super().setUp() + self.federal_agency, _ = FederalAgency.objects.get_or_create(agency="General Services Administration") + self.app.set_user(self.user.username) + self.TITLES = DomainRequestWizard.TITLES + + def tearDown(self): + super().tearDown() + DomainRequest.objects.all().delete() + DomainInformation.objects.all().delete() + self.federal_agency.delete() + + @less_console_noise_decorator + @override_flag("organization_feature", active=True) + def test_domain_request_viewonly_displays_correct_fields(self): + """Tests that the viewonly page displays different fields""" + portfolio, _ = Portfolio.objects.get_or_create(creator=self.user, organization_name="Test Portfolio") + UserPortfolioPermission.objects.get_or_create( + user=self.user, portfolio=portfolio, roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN] + ) + dummy_user, _ = User.objects.get_or_create(username="testusername123456") + domain_request = completed_domain_request(status=DomainRequest.DomainRequestStatus.SUBMITTED, user=dummy_user) + domain_request.save() + + detail_page = self.app.get(f"/domain-request/viewonly/{domain_request.id}") + self.assertContains(detail_page, "Requesting entity") + self.assertNotContains(detail_page, "Type of organization") + self.assertContains(detail_page, "city.gov") + self.assertContains(detail_page, "Status:") \ No newline at end of file diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 2724ec649..8d0648e69 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -26,7 +26,6 @@ from .utility import ( logger = logging.getLogger(__name__) - class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): """ A common set of methods and configuration. @@ -43,6 +42,7 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): Any method not marked as internal can be overridden in a subclass, although not without consulting the base implementation, first. """ + StepEnum = Step template_name = "" @@ -903,4 +903,6 @@ class PortfolioDomainRequestStatusViewOnly(DomainRequestPortfolioViewonlyView): context["steps"] = request_step_list(wizard) context["form_titles"] = wizard.TITLES return context + + # endregion From 16076a1b7562d0baab7c9f769698854024c356de Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:44:45 -0600 Subject: [PATCH 14/17] Update test_models.py --- src/registrar/tests/test_models.py | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/registrar/tests/test_models.py b/src/registrar/tests/test_models.py index a6e889503..a6cac1389 100644 --- a/src/registrar/tests/test_models.py +++ b/src/registrar/tests/test_models.py @@ -114,6 +114,54 @@ class TestDomainRequest(TestCase): with less_console_noise(): return self.assertRaises(Exception, None, exception_type) + @less_console_noise_decorator + def test_request_is_withdrawable(self): + """Tests the is_withdrawable function""" + domain_request_1 = completed_domain_request( + status=DomainRequest.DomainRequestStatus.SUBMITTED, + name="city2.gov", + ) + domain_request_2 = completed_domain_request( + status=DomainRequest.DomainRequestStatus.IN_REVIEW, + name="city3.gov", + ) + domain_request_3 = completed_domain_request( + status=DomainRequest.DomainRequestStatus.ACTION_NEEDED, + name="city4.gov", + ) + domain_request_4 = completed_domain_request( + status=DomainRequest.DomainRequestStatus.REJECTED, + name="city5.gov", + ) + self.assertTrue(domain_request_1.is_withdrawable()) + self.assertTrue(domain_request_2.is_withdrawable()) + self.assertTrue(domain_request_3.is_withdrawable()) + self.assertFalse(domain_request_4.is_withdrawable()) + + @less_console_noise_decorator + def test_request_is_awaiting_review(self): + """Tests the is_awaiting_review function""" + domain_request_1 = completed_domain_request( + status=DomainRequest.DomainRequestStatus.SUBMITTED, + name="city2.gov", + ) + domain_request_2 = completed_domain_request( + status=DomainRequest.DomainRequestStatus.IN_REVIEW, + name="city3.gov", + ) + domain_request_3 = completed_domain_request( + status=DomainRequest.DomainRequestStatus.ACTION_NEEDED, + name="city4.gov", + ) + domain_request_4 = completed_domain_request( + status=DomainRequest.DomainRequestStatus.REJECTED, + name="city5.gov", + ) + self.assertTrue(domain_request_1.is_awaiting_review()) + self.assertTrue(domain_request_2.is_awaiting_review()) + self.assertFalse(domain_request_3.is_awaiting_review()) + self.assertFalse(domain_request_4.is_awaiting_review()) + @less_console_noise_decorator def test_federal_agency_set_to_non_federal_on_approve(self): """Ensures that when the federal_agency field is 'none' when .approve() is called, From 2f2dec715cce9160353ee40849794cf1f94835d0 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:48:37 -0600 Subject: [PATCH 15/17] linting --- src/registrar/forms/utility/wizard_form_helper.py | 1 - src/registrar/tests/test_views_request.py | 2 +- src/registrar/utility/enums.py | 3 +++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/registrar/forms/utility/wizard_form_helper.py b/src/registrar/forms/utility/wizard_form_helper.py index 578d6462d..45a493d30 100644 --- a/src/registrar/forms/utility/wizard_form_helper.py +++ b/src/registrar/forms/utility/wizard_form_helper.py @@ -290,4 +290,3 @@ def request_step_list(request_wizard): if condition: step_list.append(step) return step_list - diff --git a/src/registrar/tests/test_views_request.py b/src/registrar/tests/test_views_request.py index 71aeb3c1d..8530859e2 100644 --- a/src/registrar/tests/test_views_request.py +++ b/src/registrar/tests/test_views_request.py @@ -3061,4 +3061,4 @@ class TestPortfolioDomainRequestViewonly(TestWithUser, WebTest): self.assertContains(detail_page, "Requesting entity") self.assertNotContains(detail_page, "Type of organization") self.assertContains(detail_page, "city.gov") - self.assertContains(detail_page, "Status:") \ No newline at end of file + self.assertContains(detail_page, "Status:") diff --git a/src/registrar/utility/enums.py b/src/registrar/utility/enums.py index 21c03917c..b4fc5ed6f 100644 --- a/src/registrar/utility/enums.py +++ b/src/registrar/utility/enums.py @@ -3,6 +3,7 @@ from enum import Enum from registrar.utility import StrEnum + class ValidationReturnType(Enum): """Determines the return value of the validate_and_handle_errors class""" @@ -64,6 +65,7 @@ class Step(StrEnum): REQUIREMENTS = "requirements" REVIEW = "review" + class PortfolioDomainRequestStep(StrEnum): """ Names for each page of the portfolio domain request wizard. @@ -71,6 +73,7 @@ class PortfolioDomainRequestStep(StrEnum): As with Django's own `TextChoices` class, steps will appear in the order they are defined. (Order matters.) """ + # Portfolio REQUESTING_ENTITY = "organization_name" CURRENT_SITES = "current_sites" From 7ef2e953761bdc32bbb7e0544f5d86a47a12be07 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Fri, 20 Sep 2024 12:13:29 -0600 Subject: [PATCH 16/17] remove unused import --- src/registrar/forms/utility/wizard_form_helper.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/registrar/forms/utility/wizard_form_helper.py b/src/registrar/forms/utility/wizard_form_helper.py index 45a493d30..ba3c37e1e 100644 --- a/src/registrar/forms/utility/wizard_form_helper.py +++ b/src/registrar/forms/utility/wizard_form_helper.py @@ -4,7 +4,6 @@ from itertools import zip_longest from typing import Callable from django.db.models.fields.related import ForeignObjectRel from django import forms -from registrar.utility.enums import Step from registrar.models import DomainRequest, Contact From bb8e81ea8674c1fde2dad00c19277613dbad307d Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Fri, 20 Sep 2024 13:00:18 -0600 Subject: [PATCH 17/17] Update domain_request.py --- src/registrar/views/domain_request.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 8d0648e69..b7462f300 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -43,7 +43,7 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): although not without consulting the base implementation, first. """ - StepEnum = Step + StepEnum: Step = Step # type: ignore template_name = "" # uniquely namespace the wizard in urls.py @@ -501,7 +501,7 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView): # TODO - this is a WIP until the domain request experience for portfolios is complete class PortfolioDomainRequestWizard(DomainRequestWizard): - StepEnum = PortfolioDomainRequestStep + StepEnum: PortfolioDomainRequestStep = PortfolioDomainRequestStep # type: ignore TITLES = { StepEnum.REQUESTING_ENTITY: _("Requesting entity"),