mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-10 10:03:21 -04:00
Removed best practices flag
This commit is contained in:
@@ -161,7 +161,7 @@
|
|||||||
"filename": "app/config.py",
|
"filename": "app/config.py",
|
||||||
"hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc",
|
"hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc",
|
||||||
"is_verified": false,
|
"is_verified": false,
|
||||||
"line_number": 123,
|
"line_number": 120,
|
||||||
"is_secret": false
|
"is_secret": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -684,5 +684,5 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"generated_at": "2024-11-21T23:08:45Z"
|
"generated_at": "2025-01-12T22:42:11Z"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,20 +168,12 @@ def _csp(config):
|
|||||||
|
|
||||||
|
|
||||||
def create_app(application):
|
def create_app(application):
|
||||||
application.config["FEATURE_BEST_PRACTICES_ENABLED"] = (
|
|
||||||
os.getenv("FEATURE_BEST_PRACTICES_ENABLED", "false").lower() == "true"
|
|
||||||
)
|
|
||||||
|
|
||||||
@application.context_processor
|
@application.context_processor
|
||||||
def inject_feature_flags():
|
def inject_feature_flags():
|
||||||
feature_best_practices_enabled = application.config.get(
|
|
||||||
"FEATURE_BEST_PRACTICES_ENABLED", False
|
|
||||||
)
|
|
||||||
feature_about_page_enabled = application.config.get(
|
feature_about_page_enabled = application.config.get(
|
||||||
"FEATURE_ABOUT_PAGE_ENABLED", False
|
"FEATURE_ABOUT_PAGE_ENABLED", False
|
||||||
)
|
)
|
||||||
return dict(
|
return dict(
|
||||||
FEATURE_BEST_PRACTICES_ENABLED=feature_best_practices_enabled,
|
|
||||||
FEATURE_ABOUT_PAGE_ENABLED=feature_about_page_enabled,
|
FEATURE_ABOUT_PAGE_ENABLED=feature_about_page_enabled,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -87,9 +87,6 @@ class Config(object):
|
|||||||
"tts-benefits-studio@gsa.gov",
|
"tts-benefits-studio@gsa.gov",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
FEATURE_BEST_PRACTICES_ENABLED = (
|
|
||||||
getenv("FEATURE_BEST_PRACTICES_ENABLED", "false") == "true"
|
|
||||||
)
|
|
||||||
|
|
||||||
FEATURE_ABOUT_PAGE_ENABLED = getenv("FEATURE_ABOUT_PAGE_ENABLED", "false") == "true"
|
FEATURE_ABOUT_PAGE_ENABLED = getenv("FEATURE_ABOUT_PAGE_ENABLED", "false") == "true"
|
||||||
|
|
||||||
|
|||||||
@@ -25,11 +25,6 @@ from app.utils.user import user_is_logged_in
|
|||||||
# Hook to check for feature flags
|
# Hook to check for feature flags
|
||||||
@main.before_request
|
@main.before_request
|
||||||
def check_feature_flags():
|
def check_feature_flags():
|
||||||
if request.path.startswith("/guides") and not current_app.config.get(
|
|
||||||
"FEATURE_BEST_PRACTICES_ENABLED", False
|
|
||||||
):
|
|
||||||
abort(404)
|
|
||||||
|
|
||||||
if request.path.startswith("/about") and not current_app.config.get(
|
if request.path.startswith("/about") and not current_app.config.get(
|
||||||
"FEATURE_ABOUT_PAGE_ENABLED", False
|
"FEATURE_ABOUT_PAGE_ENABLED", False
|
||||||
):
|
):
|
||||||
@@ -40,8 +35,8 @@ def check_feature_flags():
|
|||||||
def test_feature_flags():
|
def test_feature_flags():
|
||||||
return jsonify(
|
return jsonify(
|
||||||
{
|
{
|
||||||
"FEATURE_BEST_PRACTICES_ENABLED": current_app.config[
|
"FEATURE_ABOUT_PAGE_ENABLED": current_app.config[
|
||||||
"FEATURE_BEST_PRACTICES_ENABLED"
|
"FEATURE_ABOUT_PAGE_ENABLED"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -272,9 +267,6 @@ def guidance_index():
|
|||||||
return render_template(
|
return render_template(
|
||||||
"views/guidance/index.html",
|
"views/guidance/index.html",
|
||||||
navigation_links=using_notify_nav(),
|
navigation_links=using_notify_nav(),
|
||||||
feature_best_practices_enabled=current_app.config[
|
|
||||||
"FEATURE_BEST_PRACTICES_ENABLED"
|
|
||||||
],
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,10 +33,6 @@ def using_notify_nav():
|
|||||||
{"name": "Delivery Status", "link": "main.message_status"},
|
{"name": "Delivery Status", "link": "main.message_status"},
|
||||||
{"name": "Guidance", "link": "main.guidance_index"},
|
{"name": "Guidance", "link": "main.guidance_index"},
|
||||||
]
|
]
|
||||||
if not current_app.config.get("FEATURE_BEST_PRACTICES_ENABLED"):
|
|
||||||
nav_items = [
|
|
||||||
item for item in nav_items if item["link"] != "main.best_practices"
|
|
||||||
]
|
|
||||||
|
|
||||||
return nav_items
|
return nav_items
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,13 @@
|
|||||||
{% set is_information_section = FEATURE_ABOUT_PAGE_ENABLED and (
|
{% set is_about_page = request.path.startswith('/about') %}
|
||||||
request.path.startswith('/about') or
|
{% set is_join_notify_page = request.path.startswith('/join-notify') %}
|
||||||
request.path.startswith('/join-notify') or
|
{% set is_contact_page = request.path.startswith('/contact') %}
|
||||||
request.path.startswith('/contact')
|
{% set is_information_section = is_about_page or is_join_notify_page or is_contact_page %}
|
||||||
) %}
|
|
||||||
|
|
||||||
{% if current_user.is_authenticated %}
|
{% if current_user.is_authenticated %}
|
||||||
{% set navigation = [
|
{% set navigation = [
|
||||||
{"href": url_for("main.show_accounts_or_dashboard"), "text": "Current service", "active": header_navigation.is_selected('accounts-or-dashboard')},
|
{"href": url_for("main.show_accounts_or_dashboard"), "text": "Current service", "active": header_navigation.is_selected('accounts-or-dashboard')},
|
||||||
{"href": url_for('main.get_started'), "text": "Using Notify", "active": header_navigation.is_selected('using_notify')}
|
{"href": url_for('main.get_started'), "text": "Using Notify", "active": header_navigation.is_selected('using_notify')},
|
||||||
] %}
|
{"href": url_for('main.best_practices'), "text": "Guides", "active": header_navigation.is_selected('best_practices')},
|
||||||
|
|
||||||
{% if FEATURE_BEST_PRACTICES_ENABLED %}
|
|
||||||
{% set navigation = navigation + [{"href": url_for('main.best_practices'), "text": "Guides", "active": header_navigation.is_selected('best_practices')}] %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% set navigation = navigation + [
|
|
||||||
{"href": url_for('main.features'), "text": "Features", "active": header_navigation.is_selected('features')},
|
{"href": url_for('main.features'), "text": "Features", "active": header_navigation.is_selected('features')},
|
||||||
{"href": url_for('main.support'), "text": "Contact us", "active": header_navigation.is_selected('support')}
|
{"href": url_for('main.support'), "text": "Contact us", "active": header_navigation.is_selected('support')}
|
||||||
] %}
|
] %}
|
||||||
@@ -41,16 +34,15 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{% set navigation = [] %}
|
{% set navigation = [
|
||||||
|
{"href": url_for('main.about_notify'), "text": "About Notify", "active": is_about_page},
|
||||||
{% if FEATURE_ABOUT_PAGE_ENABLED %}
|
{"href": url_for('main.join_notify'), "text": "Join Notify", "active": is_join_notify_page},
|
||||||
{% set navigation = navigation + [
|
{"href": url_for('main.contact'), "text": "Contact us", "active": is_contact_page}
|
||||||
{"href": url_for('main.about_notify'), "text": "About Notify", "active": is_information_section},
|
|
||||||
{"href": url_for('main.join_notify'), "text": "Join Notify", "active": request.path.startswith('/join-notify')},
|
|
||||||
{"href": url_for('main.contact'), "text": "Contact us", "active": request.path.startswith('/contact')}
|
|
||||||
] %}
|
] %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,245 +8,118 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content_column_content %}
|
{% block content_column_content %}
|
||||||
|
<h1 class="font-body-2xl margin-bottom-3">Guidance</h1>
|
||||||
|
|
||||||
<h1 class="font-body-2xl margin-bottom-3">Guidance</h1>
|
<p>Notify allows you to easily create templates for messages for your recipients. You can customize messages to encourage
|
||||||
|
your recipient to manage their benefits and increase follow-through.</p>
|
||||||
|
<p>Below we explain how to:</p>
|
||||||
|
|
||||||
<p>Notify allows you easily to create templates for messages for your recipients. You can customize messages to encourage
|
<ul class="list list-bullet">
|
||||||
your recipient to manage their benefits and increase follow through.</p>
|
<li><a class="usa-link" href="#format-content">Format your content</a></li>
|
||||||
<p>Below we explain how to:</p>
|
<li><a class="usa-link" href="#add-links">Add links</a></li>
|
||||||
|
<li><a class="usa-link" href="#personalize-content">Personalize your content</a></li>
|
||||||
|
<li><a class="usa-link" href="#conditional-content">Add conditional content</a></li>
|
||||||
|
<li><a class="usa-link" href="#indentify-program">Identify your program</a></li>
|
||||||
|
<li><a class="usa-link" href="#prepare-data">Prepare your data</a></li>
|
||||||
|
<li><a class="usa-link" href="#prevent-fraud">Prevent fraud</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<ul class="list list-bullet">
|
{# Format content #}
|
||||||
{% if not feature_best_practices_enabled %}
|
<h2 class="padding-top-1" id="format-content">Format your content</h2>
|
||||||
<li><a class="usa-link" href="#format-content">Format your content</a></li>
|
<p>Effective texts will help your message recipients take the steps needed to secure and keep the benefits and services
|
||||||
<li><a class="usa-link" href="#add-links">Add links</a></li>
|
they depend on. To craft an effective text:</p>
|
||||||
{% endif %}
|
|
||||||
<li><a class="usa-link" href="#personalize-content">Personalize your content</a></li>
|
|
||||||
<li><a class="usa-link" href="#conditional-content">Add conditional content</a></li>
|
|
||||||
<li><a class="usa-link" href="#indentify-program">Identify your program</a></li>
|
|
||||||
<li><a class="usa-link" href="#prepare-data">Prepare your data</a></li>
|
|
||||||
{% if not feature_best_practices_enabled %}
|
|
||||||
<li><a class="usa-link" href="#prevent-fraud">Prevent fraud</a></li>
|
|
||||||
{% endif%}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
{# Format content #}
|
<ul class="list list-bullet">
|
||||||
<h2 class="padding-top-1" id="format-content">Format your content</h2>
|
<li>Choose your messages thoughtfully. Text messages are best to remind/nudge someone to take a specific action or
|
||||||
{% if not feature_best_practices_enabled %}
|
communicate information at a particular time rather than pushing out broad or overly general information.</li>
|
||||||
<p>Effective texts will help your message recipients take the steps needed to secure and keep the benefits and services
|
<li>Clearly state the issue and expected response. Tell your recipient what you expect from them.</li>
|
||||||
they depend on. To craft an effective text:</p>
|
<li>Say only one important thing per message.</li>
|
||||||
|
<li>Frame the message to encourage action and explain the consequences of not completing the desired action.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<ul class="list list-bullet">
|
<h3>To create and format your message</h3>
|
||||||
<li>Choose your messages thoughtfully. Text messages are best to remind/nudge someone to take a specific action or
|
<ol class="list">
|
||||||
communicate information at a particular time rather than pushing out broad or overly general information.</li>
|
<li>All messages start from a template</li>
|
||||||
<li>Clearly state the issue and expected response. Tell your recipient what you expect from them.</li>
|
<li>Click "<a href={{ url_for('.choose_template', service_id=current_service.id) }}>Send Messages</a>". You'll see existing templates.</li>
|
||||||
<li>Say only one important thing per message.</li>
|
<li>Add a new template or choose an existing template and select Edit.</li>
|
||||||
<li>Frame the message to encourage action and explain the consequences of not completing the desired action.</li>
|
</ol>
|
||||||
</ul>
|
|
||||||
{% endif %}
|
|
||||||
<h3>To create and format your message</h3>
|
|
||||||
<ol class="list">
|
|
||||||
<li>All messages start from a template</li>
|
|
||||||
<li>Click "<a href={{ url_for('.choose_template', service_id=current_service.id) }}>Send Messages</a>". You'll see existing templates.</li>
|
|
||||||
<li>Add a new template or choose an existing template and select Edit.</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
{% if not feature_best_practices_enabled %}
|
{# Add links #}
|
||||||
{# Add links #}
|
<h2 class="padding-top-1" id="add-links">Add links</h2>
|
||||||
<h2 class="padding-top-1" id="add-links">Add links</h2>
|
<p>When composing a text message, links to websites or online applications can help your recipient respond quickly.</p>
|
||||||
<p>When composing a text message, links to websites or online applications can help your recipient respond quickly.</p>
|
|
||||||
|
|
||||||
<ul class="list list-bullet">
|
<ul class="list list-bullet">
|
||||||
<li>Write URLs in full and Notify will convert them into links for you. Note that you cannot hyperlink text in Notify
|
<li>Write URLs in full and Notify will convert them into links for you. Note that you cannot hyperlink text in Notify
|
||||||
messages.</li>
|
messages.</li>
|
||||||
<li>For link click tracking, you can consider adding campaign parameters to URLs.</li>
|
<li>For link click tracking, you can consider adding campaign parameters to URLs.</li>
|
||||||
<li>All links should point to a government domain.</li>
|
<li>All links should point to a government domain.</li>
|
||||||
<li>Link directly to where your recipient needs to take action, not to more information.</li>
|
<li>Link directly to where your recipient needs to take action, not to more information.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3>About link-shortening services</h3>
|
<h3>About link-shortening services</h3>
|
||||||
<p>We do not recommend using a third-party link-shortening service because:</p>
|
<p>We do not recommend using a third-party link-shortening service because:</p>
|
||||||
<ul class="list list-bullet">
|
<ul class="list list-bullet">
|
||||||
<li>Your recipient cannot see where the link will take them, which could make them suspect the link is spam/scam.</li>
|
<li>Your recipient cannot see where the link will take them, which could make them suspect the link is spam/scam.</li>
|
||||||
<li>Your link might stop working if there’s a service outage.</li>
|
<li>Your link might stop working if there’s a service outage.</li>
|
||||||
<li>You can no longer control where the redirect goes.</li>
|
<li>You can no longer control where the redirect goes.</li>
|
||||||
</ul>
|
</ul>
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{# Personalize content #}
|
{# Personalize content #}
|
||||||
<h2 class="padding-top-1" id="personalize-content">Personalize your content</h2>
|
<h2 class="padding-top-1" id="personalize-content">Personalize your content</h2>
|
||||||
<p>Personalizing your content can increase response rates and help the recipient know the text is legitimate.</p>
|
<p>Personalizing your content can increase response rates and help the recipient know the text is legitimate.</p>
|
||||||
<ul class="list list-bullet">
|
<ul class="list list-bullet">
|
||||||
<li>Including a person's first name increases response rates.</li>
|
<li>Including a person's first name increases response rates.</li>
|
||||||
<li>Specific details such as time and location of an appointment or where suspected fraud use occurred encourages action.</li>
|
<li>Specific details such as time and location of an appointment or where suspected fraud use occurred encourages action.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3>To personalize your content</h3>
|
<h3>To personalize your content</h3>
|
||||||
<ol class="list">
|
<ol class="list">
|
||||||
<li>Add a placeholder to your content by placing two brackets around the personalized elements.</li>
|
<li>Add a placeholder to your content by placing two brackets around the personalized elements.</li>
|
||||||
<li>You can manually enter the personalized content or you can upload a spreadsheet with the details and let Notify do the
|
<li>You can manually enter the personalized content or you can upload a spreadsheet with the details and let Notify do the
|
||||||
work for you. See <a href="#prepare-data">data preparation</a>.</li>
|
work for you. See <a href="#prepare-data">data preparation</a>.</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<h4>Example</h4>
|
<h4>Example</h4>
|
||||||
<p>To personalize with the recipient's first name and include a reference number:</p>
|
<p>To personalize with the recipient's first name and include a reference number:</p>
|
||||||
<p class="padding-2 bg-base-lightest">State WIC: Hello ((first name)), your reference is ((ref number)). Please provide this number when you call 555-123-1234 to make an appointment.</p>
|
<p class="padding-2 bg-base-lightest">State WIC: Hello ((first name)), your reference is ((ref number)). Please provide this number when you call 555-123-1234 to make an appointment.</p>
|
||||||
|
|
||||||
<p>Note that variations in the length of personalized content can impact the length of specific messages, and may affect
|
<p>Note that variations in the length of personalized content can impact the length of specific messages, and may affect
|
||||||
the number of parts used.</p>
|
the number of parts used.</p>
|
||||||
|
|
||||||
{# Add conditional content #}
|
{# Add conditional content #}
|
||||||
<h2 class="padding-top-1" id="conditional-content">Add conditional content</h2>
|
<h2 class="padding-top-1" id="conditional-content">Add conditional content</h2>
|
||||||
<p>Conditional (or optional) content appears only when a recipient meets certain criteria. This feature allows you to make
|
<p>Conditional (or optional) content appears only when a recipient meets certain criteria. This feature allows you to make
|
||||||
all or part of the message contingent upon specific criteria associated with the recipient.</p>
|
all or part of the message contingent upon specific criteria associated with the recipient.</p>
|
||||||
|
|
||||||
<h3>To add conditional content</h3>
|
<h3>To add conditional content</h3>
|
||||||
<ol class="list">
|
<ol class="list">
|
||||||
<li>Use two brackets and ?? to define the conditional content.</li>
|
<li>Use two brackets and ?? to define the conditional content.</li>
|
||||||
<li>You can manually enter the conditional content or you can upload a spreadsheet with the personal details and let Notify
|
<li>You can manually enter the conditional content or you can upload a spreadsheet with the personal details and let Notify
|
||||||
do the work for you. See <a href="#prepare-data">data preparation</a>.</li>
|
do the work for you. See <a href="#prepare-data">data preparation</a>.</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<h4>Examples</h4>
|
<h4>Examples</h4>
|
||||||
<ol class="list">
|
<ol class="list">
|
||||||
<li>If you only want to show something to people who are under 18:
|
<li>If you only want to show something to people who are under 18:
|
||||||
</br>
|
</br>
|
||||||
<p class="padding-2 bg-base-lightest">State SNAP: Renewal applications are due by March 15. ((under18??Please get your application signed by a parent or
|
<p class="padding-2 bg-base-lightest">State SNAP: Renewal applications are due by March 15. ((under18??Please get your application signed by a parent or
|
||||||
guardian.))</p>
|
guardian.))</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
If you want to make people who are homebound aware of the option of virtual visits (but not other message recipients):
|
If you want to make people who are homebound aware of the option of virtual visits (but not other message recipients):
|
||||||
</br>
|
</br>
|
||||||
<p class="padding-2 bg-base-lightest">State Medicaid: Please call 555-123-1234 to schedule an appointment. ((homebound??Virtual visits are available.))</p>
|
<p class="padding-2 bg-base-lightest">State Medicaid: Please call 555-123-1234 to schedule an appointment. ((homebound??Virtual visits are available.))</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
If you want to send a messages in different languages to different recipients:
|
If you want to send a messages in different languages to different recipients:
|
||||||
</br>
|
</br>
|
||||||
<p class="padding-2 bg-base-lightest">((English??We’ve identified unauthorized use on your EBT account. Call the phone number on the back of your card to
|
<p class="padding-2 bg-base-lightest">((English??We’ve identified unauthorized use on your EBT account. Call the phone number on the back of your card to
|
||||||
cancel or go to your local CSO for immediate replacement.))((Spanish??Hemos identificado un uso no autorizado en su
|
cancel or go to your local CSO for immediate replacement.))((Spanish??Hemos identificado un uso no autorizado en su
|
||||||
cuenta EBT. Llame al número de teléfono que aparece en el reverso de su tarjeta para cancelarla o diríjase a su CSO
|
cuenta EBT. Llame al número de teléfono que aparece en el reverso de su tarjeta para cancelarla o diríjase a su CSO
|
||||||
local para que se la sustituyan inmediatamente.))</p>
|
local para que se la sustituyan inmediatamente.))</p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
{# Identify your program #}
|
|
||||||
<h2 class="padding-top-1" id="indentify-program">Identify your program</h2>
|
|
||||||
<p>You can help your recipients identify your texts as legitimate by customizing your messages to clearly state who they
|
|
||||||
are from. Consider using the program or benefit name that is most familiar to your recipients.</p>
|
|
||||||
|
|
||||||
<h3>To customize your program name</h3>
|
|
||||||
<p>To change the text message sender from the default service name:</p>
|
|
||||||
<ol class="list">
|
|
||||||
<li>Go to the <a href="{{ url_for('main.service_settings', service_id=current_service.id) }}">Settings page</a></li>
|
|
||||||
<li>Select “Start text messages with service name.”</li>
|
|
||||||
<li>Change the service name to a familiar program or benefit.</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
{# Prepare your data #}
|
|
||||||
<h2 class="padding-top-1" id="prepare-data">Prepare your data</h2>
|
|
||||||
<p>The easiest and most efficient way to personalize your content is by uploading a spreadsheet. Notify can accommodate
|
|
||||||
many file formats and structures.</p>
|
|
||||||
|
|
||||||
<h3>File format</h3>
|
|
||||||
<p>Notify can accept files in the following formats: CSV, TSV, ODS, and Microsoft Excel.</p>
|
|
||||||
|
|
||||||
<h3>File structure</h3>
|
|
||||||
<ul class="list">
|
|
||||||
<li>The phone number must be in the first column (Column A) and must be labeled <strong>Phone number</strong>.</li>
|
|
||||||
<li>Each column must have a unique name.</li>
|
|
||||||
<li>If you are using Excel, you must either disable the”auto-date/time format” for time and date columns or convert the file
|
|
||||||
to a CSV prior to loading. (If you do not, Excel will display date/time data in a confusing format.)</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Formatting personalized content</h3>
|
|
||||||
<p>If you are sending a message with personalized content, such as the first name of the recipient or the appointment time
|
|
||||||
and location, the names of the column headings have to match the indicator included in the message template.</p>
|
|
||||||
<p>For example, if the personalized content is the first name of the recipient, and we are using the spreadsheet below, the
|
|
||||||
indicator in the message needs to be ((First name)), not ((firstname)) or ((name)).</p>
|
|
||||||
|
|
||||||
<h3>Formatting conditional content</h3>
|
|
||||||
<p>If you are sending messages with conditional content, such as content based on the recipient’s preferred language or
|
|
||||||
location, the flag to receive the content needs to be captured in its own column with a Yes or No (Y/N) flag.</p>
|
|
||||||
|
|
||||||
<h3>Example</h3>
|
|
||||||
<div class="table-overflow-x-auto">
|
|
||||||
<table class="usa-table">
|
|
||||||
<caption class="usa-sr-only">
|
|
||||||
Example
|
|
||||||
</caption>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Phone number</th>
|
|
||||||
<th scope="col">First name</th>
|
|
||||||
<th scope="col">Last name</th>
|
|
||||||
<th scope="col">Spanish</th>
|
|
||||||
<th scope="col">English</th>
|
|
||||||
<th scope="col">Date</th>
|
|
||||||
<th scope="col">Time</th>
|
|
||||||
<th scope="col">Location</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>123-456-7890</td>
|
|
||||||
<td>Lulu</td>
|
|
||||||
<td>Praether</td>
|
|
||||||
<td>N</td>
|
|
||||||
<td>Y</td>
|
|
||||||
<td>November 2, 2023</td>
|
|
||||||
<td>3:25</td>
|
|
||||||
<td>123 Ford Rd.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>234-567-8901</td>
|
|
||||||
<td>Sela</td>
|
|
||||||
<td>Appel</td>
|
|
||||||
<td>Y</td>
|
|
||||||
<td>N</td>
|
|
||||||
<td>November 2, 2023</td>
|
|
||||||
<td>4:00</td>
|
|
||||||
<td>123 Ford Rd.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>123-456-7890</td>
|
|
||||||
<td>Dexter</td>
|
|
||||||
<td>Moseley</td>
|
|
||||||
<td>N</td>
|
|
||||||
<td>Y</td>
|
|
||||||
<td>November 2, 2023</td>
|
|
||||||
<td>2:00</td>
|
|
||||||
<td>123 Ford Rd.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if not feature_best_practices_enabled %}
|
|
||||||
{# Preventing fraud #}
|
|
||||||
<h2 class="padding-top-1" id="prevent-fraud">Preventing fraud</h2>
|
|
||||||
<p>Texting fraud is ever prevalent and while we can’t eliminate the risk, we can reduce the chances that recipients will
|
|
||||||
fall victim to fraud.</p>
|
|
||||||
<ol class="list">
|
|
||||||
<li>Never send unnecessary or protected private information.</li>
|
|
||||||
<li>Remind your recipients that text messaging is not a secure means of communication and they should not send you private
|
|
||||||
information via text.</li>
|
|
||||||
<li>Only include links to websites and online applications that are secure.</li>
|
|
||||||
<li>Send an introductory text letting recipients know you will be texting them and to save the number in their phone.</li>
|
|
||||||
<li>Include an auto-response with the name of your organization and a contact phone number.</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<h3>Examples</h3>
|
|
||||||
<ol class="list">
|
|
||||||
<li>Introductory text:
|
|
||||||
</br>
|
|
||||||
<p class="padding-2 bg-base-lightest">State Transit Dept: We're piloting a new way to get important reminders to our staff. Save this number to your phone,
|
|
||||||
you'll receive updates from us here.</p>
|
|
||||||
</li>
|
|
||||||
<li>Auto-response text:
|
|
||||||
</br>
|
|
||||||
<p class="padding-2 bg-base-lightest">State Agency: This number is unmonitored. To contact us, call us at 555-123-1234. We will never ask for personal details
|
|
||||||
in a text. If you have questions about how to protect your privacy, see statename.gov/privacy.</p>
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -7,4 +7,3 @@ cloud_dot_gov_route: notify-demo.app.cloud.gov
|
|||||||
redis_enabled: 1
|
redis_enabled: 1
|
||||||
nr_agent_id: '1134302465'
|
nr_agent_id: '1134302465'
|
||||||
nr_app_id: '1083160688'
|
nr_app_id: '1083160688'
|
||||||
FEATURE_BEST_PRACTICES_ENABLED: true
|
|
||||||
|
|||||||
@@ -7,4 +7,3 @@ cloud_dot_gov_route: notify.app.cloud.gov
|
|||||||
redis_enabled: 1
|
redis_enabled: 1
|
||||||
nr_agent_id: '1050708682'
|
nr_agent_id: '1050708682'
|
||||||
nr_app_id: '1050708682'
|
nr_app_id: '1050708682'
|
||||||
FEATURE_BEST_PRACTICES_ENABLED: false
|
|
||||||
|
|||||||
@@ -12,4 +12,3 @@ SECRET_KEY: sandbox-notify-secret-key
|
|||||||
nr_agent_id: ''
|
nr_agent_id: ''
|
||||||
nr_app_id: ''
|
nr_app_id: ''
|
||||||
NR_BROWSER_KEY: ''
|
NR_BROWSER_KEY: ''
|
||||||
FEATURE_BEST_PRACTICES_ENABLED: true
|
|
||||||
|
|||||||
@@ -7,4 +7,3 @@ cloud_dot_gov_route: notify-staging.app.cloud.gov
|
|||||||
redis_enabled: 1
|
redis_enabled: 1
|
||||||
nr_agent_id: '1134291385'
|
nr_agent_id: '1134291385'
|
||||||
nr_app_id: '1031640326'
|
nr_app_id: '1031640326'
|
||||||
FEATURE_BEST_PRACTICES_ENABLED: false
|
|
||||||
|
|||||||
@@ -62,4 +62,3 @@ applications:
|
|||||||
LOGIN_DOT_GOV_CERTS_URL: ((LOGIN_DOT_GOV_CERTS_URL))
|
LOGIN_DOT_GOV_CERTS_URL: ((LOGIN_DOT_GOV_CERTS_URL))
|
||||||
|
|
||||||
# feature flagging
|
# feature flagging
|
||||||
FEATURE_BEST_PRACTICES_ENABLED: ((FEATURE_BEST_PRACTICES_ENABLED))
|
|
||||||
|
|||||||
@@ -121,8 +121,7 @@ def test_static_pages(client_request, mock_get_organization_by_domain, view, moc
|
|||||||
"guidance_index",
|
"guidance_index",
|
||||||
]
|
]
|
||||||
return (
|
return (
|
||||||
not current_app.config["FEATURE_BEST_PRACTICES_ENABLED"]
|
view in feature_flagged_views
|
||||||
and view in feature_flagged_views
|
|
||||||
)
|
)
|
||||||
|
|
||||||
request = partial(client_request.get, "main.{}".format(view))
|
request = partial(client_request.get, "main.{}".format(view))
|
||||||
|
|||||||
@@ -16,43 +16,39 @@ def test_best_practices_side_menu(authenticated_page):
|
|||||||
page.wait_for_load_state("domcontentloaded")
|
page.wait_for_load_state("domcontentloaded")
|
||||||
check_axe_report(page)
|
check_axe_report(page)
|
||||||
|
|
||||||
response = page.request.get(f"{E2E_TEST_URI}/test/feature-flags")
|
# Test Best Practices navigation
|
||||||
feature_flags = response.json()
|
page.get_by_role("link", name="Best Practices").click()
|
||||||
feature_best_practices_enabled = feature_flags.get("FEATURE_BEST_PRACTICES_ENABLED")
|
expect(page).to_have_title(re.compile("Best Practice"))
|
||||||
|
|
||||||
if feature_best_practices_enabled:
|
page.get_by_role("link", name="Clear goals", exact=True).click()
|
||||||
page.get_by_role("link", name="Best Practices").click()
|
expect(page).to_have_title(re.compile("Establish clear goals"))
|
||||||
expect(page).to_have_title(re.compile("Best Practice"))
|
|
||||||
|
|
||||||
page.get_by_role("link", name="Clear goals", exact=True).click()
|
page.get_by_role("link", name="Rules and regulations").click()
|
||||||
expect(page).to_have_title(re.compile("Establish clear goals"))
|
expect(page).to_have_title(re.compile("Rules and regulations"))
|
||||||
|
|
||||||
page.get_by_role("link", name="Rules and regulations").click()
|
page.get_by_role("link", name="Establish trust").click()
|
||||||
expect(page).to_have_title(re.compile("Rules and regulations"))
|
expect(page).to_have_title(re.compile("Establish trust"))
|
||||||
|
|
||||||
page.get_by_role("link", name="Establish trust").click()
|
page.get_by_role("link", name="Write for action").click()
|
||||||
expect(page).to_have_title(re.compile("Establish trust"))
|
expect(page).to_have_title(re.compile("Write texts that provoke"))
|
||||||
|
|
||||||
page.get_by_role("link", name="Write for action").click()
|
page.get_by_role("link", name="Multiple languages").click()
|
||||||
expect(page).to_have_title(re.compile("Write texts that provoke"))
|
expect(page).to_have_title(re.compile("Text in multiple languages"))
|
||||||
|
|
||||||
page.get_by_role("link", name="Multiple languages").click()
|
page.get_by_role("link", name="Benchmark performance").click()
|
||||||
expect(page).to_have_title(re.compile("Text in multiple languages"))
|
expect(page).to_have_title(re.compile("Measuring performance with"))
|
||||||
|
|
||||||
page.get_by_role("link", name="Benchmark performance").click()
|
parent_link = page.get_by_role("link", name="Establish trust")
|
||||||
expect(page).to_have_title(re.compile("Measuring performance with"))
|
parent_link.hover()
|
||||||
|
|
||||||
parent_link = page.get_by_role("link", name="Establish trust")
|
submenu_item = page.get_by_role("link", name=re.compile("Get the word out"))
|
||||||
parent_link.hover()
|
submenu_item.click()
|
||||||
|
|
||||||
submenu_item = page.get_by_role("link", name=re.compile("Get the word out"))
|
expect(page).to_have_url(re.compile(r"#get-the-word-out"))
|
||||||
submenu_item.click()
|
|
||||||
|
|
||||||
expect(page).to_have_url(re.compile(r"#get-the-word-out"))
|
anchor_target = page.locator("#get-the-word-out")
|
||||||
|
expect(anchor_target).to_be_visible()
|
||||||
anchor_target = page.locator("#get-the-word-out")
|
anchor_target.click()
|
||||||
expect(anchor_target).to_be_visible()
|
|
||||||
anchor_target.click()
|
|
||||||
|
|
||||||
|
|
||||||
def test_breadcrumbs_best_practices(authenticated_page):
|
def test_breadcrumbs_best_practices(authenticated_page):
|
||||||
@@ -63,10 +59,6 @@ def test_breadcrumbs_best_practices(authenticated_page):
|
|||||||
page.wait_for_load_state("domcontentloaded")
|
page.wait_for_load_state("domcontentloaded")
|
||||||
check_axe_report(page)
|
check_axe_report(page)
|
||||||
|
|
||||||
response = page.request.get(f"{E2E_TEST_URI}/test/feature-flags")
|
# Test Best Practices breadcrumbs
|
||||||
feature_flags = response.json()
|
page.get_by_role("link", name="Clear goals", exact=True).click()
|
||||||
feature_best_practices_enabled = feature_flags.get("FEATURE_BEST_PRACTICES_ENABLED")
|
page.locator("ol").get_by_role("link", name="Best Practices").click()
|
||||||
|
|
||||||
if feature_best_practices_enabled:
|
|
||||||
page.get_by_role("link", name="Clear goals", exact=True).click()
|
|
||||||
page.locator("ol").get_by_role("link", name="Best Practices").click()
|
|
||||||
|
|||||||
21
urls.js
21
urls.js
@@ -32,6 +32,27 @@ const sublinks = [
|
|||||||
label: 'Benchmark Performance',
|
label: 'Benchmark Performance',
|
||||||
path: '/guides/benchmark-performance',
|
path: '/guides/benchmark-performance',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'About',
|
||||||
|
path: '/about',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Why Text Messaging',
|
||||||
|
path: '/about/why-text-messaging',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Security',
|
||||||
|
path: '/about/security',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Join Notify',
|
||||||
|
path: '/join-notify',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Contact',
|
||||||
|
path: '/contact',
|
||||||
|
},
|
||||||
|
|
||||||
// Add more links here as needed
|
// Add more links here as needed
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user