Commit Graph
12143 Commits
Author SHA1 Message Date
dependabot[bot] 420bf503e8 Chore(deps): Bump pdfjs-dist from 6.2.108 to 6.3.289 in /src-ui (#14144)
Bumps [pdfjs-dist](https://github.com/mozilla/pdf.js) from 6.2.108 to 6.3.289.
- [Release notes](https://github.com/mozilla/pdf.js/releases)
- [Commits](https://github.com/mozilla/pdf.js/compare/v6.2.108...v6.3.289)

---
updated-dependencies:
- dependency-name: pdfjs-dist
  dependency-version: 6.3.289
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-16 12:09:57 -07:00
dependabot[bot] 3e38b246d4 Chore(deps-dev): Bump the frontend-eslint-dependencies group (#14143)
Bumps the frontend-eslint-dependencies group in /src-ui with 4 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser), [@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils) and [eslint](https://github.com/eslint/eslint).


Updates `@typescript-eslint/eslint-plugin` from 8.68.0 to 8.70.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.68.0 to 8.70.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/parser)

Updates `@typescript-eslint/utils` from 8.68.0 to 8.70.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/utils/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/utils)

Updates `eslint` from 10.9.1 to 10.10.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.9.1...v10.10.0)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.70.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend-eslint-dependencies
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.70.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend-eslint-dependencies
- dependency-name: "@typescript-eslint/utils"
  dependency-version: 8.70.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend-eslint-dependencies
- dependency-name: eslint
  dependency-version: 10.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend-eslint-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-16 17:02:02 +00:00
dependabot[bot] 684b3c9885 Chore(deps-dev): Bump @types/node from 26.4.0 to 26.5.0 in /src-ui (#14146)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.4.0 to 26.5.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-16 16:43:27 +00:00
dependabot[bot] 6ad95b63b2 Chore(deps-dev): Bump the frontend-jest-dependencies group (#14142)
Bumps the frontend-jest-dependencies group in /src-ui with 2 updates: [jest](https://github.com/jestjs/jest/tree/HEAD/packages/jest) and [jest-environment-jsdom](https://github.com/jestjs/jest/tree/HEAD/packages/jest-environment-jsdom).


Updates `jest` from 30.4.2 to 30.5.1
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.5.1/packages/jest)

Updates `jest-environment-jsdom` from 30.4.1 to 30.5.1
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.5.1/packages/jest-environment-jsdom)

---
updated-dependencies:
- dependency-name: jest
  dependency-version: 30.5.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend-jest-dependencies
- dependency-name: jest-environment-jsdom
  dependency-version: 30.5.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend-jest-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-16 16:19:49 +00:00
GitHub Actions 0d14d80995 Auto translate strings 2026-09-16 15:47:19 +00:00
shamoon c97c6923ea Enhancement: centralized management of share links + bundles (#14115) 2026-09-16 15:45:49 +00:00
GitHub Actions cd53d1b2c8 Auto translate strings 2026-09-16 14:36:53 +00:00
Trenton H 530059c5c0 Performance: Preprocess classifier text with Tantivy instead of NLTK (#14127)
* Preprocesses classifier content with Tantivy instead of NLTK

Tokenizing and stemming now happen in one Rust call instead of NLTK's
Python tokenizer and per word stemming, which also removes the Redis
backed stem cache from every preprocessing call. The output matches the
NLTK pipeline closely; tokens containing digits are now stemmed, and the
English stop words follow Snowball's list.

Stemming and stop word removal apply whenever the OCR language is one of
the supported classifier languages, so PAPERLESS_ENABLE_NLTK and
PAPERLESS_NLTK_DIR are removed.

* Copies packages instead of hardlinking them in backend CI, some NLTK thing

* Adds a normalization to NFC to better fit what Tantivy expects
2026-09-16 07:35:26 -07:00
GitHub Actions 989f138556 Auto translate strings 2026-09-16 04:11:21 +00:00
shamoon a419f1ffac Chore: move advanced search to the bottom in the filter editor (#14130) 2026-09-15 21:09:46 -07:00
Trenton H 7e698360ff Performance: Drops fields from the MLPClassifier that are training only before pickling (#14114) 2026-09-15 20:40:49 -07:00
shamoon e8b7a98d3e Fix: better catch email workflow placeholder parsing errors (#14129) 2026-09-15 16:44:12 -07:00
Trenton H f919c981e1 Peformance: Improves the memory efficency of classifier training (#14124) 2026-09-15 13:35:44 -07:00
Trenton H ec4e45ecf4 Performance: Streams the classifier pickle file during save to file (#14121) 2026-09-15 19:35:18 +00:00
GitHub Actions 27927fab4d Auto translate strings 2026-09-15 19:24:55 +00:00
Trenton H 683f2ac250 Fix: validate legacy bulk_edit owner/rotate/split parameters (#14120)
BulkEditSerializer's hand-parsed validators only caught the exceptions
their happy paths raised, so wrong-typed input produced a 500 or was
passed through to the task:

- owner: a nonexistent or wrong-typed id raised an uncaught error, and a
  boolean was accepted (Django coerces True to pk 1). It is now validated
  with PrimaryKeyRelatedField and the validated pk is passed on.
- rotate: null raised TypeError, while true, "90" and 45 were accepted and
  failed later in QPDF. Degrees are now an IntegerField plus a
  multiple-of-90 check, passing an int on. The dedicated rotate endpoint
  and edit_pdf operations share the same multiple-of-90 check.
- split: null raised AttributeError, "0" silently became the last page,
  "3-1" gave an empty group that crashed the task, and a range like
  "1-5000000" was expanded into a list during the request with no upper
  bound. Each range is now checked against 1 <= start <= end <= page_count
  before it is built.
2026-09-15 19:23:37 +00:00
GitHub Actions 73de6b17bf Auto translate strings 2026-09-15 18:47:52 +00:00
Trenton H ef26bc1570 Fix: enforce set_permissions shape via a nested DRF serializer (#14119)
SetPermissionsSerializer was a bare DictField, and the legacy bulk_edit
set_permissions parameter bypassed even that by hand-calling
validate_set_permissions() on an unchecked dict. A bool or a non-list in
place of users/groups crashed with a raw TypeError instead of a 400.

It is now a nested serializer (view/change, each with users/groups as
lists of integers), used for owned-object create/update, the legacy
bulk_edit set_permissions parameter, and bulk_edit_objects permissions.
Unknown action keys are rejected: previously a typo like "veiw" was
silently dropped, leaving an empty permission set that could clear
existing grants. An explicit set_permissions null (an owner-only change)
remains a no-op, and an empty bulk_edit_objects permissions dict is still
rejected.
2026-09-15 18:46:32 +00:00
Trenton H ff1e61b162 Fix: Use prefetching to reduce query counts during classifier training (#14122) 2026-09-15 11:12:08 -07:00
Trenton H 1f374cd656 Fix: reject non-dict user_args/barcode_tag_mapping in config API (#14118)
JSONField(binary=True) accepts any JSON value, so a truthy non-dict
(bool/int/list/string) silently passed validation.

Additionally, require string substitutes in barcode_tag_mapping, a non-string
substitute value made the barcode tag substitution fail inside
get_tag_ids, and the tag was silently skipped. barcode_tag_mapping values
must now be strings (empty still means "use the raw barcode").
2026-09-15 16:14:01 +00:00
GitHub Actions 7354427229 Auto translate strings 2026-09-15 15:45:22 +00:00
Trenton H 970eb55a70 Fix: type edit_pdf operations via a nested serializer (#14116)
operations was a ListField with no child, so both EditPdfDocumentsSerializer
and BulkEditSerializer._validate_parameters_edit_pdf hand-checked each entry
with isinstance(). That accepted booleans (isinstance(True, int) is true) and
passed through any extra keys.

Adds PdfEditOperationSerializer (page >= 1, doc >= 0, rotate a multiple of
90) and uses it as the ListField child on both paths, dropping the manual
type checks and the now-redundant negative/page < 1 bounds checks. Rotations
that are not a multiple of 90 previously passed validation and then failed
inside the task when QPDF refused them.
2026-09-15 15:43:21 +00:00
Trenton H d2170f1267 Performance: Loads the classifier through a memory view to reduce memory usage (#14113) 2026-09-15 15:23:41 +00:00
GitHub Actions 2ac5a1c2e2 Auto translate strings 2026-09-15 14:28:16 +00:00
Trenton H a4e69aac9d Documentation: document the query grammar paperless actually supports (#14074)
* docs(search): document the query grammar paperless actually supports

* docs(search): cover ?/bracket wildcards and the no-stemmer fallback

* Shorten things up, use tables and less wordy stuff.  Fixes some test doc strings that referred to the documentation

* Silly sonarr
2026-09-15 07:26:42 -07:00
Trenton H 1e62f5e811 Fix: cap the advanced search query length (#14073)
* fix(search): cap the advanced search query length

* Adds a couple of spies, just to prove it further
2026-09-15 07:26:42 -07:00
Trenton H 1f8b6c95b1 Feature: parse advanced search with whoosh-compat and delete the handwritten translation (#14072)
* Feature: parse advanced search with whoosh-compat and delete the hand-written translator

* Don't cover these, they exist for defensive, but there's no other current diagnostic

* A mix of more no cover and tests

* Route SCHEMA_FIELD_MISSING into an error, not an HTTP 400
2026-09-15 07:26:41 -07:00
Trenton H e78521c912 Chore: Search field registry (#14071)
* feat(search): add whoosh-compat, the shared field table and the field registry

* Sonar being useful actually

* Adds the given/when/then commenting

* Trims tests I don't think cover our logic or code or are redundant

* Coverage

* test(search): add pattern normalizer stem-alternates unit tests

* build: bump whoosh-compat to 0.2.0
2026-09-15 07:26:41 -07:00
shamoon 9cea08118e Fix: ensure django setup is run for management comments under 3.14 (#14100) 2026-09-14 07:20:20 -07:00
GitHub Actions cb2506900e Auto translate strings 2026-09-13 22:13:45 +00:00
shamoon 5293194551 Fix: validate PDF output doc indexes in bulk edit (#14083) 2026-09-13 22:12:10 +00:00
GitHub Actions 1b86488e2e Auto translate strings 2026-09-13 21:59:18 +00:00
shamoon c9a5607902 Enhancement: allow regex timeout configuration (#14085) 2026-09-13 21:57:24 +00:00
Trenton H 05b7697c35 Fix: avoid IntegrityError when a retried task republishes with the same task_id (#14096) 2026-09-13 21:05:54 +00:00
GitHub Actions c626ecd9bc Auto translate strings 2026-09-13 18:16:56 +00:00
shamoon aeed83b14a Chore: include Apply AI Suggestions in the tasks UI filter dropdown (#14093) 2026-09-13 11:15:32 -07:00
GitHub Actions 72ea38ab12 Auto translate strings 2026-09-12 23:19:06 +00:00
shamoon 4421d4fe58 Fix: update some api global perms inconsistencies (#14086) 2026-09-12 16:17:48 -07:00
GitHub Actions 4d64632f70 Auto translate strings 2026-09-12 23:15:32 +00:00
shamoon 26094bc863 Fix: ignore nested action IDs on WF create (#14084) 2026-09-12 16:14:17 -07:00
shamoon 9dbad4de09 Chore: read-only deleted_at 2026-09-12 16:13:58 -07:00
GitHub Actions 4a54935b3d Auto translate strings 2026-09-11 15:48:00 +00:00
shamoon d53c9070ba Fix: correct text/stream compression workaround (#14064) 2026-09-11 15:46:08 +00:00
GitHub Actions f885833a38 Auto translate strings 2026-09-11 06:39:12 +00:00
shamoon 197c80ea68 Fix: ui version content switching inconsistencies (#14066) 2026-09-10 23:37:49 -07:00
GitHub Actions a0c9500b6a Auto translate strings 2026-09-11 02:18:15 +00:00
shamoon df8e95cbd4 Fix: prevent saving changes to stale cached document object (#14065) 2026-09-10 19:16:51 -07:00
shamoon 95944a553d Chore: remove comment
[skip ci]
2026-09-10 15:47:54 -07:00
Trenton H 2256cb3d38 Performance: batch permission assignment in bulk set_permissions (#13806)
* Perf: batch guardian permission assignment in bulk-edit

bulk_edit.set_permissions and BulkEditObjectPermissionsView both
looped documents/objects and called set_permissions_for_object per
object, which itself calls guardian's assign_perm/remove_perm once
per (object, user) pair -- ~10-20+ queries per object, scaling with
selection size.

Added set_permissions_for_objects, a bulk equivalent that resolves
existing permission holders once across the whole batch (not once per
object) and applies changes with a small, batch-size-independent
number of queries per action instead of one per (object, user) pair.

* Perf: avoid unnecessary full-row fetches in batch permission assignment

set_permissions_for_objects now takes a model + pks instead of instances,
and identity filtering resolves straight to ids, so bulk-editing
permissions no longer materializes full Document/User/Group rows just to
read their pk/id. Row construction for bulk_create is also chunked to
bound peak memory for very large "apply to all" operations.

* Fix: use .distinct() for existing-grant lookup, drop flaky query-count invariant tests

.distinct() lets the database dedupe identity ids server-side instead of
transferring one row per (object, grantee) match and deduping in Python --
was the dominant cost on a large selection with existing grants.

Also replaced the two query-count-equality tests (bulk_edit and the
bulk_edit_objects API path) with plain functional-correctness checks at
both batch sizes.  Hopefully stops that flake.

* Mark empty-pks early-return in set_permissions_for_objects as no-cover

Defensive guard for an edge case (all requested pks already gone/invalid)
rather than a path normal usage exercises; matches the existing
pragma: no cover convention elsewhere in this file.

* Perf: drop speculative row-chunking in bulk permission assignment, keep the query-batching fix

* Resolve every permission action before applying any of them

This fixes the existing issue and resolves the Copilot comment

* Assert permission assignment does not scale with selection size

The two batching tests only checked that permissions came out correct at
5 and 50 objects, so reverting to the old per-object loop would still
have passed.  Check sizes as well to prevent that
2026-09-10 19:54:09 +00:00
GitHub Actions 9a8163fbbb Auto translate strings 2026-09-10 19:39:56 +00:00