Skip to content
Closed
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
  •  
  •  
  •  
4 changes: 1 addition & 3 deletions .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 1.9.11
current_version = 1.10.1
commit = True
tag = True

Expand All @@ -21,8 +21,6 @@ replace = {new_version}'

[bumpversion:file:docassemble_webapp/docassemble/webapp/__init__.py]

[bumpversion:file:docassemble_webapp/docassemble/webapp/setup.py]

[bumpversion:file:Docker/VERSION]

[bumpversion:file:docassemble_webapp/docassemble/webapp/data/VERSION.txt]
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ audit.py
conflict_check.yml
publish.sh
pypi-publish.sh
pypi-publish-dev.sh
newversion.sh
json_files
posttoslack.sh
Expand All @@ -65,10 +66,16 @@ settings.json
.dir-locals.el
.flake8
mypy.ini
docassemble_base/mypy.ini
docassemble_demo/mypy.ini
docassemble_webapp/mypy.ini
stylelint.config.js
.stylelintrc.json
.sass-cache/
CLAUDE.md
.claude/
.claudeignore
__pycache__
__pycache__
pyproject.toml
autoimport.py
runpylint.py
52 changes: 52 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,57 @@
# Change Log

## [1.10.1] - 2026-06-29

### Fixed

- Errors related to add-on package installation.

## [1.10.0] - 2026-06-28

### Added

- The `enable api`, `enable email server`, `enable object storage`,
`enable daglobal`, `enable json storage`, `enable sms interface`,
`enable faxing`, and `enable tts` Configuration directives.
- The `pip trusted host` Configuration directive.

### Changed

- The internal organization of the source code has changed
significantly. Documented functionality has not changed, but if your
code imports undocumented names, you may find that the name has
moved to another module. Testing your interviews on a development
server is recommended before upgrading a production server.
- `pluggy` is now used to give `docassemble.base` access to
functionality in `docassemble.webapp`.
- Flask blueprints are now used for features of
`docassemble.webapp`. Configuration directives like `enable
training` and `allow log viewing` will now prevent the importing of
the code underlying the disabled features. Turning off these
features can decrease uWSGI memory usage by 29%.
- SQLAlchemy models now inherit from `sqlalchemy.org.DeclarativeBase`
rather than `db.model`.
- Celery tasks are now invoked using signatures.
- Added a dependency on `pyopenssl` not because it is needed, but
because a version conflict with `cryptography` will prevent the
web application from starting.

### Fixed

- Issue with `list collect` and `input type: hidden`.

## [1.9.13] - 2026-06-03

### Fixed

- Issue with converting fillable PDFs to PDF/A.

## [1.9.12] - 2026-05-11

### Fixed

- Issue with `Flask.SocketIO`.

## [1.9.11] - 2026-05-08

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion Docker/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.9.11
1.10.1
10 changes: 10 additions & 0 deletions Docker/config/config.yml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,13 @@ gotenberg:
password: {{GOTENBERGPASSWORD}}
javascript defer: True
use nginx to serve files: {{USENGINXTOSERVEFILES}}
enable api: True
enable daglobal: True
enable email server: True
enable faxing: True
enable json storage: True
enable monitor: True
enable object storage: True
enable sms interface: True
enable training: True
enable tts: True
20 changes: 11 additions & 9 deletions Docker/cron/docassemble-cron-daily.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,17 @@ if [[ $CONTAINERROLE =~ .*:(all):.* ]] && [ "${USEHTTPS:-false}" == "true" ] &&
cp /tmp/letsencrypt.tar.gz "${DA_ROOT}/backup/letsencrypt.tar.gz"
fi
rm -f /tmp/letsencrypt.tar.gz
if [ ! -f /etc/ssl/docassemble/exim.crt ] && [ ! -f /etc/ssl/docassemble/exim.key ]; then
cp "/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem" /etc/exim4/exim.crt
cp "/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem" /etc/exim4/exim.key
chown root:Debian-exim /etc/exim4/exim.crt
chown root:Debian-exim /etc/exim4/exim.key
chmod 640 /etc/exim4/exim.crt
chmod 640 /etc/exim4/exim.key
supervisorctl ${DASUPERVISOROPTS}--serverurl http://localhost:9001 stop exim4
supervisorctl ${DASUPERVISOROPTS}--serverurl http://localhost:9001 start exim4
if [ "$ENABLEEMAILSERVER" == "true" ]; then
if [ ! -f /etc/ssl/docassemble/exim.crt ] && [ ! -f /etc/ssl/docassemble/exim.key ]; then
cp "/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem" /etc/exim4/exim.crt
cp "/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem" /etc/exim4/exim.key
chown root:Debian-exim /etc/exim4/exim.crt
chown root:Debian-exim /etc/exim4/exim.key
chmod 640 /etc/exim4/exim.crt
chmod 640 /etc/exim4/exim.key
supervisorctl ${DASUPERVISOROPTS}--serverurl http://localhost:9001 stop exim4
supervisorctl ${DASUPERVISOROPTS}--serverurl http://localhost:9001 start exim4
fi
fi
fi

