mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-20 17:56:11 +02:00
Merge branch 'main' into rjm/2651-action-needed-email
This commit is contained in:
commit
272f68c421
51 changed files with 1230 additions and 480 deletions
|
@ -913,3 +913,11 @@ ul.add-list-reset {
|
||||||
.dl-dja dt {
|
.dl-dja dt {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.domain-name-wrap {
|
||||||
|
white-space: normal;
|
||||||
|
word-wrap: break-word;
|
||||||
|
overflow: visible;
|
||||||
|
word-break: break-all;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
@use "base" as *;
|
||||||
|
|
||||||
// Fixes some font size disparities with the Figma
|
// Fixes some font size disparities with the Figma
|
||||||
// for usa-alert alert elements
|
// for usa-alert alert elements
|
||||||
.usa-alert {
|
.usa-alert {
|
||||||
|
@ -22,3 +24,8 @@
|
||||||
margin-left: 0.5rem!important;
|
margin-left: 0.5rem!important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: !important is used because _font.scss overrides this
|
||||||
|
.usa-alert__body--widescreen {
|
||||||
|
max-width: $widescreen-max-width !important;
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
@use "uswds-core" as *;
|
@use "uswds-core" as *;
|
||||||
@use "cisa_colors" as *;
|
@use "cisa_colors" as *;
|
||||||
|
|
||||||
|
$widescreen-max-width: 1920px;
|
||||||
|
|
||||||
/* Styles for making visible to screen reader / AT users only. */
|
/* Styles for making visible to screen reader / AT users only. */
|
||||||
.sr-only {
|
.sr-only {
|
||||||
@include sr-only;
|
@include sr-only;
|
||||||
|
@ -102,6 +104,24 @@ body {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This is a hack to keep the "Export" button on Domain Requests page inline
|
||||||
|
with the searchbar in widescreen mode.
|
||||||
|
|
||||||
|
EXPLANATION: The existing frontend implementation puts the searchbar and export
|
||||||
|
button in two separate columns in a grid, which creates a solid wrap-around effect
|
||||||
|
for mobile devices. The searchbar had a max-width that exactly equaled the max width
|
||||||
|
of its parent column (for non-widescreens), so there wasn't any issue at this time of
|
||||||
|
implementation.
|
||||||
|
However, during immplementation of widescreen mode this small max-width caused the searchbar to
|
||||||
|
no longer fill its parent grid column for larger screen sizes, creating a visual gap between
|
||||||
|
it and the adjacent export button. To fix this, we will limit the width of the first
|
||||||
|
grid column to the max-width of the searchbar, which was calculated to be 33rem.
|
||||||
|
*/
|
||||||
|
.section-outlined__search--widescreen {
|
||||||
|
max-width: 33rem;
|
||||||
|
}
|
||||||
|
|
||||||
.break-word {
|
.break-word {
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
|
@ -222,6 +242,14 @@ abbr[title] {
|
||||||
left: auto!important;
|
left: auto!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.usa-banner__inner--widescreen {
|
||||||
|
max-width: $widescreen-max-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
.margin-right-neg-4px {
|
||||||
|
margin-right: -4px;
|
||||||
|
}
|
||||||
|
|
||||||
.break-word {
|
.break-word {
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
|
|
8
src/registrar/assets/sass/_theme/_containers.scss
Normal file
8
src/registrar/assets/sass/_theme/_containers.scss
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
@use "uswds-core" as *;
|
||||||
|
@use "base" as *;
|
||||||
|
|
||||||
|
//NOTE: !important is needed because it gets overriden by other .scss for footer nav
|
||||||
|
.grid-container--widescreen,
|
||||||
|
.usa-identifier__container--widescreen {
|
||||||
|
max-width: $widescreen-max-width !important;
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
@use "uswds-core" as *;
|
@use "uswds-core" as *;
|
||||||
@use "cisa_colors" as *;
|
@use "cisa_colors" as *;
|
||||||
|
@use "base" as *;
|
||||||
|
|
||||||
// Define some styles for the .gov header/logo
|
// Define some styles for the .gov header/logo
|
||||||
.usa-logo button {
|
.usa-logo button {
|
||||||
|
@ -127,3 +128,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.usa-nav__inner--widescreen,
|
||||||
|
.usa-navbar--widescreen,
|
||||||
|
.usa-nav-container--widescreen {
|
||||||
|
max-width: $widescreen-max-width !important;
|
||||||
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
@forward "identifier";
|
@forward "identifier";
|
||||||
@forward "header";
|
@forward "header";
|
||||||
@forward "register-form";
|
@forward "register-form";
|
||||||
|
@forward "containers";
|
||||||
|
|
||||||
/*--------------------------------------------------
|
/*--------------------------------------------------
|
||||||
--- Admin ---------------------------------*/
|
--- Admin ---------------------------------*/
|
||||||
|
|
|
@ -246,6 +246,7 @@ TEMPLATES = [
|
||||||
"registrar.context_processors.org_user_status",
|
"registrar.context_processors.org_user_status",
|
||||||
"registrar.context_processors.add_path_to_context",
|
"registrar.context_processors.add_path_to_context",
|
||||||
"registrar.context_processors.portfolio_permissions",
|
"registrar.context_processors.portfolio_permissions",
|
||||||
|
"registrar.context_processors.is_widescreen_mode",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -175,6 +175,11 @@ urlpatterns = [
|
||||||
views.DomainRequestStatus.as_view(),
|
views.DomainRequestStatus.as_view(),
|
||||||
name="domain-request-status",
|
name="domain-request-status",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"domain-request/viewonly/<int:pk>",
|
||||||
|
views.PortfolioDomainRequestStatusViewOnly.as_view(),
|
||||||
|
name="domain-request-status-viewonly",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"domain-request/<int:pk>/withdraw",
|
"domain-request/<int:pk>/withdraw",
|
||||||
views.DomainRequestWithdrawConfirmation.as_view(),
|
views.DomainRequestWithdrawConfirmation.as_view(),
|
||||||
|
|
|
@ -94,3 +94,8 @@ def portfolio_permissions(request):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# Handles cases where request.user might not exist
|
# Handles cases where request.user might not exist
|
||||||
return portfolio_context
|
return portfolio_context
|
||||||
|
|
||||||
|
|
||||||
|
def is_widescreen_mode(request):
|
||||||
|
widescreen_paths = ["/domains/", "/requests/"]
|
||||||
|
return {"is_widescreen_mode": any(path in request.path for path in widescreen_paths) or request.path == "/"}
|
||||||
|
|
|
@ -4,7 +4,6 @@ from itertools import zip_longest
|
||||||
from typing import Callable
|
from typing import Callable
|
||||||
from django.db.models.fields.related import ForeignObjectRel
|
from django.db.models.fields.related import ForeignObjectRel
|
||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
from registrar.models import DomainRequest, Contact
|
from registrar.models import DomainRequest, Contact
|
||||||
|
|
||||||
|
|
||||||
|
@ -278,3 +277,15 @@ class BaseYesNoForm(RegistrarForm):
|
||||||
# No pre-selection for new domain requests
|
# No pre-selection for new domain requests
|
||||||
initial_value = self.form_is_checked if self.domain_request else None
|
initial_value = self.form_is_checked if self.domain_request else None
|
||||||
return initial_value
|
return initial_value
|
||||||
|
|
||||||
|
|
||||||
|
def request_step_list(request_wizard):
|
||||||
|
"""Dynamically generated list of steps in the form wizard."""
|
||||||
|
step_list = []
|
||||||
|
for step in request_wizard.StepEnum:
|
||||||
|
condition = request_wizard.WIZARD_CONDITIONS.get(step, True)
|
||||||
|
if callable(condition):
|
||||||
|
condition = condition(request_wizard)
|
||||||
|
if condition:
|
||||||
|
step_list.append(step)
|
||||||
|
return step_list
|
||||||
|
|
|
@ -583,6 +583,10 @@ class DomainRequest(TimeStampedModel):
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def is_awaiting_review(self) -> bool:
|
||||||
|
"""Checks if the current status is in submitted or in_review"""
|
||||||
|
return self.status in [self.DomainRequestStatus.SUBMITTED, self.DomainRequestStatus.IN_REVIEW]
|
||||||
|
|
||||||
def get_first_status_set_date(self, status):
|
def get_first_status_set_date(self, status):
|
||||||
"""Returns the date when the domain request was first set to the given status."""
|
"""Returns the date when the domain request was first set to the given status."""
|
||||||
log_entry = (
|
log_entry = (
|
||||||
|
@ -1001,6 +1005,17 @@ class DomainRequest(TimeStampedModel):
|
||||||
send_email=send_email,
|
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(
|
@transition(
|
||||||
field="status",
|
field="status",
|
||||||
source=[DomainRequestStatus.SUBMITTED, DomainRequestStatus.IN_REVIEW, DomainRequestStatus.ACTION_NEEDED],
|
source=[DomainRequestStatus.SUBMITTED, DomainRequestStatus.IN_REVIEW, DomainRequestStatus.ACTION_NEEDED],
|
||||||
|
|
|
@ -3,7 +3,6 @@ import logging
|
||||||
from django.contrib.auth.models import AbstractUser
|
from django.contrib.auth.models import AbstractUser
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.http import HttpRequest
|
|
||||||
|
|
||||||
from registrar.models import DomainInformation, UserDomainRole
|
from registrar.models import DomainInformation, UserDomainRole
|
||||||
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices
|
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices
|
||||||
|
@ -14,6 +13,7 @@ from .transition_domain import TransitionDomain
|
||||||
from .verified_by_staff import VerifiedByStaff
|
from .verified_by_staff import VerifiedByStaff
|
||||||
from .domain import Domain
|
from .domain import Domain
|
||||||
from .domain_request import DomainRequest
|
from .domain_request import DomainRequest
|
||||||
|
from registrar.utility.waffle import flag_is_active_for_user
|
||||||
from waffle.decorators import flag_is_active
|
from waffle.decorators import flag_is_active
|
||||||
|
|
||||||
from phonenumber_field.modelfields import PhoneNumberField # type: ignore
|
from phonenumber_field.modelfields import PhoneNumberField # type: ignore
|
||||||
|
@ -204,14 +204,10 @@ class User(AbstractUser):
|
||||||
) or self._has_portfolio_permission(portfolio, UserPortfolioPermissionChoices.VIEW_MANAGED_DOMAINS)
|
) or self._has_portfolio_permission(portfolio, UserPortfolioPermissionChoices.VIEW_MANAGED_DOMAINS)
|
||||||
|
|
||||||
def has_organization_requests_flag(self):
|
def has_organization_requests_flag(self):
|
||||||
request = HttpRequest()
|
return flag_is_active_for_user(self, "organization_requests")
|
||||||
request.user = self
|
|
||||||
return flag_is_active(request, "organization_requests")
|
|
||||||
|
|
||||||
def has_organization_members_flag(self):
|
def has_organization_members_flag(self):
|
||||||
request = HttpRequest()
|
return flag_is_active_for_user(self, "organization_members")
|
||||||
request.user = self
|
|
||||||
return flag_is_active(request, "organization_members")
|
|
||||||
|
|
||||||
def has_view_members_portfolio_permission(self, portfolio):
|
def has_view_members_portfolio_permission(self, portfolio):
|
||||||
# BEGIN
|
# BEGIN
|
||||||
|
@ -422,12 +418,8 @@ class User(AbstractUser):
|
||||||
for invitation in PortfolioInvitation.objects.filter(
|
for invitation in PortfolioInvitation.objects.filter(
|
||||||
email__iexact=self.email, status=PortfolioInvitation.PortfolioInvitationStatus.INVITED
|
email__iexact=self.email, status=PortfolioInvitation.PortfolioInvitationStatus.INVITED
|
||||||
):
|
):
|
||||||
# need to create a bogus request and assign user to it, in order to pass request
|
|
||||||
# to flag_is_active
|
|
||||||
request = HttpRequest()
|
|
||||||
request.user = self
|
|
||||||
only_single_portfolio = (
|
only_single_portfolio = (
|
||||||
not flag_is_active(request, "multiple_portfolios") and self.get_first_portfolio() is None
|
not flag_is_active_for_user(self, "multiple_portfolios") and self.get_first_portfolio() is None
|
||||||
)
|
)
|
||||||
if only_single_portfolio or flag_is_active(None, "multiple_portfolios"):
|
if only_single_portfolio or flag_is_active(None, "multiple_portfolios"):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.forms import ValidationError
|
from django.forms import ValidationError
|
||||||
from django.http import HttpRequest
|
from registrar.utility.waffle import flag_is_active_for_user
|
||||||
from waffle import flag_is_active
|
|
||||||
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices
|
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices
|
||||||
from .utility.time_stamped_model import TimeStampedModel
|
from .utility.time_stamped_model import TimeStampedModel
|
||||||
from django.contrib.postgres.fields import ArrayField
|
from django.contrib.postgres.fields import ArrayField
|
||||||
|
@ -101,11 +100,8 @@ class UserPortfolioPermission(TimeStampedModel):
|
||||||
# Check if a user is set without accessing the related object.
|
# Check if a user is set without accessing the related object.
|
||||||
has_user = bool(self.user_id)
|
has_user = bool(self.user_id)
|
||||||
if self.pk is None and has_user:
|
if self.pk is None and has_user:
|
||||||
# Have to create a bogus request to set the user and pass to flag_is_active
|
|
||||||
request = HttpRequest()
|
|
||||||
request.user = self.user
|
|
||||||
existing_permissions = UserPortfolioPermission.objects.filter(user=self.user)
|
existing_permissions = UserPortfolioPermission.objects.filter(user=self.user)
|
||||||
if not flag_is_active(request, "multiple_portfolios") and existing_permissions.exists():
|
if not flag_is_active_for_user(self.user, "multiple_portfolios") and existing_permissions.exists():
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
"Only one portfolio permission is allowed per user when multiple portfolios are disabled."
|
"Only one portfolio permission is allowed per user when multiple portfolios are disabled."
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
{% block title %}{% translate "Unauthorized | " %}{% endblock %}
|
{% block title %}{% translate "Unauthorized | " %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main id="main-content" class="grid-container">
|
<main id="main-content" class="grid-container {% if is_widescreen_mode %} grid-container--widescreen {% endif %}">
|
||||||
<div class="grid-row grow-gap">
|
<div class="grid-row grow-gap">
|
||||||
<div class="tablet:grid-col-6 usa-prose margin-bottom-3">
|
<div class="tablet:grid-col-6 usa-prose margin-bottom-3">
|
||||||
<h1>
|
<h1>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
{% block title %}{% translate "Forbidden | " %}{% endblock %}
|
{% block title %}{% translate "Forbidden | " %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main id="main-content" class="grid-container">
|
<main id="main-content" class="grid-container {% if is_widescreen_mode %} grid-container--widescreen {% endif %}">
|
||||||
<div class="grid-row grow-gap">
|
<div class="grid-row grow-gap">
|
||||||
<div class="tablet:grid-col-6 usa-prose margin-bottom-3">
|
<div class="tablet:grid-col-6 usa-prose margin-bottom-3">
|
||||||
<h1>
|
<h1>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
{% block title %}{% translate "Page not found | " %}{% endblock %}
|
{% block title %}{% translate "Page not found | " %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main id="main-content" class="grid-container">
|
<main id="main-content" class="grid-container {% if is_widescreen_mode %} grid-container--widescreen {% endif %}">
|
||||||
<div class="grid-row grid-gap">
|
<div class="grid-row grid-gap">
|
||||||
<div class="tablet:grid-col-6 usa-prose margin-bottom-3">
|
<div class="tablet:grid-col-6 usa-prose margin-bottom-3">
|
||||||
<h1>
|
<h1>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
{% block title %}{% translate "Server error | " %}{% endblock %}
|
{% block title %}{% translate "Server error | " %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main id="main-content" class="grid-container">
|
<main id="main-content" class="grid-container {% if is_widescreen_mode %} grid-container--widescreen {% endif %}">
|
||||||
<div class="grid-row grid-gap">
|
<div class="grid-row grid-gap">
|
||||||
<div class="tablet:grid-col-6 usa-prose margin-bottom-3">
|
<div class="tablet:grid-col-6 usa-prose margin-bottom-3">
|
||||||
<h1>
|
<h1>
|
||||||
|
|
|
@ -78,7 +78,7 @@
|
||||||
<section class="usa-banner" aria-label="Official website of the United States government">
|
<section class="usa-banner" aria-label="Official website of the United States government">
|
||||||
<div class="usa-accordion">
|
<div class="usa-accordion">
|
||||||
<header class="usa-banner__header">
|
<header class="usa-banner__header">
|
||||||
<div class="usa-banner__inner">
|
<div class="usa-banner__inner {% if is_widescreen_mode %} usa-banner__inner--widescreen {% endif %}">
|
||||||
<div class="grid-col-auto">
|
<div class="grid-col-auto">
|
||||||
<img class="usa-banner__header-flag" src="{% static 'img/us_flag_small.png' %}" alt="U.S. flag" />
|
<img class="usa-banner__header-flag" src="{% static 'img/us_flag_small.png' %}" alt="U.S. flag" />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<div class="grid-row grid-gap">
|
<div class="grid-row grid-gap">
|
||||||
<div class="tablet:grid-col-3">
|
<div class="tablet:grid-col-3">
|
||||||
<p class="font-body-md margin-top-0 margin-bottom-2
|
<p class="font-body-md margin-top-0 margin-bottom-2
|
||||||
text-primary-darker text-semibold"
|
text-primary-darker text-semibold domain-name-wrap"
|
||||||
>
|
>
|
||||||
<span class="usa-sr-only"> Domain name:</span> {{ domain.name }}
|
<span class="usa-sr-only"> Domain name:</span> {{ domain.name }}
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
{% block domain_content %}
|
{% block domain_content %}
|
||||||
{{ block.super }}
|
{{ block.super }}
|
||||||
<div class="margin-top-4 tablet:grid-col-10">
|
<div class="margin-top-4 tablet:grid-col-10">
|
||||||
<h2 class="text-bold text-primary-dark">{{ domain.name }}</h2>
|
<h2 class="text-bold text-primary-dark domain-name-wrap">{{ domain.name }}</h2>
|
||||||
<div
|
<div
|
||||||
class="usa-summary-box dotgov-status-box padding-bottom-0 margin-top-3 padding-left-2{% if not domain.is_expired %}{% if domain.state == domain.State.UNKNOWN or domain.state == domain.State.DNS_NEEDED %} dotgov-status-box--action-need{% endif %}{% endif %}"
|
class="usa-summary-box dotgov-status-box padding-bottom-0 margin-top-3 padding-left-2{% if not domain.is_expired %}{% if domain.state == domain.State.UNKNOWN or domain.state == domain.State.DNS_NEEDED %} dotgov-status-box--action-need{% endif %}{% endif %}"
|
||||||
role="region"
|
role="region"
|
||||||
|
|
|
@ -19,183 +19,5 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block form_fields %}
|
{% block form_fields %}
|
||||||
{% for step in steps.all|slice:":-1" %}
|
{% include "includes/request_review_steps.html" with is_editable=True %}
|
||||||
<section class="summary-item margin-top-3">
|
|
||||||
|
|
||||||
{% 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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}<p>Federally-recognized tribe</p>{% endif %}
|
|
||||||
{% if domain_request.state_recognized_tribe %}<p>State-recognized tribe</p>{% 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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
|
||||||
<h3 class="register-form-review-header">Alternative domains</h3>
|
|
||||||
<ul class="usa-list usa-list--unstyled margin-top-0">
|
|
||||||
{% for site in domain_request.alternative_domains.all %}
|
|
||||||
<li>{{ site.website }}</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% 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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
|
||||||
<h3 class="register-form-review-header">CISA Regional Representative</h3>
|
|
||||||
<ul class="usa-list usa-list--unstyled margin-top-0">
|
|
||||||
{% if domain_request.cisa_representative_first_name %}
|
|
||||||
<li>{{domain_request.cisa_representative_first_name}} {{domain_request.cisa_representative_last_name}}</li>
|
|
||||||
{% if domain_request.cisa_representative_email %}
|
|
||||||
<li>{{domain_request.cisa_representative_email}}</li>
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
No
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 class="register-form-review-header">Anything else</h3>
|
|
||||||
<ul class="usa-list usa-list--unstyled margin-top-0">
|
|
||||||
{% if domain_request.anything_else %}
|
|
||||||
{{domain_request.anything_else}}
|
|
||||||
{% else %}
|
|
||||||
No
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
{% else %}
|
|
||||||
{% include "includes/summary_item.html" with title="Additional Details" value="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
{% endfor %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,206 +1,10 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% load custom_filters %}
|
{% load custom_filters %}
|
||||||
|
|
||||||
{% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %}
|
|
||||||
{% load static url_helpers %}
|
{% load static url_helpers %}
|
||||||
|
|
||||||
|
{% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %}
|
||||||
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main id="main-content" class="grid-container">
|
{% include "includes/request_status_manage.html" %}
|
||||||
<div class="grid-col desktop:grid-offset-2 desktop:grid-col-8">
|
|
||||||
{% if portfolio %}
|
|
||||||
{% url 'domain-requests' as url %}
|
|
||||||
{% else %}
|
|
||||||
{% url 'home' as url %}
|
|
||||||
{% endif %}
|
|
||||||
<nav class="usa-breadcrumb padding-top-0" aria-label="Domain request breadcrumb">
|
|
||||||
<ol class="usa-breadcrumb__list">
|
|
||||||
<li class="usa-breadcrumb__list-item">
|
|
||||||
{% if portfolio %}
|
|
||||||
<a href="{{ url }}" class="usa-breadcrumb__link"><span>Domain requests</span></a>
|
|
||||||
{% else %}
|
|
||||||
<a href="{{ url }}" class="usa-breadcrumb__link"><span>Manage your domains</span></a>
|
|
||||||
{% endif %}
|
|
||||||
</li>
|
|
||||||
<li class="usa-breadcrumb__list-item usa-current" aria-current="page">
|
|
||||||
{% if not DomainRequest.requested_domain and DomainRequest.status == DomainRequest.DomainRequestStatus.STARTED %}
|
|
||||||
<span>New domain request</span>
|
|
||||||
{% else %}
|
|
||||||
<span>{{ DomainRequest.requested_domain.name }}</span>
|
|
||||||
{% endif %}
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<h1>Domain request for {{ DomainRequest.requested_domain.name }}</h1>
|
|
||||||
<div
|
|
||||||
class="usa-summary-box dotgov-status-box margin-top-3 padding-left-2"
|
|
||||||
role="region"
|
|
||||||
aria-labelledby="summary-box-key-information"
|
|
||||||
>
|
|
||||||
<div class="usa-summary-box__body">
|
|
||||||
<p class="usa-summary-box__heading font-sans-md margin-bottom-0"
|
|
||||||
id="summary-box-key-information"
|
|
||||||
>
|
|
||||||
<span class="text-bold text-primary-darker">
|
|
||||||
Status:
|
|
||||||
</span>
|
|
||||||
{{ DomainRequest.get_status_display|default:"ERROR Please contact technical support/dev" }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
{% 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" %}
|
|
||||||
<p class="margin-top-1">
|
|
||||||
{% 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 %}
|
|
||||||
<b class="review__step__name">Started on:</b> {{last_status_update|default:first_started_date}}
|
|
||||||
</p>
|
|
||||||
{% endwith %}
|
|
||||||
{% elif DomainRequest.status == statuses.SUBMITTED %}
|
|
||||||
<p class="margin-top-1 margin-bottom-1">
|
|
||||||
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
|
||||||
</p>
|
|
||||||
<p class="margin-top-1">
|
|
||||||
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
|
||||||
</p>
|
|
||||||
{% elif DomainRequest.status == statuses.ACTION_NEEDED %}
|
|
||||||
<p class="margin-top-1 margin-bottom-1">
|
|
||||||
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
|
||||||
</p>
|
|
||||||
<p class="margin-top-1">
|
|
||||||
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
|
||||||
</p>
|
|
||||||
{% elif DomainRequest.status == statuses.REJECTED %}
|
|
||||||
<p class="margin-top-1 margin-bottom-1">
|
|
||||||
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
|
||||||
</p>
|
|
||||||
<p class="margin-top-1">
|
|
||||||
<b class="review__step__name">Rejected on:</b> {{last_status_update}}
|
|
||||||
</p>
|
|
||||||
{% elif DomainRequest.status == statuses.WITHDRAWN %}
|
|
||||||
<p class="margin-top-1 margin-bottom-1">
|
|
||||||
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
|
||||||
</p>
|
|
||||||
<p class="margin-top-1">
|
|
||||||
<b class="review__step__name">Withdrawn on:</b> {{last_status_update}}
|
|
||||||
</p>
|
|
||||||
{% else %}
|
|
||||||
{% comment %} Shown for in_review, approved, ineligible {% endcomment %}
|
|
||||||
<p class="margin-top-1">
|
|
||||||
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if DomainRequest.status != 'rejected' %}
|
|
||||||
<p>{% include "includes/domain_request.html" %}</p>
|
|
||||||
<p><a href="{% url 'domain-request-withdraw-confirmation' pk=DomainRequest.id %}" class="usa-button usa-button--outline withdraw_outline">
|
|
||||||
Withdraw request</a>
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
{% endwith %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="grid-col desktop:grid-offset-2 maxw-tablet">
|
|
||||||
<h2 class="text-primary-darker"> Summary of your domain request </h2>
|
|
||||||
{% 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 %}
|
|
||||||
<p>Federally-recognized tribe</p>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if DomainRequest.state_recognized_tribe %}
|
|
||||||
<p>State-recognized tribe</p>
|
|
||||||
{% 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 %}
|
|
||||||
<h3 class="register-form-review-header">CISA Regional Representative</h3>
|
|
||||||
<ul class="usa-list usa-list--unstyled margin-top-0">
|
|
||||||
{% if DomainRequest.cisa_representative_first_name %}
|
|
||||||
{{ DomainRequest.get_formatted_cisa_rep_name }}
|
|
||||||
{% else %}
|
|
||||||
No
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 class="register-form-review-header">Anything else</h3>
|
|
||||||
<ul class="usa-list usa-list--unstyled margin-top-0">
|
|
||||||
{% if DomainRequest.anything_else %}
|
|
||||||
{{DomainRequest.anything_else}}
|
|
||||||
{% else %}
|
|
||||||
No
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
|
||||||
{% endwith %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</main>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
{% block title %} Home | {% endblock %}
|
{% block title %} Home | {% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main id="main-content" class="grid-container">
|
<main id="main-content" class="grid-container {% if is_widescreen_mode %} grid-container--widescreen {% endif %}">
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
{# the entire logged in page goes here #}
|
{# the entire logged in page goes here #}
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,10 @@
|
||||||
</h2>
|
</h2>
|
||||||
<p>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. <a class="usa-link" rel="noopener noreferrer" target="_blank" href="{% public_site_url 'contact' %}">Contact us with any questions</a>.</p>
|
<p>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. <a class="usa-link" rel="noopener noreferrer" target="_blank" href="{% public_site_url 'contact' %}">Contact us with any questions</a>.</p>
|
||||||
|
|
||||||
|
{% if show_withdraw_text %}
|
||||||
<h2 class="margin-top-0 margin-bottom-2 text-primary-darker text-semibold">
|
<h2 class="margin-top-0 margin-bottom-2 text-primary-darker text-semibold">
|
||||||
Need to make changes?
|
Need to make changes?
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<p>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.</p>
|
<p>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.</p>
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,236 @@
|
||||||
|
{% load custom_filters %}
|
||||||
|
{% load static url_helpers %}
|
||||||
|
<main id="main-content" class="grid-container">
|
||||||
|
<div class="grid-col desktop:grid-offset-2 desktop:grid-col-8">
|
||||||
|
{% block breadcrumb %}
|
||||||
|
{% if portfolio %}
|
||||||
|
{% url 'domain-requests' as url %}
|
||||||
|
{% else %}
|
||||||
|
{% url 'home' as url %}
|
||||||
|
{% endif %}
|
||||||
|
<nav class="usa-breadcrumb padding-top-0" aria-label="Domain request breadcrumb">
|
||||||
|
<ol class="usa-breadcrumb__list">
|
||||||
|
<li class="usa-breadcrumb__list-item">
|
||||||
|
{% if portfolio %}
|
||||||
|
<a href="{{ url }}" class="usa-breadcrumb__link"><span>Domain requests</span></a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ url }}" class="usa-breadcrumb__link"><span>Manage your domains</span></a>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
<li class="usa-breadcrumb__list-item usa-current" aria-current="page">
|
||||||
|
{% if not DomainRequest.requested_domain and DomainRequest.status == DomainRequest.DomainRequestStatus.STARTED %}
|
||||||
|
<span>New domain request</span>
|
||||||
|
{% else %}
|
||||||
|
<span>{{ DomainRequest.requested_domain.name }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
{% endblock breadcrumb %}
|
||||||
|
|
||||||
|
{% block header %}
|
||||||
|
{% if not DomainRequest.requested_domain and DomainRequest.status == DomainRequest.DomainRequestStatus.STARTED %}
|
||||||
|
<h1>New domain request</h1>
|
||||||
|
{% else %}
|
||||||
|
<h1>Domain request for {{ DomainRequest.requested_domain.name }}</h1>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock header %}
|
||||||
|
|
||||||
|
{% block status_summary %}
|
||||||
|
<div
|
||||||
|
class="usa-summary-box dotgov-status-box margin-top-3 padding-left-2"
|
||||||
|
role="region"
|
||||||
|
aria-labelledby="summary-box-key-information"
|
||||||
|
>
|
||||||
|
<div class="usa-summary-box__body">
|
||||||
|
<p class="usa-summary-box__heading font-sans-md margin-bottom-0"
|
||||||
|
id="summary-box-key-information"
|
||||||
|
>
|
||||||
|
<span class="text-bold text-primary-darker">
|
||||||
|
Status:
|
||||||
|
</span>
|
||||||
|
{{ DomainRequest.get_status_display|default:"ERROR Please contact technical support/dev" }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
{% endblock status_summary %}
|
||||||
|
|
||||||
|
{% block status_metadata %}
|
||||||
|
|
||||||
|
{% if portfolio %}
|
||||||
|
{% if DomainRequest.creator %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Created by:</b> {{DomainRequest.creator.email|default:DomainRequest.creator.get_formatted_name }}
|
||||||
|
</p>
|
||||||
|
{% else %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">No creator found:</b> this is an error, please email <a href="mailto:help@get.gov" class="usa-link">help@get.gov</a>.
|
||||||
|
</p>
|
||||||
|
{% 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" %}
|
||||||
|
<p class="margin-top-1">
|
||||||
|
{% 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 %}
|
||||||
|
<b class="review__step__name">Started on:</b> {{last_status_update|default:first_started_date}}
|
||||||
|
</p>
|
||||||
|
{% endwith %}
|
||||||
|
{% elif DomainRequest.status == statuses.SUBMITTED %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
||||||
|
</p>
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
||||||
|
</p>
|
||||||
|
{% elif DomainRequest.status == statuses.ACTION_NEEDED %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
||||||
|
</p>
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
||||||
|
</p>
|
||||||
|
{% elif DomainRequest.status == statuses.REJECTED %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
||||||
|
</p>
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Rejected on:</b> {{last_status_update}}
|
||||||
|
</p>
|
||||||
|
{% elif DomainRequest.status == statuses.WITHDRAWN %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
||||||
|
</p>
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Withdrawn on:</b> {{last_status_update}}
|
||||||
|
</p>
|
||||||
|
{% else %}
|
||||||
|
{% comment %} Shown for in_review, approved, ineligible {% endcomment %}
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock status_metadata %}
|
||||||
|
|
||||||
|
{% block status_blurb %}
|
||||||
|
{% if DomainRequest.is_awaiting_review %}
|
||||||
|
<p>{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=DomainRequest.is_withdrawable %}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock status_blurb %}
|
||||||
|
|
||||||
|
{% block modify_request %}
|
||||||
|
{% if DomainRequest.is_withdrawable %}
|
||||||
|
<p><a href="{% url 'domain-request-withdraw-confirmation' pk=DomainRequest.id %}" class="usa-button usa-button--outline withdraw_outline">
|
||||||
|
Withdraw request</a>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock modify_request %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid-col desktop:grid-offset-2 maxw-tablet">
|
||||||
|
{% block request_summary_header %}
|
||||||
|
<h2 class="text-primary-darker"> Summary of your domain request </h2>
|
||||||
|
{% 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 %}
|
||||||
|
<p>Federally-recognized tribe</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if DomainRequest.state_recognized_tribe %}
|
||||||
|
<p>State-recognized tribe</p>
|
||||||
|
{% 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 %}
|
||||||
|
<h3 class="register-form-review-header">CISA Regional Representative</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% if DomainRequest.cisa_representative_first_name %}
|
||||||
|
{{ DomainRequest.get_formatted_cisa_rep_name }}
|
||||||
|
{% else %}
|
||||||
|
No
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
<h3 class="register-form-review-header">Anything else</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% if DomainRequest.anything_else %}
|
||||||
|
{{DomainRequest.anything_else}}
|
||||||
|
{% else %}
|
||||||
|
No
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock request_summary%}
|
||||||
|
</div>
|
||||||
|
</main>
|
|
@ -13,7 +13,7 @@
|
||||||
<!-- Embedding the portfolio value in a data attribute -->
|
<!-- Embedding the portfolio value in a data attribute -->
|
||||||
<span id="portfolio-js-value" data-portfolio="{{ portfolio.id }}"></span>
|
<span id="portfolio-js-value" data-portfolio="{{ portfolio.id }}"></span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="section-outlined__search {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6{% endif %}">
|
<div class="section-outlined__search {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6{% endif %} {% if is_widescreen_mode %} section-outlined__search--widescreen {% endif %}">
|
||||||
<section aria-label="Domains search component" class="margin-top-2">
|
<section aria-label="Domains search component" class="margin-top-2">
|
||||||
<form class="usa-search usa-search--small" method="POST" role="search">
|
<form class="usa-search usa-search--small" method="POST" role="search">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
{% if user_domain_count and user_domain_count > 0 %}
|
{% if user_domain_count and user_domain_count > 0 %}
|
||||||
<div class="section-outlined__utility-button mobile-lg:padding-right-105 {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6 desktop:padding-left-3{% endif %}">
|
<div class="section-outlined__utility-button mobile-lg:padding-right-105 {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6 desktop:padding-left-3{% endif %}">
|
||||||
<section aria-label="Domains report component" class="margin-top-205">
|
<section aria-label="Domains report component" class="margin-top-205">
|
||||||
<a href="{% url 'export_data_type_user' %}" class="usa-button usa-button--unstyled usa-button--with-icon" role="button">
|
<a href="{% url 'export_data_type_user' %}" class="usa-button usa-button--unstyled usa-button--with-icon usa-button--justify-right" role="button">
|
||||||
<svg class="usa-icon usa-icon--big" aria-hidden="true" focusable="false" role="img" width="24" height="24">
|
<svg class="usa-icon usa-icon--big" aria-hidden="true" focusable="false" role="img" width="24" height="24">
|
||||||
<use xlink:href="{%static 'img/sprite.svg'%}#file_download"></use>
|
<use xlink:href="{%static 'img/sprite.svg'%}#file_download"></use>
|
||||||
</svg>Export as CSV
|
</svg>Export as CSV
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
<footer class="usa-footer">
|
<footer class="usa-footer">
|
||||||
<div class="usa-footer__secondary-section">
|
<div class="usa-footer__secondary-section">
|
||||||
<div class="grid-container">
|
<div class="grid-container {% if is_widescreen_mode %} grid-container--widescreen {% endif %}">
|
||||||
<div class="grid-row grid-gap">
|
<div class="grid-row grid-gap">
|
||||||
<div
|
<div
|
||||||
class="
|
class="
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
class="usa-identifier__section usa-identifier__section--masthead"
|
class="usa-identifier__section usa-identifier__section--masthead"
|
||||||
aria-label="Agency identifier"
|
aria-label="Agency identifier"
|
||||||
>
|
>
|
||||||
<div class="usa-identifier__container">
|
<div class="usa-identifier__container {% if is_widescreen_mode %} usa-identifier__container--widescreen {% endif %}">
|
||||||
<div class="usa-identifier__logos">
|
<div class="usa-identifier__logos">
|
||||||
<a rel="noopener noreferrer" target="_blank" href="https://www.cisa.gov" class="usa-identifier__logo"
|
<a rel="noopener noreferrer" target="_blank" href="https://www.cisa.gov" class="usa-identifier__logo"
|
||||||
><img
|
><img
|
||||||
|
@ -77,7 +77,7 @@
|
||||||
class="usa-identifier__section usa-identifier__section--required-links"
|
class="usa-identifier__section usa-identifier__section--required-links"
|
||||||
aria-label="Important links"
|
aria-label="Important links"
|
||||||
>
|
>
|
||||||
<div class="usa-identifier__container">
|
<div class="usa-identifier__container {% if is_widescreen_mode %} usa-identifier__container--widescreen {% endif %}">
|
||||||
<ul class="usa-identifier__required-links-list">
|
<ul class="usa-identifier__required-links-list">
|
||||||
<li class="usa-identifier__required-links-item">
|
<li class="usa-identifier__required-links-item">
|
||||||
<a rel="noopener noreferrer" target="_blank" href="{% public_site_url 'about/' %}"
|
<a rel="noopener noreferrer" target="_blank" href="{% public_site_url 'about/' %}"
|
||||||
|
@ -119,7 +119,7 @@
|
||||||
class="usa-identifier__section usa-identifier__section--usagov"
|
class="usa-identifier__section usa-identifier__section--usagov"
|
||||||
aria-label="U.S. government information and services"
|
aria-label="U.S. government information and services"
|
||||||
>
|
>
|
||||||
<div class="usa-identifier__container">
|
<div class="usa-identifier__container {% if is_widescreen_mode %} usa-identifier__container--widescreen {% endif %}">
|
||||||
<div class="usa-identifier__usagov-description">
|
<div class="usa-identifier__usagov-description">
|
||||||
Looking for U.S. government information and services?
|
Looking for U.S. government information and services?
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
|
||||||
<header class="usa-header usa-header--basic">
|
<header class="usa-header usa-header--basic">
|
||||||
<div class="usa-nav-container">
|
<div class="usa-nav-container {% if is_widescreen_mode %} usa-nav-container--widescreen {% endif %}">
|
||||||
<div class="usa-navbar">
|
<div class="usa-navbar">
|
||||||
{% include "includes/gov_extended_logo.html" with logo_clickable=logo_clickable %}
|
{% include "includes/gov_extended_logo.html" with logo_clickable=logo_clickable %}
|
||||||
<button type="button" class="usa-menu-btn">Menu</button>
|
<button type="button" class="usa-menu-btn">Menu</button>
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
{% load custom_filters %}
|
{% load custom_filters %}
|
||||||
|
|
||||||
<header class="usa-header usa-header--extended">
|
<header class="usa-header usa-header--extended">
|
||||||
<div class="usa-navbar">
|
<div class="usa-navbar {% if is_widescreen_mode %} usa-navbar--widescreen {% endif %}">
|
||||||
{% include "includes/gov_extended_logo.html" with logo_clickable=logo_clickable %}
|
{% include "includes/gov_extended_logo.html" with logo_clickable=logo_clickable %}
|
||||||
<button type="button" class="usa-menu-btn">Menu</button>
|
<button type="button" class="usa-menu-btn">Menu</button>
|
||||||
</div>
|
</div>
|
||||||
{% block usa_nav %}
|
{% block usa_nav %}
|
||||||
<nav class="usa-nav" aria-label="Primary navigation">
|
<nav class="usa-nav" aria-label="Primary navigation">
|
||||||
<div class="usa-nav__inner">
|
<div class="usa-nav__inner {% if is_widescreen_mode %} usa-nav__inner--widescreen {% endif %}">
|
||||||
<button type="button" class="usa-nav__close">
|
<button type="button" class="usa-nav__close">
|
||||||
<img src="{%static 'img/usa-icons/close.svg'%}" role="img" alt="Close" />
|
<img src="{%static 'img/usa-icons/close.svg'%}" role="img" alt="Close" />
|
||||||
</button>
|
</button>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="usa-site-alert--emergency margin-y-0 {% if add_class %}{{ add_class }}{% endif %}" aria-label="Site alert">
|
<div class="usa-site-alert--emergency margin-y-0 {% if add_class %}{{ add_class }}{% endif %}" aria-label="Site alert">
|
||||||
<div class="usa-alert">
|
<div class="usa-alert">
|
||||||
<div class="usa-alert__body {% if add_body_class %}{{ add_body_class }}{% endif %}">
|
<div class="usa-alert__body {% if add_body_class %}{{ add_body_class }}{% endif %} {% if is_widescreen_mode %}usa-alert__body--widescreen{% endif %}">
|
||||||
<b>Attention:</b> You are on a test site.
|
<b>Attention:</b> You are on a test site.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
{% load custom_filters %}
|
||||||
|
{% load static url_helpers %}
|
||||||
|
|
||||||
|
{% for step in steps %}
|
||||||
|
<section class="summary-item margin-top-3">
|
||||||
|
{% if is_editable %}
|
||||||
|
{% namespaced_url 'domain-request' step as domain_request_url %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if step == Step.REQUESTING_ENTITY %}
|
||||||
|
|
||||||
|
{% 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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
||||||
|
<h3 class="register-form-review-header">Alternative domains</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% for site in domain_request.alternative_domains.all %}
|
||||||
|
<li>{{ site.website }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if step == Step.PURPOSE %}
|
||||||
|
{% with title=form_titles|get_item:step value=domain_request.purpose|default:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
||||||
|
<h3 class="register-form-review-header">CISA Regional Representative</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% if domain_request.cisa_representative_first_name %}
|
||||||
|
<li>{{domain_request.cisa_representative_first_name}} {{domain_request.cisa_representative_last_name}}</li>
|
||||||
|
{% if domain_request.cisa_representative_email %}
|
||||||
|
<li>{{domain_request.cisa_representative_email}}</li>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
No
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 class="register-form-review-header">Anything else</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% if domain_request.anything_else %}
|
||||||
|
{{domain_request.anything_else}}
|
||||||
|
{% else %}
|
||||||
|
No
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
{% include "includes/summary_item.html" with title="Additional Details" value="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
||||||
|
</section>
|
||||||
|
{% endfor %}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{% 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 %}
|
||||||
|
<p>{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=False %}</p>
|
||||||
|
{% 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_request_review_steps.html" with domain_request=DomainRequest is_editable=False %}
|
||||||
|
{% endblock request_summary %}
|
168
src/registrar/templates/includes/request_review_steps.html
Normal file
168
src/registrar/templates/includes/request_review_steps.html
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
{% load custom_filters %}
|
||||||
|
{% load static url_helpers %}
|
||||||
|
|
||||||
|
{% for step in steps %}
|
||||||
|
<section class="summary-item margin-top-3">
|
||||||
|
{% 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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}<p>Federally-recognized tribe</p>{% endif %}
|
||||||
|
{% if domain_request.state_recognized_tribe %}<p>State-recognized tribe</p>{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% if step == Step.ORGANIZATION_FEDERAL %}
|
||||||
|
{% with title=form_titles|get_item:step value=domain_request.get_federal_type_display|default:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
||||||
|
<h3 class="register-form-review-header">Alternative domains</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% for site in domain_request.alternative_domains.all %}
|
||||||
|
<li>{{ site.website }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if step == Step.PURPOSE %}
|
||||||
|
{% with title=form_titles|get_item:step value=domain_request.purpose|default:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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:"<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
||||||
|
<h3 class="register-form-review-header">CISA Regional Representative</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% if domain_request.cisa_representative_first_name %}
|
||||||
|
<li>{{domain_request.cisa_representative_first_name}} {{domain_request.cisa_representative_last_name}}</li>
|
||||||
|
{% if domain_request.cisa_representative_email %}
|
||||||
|
<li>{{domain_request.cisa_representative_email}}</li>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
No
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 class="register-form-review-header">Anything else</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% if domain_request.anything_else %}
|
||||||
|
{{domain_request.anything_else}}
|
||||||
|
{% else %}
|
||||||
|
No
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
{% include "includes/summary_item.html" with title="Additional Details" value="<span class='text-bold text-secondary-dark'>Incomplete</span>"|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 %}
|
||||||
|
</section>
|
||||||
|
{% endfor %}
|
236
src/registrar/templates/includes/request_status_manage.html
Normal file
236
src/registrar/templates/includes/request_status_manage.html
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
{% load custom_filters %}
|
||||||
|
{% load static url_helpers %}
|
||||||
|
<main id="main-content" class="grid-container">
|
||||||
|
<div class="grid-col desktop:grid-offset-2 desktop:grid-col-8">
|
||||||
|
{% block breadcrumb %}
|
||||||
|
{% if portfolio %}
|
||||||
|
{% url 'domain-requests' as url %}
|
||||||
|
{% else %}
|
||||||
|
{% url 'home' as url %}
|
||||||
|
{% endif %}
|
||||||
|
<nav class="usa-breadcrumb padding-top-0" aria-label="Domain request breadcrumb">
|
||||||
|
<ol class="usa-breadcrumb__list">
|
||||||
|
<li class="usa-breadcrumb__list-item">
|
||||||
|
{% if portfolio %}
|
||||||
|
<a href="{{ url }}" class="usa-breadcrumb__link"><span>Domain requests</span></a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ url }}" class="usa-breadcrumb__link"><span>Manage your domains</span></a>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
<li class="usa-breadcrumb__list-item usa-current" aria-current="page">
|
||||||
|
{% if not DomainRequest.requested_domain and DomainRequest.status == DomainRequest.DomainRequestStatus.STARTED %}
|
||||||
|
<span>New domain request</span>
|
||||||
|
{% else %}
|
||||||
|
<span>{{ DomainRequest.requested_domain.name }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
{% endblock breadcrumb %}
|
||||||
|
|
||||||
|
{% block header %}
|
||||||
|
{% if not DomainRequest.requested_domain and DomainRequest.status == DomainRequest.DomainRequestStatus.STARTED %}
|
||||||
|
<h1>New domain request</h1>
|
||||||
|
{% else %}
|
||||||
|
<h1>Domain request for {{ DomainRequest.requested_domain.name }}</h1>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock header %}
|
||||||
|
|
||||||
|
{% block status_summary %}
|
||||||
|
<div
|
||||||
|
class="usa-summary-box dotgov-status-box margin-top-3 padding-left-2"
|
||||||
|
role="region"
|
||||||
|
aria-labelledby="summary-box-key-information"
|
||||||
|
>
|
||||||
|
<div class="usa-summary-box__body">
|
||||||
|
<p class="usa-summary-box__heading font-sans-md margin-bottom-0"
|
||||||
|
id="summary-box-key-information"
|
||||||
|
>
|
||||||
|
<span class="text-bold text-primary-darker">
|
||||||
|
Status:
|
||||||
|
</span>
|
||||||
|
{{ DomainRequest.get_status_display|default:"ERROR Please contact technical support/dev" }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
{% endblock status_summary %}
|
||||||
|
|
||||||
|
{% block status_metadata %}
|
||||||
|
|
||||||
|
{% if portfolio %}
|
||||||
|
{% if DomainRequest.creator %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Created by:</b> {{DomainRequest.creator.email|default:DomainRequest.creator.get_formatted_name }}
|
||||||
|
</p>
|
||||||
|
{% else %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">No creator found:</b> this is an error, please email <a href="mailto:help@get.gov" class="usa-link">help@get.gov</a>.
|
||||||
|
</p>
|
||||||
|
{% 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" %}
|
||||||
|
<p class="margin-top-1">
|
||||||
|
{% 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 %}
|
||||||
|
<b class="review__step__name">Started on:</b> {{last_status_update|default:first_started_date}}
|
||||||
|
</p>
|
||||||
|
{% endwith %}
|
||||||
|
{% elif DomainRequest.status == statuses.SUBMITTED %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
||||||
|
</p>
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
||||||
|
</p>
|
||||||
|
{% elif DomainRequest.status == statuses.ACTION_NEEDED %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
||||||
|
</p>
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
||||||
|
</p>
|
||||||
|
{% elif DomainRequest.status == statuses.REJECTED %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
||||||
|
</p>
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Rejected on:</b> {{last_status_update}}
|
||||||
|
</p>
|
||||||
|
{% elif DomainRequest.status == statuses.WITHDRAWN %}
|
||||||
|
<p class="margin-top-1 margin-bottom-1">
|
||||||
|
<b class="review__step__name">Submitted on:</b> {{last_submitted|default:first_submitted }}
|
||||||
|
</p>
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Withdrawn on:</b> {{last_status_update}}
|
||||||
|
</p>
|
||||||
|
{% else %}
|
||||||
|
{% comment %} Shown for in_review, approved, ineligible {% endcomment %}
|
||||||
|
<p class="margin-top-1">
|
||||||
|
<b class="review__step__name">Last updated on:</b> {{DomainRequest.updated_at|date:"F j, Y"}}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock status_metadata %}
|
||||||
|
|
||||||
|
{% block status_blurb %}
|
||||||
|
{% if DomainRequest.is_awaiting_review %}
|
||||||
|
<p>{% include "includes/domain_request_awaiting_review.html" with show_withdraw_text=DomainRequest.is_withdrawable %}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock status_blurb %}
|
||||||
|
|
||||||
|
{% block modify_request %}
|
||||||
|
{% if DomainRequest.is_withdrawable %}
|
||||||
|
<p><a href="{% url 'domain-request-withdraw-confirmation' pk=DomainRequest.id %}" class="usa-button usa-button--outline withdraw_outline">
|
||||||
|
Withdraw request</a>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock modify_request %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid-col desktop:grid-offset-2 maxw-tablet">
|
||||||
|
{% block request_summary_header %}
|
||||||
|
<h2 class="text-primary-darker"> Summary of your domain request </h2>
|
||||||
|
{% 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 %}
|
||||||
|
<p>Federally-recognized tribe</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if DomainRequest.state_recognized_tribe %}
|
||||||
|
<p>State-recognized tribe</p>
|
||||||
|
{% 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 %}
|
||||||
|
<h3 class="register-form-review-header">CISA Regional Representative</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% if DomainRequest.cisa_representative_first_name %}
|
||||||
|
{{ DomainRequest.get_formatted_cisa_rep_name }}
|
||||||
|
{% else %}
|
||||||
|
No
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
<h3 class="register-form-review-header">Anything else</h3>
|
||||||
|
<ul class="usa-list usa-list--unstyled margin-top-0">
|
||||||
|
{% if DomainRequest.anything_else %}
|
||||||
|
{{DomainRequest.anything_else}}
|
||||||
|
{% else %}
|
||||||
|
No
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock request_summary%}
|
||||||
|
</div>
|
||||||
|
</main>
|
|
@ -35,7 +35,14 @@
|
||||||
<dl class="usa-list usa-list--unstyled margin-top-0">
|
<dl class="usa-list usa-list--unstyled margin-top-0">
|
||||||
{% for item in value %}
|
{% for item in value %}
|
||||||
<dt>
|
<dt>
|
||||||
|
|
||||||
|
<h4 class="summary-item__title
|
||||||
|
font-sans-md
|
||||||
|
text-primary-dark text-semibold
|
||||||
|
margin-bottom-05
|
||||||
|
padding-right-1">
|
||||||
Contact {{forloop.counter}}
|
Contact {{forloop.counter}}
|
||||||
|
</h4>
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
{% include "includes/contact.html" with contact=item %}
|
{% include "includes/contact.html" with contact=item %}
|
||||||
|
|
|
@ -4,11 +4,14 @@
|
||||||
<div id="wrapper" class="{% block wrapper_class %}dashboard--portfolio{% endblock %}">
|
<div id="wrapper" class="{% block wrapper_class %}dashboard--portfolio{% endblock %}">
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<main class="grid-container">
|
<main class="grid-container {% if is_widescreen_mode %} grid-container--widescreen {% endif %}">
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
{# the entire logged in page goes here #}
|
{# the entire logged in page goes here #}
|
||||||
|
|
||||||
<div class="tablet:grid-col-12">
|
<div class="tablet:grid-col-11 desktop:grid-col-10 tablet:grid-offset-1">
|
||||||
|
{% block messages %}
|
||||||
|
{% include "includes/form_messages.html" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block portfolio_content %}{% endblock %}
|
{% block portfolio_content %}{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load custom_filters %}
|
||||||
|
{% load static url_helpers %}
|
||||||
|
|
||||||
|
{% block title %}Domain request status | {{ DomainRequest.requested_domain.name }} | {% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% include "includes/portfolio_request_status_view.html" %}
|
||||||
|
{% endblock %}
|
|
@ -114,6 +114,54 @@ class TestDomainRequest(TestCase):
|
||||||
with less_console_noise():
|
with less_console_noise():
|
||||||
return self.assertRaises(Exception, None, exception_type)
|
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
|
@less_console_noise_decorator
|
||||||
def test_federal_agency_set_to_non_federal_on_approve(self):
|
def test_federal_agency_set_to_non_federal_on_approve(self):
|
||||||
"""Ensures that when the federal_agency field is 'none' when .approve() is called,
|
"""Ensures that when the federal_agency field is 'none' when .approve() is called,
|
||||||
|
|
23
src/registrar/tests/test_utilities.py
Normal file
23
src/registrar/tests/test_utilities.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
from registrar.models import User
|
||||||
|
from waffle.testutils import override_flag
|
||||||
|
from registrar.utility.waffle import flag_is_active_for_user
|
||||||
|
|
||||||
|
|
||||||
|
class FlagIsActiveForUserTest(TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
# Set up a test user
|
||||||
|
self.user = User.objects.create_user(username="testuser")
|
||||||
|
|
||||||
|
@override_flag("test_flag", active=True)
|
||||||
|
def test_flag_active_for_user(self):
|
||||||
|
# Test that the flag is active for the user
|
||||||
|
is_active = flag_is_active_for_user(self.user, "test_flag")
|
||||||
|
self.assertTrue(is_active)
|
||||||
|
|
||||||
|
@override_flag("test_flag", active=False)
|
||||||
|
def test_flag_inactive_for_user(self):
|
||||||
|
# Test that the flag is inactive for the user
|
||||||
|
is_active = flag_is_active_for_user(self.user, "test_flag")
|
||||||
|
self.assertFalse(is_active)
|
|
@ -535,6 +535,41 @@ class TestPortfolio(WebTest):
|
||||||
self.assertContains(response, "Domain name")
|
self.assertContains(response, "Domain name")
|
||||||
permission.delete()
|
permission.delete()
|
||||||
|
|
||||||
|
def check_widescreen_is_loaded(self, page_to_check):
|
||||||
|
"""Tests if class modifiers for widescreen mode are appropriately loaded into the DOM
|
||||||
|
for the given page"""
|
||||||
|
|
||||||
|
self.client.force_login(self.user)
|
||||||
|
|
||||||
|
# Ensure that this user can see domains with the right permissions
|
||||||
|
permission, _ = UserPortfolioPermission.objects.get_or_create(
|
||||||
|
user=self.user, portfolio=self.portfolio, roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER]
|
||||||
|
)
|
||||||
|
permission.additional_permissions = [UserPortfolioPermissionChoices.VIEW_ALL_DOMAINS]
|
||||||
|
permission.save()
|
||||||
|
permission.refresh_from_db()
|
||||||
|
|
||||||
|
response = self.client.get(reverse(page_to_check))
|
||||||
|
# Make sure that the page is loaded correctly
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
# Test for widescreen modifier
|
||||||
|
self.assertContains(response, "--widescreen")
|
||||||
|
|
||||||
|
@less_console_noise_decorator
|
||||||
|
@override_flag("organization_feature", active=True)
|
||||||
|
def test_widescreen_css_org_model(self):
|
||||||
|
"""Tests if class modifiers for widescreen mode are appropriately
|
||||||
|
loaded into the DOM for org model pages"""
|
||||||
|
self.check_widescreen_is_loaded("domains")
|
||||||
|
|
||||||
|
@less_console_noise_decorator
|
||||||
|
@override_flag("organization_feature", active=False)
|
||||||
|
def test_widescreen_css_non_org_model(self):
|
||||||
|
"""Tests if class modifiers for widescreen mode are appropriately
|
||||||
|
loaded into the DOM for non-org model pages"""
|
||||||
|
self.check_widescreen_is_loaded("home")
|
||||||
|
|
||||||
@less_console_noise_decorator
|
@less_console_noise_decorator
|
||||||
@override_flag("organization_feature", active=True)
|
@override_flag("organization_feature", active=True)
|
||||||
@override_flag("organization_requests", active=False)
|
@override_flag("organization_requests", active=False)
|
||||||
|
|
|
@ -3025,3 +3025,40 @@ class TestWizardUnlockingSteps(TestWithUser, WebTest):
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.fail(f"Expected a redirect, but got a different response: {response}")
|
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:")
|
||||||
|
|
|
@ -341,7 +341,9 @@ class GetRequestsJsonTest(TestWithUser, WebTest):
|
||||||
if creator[i] != self.user.email:
|
if creator[i] != self.user.email:
|
||||||
# Test case where action is View
|
# Test case where action is View
|
||||||
self.assertEqual("View", action_labels[i])
|
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])
|
self.assertEqual("visibility", svg_icons[i])
|
||||||
elif status[i] in [
|
elif status[i] in [
|
||||||
DomainRequest.DomainRequestStatus.STARTED.label,
|
DomainRequest.DomainRequestStatus.STARTED.label,
|
||||||
|
|
|
@ -108,6 +108,8 @@ def send_templated_email(
|
||||||
def _can_send_email(to_address, bcc_address):
|
def _can_send_email(to_address, bcc_address):
|
||||||
"""Raises an EmailSendingError if we cannot send an email. Does nothing otherwise."""
|
"""Raises an EmailSendingError if we cannot send an email. Does nothing otherwise."""
|
||||||
|
|
||||||
|
# testing below a global waffle flag which will not be associated with a user
|
||||||
|
# or with http request, so pass None to flag_is_active
|
||||||
if flag_is_active(None, "disable_email_sending"): # type: ignore
|
if flag_is_active(None, "disable_email_sending"): # type: ignore
|
||||||
message = "Could not send email. Email sending is disabled due to flag 'disable_email_sending'."
|
message = "Could not send email. Email sending is disabled due to flag 'disable_email_sending'."
|
||||||
raise EmailSendingError(message)
|
raise EmailSendingError(message)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
"""Used for holding various enums"""
|
"""Used for holding various enums"""
|
||||||
|
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
from registrar.utility import StrEnum
|
||||||
|
|
||||||
|
|
||||||
class ValidationReturnType(Enum):
|
class ValidationReturnType(Enum):
|
||||||
|
@ -38,3 +39,45 @@ class DefaultEmail(Enum):
|
||||||
|
|
||||||
PUBLIC_CONTACT_DEFAULT = "dotgov@cisa.dhs.gov"
|
PUBLIC_CONTACT_DEFAULT = "dotgov@cisa.dhs.gov"
|
||||||
LEGACY_DEFAULT = "registrar@dotgov.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.)
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
REQUESTING_ENTITY = "organization_name"
|
||||||
|
CURRENT_SITES = "current_sites"
|
||||||
|
DOTGOV_DOMAIN = "dotgov_domain"
|
||||||
|
PURPOSE = "purpose"
|
||||||
|
ADDITIONAL_DETAILS = "additional_details"
|
||||||
|
REQUIREMENTS = "requirements"
|
||||||
|
|
12
src/registrar/utility/waffle.py
Normal file
12
src/registrar/utility/waffle.py
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
from django.http import HttpRequest
|
||||||
|
from waffle.decorators import flag_is_active
|
||||||
|
|
||||||
|
|
||||||
|
def flag_is_active_for_user(user, flag_name):
|
||||||
|
"""flag_is_active_for_user can be used when a waffle_flag may be
|
||||||
|
activated for a user, but the context of where the flag needs to
|
||||||
|
be tested does not have a request object available.
|
||||||
|
When the request is available, flag_is_active should be used."""
|
||||||
|
request = HttpRequest()
|
||||||
|
request.user = user
|
||||||
|
return flag_is_active(request, flag_name)
|
|
@ -7,48 +7,25 @@ from django.utils.safestring import mark_safe
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
|
||||||
from registrar.forms import domain_request_wizard as forms
|
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 import DomainRequest
|
||||||
from registrar.models.contact import Contact
|
from registrar.models.contact import Contact
|
||||||
from registrar.models.user import User
|
from registrar.models.user import User
|
||||||
from registrar.utility import StrEnum
|
|
||||||
from registrar.views.utility import StepsHelper
|
from registrar.views.utility import StepsHelper
|
||||||
from registrar.views.utility.permission_views import DomainRequestPermissionDeleteView
|
from registrar.views.utility.permission_views import DomainRequestPermissionDeleteView
|
||||||
|
from registrar.utility.enums import Step, PortfolioDomainRequestStep
|
||||||
|
|
||||||
from .utility import (
|
from .utility import (
|
||||||
DomainRequestPermissionView,
|
DomainRequestPermissionView,
|
||||||
DomainRequestPermissionWithdrawView,
|
DomainRequestPermissionWithdrawView,
|
||||||
DomainRequestWizardPermissionView,
|
DomainRequestWizardPermissionView,
|
||||||
|
DomainRequestPortfolioViewonlyView,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
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):
|
class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView):
|
||||||
"""
|
"""
|
||||||
A common set of methods and configuration.
|
A common set of methods and configuration.
|
||||||
|
@ -66,6 +43,7 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView):
|
||||||
although not without consulting the base implementation, first.
|
although not without consulting the base implementation, first.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
StepEnum: Step = Step # type: ignore
|
||||||
template_name = ""
|
template_name = ""
|
||||||
|
|
||||||
# uniquely namespace the wizard in urls.py
|
# uniquely namespace the wizard in urls.py
|
||||||
|
@ -78,29 +56,29 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView):
|
||||||
NEW_URL_NAME = "/request/"
|
NEW_URL_NAME = "/request/"
|
||||||
# We need to pass our human-readable step titles as context to the templates.
|
# We need to pass our human-readable step titles as context to the templates.
|
||||||
TITLES = {
|
TITLES = {
|
||||||
Step.ORGANIZATION_TYPE: _("Type of organization"),
|
StepEnum.ORGANIZATION_TYPE: _("Type of organization"),
|
||||||
Step.TRIBAL_GOVERNMENT: _("Tribal government"),
|
StepEnum.TRIBAL_GOVERNMENT: _("Tribal government"),
|
||||||
Step.ORGANIZATION_FEDERAL: _("Federal government branch"),
|
StepEnum.ORGANIZATION_FEDERAL: _("Federal government branch"),
|
||||||
Step.ORGANIZATION_ELECTION: _("Election office"),
|
StepEnum.ORGANIZATION_ELECTION: _("Election office"),
|
||||||
Step.ORGANIZATION_CONTACT: _("Organization"),
|
StepEnum.ORGANIZATION_CONTACT: _("Organization"),
|
||||||
Step.ABOUT_YOUR_ORGANIZATION: _("About your organization"),
|
StepEnum.ABOUT_YOUR_ORGANIZATION: _("About your organization"),
|
||||||
Step.SENIOR_OFFICIAL: _("Senior official"),
|
StepEnum.SENIOR_OFFICIAL: _("Senior official"),
|
||||||
Step.CURRENT_SITES: _("Current websites"),
|
StepEnum.CURRENT_SITES: _("Current websites"),
|
||||||
Step.DOTGOV_DOMAIN: _(".gov domain"),
|
StepEnum.DOTGOV_DOMAIN: _(".gov domain"),
|
||||||
Step.PURPOSE: _("Purpose of your domain"),
|
StepEnum.PURPOSE: _("Purpose of your domain"),
|
||||||
Step.OTHER_CONTACTS: _("Other employees from your organization"),
|
StepEnum.OTHER_CONTACTS: _("Other employees from your organization"),
|
||||||
Step.ADDITIONAL_DETAILS: _("Additional details"),
|
StepEnum.ADDITIONAL_DETAILS: _("Additional details"),
|
||||||
Step.REQUIREMENTS: _("Requirements for operating a .gov domain"),
|
StepEnum.REQUIREMENTS: _("Requirements for operating a .gov domain"),
|
||||||
Step.REVIEW: _("Review and submit your domain request"),
|
StepEnum.REVIEW: _("Review and submit your domain request"),
|
||||||
}
|
}
|
||||||
|
|
||||||
# We can use a dictionary with step names and callables that return booleans
|
# 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.
|
# to show or hide particular steps based on the state of the process.
|
||||||
WIZARD_CONDITIONS = {
|
WIZARD_CONDITIONS = {
|
||||||
Step.ORGANIZATION_FEDERAL: lambda w: w.from_model("show_organization_federal", False),
|
StepEnum.ORGANIZATION_FEDERAL: lambda w: w.from_model("show_organization_federal", False),
|
||||||
Step.TRIBAL_GOVERNMENT: lambda w: w.from_model("show_tribal_government", False),
|
StepEnum.TRIBAL_GOVERNMENT: lambda w: w.from_model("show_tribal_government", False),
|
||||||
Step.ORGANIZATION_ELECTION: lambda w: w.from_model("show_organization_election", False),
|
StepEnum.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.ABOUT_YOUR_ORGANIZATION: lambda w: w.from_model("show_about_your_organization", False),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -439,15 +417,7 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView):
|
||||||
|
|
||||||
def get_step_list(self) -> list:
|
def get_step_list(self) -> list:
|
||||||
"""Dynamically generated list of steps in the form wizard."""
|
"""Dynamically generated list of steps in the form wizard."""
|
||||||
step_list = []
|
return request_step_list(self)
|
||||||
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
|
|
||||||
|
|
||||||
def goto(self, step):
|
def goto(self, step):
|
||||||
if step == "generic_org_type":
|
if step == "generic_org_type":
|
||||||
|
@ -529,6 +499,26 @@ class DomainRequestWizard(DomainRequestWizardPermissionView, TemplateView):
|
||||||
form.to_database(self.domain_request)
|
form.to_database(self.domain_request)
|
||||||
|
|
||||||
|
|
||||||
|
# TODO - this is a WIP until the domain request experience for portfolios is complete
|
||||||
|
class PortfolioDomainRequestWizard(DomainRequestWizard):
|
||||||
|
StepEnum: PortfolioDomainRequestStep = PortfolioDomainRequestStep # type: ignore
|
||||||
|
|
||||||
|
TITLES = {
|
||||||
|
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"),
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.steps = StepsHelper(self)
|
||||||
|
self._domain_request = None # for caching
|
||||||
|
|
||||||
|
|
||||||
class OrganizationType(DomainRequestWizard):
|
class OrganizationType(DomainRequestWizard):
|
||||||
template_name = "domain_request_org_type.html"
|
template_name = "domain_request_org_type.html"
|
||||||
forms = [forms.OrganizationTypeForm]
|
forms = [forms.OrganizationTypeForm]
|
||||||
|
@ -750,6 +740,21 @@ class Finished(DomainRequestWizard):
|
||||||
class DomainRequestStatus(DomainRequestPermissionView):
|
class DomainRequestStatus(DomainRequestPermissionView):
|
||||||
template_name = "domain_request_status.html"
|
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 DomainRequestWithdrawConfirmation(DomainRequestPermissionWithdrawView):
|
class DomainRequestWithdrawConfirmation(DomainRequestPermissionWithdrawView):
|
||||||
"""This page will ask user to confirm if they want to withdraw
|
"""This page will ask user to confirm if they want to withdraw
|
||||||
|
@ -883,3 +888,21 @@ class DomainRequestDeleteView(DomainRequestPermissionDeleteView):
|
||||||
|
|
||||||
duplicates = [item for item, count in object_dict.items() if count > 1]
|
duplicates = [item for item, count in object_dict.items() if count > 1]
|
||||||
return duplicates
|
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
|
||||||
|
|
|
@ -146,7 +146,7 @@ def serialize_domain_request(request, domain_request, user):
|
||||||
action_url_map = {
|
action_url_map = {
|
||||||
"Edit": reverse("edit-domain-request", kwargs={"id": domain_request.id}),
|
"Edit": reverse("edit-domain-request", kwargs={"id": domain_request.id}),
|
||||||
"Manage": reverse("domain-request-status", kwargs={"pk": 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"}
|
svg_icon_map = {"Edit": "edit", "Manage": "settings", "View": "visibility"}
|
||||||
|
|
|
@ -8,5 +8,6 @@ from .permission_views import (
|
||||||
DomainInvitationPermissionDeleteView,
|
DomainInvitationPermissionDeleteView,
|
||||||
DomainRequestWizardPermissionView,
|
DomainRequestWizardPermissionView,
|
||||||
PortfolioMembersPermission,
|
PortfolioMembersPermission,
|
||||||
|
DomainRequestPortfolioViewonlyView,
|
||||||
)
|
)
|
||||||
from .api_views import get_senior_official_from_federal_agency_json
|
from .api_views import get_senior_official_from_federal_agency_json
|
||||||
|
|
|
@ -289,6 +289,29 @@ class DomainRequestPermission(PermissionsLoginMixin):
|
||||||
return True
|
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):
|
class UserDeleteDomainRolePermission(PermissionsLoginMixin):
|
||||||
"""Permission mixin for UserDomainRole if user
|
"""Permission mixin for UserDomainRole if user
|
||||||
has access, otherwise 403"""
|
has access, otherwise 403"""
|
||||||
|
|
|
@ -19,6 +19,7 @@ from .mixins import (
|
||||||
UserProfilePermission,
|
UserProfilePermission,
|
||||||
PortfolioBasePermission,
|
PortfolioBasePermission,
|
||||||
PortfolioMembersPermission,
|
PortfolioMembersPermission,
|
||||||
|
DomainRequestPortfolioViewonlyPermission,
|
||||||
)
|
)
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -100,6 +101,25 @@ class DomainRequestPermissionView(DomainRequestPermission, DetailView, abc.ABC):
|
||||||
raise NotImplementedError
|
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):
|
class DomainRequestPermissionWithdrawView(DomainRequestPermissionWithdraw, DetailView, abc.ABC):
|
||||||
"""Abstract base view for domain request withdraw function
|
"""Abstract base view for domain request withdraw function
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue