Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 1.10.7
current_version = 1.10.8
commit = True
tag = True

Expand Down
1 change: 0 additions & 1 deletion .github/codeql/codeql-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ paths-ignore:
- '**/static/app/adminbundle.js'
- '**/static/app/cm6.js'
# Vendored third-party libraries (upstream owns these).
- '**/static/labelauty/**'
- '**/static/tom-select/**'
- '**/static/bootstrap*/**'
- '**/static/jquery*'
Expand Down
45 changes: 45 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,50 @@
# Change Log

## [1.10.8] - 2026-09-07

### Changed

- The `_edit_button()` and `_delete_button()` methods now have a third
positional argument, `item`. *Note that this is a breaking change*
if you use `_edit_button()` or `_delete_button()`, so you will need
to update your methods.
- Checkboxes and radio buttons no longer use JavaScript.
- Users of screen readers will hear "Deleted" after pressing a
"Delete" button on a `table`.
- Changed aria settings of the elements containing flash messages, so
that messages are announced to screen readers. If you have modified
`alert container html` and/or `alert html`, you may want to make
note of these changes.
- Users of screen readers now see a "Skip to main content" link that
focuses the question, bypassing navigation.
- When the spinner appears, users of screen readers will hear
"Please wait."
- When fields appear due to a `show if` being triggered, users of
screen readers will hear "Additional fields have appeared."
- Users of screen readers will hear the list of sections in the
navigation bar as separate items.
- The progress bar's `aria-valuenow` is now always an integer.
- Updated the progressive disclosure recipe to use
`<details>`/`<summary>`.
- Changed the HTML of "terms" to add `role="button"` and to use a
trigger based on focus.
- Removed `bootstrap-fileinput` plugin for styling file input
elements.
- After a new screen is loaded, the focus will switch either to a form
field or to the text of the `question`.
- Removed the unnecessary `visually-hidden` `<legend>` messages that
provided context (e.g. "press one of the following buttons");
replaced `<fieldset>` with `<div>`.
- The `log()` function now accepts a `priority` of `aria`, which shows
a message in a `visually-hidden` `<div>` inside of `#daflash`.

### Fixed

- Fixed issue with the session id not being set in the global
variables immediately after a `new_session` is created.
- Prevented error message appearing under some circumstances when a
package is deleted.

## [1.10.7] - 2026-08-01

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion Docker/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.10.7
1.10.8
2 changes: 2 additions & 0 deletions Docker/run-celery.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#!/bin/bash

umask 002

export DA_ROOT="${DA_ROOT:-/usr/share/docassemble}"

export DA_DEFAULT_LOCAL="local3.14"
Expand Down
23 changes: 19 additions & 4 deletions FORK.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
Branch `jacob/maintained` is the working branch. It tracks
`jhpyle/docassemble` master and carries, beyond upstream:

