From ba44ff5e8e2754595e89c93e4987ccec736c194a Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Thu, 14 Nov 2024 09:58:04 -0800 Subject: [PATCH 01/17] content added --- app/assets/images/calendar.svg | 9 ++ app/assets/images/checklist.svg | 9 ++ app/assets/images/reminder.svg | 10 ++ app/main/views/index.py | 10 ++ app/main/views/sub_navigation_dictionaries.py | 9 ++ .../views/about/why-text-messaging.html | 148 ++++++++++++++++++ tests/app/test_navigation.py | 1 + 7 files changed, 196 insertions(+) create mode 100644 app/assets/images/calendar.svg create mode 100644 app/assets/images/checklist.svg create mode 100644 app/assets/images/reminder.svg create mode 100644 app/templates/views/about/why-text-messaging.html diff --git a/app/assets/images/calendar.svg b/app/assets/images/calendar.svg new file mode 100644 index 000000000..68ef9c102 --- /dev/null +++ b/app/assets/images/calendar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/assets/images/checklist.svg b/app/assets/images/checklist.svg new file mode 100644 index 000000000..54757ba12 --- /dev/null +++ b/app/assets/images/checklist.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/assets/images/reminder.svg b/app/assets/images/reminder.svg new file mode 100644 index 000000000..97cf8f3f5 --- /dev/null +++ b/app/assets/images/reminder.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/main/views/index.py b/app/main/views/index.py index 28ede59d1..2804b91f5 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -10,6 +10,7 @@ from app.main import main from app.main.views.pricing import CURRENT_SMS_RATE from app.main.views.sub_navigation_dictionaries import ( + about_notify_nav, best_practices_nav, features_nav, using_notify_nav, @@ -270,6 +271,15 @@ def benchmark_performance(): ) +@main.route("/about/why-text-messaging") +@user_is_logged_in +def why_text_messaging(): + return render_template( + "views/about/why-text-messaging.html", + navigation_links=about_notify_nav(), + ) + + @main.route("/using-notify/guidance") @user_is_logged_in def guidance_index(): diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index 0689c198d..e7001c95e 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -101,3 +101,12 @@ def best_practices_nav(): "link": "main.benchmark_performance", }, ] + + +def about_notify_nav(): + return [ + { + "name": "Why text messaging", + "link": "main.why_text_messaging", + }, + ] diff --git a/app/templates/views/about/why-text-messaging.html b/app/templates/views/about/why-text-messaging.html new file mode 100644 index 000000000..4c9ae2a62 --- /dev/null +++ b/app/templates/views/about/why-text-messaging.html @@ -0,0 +1,148 @@ +{% extends "base.html" %} + +{% set page_title = "Why text messaging" %} + +{% block per_page_title %} +{{page_title}} +{% endblock %} + +{% block content_column_content %} + +
+

{{page_title}}

+ +

Reach people using a common method

+

+ Confusing or unreceived notifications are one of the largest barriers to people getting and keeping + benefits. The typical ways the government communicates with people often fall short. Low income households are more + likely to experience housing instability, which means paper mail, already slow, can easily be missed. +

+ +

+ Pew Research shows that nearly all adults in the US have a cell phone. Reliance on smartphones + for online access is especially common among Americans with lower household incomes and those with lower levels of + formal education. Of those earning less than $30,000 a year, 28% say their mobile phone is the sole method to + digitally connect. +

+

+ This means that for many people who rely on government services, cell phones may be the most reliable place to meet + people where they already are. +

+

Improve customer experience

+

+ Text messages can deliver concise information and drive an audience to take action quickly. Timely reminders sent + via text message have been proven to decrease re-enrollment churn and save money for administering agencies. +

+

+ Texting not only helps programs reach people using a nearly-universal communication method, it is a cost effective + way to do so. With Notify.gov you can get started for free, allowing you to try out + texting to complement your existing communications and outreach strategies. +

+

What texting is best for

+ Agencies, like you, are already using Notify.gov to text about the following programs. + {% set card_contents = [ + { + "svg_src": "calendar", + "card_heading": "Reminders", + "p_text": "In a text bubble // Your Quality Control food phone interview is on ((date)) at ((time)). Failure to + attend may lead + to closure of your benefits. Call 1-800-222-3333 with questions.", + "link": "/best-practices/clear-goals" + }, + { + "svg_src": "reminder", + "card_heading": "Alerts to take action", + "p_text": " In a text bubble // Your household's Medicaid coverage is expiring. To keep getting Medicaid, you must + complete your renewal by ((date)). You can renew online at dhs.state.gov…", + "link": "/best-practices/rules-and-regulations" + }, + { + "svg_src": "checklist", + "card_heading": "Important status updates", + "p_text": "In a text bubble // Your passport has been issued at the Los Angeles Passport Agency. Please come to the + desk + between + 1:30pm and 2:30pm today to pick up your passport…", + "link": "/best-practices/establish-trust" + }, + ] %} + {% for item in card_contents %} +
+

{{item.card_heading}}

+

{{item.p_text}}

+ +
+ {% endfor %} + + + +
+{% endblock %} diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py index 8bf52d803..03f8e8c86 100644 --- a/tests/app/test_navigation.py +++ b/tests/app/test_navigation.py @@ -256,6 +256,7 @@ "view_template_version", "view_template_versions", "who_its_for", + "why_text_messaging", "write_for_action", }, ) From ff4ee646ca0ed02839a853aecb6f4ea8b63d3290 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Thu, 14 Nov 2024 14:00:05 -0800 Subject: [PATCH 02/17] content change --- .../views/about/why-text-messaging.html | 73 +------------------ 1 file changed, 4 insertions(+), 69 deletions(-) diff --git a/app/templates/views/about/why-text-messaging.html b/app/templates/views/about/why-text-messaging.html index 4c9ae2a62..68548bce2 100644 --- a/app/templates/views/about/why-text-messaging.html +++ b/app/templates/views/about/why-text-messaging.html @@ -10,70 +10,6 @@

{{page_title}}

-

Reach people using a common method

Confusing or Improve customer experience texting to complement your existing communications and outreach strategies.

What texting is best for

- Agencies, like you, are already using Notify.gov to text about the following programs. +

+ Agencies, like you, are already using Notify.gov to text about the following programs. +

{% set card_contents = [ { "svg_src": "calendar", @@ -113,14 +51,12 @@

What texting is best for

"p_text": "In a text bubble // Your Quality Control food phone interview is on ((date)) at ((time)). Failure to attend may lead to closure of your benefits. Call 1-800-222-3333 with questions.", - "link": "/best-practices/clear-goals" }, { "svg_src": "reminder", "card_heading": "Alerts to take action", "p_text": " In a text bubble // Your household's Medicaid coverage is expiring. To keep getting Medicaid, you must complete your renewal by ((date)). You can renew online at dhs.state.gov…", - "link": "/best-practices/rules-and-regulations" }, { "svg_src": "checklist", @@ -129,7 +65,6 @@

What texting is best for

desk between 1:30pm and 2:30pm today to pick up your passport…", - "link": "/best-practices/establish-trust" }, ] %} {% for item in card_contents %} @@ -137,7 +72,7 @@

What texting is best for

{{item.card_heading}}

{{item.p_text}}

{% endfor %} From 523c00f3a695ad4c28add023cbd7f04a36fe7e2f Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Thu, 14 Nov 2024 15:45:27 -0800 Subject: [PATCH 03/17] update images --- app/assets/images/calendar.png | Bin 0 -> 5515 bytes app/assets/images/calendar.svg | 9 ----- app/assets/images/checklist.png | Bin 0 -> 6790 bytes app/assets/images/checklist.svg | 9 ----- app/assets/images/reminder.png | Bin 0 -> 2025 bytes app/assets/images/reminder.svg | 10 ------ .../views/about/why-text-messaging.html | 34 ++++++++++-------- 7 files changed, 19 insertions(+), 43 deletions(-) create mode 100644 app/assets/images/calendar.png delete mode 100644 app/assets/images/calendar.svg create mode 100644 app/assets/images/checklist.png delete mode 100644 app/assets/images/checklist.svg create mode 100644 app/assets/images/reminder.png delete mode 100644 app/assets/images/reminder.svg diff --git a/app/assets/images/calendar.png b/app/assets/images/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..20bf82540ad96bb766585beda3d44cf0fd00839f GIT binary patch literal 5515 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 N002ovPDHLkV1gqFOxXYc literal 0 HcmV?d00001 diff --git a/app/assets/images/calendar.svg b/app/assets/images/calendar.svg deleted file mode 100644 index 68ef9c102..000000000 --- a/app/assets/images/calendar.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/app/assets/images/checklist.png b/app/assets/images/checklist.png new file mode 100644 index 0000000000000000000000000000000000000000..e86e2f6700ef5c51de88a1a08032826ec7cbbbf8 GIT binary patch literal 6790 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 - - - - - - - - diff --git a/app/assets/images/reminder.png b/app/assets/images/reminder.png new file mode 100644 index 0000000000000000000000000000000000000000..a93d3c1a90882445283b7c62d79869626323a443 GIT binary patch literal 2025 zcmVG0@m1ix3gWB4Tm^9lA{E4`z)A&|tH4SHNe3bo#2w@qBQC22TLOW! z1M|H%&jJes?2r93JG*&Hei_(6U_N%8o z&`mrkkbBuvis#d`V^W}`pRNmv(H)1Ua|${CPX=s;_oV5sXJHS51cr&gFcBD-2n|bv#Xxccop>ov&2h%HpLjEg06% z?di{Y;A=Uxt?7>+_*xd>$;0B{9-aPqqdPf4&RUBgBXNJUF*sRixALK`6D*=HNY9`2 zb`^9(PWqm4c!NF;DFR+X(&mnCNL^3T=O)-E>3%07kjk73{vn}Ef6J*OsTxMv~H)o~bkbWT4; z#jq&t4~FsZX&rPDk~2(BR+RQ9BX~}SE)Hr6Dqnv_<*Ro4ANo{mh*wLp(iPJnFKxN` zD{&fKDu@MD-D1f|t&OonP_x{aQ6*+Zf|#GcFcBCg0s|9)fr-GNy>)QGVNt?H+FZmt z+C-3HL8r6AiUY$$V6+zpE1JQG#&ozMs`IspKm?FuOqHBS1XdgvCIZ7mU|=FJ7(bpM zRV1iGV*kQv=Ou7M0$B=Xh-X?ceY=pve<=oX!L-RaLX2U`JPpO>XK6T0gGd;hB%e(6L(x zYo@a(=U&XsV^~l%1wXg^PqIcCJv`KiYE^jV)pt;nv3=heGsU`+4HLmk@l-j!lZ`pX z6G$t;(OlF+_KBZhs{Vl*xyOgiXYq|ZO&so-ex1Nmt-t(@{hEm1HsAM5kDMr;V9Gf` z9X)hQ_dbBjjmfbEm1F5M6Kyq2u}&ZfzMyLF=N#S%9@lG02HTpw&+x#Xy+l7aadhl;4X3 zQ}0oTMiFFecl$~lKpZZ94C=7;@OM25UCkOr5Vz0!tmHZr1IVY*-IrCs98nZmncD#2(F^-)WX14(e_)Eph*OAe?V#?D57o42}ZyLp9|8Y z2tJS1i8VMDa&DLi3=@HYiNL@_U|=FJFcBD-2nV z3`_(DI;N}frM+W2Qm1X)pG5pVHyWv)$7t+mpZFSO$hxdOomx)uaVO6>h*U+8(J$d-SX$eFloS@Qa3ng3 zw$ussT_5O}yo=6M3F-9cxK7G3OJG{nrONg=r?$XS$}P z-sMPF2%1Upd9Hb(;w@RmE#2GaW1D7DdX8&`ne_W8JTOfWJdhyPcVL(Z3_T)HGt65f zsrDlNh_>(9o)bt5SJ8HXu{WNyYSlxTs#(oaV2Q2--eq?fy^sf|DWO#gK!Z=-(dhLtnW=Y6wkK@)Y$9fEv#Kl4=hMcOr_f*1I@O(gOj-i^I!)o@o7?Z%$ zJyv3k6#`!&bz9fG6sBh - - - - - - - - - diff --git a/app/templates/views/about/why-text-messaging.html b/app/templates/views/about/why-text-messaging.html index 68548bce2..efb2df873 100644 --- a/app/templates/views/about/why-text-messaging.html +++ b/app/templates/views/about/why-text-messaging.html @@ -46,34 +46,38 @@

What texting is best for

{% set card_contents = [ { - "svg_src": "calendar", + "image_src": asset_url('images/calendar.png'), "card_heading": "Reminders", "p_text": "In a text bubble // Your Quality Control food phone interview is on ((date)) at ((time)). Failure to - attend may lead - to closure of your benefits. Call 1-800-222-3333 with questions.", + attend may lead to closure of your benefits. Call 1-800-222-3333 with questions.", + "alt_text": "reminder text example" }, { - "svg_src": "reminder", + "image_src": asset_url('images/reminder.png'), "card_heading": "Alerts to take action", - "p_text": " In a text bubble // Your household's Medicaid coverage is expiring. To keep getting Medicaid, you must + "p_text": "In a text bubble // Your household's Medicaid coverage is expiring. To keep getting Medicaid, you must complete your renewal by ((date)). You can renew online at dhs.state.gov…", + "alt_text": "alerts text example" }, { - "svg_src": "checklist", + "image_src": asset_url('images/checklist.png'), "card_heading": "Important status updates", "p_text": "In a text bubble // Your passport has been issued at the Los Angeles Passport Agency. Please come to the - desk - between - 1:30pm and 2:30pm today to pick up your passport…", + desk between 1:30pm and 2:30pm today to pick up your passport…", + "alt_text": "status update text example" }, ] %} {% for item in card_contents %} -
-

{{item.card_heading}}

-

{{item.p_text}}

- +
+
+
+

{{item.card_heading}}

+

{{item.p_text}}

+
+ {% if item.image_src %} + {{ item.alt_text }} + {% endif %} +
{% endfor %} From 0138930172e1b31f5940069218b2d48706854e1b Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Fri, 15 Nov 2024 13:31:14 -0800 Subject: [PATCH 04/17] assets --- app/assets/images/alarm.svg | 1 + app/assets/images/alert.svg | 1 + app/assets/images/calendar.png | Bin 5515 -> 0 bytes app/assets/images/calendar.svg | 1 + app/assets/images/checklist.png | Bin 6790 -> 0 bytes app/assets/images/reminder.png | Bin 2025 -> 0 bytes .../views/about/why-text-messaging.html | 14 ++++++-------- 7 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 app/assets/images/alarm.svg create mode 100644 app/assets/images/alert.svg delete mode 100644 app/assets/images/calendar.png create mode 100644 app/assets/images/calendar.svg delete mode 100644 app/assets/images/checklist.png delete mode 100644 app/assets/images/reminder.png diff --git a/app/assets/images/alarm.svg b/app/assets/images/alarm.svg new file mode 100644 index 000000000..57e6180bc --- /dev/null +++ b/app/assets/images/alarm.svg @@ -0,0 +1 @@ + diff --git a/app/assets/images/alert.svg b/app/assets/images/alert.svg new file mode 100644 index 000000000..d0d516d8f --- /dev/null +++ b/app/assets/images/alert.svg @@ -0,0 +1 @@ + diff --git a/app/assets/images/calendar.png b/app/assets/images/calendar.png deleted file mode 100644 index 20bf82540ad96bb766585beda3d44cf0fd00839f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5515 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 N002ovPDHLkV1gqFOxXYc diff --git a/app/assets/images/calendar.svg b/app/assets/images/calendar.svg new file mode 100644 index 000000000..9b755e9fd --- /dev/null +++ b/app/assets/images/calendar.svg @@ -0,0 +1 @@ + diff --git a/app/assets/images/checklist.png b/app/assets/images/checklist.png deleted file mode 100644 index e86e2f6700ef5c51de88a1a08032826ec7cbbbf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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 + +

{{page_title}}

Reach people using a common method

@@ -46,21 +47,21 @@

What texting is best for

{% set card_contents = [ { - "image_src": asset_url('images/calendar.png'), + "image_src": asset_url('images/calendar.svg'), "card_heading": "Reminders", "p_text": "In a text bubble // Your Quality Control food phone interview is on ((date)) at ((time)). Failure to attend may lead to closure of your benefits. Call 1-800-222-3333 with questions.", "alt_text": "reminder text example" }, { - "image_src": asset_url('images/reminder.png'), + "image_src": asset_url('images/alert.svg'), "card_heading": "Alerts to take action", "p_text": "In a text bubble // Your household's Medicaid coverage is expiring. To keep getting Medicaid, you must complete your renewal by ((date)). You can renew online at dhs.state.gov…", "alt_text": "alerts text example" }, { - "image_src": asset_url('images/checklist.png'), + "image_src": asset_url('images/alarm.svg'), "card_heading": "Important status updates", "p_text": "In a text bubble // Your passport has been issued at the Los Angeles Passport Agency. Please come to the desk between 1:30pm and 2:30pm today to pick up your passport…", @@ -80,8 +81,5 @@

What texting is best for

{% endfor %} - - -
{% endblock %} From 0b81ed024795d8f39a1c8f02cc4516d969ce69a6 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 18 Nov 2024 11:49:39 -0800 Subject: [PATCH 05/17] changes to nav --- app/main/views/sub_navigation_dictionaries.py | 12 +++++++++++- app/templates/base.html | 15 ++++++++++++++- app/templates/views/about/about.html | 2 +- app/templates/views/about/why-text-messaging.html | 4 ++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index 1f7725228..cc92af303 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -110,12 +110,22 @@ def best_practices_nav(): def about_notify_nav(): return [ { - "name": "About notify", + "name": "About Notify", "link": "main.about_notify", "sub_navigation_items": [ { "name": "Why text messaging", "link": "main.why_text_messaging", + "sub_sub_navigation_items": [ + { + "name": "Reach people using a common method", + "link": "main.why_text_messaging#reach-people-using-a-common-method", + }, + { + "name": "Improve customer experience", + "link": "main.why_text_messaging#improve-customer-experience", + }, + ], }, ], }, diff --git a/app/templates/base.html b/app/templates/base.html index 369e62b81..b2b6639e9 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -66,7 +66,20 @@ diff --git a/app/templates/views/about/about.html b/app/templates/views/about/about.html index 39dfce671..bed63cfa7 100644 --- a/app/templates/views/about/about.html +++ b/app/templates/views/about/about.html @@ -1,6 +1,6 @@ {% extends "base.html" %} -{% set page_title = "About notify" %} +{% set page_title = "About Notify" %} {% block per_page_title %} {{page_title}} diff --git a/app/templates/views/about/why-text-messaging.html b/app/templates/views/about/why-text-messaging.html index bdb63701d..ff8e4f909 100644 --- a/app/templates/views/about/why-text-messaging.html +++ b/app/templates/views/about/why-text-messaging.html @@ -11,7 +11,7 @@

{{page_title}}

-

Reach people using a common method

+

Reach people using a common method

Confusing or Reach people using a common method This means that for many people who rely on government services, cell phones may be the most reliable place to meet people where they already are.

-

Improve customer experience

+

Improve customer experience

Text messages can deliver concise information and drive an audience to take action quickly. Timely reminders sent via text message have been proven to decrease re-enrollment churn and save money for administering agencies. From 655ecb60e9f07f2ff3abd7febc6dff32135e2ce2 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 18 Nov 2024 11:59:00 -0800 Subject: [PATCH 06/17] update sub links --- app/main/views/sub_navigation_dictionaries.py | 4 ++++ app/templates/views/about/why-text-messaging.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index cc92af303..16aef0c17 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -125,6 +125,10 @@ def about_notify_nav(): "name": "Improve customer experience", "link": "main.why_text_messaging#improve-customer-experience", }, + { + "name": "What texting is best for", + "link": "main.why_text_messaging#what-texting-is-best-for", + }, ], }, ], diff --git a/app/templates/views/about/why-text-messaging.html b/app/templates/views/about/why-text-messaging.html index ff8e4f909..9b354479c 100644 --- a/app/templates/views/about/why-text-messaging.html +++ b/app/templates/views/about/why-text-messaging.html @@ -41,7 +41,7 @@

Improve customer experience

way to do so. With Notify.gov
you can get started for free, allowing you to try out texting to complement your existing communications and outreach strategies.

-

What texting is best for

+

What texting is best for

Agencies, like you, are already using Notify.gov to text about the following programs.

From 2ba369100c1bde2d02980d08df0b58fd99cfecf2 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 18 Nov 2024 13:35:24 -0800 Subject: [PATCH 07/17] content --- app/main/views/index.py | 8 +++ app/main/views/sub_navigation_dictionaries.py | 4 ++ app/templates/views/about/security.html | 61 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 app/templates/views/about/security.html diff --git a/app/main/views/index.py b/app/main/views/index.py index 974e29211..79d4365f4 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -295,6 +295,14 @@ def about_notify(): ) +@main.route("/about/security") +def about_security(): + return render_template( + "views/about/security.html", + navigation_links=about_notify_nav(), + ) + + @main.route("/using-notify/guidance/create-and-send-messages") @user_is_logged_in def create_and_send_messages(): diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index b9fb7f8ae..f043955de 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -113,4 +113,8 @@ def about_notify_nav(): "name": "About notify", "link": "main.about_notify", }, + { + "name": "Security", + "link": "main.about_security", + }, ] diff --git a/app/templates/views/about/security.html b/app/templates/views/about/security.html new file mode 100644 index 000000000..b03e593a4 --- /dev/null +++ b/app/templates/views/about/security.html @@ -0,0 +1,61 @@ +{% extends "base.html" %} + +{% set page_title = "Security" %} + +{% block per_page_title %} +{{page_title}} +{% endblock %} + +{% block content_column_content %} + +
+

{{page_title}}

+

Notify.gov is built for the needs of government agencies with fundamental system + security processes in place to: +

+
    +
  • protect user data
  • +
  • keep systems secure
  • +
  • manage risks around information
  • +
+

+ Notify.gov operates under a full three-year Authority-to-Operate (ATO). This federal security authorization process leverages security + controls provided by National Institute of Standards and Technology (NIST). +

+ +

+ Our infrastructure runs on cloud.gov and utilizes several + services through Amazon Web + Services (AWS), including AWS SNS for sending SMS + messages. +

+

For more information about the Notify.gov infrastructure, contact us at notify-support@gsa.gov.

+

Data

+

+ On Notify.gov, data is encrypted both in transit and at rest. To send a message, agencies upload a spreadsheet of + phone numbers and other necessary data from their existing data management system. +

+

+ Notify.gov is not a system of record, so it does not have a System of Records Notice (SORN). Agencies are + responsible for managing their data outside of Notify.gov. +

+

Data retention

+

+ Any data uploads that have recipient data are held for seven calendar days; personally identifiable information + (PII) is never stored in Notify’s database. +

+

Multi-Factor Authentication

+

+ Notify.gov uses Login.gov for enhanced security. + Login.gov is an extra layer of security created by the government that uses multi-factor authentication and stronger + passwords to protect your account. +

+

+ To access Notify.gov, users will use a Login.gov account associated with their agency (.gov) email with one of the + multi-factor authentication + methods offered through Login.gov. +

+
+{% endblock %} From de8c4b7204177f862cc35e6111d77c80819c6d99 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 18 Nov 2024 13:41:32 -0800 Subject: [PATCH 08/17] test --- tests/app/test_navigation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py index 15be17081..910364cee 100644 --- a/tests/app/test_navigation.py +++ b/tests/app/test_navigation.py @@ -18,6 +18,7 @@ Navigation.get_endpoint_with_blueprint, { "about_notify", + "about_security", "accept_invite", "accept_org_invite", "accessibility_statement", From 942489dc57f8dce8eaaa768308fdd551f8d5a4aa Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 20 Nov 2024 09:43:12 -0800 Subject: [PATCH 09/17] updated external links --- app/main/views/sub_navigation_dictionaries.py | 10 ++++++---- app/templates/views/about/security.html | 17 +++++++++++------ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index f043955de..0aba6069b 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -112,9 +112,11 @@ def about_notify_nav(): { "name": "About notify", "link": "main.about_notify", - }, - { - "name": "Security", - "link": "main.about_security", + "sub_navigation_items": [ + { + "name": "Security", + "link": "main.about_security", + }, + ], }, ] diff --git a/app/templates/views/about/security.html b/app/templates/views/about/security.html index b03e593a4..9ebc0420f 100644 --- a/app/templates/views/about/security.html +++ b/app/templates/views/about/security.html @@ -19,15 +19,18 @@

{{page_title}}

  • manage risks around information
  • - Notify.gov operates under a full three-year Authority-to-Operate (ATO). This federal security authorization process leverages security + Notify.gov operates under a full three-year Authority-to-Operate (ATO). This + federal security authorization process leverages security controls provided by National Institute of Standards and Technology (NIST).

    - Our infrastructure runs on cloud.gov and utilizes several + Our infrastructure runs on cloud.gov and utilizes several services through Amazon Web - Services (AWS), including AWS SNS for sending SMS + Services (AWS), including + AWS SNS for sending SMS messages.

    For more information about the Notify.gov infrastructure, contact us at Data retention

    Multi-Factor Authentication

    - Notify.gov uses Login.gov for enhanced security. + Notify.gov uses Login.gov for enhanced security. Login.gov is an extra layer of security created by the government that uses multi-factor authentication and stronger passwords to protect your account.

    To access Notify.gov, users will use a Login.gov account associated with their agency (.gov) email with one of the - multi-factor authentication + multi-factor authentication methods offered through Login.gov.

    From a318b2dd0f4ede746c54fc3f77fdf093e8174591 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 20 Nov 2024 09:49:52 -0800 Subject: [PATCH 10/17] updated external links --- app/templates/views/about/about.html | 15 +++++++-------- app/templates/views/about/why-text-messaging.html | 7 ++++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/templates/views/about/about.html b/app/templates/views/about/about.html index bed63cfa7..cd52709c2 100644 --- a/app/templates/views/about/about.html +++ b/app/templates/views/about/about.html @@ -17,8 +17,9 @@

    {{page_title}}

  • Meet people where they are
  • More effectively deliver program outcomes
  • Save administrative costs
  • -
  • Implement 21st Century IDEA and other directives
  • +
  • Implement 21st Century + IDEA and other directives
  • Notify.gov is an easy-to-use, web-based platform. It requires no technical expertise or system integration — users can create an account and get started within minutes. We take the security and privacy of messaging data seriously @@ -56,9 +57,9 @@

    Product Highlights

      {% for item in product_highlights %}
    • -
      +
      - {{item.card_heading}} @@ -68,10 +69,8 @@

      Product Highlights

    • {% endfor %}
    -

    See if Notify is right for you

    -

    Notify.gov is a product of the Public Benefits Studio, a product accelerator inside +

    See if Notify is right for you

    +

    Notify.gov is a product of the Public Benefits Studio, a product accelerator inside the federal government.

    - - {% endblock %} diff --git a/app/templates/views/about/why-text-messaging.html b/app/templates/views/about/why-text-messaging.html index 9b354479c..6aa0887cb 100644 --- a/app/templates/views/about/why-text-messaging.html +++ b/app/templates/views/about/why-text-messaging.html @@ -13,7 +13,7 @@

    {{page_title}}

    Reach people using a common method

    - Confusing or unreceived notifications are one of the largest barriers to people getting and keeping benefits. The typical ways the government communicates with people often fall short. Low income households are more @@ -21,7 +21,8 @@

    Reach people using a common method

    - Pew Research shows that nearly all adults in the US have a cell phone. Reliance on smartphones for online access is especially common among Americans with lower household incomes and those with lower levels of formal education. Of those earning less than $30,000 a year, 28% say their mobile phone is the sole method to @@ -38,7 +39,7 @@

    Improve customer experience

    Texting not only helps programs reach people using a nearly-universal communication method, it is a cost effective - way to do so. With Notify.gov you can get started for free, allowing you to try out + way to do so. With Notify.gov you can get started for free, allowing you to try out texting to complement your existing communications and outreach strategies.

    What texting is best for

    From a8ecb57e519d59dfe3d16943d08542836e22b443 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 20 Nov 2024 10:25:39 -0800 Subject: [PATCH 11/17] removed logged in --- .../sass/uswds/_uswds-theme-custom-styles.scss | 6 +----- app/main/views/index.py | 17 ++++++++--------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/app/assets/sass/uswds/_uswds-theme-custom-styles.scss b/app/assets/sass/uswds/_uswds-theme-custom-styles.scss index da5d77bf2..cec48e82b 100644 --- a/app/assets/sass/uswds/_uswds-theme-custom-styles.scss +++ b/app/assets/sass/uswds/_uswds-theme-custom-styles.scss @@ -898,7 +898,7 @@ li.linked-card:hover svg, display: block; } -.about-icon-list { +.icon-list { display: flex; width: 24px; height: 24px; @@ -908,10 +908,6 @@ li.linked-card:hover svg, margin-right: 4px; } -.usa-icon-list__content{ - padding-left: 0; -} - .indented-paragraph { margin-left: calc(24px + 4px); margin-top: 4px; diff --git a/app/main/views/index.py b/app/main/views/index.py index c677b3524..7050adcde 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -275,15 +275,6 @@ def benchmark_performance(): ) -@main.route("/about/why-text-messaging") -@user_is_logged_in -def why_text_messaging(): - return render_template( - "views/about/why-text-messaging.html", - navigation_links=about_notify_nav(), - ) - - @main.route("/using-notify/guidance") @main.route("/guides/using-notify/guidance") @user_is_logged_in @@ -305,6 +296,14 @@ def about_notify(): ) +@main.route("/about/why-text-messaging") +def why_text_messaging(): + return render_template( + "views/about/why-text-messaging.html", + navigation_links=about_notify_nav(), + ) + + @main.route("/using-notify/guidance/create-and-send-messages") @user_is_logged_in def create_and_send_messages(): From 598a9af6f11f2905b0cc78d7c953ef48383132e3 Mon Sep 17 00:00:00 2001 From: Andrew Shumway Date: Thu, 21 Nov 2024 11:42:30 -0700 Subject: [PATCH 12/17] Add redis ID to ignore vulnerability list in audit/no current fix --- .github/workflows/checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index f002bb3fc..c3ef5dcbb 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -144,6 +144,7 @@ jobs: inputs: requirements.txt ignore-vulns: | PYSEC-2024-60 + PYSEC-2022-43162 - name: Run npm audit run: make npm-audit From 8f30064f508e2fa0acb0dad7f5115522457626d2 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Thu, 21 Nov 2024 15:08:49 -0800 Subject: [PATCH 13/17] add carrier column to reports --- .ds.baseline | 4 ++-- app/config.py | 4 +--- app/main/views/index.py | 10 ++++------ app/navigation.py | 2 +- app/utils/csv.py | 4 ++++ tests/app/utils/test_csv.py | 15 +++++++++++---- 6 files changed, 23 insertions(+), 16 deletions(-) diff --git a/.ds.baseline b/.ds.baseline index c64d22627..56c3afc7d 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -161,7 +161,7 @@ "filename": "app/config.py", "hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc", "is_verified": false, - "line_number": 125, + "line_number": 123, "is_secret": false } ], @@ -684,5 +684,5 @@ } ] }, - "generated_at": "2024-11-14T15:53:44Z" + "generated_at": "2024-11-21T23:08:45Z" } diff --git a/app/config.py b/app/config.py index f40b46dea..146230047 100644 --- a/app/config.py +++ b/app/config.py @@ -91,9 +91,7 @@ class Config(object): 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" def _s3_credentials_from_env(bucket_prefix): diff --git a/app/main/views/index.py b/app/main/views/index.py index 9982a8b74..fbf7979a3 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -30,15 +30,13 @@ # Hook to check for feature flags @main.before_request def check_feature_flags(): - if ( - request.path.startswith("/guides/best-practices") - and not current_app.config.get("FEATURE_BEST_PRACTICES_ENABLED", False) + if request.path.startswith("/guides/best-practices") and not current_app.config.get( + "FEATURE_BEST_PRACTICES_ENABLED", False ): abort(404) - if ( - request.path.startswith("/about") - and not current_app.config.get("FEATURE_ABOUT_PAGE_ENABLED", False) + if request.path.startswith("/about") and not current_app.config.get( + "FEATURE_ABOUT_PAGE_ENABLED", False ): abort(404) diff --git a/app/navigation.py b/app/navigation.py index a02df484d..271d6848b 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -53,7 +53,7 @@ class HeaderNavigation(Navigation): "establish_trust", "write_for_action", "multiple_languages", - "benchmark_performance" + "benchmark_performance", }, "using_notify": { "get_started", diff --git a/app/utils/csv.py b/app/utils/csv.py index 4ed6d16b5..79e3535c8 100644 --- a/app/utils/csv.py +++ b/app/utils/csv.py @@ -103,6 +103,7 @@ def generate_notifications_csv(**kwargs): "Carrier Response", "Status", "Time", + "Carrier", ] for header in original_column_headers: if header.lower() != "phone number": @@ -118,6 +119,7 @@ def generate_notifications_csv(**kwargs): "Carrier Response", "Status", "Time", + "Carrier", ] yield ",".join(fieldnames) + "\n" @@ -140,6 +142,7 @@ def generate_notifications_csv(**kwargs): notification["provider_response"], notification["status"], preferred_tz_created_at, + notification["carrier"], ] for header in original_column_headers: if header.lower() != "phone number": @@ -158,6 +161,7 @@ def generate_notifications_csv(**kwargs): notification["provider_response"], notification["status"], preferred_tz_created_at, + notification["carrier"], ] yield Spreadsheet.from_rows([map(str, values)]).as_csv_data diff --git a/tests/app/utils/test_csv.py b/tests/app/utils/test_csv.py index d603fcd0e..db4b6a0ec 100644 --- a/tests/app/utils/test_csv.py +++ b/tests/app/utils/test_csv.py @@ -58,6 +58,7 @@ def _get( "to": recipient, "recipient": recipient, "client_reference": "ref 1234", + "carrier": "AT&T Mobility", } for i in range(rows) ], @@ -88,15 +89,15 @@ def get_notifications_csv_mock( ( None, [ - "Phone Number,Template,Sent by,Batch File,Carrier Response,Status,Time\n", - "8005555555,foo,,,Did not like it,Delivered,1943-04-19 08:00:00 AM US/Eastern\r\n", + "Phone Number,Template,Sent by,Batch File,Carrier Response,Status,Time,Carrier\n", + "8005555555,foo,,,Did not like it,Delivered,1943-04-19 08:00:00 AM US/Eastern,AT&T Mobility\r\n", ], ), ( "Anne Example", [ - "Phone Number,Template,Sent by,Batch File,Carrier Response,Status,Time\n", - "8005555555,foo,Anne Example,,Did not like it,Delivered,1943-04-19 08:00:00 AM US/Eastern\r\n", # noqa + "Phone Number,Template,Sent by,Batch File,Carrier Response,Status,Time,Carrier\n", + "8005555555,foo,Anne Example,,Did not like it,Delivered,1943-04-19 08:00:00 AM US/Eastern,AT&T Mobility\r\n", # noqa ], ), ], @@ -135,6 +136,7 @@ def test_generate_notifications_csv_without_job( "Carrier Response", "Status", "Time", + "Carrier", ], [ "8005555555", @@ -144,6 +146,7 @@ def test_generate_notifications_csv_without_job( "Did not like it", "Delivered", "1943-04-19 08:00:00 AM US/Eastern", + "AT&T Mobility", ], ), ( @@ -159,6 +162,7 @@ def test_generate_notifications_csv_without_job( "Carrier Response", "Status", "Time", + "Carrier", "a", "b", "c", @@ -171,6 +175,7 @@ def test_generate_notifications_csv_without_job( "Did not like it", "Delivered", "1943-04-19 08:00:00 AM US/Eastern", + "AT&T Mobility", "🐜", "🐝", "🦀", @@ -189,6 +194,7 @@ def test_generate_notifications_csv_without_job( "Carrier Response", "Status", "Time", + "Carrier", "a", "b", "c", @@ -201,6 +207,7 @@ def test_generate_notifications_csv_without_job( "Did not like it", "Delivered", "1943-04-19 08:00:00 AM US/Eastern", + "AT&T Mobility", "🐜,🐜", "🐝,🐝", "🦀", From d4c646a788ec66ed4d139044255b45f523cc1c58 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Tue, 26 Nov 2024 13:45:43 -0800 Subject: [PATCH 14/17] making sub nav items conditional on feature flag --- app/main/views/index.py | 1 - app/main/views/sub_navigation_dictionaries.py | 55 ++++++------------- 2 files changed, 16 insertions(+), 40 deletions(-) diff --git a/app/main/views/index.py b/app/main/views/index.py index 983099a4f..49eeae427 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -292,7 +292,6 @@ def benchmark_performance(): ) -@main.route("/using-notify/guidance") @main.route("/guides/using-notify/guidance") @user_is_logged_in def guidance_index(): diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index 3c81dc7ed..0cf436424 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -1,3 +1,7 @@ +from flask import ( + current_app, +) + def features_nav(): return [ { @@ -22,46 +26,19 @@ def features_nav(): def using_notify_nav(): - return [ - { - "name": "Get started", - "link": "main.get_started", - }, - { - "name": "Guides", - "link": "main.best_practices", - }, - { - "name": "Trial mode", - "link": "main.trial_mode_new", - }, - { - "name": "Tracking usage", - "link": "main.pricing", - }, - { - "name": "Delivery status", - "link": "main.message_status", - }, - { - "name": "Guidance", - "link": "main.guidance_index", - # "sub_navigation_items": [ - # { - # "name": "Formatting", - # "link": "main.edit_and_format_messages", - # }, - # { - # "name": "Send files by email", - # "link": "main.send_files_by_email", - # }, - # ] - # { - # "name": "API documentation", - # "link": "main.documentation", - # }, - }, + nav_items = [ + {"name": "Get started", "link": "main.get_started"}, + {"name": "Guides", "link": "main.best_practices"}, + {"name": "Trial mode", "link": "main.trial_mode_new"}, + {"name": "Tracking usage", "link": "main.pricing"}, + {"name": "Delivery Status", "link": "main.message_status"}, + {"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 def best_practices_nav(): From e638eb4ad13cf2a88a10c975674df8e5312b8122 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Tue, 26 Nov 2024 13:50:00 -0800 Subject: [PATCH 15/17] isort fix --- app/main/views/sub_navigation_dictionaries.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index 0cf436424..bd44c1319 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -1,6 +1,5 @@ -from flask import ( - current_app, -) +from flask import current_app + def features_nav(): return [ From a5c65439b601389d7e7a7325405117389f7a232e Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Tue, 26 Nov 2024 14:38:15 -0800 Subject: [PATCH 16/17] update e2e --- app/main/views/sub_navigation_dictionaries.py | 5 +++-- tests/end_to_end/test_best_practices_content_pages.py | 4 ++-- urls.js | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index bd44c1319..603094cd1 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -32,10 +32,11 @@ def using_notify_nav(): {"name": "Tracking usage", "link": "main.pricing"}, {"name": "Delivery Status", "link": "main.message_status"}, {"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"] + nav_items = [ + item for item in nav_items if item["link"] != "main.best_practices" + ] return nav_items diff --git a/tests/end_to_end/test_best_practices_content_pages.py b/tests/end_to_end/test_best_practices_content_pages.py index 962100de3..031e4baef 100644 --- a/tests/end_to_end/test_best_practices_content_pages.py +++ b/tests/end_to_end/test_best_practices_content_pages.py @@ -11,7 +11,7 @@ def test_best_practices_side_menu(authenticated_page): page = authenticated_page - page.goto(f"{E2E_TEST_URI}/best-practices") + page.goto(f"{E2E_TEST_URI}/guides/best-practices") page.wait_for_load_state("domcontentloaded") check_axe_report(page) @@ -58,7 +58,7 @@ def test_best_practices_side_menu(authenticated_page): def test_breadcrumbs_best_practices(authenticated_page): page = authenticated_page - page.goto(f"{E2E_TEST_URI}/best-practices") + page.goto(f"{E2E_TEST_URI}/guides/best-practices") page.wait_for_load_state("domcontentloaded") check_axe_report(page) diff --git a/urls.js b/urls.js index 0440430ec..2279b5a79 100644 --- a/urls.js +++ b/urls.js @@ -8,7 +8,7 @@ const sublinks = [ { label: 'Trial Mode', path: '/using-notify/trial-mode' }, { label: 'Pricing', path: '/using-notify/pricing' }, { label: 'Delivery Status', path: '/using-notify/delivery-status' }, - { label: 'Guidance', path: '/using-notify/guidance' }, + { label: 'Guidance', path: '/guides/using-notify/guidance' }, { label: 'Features', path: '/features' }, { label: 'Roadmap', path: '/features/roadmap' }, { label: 'Security', path: '/features/security' }, From 3dd8d2508977242b0593c2d9f6d1c8f2859b56c9 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Tue, 26 Nov 2024 21:02:45 -0500 Subject: [PATCH 17/17] Bump admin production memory to 2GB per instance This changeset bumps the admin production memory to 2GB per instance. We were noticing that the admin app was consuming almost all of the 1.5GB memory currently. Signed-off-by: Carlo Costino --- deploy-config/production.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy-config/production.yml b/deploy-config/production.yml index 42a681cb4..9f5cffc89 100644 --- a/deploy-config/production.yml +++ b/deploy-config/production.yml @@ -1,6 +1,6 @@ env: production instances: 2 -memory: 1.5G +memory: 2G command: newrelic-admin run-program gunicorn -c /home/vcap/app/gunicorn_config.py application public_admin_route: beta.notify.gov cloud_dot_gov_route: notify.app.cloud.gov