Compare commits

...

168 Commits

Author SHA1 Message Date
Jonathan Bobel
9921809f90 2489 - Clean up site js 2025-04-07 15:25:29 -04:00
ccostino
ee8213f670 Merge pull request #2485 from GSA/updating_assets_folder
updating asset folder
2025-04-04 14:57:47 -04:00
Beverly Nguyen
c43174be78 Merge pull request #2484 from GSA/corrupt_csv
fix blank lines at end of csv
2025-04-04 11:34:09 -07:00
Beverly Nguyen
7f3e368427 updating asset folder 2025-04-04 11:29:53 -07:00
Beverly Nguyen
caed2ad5d6 updating asset folder 2025-04-04 11:27:20 -07:00
Beverly Nguyen
d5798bb818 Merge pull request #2480 from GSA/2475-target-blank-error 2025-04-04 11:05:11 -07:00
Kenneth Kehl
0cf9abf5e8 add test 2025-04-04 09:35:01 -07:00
Kenneth Kehl
0bdf0cb073 fix blank lines at end of csv 2025-04-04 09:13:46 -07:00
Jonathan Bobel
db37a4de94 Updating all links with a target="_blank" 2025-04-03 11:57:21 -04:00
Jonathan Bobel
50df9c79a2 2475 - Update target="_blank" links 2025-04-03 10:37:50 -04:00
ccostino
82934daa02 Merge pull request #2469 from GSA/2262-add-copy-to-invite-a-team-member-page
Added additional copy
2025-04-01 12:58:14 -04:00
Alex Janousek
1c2c9fd57a Merge pull request #2466 from GSA/dependabot/pip/pytz-2025.2
Bump pytz from 2024.2 to 2025.2
2025-04-01 12:47:25 -04:00
dependabot[bot]
417356bc28 Bump pytz from 2024.2 to 2025.2
Bumps [pytz](https://github.com/stub42/pytz) from 2024.2 to 2025.2.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2024.2...release_2025.2)

---
updated-dependencies:
- dependency-name: pytz
  dependency-version: '2025.2'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 15:48:31 +00:00
Kenneth Kehl
f379e828de Merge pull request #2442 from GSA/mistune
Mistune
2025-04-01 08:46:38 -07:00
Kenneth Kehl
7a29252081 merge from main 2025-04-01 08:26:40 -07:00
Kenneth Kehl
91f3e6a557 fix static scan warnings 2025-04-01 08:00:33 -07:00
alexjanousekGSA
273232df40 Added additional copy 2025-04-01 09:42:23 -04:00
Alex Janousek
c1e1e34a17 Merge pull request #2467 from GSA/dependabot/pip/werkzeug-3.1.3
Bump werkzeug from 3.0.6 to 3.1.3
2025-04-01 09:24:29 -04:00
Alex Janousek
7e4947389c Merge pull request #2464 from GSA/dependabot/npm_and_yarn/sass-embedded-1.86.1
Bump sass-embedded from 1.86.0 to 1.86.1
2025-04-01 09:23:27 -04:00
dependabot[bot]
bf9537ccd4 Bump werkzeug from 3.0.6 to 3.1.3
Bumps [werkzeug](https://github.com/pallets/werkzeug) from 3.0.6 to 3.1.3.
- [Release notes](https://github.com/pallets/werkzeug/releases)
- [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/werkzeug/compare/3.0.6...3.1.3)

---
updated-dependencies:
- dependency-name: werkzeug
  dependency-version: 3.1.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 10:40:45 +00:00
Alex Janousek
4225470b1e Merge pull request #2468 from GSA/dependabot/pip/isort-6.0.1
Bump isort from 5.13.2 to 6.0.1
2025-04-01 06:38:48 -04:00
Alex Janousek
c49d998f9e Merge pull request #2463 from GSA/dependabot/npm_and_yarn/rollup-4.38.0
Bump rollup from 4.37.0 to 4.38.0
2025-04-01 06:38:36 -04:00
dependabot[bot]
c9d9c7a3a6 Bump isort from 5.13.2 to 6.0.1
Bumps [isort](https://github.com/PyCQA/isort) from 5.13.2 to 6.0.1.
- [Release notes](https://github.com/PyCQA/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PyCQA/isort/compare/5.13.2...6.0.1)

---
updated-dependencies:
- dependency-name: isort
  dependency-version: 6.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 00:29:05 +00:00
dependabot[bot]
35a2d940a0 Bump sass-embedded from 1.86.0 to 1.86.1
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.86.0 to 1.86.1.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.86.0...1.86.1)

---
updated-dependencies:
- dependency-name: sass-embedded
  dependency-version: 1.86.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 00:11:45 +00:00
dependabot[bot]
e1c6d41f78 Bump rollup from 4.37.0 to 4.38.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.37.0 to 4.38.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.37.0...v4.38.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 00:04:41 +00:00
Kenneth Kehl
e419d843a6 merge from main 2025-03-31 09:24:10 -07:00
Beverly Nguyen
c01a6a84f3 Merge pull request #2461 from GSA/update-backstop-screenshots
Update backstop files
2025-03-31 09:13:23 -07:00
Kenneth Kehl
7cd8be22f6 fix 2025-03-31 08:45:33 -07:00
alexjanousekGSA
f9dd331421 Update backstop files 2025-03-31 10:02:27 -04:00
Alex Janousek
78b30e3d76 Merge pull request #2458 from GSA/dependabot/pip/pre-commit-4.2.0
Bump pre-commit from 4.1.0 to 4.2.0
2025-03-31 09:45:06 -04:00
dependabot[bot]
bd4e1d751a Bump pre-commit from 4.1.0 to 4.2.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v4.1.0...v4.2.0)

---
updated-dependencies:
- dependency-name: pre-commit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-31 13:28:04 +00:00
Alex Janousek
f71b03a45c Merge pull request #2460 from GSA/dependabot/pip/notifications-python-client-10.0.1
Bump notifications-python-client from 10.0.0 to 10.0.1
2025-03-31 09:26:09 -04:00
dependabot[bot]
f1ccbe6f52 Bump notifications-python-client from 10.0.0 to 10.0.1
Bumps [notifications-python-client](https://github.com/alphagov/notifications-python-client) from 10.0.0 to 10.0.1.
- [Changelog](https://github.com/alphagov/notifications-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/alphagov/notifications-python-client/compare/10.0.0...10.0.1)

---
updated-dependencies:
- dependency-name: notifications-python-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-29 12:50:24 +00:00
Alex Janousek
bbe1e44366 Merge pull request #2457 from GSA/dependabot/npm_and_yarn/tar-fs-3.0.8
Bump tar-fs from 3.0.6 to 3.0.8
2025-03-29 08:48:34 -04:00
Alex Janousek
685deebae4 Merge pull request #2459 from GSA/dependabot/pip/click-8.1.8
Bump click from 8.1.7 to 8.1.8
2025-03-29 08:48:17 -04:00
dependabot[bot]
918016d4af Bump click from 8.1.7 to 8.1.8
Bumps [click](https://github.com/pallets/click) from 8.1.7 to 8.1.8.
- [Release notes](https://github.com/pallets/click/releases)
- [Changelog](https://github.com/pallets/click/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/click/compare/8.1.7...8.1.8)

---
updated-dependencies:
- dependency-name: click
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-29 12:24:29 +00:00
Alex Janousek
f87f0a1c9e Merge pull request #2454 from GSA/dependabot/pip/flake8-bugbear-24.12.12
Bump flake8-bugbear from 24.8.19 to 24.12.12
2025-03-29 08:22:37 -04:00
dependabot[bot]
869f76c846 Bump tar-fs from 3.0.6 to 3.0.8
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 3.0.6 to 3.0.8.
- [Commits](https://github.com/mafintosh/tar-fs/compare/v3.0.6...v3.0.8)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 22:19:50 +00:00
dependabot[bot]
3946e7bb3a Bump flake8-bugbear from 24.8.19 to 24.12.12
Bumps [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear) from 24.8.19 to 24.12.12.
- [Release notes](https://github.com/PyCQA/flake8-bugbear/releases)
- [Commits](https://github.com/PyCQA/flake8-bugbear/compare/24.8.19...24.12.12)

---
updated-dependencies:
- dependency-name: flake8-bugbear
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 19:06:58 +00:00
Alex Janousek
56ee7ec376 Merge pull request #2453 from GSA/dependabot/pip/pyexcel-io-0.6.7
Bump pyexcel-io from 0.6.6 to 0.6.7
2025-03-28 15:04:58 -04:00
dependabot[bot]
5dad9e8f0f Bump pyexcel-io from 0.6.6 to 0.6.7
Bumps [pyexcel-io](https://github.com/pyexcel/pyexcel-io) from 0.6.6 to 0.6.7.
- [Release notes](https://github.com/pyexcel/pyexcel-io/releases)
- [Changelog](https://github.com/pyexcel/pyexcel-io/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/pyexcel/pyexcel-io/compare/v0.6.6...v0.6.7)

---
updated-dependencies:
- dependency-name: pyexcel-io
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 18:03:48 +00:00
Alex Janousek
23c5d7aff1 Merge pull request #2455 from GSA/dependabot/pip/humanize-4.12.2
Bump humanize from 4.11.0 to 4.12.2
2025-03-28 14:01:57 -04:00
dependabot[bot]
d2dd249b61 Bump humanize from 4.11.0 to 4.12.2
Bumps [humanize](https://github.com/python-humanize/humanize) from 4.11.0 to 4.12.2.
- [Release notes](https://github.com/python-humanize/humanize/releases)
- [Commits](https://github.com/python-humanize/humanize/compare/4.11.0...4.12.2)

---
updated-dependencies:
- dependency-name: humanize
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 17:08:41 +00:00
Alex Janousek
3e410ba5b2 Merge pull request #2456 from GSA/dependabot/pip/python-dotenv-1.1.0
Bump python-dotenv from 1.0.1 to 1.1.0
2025-03-28 13:06:49 -04:00
ccostino
a1802a3439 Merge pull request #2451 from GSA/2450-missing-title-visibility
css update pill label to show visibility
2025-03-28 09:56:00 -04:00
dependabot[bot]
8897b30b81 Bump python-dotenv from 1.0.1 to 1.1.0
Bumps [python-dotenv](https://github.com/theskumar/python-dotenv) from 1.0.1 to 1.1.0.
- [Release notes](https://github.com/theskumar/python-dotenv/releases)
- [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/theskumar/python-dotenv/compare/v1.0.1...v1.1.0)

---
updated-dependencies:
- dependency-name: python-dotenv
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 00:00:36 +00:00
Kenneth Kehl
5741c572f0 some fixes 2025-03-27 14:47:43 -07:00
Beverly Nguyen
b0d8eda0f4 css update pill label 2025-03-27 14:41:45 -07:00
Beverly Nguyen
e007571ac8 Merge pull request #2427 from GSA/1134-change-brackets-to-parenthesis
1134 - Changing all instances of the word "brackets" to "parenthesis"
2025-03-27 13:34:49 -07:00
Kenneth Kehl
9e5475cd43 fix import 2025-03-27 12:58:05 -07:00
Kenneth Kehl
6eaa471a5c more 2025-03-27 12:53:10 -07:00
Alex Janousek
6e72bc7f5e Merge pull request #2446 from GSA/dependabot/pip/regex-2024.11.6
Bump regex from 2024.9.11 to 2024.11.6
2025-03-27 13:04:26 -04:00
dependabot[bot]
f4bc6d4531 Bump regex from 2024.9.11 to 2024.11.6
Bumps [regex](https://github.com/mrabarnett/mrab-regex) from 2024.9.11 to 2024.11.6.
- [Changelog](https://github.com/mrabarnett/mrab-regex/blob/hg/changelog.txt)
- [Commits](https://github.com/mrabarnett/mrab-regex/compare/2024.9.11...2024.11.6)

---
updated-dependencies:
- dependency-name: regex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-27 16:48:27 +00:00
Alex Janousek
a5200220e2 Merge pull request #2445 from GSA/dependabot/pip/black-25.1.0
Bump black from 24.10.0 to 25.1.0
2025-03-27 12:46:28 -04:00
dependabot[bot]
8f45eeb2cf Bump black from 24.10.0 to 25.1.0
Bumps [black](https://github.com/psf/black) from 24.10.0 to 25.1.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/24.10.0...25.1.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-27 14:01:27 +00:00
Alex Janousek
b134a68845 Merge pull request #2444 from GSA/dependabot/pip/flake8-pytest-style-2.1.0
Bump flake8-pytest-style from 2.0.0 to 2.1.0
2025-03-27 09:59:44 -04:00
Alex Janousek
4b910bec88 Merge pull request #2443 from GSA/dependabot/pip/moto-5.1.1
Bump moto from 5.0.22 to 5.1.1
2025-03-27 09:59:32 -04:00
dependabot[bot]
238a281512 Bump flake8-pytest-style from 2.0.0 to 2.1.0
Bumps [flake8-pytest-style](https://github.com/m-burst/flake8-pytest-style) from 2.0.0 to 2.1.0.
- [Commits](https://github.com/m-burst/flake8-pytest-style/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: flake8-pytest-style
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 23:50:21 +00:00
dependabot[bot]
cafd7d75b7 Bump moto from 5.0.22 to 5.1.1
Bumps [moto](https://github.com/getmoto/moto) from 5.0.22 to 5.1.1.
- [Release notes](https://github.com/getmoto/moto/releases)
- [Changelog](https://github.com/getmoto/moto/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getmoto/moto/compare/5.0.22...5.1.1)

---
updated-dependencies:
- dependency-name: moto
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 23:50:01 +00:00
Kenneth Kehl
d92e2a7c04 more 2025-03-26 14:21:45 -07:00
Kenneth Kehl
94b791c869 more 2025-03-26 13:34:23 -07:00
Kenneth Kehl
0108bcf91f upgrade mistune to 3.1.3 2025-03-26 09:16:07 -07:00
Alex Janousek
7458acdab1 Merge pull request #2437 from GSA/dependabot/pip/charset-normalizer-3.4.1
Bump charset-normalizer from 3.4.0 to 3.4.1
2025-03-26 11:00:43 -04:00
dependabot[bot]
c7e3d777ac Bump charset-normalizer from 3.4.0 to 3.4.1
Bumps [charset-normalizer](https://github.com/jawah/charset_normalizer) from 3.4.0 to 3.4.1.
- [Release notes](https://github.com/jawah/charset_normalizer/releases)
- [Changelog](https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jawah/charset_normalizer/compare/3.4.0...3.4.1)

---
updated-dependencies:
- dependency-name: charset-normalizer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 14:45:59 +00:00
Alex Janousek
ec45db1ea4 Merge pull request #2438 from GSA/dependabot/pip/boto3-1.35.99
Bump boto3 from 1.35.51 to 1.35.99
2025-03-26 10:44:10 -04:00
dependabot[bot]
9bed7d4253 Bump boto3 from 1.35.51 to 1.35.99
Bumps [boto3](https://github.com/boto/boto3) from 1.35.51 to 1.35.99.
- [Release notes](https://github.com/boto/boto3/releases)
- [Commits](https://github.com/boto/boto3/compare/1.35.51...1.35.99)

---
updated-dependencies:
- dependency-name: boto3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 14:19:42 +00:00
Alex Janousek
8c56a75af7 Merge pull request #2439 from GSA/dependabot/pip/beautifulsoup4-4.13.3
Bump beautifulsoup4 from 4.12.3 to 4.13.3
2025-03-26 10:17:45 -04:00
dependabot[bot]
d9eebb4f64 Bump beautifulsoup4 from 4.12.3 to 4.13.3
Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.12.3 to 4.13.3.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 13:54:18 +00:00
Alex Janousek
6546acf434 Merge pull request #2433 from GSA/dependabot/pip/pyexcel-xls-0.7.1
Bump pyexcel-xls from 0.7.0 to 0.7.1
2025-03-26 09:52:21 -04:00
Jonathan Bobel
bd77775286 Merge pull request #2411 from GSA/2410-bug-radio-buttons-cannot-be-selected
revert change back to params.for in order for user to select radio op…
2025-03-25 15:04:01 -04:00
dependabot[bot]
132ced0042 Bump pyexcel-xls from 0.7.0 to 0.7.1
Bumps [pyexcel-xls](https://github.com/pyexcel/pyexcel-xls) from 0.7.0 to 0.7.1.
- [Release notes](https://github.com/pyexcel/pyexcel-xls/releases)
- [Changelog](https://github.com/pyexcel/pyexcel-xls/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/pyexcel/pyexcel-xls/compare/v0.7.0...v0.7.1)

---
updated-dependencies:
- dependency-name: pyexcel-xls
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 18:52:49 +00:00
Alex Janousek
7922004f9a Merge pull request #2434 from GSA/dependabot/pip/cachetools-5.5.2
Bump cachetools from 5.5.0 to 5.5.2
2025-03-25 14:50:50 -04:00
dependabot[bot]
3a38ea2db6 Bump cachetools from 5.5.0 to 5.5.2
Bumps [cachetools](https://github.com/tkem/cachetools) from 5.5.0 to 5.5.2.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v5.5.0...v5.5.2)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 16:03:48 +00:00
Alex Janousek
3af8f782ec Merge pull request #2435 from GSA/dependabot/pip/pyexcel-0.7.2
Bump pyexcel from 0.7.0 to 0.7.2
2025-03-25 12:01:54 -04:00
dependabot[bot]
cbb1288345 Bump pyexcel from 0.7.0 to 0.7.2
Bumps [pyexcel](https://github.com/pyexcel/pyexcel) from 0.7.0 to 0.7.2.
- [Release notes](https://github.com/pyexcel/pyexcel/releases)
- [Changelog](https://github.com/pyexcel/pyexcel/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/pyexcel/pyexcel/compare/v0.7.0...v0.7.2)

---
updated-dependencies:
- dependency-name: pyexcel
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 13:51:05 +00:00
Alex Janousek
96c033cd6f Merge pull request #2432 from GSA/dependabot/pip/certifi-2025.1.31
Bump certifi from 2024.8.30 to 2025.1.31
2025-03-25 09:49:09 -04:00
Alex Janousek
5d43ec2bb6 Merge pull request #2431 from GSA/dependabot/npm_and_yarn/rollup-4.37.0
Bump rollup from 4.36.0 to 4.37.0
2025-03-25 09:48:58 -04:00
dependabot[bot]
fff5caee1f Bump certifi from 2024.8.30 to 2025.1.31
Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.8.30 to 2025.1.31.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.08.30...2025.01.31)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 01:14:54 +00:00
dependabot[bot]
6cfb15106e Bump rollup from 4.36.0 to 4.37.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.36.0 to 4.37.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.36.0...v4.37.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 00:56:17 +00:00
Beverly Nguyen
5507891d8f Merge branch 'main' into 2410-bug-radio-buttons-cannot-be-selected 2025-03-24 12:49:04 -07:00
Beverly Nguyen
1a5f255539 jest fix 2025-03-24 12:48:28 -07:00
Beverly Nguyen
7e2a2bad8e update validation code 2025-03-24 12:33:01 -07:00
Alex Janousek
5c7a8913b0 Merge pull request #2316 from GSA/dependabot/pip/pytest-playwright-0.7.0
Bump pytest-playwright from 0.5.2 to 0.7.0
2025-03-24 12:28:40 -04:00
alexjanousekGSA
52a11945a1 Merge branch 'main' into dependabot/pip/pytest-playwright-0.7.0 2025-03-24 12:18:44 -04:00
Alex Janousek
79ea3a3ac9 Merge pull request #2429 from GSA/dependabot/pip/coverage-7.7.1
Bump coverage from 7.6.4 to 7.7.1
2025-03-24 12:16:31 -04:00
dependabot[bot]
88ff982c0d Bump coverage from 7.6.4 to 7.7.1
Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.6.4 to 7.7.1.
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](https://github.com/nedbat/coveragepy/compare/7.6.4...7.7.1)

---
updated-dependencies:
- dependency-name: coverage
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-24 13:28:07 +00:00
ccostino
77c97eeb0b Merge pull request #2423 from GSA/dependabot/pip/numpy-2.2.4
Bump numpy from 2.2.3 to 2.2.4
2025-03-24 09:22:00 -04:00
dependabot[bot]
5d4394bfda Bump numpy from 2.2.3 to 2.2.4
Bumps [numpy](https://github.com/numpy/numpy) from 2.2.3 to 2.2.4.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v2.2.3...v2.2.4)

---
updated-dependencies:
- dependency-name: numpy
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-22 14:29:50 +00:00
Alex Janousek
7485162411 Merge pull request #2430 from GSA/dependabot/pip/gunicorn-23.0.0
Bump gunicorn from 22.0.0 to 23.0.0
2025-03-22 10:27:58 -04:00
dependabot[bot]
d16c0c5153 Bump gunicorn from 22.0.0 to 23.0.0
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 22.0.0 to 23.0.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/22.0.0...23.0.0)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-22 14:07:53 +00:00
Alex Janousek
5144b90f22 Merge branch 'main' into dependabot/pip/pytest-playwright-0.7.0 2025-03-22 10:06:47 -04:00
Alex Janousek
418a868e18 Merge pull request #2422 from GSA/dependabot/pip/redis-5.2.1
Bump redis from 5.2.0 to 5.2.1
2025-03-22 10:05:57 -04:00
Beverly Nguyen
3a38b8bf31 fixed validation for radio and text input fields 2025-03-21 18:53:49 -07:00
Beverly Nguyen
04f4f2e990 Merge pull request #2428 from GSA/remove-about-feature-flag 2025-03-20 16:14:16 -07:00
alexjanousekGSA
9efe503353 Fixed linting issue 2025-03-20 14:32:44 -04:00
Jonathan Bobel
012dc4fae6 Merge pull request #2425 from GSA/2255-CSV-content-update
2255 - Content update for CSV upload area
2025-03-20 14:29:19 -04:00
alexjanousekGSA
35f3203e9c Removed feature flag 2025-03-20 14:22:41 -04:00
ccostino
cb4cfeb610 Merge pull request #2409 from GSA/2400-styling-on-the-template-page-is-off
fix styling issue
2025-03-20 13:37:18 -04:00
Jonathan Bobel
15103c99b5 Merge pull request #2403 from GSA/2298-bug-able-to-keep-pressing-send-and-send-more-and-more-while-processing
Prevent duplicate form submissions
2025-03-20 13:06:51 -04:00
Jonathan Bobel
6dd8b3cfe0 Update validators.py 2025-03-20 10:45:33 -04:00
Jonathan Bobel
fe098eca22 1134 - Changing all instances of the word "brackets" to "parenthesis" 2025-03-20 10:29:29 -04:00
Jonathan Bobel
0ca31c1ed1 Update send.html
Removed role attribute
2025-03-20 10:21:03 -04:00
Beverly Nguyen
78ee70b0c1 Merge branch 'main' into 2410-bug-radio-buttons-cannot-be-selected 2025-03-19 14:04:56 -07:00
Beverly Nguyen
71b7c745db Merge branch 'main' into 2400-styling-on-the-template-page-is-off 2025-03-19 14:02:57 -07:00
Beverly Nguyen
da194d358c removing comments 2025-03-19 13:13:29 -07:00
dependabot[bot]
a539fcbef6 Bump redis from 5.2.0 to 5.2.1
Bumps [redis](https://github.com/redis/redis-py) from 5.2.0 to 5.2.1.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v5.2.0...v5.2.1)

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-19 20:07:25 +00:00
Beverly Nguyen
a5ddf8038b Merge pull request #2412 from GSA/2042-no-emojis-special-characters-plain-language
2042 no emojis special characters plain language
2025-03-19 13:05:32 -07:00
Jonathan Bobel
06d0581bc9 Update send.html 2025-03-19 15:54:55 -04:00
Jonathan Bobel
937aa5af15 Update templates.py 2025-03-19 14:35:22 -04:00
Jonathan Bobel
b5203f473a Adding the personalization message back in 2025-03-19 11:30:01 -04:00
ccostino
dc03a3f0d1 Merge pull request #2418 from GSA/feat/text-by-user-update
Updated FE to allow stats by user
2025-03-19 11:13:14 -04:00
Jonathan Bobel
7afdf7336a Update test_templates.py 2025-03-19 10:26:49 -04:00
Jonathan Bobel
bab13de934 Update test_validators.py
Fixing a test
2025-03-18 16:42:15 -04:00
Jonathan Bobel
c05beb42f2 Update templates.py 2025-03-18 16:28:30 -04:00
Jonathan Bobel
2049fd5c76 Fixing formatting errors 2025-03-18 16:07:58 -04:00
Jonathan Bobel
1d911c4d44 Updates to text area validation on template edit page 2025-03-18 15:55:01 -04:00
Jonathan Bobel
bc83fab764 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2042-no-emojis-special-characters-plain-language 2025-03-18 15:52:40 -04:00
Andrew Shumway
051114157d Merge pull request #2395 from GSA/dependabot/pip/newrelic-10.7.0
Bump newrelic from 10.6.0 to 10.7.0
2025-03-18 12:40:45 -06:00
Andrew Shumway
cac7d1452a Merge pull request #2396 from GSA/dependabot/pip/cryptography-44.0.2
Bump cryptography from 44.0.1 to 44.0.2
2025-03-18 12:35:37 -06:00
ecayer
f9ea913b00 Merge pull request #2419 from GSA/update_cert
add comment to force redeploy
2025-03-18 10:28:33 -07:00
Kenneth Kehl
9a8a80ab14 add comment 2025-03-18 10:19:02 -07:00
dependabot[bot]
707768d749 Bump newrelic from 10.6.0 to 10.7.0
Bumps [newrelic](https://github.com/newrelic/newrelic-python-agent) from 10.6.0 to 10.7.0.
- [Release notes](https://github.com/newrelic/newrelic-python-agent/releases)
- [Commits](https://github.com/newrelic/newrelic-python-agent/compare/v10.6.0...v10.7.0)

---
updated-dependencies:
- dependency-name: newrelic
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 16:54:44 +00:00
dependabot[bot]
d05bf1e9e0 Bump cryptography from 44.0.1 to 44.0.2
Bumps [cryptography](https://github.com/pyca/cryptography) from 44.0.1 to 44.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/44.0.1...44.0.2)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 16:54:41 +00:00
Andrew Shumway
da081679c1 Merge pull request #2394 from GSA/dependabot/pip/flake8-7.1.2
Bump flake8 from 7.1.1 to 7.1.2
2025-03-18 10:52:49 -06:00
alexjanousekGSA
61c37687a2 Merge branch 'main' into feat/text-by-user-update 2025-03-18 11:21:25 -04:00
Alex Janousek
8bc6df5d35 Merge pull request #2392 from GSA/dependabot/npm_and_yarn/babel/core-7.26.10
Bump @babel/core from 7.26.9 to 7.26.10
2025-03-18 11:14:50 -04:00
Alex Janousek
e84e3efed3 Merge pull request #2393 from GSA/dependabot/npm_and_yarn/rollup/plugin-node-resolve-16.0.1
Bump @rollup/plugin-node-resolve from 16.0.0 to 16.0.1
2025-03-18 11:14:35 -04:00
Alex Janousek
fdceb3cbdb Merge pull request #2414 from GSA/dependabot/npm_and_yarn/rollup-4.36.0
Bump rollup from 4.35.0 to 4.36.0
2025-03-18 11:14:05 -04:00
Alex Janousek
26c695c21e Merge pull request #2415 from GSA/dependabot/npm_and_yarn/playwright-1.51.1
Bump playwright from 1.51.0 to 1.51.1
2025-03-18 11:13:52 -04:00
Alex Janousek
b4907fd2fb Merge pull request #2416 from GSA/dependabot/npm_and_yarn/sass-embedded-1.86.0
Bump sass-embedded from 1.85.1 to 1.86.0
2025-03-18 11:13:40 -04:00
alexjanousekGSA
f13ab20e93 Updated FE to allow stats by user 2025-03-18 11:09:09 -04:00
dependabot[bot]
9404a09dfa Bump sass-embedded from 1.85.1 to 1.86.0
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.85.1 to 1.86.0.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.85.1...1.86.0)

---
updated-dependencies:
- dependency-name: sass-embedded
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 00:08:10 +00:00
dependabot[bot]
fda16b7ce9 Bump playwright from 1.51.0 to 1.51.1
Bumps [playwright](https://github.com/microsoft/playwright) from 1.51.0 to 1.51.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.51.0...v1.51.1)

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 00:06:13 +00:00
dependabot[bot]
3ae05a37c9 Bump rollup from 4.35.0 to 4.36.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.35.0 to 4.36.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.35.0...v4.36.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 00:05:26 +00:00
ccostino
0df8b37646 Merge pull request #2413 from GSA/ugh_fix
ugh
2025-03-17 19:38:05 -04:00
Kenneth Kehl
cb334c0dcd ugh 2025-03-17 16:28:46 -07:00
Beverly Nguyen
1cd51a8257 remove comment 2025-03-17 16:04:09 -07:00
Beverly Nguyen
3b8fdd8122 remove comment 2025-03-17 15:46:25 -07:00
Jonathan Bobel
43c0d6244a Addressing a test 2025-03-17 16:49:30 -04:00
Jonathan Bobel
fbf0fb1f0d 2042 - Updates to the error message regarding special characters 2025-03-17 16:47:45 -04:00
Beverly Nguyen
965db9cd7e revert change back to params.for in order for user to select radio option 2025-03-17 13:45:19 -07:00
Beverly Nguyen
3555db1163 fix styling issue 2025-03-17 12:12:06 -07:00
ccostino
f820ae86f3 Merge pull request #2408 from GSA/ugh_fix
initial
2025-03-17 15:07:52 -04:00
Kenneth Kehl
47657d45ed initial 2025-03-17 09:57:15 -07:00
Beverly Nguyen
fab1ef6d45 jest 2025-03-14 13:56:48 -07:00
Beverly Nguyen
10fb9f9b35 jest 2025-03-14 13:54:20 -07:00
Beverly Nguyen
02a188a080 fixed e2e 2025-03-14 13:47:02 -07:00
Beverly Nguyen
9facde2c60 Merge pull request #2397 from GSA/2391-youtube-video-not-playing
2391 - Updating Cross Origin code to allow Youtube
2025-03-14 12:53:59 -07:00
ccostino
592ea83ea2 Merge pull request #2406 from GSA/content-updates
update banner color
2025-03-14 14:21:53 -04:00
Beverly Nguyen
dd0d5d3b33 update banner color 2025-03-14 11:11:42 -07:00
Beverly Nguyen
29373d41ca Merge branch 'main' into 2298-bug-able-to-keep-pressing-send-and-send-more-and-more-while-processing 2025-03-14 11:05:32 -07:00
Beverly Nguyen
55225018b6 remove comments 2025-03-14 09:28:59 -07:00
Jonathan Bobel
5a1b656d7e Update notifications_utils/request_helper.py
Co-authored-by: ccostino <ccostino@users.noreply.github.com>
2025-03-14 12:13:52 -04:00
ccostino
46e43b6fbd Merge pull request #2399 from GSA/2398-broken-tts-link
2398 - broken TTS link
2025-03-14 11:40:51 -04:00
ccostino
542ce8ec00 Merge pull request #2404 from GSA/content-updates
content updates
2025-03-14 10:56:44 -04:00
Beverly Nguyen
371fbb2cd4 fixed test and e2e 2025-03-13 21:49:40 -07:00
Beverly Nguyen
41dcedd48f update to nav 2025-03-13 15:54:14 -07:00
Beverly Nguyen
d64d84ff4a flake8 2025-03-13 15:51:24 -07:00
Beverly Nguyen
558753037f content updates 2025-03-13 15:43:21 -07:00
Beverly Nguyen
821265cf6e preventing users from double click on submit 2025-03-13 15:04:12 -07:00
Jonathan Bobel
236fafd597 Update request_helper.py 2025-03-13 14:26:45 -04:00
Jonathan Bobel
22d643acb1 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2391-youtube-video-not-playing 2025-03-13 14:24:13 -04:00
Jonathan Bobel
9e8aec4c5d 2398 - broken TTS link
Updating TTS link, maybe the link used to go to a page that was removed
2025-03-12 15:37:51 -04:00
Jonathan Bobel
21408543d4 Update request_helper.py
Adjusting cross-origin checks to allow Youtube
2025-03-12 12:52:32 -04:00
dependabot[bot]
aff028b24c Bump flake8 from 7.1.1 to 7.1.2
Bumps [flake8](https://github.com/pycqa/flake8) from 7.1.1 to 7.1.2.
- [Commits](https://github.com/pycqa/flake8/compare/7.1.1...7.1.2)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-12 00:02:15 +00:00
dependabot[bot]
a652c5f321 Bump @rollup/plugin-node-resolve from 16.0.0 to 16.0.1
Bumps [@rollup/plugin-node-resolve](https://github.com/rollup/plugins/tree/HEAD/packages/node-resolve) from 16.0.0 to 16.0.1.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/node-resolve/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/node-resolve-v16.0.1/packages/node-resolve)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-node-resolve"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-11 23:18:00 +00:00
dependabot[bot]
06814cd0a5 Bump @babel/core from 7.26.9 to 7.26.10
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.26.9 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-11 23:17:51 +00:00
dependabot[bot]
adf37eb4d0 Bump pytest-playwright from 0.5.2 to 0.7.0
Bumps [pytest-playwright](https://github.com/microsoft/playwright-pytest) from 0.5.2 to 0.7.0.
- [Release notes](https://github.com/microsoft/playwright-pytest/releases)
- [Commits](https://github.com/microsoft/playwright-pytest/compare/v0.5.2...v0.7.0)

---
updated-dependencies:
- dependency-name: pytest-playwright
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 14:32:40 +00:00
132 changed files with 2567 additions and 2603 deletions

View File

@@ -127,16 +127,6 @@
}
],
"results": {
".github/workflows/checks.yml": [
{
"type": "Secret Keyword",
"filename": ".github/workflows/checks.yml",
"hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
"is_verified": false,
"line_number": 68,
"is_secret": false
}
],
"app/assets/js/uswds.min.js": [
{
"type": "Secret Keyword",
@@ -161,7 +151,7 @@
"filename": "app/config.py",
"hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc",
"is_verified": false,
"line_number": 120,
"line_number": 118,
"is_secret": false
}
],
@@ -684,5 +674,5 @@
}
]
},
"generated_at": "2025-02-26T18:19:37Z"
"generated_at": "2025-03-20T18:22:36Z"
}

View File

@@ -51,73 +51,75 @@ jobs:
- name: Check coverage threshold
run: poetry run coverage report --fail-under=90
end-to-end-tests:
if: ${{ github.actor != 'dependabot[bot]' }}
# TODO FIX THIS!
# end-to-end-tests:
# if: ${{ github.actor != 'dependabot[bot]' }}
permissions:
checks: write
pull-requests: write
contents: write
runs-on: ubuntu-latest
environment: staging
services:
postgres:
image: postgres
env:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: test_notification_api
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
redis:
image: redis
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 6379 on service container to the host
- 6379:6379
# permissions:
# checks: write
# pull-requests: write
# contents: write
# runs-on: ubuntu-latest
# environment: staging
# services:
# postgres:
# image: postgres
# env:
# POSTGRES_USER: user
# POSTGRES_PASSWORD: password
# POSTGRES_DB: test_notification_api
# options: >-
# --health-cmd pg_isready
# --health-interval 10s
# --health-timeout 5s
# --health-retries 5
# ports:
# # Maps tcp port 5432 on service container to the host
# - 5432:5432
# redis:
# image: redis
# options: >-
# --health-cmd "redis-cli ping"
# --health-interval 10s
# --health-timeout 5s
# --health-retries 5
# ports:
# # Maps tcp port 6379 on service container to the host
# - 6379:6379
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-project
- uses: jwalton/gh-find-current-pr@v1
id: findPr
- name: Check API Server availability
run: |
curl --fail -v https://notify-api-staging.app.cloud.gov || exit 1
- name: Run Admin server
# If we want to log stuff and see what's broken,
# insert this line:
# tail -f admin-server.log &
# above make e2e-test
# steps:
# - uses: actions/checkout@v4
# - uses: ./.github/actions/setup-project
# - uses: jwalton/gh-find-current-pr@v1
# id: findPr
# - name: Check API Server availability
# run: |
# curl --fail -v https://notify-api-staging.app.cloud.gov || exit 1
# - name: Run Admin server
# # If we want to log stuff and see what's broken,
# # insert this line:
# # tail -f admin-server.log &
# # above make e2e-test
run: |
make run-flask > admin-server.log 2>&1 &
tail -f admin-server.log &
make e2e-test
# run: |
# make run-flask > admin-server.log 2>&1 &
# tail -f admin-server.log &
# make e2e-test
# env:
# API_HOST_NAME: https://notify-api-staging.app.cloud.gov/
# SECRET_KEY: ${{ secrets.SECRET_KEY }}
# DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
# ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
# ADMIN_CLIENT_USERNAME: notify-admin
# NOTIFY_ENVIRONMENT: e2etest
# NOTIFY_E2E_AUTH_STATE_PATH: ${{ secrets.NOTIFY_E2E_AUTH_STATE_PATH }}
# NOTIFY_E2E_TEST_EMAIL: ${{ secrets.NOTIFY_E2E_TEST_EMAIL }}
# NOTIFY_E2E_TEST_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_PASSWORD }}
# NOTIFY_E2E_TEST_URI: http://localhost:6012/
# VCAP_SERVICES: ${{ secrets.VCAP_SERVICES }}
env:
API_HOST_NAME: https://notify-api-staging.app.cloud.gov/
SECRET_KEY: ${{ secrets.SECRET_KEY }}
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
ADMIN_CLIENT_USERNAME: notify-admin
NOTIFY_ENVIRONMENT: e2etest
NOTIFY_E2E_AUTH_STATE_PATH: ${{ secrets.NOTIFY_E2E_AUTH_STATE_PATH }}
NOTIFY_E2E_TEST_EMAIL: ${{ secrets.NOTIFY_E2E_TEST_EMAIL }}
NOTIFY_E2E_TEST_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_PASSWORD }}
NOTIFY_E2E_TEST_URI: http://localhost:6012/
VCAP_SERVICES: ${{ secrets.VCAP_SERVICES }}
validate-new-relic-config:
runs-on: ubuntu-latest
environment: staging
@@ -165,7 +167,6 @@ jobs:
run: make run-flask &
env:
NOTIFY_ENVIRONMENT: scanning
FEATURE_ABOUT_PAGE_ENABLED: true
- name: Run OWASP Baseline Scan
uses: zaproxy/action-baseline@v0.14.0
with:

View File

@@ -24,23 +24,13 @@ jobs:
terraform_version: "^1.7.5"
terraform_wrapper: false
- name: Check for changes to Terraform
id: changed-terraform-files
uses: tj-actions/changed-files@v45
with:
files: |
terraform/demo/**
terraform/shared/**
.github/workflows/deploy-demo.yml
- name: Terraform init
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/demo
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
run: terraform init
- name: Terraform apply
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/demo
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
@@ -99,16 +89,7 @@ jobs:
--var LOGIN_PEM="$LOGIN_PEM"
--strategy rolling
- name: Check for changes to egress config
id: changed-egress-config
uses: tj-actions/changed-files@v45
with:
files: |
deploy-config/egress_proxy/notify-admin-demo.*.acl
.github/actions/deploy-proxy/action.yml
.github/workflows/deploy-demo.yml
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}

View File

@@ -24,23 +24,13 @@ jobs:
terraform_version: "^1.7.5"
terraform_wrapper: false
- name: Check for changes to Terraform
id: changed-terraform-files
uses: tj-actions/changed-files@v45
with:
files: |
terraform/production/**
terraform/shared/**
.github/workflows/deploy-prod.yml
- name: Terraform init
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/production
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
run: terraform init
- name: Terraform apply
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/production
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
@@ -99,16 +89,7 @@ jobs:
--var LOGIN_PEM="$LOGIN_PEM"
--strategy rolling
- name: Check for changes to egress config
id: changed-egress-config
uses: tj-actions/changed-files@v45
with:
files: |
deploy-config/egress_proxy/notify-admin-production.*.acl
.github/actions/deploy-proxy/action.yml
.github/workflows/deploy-prod.yml
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}

View File

@@ -29,23 +29,13 @@ jobs:
terraform_version: "^1.7.5"
terraform_wrapper: false
- name: Check for changes to Terraform
id: changed-terraform-files
uses: tj-actions/changed-files@v45
with:
files: |
terraform/staging/**
terraform/shared/**
.github/workflows/deploy.yml
- name: Terraform init
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/staging
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
run: terraform init
- name: Terraform apply
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/staging
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
@@ -106,16 +96,7 @@ jobs:
--strategy rolling
- name: Check for changes to egress config
id: changed-egress-config
uses: tj-actions/changed-files@v45
with:
files: |
deploy-config/egress_proxy/notify-admin-staging.*.acl
.github/actions/deploy-proxy/action.yml
.github/workflows/deploy.yml
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}

4
.gitignore vendored
View File

@@ -14,6 +14,10 @@
*.XLSX
## Non user files allowed to be commited
!app/assets/pdf/best-practices-for-texting-the-public.pdf
!app/assets/pdf/investing-in-notifications-tts-public-benefits-studio-decision-memo.pdf
!app/assets/pdf/best-practices-section-outline.pdf
!app/assets/pdf/standing-up-your-own-notify.pdf
!app/assets/pdf/tcpa_overview.pdf
!app/assets/pdf/investing-notifications-tts-public-benefits-memo.pdf
!app/assets/pdf/out-of-pilot-announcement.pdf

View File

@@ -8,6 +8,7 @@ repos:
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
exclude: ^app/assets/pdf/.*\.pdf$
- id: debug-statements
- id: check-merge-conflict
- id: check-toml

View File

@@ -169,14 +169,15 @@ def _csp(config):
def create_app(application):
@application.context_processor
def inject_feature_flags():
feature_about_page_enabled = application.config.get(
"FEATURE_ABOUT_PAGE_ENABLED", False
)
return dict(
FEATURE_ABOUT_PAGE_ENABLED=feature_about_page_enabled,
)
# @application.context_processor
# def inject_feature_flags():
# this is where feature flags can be easily added as a dictionary within context
# feature_about_page_enabled = application.config.get(
# "FEATURE_ABOUT_PAGE_ENABLED", False
# )
# return dict(
# FEATURE_ABOUT_PAGE_ENABLED=feature_about_page_enabled,
# )
@application.context_processor
def inject_initial_signin_url():
@@ -682,4 +683,4 @@ def slugify(text):
"""
Converts text to lowercase, replaces spaces with hyphens, and removes invalid characters.
"""
return re.sub(r'[^a-z0-9-]', '', re.sub(r'\s+', '-', text.lower()))
return re.sub(r"[^a-z0-9-]", "", re.sub(r"\s+", "-", text.lower()))

View File

@@ -220,7 +220,7 @@
var url = type === 'service'
? `/services/${currentServiceId}/daily-stats.json?timezone=${encodeURIComponent(userTimezone)}`
: `/services/${currentServiceId}/daily-stats-by-user.json`;
: `/services/${currentServiceId}/daily-stats-by-user.json?timezone=${encodeURIComponent(userTimezone)}`;
return fetch(url)

View File

@@ -1,29 +0,0 @@
(function(Modules) {
"use strict";
let isSixDigitHex = value => value.match(/^#[0-9A-F]{6}$/i);
let colourOrWhite = value => isSixDigitHex(value) ? value : '#FFFFFF';
Modules.ColourPreview = function() {
this.start = component => {
this.$input = $(component);
this.$input.closest('.usa-form-group').append(
this.$preview = $('<span class="textbox-colour-preview"></span>')
);
this.$input
.on('input', this.update)
.trigger('input');
};
this.update = () => this.$preview.css(
'background', colourOrWhite(this.$input.val())
);
};
})(window.GOVUK.Modules);

View File

@@ -1,24 +0,0 @@
(function(window) {
"use strict";
window.GOVUK.Modules.Homepage = function() {
this.start = function(component) {
let $component = $(component);
let iterations = 0;
let timeout = null;
$component.on('click', () => {
if (++iterations == 5) {
$component.toggleClass('product-page-intro-wrapper--alternative');
}
clearTimeout(timeout);
timeout = setTimeout(() => iterations = 0, 1500);
});
};
};
})(window);

View File

@@ -13,16 +13,23 @@
} else {
$submitButton.data('clicked', 'true');
setTimeout(renableSubmitButton($submitButton), 1500);
if ($submitButton.is('[name="Send"], [name="Schedule"]')) {
$submitButton.prop('disabled', true);
setTimeout(() => {
renableSubmitButton($submitButton);
}, 10000);
} else {
setTimeout(renableSubmitButton($submitButton), 1500);
}
}
};
let renableSubmitButton = $submitButton => () => {
$submitButton.data('clicked', '');
$submitButton.prop('disabled', false);
};
$('form').on('submit', disableSubmitButtons);

View File

@@ -7,13 +7,17 @@ function showError(input, errorElement, message) {
errorElement.textContent = message;
}, 10);
input.classList.add("usa-input--error");
if (input.type !== "radio" && input.type !== "checkbox") {
input.classList.add("usa-input--error");
}
input.setAttribute("aria-describedby", errorElement.id);
}
function hideError(input, errorElement) {
errorElement.style.display = "none";
input.classList.remove("usa-input--error");
if (input.type !== "radio" && input.type !== "checkbox") {
input.classList.remove("usa-input--error");
}
input.removeAttribute("aria-describedby");
}
@@ -24,16 +28,17 @@ function getFieldLabel(input) {
// Attach validation logic to forms
function attachValidation() {
const forms = document.querySelectorAll("form.send-one-off-form");
const forms = document.querySelectorAll('form[data-force-focus="True"]');
forms.forEach((form) => {
const inputs = form.querySelectorAll("input, textarea, select");
form.addEventListener("submit", function (event) {
let isValid = true;
let firstInvalidInput = null;
const validatedRadioNames = new Set();
inputs.forEach((input) => {
const errorId = input.id ? `${input.id}-error` : `${input.name}-error`;
const errorId = input.type === "radio" ? `${input.name}-error` : `${input.id}-error`;
let errorElement = document.getElementById(errorId);
if (!errorElement) {
@@ -41,16 +46,24 @@ function attachValidation() {
errorElement.id = errorId;
errorElement.classList.add("usa-error-message");
errorElement.setAttribute("aria-live", "polite");
input.insertAdjacentElement("afterend", errorElement);
errorElement.style.display = "none";
if (input.type === "radio") {
const group = form.querySelectorAll(`input[name="${input.name}"]`);
const lastRadio = group[group.length - 1];
lastRadio.parentElement.insertAdjacentElement("afterend", errorElement);
} else {
input.insertAdjacentElement("afterend", errorElement);
}
}
if (input.type === "radio") {
// Find all radio buttons with the same name
const radioGroup = document.querySelectorAll(`input[name="${input.name}"]`);
if (validatedRadioNames.has(input.name)) return;
validatedRadioNames.add(input.name);
const radioGroup = form.querySelectorAll(`input[name="${input.name}"]`);
const isChecked = Array.from(radioGroup).some(radio => radio.checked);
if (!isChecked) {
showError(input, errorElement, `Error: ${getFieldLabel(input)} must be selected.`);
showError(input, errorElement, `Error: A selection must be made.`);
isValid = false;
if (!firstInvalidInput) {
firstInvalidInput = input;
@@ -73,11 +86,20 @@ function attachValidation() {
inputs.forEach((input) => {
input.addEventListener("input", function () {
const errorElement = document.getElementById(`${input.id}-error`);
if (input.value.trim() !== "" && errorElement) {
const errorId = input.type === "radio" ? `${input.name}-error` : `${input.id}-error`;
const errorElement = document.getElementById(errorId);
if (errorElement && input.value.trim() !== "") {
hideError(input, errorElement);
}
});
if (input.type === "radio") {
input.addEventListener("change", function () {
const errorElement = document.getElementById(`${input.name}-error`);
if (errorElement) {
hideError(input, errorElement);
}
});
}
});
});
}

Binary file not shown.

Binary file not shown.

View File

@@ -139,11 +139,6 @@ td.table-empty-message {
font-family: family('sans');
}
.usa-dark-background .pill-item__label {
color: white;
text-decoration: none !important;
}
.pill-item.usa-link {
text-decoration: none !important;
}
@@ -198,9 +193,6 @@ td.table-empty-message {
word-wrap: break-word;
}
// border: 1px solid color('gray-cool-10');
// padding: units(2);
.tick-cross-list-permissions {
margin: units(1) 0;
padding-left: units(2);
@@ -257,6 +249,11 @@ td.table-empty-message {
}
}
.usa-checkbox.template-list-item.template-list-item-with-checkbox.template-list-item-without-ancestors {
display: flex;
flex-direction: column;
}
.usa-checkbox__label-description {
margin: units(2px) 0 units(1) units(4);
}
@@ -594,19 +591,31 @@ td.table-empty-message {
.big-number-smallest {
font-size: units(3);
}
.pill-item__label {
color: white;
}
&:not(.pill-item--selected):hover {
background: color('blue-warm-70v');
.pill-item__label {
color: white;
}
}
&.pill-item--selected:hover {
color: color('blue-60v');
&.pill-item--selected {
.pill-item__label {
color: color('blue-60v');
}
&:hover {
.pill-item__label {
color: color('blue-60v');
}
}
}
}
}
}
}
// Etc
.email-brand,
.browse-list {
padding: 0;
@@ -1047,3 +1056,7 @@ nav.nav {
.form-control-error {
border: 4px solid #b10e1e
}
.usa-site-alert .usa-alert .usa-alert__body {
max-width: 75rem;
}

View File

@@ -88,8 +88,6 @@ class Config(object):
],
}
FEATURE_ABOUT_PAGE_ENABLED = getenv("FEATURE_ABOUT_PAGE_ENABLED", "false") == "true"
def _s3_credentials_from_env(bucket_prefix):
return {

View File

@@ -344,7 +344,7 @@ def nl2br(value):
html="escape",
)
).then(utils_nl2br)
)
) # nosec
return ""

View File

@@ -257,7 +257,7 @@ def govuk_text_input_field_widget(
return Markup(
render_template("components/components/input/template.njk", params=params)
)
) # nosec
class GovukTextInputField(StringField):
@@ -690,7 +690,9 @@ def govuk_checkbox_field_widget(self, field, param_extensions=None, **kwargs):
if param_extensions:
merge_jsonlike(params, param_extensions)
return Markup(render_template("forms/fields/checkboxes/macro.njk", params=params))
return Markup(
render_template("forms/fields/checkboxes/macro.njk", params=params)
) # nosec
def govuk_checkboxes_field_widget(
@@ -704,7 +706,7 @@ def govuk_checkboxes_field_widget(
f' data-field-label="{field_label}">'
f" {checkboxes_string}"
f"</div>"
)
) # nosec
return result
@@ -757,12 +759,14 @@ def govuk_checkboxes_field_widget(
return _wrap_in_collapsible(
self.field_label,
Markup(render_template("forms/fields/checkboxes/macro.njk", params=params)),
Markup(
render_template("forms/fields/checkboxes/macro.njk", params=params)
), # nosec
)
else:
return Markup(
render_template("forms/fields/checkboxes/macro.njk", params=params)
)
) # nosec
def govuk_radios_field_widget(self, field, param_extensions=None, **kwargs):
@@ -805,7 +809,7 @@ def govuk_radios_field_widget(self, field, param_extensions=None, **kwargs):
return Markup(
render_template("components/components/radios/template.njk", params=params)
)
) # nosec
class GovukCheckboxField(BooleanField):

View File

@@ -61,7 +61,7 @@ class ValidEmail:
class NoCommasInPlaceHolders:
def __init__(self, message="You cannot put commas between double brackets"):
def __init__(self, message="You cannot put commas between double parenthesis"):
self.message = message
def __call__(self, form, field):
@@ -108,33 +108,17 @@ class OnlySMSCharacters:
)
if non_sms_characters:
raise ValidationError(
"You cannot use {} in {}. {} will not show up properly on everyones phones.".format(
"Please remove the unaccepted character {} in your message, then save again".format(
formatted_list(
non_sms_characters,
conjunction="or",
conjunction="and",
before_each="",
after_each="",
),
{
"sms": "text messages",
}.get(self._template_type),
("It" if len(non_sms_characters) == 1 else "They"),
)
)
# class NoPlaceholders:
# def __init__(self, message=None):
# self.message = message or (
# 'You cant use ((double brackets)) to personalize this message'
# )
# def __call__(self, form, field):
# if Field(field.data).placeholders:
# raise ValidationError(self.message)
class LettersNumbersSingleQuotesFullStopsAndUnderscoresOnly:
regex = re.compile(r"^[a-zA-Z0-9\s\._']+$")

View File

@@ -132,13 +132,18 @@ def get_local_daily_stats_for_last_x_days(stats_utc, user_timezone, days):
@user_has_permissions()
def get_daily_stats_by_user(service_id):
date_range = get_stats_date_range()
stats = service_api_client.get_user_service_notification_statistics_by_day(
days = date_range["days"]
user_timezone = request.args.get("timezone", "UTC")
stats_utc = service_api_client.get_user_service_notification_statistics_by_day(
service_id,
user_id=current_user.id,
start_date=date_range["start_date"],
days=date_range["days"],
days=days,
)
return jsonify(stats)
local_stats = get_local_daily_stats_for_last_x_days(stats_utc, user_timezone, days)
return jsonify(local_stats)
@main.route("/services/<uuid:service_id>/template-usage")

View File

@@ -23,10 +23,11 @@ from app.utils.user import user_is_logged_in
# Hook to check for feature flags
@main.before_request
def check_feature_flags():
if request.path.startswith("/about") and not current_app.config.get(
"FEATURE_ABOUT_PAGE_ENABLED", False
):
abort(404)
# Placeholder for future feature flag checks
# Example:
# if request.path.startswith("/some-feature") and not current_app.config.get("FEATURE_SOME_FEATURE_ENABLED", False):
# abort(404)
pass
@main.route("/test/feature-flags")
@@ -258,11 +259,11 @@ def why_text_messaging():
)
@main.route("/join-notify")
def join_notify():
@main.route("/notify-service-ending")
@user_is_logged_in
def notify_service_ending():
return render_template(
"views/join-notify.html",
navigation_links=about_notify_nav(),
"views/notify-service-ending.html",
)

View File

@@ -23,7 +23,7 @@ def accept_invite(token):
<a href={url_for("main.sign_out")} class="usa-link">Sign out</a>
and click the link again to accept this invite.
"""
)
) # nosec
flash(message=message)
@@ -98,7 +98,7 @@ def accept_org_invite(token):
""".format(
current_user.email_address, url_for("main.sign_out")
)
)
) # nosec
flash(message=message)

View File

@@ -351,7 +351,7 @@ def _get_job_counts(job):
Markup(
f"""total<span class="usa-sr-only">
{"text message" if job_type == "sms" else job_type}s</span>"""
),
), # nosec
"",
job.notification_count,
],
@@ -359,7 +359,7 @@ def _get_job_counts(job):
Markup(
f"""pending<span class="usa-sr-only">
{message_count_noun(job.notifications_sending, job_type)}</span>"""
),
), # nosec
"pending",
job.notifications_sending,
],
@@ -367,7 +367,7 @@ def _get_job_counts(job):
Markup(
f"""delivered<span class="usa-sr-only">
{message_count_noun(job.notifications_delivered, job_type)}</span>"""
),
), # nosec
"delivered",
job.notifications_delivered,
],
@@ -375,7 +375,7 @@ def _get_job_counts(job):
Markup(
f"""failed<span class="usa-sr-only">
{message_count_noun(job.notifications_failed, job_type)}</span>"""
),
), # nosec
"failed",
job.notifications_failed,
],
@@ -465,4 +465,4 @@ def get_preview_of_content(notification):
notification["personalisation"],
redact_missing_personalisation=True,
).subject
)
) # nosec

View File

@@ -4,6 +4,7 @@ import uuid
from string import ascii_uppercase
from zipfile import BadZipFile
import bleach
from flask import (
abort,
current_app,
@@ -170,7 +171,9 @@ def send_messages(service_id, template_id):
error_message = '<span class="error-message usa-error-message">'
error_message = f"{error_message}{first_field_errors[0]}"
error_message = f"{error_message}</span>"
error_message = Markup(error_message)
# use 'nosec' because we applied bleach.clean to strip dangerous tags
error_message = bleach.clean(error_message)
error_message = Markup(error_message) # nosec
flash(error_message)
column_headings = get_spreadsheet_column_headings_from_template(template)
@@ -924,6 +927,10 @@ def get_template_error_dict(exception):
def preview_notification(service_id, template_id):
recipient = get_recipient()
if not recipient:
current_app.logger.warning(
f"No recipient found for service {service_id}, template {template_id}. Redirecting..."
)
return redirect(
url_for(
".send_one_off",

View File

@@ -62,7 +62,7 @@ def _get_access_token(code): # pragma: no cover
code_param = f"code={code}"
url = f"{base_url}{cli_assert}&{cli_assert_type}&{code_param}&grant_type=authorization_code"
headers = {"Authorization": "Bearer %s" % token}
response = requests.post(url, headers=headers)
response = requests.post(url, headers=headers, timeout=30)
response_json = response.json()
id_token = get_id_token(response_json)
@@ -88,10 +88,7 @@ def _get_access_token(code): # pragma: no cover
def _get_user_email_and_uuid(access_token): # pragma: no cover
headers = {"Authorization": "Bearer %s" % access_token}
user_info_url = os.getenv("LOGIN_DOT_GOV_USER_INFO_URL")
user_attributes = requests.get(
user_info_url,
headers=headers,
)
user_attributes = requests.get(user_info_url, headers=headers, timeout=30)
user_email = user_attributes.json()["email"]
user_uuid = user_attributes.json()["sub"]
return user_email, user_uuid

View File

@@ -17,7 +17,7 @@ def _sign_out_at_login_dot_gov():
url = f"{base_url}{client_id}&{post_logout_redirect_uri}"
current_app.logger.info(f"url={url}")
response = requests.post(url)
response = requests.post(url, timeout=30)
# response = requests.post(url)
current_app.logger.info(f"login.gov response: {response.text}")

View File

@@ -56,10 +56,6 @@ def about_notify_nav():
},
],
},
{
"name": "Join Notify",
"link": "main.join_notify",
},
{
"name": "Contact us",
"link": "main.contact",

View File

@@ -680,42 +680,44 @@ def count_content_length(service_id, template_type):
)
def _is_latin1(s):
return bool(s.encode(encoding="latin-1", errors="strict"))
def _get_content_count_error_and_message_for_template(template):
url = "https://en.wikipedia.org/wiki/ISO/IEC_8859-1"
if template.template_type == "sms":
s1 = f"<html><body>Use of characters outside the <a href='{url}'>IEC_8859-1</a> character set may increase "
s2 = "the message fragment count, resulting in additional charges, and these IEC_8859-1 "
s3 = "characters may not display properly on some older mobile devices.</body></html>"
s1 = (
"<html><body>Looks like your template may have one of these characters "
"• ™ ∞ ≤ or ≥ or emoji, which won't save."
)
s2 = "<br>Please remove any unaccepted characters or emojis and try again.</body></html>"
warning = ""
try:
_is_latin1(template.content)
except UnicodeEncodeError:
warning = f"{s1}{s2}{s3}"
# Define characters that should be blocked
BLOCKED_CHARACTERS = {"", "", "", "", ""}
def contains_blocked_characters(content):
"""Check if the content contains explicitly blocked characters."""
return any(c in BLOCKED_CHARACTERS for c in content)
# Check for blocked characters
if contains_blocked_characters(template.content):
warning = f"{s1}{s2}"
return False, Markup(warning) # nosec
# If message is too long, return the length error
if template.is_message_too_long():
return True, (
f"You have "
f"{character_count(template.content_count_without_prefix - SMS_CHAR_COUNT_LIMIT)} "
f"too many"
)
# Show charge message as usual if no warning
if template.placeholders:
return False, (
Markup(
f"Will be charged as {message_count(template.fragment_count, template.template_type)} "
f"(not including personalization). {warning}"
)
)
return False, (
# Markup marks html contents safe so that they render properly. Don't use it if there is user input.
Markup(
f"Will be charged as {message_count(template.fragment_count, template.template_type)}. {warning} "
)
)
return False, Markup(
f"Will be charged as {message_count(template.fragment_count, template.template_type)} "
f"(not including personalization)."
) # nosec
return False, Markup(
f"Will be charged as {message_count(template.fragment_count, template.template_type)}."
) # nosec
@main.route(

View File

@@ -28,8 +28,17 @@ def get_csv_upload(service_id, upload_id):
return get_s3_object(*get_csv_location(service_id, upload_id))
def remove_blank_lines(filedata):
# sometimes people upload files with hundreds of blank lines at the end
data = filedata["data"]
cleaned_data = "\n".join(line for line in data.splitlines() if line.strip())
filedata["data"] = cleaned_data
return filedata
def s3upload(service_id, filedata):
filedata = remove_blank_lines(filedata)
upload_id = str(uuid.uuid4())
bucket_name, file_location, access_key, secret_key, region = get_csv_location(
service_id, upload_id

View File

@@ -29,6 +29,30 @@
{% block header %}
{% include 'components/usa_banner.html' %}
{% if current_user.is_authenticated or current_service or current_user.platform_admin %}
<section class="usa-site-alert usa-site-alert--info" aria-label="Site alert,,,,">
<div class="usa-alert">
<div class="usa-alert__body">
<p class="usa-alert__heading text-bold">Notify.gov Service Ending</p>
<p class="usa-alert__text">
GSA will no longer offer the Notify.gov service after June 8th, 2025. Visit
<a class="usa-link" href="/notify-service-ending">Notify.gov Service Ending</a> for more information.
</p>
</div>
</div>
</section>
{% else %}
<section class="usa-site-alert usa-site-alert--emergency usa-site-alert--no-heading" aria-label="Site alert,,,,">
<div class="usa-alert">
<div class="usa-alert__body">
<p class="usa-alert__heading text-bold">Notify.gov Service Ending</p>
<p class="usa-alert__text">
Notify.gov is no longer accepting new partners.
</p>
</div>
</div>
</section>
{% endif %}
{% include 'components/header.html' %}
{% endblock %}
@@ -94,10 +118,10 @@
{% block footer %}
{% if current_service and current_service.research_mode %}
{% set meta_suffix = 'Built by the <a href="https://www.gsa.gov/about-us/organization/federal-acquisition-service/technology-transformation-services/tts-solutions" class="usa-link">Technology Transformation Services</a><span id="research-mode" class="research-mode">research mode</span>' %}
{% set meta_suffix = 'Built by the <a href="https://tts.gsa.gov/" class="usa-link">Technology Transformation Services</a><span id="research-mode" class="research-mode">research mode</span>' %}
{% else %}
{% set commit_hash = ", Latest version: " + config['COMMIT_HASH'] %}
{% set long_link = '<a href="https://www.gsa.gov/about-us/organization/federal-acquisition-service/technology-transformation-services/tts-solutions" class="usa-link">Technology Transformation Services</a>' %}
{% set long_link = '<a href="https://tts.gsa.gov/" class="usa-link">Technology Transformation Services</a>' %}
{% set meta_suffix = "Built by the " + long_link + commit_hash %}
{% endif %}

View File

@@ -16,7 +16,7 @@
{#- Define common attributes we can use for both button and input types #}
{%- set buttonAttributes %}{% if params.name %} name="{{ params.name }}"{% endif %} type="{{ params.type if params.type else 'submit' }}"{% if params.disabled %} disabled="disabled" aria-disabled="true"{% endif %}{% if params.preventDoubleClick %} data-prevent-double-click="true"{% endif %}{% endset %}
{%- set buttonAttributes %}{% if params.name %} name="{{ params.name | trim }}"{% endif %} type="{{ params.type if params.type else 'submit' }}"{% if params.disabled %} disabled="disabled" aria-disabled="true"{% endif %}{% if params.preventDoubleClick %} data-prevent-double-click="true"{% endif %}{% endset %}
{#- Actually create a button... or a link! #}

View File

@@ -2,7 +2,7 @@
{% set labelHtml %}
<label class="usa-label{%- if params.classes %} {{ params.classes }}{% endif %}"
{%- for attribute, value in params.attributes %} {{attribute}}="{{value}}"{% endfor %}
{%- if params.text %} for="{{ params.text | slugify }}"{% endif %}>
{%- if params.for %} for="{{ params.for }}"{% endif %}>
{{ params.html | safe if params.html else params.text }}
</label>
{% endset %}

View File

@@ -5,7 +5,8 @@
class=None,
id=None,
module=None,
data_kwargs={}
data_kwargs={},
data_force_focus=False
) %}
<form
method="{{ method }}"
@@ -19,6 +20,7 @@
data-{{ key }}="{{ val }}"
{% endif %}
{% endfor %}
{% if data_force_focus %}data-force-focus="{{ data_force_focus }}"{% endif %}
novalidate
>
{{ caller() }}

View File

@@ -1,7 +1,6 @@
{% set is_about_page = request.path.startswith('/about') %}
{% set is_join_notify_page = request.path.startswith('/join-notify') %}
{% set is_contact_page = request.path.startswith('/contact') %}
{% set is_information_section = is_about_page or is_join_notify_page or is_contact_page %}
{% set is_information_section = is_about_page or is_contact_page %}
{% if current_user.is_authenticated %}
{% set navigation = [
@@ -34,7 +33,6 @@
{% else %}
{% set navigation = [
{"href": url_for('main.about_notify'), "text": "About Notify", "active": is_about_page},
{"href": url_for('main.join_notify'), "text": "Join Notify", "active": is_join_notify_page},
{"href": url_for('main.contact'), "text": "Contact us", "active": is_contact_page}
] %}
{% endif %}

View File

@@ -7,7 +7,7 @@
</h3>
<div id="m-a2" class="usa-accordion__content usa-prose">
<p class="usa-body">
Use double brackets and ?? to define optional content.
Use double parenthesis and ?? to define optional content.
</p>
<p class="bottom-gutter-1-3">
For example if you only want to show something to people who are under

View File

@@ -7,11 +7,10 @@
</h3>
<div id="personalization" class="usa-accordion__content usa-prose">
<p class="bottom-gutter-1-3">
Use double brackets to personalize your message:
Use double parenthesis to personalize your message:
</p>
{{ usaInsetText({
"text": "Hello ((first name)), your reference is ((ref number))",
"classes": ""})
}}
</div>

View File

@@ -4,7 +4,7 @@
Send a document by email
</h2>
<p class="usa-body">
Use double brackets to add a placeholder field to your template. This will contain a secure link to download the document.
Use double parenthesis to add a placeholder field to your template. This will contain a secure link to download the document.
</p>
{{ usaInsetText({
"text": "Download your document at: ((link_to_file))",

View File

@@ -16,7 +16,10 @@
<li>More effectively deliver program outcomes</li>
<li>Save administrative costs</li>
<li>Implement <a class="use-link usa-link--external"
href="https://digital.gov/resources/delivering-digital-first-public-experience/" target="_blank">21st Century
href="https://digital.gov/resources/delivering-digital-first-public-experience/"
rel="noopener noreferrer"
target="_blank"
aria-label="21st Century IDEA (opens in a new tab)">21st Century
IDEA</a> and other directives</li>
</ul>
<p>Notify.gov is an easy-to-use, web-based platform. It requires no technical expertise or system integration — users
@@ -66,7 +69,6 @@
</li>
{% endfor %}
</ul>
<p><a href="/join-notify">See if Notify is right for you</a></p>
<p>Notify.gov is a product of the <a href="/studio">Public Benefits Studio</a>, a product accelerator inside
the federal government. </p>
</section>

View File

@@ -22,16 +22,26 @@
</ul>
<p>
Notify.gov operates under a full three-year <a class="use-link usa-link--external"
href="https://digital.gov/resources/an-introduction-to-ato/" target="_blank">Authority-to-Operate (ATO)</a>. This
href="https://digital.gov/resources/an-introduction-to-ato/"
target="_blank"
rel="noopener noreferrer"
aria-label="Authority-to-Operate (ATO) (opens in a new tab)">Authority-to-Operate (ATO)</a>. This
federal security authorization process leverages security
controls provided by National Institute of Standards and Technology (NIST).
</p>
<p>
Our infrastructure runs on <a class="use-link usa-link--external" href="https://www.cloud.gov/"
target="_blank">cloud.gov</a> and utilizes several
Our infrastructure runs on <a class="use-link usa-link--external"
href="https://www.cloud.gov/"
target="_blank"
rel="noopener noreferrer"
aria-label="cloud dot gov (opens in a new tab)">cloud.gov</a> and utilizes several
services through Amazon Web
Services (AWS), including <a class="use-link usa-link--external" href="https://aws.amazon.com/sns/" target="_blank">
Services (AWS), including <a class="use-link usa-link--external"
href="https://aws.amazon.com/sns/"
rel="noopener noreferrer"
target="_blank"
aria-label="AWS SNS (opens in a new tab)">
AWS SNS </a> for sending SMS
messages.
</p>
@@ -53,15 +63,22 @@
</p>
<h2>Multi-Factor Authentication</h2>
<p>
Notify.gov uses <a class="use-link usa-link--external" href="https://login.gov/what-is-login/"
target="_blank">Login.gov</a> for enhanced security.
Notify.gov uses <a class="use-link usa-link--external"
href="https://login.gov/what-is-login/"
rel="noopener noreferrer"
target="_blank"
aria-label="Login dot gov (opens in a new tab)">Login.gov</a> 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.
</p>
<p>
To access Notify.gov, users will use a Login.gov account associated with their agency (.gov) email with one of the
<a class="use-link usa-link--external" href="https://login.gov/help/get-started/authentication-methods/"
target="_blank">multi-factor authentication
<a class="use-link usa-link--external"
href="https://login.gov/help/get-started/authentication-methods/"
rel="noopener noreferrer"
target="_blank"
aria-label="login dot gov multi-factor authentication methods (opens in a new tab)"
>multi-factor authentication
methods</a> offered through Login.gov.
</p>
</section>

View File

@@ -16,7 +16,9 @@
<p>
Confusing or <a class="use-link usa-link--external"
href="https://kffhealthnews.org/news/tougher-returned-mail-policies-add-to-medicaid-enrollment-drop/"
target="_blank">unreceived notifications</a> are one of the largest barriers to people getting and keeping
target="_blank"
rel="noopener noreferrer"
aria-label="unreceived notifications (opens in a new tab)">unreceived notifications</a> 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.
</p>
@@ -24,7 +26,9 @@
<p>
<a class="use-link usa-link--external"
href="https://www.pewresearch.org/internet/fact-sheet/mobile/?tabItem=64e32376-5a21-4b1d-8f8b-5f92406db984"
target="_blank">Pew Research shows that nearly all adults in the US have a cell phone.</a> Reliance on smartphones
target="_blank"
rel="noopener noreferrer"
aria-label="Pew Research shows that nearly all adults in the US have a cell phone (opens in a new tab)">Pew Research shows that nearly all adults in the US have a cell phone.</a> 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.
@@ -40,8 +44,7 @@
</p>
<p>
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 <a href="/join-notify">you can get started for free</a>, allowing you to try out
texting to complement your existing communications and outreach strategies.
way to do so.
</p>
<h2 id="what-texting-is-best-for">What texting is best for</h2>
<p>

View File

@@ -14,7 +14,7 @@
{{ page_header('About your service') }}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ form.name(param_extensions={"hint": {"text": "You can change this later"}}) }}

View File

@@ -102,7 +102,7 @@ Error
<div class="usa-alert usa-alert--error" role="alert">
<div class="usa-alert__body">
<h1 class="usa-alert__heading banner-title" data-module="track-error" data-error-type="Missing placeholder columns"
data-error-label="{{ upload_id }}">Your column names need to match the double brackets in your template</h1>
data-error-label="{{ upload_id }}">Your column names need to match the double parenthesis in your template</h1>
<p class="usa-alert__text">
Your file is missing {{ recipients.missing_column_headers | formatted_list(
conjunction='and',

View File

@@ -101,6 +101,9 @@
{% set button_text %}
{{ "Schedule" if scheduled_for else 'Send'}}
{% endset %}
{{ usaButton({ "text": button_text }) }}
{{ usaButton({
"text": button_text,
"name": button_text
}) }}
</form>
{% endblock %}

View File

@@ -7,19 +7,10 @@
{% block content_column_content %}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p>Is your organization interested in using Notify.gov? Find more information at <a href="/join-notify">Join
Notify</a> or contact us at <a href="mailto:tts-notify@gsa.gov"
<p>For any questions, contact us at <a href="mailto:tts-notify@gsa.gov"
aria-label="contact us at tts-notify@gsa.gov">tts-notify@gsa.gov</a>.</p>
<p>You can expect a response within one business day.</p>
<div class="usa-summary-box maxw-tablet __web-inspector-hide-shortcut__" role="region"
aria-label="For partnership inquiries">
<div class="usa-summary-box__body">
<div class="usa-summary-box__text">
<p class="margin-0">If you are a current Notify.gov partner and have technical issues or questions, we are available at <a
href="mailto:notify-support@gsa.gov"
aria-label="Email Notify for technical questions at notify-support@gsa.gov">notify-support@gsa.gov</a></p>
</div>
</div>
</div>
<p>If you are a current Notify.gov partner and have technical issues or questions, we are available
at <a href="mailto:notify-support@gsa.gov"
aria-label="Email Notify for technical questions at notify-support@gsa.gov">notify-support@gsa.gov</a></p>
</section>
{% endblock %}

View File

@@ -27,8 +27,8 @@
{% set content_hint = 'Your service name will be added to the start of your message. You can turn this off in Settings.' %}
{% endif %}
{% call form_wrapper() %}
<div class="grid-row">
{% call form_wrapper(data_force_focus=True) %}
<div class="grid-container padding-0">
<div class="tablet:grid-col-9 mobile-lg:grid-col-12">
{{ form.name(param_extensions={
"extra_form_group_classes": "margin-bottom-2",
@@ -61,12 +61,12 @@
</div>
</div>
</div>
<div class="grid-row width-full">
<div class="grid-row width-mobile-lg">
<div class="tablet:grid-col-2 mobile-lg:grid-col-12">
{{ page_footer('Save') }}
</div>
<div class="tablet:grid-col-10 mobile-lg:grid-col-12">
<p class="usa-hint margin-top-5 tablet:margin-left-neg-2">
<p class="usa-hint margin-top-5 tablet:margin-left-2">
After saving, you'll have the option to send.
</p>
</div>

View File

@@ -23,7 +23,9 @@
<p>
When the <a class="use-link usa-link--external"
href="https://www.cbpp.org/research/food-assistance/targeted-text-message-outreach-can-increase-wic-enrollment-pilots-show"
target="_blank">Center on Budget and Policy Priorities</a> studied WIC, they found key learnings about the
target="_blank"
rel="noopener noreferrer"
aria-label="Center on Budget and Policy Priorities (opens in a new tab)">Center on Budget and Policy Priorities</a> studied WIC, they found key learnings about the
quantity of messages delivered, how people engage with messages, and how they take action.
</p>
@@ -68,8 +70,11 @@
</li>
</ul>
<p>
The <a class="use-link usa-link--external" href="https://codeforamerica.org/resources/texting-playbook/"
target="_blank">Code for Americas Texting
The <a class="use-link usa-link--external"
href="https://codeforamerica.org/resources/texting-playbook/"
target="_blank"
rel="noopener noreferrer"
aria-label="Code for America's Texting Playbook (opens in a new tab)">Code for Americas Texting
Playbook</a>
reported specific learnings around appointment reminders, completing
document submission, and maintenance reminders.

View File

@@ -142,7 +142,9 @@
<p>
The Department of Veterans Affairs provides a <a class="use-link usa-link--external"
href="https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/va-notify/notification-guide.md#vanotify-notification-guide"
target="_blank">helpful flow-chart</a> that can help you decide if a text message is needed
target="_blank"
rel="noopener noreferrer"
aria-label="helpful flow-chart (opens in a new tab)">helpful flow-chart</a> that can help you decide if a text message is needed
for the communication problem you are trying to solve.
</p>
<h2>Use a hypothesis framework to plan your campaign</h2>

View File

@@ -101,8 +101,11 @@
<p class="sms-message-wrapper text-left">
{{circle_number(7) }}<b>Dept. of Social Services:</b> Hi {{circle_number(8) }}<b>Julie,</b> Your Medicaid
renewal is closing December 31, 2023. You can renew online at {{circle_number(9) }}<a
class="use-link usa-link--external" href="https://www.application.yourstate.gov" target="_blank"
rel="application.yourstate.gov">https://www.application.yourstate.gov</a> or {{circle_number(10) }}
class="use-link usa-link--external"
href="https://www.application.yourstate.gov"
target="_blank"
rel="application.yourstate.gov"
aria-label="Yourstate dot gov (opens in a new tab)">https://www.application.yourstate.gov</a> or {{circle_number(10) }}
<b>call the number on the back</b> of your Medicaid card.
</p>
</div>

View File

@@ -29,7 +29,10 @@
{% set links = [
{
"p_text": 'The <a class="use-link usa-link--external" href="https://www.fcc.gov/sites/default/files/tcpa-rules.pdf"
target="_blank">Telephone Consumer
target="_blank"
rel="noopener noreferrer"
aria-label="Telephone Consumer Protection Act (TCPA) (opens in a new tab)"
>Telephone Consumer
Protection Act (TCPA)</a> (47 USC § 227) is the federal law that impacts how organizations are allowed to
communicate
in bulk with the public via telephone (including text message or SMS).'
@@ -37,7 +40,9 @@
{
"p_text": 'The <a class="use-link usa-link--external"
href="https://www.fcc.gov/document/fcc-provides-best-practices-enable-critical-health-care-coverage-calls"
target="_blank">FCC has ruled</a> that <b>Federal</b> and <b>State</b> programs are exempt from the TCPA and can
target="_blank"
rel="noopener noreferrer"
aria-label="FCC has ruled (opens in a new tab)">FCC has ruled</a> that <b>Federal</b> and <b>State</b> programs are exempt from the TCPA and can
send
text messages to the public without consent if conducting official business. Without explicit mention in the ruling,
local governments, phone carriers, or any texting intermediaries might require it.'
@@ -52,7 +57,10 @@
case.
For additional questions about the enforcement of the TCPA, you can watch <a class="use-link usa-link--external"
href="https://www.performance.gov/cx/life-experiences/facing-a-financial-shock/outputs/fcc-training/"
target="_blank">a recorded training on public
target="_blank"
rel="noopener noreferrer"
aria-label="a recorded training on public
benefits texting (opens in a new tab)">a recorded training on public
benefits texting</a> provided by the FCC.'
},
] %}
@@ -65,7 +73,9 @@
<h4 class="usa-collection__heading">
<a class="usa-link {% if item.is_downloadable %}usa-link--downloadable{% else %}usa-link--external{% endif %}"
href="{% if item.is_downloadable %}{{ asset_url(item.url_link) }}{% else %}{{ item.url_link }}{% endif %}"
target="_blank">
target="_blank"
rel="noopener noreferrer"
aria-label="{{ item.url_text }} (opens in a new tab)">
{{ item.url_text }}
</a>
</h4>
@@ -119,6 +129,7 @@
process
to keep your phone number list up-to-date. The FCC offers a <a class="use-link usa-link--external"
href="https://www.fcc.gov/reassigned-numbers-database" target="_blank"
aria-label="Reassigned Numbers Database (opens in a new tab)"
rel="Reassigned Numbers Database">Reassigned
Numbers Database</a> to identify phone numbers that may have been reassigned since your agency obtained them.
</p>

View File

@@ -81,7 +81,10 @@
</ul>
<h2>What provoking action looks like</h2>
<p class="padding-bottom-2"><a class="use-link usa-link--external"
href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC10002044/" target="_blank">Evidence
href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC10002044/"
target="_blank"
rel="noopener noreferrer"
aria-label="Evidence shows (opens in a new tab)">Evidence
shows</a> that employing
behavioral science is an effective way to increase the
likelihood of a recipient

View File

@@ -61,7 +61,7 @@
<ol class="list list-number">
<li>Go to the {{ service_link(current_service, 'main.choose_template', 'templates') }} page.</li>
<li>Add a new template or choose an existing template and select <b class="bold">Edit</b>.</li>
<li>Add a placeholder using double brackets. For example: Hello ((first&nbsp;name)), your reference is ((ref&nbsp;number)).</li>
<li>Add a placeholder using double parenthesis. For example: Hello ((first&nbsp;name)), your reference is ((ref&nbsp;number)).</li>
<li>Select <b class="bold">Save</b>.</li>
</ol>
@@ -81,7 +81,7 @@
<ol class="list list-number">
<li>Go to the {{ service_link(current_service, 'main.choose_template', 'templates') }} page.</li>
<li>Add a new template or choose an existing template and select <b class="bold">Edit</b>.</li>
<li>Use double brackets and ?? to define optional content. For example, if you only want to show something to people who are under 18: ((under18??Please get your application signed by a parent or guardian.))</li>
<li>Use double parenthesis and ?? to define optional content. For example, if you only want to show something to people who are under 18: ((under18??Please get your application signed by a parent or guardian.))</li>
<li>Select <b class="bold">Save</b>.</li>
</ol>

View File

@@ -59,7 +59,7 @@ your recipient to manage their benefits and increase follow-through.</p>
<h3>To personalize your content</h3>
<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 parenthesis 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
work for you.</li>
</ol>
@@ -78,7 +78,7 @@ all or part of the message contingent upon specific criteria associated with the
<h3>To add conditional content</h3>
<ol class="list">
<li>Use two brackets and ?? to define the conditional content.</li>
<li>Use two parenthesis 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
do the work for you.</li>
</ol>

View File

@@ -30,6 +30,9 @@
error_message_with_html=True
) }}
{% endif %}
<p>
Team members must be invited directly using their .gov email address, not from forwarded invitations. Invitation links to create a Notify.gov account are active for only 24 hours. Expired invitations can e re-sent from the Team members page.
</p>
{% include 'views/manage-users/permissions.html' %}

View File

@@ -43,7 +43,6 @@
{% endcall %}
</div>
{% elif error == 'message-too-long' %}
{# the only row_errors we can get when sending one off messages is that the message is too long #}
<div class="bottom-gutter">
{% call banner_wrapper(type='dangerous') %}
{% include "partials/check/message-too-long.html" %}
@@ -77,13 +76,15 @@
help='3' if help else 0
)}}" class='page-footer'>
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<!-- <p>Placeholder: This message will be delivered to <b>400 phone numbers</b> and will use a total of <b>800 message parts</b>, leaving Washington DSHS with <b>249,200 message parts remaining</b>.</p> -->
<h3>Does everything look good?</h3>
{% if not error %}
{% set button_text %}
{{ "Schedule" if scheduled_for else 'Send'}}
{% endset %}
{{ usaButton({ "text": button_text }) }}
{{ usaButton({
"text": button_text,
"name": button_text
}) }}
{% endif %}
</form>
</div>

View File

@@ -0,0 +1,28 @@
{% extends "base.html" %}
{% set page_title = "Notify.gov Service Ending" %}
{% block per_page_title %}{{page_title}}{% endblock %}
{% block content_column_content %}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p>GSA will no longer offer the Notify.gov service after June 8th, 2025. Current partners will continue to have service access until it is fully suspended. After May 30, partners will no longer be able to send messages, and the full service will be suspended by June 8, 2025.
</p>
<h2>Notify.gov Status Announcement</h2>
<p class="text-italic">Notify.gov was in beta and will no longer be offered by GSA. Operations will be suspended on or before June 8. There is a chance that the service may need to stop sooner. GSA will keep partners informed to the extent possible.</p>
<p class="text-italic">All Notify.gov partners will be moved to trial mode no later than May 30, and will no longer be able to send messages. Partners will be able to access their templates and data through June 8.</p>
<p class="text-italic">We encourage government programs to explore ways to continue utilizing technology to meet people where they are. There are several commercial tools on the market that may work for Notify.gov use cases.</p>
<p class="text-italic">GSA is working to avoid potential disruptions to partners operations and ensure a smooth transition.</p>
<p class="text-italic">This decision is part of GSAs renewed focus on its original mission: to be the backbone of the federal governments administrative operations — streamlining processes, optimizing resources, and ensuring cost-effectiveness. GSA is driven to reducing federal spend, contributing to a more flexible and streamlined government, and delivering value for the American people.</p>
<p class="text-italic">We wish you all the best as you continue your work. </p>
</section>
{% endblock %}

View File

@@ -11,7 +11,7 @@
</h1>
<p>
<a class="usa-link" target="_blank" href="{{ url_for('main.live_services_csv') }}">Download live services csv report</a>
<a class="usa-link" target="_blank" rel="noopener noreferrer" aria-label="Download live services CSV report (opens in a new tab)" href="{{ url_for('main.live_services_csv') }}">Download live services csv report</a>
</p>
<p>
<a class="usa-link" href="{{ url_for('main.notifications_sent_by_service') }}">Monthly notification statuses for live services</a>

View File

@@ -34,7 +34,8 @@
{% call form_wrapper(
class='js-stick-at-top-when-scrolling send-one-off-form' if template.template_type != 'sms' else 'send-one-off-form',
module="autofocus",
data_kwargs={'force-focus': True}
data_kwargs={'force-focus': True},
data_force_focus=True
) %}
<div class="grid-row">
{% set extra_class = "extra-tracking" if form.placeholder_value.label.text == "phone number" else "" %}

View File

@@ -29,13 +29,6 @@
</div>
<h2 class="font-body-lg">Your file needs to look like this example</h2>
<p class="hint">
Save your file as a
<abbr title="Comma Separated Values">CSV</abbr><span aria-hidden="true">, </span>
<abbr title="Tab Separated Values">TSV</abbr><span aria-hidden="true">, </span>
<abbr title="Open Document Spreadsheet">ODS</abbr>
or Microsoft Excel spreadsheet.
</p>
<div class="spreadsheet" data-module="fullscreen-table">
{% call(item, row_number) list_table(
@@ -50,10 +43,14 @@
{% endfor %}
{% endcall %}
</div>
<p class="table-show-more-link">
<a class="usa-link" href="{{ url_for('.get_example_csv', service_id=current_service.id, template_id=template.id) }}" download>Download this example (<abbr title="Comma separated values">CSV</abbr>)</a>
<p class="hint">
Save your spreadsheet as a <abbr title="Comma Separated Values">CSV</abbr> file for bulk messaging. It is the most reliable when uploading your contact list. Start by downloading this example for your message template.
</p>
<p class="table-show-more-link">
<a class="usa-link display-flex margin-top-1" href="{{ url_for('.get_example_csv', service_id=current_service.id, template_id=template.id) }}" download>Download this example (<abbr title="Comma separated values">CSV</abbr>)
<img class="margin-left-05" src="{{ asset_url('img/material-icons/download.svg') }}" alt="" />
</a>
</p>
<h2 class="font-body-lg margin-bottom-1">Your file will populate this template:<br><span class="font-body-lg">({{ template.name }})</span></h2>
{{ template|string }}

View File

@@ -24,7 +24,7 @@
label='Search by name',
autofocus=True
) }}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{% if has_organizations %}
{{ form.organizations }}
{{ sticky_page_footer('Save') }}

View File

@@ -14,7 +14,7 @@
{% block maincolumn_content %}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ page_header('Free text message allowance') }}
{{ form.free_sms_allowance }}
{{ page_footer('Save') }}

View File

@@ -24,7 +24,7 @@
See <a class="usa-link" href="{{ url_for(".pricing") }}">pricing</a> for the list
of rates.
</p>
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ form.enabled }}
{{ page_footer('Save') }}
{% endcall %}

View File

@@ -14,7 +14,7 @@
{% block maincolumn_content %}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ page_header('Message batch limit') }}
{{ form.message_limit }}
{{ page_footer('Save') }}

View File

@@ -14,7 +14,7 @@
{% block maincolumn_content %}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ page_header('Rate limit') }}
{{ form.rate_limit }}
{{ page_footer('Save') }}

View File

@@ -15,7 +15,7 @@
<div class="grid-row">
<div class="grid-col-10">
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ form.enabled(param_extensions={
"fieldset": {
"legend": {

View File

@@ -20,12 +20,7 @@
<p>
You may send up to 250,000 text messages during the pilot period.
</p>
<!--<p>
You have a free allowance of
{{ '{:,}'.format(current_service.free_sms_fragment_limit) }} text messages each
financial year.
</p>-->
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ form.enabled }}
{{ page_footer('Save') }}
{% endcall %}

View File

@@ -16,7 +16,7 @@
{{ page_header('Start text messages with service name') }}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ form.enabled }}
{{ page_footer('Save') }}
{% endcall %}

View File

@@ -16,7 +16,7 @@
{{ page_header('Add text message sender') }}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ form.sms_sender(param_extensions={
"hint": {"text": "Up to 11 characters, letters, numbers and spaces only"}
}) }}

View File

@@ -18,7 +18,7 @@
{% block maincolumn_content %}
{{ page_header('Change text message sender') }}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{% if inbound_number %}
<p>
<span class="bottom-gutter-1-3"> {{ sms_sender.sms_sender }} </span>

View File

@@ -171,47 +171,29 @@ import usaButton %} {% block meta %}
</section>
<section
class="grid-container usa-section usa-section__home usa-prose grid-container padding-bottom-10"
>
<h2 class="font-heading-xl margin-top-0 margin-bottom-3">
Who can use Notify.gov?
</h2>
<p class="usa-body">
All <span class="text-bold">federal</span> agencies and programs are
eligible to use Notify.gov.
</p>
<p class="usa-body">
US
<span class="text-bold">state, local, territorial, or tribal</span>
governments that administer or deliver federally-funded programs or
services may qualify to use Notify.gov to communicate with applicants and
participants in these programs.
</p>
<div class="grid-container margin-top-4 padding-left-0 padding-right-0">
<div class="grid-row grid-gap-3">
<a
class="text-no-underline tablet:grid-col-4 mobile-lg:grid-col-12"
href="mailto:tts-notify@gsa.gov"
>
<div class="contact-us-card">
<div class="grid-row flex-align-center grid-gap-2">
<div class="grid-col-auto">
<img
src="{{ asset_url('images/contact.svg') }}"
alt=""
class="height-7 width-7"
/>
</div>
<div class="grid-col">
<p class="margin-0">
<strong>Contact us</strong><br />
To learn more about becoming a partner!
</p>
</div>
class="grid-container usa-section usa-section__home usa-prose grid-container padding-bottom-10">
<div class="grid-row grid-gap-3">
<a
class="text-no-underline tablet:grid-col-4 mobile-lg:grid-col-12"
href="mailto:tts-notify@gsa.gov"
>
<div class="contact-us-card">
<div class="grid-row flex-align-center grid-gap-2">
<div class="grid-col-auto">
<img
src="{{ asset_url('images/contact.svg') }}"
alt=""
class="height-7 width-7"
/>
</div>
<div class="grid-col">
<p class="margin-0">
<strong>Contact us</strong><br />
</p>
</div>
</div>
</a>
</div>
</div>
</a>
</div>
</section>

View File

@@ -118,9 +118,10 @@ def indent_njk(s, width=4, first=False, blank=False, indentfirst=None):
indention = " " * width
newline = "\n"
# we know 'indention' and 'newline' are safe so use nosec to bypass static scan warning
if isinstance(s, Markup):
indention = Markup(indention)
newline = Markup(newline)
indention = Markup(indention) # nosec
newline = Markup(newline) # nosec
s += newline # this quirk is necessary for splitlines method
@@ -190,7 +191,7 @@ class NunjucksUndefined(jinja2.runtime.Undefined):
def items(self):
return self
# Allow escaping with Markup. This is required when
# Allow escaping. This is required when
# autoescape is enabled. Debugging this issue was
# annoying; the error messages were not clear as to
# the cause of the issue (see upstream pull request

Binary file not shown.

Before

Width:  |  Height:  |  Size: 337 KiB

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 KiB

After

Width:  |  Height:  |  Size: 552 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 KiB

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 927 KiB

After

Width:  |  Height:  |  Size: 958 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 KiB

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 378 KiB

After

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 464 KiB

After

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 KiB

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 KiB

After

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 KiB

After

Width:  |  Height:  |  Size: 472 KiB

View File

@@ -68,13 +68,11 @@ const javascripts = () => {
paths.src + 'javascripts/errorTracking.js',
paths.src + 'javascripts/preventDuplicateFormSubmissions.js',
paths.src + 'javascripts/fullscreenTable.js',
paths.src + 'javascripts/colourPreview.js',
paths.src + 'javascripts/templateFolderForm.js',
paths.src + 'javascripts/collapsibleCheckboxes.js',
paths.src + 'javascripts/radioSlider.js',
paths.src + 'javascripts/updateStatus.js',
paths.src + 'javascripts/errorBanner.js',
paths.src + 'javascripts/homepage.js',
paths.src + 'javascripts/timeoutPopup.js',
paths.src + 'javascripts/date.js',
paths.src + 'javascripts/loginAlert.js',

View File

@@ -14,7 +14,7 @@ from notifications_utils.insensitive_dict import InsensitiveDict
class Placeholder:
def __init__(self, body):
# body shouldnt include leading/trailing brackets, like (( and ))
# body shouldnt include leading/trailing parenthesis, like (( and ))
self.body = body.lstrip("(").rstrip(")")
@classmethod
@@ -70,14 +70,16 @@ class Field:
conditional_placeholder_tag = (
"<span class='placeholder-conditional'>(({}??</span>{}))"
)
placeholder_tag_no_brackets = "<span class='placeholder-no-brackets'>{}</span>"
placeholder_tag_no_parenthesis = (
"<span class='placeholder-no-parenthesis'>{}</span>"
)
placeholder_tag_redacted = "<span class='placeholder-redacted'>hidden</span>"
def __init__(
self,
content,
values=None,
with_brackets=True,
with_parenthesis=True,
html="strip",
markdown_lists=False,
redact_missing_personalisation=False,
@@ -85,8 +87,8 @@ class Field:
self.content = content
self.values = values
self.markdown_lists = markdown_lists
if not with_brackets:
self.placeholder_tag = self.placeholder_tag_no_brackets
if not with_parenthesis:
self.placeholder_tag = self.placeholder_tag_no_parenthesis
self.sanitizer = {
"strip": strip_html,
"escape": escape_html,
@@ -198,7 +200,7 @@ class PlainTextField(Field):
placeholder_tag = "(({}))"
conditional_placeholder_tag = "(({}??{}))"
placeholder_tag_no_brackets = "{}"
placeholder_tag_no_parenthesis = "{}"
placeholder_tag_redacted = "[hidden]"

Some files were not shown because too many files have changed in this diff Show More