- **Bool config crash fix** (upstream #980, PR #983 pending): `str()` guard
in `docassemble_base/docassemble/base/parse.py` so a YAML boolean in
`main page title url opens in other window` cannot break every interview.
- **Plain-dict conversion** (upstream #981; upstream declined in PR #984 —
object notation is the documented mechanism): `POST /api/session` converts
a non-empty all-bool plain dict to a gathered `DADict`.
Expand Down Expand Up @@ -45,6 +42,24 @@ Branch `jacob/maintained` is the working branch. It tracks
fallback. Implementation in `docassemble/base/email_crypto.py`.
- **Clearer API error**: when a plain dict still breaks assembly, the error
names the variable and links `session_post_objects`.
- **Accessibility** (#18): skip-to-content link in base.html and the
interview page emitter, 404 page gains `<main role="main">` landmark
and a home link, `@media print` rules drop the navbar, buttons, and
footer. Skip link uses upstream's `tabindex="0"`; print CSS is
fork-only.
- **SEO** (#15): `<meta name="description">` from interview metadata
(falling back to site-wide social description), `<link rel="canonical">`
to the clean entry URL, OG tags whenever `config['SOCIAL']['og']` is
defined (not only when `og:image` is set), `/sitemap.xml` listing
public dispatch interviews.
- **FontAwesome CSS** (#19): replaces the 1.6 MB JS SVG-replacement
bundle with 88 KB CSS + icon fonts fetched on demand; class names and
icon rendering are unchanged.
- **PDF NFC normalisation** (#21): `pdftk.py` normalises fill values to
NFC before the XFDF write so accented names on court filings render
correctly.
- **Geocode lazy-load** (issue 932): `geopy` is imported on first use so
a broken pydantic chain cannot kill startup.

## Test harness (`.github/workflows/`)

Expand Down Expand Up @@ -77,7 +92,7 @@ CodeQL runs via advanced setup (`.github/workflows/codeql.yml` +
`.github/codeql/codeql-config.yml`), not GitHub's default setup, so it
can take path rules. The config runs `security-extended` on first-party
source and excludes generated JS bundles (duplicates of the scanned
`app/*.js` sources) and vendored libraries (labelauty, tom-select,
`app/*.js` sources) and vendored libraries (tom-select,
bootstrap, jQuery, fontawesome, codemirror) which are upstream's to fix.
Scans run on push/PR to master and jacob/maintained and weekly.

Expand Down
12 changes: 6 additions & 6 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ Tracked as GitHub issues on the fork, label `enhancement`.
- [#17](https://github.com/jacobyoby/docassemble/issues/17) Cloudron
packaging for self-hosting (upstream #917). Not verifiable without a
Cloudron instance; left open.
- **Interview bundle split** — `bundle.min.js` (983 KB: jQuery, Bootstrap,
validate, fileinput, labelauty, socket.io, app.js) is now the whole
- **Interview bundle split** — `bundle.min.js` (jQuery, Bootstrap,
validate, socket.io, app.js) is now the whole
remaining weight of a public interview page after the FontAwesome swap
(#19). Splitting it is a large refactor with every widget depending on
(#19) and upstream's labelauty removal (1.10.8). Splitting it is a large refactor with every widget depending on
it; measure with pagesize_check.sh before/after. Half a day+.

## Ship the fork to forms.jacobrakai.org

forms runs **stock** docassemble 1.10.7 + the NJForms pip package, not
forms runs **stock** docassemble 1.10.8 + the NJForms pip package, not
this fork (verified on the live interview head). The whole
`/usr/share/docassemble` tree, venv included, lives on the container
volume, so a new *image* is masked by the existing venv and changes
Expand Down Expand Up @@ -72,8 +72,8 @@ NJForms: `docker cp` the fork's `docassemble_base` and
- [ ] **Scheduled upstream sync**: weekly Action to fetch upstream
master, rebase jacob/maintained, force-push on green CI, open an
issue on conflict.
- [ ] **Watch upstream PR #983** (bool config): merged means dropping
commit 24b0275 on the next rebase.
- [x] **Watch upstream PR #983** (bool config): merged in upstream
1.10.8 (c1e3a98); commit 24b0275 dropped on the 1.10.8 rebase.
- [ ] **Upstream the clearer-error commit** (7315492): behavior-neutral,
answers upstream #981; small PR candidate.
- [ ] **Upstream the tar-slip fix** (`filter='data'` in
Expand Down
28 changes: 10 additions & 18 deletions bundle.sh
Original file line number Diff line number Diff line change
@@ -1,49 +1,41 @@
#! /bin/bash

SERVER=http://localhost
STATIC=docassemble_webapp/docassemble/webapp/static

file_changed=false
for css_file in app/app.css app/pygments.css; do
orig_file="${css_file/.css/.scss}"
if [[ docassemble_webapp/docassemble/webapp/static/${orig_file} -nt docassemble_webapp/docassemble/webapp/static/${css_file} ]]; then
/usr/bin/sass docassemble_webapp/docassemble/webapp/static/${orig_file} docassemble_webapp/docassemble/webapp/static/${css_file}
file_changed=true
fi
done
for min_file in app/app.min.css app/pygments.min.css bootstrap-slider/dist/css/bootstrap-slider.min.css bootstrap-combobox/css/bootstrap-combobox.min.css; do
orig_file="${min_file/.min/}"
if [[ docassemble_webapp/docassemble/webapp/static/${orig_file} -nt docassemble_webapp/docassemble/webapp/static/${min_file} ]]; then
/usr/bin/sass --style compressed docassemble_webapp/docassemble/webapp/static/${orig_file} docassemble_webapp/docassemble/webapp/static/${min_file}
file_changed=true
fi
done

for min_file in app/app.min.js app/config.min.js app/manage_api.min.js app/update_package.min.js app/updatingpackages.min.js app/pullplaygroundpacakge.min.js app/501.min.js app/train.min.js app/admin.min.js app/cm6.min.js app/monitor.min.js app/playground.min.js labelauty/source/jquery-labelauty.min.js bootstrap-combobox/js/bootstrap-combobox.min.js ; do
for min_file in app/app.min.js app/config.min.js app/manage_api.min.js app/update_package.min.js app/updatingpackages.min.js app/pullplaygroundpacakge.min.js app/501.min.js app/train.min.js app/admin.min.js app/cm6.min.js app/monitor.min.js app/playground.min.js bootstrap-combobox/js/bootstrap-combobox.min.js ; do
orig_file="${min_file/.min/}"
map_file=$(basename $min_file).map
if [[ docassemble_webapp/docassemble/webapp/static/${orig_file} -nt docassemble_webapp/docassemble/webapp/static/${min_file} ]]; then
uglifyjs docassemble_webapp/docassemble/webapp/static/${orig_file} --source-map "url='$map_file',includeSources" --output docassemble_webapp/docassemble/webapp/static/${min_file}
file_changed=true
fi
done
if [ "$file_changed" = true ]; then
echo "A file was modified. Install docassemble.webapp on ${SERVER}, re-run this script, and install again."
exit
fi

wget -q -O docassemble_webapp/docassemble/webapp/static/app/bundle.css ${SERVER}/bundle.css
cat ${STATIC}/bootstrap/css/bootstrap-icons.css ${STATIC}/bootstrap-combobox/css/bootstrap-combobox.css ${STATIC}/bootstrap-slider/dist/css/bootstrap-slider.css ${STATIC}/app/app.css > ${STATIC}/app/bundle.css
/usr/bin/sass --style compressed docassemble_webapp/docassemble/webapp/static/app/bundle.css docassemble_webapp/docassemble/webapp/static/app/bundle.min.css
wget -q -O docassemble_webapp/docassemble/webapp/static/app/playgroundbundle.css ${SERVER}/playgroundbundle.css
cat ${STATIC}/app/pygments.css ${STATIC}/bootstrap/css/bootstrap-icons.css > ${STATIC}/app/playgroundbundle.css
/usr/bin/sass --style compressed docassemble_webapp/docassemble/webapp/static/app/playgroundbundle.css docassemble_webapp/docassemble/webapp/static/app/playgroundbundle.min.css
wget -q -O docassemble_webapp/docassemble/webapp/static/app/bundle.js ${SERVER}/bundle.js
cat ${STATIC}/app/jquery.js ${STATIC}/app/jquery.validate.js ${STATIC}/app/additional-methods.js ${STATIC}/app/jquery.visible.js ${STATIC}/bootstrap/js/bootstrap.bundle.js ${STATIC}/bootstrap-slider/dist/bootstrap-slider.js ${STATIC}/app/app.js ${STATIC}/bootstrap-combobox/js/bootstrap-combobox.js ${STATIC}/app/socket.io.js ${STATIC}/app/signature_pad.umd.min.js > ${STATIC}/app/bundle.js
uglifyjs docassemble_webapp/docassemble/webapp/static/app/bundle.js --source-map "url='bundle.min.js.map',includeSources" --output docassemble_webapp/docassemble/webapp/static/app/bundle.min.js
wget -q -O docassemble_webapp/docassemble/webapp/static/app/monitorbundle.js ${SERVER}/monitorbundle.js
cat ${STATIC}/app/socket.io.js ${STATIC}/app/monitor.js > ${STATIC}/app/monitorbundle.js
uglifyjs docassemble_webapp/docassemble/webapp/static/app/monitorbundle.js --source-map "url='monitorbundle.min.js.map',includeSources" --output docassemble_webapp/docassemble/webapp/static/app/monitorbundle.min.js
wget -q -O docassemble_webapp/docassemble/webapp/static/app/bundlewrapjquery.js ${SERVER}/bundlewrapjquery.js
cat ${STATIC}/app/jquery.validate.js ${STATIC}/app/additional-methods.js ${STATIC}/app/jquery.visible.js ${STATIC}/bootstrap/js/bootstrap.bundle.js ${STATIC}/bootstrap-slider/dist/bootstrap-slider.js ${STATIC}/app/app.js ${STATIC}/bootstrap-combobox/js/bootstrap-combobox.js ${STATIC}/app/socket.io.js > ${STATIC}/app/bundlewrapjquery.js
uglifyjs docassemble_webapp/docassemble/webapp/static/app/bundlewrapjquery.js --source-map "url='bundlewrapjquery.min.js.map',includeSources" --output docassemble_webapp/docassemble/webapp/static/app/bundlewrapjquery.min.js
wget -q -O docassemble_webapp/docassemble/webapp/static/app/bundlenojquery.js ${SERVER}/bundlenojquery.js
cat ${STATIC}/app/jquery.validate.js ${STATIC}/app/additional-methods.js ${STATIC}/app/jquery.visible.js ${STATIC}/bootstrap/js/bootstrap.bundle.js ${STATIC}/bootstrap-slider/dist/bootstrap-slider.js ${STATIC}/app/app.js ${STATIC}/bootstrap-combobox/js/bootstrap-combobox.js ${STATIC}/app/socket.io.js > ${STATIC}/app/bundlenojquery.js
uglifyjs docassemble_webapp/docassemble/webapp/static/app/bundlenojquery.js --source-map "url='bundlenojquery.min.js.map',includeSources" --output docassemble_webapp/docassemble/webapp/static/app/bundlenojquery.min.js
wget -q -O docassemble_webapp/docassemble/webapp/static/app/playgroundbundle.js ${SERVER}/playgroundbundle.js
cat ${STATIC}/areyousure/jquery.are-you-sure.js ${STATIC}/app/cm6.js ${STATIC}/app/playground.js > ${STATIC}/app/playgroundbundle.js
uglifyjs docassemble_webapp/docassemble/webapp/static/app/playgroundbundle.js --source-map "url='playgroundbundle.min.js.map',includeSources" --output docassemble_webapp/docassemble/webapp/static/app/playgroundbundle.min.js
wget -q -O docassemble_webapp/docassemble/webapp/static/app/adminbundle.js ${SERVER}/adminbundle.js
cat ${STATIC}/app/jquery.js ${STATIC}/bootstrap/js/bootstrap.bundle.js ${STATIC}/app/admin.js > ${STATIC}/app/adminbundle.js
uglifyjs docassemble_webapp/docassemble/webapp/static/app/adminbundle.js --source-map "url='adminbundle.min.js.map',includeSources" --output docassemble_webapp/docassemble/webapp/static/app/adminbundle.min.js
2 changes: 1 addition & 1 deletion docassemble_base/docassemble/base/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.10.7"
__version__ = "1.10.8"
9 changes: 4 additions & 5 deletions docassemble_base/docassemble/base/data/sources/base-words.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"Add another": Null
"Add a user": Null
"Add Email": Null
"Additional fields have appeared on the screen.": Null
"Add": Null
"Add Privilege": Null
"Add User": Null
Expand Down Expand Up @@ -128,7 +129,6 @@
"Central African Republic": Null
"Chad": Null
"Changed name of interview": Null
"Change": Null
"Change password": Null
"Change Password": Null
"Change username": Null
Expand Down Expand Up @@ -213,6 +213,7 @@
"Deleted interview": Null
"Deleted interviews": Null
"(Deleted)": Null
"Deleted": Null
"Deleted package": Null
"delete my account": Null
"Delete": Null
Expand Down Expand Up @@ -778,7 +779,6 @@
"Possibly not defined": Null
"Possibly not used": Null
"Prediction": Null
"Press one of the following buttons:": Null
"Press the Publish button to publish the package on PyPI.": Null
"Preview": Null
"Privilege": Null
Expand Down Expand Up @@ -833,7 +833,7 @@
"Registration is invite only": Null
"remaining on disk": Null
"Remember me": Null
"Remove": Null
"Removed": Null
"Rename": Null
"Rename project": Null
"Reorder by moving down": Null
Expand Down Expand Up @@ -892,7 +892,6 @@
"Security Method": Null
"Select a package": Null
"Select a value between": Null
"Select file": Null
"Select...": Null
"Select one": Null
"Select the folder from your OneDrive that you want to be synchronized with the Playground.": Null
Expand Down Expand Up @@ -946,6 +945,7 @@
"Singapore": Null
"Sint Maarten (Dutch part)": Null
"skip": Null
"Skip to main content": Null
"Slovakia": Null
"Slovenia": Null
"SMS": Null
Expand Down Expand Up @@ -1001,7 +1001,6 @@
"Telephone assistance": Null
"Template files": Null
"Templates": Null
"(term definition)": Null
"Terms used in this question:": Null
"Terms used:": Null
"Thailand": Null
Expand Down
7 changes: 2 additions & 5 deletions docassemble_base/docassemble/base/filter/html.py
Original file line number Diff line number Diff line change
Expand Up @@ -670,9 +670,7 @@ def add_terms_mako(termname, terms, status=None, question=None):
lower_termname = re.sub(r'\s+', ' ', str(termname).lower(), re.DOTALL)
if lower_termname in terms:
term_as_text = to_text(markdown_to_html(str(termname), trim=False, do_terms=False, status=status, question=question), None, None)
return '<a tabindex="0" class="daterm" aria-label=' + noquote(term_as_text + ' ' + word("(term definition)")) +\
' data-bs-toggle="popover" data-bs-container="body" data-bs-placement="bottom" data-bs-content=' +\
noquote(markdown_to_html(terms[lower_termname]['definition'].text({}),
return '<a tabindex="0" class="daterm" role="button" data-bs-toggle="popover" data-bs-trigger="focus" title="' + term_as_text + '" data-bs-container="body" data-bs-placement="bottom" data-bs-content=' + noquote(markdown_to_html(terms[lower_termname]['definition'].text({}),
trim=True,
default_image_width='100%',
do_terms=False,
Expand All @@ -691,8 +689,7 @@ def add_terms(termname, terms, label=None, status=None, question=None):
lower_termname = re.sub(r'\s+', ' ', termname.lower(), re.DOTALL)
if lower_termname in terms:
term_as_text = to_text(markdown_to_html(label, trim=False, do_terms=False, status=status, question=question), None, None)
return '<a tabindex="0" class="daterm" aria-label=' + noquote(term_as_text + ' ' + word("(term definition)")) +\
' data-bs-toggle="popover" data-bs-container="body" data-bs-placement="bottom" data-bs-content=' +\
return '<a tabindex="0" class="daterm" role="button" data-bs-toggle="popover" data-bs-trigger="focus" title="' + term_as_text + '" data-bs-container="body" data-bs-placement="bottom" data-bs-content=' +\
noquote(markdown_to_html(terms[lower_termname]['definition'],
trim=True,
default_image_width='100%',
Expand Down
Loading
Loading