Expand Down
178 changes: 100 additions & 78 deletions Docker/initialize.sh
Original file line number Diff line number Diff line change
Expand Up @@ -987,6 +987,14 @@ else
su -c "source \"${DA_ACTIVATE}\" && pip config unset global.extra-index-url" www-data &> /dev/null
fi

echo "initialize: Checking to see if pip trusted host is used" >&2

if [ "${PIPTRUSTEDHOST:-null}" != "null" ]; then
su -c "source \"${DA_ACTIVATE}\" && pip config set global.trusted-host \"${PIPTRUSTEDHOST}\"" www-data
else
su -c "source \"${DA_ACTIVATE}\" && pip config set global.trusted-host github.com" www-data &> /dev/null
fi

if [ -n "$PYTHONPACKAGES" ]; then
echo "initialize: Installing Python packages specified in the Configuration" >&2
for PACKAGE in "${PYTHONPACKAGES[@]}"; do
Expand Down Expand Up @@ -1018,6 +1026,14 @@ else
pip config unset global.extra-index-url &> /dev/null
fi

echo "initialize: Checking to see if pip trusted host is used" >&2

if [ "${PIPTRUSTEDHOST:-null}" != "null" ]; then
pip config set global.trusted-host "${PIPTRUSTEDHOST}"
else
pip config set global.trusted-host "github.com" &> /dev/null
fi

if [ -n "$PYTHONPACKAGES" ]; then
echo "initialize: Installing Python packages specified in the Configuration" >&2
for PACKAGE in "${PYTHONPACKAGES[@]}"; do
Expand Down Expand Up @@ -1339,8 +1355,10 @@ if [ "${DAWEBSERVER:-nginx}" = "none" ]; then
${SUPERVISORCMD} stop nascent &> /dev/null
NASCENTRUNNING=false;
if [[ $CONTAINERROLE =~ .*:(all|web):.* ]]; then
echo "initialize: Starting websockets" >&2
${SUPERVISORCMD} start websockets
if [ "${ENABLEMONITOR:-true}" = "true" ]; then
echo "initialize: Starting websockets" >&2
${SUPERVISORCMD} start websockets
fi
echo "initialize: Starting uwsgi" >&2
${SUPERVISORCMD} start uwsgi
fi
Expand Down Expand Up @@ -1427,8 +1445,10 @@ if [ "${DAWEBSERVER:-nginx}" = "nginx" ]; then
fi
fi
if [[ $CONTAINERROLE =~ .*:(all|web):.* ]]; then
echo "initialize: Starting websockets" >&2
${SUPERVISORCMD} start websockets
if [ "${ENABLEMONITOR:-true}" = "true" ]; then
echo "initialize: Starting websockets" >&2
${SUPERVISORCMD} start websockets
fi
echo "initialize: Starting uwsgi" >&2
${SUPERVISORCMD} start uwsgi
fi
Expand Down Expand Up @@ -1575,7 +1595,7 @@ if [ "${DAWEBSERVER:-nginx}" = "apache" ]; then
a2ensite docassemble-log
fi

