diff --git a/docs/operations/README.md b/docs/operations/README.md
index 047e335f1..f18d24115 100644
--- a/docs/operations/README.md
+++ b/docs/operations/README.md
@@ -174,3 +174,27 @@ it with the latest model schema. Once launched, this should never be used on
the `stable` environment, but during development, it may be useful on the
various sandbox environments. After launch, some schema changes may take the
involvement of a skilled DBA to fix problems like this.
+
+# Bug triage
+
+Bugs on production software need to be documented quickly and triaged to determine if fixes need to be made outside of the normal release cadence. Triage levels will be Critical, High, Medium, and Low to indicate the level of priority for fix, not neccessarily the level of severity. See below for more details
+
+**Critical**- should only be determined by the product owner and means the fix for this critical bug needs to have a quick fix for it created ASAP. This is the only case where a bug fix can be added outside of the normal release cycle and directly onto the stable release.
+**High**- Can be determined by product owner or other team member, and indicates this bug is critical enough to warrant being added into the current sprint.
+**Medium**- Should be added to a sprint coming up but is not blocking users, or enough users to warrant rushing it into a sprint
+**Low**- A minor bug, that could even wait until after the next big launch date to be implemented.
+
+## Steps for Triaging
+
+1. When a bug is found, whether by a developer/designer or from feedback from an end user, a ticket should be made immediately. The actual maker of the ticket can be a member of the product team as needed.
+2. This bug ticket immediately gets a priority added Critical/High/Medium/Low, with Critical requiring the product owner's consent.
+3. Anything marked as `critical` should be refined immediately and engineering should be notified in our Slack dev channel that a Critical ticket has been created (if not already notified)
+4. All items not marked as `critical` by the product owner can wait until refinement to be refined and may have their prioirty level changed during that meeting.
+
+## Steps for dealing with Critical Bugs
+
+1. Once the critical bug ticket is refined and the bug is clear, an engineer should be assigned to work on it. (No ticket, no work)
+2. At the same point, two other engineers should be assigned to review the PR once it's made. One of the reviewing engineers can be subsititued for a designer if this is a design/content/other user facing bug fix.
+3. In the case where the engineering lead is is unresponsive or unavailable to assign the ticket immediately, the product team will make sure an engineer volunteers or is assigned to the ticket/PR review ASAP.
+4. Once done, the developer must make a PR and should tag the assigned PR reviewers in our Slack dev channel stating that the PR is now waiting on their review. These reviewers should drop other tasks in order to review this promptly.
+5. See the the section above on [Making bug fixes on stable](#making-bug-fixes-on-stable-during-production) for how to push changes to stable once the PR is approved
diff --git a/ops/manifests/manifest-ab.yaml b/ops/manifests/manifest-ab.yaml
index f3dd170e6..38109bdcb 100644
--- a/ops/manifests/manifest-ab.yaml
+++ b/ops/manifests/manifest-ab.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-ab.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-bl.yaml b/ops/manifests/manifest-bl.yaml
index 3a494aa25..59529278b 100644
--- a/ops/manifests/manifest-bl.yaml
+++ b/ops/manifests/manifest-bl.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-bl.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-dk.yaml b/ops/manifests/manifest-dk.yaml
index 61036b739..256beeda2 100644
--- a/ops/manifests/manifest-dk.yaml
+++ b/ops/manifests/manifest-dk.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-dk.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-es.yaml b/ops/manifests/manifest-es.yaml
index c4847553f..47c78ce1b 100644
--- a/ops/manifests/manifest-es.yaml
+++ b/ops/manifests/manifest-es.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-es.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-gd.yaml b/ops/manifests/manifest-gd.yaml
index bb07e78ec..0c4b2535f 100644
--- a/ops/manifests/manifest-gd.yaml
+++ b/ops/manifests/manifest-gd.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-gd.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-ko.yaml b/ops/manifests/manifest-ko.yaml
index 7681d9527..cc6a09337 100644
--- a/ops/manifests/manifest-ko.yaml
+++ b/ops/manifests/manifest-ko.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-ko.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-nl.yaml b/ops/manifests/manifest-nl.yaml
index 6c848db78..ca6fb4693 100644
--- a/ops/manifests/manifest-nl.yaml
+++ b/ops/manifests/manifest-nl.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-nl.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-rb.yaml b/ops/manifests/manifest-rb.yaml
index c51230eb4..62f243513 100644
--- a/ops/manifests/manifest-rb.yaml
+++ b/ops/manifests/manifest-rb.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-rb.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-rh.yaml b/ops/manifests/manifest-rh.yaml
index ac88a8031..4985f3261 100644
--- a/ops/manifests/manifest-rh.yaml
+++ b/ops/manifests/manifest-rh.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-rh.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-rjm.yaml b/ops/manifests/manifest-rjm.yaml
index 45a12f363..7d72e7835 100644
--- a/ops/manifests/manifest-rjm.yaml
+++ b/ops/manifests/manifest-rjm.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-rjm.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-stable.yaml b/ops/manifests/manifest-stable.yaml
index e7b3c74ae..d8502c625 100644
--- a/ops/manifests/manifest-stable.yaml
+++ b/ops/manifests/manifest-stable.yaml
@@ -25,6 +25,8 @@ applications:
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
# Which OIDC provider to use
OIDC_ACTIVE_PROVIDER: login.gov production
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: True
routes:
- route: getgov-stable.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-staging.yaml b/ops/manifests/manifest-staging.yaml
index a1d09a555..b616973ac 100644
--- a/ops/manifests/manifest-staging.yaml
+++ b/ops/manifests/manifest-staging.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-staging.app.cloud.gov
services:
diff --git a/ops/manifests/manifest-za.yaml b/ops/manifests/manifest-za.yaml
index 23b6179ec..1b84a74a1 100644
--- a/ops/manifests/manifest-za.yaml
+++ b/ops/manifests/manifest-za.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-za.app.cloud.gov
services:
diff --git a/ops/scripts/manifest-sandbox-template.yaml b/ops/scripts/manifest-sandbox-template.yaml
index 3acbb910c..8cdb8d71b 100644
--- a/ops/scripts/manifest-sandbox-template.yaml
+++ b/ops/scripts/manifest-sandbox-template.yaml
@@ -23,6 +23,8 @@ applications:
DJANGO_LOG_LEVEL: INFO
# default public site location
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
+ # Flag to disable/enable features in prod environments
+ IS_PRODUCTION: False
routes:
- route: getgov-ENVIRONMENT.app.cloud.gov
services:
diff --git a/src/docker-compose.yml b/src/docker-compose.yml
index 786f4c24b..a45ea2a51 100644
--- a/src/docker-compose.yml
+++ b/src/docker-compose.yml
@@ -25,6 +25,8 @@ services:
- DJANGO_SECRET_KEY=really-long-random-string-BNPecI7+s8jMahQcGHZ3XQ5yUfRrSibdapVLIz0UemdktVPofDKcoy
# Run Django in debug mode on local
- DJANGO_DEBUG=True
+ # Run Django without production flags
+ - IS_PRODUCTION=False
# Tell Django where it is being hosted
- DJANGO_BASE_URL=http://localhost:8080
# Public site URL link
diff --git a/src/registrar/assets/sass/_theme/_buttons.scss b/src/registrar/assets/sass/_theme/_buttons.scss
index cb2117fb9..02089ec6d 100644
--- a/src/registrar/assets/sass/_theme/_buttons.scss
+++ b/src/registrar/assets/sass/_theme/_buttons.scss
@@ -26,6 +26,24 @@ a.usa-button {
text-decoration: none;
}
+a.usa-button.disabled-link {
+ background-color: #ccc !important;
+ color: #454545 !important
+}
+
+a.usa-button.disabled-link:hover {
+ background-color: #ccc !important;
+ cursor: not-allowed !important;
+ color: #454545 !important
+}
+
+a.usa-button.disabled-link:focus {
+ background-color: #ccc !important;
+ cursor: not-allowed !important;
+ outline: none !important;
+ color: #454545 !important
+}
+
a.usa-button:not(.usa-button--unstyled, .usa-button--outline) {
color: color('white');
}
diff --git a/src/registrar/assets/sass/_theme/_uswds-theme.scss b/src/registrar/assets/sass/_theme/_uswds-theme.scss
index ba076d845..0cdf6675e 100644
--- a/src/registrar/assets/sass/_theme/_uswds-theme.scss
+++ b/src/registrar/assets/sass/_theme/_uswds-theme.scss
@@ -132,4 +132,10 @@ in the form $setting: value,
$theme-table-sorted-background-color: "accent-cool-lightest",
$theme-table-sorted-icon-color: "primary-darker",
$theme-table-unsorted-icon-color: "primary",
+
+ /*----------------------------
+ # Tooltip Settings
+ -----------------------------*/
+ $theme-tooltip-background-color: "accent-cool-lightest",
+ $theme-tooltip-font-color: "black"
);
diff --git a/src/registrar/config/settings.py b/src/registrar/config/settings.py
index 896691efb..c6fc0f65b 100644
--- a/src/registrar/config/settings.py
+++ b/src/registrar/config/settings.py
@@ -46,6 +46,7 @@ path = Path(__file__)
env_db_url = env.dj_db_url("DATABASE_URL")
env_debug = env.bool("DJANGO_DEBUG", default=False)
+env_is_production = env.bool("IS_PRODUCTION", default=False)
env_log_level = env.str("DJANGO_LOG_LEVEL", "DEBUG")
env_base_url = env.str("DJANGO_BASE_URL")
env_getgov_public_site_url = env.str("GETGOV_PUBLIC_SITE_URL", "")
@@ -73,6 +74,8 @@ BASE_DIR = path.resolve().parent.parent.parent
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env_debug
+# Controls production specific feature toggles
+IS_PRODUCTION = env_is_production
# Applications are modular pieces of code.
# They are provided by Django, by third-parties, or by yourself.
@@ -300,7 +303,7 @@ CSP_FORM_ACTION = allowed_sources
# Sets clients that allow access control to manage.get.gov
# TODO: remove :8080 to see if we can have all localhost access
CORS_ALLOWED_ORIGINS = ["http://localhost:8080", "https://beta.get.gov"]
-
+CORS_ALLOWED_ORIGIN_REGEXES = [r"https://[\w-]+\.sites\.pages\.cloud\.gov"]
# Content-Length header is set by django.middleware.common.CommonMiddleware
diff --git a/src/registrar/management/commands/generate_test_transition_domains.py b/src/registrar/management/commands/generate_test_transition_domains.py
index 20aba2c58..2865937de 100644
--- a/src/registrar/management/commands/generate_test_transition_domains.py
+++ b/src/registrar/management/commands/generate_test_transition_domains.py
@@ -15,7 +15,7 @@ class Command(BaseCommand):
# Running this script removes all existing transition domains, so use with caution.
# Transition domains are created with email addresses provided as command line
# argument. Email addresses for testing are passed as comma delimited list of
- # email addresses, and are required to be provided. Email addresses from the list
+ # email addresses, and are required to be provided. Email addresses from the list
# are assigned to transition domains at time of creation.
def add_arguments(self, parser):
diff --git a/src/registrar/templates/emails/transition_domain_invitation.txt b/src/registrar/templates/emails/transition_domain_invitation.txt
index 42013dbf7..e6e3eabc3 100644
--- a/src/registrar/templates/emails/transition_domain_invitation.txt
+++ b/src/registrar/templates/emails/transition_domain_invitation.txt
@@ -1,20 +1,41 @@
{% autoescape off %}{# In a text file, we don't want to have HTML entities escaped #}
-Hi.
+Hello from .gov.
-You have been added as a manager on {% if domains|length > 1 %}multiple domains (listed below){% else %}{{ domains.0 }}{% endif %}.
+Our new domain management system—the .gov registrar—is now available. The organization, contacts, and DNS information for your .gov domain{% if domains|length > 1 %}s{% endif %} have been transferred to our new registrar.
+
+Your .gov domain{% if domains|length > 1 %}s{% endif %}:
+{% for domain in domains %} - {{ domain }}
+{% endfor %}
+If you’re not affiliated with the above domain{% if domains|length > 1 %}s{% endif %} or think you received this message in error, let us know in a reply to this email.
+
+
+CREATE A LOGIN.GOV ACCOUNT
+
+You can’t use your old credentials to access the new registrar. Access is now managed through Login.gov, a simple and secure process for signing into many government services with one account. Follow these steps to create your Login.gov account .
+
+When creating an account, you’ll need to provide the same email address you used to log in to the old registrar. That will ensure your domains are linked to your Login.gov account.
+
+If you need help finding the email address you used in the past, let us know in a reply to this email.
+
+CHECK YOUR .GOV DOMAIN CONTACTS
+
+This is a good time to check who has access to your .gov domain{% if domains|length > 1 %}s{% endif %}. The admin, technical, and billing contacts listed for your domain{% if domains|length > 1 %}s{% endif %} in our old system also received this email. In our new registrar, these contacts are all considered “domain managers.” We no longer have the admin, technical, and billing roles, and you aren’t limited to three domain managers like in the old system.
+
+ 1. Once you have your Login.gov account, sign in to the new registrar at .
+ 2. Click the “Manage” link next to your .gov domain, then click on “Domain managers” to see who has access to your domain.
+ 3. If any of these users should not have access to your domain, let us know in a reply to this email.
+
+After verifying who has access to your domain{% if domains|length > 1 %}s{% endif %}, we also suggest reviewing your contact information and organization mailing address to ensure those are up to date.
+
+
+DOMAIN EXPIRATION DATES EXTENDED BY ONE YEAR
+
+Expiration dates for .gov domains in good standing have been extended for one year. Expiration dates won't be shown in the new registrar yet.
-YOU NEED A LOGIN.GOV ACCOUNT
-You’ll need a Login.gov account to manage your .gov domain{% if domains|length > 1 %}s{% endif %}. Login.gov provides a simple and secure process for signing into many government services with one account. If you don’t already have one, follow these steps to create your Login.gov account .
-DOMAIN MANAGEMENT
-As a .gov domain manager you can add or update information about your domain{% if domains|length > 1 %}s{% endif %}. You’ll also serve as a contact for your .gov domain{% if domains|length > 1 %}s{% endif %}. Please keep your contact information updated. Learn more about domain management .
-{% if domains|length > 1 %}
-DOMAINS
-{% for domain in domains %} {{ domain }}
-{% endfor %}{% else %}
-{% endif %}
SOMETHING WRONG?
-If you’re not affiliated with {{ domain }} or think you received this message in error, contact the .gov team .
+
+If you think you received this message in error or have a question, let us know in a reply to this email.
THANK YOU
@@ -24,6 +45,8 @@ THANK YOU
----------------------------------------------------------------
The .gov team
-Contact us:
-Visit
+
+.Gov blog
+Domain management
+Get.gov
{% endautoescape %}
diff --git a/src/registrar/templates/emails/transition_domain_invitation_subject.txt b/src/registrar/templates/emails/transition_domain_invitation_subject.txt
index 9302a748e..526c7714b 100644
--- a/src/registrar/templates/emails/transition_domain_invitation_subject.txt
+++ b/src/registrar/templates/emails/transition_domain_invitation_subject.txt
@@ -1 +1 @@
-You've been added to a .gov domain
\ No newline at end of file
+(Action required) Manage your .gov domain{% if domains|length > 1 %}s{% endif %} in the new registrar
\ No newline at end of file
diff --git a/src/registrar/templates/home.html b/src/registrar/templates/home.html
index e86c08c70..1605499e2 100644
--- a/src/registrar/templates/home.html
+++ b/src/registrar/templates/home.html
@@ -13,9 +13,22 @@