Trenton H
03ac4aed7e
Chore: Move the cross-app test helpers into the shared layer and add a progress fixture ( #14221 )
...
Test modules in paperless, paperless_mail and documents imported filesystem assertions, the migration test base, the retry helper and the streaming-response reader out of documents/tests/utils.py, which kept each app's tests coupled to another app's test package.
They now live in paperless_testing, and the progress manager fake is renamed FakeProgressManager and now subclasses the real ProgressManager, overriding only the transport, so the payload it records is built by the production code. The twenty places that patched documents.tasks.ProgressManager by hand now use a fake_progress_manager fixture.
2026-09-22 08:02:17 -07:00
Trenton H
cb85441c2f
Chore: Decrease backend test suite time (a little) ( #14213 )
...
* Chore: Speed up test setup by hashing passwords with MD5 and batching index writes
Don't use Django's default PBKDF2, about 600 ms per use and 110 uses across the suite. Switches to MD5 instead.
Also fixes a test that didn't batch update the search index
* Chore: Stop the invalid webhook params test from waiting on a Celery broker
test_workflow_webhook_action_url_invalid_params_headers left send_webhook.apply_async unpatched, so it tried to actually enqueu and waited for the timeout.
2026-09-21 20:17:40 +00:00
Trenton H
f502cd5e34
Chore: Add shared helpers for granting test permissions and use them ( #14200 )
2026-09-21 10:57:14 -07:00
Trenton H
99ce6b5db3
Chore: Share the API client fixtures and build test users cheaply ( #14199 )
2026-09-21 10:57:14 -07:00
Trenton H
f440e8d33c
Chore: Move unittest directory setup onto the shared fixture ( #14172 )
...
The unittest side of the suite built its temp directory tree with
tempfile.mkdtemp and a manually enabled override_settings, cleaned up only if
tearDown ran. That is now gone. DirectoriesMixin lives alongside the layout it
bridges and does nothing but hand the paperless_dirs fixture to TestCase
subclasses as self.dirs, so both halves of the suite get the same twelve
settings, the same directory shapes and cleanup owned by tmp_path.
The mixin moves to paperless_testing.dirs rather than staying in the documents
test utilities, because modules in paperless and paperless_mail import it
across the app boundary. The thirty-eight consuming modules change only their
import line; self.dirs.scratch_dir and its siblings keep working.
2026-09-21 10:57:12 -07:00
shamoon
e8b7a98d3e
Fix: better catch email workflow placeholder parsing errors ( #14129 )
2026-09-15 16:44:12 -07:00
shamoon
937feb1bef
Change: skip documents with empty content in apply AI suggestions WF ( #13985 )
2026-09-07 21:56:37 +00:00
dependabot[bot] and Trenton Holmes
f287a4cb8c
Chore(deps): Bump the utilities-minor group across 1 directory with 11 updates ( #13988 )
...
* Chore(deps): Bump the utilities-minor group across 1 directory with 11 updates
Bumps the utilities-minor group with 11 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [django-guardian](https://github.com/django-guardian/django-guardian ) | `3.3.3` | `3.4.0` |
| [django-treenode](https://github.com/fabiocaccamo/django-treenode ) | `0.24.0` | `0.25.0` |
| [drf-spectacular-sidecar](https://github.com/tfranzel/drf-spectacular-sidecar ) | `2026.7.1` | `2026.8.1` |
| [imap-tools](https://github.com/ikvk/imap_tools ) | `1.14.0` | `1.15.0` |
| [ocrmypdf](https://github.com/ocrmypdf/OCRmyPDF ) | `17.10.0` | `17.11.0` |
| [prek](https://github.com/j178/prek ) | `0.4.11` | `0.5.0` |
| [faker](https://github.com/joke2k/faker ) | `40.36.0` | `40.37.0` |
| [pytest-django](https://github.com/pytest-dev/pytest-django ) | `4.12.0` | `4.14.0` |
| [pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures ) | `16.4` | `16.6` |
| [time-machine](https://github.com/adamchainz/time-machine ) | `3.2.0` | `3.5.0` |
| [types-pygments](https://github.com/python/typeshed ) | `2.20.0.20260408` | `2.21.0.20260819` |
Updates `django-guardian` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/django-guardian/django-guardian/releases )
- [Commits](https://github.com/django-guardian/django-guardian/compare/3.3.3...3.4.0 )
Updates `django-treenode` from 0.24.0 to 0.25.0
- [Release notes](https://github.com/fabiocaccamo/django-treenode/releases )
- [Changelog](https://github.com/fabiocaccamo/django-treenode/blob/main/CHANGELOG.md )
- [Commits](https://github.com/fabiocaccamo/django-treenode/compare/0.24.0...0.25.0 )
Updates `drf-spectacular-sidecar` from 2026.7.1 to 2026.8.1
- [Commits](https://github.com/tfranzel/drf-spectacular-sidecar/compare/2026.7.1...2026.8.1 )
Updates `imap-tools` from 1.14.0 to 1.15.0
- [Release notes](https://github.com/ikvk/imap_tools/releases )
- [Changelog](https://github.com/ikvk/imap_tools/blob/master/docs/release_notes.rst )
- [Commits](https://github.com/ikvk/imap_tools/compare/v1.14.0...v1.15.0 )
Updates `ocrmypdf` from 17.10.0 to 17.11.0
- [Release notes](https://github.com/ocrmypdf/OCRmyPDF/releases )
- [Commits](https://github.com/ocrmypdf/OCRmyPDF/compare/v17.10.0...v17.11.0 )
Updates `prek` from 0.4.11 to 0.5.0
- [Release notes](https://github.com/j178/prek/releases )
- [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md )
- [Commits](https://github.com/j178/prek/compare/v0.4.11...v0.5.0 )
Updates `faker` from 40.36.0 to 40.37.0
- [Release notes](https://github.com/joke2k/faker/releases )
- [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md )
- [Commits](https://github.com/joke2k/faker/compare/v40.36.0...v40.37.0 )
Updates `pytest-django` from 4.12.0 to 4.14.0
- [Release notes](https://github.com/pytest-dev/pytest-django/releases )
- [Changelog](https://github.com/pytest-dev/pytest-django/blob/main/docs/changelog.rst )
- [Commits](https://github.com/pytest-dev/pytest-django/compare/v4.12.0...v4.14.0 )
Updates `pytest-rerunfailures` from 16.4 to 16.6
- [Changelog](https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst )
- [Commits](https://github.com/pytest-dev/pytest-rerunfailures/compare/16.4...16.6 )
Updates `time-machine` from 3.2.0 to 3.5.0
- [Changelog](https://github.com/adamchainz/time-machine/blob/main/docs/changelog.rst )
- [Commits](https://github.com/adamchainz/time-machine/compare/3.2.0...3.5.0 )
Updates `types-pygments` from 2.20.0.20260408 to 2.21.0.20260819
- [Commits](https://github.com/python/typeshed/commits )
---
updated-dependencies:
- dependency-name: django-guardian
dependency-version: 3.4.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: django-treenode
dependency-version: 0.25.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: drf-spectacular-sidecar
dependency-version: 2026.8.1
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: faker
dependency-version: 40.37.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: imap-tools
dependency-version: 1.15.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: ocrmypdf
dependency-version: 17.11.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: prek
dependency-version: 0.5.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: pytest-django
dependency-version: 4.14.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: pytest-rerunfailures
dependency-version: '16.6'
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: time-machine
dependency-version: 3.5.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: utilities-minor
- dependency-name: types-pygments
dependency-version: 2.21.0.20260819
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: utilities-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
* Handles pytest-django
* Formatting
---------
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Trenton Holmes <797416+stumpylog@users.noreply.github.com >
2026-09-07 20:13:15 +00:00
shamoon
c5765a50a1
Fix: ensure apply ai suggestions always runs after document created ( #13940 )
2026-09-02 16:12:49 +00:00
shamoon
406bc1a233
Fix: defer add_nested_tags in ai workflow to avoid losing unsaved changes
2026-08-26 14:18:40 -07:00
shamoon
549afde1fd
Enhancement: Apply AI suggestions workflow action ( #13639 )
2026-08-26 16:41:21 +00:00
shamoon
b90ccf910f
Finally, the remote ocr workflow ( #13637 )
...
* Ok! Backend stuff for the remote ocr workflow
* Frotnend workflow stuff
* And docs
* Fix dynamic action fields thing
* Actually, fix the action dropdown thing
* Fix this validation thing, and we have to check existing actions
* Fix migration
2026-08-24 14:43:05 -07:00
shamoon
855669ddf9
Fix: fixes for workflow assign custom field values ( #13630 )
2026-08-10 07:38:07 -07:00
Trenton H
2b784e709b
Fix: prevent tag assignment from reverting other pending workflow assignments ( #13178 )
...
apply_assignment_to_document() mutated tags directly on the shared document instance via add_nested_tags(), whose m2m_changed signal triggers update_filename_and_move_files() -> instance.refresh_from_db(), discarding any not-yet-saved fields (e.g. storage_path) staged by an earlier-ordered action in the same workflow. Apply tag changes to a freshly-fetched instance instead, matching the pattern already used in apply_removal_to_document().
2026-07-20 08:22:30 -07:00
shamoon
f244442c65
Fixhancement: dont assign empty title in workflow with broken template ( #13112 )
2026-07-09 08:35:05 -07:00
Trenton H and shamoon
bd86dca57e
Fix: Password removal source file location ( #12830 )
...
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com >
2026-05-19 13:52:04 -07:00
Trenton H
ff3360310b
Fix: Defer password removal workflow action until the file is in place ( #12814 )
2026-05-16 17:14:37 -07:00
Trenton H
e2ad14f9ca
Fix: workflow password removal didn't handle lists from the DB ( #12716 )
2026-05-05 12:52:34 -07:00
Trenton H
14fe520319
Chore: Update typing and baselines again ( #12641 )
...
a
2026-04-28 09:28:05 -07:00
shamoon
ff95512b9a
Fix: apply tag changes directly to document in db ( #12664 )
2026-04-28 08:18:40 -07:00
Trenton H
fbf4e32646
Chore: Converts all call sites and test asserts to use apply_async and headers ( #12591 )
2026-04-20 11:40:04 -07:00
shamoon
8f036c9521
Merge branch 'main' into dev
...
# Conflicts:
# docs/usage.md
# src/documents/signals/handlers.py
# src/documents/tests/test_api_documents.py
# src/documents/views.py
2026-04-14 15:11:23 -07:00
aed9abe48c
Feature: Replace Whoosh with tantivy search backend ( #12471 )
...
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com >
Co-authored-by: Antoine Mérino <3023499+Merinorus@users.noreply.github.com >
2026-04-02 12:38:22 -07:00
shamoon
2f5bcdf66e
Fix: dont defer tag change application in workflows ( #12478 )
2026-04-02 11:54:37 -07:00
shamoon
0f84af27d0
Merge branch 'main' into dev
...
# Conflicts:
# docs/setup.md
# src-ui/src/main.ts
# src/documents/tests/test_api_bulk_edit.py
# src/documents/tests/test_api_custom_fields.py
# src/documents/tests/test_api_search.py
# src/documents/tests/test_api_status.py
# src/documents/tests/test_workflows.py
# src/paperless_mail/tests/test_api.py
2026-03-21 02:12:19 -07:00
Trenton H and Claude Sonnet 4.6
0f7c02de5e
Fix: test: add regression test for workflow save clobbering filename ( #12390 )
...
Add test_workflow_document_updated_does_not_overwrite_filename to
verify that run_workflows (DOCUMENT_UPDATED path) does not revert a
DB filename that was updated by a concurrent bulk_update_documents
task's update_filename_and_move_files call.
The test replicates the race window by:
- Updating the DB filename directly (simulating BUD-1 completing)
- Mocking refresh_from_db so the stale in-memory filename persists
- Asserting the DB filename is not clobbered after run_workflows
Relates to: https://github.com/paperless-ngx/paperless-ngx/issues/12386
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 13:31:09 -07:00
shamoon
48cd1cce6a
Merge branch 'main' into dev
2026-03-15 18:50:42 -07:00
shamoon
60319c6d37
Fix: prevent stale db filename during workflow actions ( #12289 )
2026-03-09 19:32:46 -07:00
Trenton H
1e21bcd26e
Breaking: Drop support for Python 3.10 ( #12234 )
2026-03-04 15:03:33 -08:00
shamoon
299dac21ee
Enhancement: “live” document updates ( #12141 )
2026-03-04 00:27:07 +00:00
shamoon
96ac7b2336
Tweak: Ignore version docs for workflows ( #12217 )
2026-03-02 08:21:14 -08:00
Jan Kleine and shamoon
c4ea332c61
Feature: move to trash action for workflows ( #11176 )
...
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com >
2026-02-23 16:42:50 -08:00
shamoon
e45fca475a
Feature: password removal workflow action ( #11665 )
2026-02-03 17:10:07 +00:00
Sebastian Steinbeißer
3b5ffbf9fa
Chore(mypy): Annotate None returns for typing improvements ( #11213 )
2026-02-02 08:44:12 -08:00
shamoon
45f5025f78
Enhancement: Add 'any of' workflow trigger filters ( #11683 )
2026-01-25 13:45:50 -08:00
shamoon
32b236cfa2
Enhancement: support doc_id placeholder in workflow templates ( #11847 )
2026-01-22 00:05:19 +00:00
shamoon
e816269db5
Fix: recurring workflow to respect latest run time ( #11735 )
2026-01-13 09:36:53 -08:00
shamoon
f3e3ba49d1
Fix: recurring workflow to respect latest run time ( #11735 )
2026-01-08 09:52:53 -08:00
shamoon and Trenton H
9ba1d93e15
Merge commit from fork
...
* Uses a custom transport to resolve the slim chance of a DNS rebinding affecting the webhook
* Fix WebhookTransport hostname resolution and validation
* Fix test failures
* Lint
* Keep all internal logic inside WebhookTransport
* Fix test failure
* Update handlers.py
* Update handlers.py
---------
Co-authored-by: Trenton H <797416+stumpylog@users.noreply.github.com >
2025-12-12 09:28:17 -08:00
shamoon
66d363bdc5
Chore: refactor workflows code ( #11563 )
2025-12-11 12:13:10 -08:00
Ed Bardsley and shamoon
c5ad148dc7
Fix: include BASE_URL when constructing doc_url for workflows ( #11360 )
...
---------
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com >
2025-11-14 17:45:13 +00:00
shamoon
b12f1e757c
Fixhancement: refactor email attachment logic ( #11336 )
2025-11-14 17:28:46 +00:00
shamoon
48d21da13b
Fix: support ConsumableDocument in email attachments ( #11196 )
2025-10-27 10:37:57 -07:00
shamoon
f6c004183e
Feature: Advanced Workflow Trigger Filters ( #11029 )
2025-10-13 22:23:56 +00:00
shamoon and Trenton H
1709aee903
Development: fix localization failing tests ( #10840 )
...
---------
Co-authored-by: Trenton H <797416+stumpylog@users.noreply.github.com >
2025-09-12 16:42:52 -07:00
david-loe and shamoon
2dc4f1f49b
Enhancement: add storage path as workflow trigger filter ( #10771 )
...
---------
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com >
2025-09-11 17:41:04 +00:00
9e11e7fd05
Enhancement: jinja template support for workflow title assignment ( #10700 )
...
---------
Co-authored-by: Trenton Holmes <797416+stumpylog@users.noreply.github.com >
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com >
2025-09-11 06:56:16 -07:00
shamoon
6730896894
Enhancement: support webhook restrictions ( #10555 )
2025-08-11 10:15:30 -07:00
shamoon
3b069ac034
Fix: restore expected pre-2.16 scheduled workflow offset behavior ( #10218 )
2025-06-19 14:47:54 +00:00
shamoon
422bffe1a6
Performance: pre-filter document list in scheduled workflow checks ( #10031 )
2025-06-03 21:47:29 +00:00