if [[ $CONTAINERROLE =~ .*:(all|web):.* ]]; then
if [[ $CONTAINERROLE =~ .*:(all|web):.* ]] && [ "${ENABLEMONITOR:-true}" = "true" ]; then
echo "initialize: Starting websockets" >&2
${SUPERVISORCMD} start websockets
fi
Expand Down Expand Up @@ -1628,81 +1648,83 @@ if [ "$CRONRUNNING" == "false" ]; then
${SUPERVISORCMD} start cron
fi

if exiwhat 2> /dev/null | grep -q listening; then
EXIM4RUNNING=true
else
EXIM4RUNNING=false
fi
if [ "${ENABLEEMAILSERVER:-true}" == "true" ]; then
if exiwhat 2> /dev/null | grep -q listening; then
EXIM4RUNNING=true
else
EXIM4RUNNING=false
fi

if [ "$EXIM4RUNNING" == "false" ] && [[ $CONTAINERROLE =~ .*:(all|mail):.* && ($DBTYPE = "postgresql" || $DBTYPE = "mysql") ]]; then
echo "initialize: Starting exim4" >&2
if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then
if [ -f /usr/share/docassemble/config/exim4-update ] && [ "${DAHOSTNAME}" != "localhost" ]; then
sed "s/dc_other_hostnames='\**'/dc_other_hostnames='${DAHOSTNAME}'/" /usr/share/docassemble/config/exim4-update > /tmp/temp-exim4-update
if [ ! -f /etc/exim4/update-exim4.conf.conf ] || ! cmp -s /tmp/temp-exim4-update /etc/exim4/update-exim4.conf.conf; then
cp /tmp/temp-exim4-update /etc/exim4/update-exim4.conf.conf
update-exim4.conf
fi
rm -f /tmp/temp-exim4-update
fi
rm -f /etc/cron.daily/exim4-base
ln -s /usr/share/docassemble/cron/exim4-base /etc/cron.daily/exim4-base
if [ "${DBTYPE}" = "postgresql" ]; then
cp "${DA_ROOT}/config/exim4-router-postgresql" /etc/exim4/dbrouter
if [ "${DBHOST:-null}" != "null" ]; then
echo -n 'hide pgsql_servers = '${DBHOST} > /etc/exim4/dbinfo
else
echo -n 'hide pgsql_servers = localhost' > /etc/exim4/dbinfo
fi
if [ "${DBPORT:-null}" != "null" ]; then
echo -n '::'${DBPORT} >> /etc/exim4/dbinfo
fi
echo '/'${DBNAME}'/'${DBUSER}'/'${DBPASSWORD} >> /etc/exim4/dbinfo
fi
if [ "$DBTYPE" = "mysql" ]; then
cp "${DA_ROOT}/config/exim4-router-mysql" /etc/exim4/dbrouter
if [ "${DBHOST:-null}" != "null" ]; then
echo -n 'hide mysql_servers = '${DBHOST} > /etc/exim4/dbinfo
else
echo -n 'hide mysql_servers = localhost' > /etc/exim4/dbinfo
fi
if [ "${DBPORT:-null}" != "null" ]; then
echo -n '::'${DBPORT} >> /etc/exim4/dbinfo
fi
echo '/'${DBNAME}'/'${DBUSER}'/'${DBPASSWORD} >> /etc/exim4/dbinfo
fi
if [ "${DBTYPE}" = "postgresql" ]; then
echo 'DAQUERY = select short from '${DBTABLEPREFIX}"shortener where short='\${quote_pgsql:\$local_part}'" >> /etc/exim4/dbinfo
fi
if [ "${DBTYPE}" = "mysql" ]; then
echo 'DAQUERY = select short from '${DBTABLEPREFIX}"shortener where short='\${quote_mysql:\$local_part}'" >> /etc/exim4/dbinfo
fi
if [ -f /etc/ssl/docassemble/exim.crt ] && [ -f /etc/ssl/docassemble/exim.key ]; then
cp /etc/ssl/docassemble/exim.crt /etc/exim4/exim.crt
cp /etc/ssl/docassemble/exim.key /etc/exim4/exim.key
chown root:Debian-exim /etc/exim4/exim.crt
chown root:Debian-exim /etc/exim4/exim.key
chmod 640 /etc/exim4/exim.crt
chmod 640 /etc/exim4/exim.key
echo 'MAIN_TLS_ENABLE = yes' >> /etc/exim4/dbinfo
elif [[ $CONTAINERROLE =~ .*:(all|web):.* ]] && [ "${USELETSENCRYPT:-false}" == "true" ] && [ -f "/etc/letsencrypt/live/${DAHOSTNAME}/cert.pem" ] && [ -f "/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem" ]; then
cp "/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem" /etc/exim4/exim.crt
cp "/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem" /etc/exim4/exim.key
chown root:Debian-exim /etc/exim4/exim.crt
chown root:Debian-exim /etc/exim4/exim.key
chmod 640 /etc/exim4/exim.crt
chmod 640 /etc/exim4/exim.key
echo 'MAIN_TLS_ENABLE = yes' >> /etc/exim4/dbinfo
else
echo 'MAIN_TLS_ENABLE = no' >> /etc/exim4/dbinfo
fi
chmod og-rwx /etc/exim4/dbinfo
if [ "$EXIM4RUNNING" == "false" ] && [[ $CONTAINERROLE =~ .*:(all|mail):.* && ($DBTYPE = "postgresql" || $DBTYPE = "mysql") ]]; then
echo "initialize: Starting exim4" >&2
if [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then
if [ -f /usr/share/docassemble/config/exim4-update ] && [ "${DAHOSTNAME}" != "localhost" ]; then
sed "s/dc_other_hostnames='\**'/dc_other_hostnames='${DAHOSTNAME}'/" /usr/share/docassemble/config/exim4-update > /tmp/temp-exim4-update
if [ ! -f /etc/exim4/update-exim4.conf.conf ] || ! cmp -s /tmp/temp-exim4-update /etc/exim4/update-exim4.conf.conf; then
cp /tmp/temp-exim4-update /etc/exim4/update-exim4.conf.conf
update-exim4.conf
fi
rm -f /tmp/temp-exim4-update
fi
rm -f /etc/cron.daily/exim4-base
ln -s /usr/share/docassemble/cron/exim4-base /etc/cron.daily/exim4-base
if [ "${DBTYPE}" = "postgresql" ]; then
cp "${DA_ROOT}/config/exim4-router-postgresql" /etc/exim4/dbrouter
if [ "${DBHOST:-null}" != "null" ]; then
echo -n 'hide pgsql_servers = '${DBHOST} > /etc/exim4/dbinfo
else
echo -n 'hide pgsql_servers = localhost' > /etc/exim4/dbinfo
fi
if [ "${DBPORT:-null}" != "null" ]; then
echo -n '::'${DBPORT} >> /etc/exim4/dbinfo
fi
echo '/'${DBNAME}'/'${DBUSER}'/'${DBPASSWORD} >> /etc/exim4/dbinfo
fi
if [ "$DBTYPE" = "mysql" ]; then
cp "${DA_ROOT}/config/exim4-router-mysql" /etc/exim4/dbrouter
if [ "${DBHOST:-null}" != "null" ]; then
echo -n 'hide mysql_servers = '${DBHOST} > /etc/exim4/dbinfo
else
echo -n 'hide mysql_servers = localhost' > /etc/exim4/dbinfo
fi
if [ "${DBPORT:-null}" != "null" ]; then
echo -n '::'${DBPORT} >> /etc/exim4/dbinfo
fi
echo '/'${DBNAME}'/'${DBUSER}'/'${DBPASSWORD} >> /etc/exim4/dbinfo
fi
if [ "${DBTYPE}" = "postgresql" ]; then
echo 'DAQUERY = select short from '${DBTABLEPREFIX}"shortener where short='\${quote_pgsql:\$local_part}'" >> /etc/exim4/dbinfo
fi
if [ "${DBTYPE}" = "mysql" ]; then
echo 'DAQUERY = select short from '${DBTABLEPREFIX}"shortener where short='\${quote_mysql:\$local_part}'" >> /etc/exim4/dbinfo
fi
if [ -f /etc/ssl/docassemble/exim.crt ] && [ -f /etc/ssl/docassemble/exim.key ]; then
cp /etc/ssl/docassemble/exim.crt /etc/exim4/exim.crt
cp /etc/ssl/docassemble/exim.key /etc/exim4/exim.key
chown root:Debian-exim /etc/exim4/exim.crt
chown root:Debian-exim /etc/exim4/exim.key
chmod 640 /etc/exim4/exim.crt
chmod 640 /etc/exim4/exim.key
echo 'MAIN_TLS_ENABLE = yes' >> /etc/exim4/dbinfo
elif [[ $CONTAINERROLE =~ .*:(all|web):.* ]] && [ "${USELETSENCRYPT:-false}" == "true" ] && [ -f "/etc/letsencrypt/live/${DAHOSTNAME}/cert.pem" ] && [ -f "/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem" ]; then
cp "/etc/letsencrypt/live/${DAHOSTNAME}/fullchain.pem" /etc/exim4/exim.crt
cp "/etc/letsencrypt/live/${DAHOSTNAME}/privkey.pem" /etc/exim4/exim.key
chown root:Debian-exim /etc/exim4/exim.crt
chown root:Debian-exim /etc/exim4/exim.key
chmod 640 /etc/exim4/exim.crt
chmod 640 /etc/exim4/exim.key
echo 'MAIN_TLS_ENABLE = yes' >> /etc/exim4/dbinfo
else
echo 'MAIN_TLS_ENABLE = no' >> /etc/exim4/dbinfo
fi
chmod og-rwx /etc/exim4/dbinfo
fi
${SUPERVISORCMD} start exim4
elif [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then
echo "initialize: Disabling exim4 cron" >&2
rm -f /etc/cron.daily/exim4-base
ln -s /usr/share/docassemble/cron/donothing /etc/cron.daily/exim4-base
fi
${SUPERVISORCMD} start exim4
elif [ "${DAREADONLYFILESYSTEM:-false}" == "false" ]; then
echo "initialize: Disabling exim4 cron" >&2
rm -f /etc/cron.daily/exim4-base
ln -s /usr/share/docassemble/cron/donothing /etc/cron.daily/exim4-base
fi

if [[ $CONTAINERROLE =~ .*:(log):.* ]] || [ "$OTHERLOGSERVER" == "true" ]; then
Expand Down
3 changes: 0 additions & 3 deletions Docker/pip.conf
Original file line number Diff line number Diff line change
@@ -1,5 +1,2 @@
[global]
disable-pip-version-check = True
[install]
trusted-host =
github.com
8 changes: 7 additions & 1 deletion Docker/reset.sh
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ update_pip_config(){
else
pip config unset global.extra-index-url &> /dev/null
fi

if [ "${PIPTRUSTEDHOST:-null}" != "null" ]; then
pip config set global.trusted-host "${PIPTRUSTEDHOST}"
else
pip config set global.trusted-host "github.com" &> /dev/null
fi
}
restart_websockets() {
echo "`date` stopping websockets" >&2
Expand Down Expand Up @@ -108,7 +114,7 @@ if [ "${DAALLOWUPDATES:-true}" == "true" ]; then
update_pip_config &
fi

if [[ $CONTAINERROLE =~ .*:(all|web):.* ]]; then
if [[ $CONTAINERROLE =~ .*:(all|web):.* ]] && [ "${ENABLEMONITOR:-true}" = "true" ]; then
restart_websockets &
fi

Expand Down
Loading
Loading