Compare commits

...

720 Commits

Author SHA1 Message Date
shamoon
41a9aac75d v1.15.1 2023-06-03 16:06:37 -07:00
shamoon
8768168536 Merge branch 'dev' 2023-06-03 16:04:27 -07:00
shamoon
325809fbbf other minor css fixes after bootstrap update 2023-06-03 16:03:00 -07:00
shamoon
3dd47a9f5b Merge pull request #3523 from paperless-ngx/fix/issue-3522
Fix incorrect colors in v1.15.0
2023-06-03 15:08:42 -07:00
github-actions[bot]
00f16ef8f0 [Documentation] Add v1.15.0 changelog (#3521)
* Changelog v1.15.0 - GHA

* Update changelog.md

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-06-03 15:08:20 -07:00
shamoon
5e67aae83b Fix incorrect colors after last bootstrap update 2023-06-03 11:09:30 -07:00
shamoon
ae5c603c98 Update environment.prod.ts 2023-06-03 09:32:04 -07:00
shamoon
c62aa3cb55 v1.15.0 2023-06-03 09:28:02 -07:00
shamoon
7073cb6d5c Merge branch 'dev' 2023-06-03 09:27:18 -07:00
Paperless-ngx Bot [bot]
a495ad58d0 New Crowdin updates (#3405)
* New translations messages.xlf (German)
[ci skip]

* New translations django.po (Hungarian)
[ci skip]
2023-06-03 09:25:53 -07:00
shamoon
569165371c Merge pull request #3516 from ajgon/fix/http-remote-user-api
Fix: KeyError error on unauthenticated API calls
2023-06-03 09:05:50 -07:00
shamoon
ea14fa5251 Adds testing for unauthenticated API calls, simplify logging logic 2023-06-03 08:50:54 -07:00
Igor Rzegocki
4a02865697 fix broken "failed login" signal 2023-06-03 17:48:17 +02:00
shamoon
3a2a20cefd Merge pull request #3513 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/eslint-8.41.0
Bump eslint from 8.39.0 to 8.41.0 in /src-ui
2023-06-01 15:41:20 -07:00
dependabot[bot]
f2f42de701 Bump eslint from 8.39.0 to 8.41.0 in /src-ui
Bumps [eslint](https://github.com/eslint/eslint) from 8.39.0 to 8.41.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.39.0...v8.41.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 22:30:39 +00:00
dependabot[bot]
6d60d4897c Merge pull request #3510 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/concurrently-8.1.0 2023-06-01 22:29:48 +00:00
shamoon
9f71ce8083 Merge pull request #3507 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/ng-bootstrap/ng-bootstrap-14.2.0
Bump @ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui
2023-06-01 15:20:57 -07:00
dependabot[bot]
50f8f7da93 Merge pull request #3508 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/popperjs/core-2.11.8 2023-06-01 22:20:35 +00:00
dependabot[bot]
d475344b51 Bump concurrently from 8.0.1 to 8.1.0 in /src-ui
Bumps [concurrently](https://github.com/open-cli-tools/concurrently) from 8.0.1 to 8.1.0.
- [Release notes](https://github.com/open-cli-tools/concurrently/releases)
- [Commits](https://github.com/open-cli-tools/concurrently/compare/v8.0.1...v8.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 22:13:11 +00:00
dependabot[bot]
2630863409 Bump @popperjs/core from 2.11.7 to 2.11.8 in /src-ui
Bumps [@popperjs/core](https://github.com/popperjs/popper-core) from 2.11.7 to 2.11.8.
- [Release notes](https://github.com/popperjs/popper-core/releases)
- [Commits](https://github.com/popperjs/popper-core/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 22:10:34 +00:00
dependabot[bot]
e120f4a3f7 Bump @ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui
Bumps [@ng-bootstrap/ng-bootstrap](https://github.com/ng-bootstrap/ng-bootstrap) from 14.1.0 to 14.2.0.
- [Release notes](https://github.com/ng-bootstrap/ng-bootstrap/releases)
- [Changelog](https://github.com/ng-bootstrap/ng-bootstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ng-bootstrap/ng-bootstrap/compare/14.1.0...14.2.0)

---
updated-dependencies:
- dependency-name: "@ng-bootstrap/ng-bootstrap"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 22:09:38 +00:00
dependabot[bot]
6aff4c986c Merge pull request #3505 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/typescript-eslint/parser-5.59.8 2023-06-01 22:05:14 +00:00
dependabot[bot]
2e891b1634 Merge pull request #3497 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/bootstrap-5.3.0 2023-06-01 21:51:57 +00:00
dependabot[bot]
35a0c5d36f Bump @typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.59.2 to 5.59.8.
- [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/v5.59.8/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 21:48:04 +00:00
dependabot[bot]
82d786b94c Merge pull request #3500 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/typescript-eslint/eslint-plugin-5.59.8 2023-06-01 21:46:24 +00:00
dependabot[bot]
de49d602a1 Bump bootstrap from 5.2.3 to 5.3.0 in /src-ui
Bumps [bootstrap](https://github.com/twbs/bootstrap) from 5.2.3 to 5.3.0.
- [Release notes](https://github.com/twbs/bootstrap/releases)
- [Commits](https://github.com/twbs/bootstrap/compare/v5.2.3...v5.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 21:43:26 +00:00
dependabot[bot]
3cb6511b66 Merge pull request #3501 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/tslib-2.5.2 2023-06-01 21:42:22 +00:00
dependabot[bot]
1d3ae777d5 Bump tslib from 2.5.0 to 2.5.2 in /src-ui
Bumps [tslib](https://github.com/Microsoft/tslib) from 2.5.0 to 2.5.2.
- [Release notes](https://github.com/Microsoft/tslib/releases)
- [Commits](https://github.com/Microsoft/tslib/compare/2.5.0...2.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 21:28:17 +00:00
dependabot[bot]
dbb2ea39d2 Bump @typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.2 to 5.59.8.
- [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/v5.59.8/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 21:28:15 +00:00
dependabot[bot]
fb607332b9 Merge pull request #3498 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/types/node-20.2.5 2023-06-01 21:27:19 +00:00
dependabot[bot]
b956f627b0 Bump @types/node from 18.16.3 to 20.2.5 in /src-ui
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.16.3 to 20.2.5.
- [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-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 21:12:16 +00:00
shamoon
2ac64ab573 Merge pull request #3499 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/playwright/test-1.34.3
Bump @playwright/test from 1.33.0 to 1.34.3 in /src-ui
2023-06-01 14:10:52 -07:00
dependabot[bot]
482e00970c Bump @playwright/test from 1.33.0 to 1.34.3 in /src-ui
Bumps [@playwright/test](https://github.com/Microsoft/playwright) from 1.33.0 to 1.34.3.
- [Release notes](https://github.com/Microsoft/playwright/releases)
- [Commits](https://github.com/Microsoft/playwright/compare/v1.33.0...v1.34.3)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 20:58:17 +00:00
shamoon
d62340efb5 Merge pull request #3476 from paperless-ngx/feature-detail-quick-filters
Feature: quick filters from document detail
2023-06-01 13:52:25 -07:00
shamoon
eb0f35219c Merge pull request #3487 from paperless-ngx/fix/issue-3484
Fix: exclude consumer & AnonymousUser users from export manifest
2023-06-01 11:15:58 -07:00
shamoon
243598ae50 Exclude consumer & AnonymousUser users from export manifest 2023-05-30 20:51:25 -07:00
shamoon
74c965d21d Adds quick filters from document detail 2023-05-30 08:38:33 -07:00
shamoon
30316179a0 Merge pull request #3472 from paperless-ngx/fix-disable-date-suggestions
Fix: prevent date suggestion search if disabled
2023-05-30 07:48:03 -07:00
shamoon
f16a1101e6 Merge pull request #3471 from paperless-ngx/fix/issue-773
Feature: Add explanations to relative dates
2023-05-30 07:47:28 -07:00
Michael Manganiello
0466f7a18a Sync Pipfile.lock based on latest Pipfile
When running `pipenv install` locally, `pipenv` triggers a warning that the
lockfile is out of sync, and starts regenerating the `Pipfile.lock` file.

This change syncs these files, and updates dependencies based on a fresh run of
`pipenv lock --dev`.
2023-05-30 07:22:00 -07:00
shamoon
97cf3b2079 Merge pull request #3473 from jayme-github/fix_original_filename
Make DocumentSerializer return the original_filename
2023-05-27 12:50:07 -07:00
jayme-github
6542d75a6a Make DocumentSerializer return the original_filename
Make get_original_file_name return the original filename instead of the
public filename.
2023-05-27 21:35:58 +02:00
shamoon
c6900c5d51 prevent date suggestion search if disabled 2023-05-27 10:51:30 -07:00
shamoon
0e9642ea3e Add explanations to relative dates 2023-05-27 10:25:41 -07:00
chrisblech
3ab2892066 consumer.py: read create_date from original file (instead of temp copy)
In line 328, `self.path` is set to a fresh written copy of the source file. This copy has a different timestamp (=now).

When using the source file's timestamp as `create_date`, it makes much more sense to ask for the timestamp from `self.original_path`
2023-05-26 14:16:27 -07:00
shamoon
69b69aca6a Merge pull request #3457 from andstu/docs
fix: spelling
2023-05-25 06:56:00 -07:00
andstu
a05dbd2e5a fix: spelling 2023-05-25 00:43:31 -04:00
Trenton H
c1641f6fb8 Just in case, catch a sometimes nltk error and return the basic processed content instead 2023-05-24 19:34:49 -07:00
Trenton H
452c79f9a1 Improves the logging mixin and allows it to be typed better 2023-05-23 17:16:39 -07:00
shamoon
37959fe31c Merge pull request #3445 from paperless-ngx/feature-paginate-tasks
Enhancement: paginate frontend tasks
2023-05-22 14:41:50 -07:00
Kim Oliver Drechsel
30f73f39a0 Add SSL Support for MariaDB (#3444)
* Add ssl options for mariadb

* Add ssl mode for mariadb

Add ssl mode as documented in https://mysqlclient.readthedocs.io/user_guide.html#functions-and-attributes

* run linting over settings.py

* Add docs for SSL mode with MariaDB

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-05-22 11:46:29 -07:00
shamoon
fa613cd5fb Frontend paginate tasks 2023-05-22 10:49:18 -07:00
Guillaume Hullin
b8afb22902 Adding doc on how to setup Fail2ban (#3414)
* Adding doc on how to setup Fail2ban

* Adding notes concerning log path variable

* Moved Fail2ban to Wiki

* Added "Enhancing security" section to link to wiki

* Update docs/setup.md

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>

* Type

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-05-22 06:53:09 -07:00
Trenton H
07e07fc7e8 Updates handling of barcodes to encapsulate logic, moving it out of tasks and into barcodes 2023-05-22 06:52:31 -07:00
shamoon
58f95c1891 Merge pull request #3437 from MarcelBochtler/docs-typo
Docs: Fix typo
2023-05-21 10:52:18 -07:00
Marcel Bochtler
7ad8e3b3da Docs: Fix some typos 2023-05-21 18:53:15 +02:00
shamoon
b9a548758a Metadata error use new error toast 2023-05-20 10:28:37 -07:00
shamoon
a436caf2ad Suggestions error use new error toast 2023-05-20 10:15:53 -07:00
shamoon
5461f8a225 Merge pull request #3401 from paperless-ngx/feature/playwright
Development: migrate frontend tests to playwright
2023-05-18 15:53:29 -07:00
shamoon
78b747571c Update statistics-widget.component.html 2023-05-18 15:52:42 -07:00
shamoon
0c6a9a189b migrate frontend tests to playwright
tasks spec
settings spec
manage spec
document-detail spec
global permissions spec
documents-list & dashboard specs
tasks network requests
settings network requests
permissions network requests
manage network request
bulk-edit network requests
Fix specs
try to get playwright working on ci
rename some specs
reconfigure playwright config
increase webserver timeout for ci
fix report path
2023-05-18 13:47:43 -07:00
shamoon
45d666ff2d Fix nginx link 2023-05-18 13:45:04 -07:00
shamoon
4143925322 Merge pull request #3413 from paperless-ngx/feature-improve-frontend-error-handling
Enhancement: Improve frontend error handling
2023-05-18 10:33:06 -07:00
shamoon
9be3d2ccaf Merge pull request #3420 from paperless-ngx/move-nginx
[Documentation] Move nginx
2023-05-18 10:28:38 -07:00
shamoon
8be8a310d7 Move nginx docs to wiki 2023-05-18 08:52:50 -07:00
shamoon
b81c339922 Update api.md 2023-05-18 00:59:29 -07:00
shamoon
d3d103f141 Update api.md 2023-05-18 00:59:05 -07:00
shamoon
dd575ccb88 Improve frontend error handling 2023-05-17 12:56:59 -07:00
shamoon
a83c7c64b5 Fix 'create' edit dialog without permissions form 2023-05-17 11:40:43 -07:00
shamoon
c04ded6fd8 Update usage.md 2023-05-16 15:11:33 -07:00
shamoon
f24c779737 Update usage.md 2023-05-16 15:11:23 -07:00
Trenton H
3cdd358fc8 Adds a note to bare metal upgrading about removing old dependencies 2023-05-16 12:05:29 -07:00
shamoon
e11939b149 Update crowdin.yml 2023-05-16 09:39:54 -07:00
shamoon
a4ef0702c9 Make 'appears on' text in saved view settings visually hidden 2023-05-16 08:30:00 -07:00
Trenton H
548b6352ca Updates the coverage to upload on push, not pull request, as dev doesn't upload fully otherwise 2023-05-15 12:54:35 -07:00
shamoon
2658c16073 Merge pull request #3400 from paperless-ngx/v1.14.5-changelog
[Documentation] Add v1.14.5 changelog
2023-05-15 09:47:51 -07:00
Trenton H
49d0b6aa00 Fixes a couple of fixes and other appearing as enhancements 2023-05-15 09:25:12 -07:00
github-actions
e65f584197 Changelog v1.14.5 - GHA 2023-05-15 15:35:01 +00:00
shamoon
ce1bbda188 Update environment.prod.ts 2023-05-15 08:23:53 -07:00
shamoon
846897fb4c Merge branch 'main' into dev 2023-05-15 08:23:36 -07:00
shamoon
457e134261 Move affiliated projects to wiki 2023-05-15 08:15:30 -07:00
shamoon
3e129763c7 v1.14.5 2023-05-15 08:08:59 -07:00
shamoon
c49d086965 Merge branch 'dev' 2023-05-15 08:08:17 -07:00
shamoon
df7bfc4efd Merge pull request #3352 from paperless-ngx/l10n_dev
New Crowdin updates
2023-05-15 08:07:49 -07:00
Paperless-ngx Bot [bot]
7fba1f9ed2 New translations messages.xlf (German)
[ci skip]
2023-05-13 17:16:06 -07:00
Trenton Holmes
3205d52331 Changes the error mode to replace instead of ignore, to better highlight where a problem happened 2023-05-13 09:29:18 -07:00
Trenton H
111960c530 Adds better handling for files with invalid utf8 content 2023-05-13 09:29:18 -07:00
Paperless-ngx Bot [bot]
e1bc1a0129 New translations django.po (Polish)
[ci skip]
2023-05-13 04:51:23 -07:00
Paperless-ngx Bot [bot]
8b543a5fa9 New translations messages.xlf (Polish)
[ci skip]
2023-05-13 04:51:22 -07:00
Paperless-ngx Bot [bot]
dc7a67a1d7 New translations django.po (Polish)
[ci skip]
2023-05-13 03:37:55 -07:00
shamoon
350c20d6ab Merge pull request #3359 from paperless-ngx/feature-fix-autocomplete-respect-perms
Fix: respect permissions for autocomplete suggestions
2023-05-12 13:35:45 -07:00
Trenton H
b5f0cd7c70 Adds back the extras from uvicorn 2023-05-12 06:43:32 -07:00
Trenton H
90488cd77a Removes even more remanents from the lock file 2023-05-12 06:43:32 -07:00
Trenton H
5bbc59e87c Fixes testing requirements, removes further leftover libraries 2023-05-12 06:43:32 -07:00
Trenton H
c02758213b Upgrades to the latest django channels 2023-05-12 06:43:32 -07:00
Paperless-ngx Bot [bot]
09c62d67c1 New translations messages.xlf (French)
[ci skip]
2023-05-12 02:27:06 -07:00
Paperless-ngx Bot [bot]
3f3fa3044c New translations messages.xlf (French)
[ci skip]
2023-05-12 01:19:22 -07:00
Paperless-ngx Bot [bot]
62673145fb New translations messages.xlf (Catalan)
[ci skip]
2023-05-11 22:47:01 -07:00
shamoon
0baf73de5e Update some version strings 2023-05-11 15:06:17 -07:00
shamoon
66a0783e7b Respect permissions for autocomplete suggestions 2023-05-11 14:43:25 -07:00
Trenton H
17144c45e5 Transition to new library for finding IPs from the Django request 2023-05-11 13:51:04 -07:00
shamoon
311c0ba4f1 Resolve CodeQL warnings 2023-05-11 12:56:01 -07:00
shamoon
e293d23ae3 Refactoring a few frontend components 2023-05-11 12:49:33 -07:00
Paperless-ngx Bot [bot]
93769d2608 New translations messages.xlf (German)
[ci skip]
2023-05-11 11:12:58 -07:00
Paperless-ngx Bot [bot]
e7540563d0 New translations messages.xlf (Romanian)
[ci skip]
2023-05-11 10:13:18 -07:00
Paperless-ngx Bot [bot]
fc1047550e New translations messages.xlf (Hungarian)
[ci skip]
2023-05-11 10:13:17 -07:00
Paperless-ngx Bot [bot]
dadc618719 New translations messages.xlf (Serbian (Latin))
[ci skip]
2023-05-11 10:13:15 -07:00
Paperless-ngx Bot [bot]
36f3bd2869 New translations messages.xlf (Luxembourgish)
[ci skip]
2023-05-11 10:13:14 -07:00
Paperless-ngx Bot [bot]
fdcea983a4 New translations messages.xlf (Croatian)
[ci skip]
2023-05-11 10:13:13 -07:00
Paperless-ngx Bot [bot]
081534457c New translations messages.xlf (Indonesian)
[ci skip]
2023-05-11 10:13:11 -07:00
Paperless-ngx Bot [bot]
94a6272a1d New translations messages.xlf (Portuguese, Brazilian)
[ci skip]
2023-05-11 10:13:10 -07:00
Paperless-ngx Bot [bot]
d389e0ecf8 New translations messages.xlf (Chinese Simplified)
[ci skip]
2023-05-11 10:13:09 -07:00
Paperless-ngx Bot [bot]
17eb1c604f New translations messages.xlf (Turkish)
[ci skip]
2023-05-11 10:13:08 -07:00
Paperless-ngx Bot [bot]
99474aab06 New translations messages.xlf (Swedish)
[ci skip]
2023-05-11 10:13:07 -07:00
Paperless-ngx Bot [bot]
f3d3bf20de New translations messages.xlf (Slovenian)
[ci skip]
2023-05-11 10:13:05 -07:00
Paperless-ngx Bot [bot]
3c999e9847 New translations messages.xlf (Russian)
[ci skip]
2023-05-11 10:13:04 -07:00
Paperless-ngx Bot [bot]
692fa5f606 New translations messages.xlf (Portuguese)
[ci skip]
2023-05-11 10:13:03 -07:00
Paperless-ngx Bot [bot]
752b8e79ff New translations messages.xlf (Polish)
[ci skip]
2023-05-11 10:13:02 -07:00
Paperless-ngx Bot [bot]
3f82cf4ab3 New translations messages.xlf (Norwegian)
[ci skip]
2023-05-11 10:13:00 -07:00
Paperless-ngx Bot [bot]
1549b9df74 New translations messages.xlf (Dutch)
[ci skip]
2023-05-11 10:12:59 -07:00
Paperless-ngx Bot [bot]
78ef87a952 New translations messages.xlf (Italian)
[ci skip]
2023-05-11 10:12:58 -07:00
Paperless-ngx Bot [bot]
29ede48e0f New translations messages.xlf (Hebrew)
[ci skip]
2023-05-11 10:12:57 -07:00
Paperless-ngx Bot [bot]
6349d25219 New translations messages.xlf (Finnish)
[ci skip]
2023-05-11 10:12:55 -07:00
Paperless-ngx Bot [bot]
830a450f00 New translations messages.xlf (German)
[ci skip]
2023-05-11 10:12:54 -07:00
Paperless-ngx Bot [bot]
18f9ce9c0b New translations messages.xlf (Danish)
[ci skip]
2023-05-11 10:12:53 -07:00
Paperless-ngx Bot [bot]
2471be0c78 New translations messages.xlf (Czech)
[ci skip]
2023-05-11 10:12:51 -07:00
Paperless-ngx Bot [bot]
60cfd687dc New translations messages.xlf (Catalan)
[ci skip]
2023-05-11 10:12:50 -07:00
Paperless-ngx Bot [bot]
e06c61b95d New translations messages.xlf (Belarusian)
[ci skip]
2023-05-11 10:12:49 -07:00
Paperless-ngx Bot [bot]
471eee0872 New translations messages.xlf (Arabic)
[ci skip]
2023-05-11 10:12:48 -07:00
Paperless-ngx Bot [bot]
20abd8a9f8 New translations messages.xlf (Spanish)
[ci skip]
2023-05-11 10:12:46 -07:00
Paperless-ngx Bot [bot]
88e5c471de New translations messages.xlf (French)
[ci skip]
2023-05-11 10:12:45 -07:00
shamoon
09086e574d Merge pull request #3309 from paperless-ngx/feature-owner-filtering
Feature: owner filtering
2023-05-11 10:05:51 -07:00
Paperless-ngx Bot [bot]
8d95c13e31 New translations messages.xlf (Portuguese, Brazilian)
[ci skip]
2023-05-10 20:17:24 -07:00
Paperless-ngx Bot [bot]
c922cc4351 New translations django.po (Portuguese, Brazilian)
[ci skip]
2023-05-10 19:17:32 -07:00
shamoon
a42f28c502 Merge pull request #3366 from paperless-ngx/fix/huntr-94517f3f-ed86-4d88-bce1-6e9ba11fe1c2
[Security] Render frontend text as plain text
2023-05-10 11:16:24 -07:00
shamoon
b802f3a71f Merge pull request #3329 from paperless-ngx/feature-full-dynamic-counts
Enhancement: dynamic counts include all pages, hide for "Any"
2023-05-10 11:15:47 -07:00
shamoon
f78f212a77 Merge pull request #3347 from paperless-ngx/fix/issue-3346
Fix: default frontend to current owner, allow setting no owner on create
2023-05-10 08:18:08 -07:00
Trenton H
22cbfd473b Upgrades dependencies to their latest allowed versions 2023-05-10 06:59:44 -07:00
shamoon
e5973ef713 Merge pull request #3367 from denilsonsa/patch-2
[Fix] Position:fixed for .global-dropzone-overlay
2023-05-09 23:48:02 -07:00
Denilson Sá Maia
5364a29b5f Position:fixed for .global-dropzone-overlay
If the user tried dropping a file onto the paperless-ngx UI, but the page itself had scrolled down a bit, the overlay would have scrolled together with the page.

This commit makes the overlay fixed to the viewport, independent from the scroll position.

This one-word commit was done directly through the GitHub web interface.
2023-05-10 08:01:51 +02:00
shamoon
49754d33fa Render frontend html as plain text 2023-05-09 21:59:24 -07:00
shamoon
d7d95037be Update document-detail.component.ts 2023-05-09 21:48:31 -07:00
shamoon
515146d4a2 Default frontend to current owner, allow setting no owner on create 2023-05-09 19:53:34 -07:00
shamoon
b7540fab58 Apply code suggestions
Co-Authored-By: Trenton H <797416+stumpylog@users.noreply.github.com>
2023-05-09 19:48:19 -07:00
shamoon
88e6f8abf6 Update frontend strings 2023-05-09 19:48:04 -07:00
shamoon
3c4dadd905 Re-work filter editor, bulk editor & reset buttons 2023-05-09 19:48:04 -07:00
Paperless-ngx Bot [bot]
f18f997796 New translations messages.xlf (Hungarian)
[ci skip]
2023-05-09 16:56:48 -07:00
Paperless-ngx Bot [bot]
3a1daf46ae New translations django.po (Hungarian)
[ci skip]
2023-05-09 16:56:46 -07:00
Paperless-ngx Bot [bot]
8dffea4a42 New translations messages.xlf (French)
[ci skip]
2023-05-09 07:15:58 -07:00
Paperless-ngx Bot [bot]
3852a6c5cf New translations django.po (Slovenian)
[ci skip]
2023-05-09 05:47:20 -07:00
Paperless-ngx Bot [bot]
6493f51a29 New translations messages.xlf (Slovenian)
[ci skip]
2023-05-09 05:47:19 -07:00
Paperless-ngx Bot [bot]
028f42e775 New translations django.po (Slovenian)
[ci skip]
2023-05-09 03:37:38 -07:00
Paperless-ngx Bot [bot]
eb1cc55f94 New translations messages.xlf (German)
[ci skip]
2023-05-09 02:31:20 -07:00
Paperless-ngx Bot [bot]
fb864f1132 New translations messages.xlf (Slovenian)
[ci skip]
2023-05-08 23:51:59 -07:00
Paperless-ngx Bot [bot]
8b8d988c07 New translations messages.xlf (Catalan)
[ci skip]
2023-05-08 23:51:58 -07:00
shamoon
c2b5451fe4 Add frontend owner filtering
Add owner to doc cards, table
Frontend testing for owner filtering
2023-05-08 15:34:14 -07:00
shamoon
487d3a6262 Support owner API query vars 2023-05-08 15:34:14 -07:00
shamoon
fe990b4cd2 Merge pull request #3336 from paperless-ngx/fix/issue-3332
Fix: dont perform mail actions when rule filename filter not met
2023-05-08 14:26:17 -07:00
Paperless-ngx Bot [bot]
019c7e2f78 New translations messages.xlf (Serbian (Latin))
[ci skip]
2023-05-08 08:04:35 -07:00
Paperless-ngx Bot [bot]
1c64a4f145 New translations messages.xlf (Luxembourgish)
[ci skip]
2023-05-08 08:04:33 -07:00
Paperless-ngx Bot [bot]
fc869aa203 New translations messages.xlf (Croatian)
[ci skip]
2023-05-08 08:04:32 -07:00
Paperless-ngx Bot [bot]
3a0ada9f46 New translations messages.xlf (Indonesian)
[ci skip]
2023-05-08 08:04:31 -07:00
Paperless-ngx Bot [bot]
cc9980fc19 New translations messages.xlf (Portuguese, Brazilian)
[ci skip]
2023-05-08 08:04:30 -07:00
Paperless-ngx Bot [bot]
7515d8af64 New translations messages.xlf (Chinese Simplified)
[ci skip]
2023-05-08 08:04:28 -07:00
Paperless-ngx Bot [bot]
5e7579c1fd New translations messages.xlf (Turkish)
[ci skip]
2023-05-08 08:04:27 -07:00
Paperless-ngx Bot [bot]
38af53f281 New translations messages.xlf (Swedish)
[ci skip]
2023-05-08 08:04:25 -07:00
Paperless-ngx Bot [bot]
a26bec5b00 New translations messages.xlf (Slovenian)
[ci skip]
2023-05-08 08:04:24 -07:00
Paperless-ngx Bot [bot]
feb943b6df New translations messages.xlf (Russian)
[ci skip]
2023-05-08 08:04:23 -07:00
Paperless-ngx Bot [bot]
059e37a41f New translations messages.xlf (Portuguese)
[ci skip]
2023-05-08 08:04:22 -07:00
Paperless-ngx Bot [bot]
7ce67fd465 New translations messages.xlf (Polish)
[ci skip]
2023-05-08 08:04:20 -07:00
Paperless-ngx Bot [bot]
6b8b8209f3 New translations messages.xlf (Norwegian)
[ci skip]
2023-05-08 08:04:19 -07:00
Paperless-ngx Bot [bot]
fd1d12859d New translations messages.xlf (Dutch)
[ci skip]
2023-05-08 08:04:18 -07:00
Paperless-ngx Bot [bot]
efb00b2387 New translations messages.xlf (Italian)
[ci skip]
2023-05-08 08:04:17 -07:00
Paperless-ngx Bot [bot]
9b2ca57038 New translations messages.xlf (Hebrew)
[ci skip]
2023-05-08 08:04:15 -07:00
Paperless-ngx Bot [bot]
9694face16 New translations messages.xlf (Finnish)
[ci skip]
2023-05-08 08:04:14 -07:00
Paperless-ngx Bot [bot]
7ef14832d0 New translations messages.xlf (German)
[ci skip]
2023-05-08 08:04:13 -07:00
Paperless-ngx Bot [bot]
33f7b58e6e New translations messages.xlf (Danish)
[ci skip]
2023-05-08 08:04:11 -07:00
Paperless-ngx Bot [bot]
9e992da863 New translations messages.xlf (Czech)
[ci skip]
2023-05-08 08:04:10 -07:00
Paperless-ngx Bot [bot]
c986a218c7 New translations messages.xlf (Catalan)
[ci skip]
2023-05-08 08:04:09 -07:00
Paperless-ngx Bot [bot]
8ee6312402 New translations messages.xlf (Belarusian)
[ci skip]
2023-05-08 08:04:08 -07:00
Paperless-ngx Bot [bot]
3c86b12ef9 New translations messages.xlf (Arabic)
[ci skip]
2023-05-08 08:04:07 -07:00
Paperless-ngx Bot [bot]
02d09edd49 New translations messages.xlf (Spanish)
[ci skip]
2023-05-08 08:04:05 -07:00
Paperless-ngx Bot [bot]
55af3c3dd1 New translations messages.xlf (French)
[ci skip]
2023-05-08 08:04:04 -07:00
shamoon
f8f5a77744 Merge pull request #3321 from paperless-ngx/feature-dismissable-welcome-widget 2023-05-08 07:06:11 -07:00
shamoon
5b6956ff24 Merge pull request #3345 from paperless-ngx/fix/issue-3341 2023-05-08 07:04:49 -07:00
shamoon
f1c138eaed Merge pull request #3315 from paperless-ngx/fix/__in-search-testing 2023-05-08 07:03:59 -07:00
Ross Brown
caf43638de Bump django from 4.1.7 to 4.1.9 2023-05-07 18:22:52 -07:00
shamoon
b783d2e210 Fix PassUserMixin not properly being used in DocumentViewSet 2023-05-07 17:40:09 -07:00
shamoon
9a40a5f019 Add proper testing for *__id__in testing 2023-05-07 00:04:23 -07:00
shamoon
81a7b34101 Dont perform mail actions when rule filename filter not met
Update mail.py
2023-05-06 23:59:33 -07:00
shamoon
f124e2a889 Add "all" property to results 2023-05-06 11:31:47 -07:00
Trenton H
02b2bcafc5 Fixes a small step naming thing, updates codecov to only upload on pull request events 2023-05-05 11:47:43 -07:00
Trenton Holmes
81a5fd377e Use a tagged version of the image cleaner action 2023-05-05 11:47:43 -07:00
Trenton H
f875ae4abf CI cleanup and improvements.
Removes the building of installers from the repo, they can now be built elsewhere,
on demand, as their building is no longer tied to the Dockerfile
2023-05-05 11:47:43 -07:00
Trenton H
01fd400ec7 Moves to the new action for cleaning the published images 2023-05-05 11:47:43 -07:00
shamoon
c59420581c Dynamic counts include all pages, hide for "Any" 2023-05-05 01:01:57 -07:00
shamoon
0aa9462cea Save tour completion, hide welcome widget 2023-05-04 23:29:20 -07:00
shamoon
bf2f6f84e5 Merge pull request #3314 from paperless-ngx/v1.14.4-changelog 2023-05-04 10:03:26 -07:00
github-actions
5126f01b57 Changelog v1.14.4 - GHA 2023-05-04 15:41:23 +00:00
Trenton H
ec4814a76e Bumps version to 1.14.4 2023-05-04 07:48:55 -07:00
Trenton H
69b53d70c5 Merge remote-tracking branch 'origin/dev' 2023-05-04 07:48:00 -07:00
Paperless-ngx Bot [bot]
02875f5a34 New Crowdin updates (#3298)
* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations django.po (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]
2023-05-04 07:45:48 -07:00
Trenton H
29d8c4e08d Fixes inversion in tagged mail searching 2023-05-04 06:29:41 -07:00
shamoon
df203311fe Fix note sorting, testing, bump search index version 2023-05-04 02:07:48 -07:00
shamoon
10f9b91c44 fix __in filtering 2023-05-04 02:07:16 -07:00
shamoon
cd861364a2 Merge pull request #3303 from paperless-ngx/fix/discussion-3300
Fix dynamic count labels hidden in light mode
2023-05-03 15:14:05 -07:00
shamoon
90b52abc04 Fix dynamic count labels hidden in light mode 2023-05-03 13:22:16 -07:00
github-actions
093b726c52 Changelog v1.14.3 - GHA 2023-05-03 09:29:40 -07:00
Trenton Holmes
fd84fc9dbe Re-add -dev version tag 2023-05-03 06:55:59 -07:00
Trenton Holmes
4353646b3a Bumps version to 1.14.3 2023-05-03 06:54:37 -07:00
Trenton Holmes
7545e5312c Merge remote-tracking branch 'origin/dev' 2023-05-03 06:53:33 -07:00
Paperless-ngx Bot [bot]
bd494ce9ec New Crowdin updates (#3226)
* New translations django.po (Indonesian)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations django.po (Arabic)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations django.po (Arabic)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations django.po (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]
2023-05-03 06:45:59 -07:00
Ross Brown
ee3cf8e6d1 Bump filelock from 3.10.2 to 3.12.0 to fix permissions bug 2023-05-02 07:32:41 -07:00
dependabot[bot]
df524fdc1f Merge pull request #3276 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/eslint-8.39.0 2023-05-01 22:38:59 +00:00
dependabot[bot]
f0c0cfee1d Bump eslint from 8.38.0 to 8.39.0 in /src-ui
Bumps [eslint](https://github.com/eslint/eslint) from 8.38.0 to 8.39.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.38.0...v8.39.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-01 22:28:37 +00:00
dependabot[bot]
cf1bf3c163 Merge pull request #3278 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/typescript-eslint/parser-5.59.2 2023-05-01 22:17:43 +00:00
dependabot[bot]
b9d703fe25 Bump @typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.58.0 to 5.59.2.
- [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/v5.59.2/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-01 22:07:13 +00:00
shamoon
46f7e685b6 Merge pull request #3275 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/types/node-18.16.3
Bump @types/node from 18.15.11 to 18.16.3 in /src-ui
2023-05-01 15:03:58 -07:00
shamoon
8023331fca Merge pull request #3277 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/rxjs-7.8.1
Bump rxjs from 7.8.0 to 7.8.1 in /src-ui
2023-05-01 15:03:43 -07:00
dependabot[bot]
597db7d4bd Bump @types/node from 18.15.11 to 18.16.3 in /src-ui
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.15.11 to 18.16.3.
- [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-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-01 21:48:24 +00:00
dependabot[bot]
773bd32cd0 Merge pull request #3274 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/typescript-eslint/eslint-plugin-5.59.2 2023-05-01 21:47:45 +00:00
dependabot[bot]
c7e3756de1 Merge pull request #3268 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/cypress-12.11.0 2023-05-01 21:45:12 +00:00
dependabot[bot]
64bf122c95 Bump rxjs from 7.8.0 to 7.8.1 in /src-ui
Bumps [rxjs](https://github.com/reactivex/rxjs) from 7.8.0 to 7.8.1.
- [Release notes](https://github.com/reactivex/rxjs/releases)
- [Changelog](https://github.com/ReactiveX/rxjs/blob/7.8.1/CHANGELOG.md)
- [Commits](https://github.com/reactivex/rxjs/compare/7.8.0...7.8.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-01 21:36:08 +00:00
dependabot[bot]
a92b0411fd Bump @typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.58.0 to 5.59.2.
- [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/v5.59.2/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-01 21:35:22 +00:00
dependabot[bot]
728d61762a Bump cypress from 12.9.0 to 12.11.0 in /src-ui
Bumps [cypress](https://github.com/cypress-io/cypress) from 12.9.0 to 12.11.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/v12.9.0...v12.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-01 21:34:33 +00:00
shamoon
d9783e2a4d Merge pull request #3270 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/angular/cli-15.2.7
Bulk bump angular packages to 15.2.8 in /src-ui
2023-05-01 14:33:41 -07:00
shamoon
b6303d2c16 Bulk bump angular packages to 15.2.8 2023-05-01 14:24:06 -07:00
dependabot[bot]
dd673a62b5 Bump @angular/cli from 15.2.6 to 15.2.7 in /src-ui
Bumps [@angular/cli](https://github.com/angular/angular-cli) from 15.2.6 to 15.2.7.
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/15.2.6...15.2.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-01 20:58:46 +00:00
Trenton Holmes
b7577038a0 Replace usages of os.rename with shutil.move to properly handle cases where the source and dest arent't on the same filesystem 2023-05-01 07:28:52 -07:00
Trenton Holmes
613b71d23b Ignores a specific _FILE setting which doesn't actually get set to a file 2023-05-01 07:23:31 -07:00
shamoon
0284100c2d Merge pull request #3243 from paperless-ngx/fix/issue-3229 2023-04-29 12:37:12 -07:00
Trenton H
26cd470d31 Don't ever send GMail related keywords if the server doesn't report support for the extensions 2023-04-29 09:34:50 -07:00
shamoon
ebaf509a42 Retain doc changes on tab switch after refresh doc 2023-04-29 00:23:30 -07:00
shamoon
646db73061 Update document-notes.component.ts 2023-04-28 21:56:40 -07:00
shamoon
e6df581909 Merge pull request #3232 from paperless-ngx/fix/issue-3231
Fix: close all docs on logout
2023-04-28 20:51:47 -07:00
shamoon
a8e12409b5 Merge pull request #3227 from paperless-ngx/feature/better-keyboard-dropdowns
Enhancement: better keyboard nav for filter/edit dropdowns
2023-04-28 20:51:38 -07:00
shamoon
b7c7e293f7 Doc detail tab switch fixes 2023-04-28 08:14:24 -07:00
shamoon
fe85aff052 Merge pull request #3222 from paperless-ngx/fix/advanced-queries-perms-fixes
Fix: Respect superuser for advanced queries, test coverage for object perms
2023-04-28 07:11:37 -07:00
shamoon
12d8bcad6e Close all docs on logout 2023-04-28 07:07:59 -07:00
shamoon
bbfc244f16 Better keyboard nav for filter/edit dropdowns 2023-04-27 23:54:43 -07:00
shamoon
e275a2736a Respect superuser for advanced queries, test coverage for object perms 2023-04-27 15:51:34 -07:00
shamoon
d2a8076596 Merge pull request #3218 from ikaruswill/fix/issue-3214
Fix: ALLOWED_HOSTS logic being overwritten when * is set
2023-04-27 13:24:35 -07:00
Will Ho
83344f748f Fix appends to ALLOWED_HOSTS should be string instead of list 2023-04-28 03:28:19 +08:00
shamoon
1d5dbc454d Update version string for dev 2023-04-27 11:43:59 -07:00
shamoon
16e2dc60aa Merge pull request #3219 from paperless-ngx/v1.14.2-changelog
[Documentation] Add v1.14.2 changelog
2023-04-27 11:26:32 -07:00
github-actions
a6fd4a8472 Changelog v1.14.2 - GHA 2023-04-27 18:19:05 +00:00
Will Ho
c25698dfa7 Update docs to reflect localhost being always included in ALLOWED_HOSTS 2023-04-28 02:09:26 +08:00
Will Ho
2ab2064a72 Fix ALLOWED_HOSTS logic being overwritten when * is set 2023-04-28 02:08:55 +08:00
shamoon
356c26ce84 v1.14.2 2023-04-27 10:57:03 -07:00
shamoon
bc56dfbcb5 Merge branch 'dev' 2023-04-27 10:47:43 -07:00
shamoon
daaeb36363 Merge pull request #3207 from paperless-ngx/l10n_dev
New Crowdin updates
2023-04-27 10:47:21 -07:00
Paperless-ngx Bot [bot]
a46a9cf0bf New translations messages.xlf (Luxembourgish)
[ci skip]
2023-04-27 10:46:14 -07:00
Paperless-ngx Bot [bot]
cbf435169a New translations messages.xlf (Croatian)
[ci skip]
2023-04-27 10:46:12 -07:00
Paperless-ngx Bot [bot]
7d05f6c54a New translations messages.xlf (Indonesian)
[ci skip]
2023-04-27 10:46:11 -07:00
Paperless-ngx Bot [bot]
8a8667d1f4 New translations messages.xlf (Portuguese, Brazilian)
[ci skip]
2023-04-27 10:46:10 -07:00
Paperless-ngx Bot [bot]
b9b8b764db New translations messages.xlf (Chinese Simplified)
[ci skip]
2023-04-27 10:46:09 -07:00
Paperless-ngx Bot [bot]
4978af351d New translations messages.xlf (Turkish)
[ci skip]
2023-04-27 10:46:07 -07:00
Paperless-ngx Bot [bot]
b5d639652d New translations messages.xlf (Swedish)
[ci skip]
2023-04-27 10:46:06 -07:00
Paperless-ngx Bot [bot]
c4ebfaf7f6 New translations messages.xlf (Slovenian)
[ci skip]
2023-04-27 10:46:05 -07:00
Paperless-ngx Bot [bot]
256266280d New translations messages.xlf (Russian)
[ci skip]
2023-04-27 10:46:03 -07:00
Paperless-ngx Bot [bot]
f886b58529 New translations messages.xlf (Portuguese)
[ci skip]
2023-04-27 10:46:02 -07:00
Paperless-ngx Bot [bot]
14fe93b9ab New translations messages.xlf (Polish)
[ci skip]
2023-04-27 10:46:01 -07:00
Paperless-ngx Bot [bot]
a2fb0ceb7d New translations messages.xlf (Norwegian)
[ci skip]
2023-04-27 10:46:00 -07:00
Paperless-ngx Bot [bot]
bc284ecf6d New translations messages.xlf (Dutch)
[ci skip]
2023-04-27 10:45:58 -07:00
Paperless-ngx Bot [bot]
6113f586c9 New translations messages.xlf (Italian)
[ci skip]
2023-04-27 10:45:57 -07:00
Paperless-ngx Bot [bot]
6c0862248c New translations messages.xlf (Hebrew)
[ci skip]
2023-04-27 10:45:56 -07:00
Paperless-ngx Bot [bot]
0e8f2a7c6c New translations messages.xlf (Danish)
[ci skip]
2023-04-27 10:45:55 -07:00
Paperless-ngx Bot [bot]
a808f8bbd5 New translations messages.xlf (Czech)
[ci skip]
2023-04-27 10:45:54 -07:00
Paperless-ngx Bot [bot]
9428d5638e New translations messages.xlf (Belarusian)
[ci skip]
2023-04-27 10:45:52 -07:00
Paperless-ngx Bot [bot]
e00cd5e304 New translations messages.xlf (Spanish)
[ci skip]
2023-04-27 10:45:51 -07:00
Paperless-ngx Bot [bot]
3c04bf2742 New translations messages.xlf (Romanian)
[ci skip]
2023-04-27 10:45:50 -07:00
Paperless-ngx Bot [bot]
2ef6d450bc New translations messages.xlf (Arabic)
[ci skip]
2023-04-27 10:45:34 -07:00
Paperless-ngx Bot [bot]
628b0bffeb New translations messages.xlf (Finnish)
[ci skip]
2023-04-27 10:45:33 -07:00
Paperless-ngx Bot [bot]
27eaa566a5 New translations messages.xlf (German)
[ci skip]
2023-04-27 10:45:32 -07:00
Paperless-ngx Bot [bot]
fb36646bd3 New translations messages.xlf (Serbian (Latin))
[ci skip]
2023-04-27 10:45:30 -07:00
Paperless-ngx Bot [bot]
304cc37618 New translations messages.xlf (Catalan)
[ci skip]
2023-04-27 10:45:28 -07:00
Paperless-ngx Bot [bot]
8239e8a581 New translations messages.xlf (French)
[ci skip]
2023-04-27 10:45:27 -07:00
shamoon
69e117d898 Merge pull request #3215 from paperless-ngx/feature-finnish-translation
Feature: Finnish translation
2023-04-27 10:44:44 -07:00
Paperless-ngx Bot [bot]
c773ec8a30 New translations messages.xlf (Arabic)
[ci skip]
2023-04-27 10:16:09 -07:00
shamoon
b4b49ee096 Add Finnish translation 2023-04-27 10:12:35 -07:00
shamoon
cf5ab87db9 Merge pull request #3211 from paperless-ngx/fix/issue-3210
Fix: Load saved views from app frame, not dashboard
2023-04-27 10:09:56 -07:00
shamoon
deaff293d2 Merge pull request #3209 from paperless-ngx/fix/issue-3206
Fix: advanced search or date searching + doc type/correspondent/storage path broken
2023-04-27 10:09:20 -07:00
shamoon
dccdebd2c0 Merge pull request #3212 from e1mo/fix-MixedContentTypeError
Fix MixedContentTypeError in add_inbox_tags handler
2023-04-27 09:57:46 -07:00
Moritz 'e1mo' Fromm
2674d4f034 Fix MixedContentTypeError in add_inbox_tags handler
The fact that Tags were fetched while the `view_documenttype` permission
was validated caused a MixedContentTypeError, thus the document
consumptio to fail because the list of available tags could not be
fetched.
2023-04-27 18:15:05 +02:00
github-actions
cb529561e1 Changelog v1.14.1 - GHA 2023-04-27 09:10:15 -07:00
shamoon
1a1cf49c67 Testing for whoosh support for multi-object query vars 2023-04-27 08:47:36 -07:00
shamoon
757b61a010 Load saved views from app frame, not dashboard 2023-04-27 08:20:21 -07:00
shamoon
448dcbab46 Include multi object queries in whoosh searcher 2023-04-27 08:06:55 -07:00
Paperless-ngx Bot [bot]
30fc5bbb09 New translations messages.xlf (Arabic)
[ci skip]
2023-04-27 07:18:09 -07:00
Trenton H
d3e14818df Reset dev versioning string 2023-04-27 07:16:20 -07:00
Trenton H
864e242ed9 Bumps version to 1.14.1 2023-04-27 07:12:44 -07:00
Trenton H
8f18baea8f Merge remote-tracking branch 'origin/dev' 2023-04-27 07:10:04 -07:00
Paperless-ngx Bot [bot]
130489a1a9 New Crowdin updates (#3175)
* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (French)
[ci skip]
2023-04-27 07:08:48 -07:00
shamoon
88a5a2049b Dont perform permissions queries by default 2023-04-27 07:06:49 -07:00
shamoon
15fb3e5328 Remove debug line 2023-04-27 01:24:22 -07:00
shamoon
90b800b030 Merge pull request #3199 from paperless-ngx/fix/issue-3197
Fix: permissions-aware statistics
2023-04-26 10:47:18 -07:00
shamoon
be88ad2676 Merge pull request #3198 from paperless-ngx/fix/issue-3196
Fix: Use document owner for matching if set
2023-04-26 10:46:43 -07:00
shamoon
dfadfc0f13 Respect permissions for statistics 2023-04-26 09:51:26 -07:00
shamoon
5ae48c8012 Use document owner for matching if set 2023-04-26 09:42:03 -07:00
Trenton H
6f163111ce Upgrades black to v23, upgrades ruff 2023-04-26 09:35:27 -07:00
Trenton H
3bcbd05252 Fixes ruff not running isort against the codebase 2023-04-26 09:35:27 -07:00
shamoon
e0d2697618 Merge pull request #3174 from paperless-ngx/fix/issue-3172
Fix: respect permissions on document view actions
2023-04-26 09:10:58 -07:00
shamoon
7340535b9a Remove outdated owner field from post_document docs 2023-04-26 08:50:42 -07:00
shamoon
c385355c2b Merge pull request #3191 from paperless-ngx/fix/increment-api-version
Increment API version for 1.14.1+
2023-04-26 08:36:39 -07:00
shamoon
a119790697 Merge pull request #3189 from paperless-ngx/fix/issue-3178 2023-04-26 08:20:19 -07:00
shamoon
e392098e35 Merge pull request #3190 from paperless-ngx/fix/issue-3167 2023-04-26 08:18:39 -07:00
Trenton H
a2d4d16867 Make the importer a little more robust against some types of errors 2023-04-26 07:08:50 -07:00
shamoon
7f74a85400 Increment API version for 1.14.1+ 2023-04-25 23:44:36 -07:00
shamoon
1fc9eaf360 Merge pull request #3163 from paperless-ngx/fix/issue-3162
Fix: Specify backend for auto-login
2023-04-25 23:40:33 -07:00
shamoon
1898f9b183 Add gnu-sed note for macOS 2023-04-25 23:37:22 -07:00
shamoon
1fb03a755f Respect permissions on document view actions 2023-04-25 22:49:37 -07:00
shamoon
8a505e3b66 Specify backend for auto-login 2023-04-25 22:15:21 -07:00
shamoon
45ecec5623 Fix dropdown Private items with empty set 2023-04-25 22:06:16 -07:00
Trenton H
b34dfcd72f Fixes StoragePath missing the owned or granted filter 2023-04-25 18:48:22 -07:00
Trenton H
319aa39925 Selectivly upgrade redis-py to resolve issues with socket connections 2023-04-25 10:03:41 -07:00
shamoon
08ac40dd48 Merge pull request #3161 from paperless-ngx/fix/issue-3160
Fix: Handle delete mail action with no filters
2023-04-25 08:11:23 -07:00
shamoon
0a0dc25e15 Merge pull request #3171 from FizzyMUC/fix-documentation
Fix typos and wrong version number in doc
2023-04-25 07:48:18 -07:00
shamoon
0557a15fa8 Update src/paperless_mail/mail.py with code suggestions
Co-authored-by: Trenton H <797416+stumpylog@users.noreply.github.com>
2023-04-25 07:22:16 -07:00
pascal
c5fafdda11 Fix typos and wrong version number in doc 2023-04-25 16:22:16 +02:00
shamoon
434d1fe225 Handle delete mail action with no filters 2023-04-24 20:55:01 -07:00
shamoon
405769dc97 Update environment.prod.ts 2023-04-24 13:10:35 -07:00
shamoon
ffa116bf44 Merge branch 'main' into dev 2023-04-24 13:10:18 -07:00
shamoon
6b1d8cabf4 Remove hidden Admin button from screenshots 2023-04-24 13:06:27 -07:00
shamoon
20c21e9e65 Merge pull request #3159 from paperless-ngx/v1.14.0-changelog
[Documentation] Add v1.14.0 changelog
2023-04-24 13:05:19 -07:00
github-actions
088743a155 Changelog v1.14.0 - GHA 2023-04-24 19:59:27 +00:00
shamoon
d1fba28936 v1.14.0 2023-04-24 12:06:22 -07:00
shamoon
65064a6934 Merge pull request #2997 from paperless-ngx/beta
[Beta] Paperless-ngx v1.14.0 Release Candidate 1
2023-04-24 12:04:56 -07:00
Paperless-ngx Bot [bot]
c7f5b7ae82 New Crowdin updates (#3123)
* New translations django.po (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations django.po (German)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]
2023-04-24 12:01:13 -07:00
Paperless-ngx Bot [bot]
2b244165e2 New Crowdin updates (#3123)
* New translations django.po (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations django.po (German)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]
2023-04-24 12:00:59 -07:00
shamoon
47682bc143 Add exec snippet for createsuperuser
Closes #3154
2023-04-23 20:48:08 -07:00
shamoon
0dcfb97824 Merge pull request #3146 from paperless-ngx/feature-catalan-translation
Feature: Catalan translation
2023-04-22 09:34:33 -07:00
shamoon
50af671e02 Add Catalan translation 2023-04-22 09:34:33 -07:00
shamoon
1ef273c35d Merge pull request #3146 from paperless-ngx/feature-catalan-translation
Feature: Catalan translation
2023-04-22 09:33:27 -07:00
shamoon
91b9831548 Add Catalan translation 2023-04-22 09:32:29 -07:00
shamoon
3241968626 Update frontend strings 2023-04-22 09:23:50 -07:00
shamoon
5dee65afcb Update frontend strings 2023-04-22 09:23:37 -07:00
Trenton H
4108eabd0d Allows users to set some additional Django settings for proxy configuration 2023-04-20 18:32:17 -07:00
Trenton H
829a693128 To support token auth better, increase the password field (more of a double duty) to be 2048 chars 2023-04-20 14:43:19 -07:00
shamoon
bf1e49fc4c Merge pull request #3105 from dcava/dev 2023-04-18 21:02:11 -07:00
shamoon
d1984c0dda Update testing for ignore macOS directory services file 2023-04-18 19:10:03 -07:00
David Cavallucci
22bb28db62 Changed consumer ignore files pattern for .DS_STORE, .DS_Store 2023-04-18 19:10:03 -07:00
Paperless-ngx Bot [bot]
721b52a45b New Crowdin updates (#3015)
* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations django.po (Spanish)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations django.po (Spanish)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations django.po (German)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations django.po (Czech)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations django.po (Polish)
[ci skip]

* New translations django.po (Polish)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations django.po (French)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]
2023-04-17 19:59:20 -07:00
Paperless-ngx Bot [bot]
edf4f98d41 New Crowdin updates (#3015)
* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations django.po (Spanish)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations django.po (Spanish)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations django.po (German)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations django.po (Czech)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations django.po (Polish)
[ci skip]

* New translations django.po (Polish)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations django.po (Catalan)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations django.po (French)
[ci skip]

* New translations django.po (Indonesian)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Catalan)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Indonesian)
[ci skip]
2023-04-17 19:58:58 -07:00
shamoon
7321ea1603 Update messages.xlf 2023-04-17 19:56:20 -07:00
shamoon
b80c2126a3 Fix multi-select with private items 2023-04-17 19:56:20 -07:00
shamoon
70afed9122 Update messages.xlf 2023-04-17 19:53:41 -07:00
shamoon
87479c32de Fix multi-select with private items 2023-04-17 19:42:24 -07:00
shamoon
35f75563a7 Use stale action & merge with lock action 2023-04-17 13:29:19 -07:00
shamoon
f5d6a9f428 Use stale action & merge with lock action 2023-04-17 13:27:47 -07:00
shamoon
2d314efb98 Change lock old threads to once daily 2023-04-17 12:43:56 -07:00
shamoon
930bac3c8b Change lock old threads to once daily 2023-04-17 12:43:27 -07:00
shamoon
d457f66e8b Merge pull request #3103 from paperless-ngx/fix/issue-3101
Fix: respect permissions for matching suggestions
2023-04-17 07:52:30 -07:00
shamoon
98ef1ba579 Update lock.yml 2023-04-16 19:26:03 -07:00
shamoon
dd8514a84d Update lock.yml 2023-04-16 19:25:29 -07:00
shamoon
7bcfeab85c Merge branch 'main' into dev 2023-04-16 17:14:24 -07:00
shamoon
d1cd03302c Merge branch 'dev' into beta 2023-04-16 09:09:37 -07:00
shamoon
36669652bf Merge pull request #3109 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/ng2-pdf-viewer-9.1.5
Bump ng2-pdf-viewer from 9.1.4 to 9.1.5 in /src-ui
2023-04-16 09:08:29 -07:00
dependabot[bot]
48234896a4 Merge pull request #3108 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/angular/router-15.2.7 2023-04-16 16:07:25 +00:00
shamoon
d4c310433e Grouped bump angular packages to 15.2.7 2023-04-16 08:56:58 -07:00
dependabot[bot]
a9d82a64a8 Bump ng2-pdf-viewer from 9.1.4 to 9.1.5 in /src-ui
Bumps [ng2-pdf-viewer](https://github.com/VadimDez/ng2-pdf-viewer) from 9.1.4 to 9.1.5.
- [Release notes](https://github.com/VadimDez/ng2-pdf-viewer/releases)
- [Changelog](https://github.com/VadimDez/ng2-pdf-viewer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/VadimDez/ng2-pdf-viewer/compare/9.1.4...9.1.5)

---
updated-dependencies:
- dependency-name: ng2-pdf-viewer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-16 15:21:46 +00:00
dependabot[bot]
74b6b8cb62 Bump @angular/router from 15.2.6 to 15.2.7 in /src-ui
Bumps [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) from 15.2.6 to 15.2.7.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/15.2.7/packages/router)

---
updated-dependencies:
- dependency-name: "@angular/router"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-16 15:21:21 +00:00
shamoon
52e8a1aba3 Include permissions for suggestions 2023-04-16 00:09:41 -07:00
shamoon
0f92523d28 Fix display of private objects sometimes 2023-04-16 00:09:41 -07:00
shamoon
6934fc6510 Correct duplicate ASN handling in docs
Closes #3082
2023-04-15 14:40:53 -07:00
shamoon
ad746be010 Lock old threads 2023-04-14 17:50:54 -07:00
shamoon
97119f729a Merge pull request #3089 from denilsonsa/patch-1
Whitespace changes, making sure the example is correcly aligned
2023-04-13 13:16:40 -07:00
Denilson Sá Maia
e576f1b0c4 Whitespace changes, making sure the example is correcly aligned
If desired, we could also replace spaces with [Box-drawing characters](https://en.wikipedia.org/wiki/Box-drawing_character), like this:

```
🗁 Documents folder
├─🗁 2019/                                   # By Year
│ └─🗁 My bank/
│   ├─🗎 Statement January.pdf
│   └─🗎 Statement February.pdf
└─🗁 Insurances/                             # Insurances
  ├─🗁 Healthcare 123/
  │ ├─🗎 2022-01-01 Statement January.pdf
  │ ├─🗎 2022-02-02 Letter.pdf
  │ └─🗎 2022-02-03 Letter.pdf
  └─🗁 Dental 456/
    └─🗎 2021-12-01 New Conditions.pdf
```

But rendering this with proper fixed-width characters can be troublesome on some systems.
2023-04-13 22:03:40 +02:00
shamoon
1771293fcf Merge pull request #3062 from paperless-ngx/fix/update-paperlesstask-on-failure
Fix: update PaperlessTask on hard failures
2023-04-12 19:01:36 -07:00
shamoon
d872423a76 Add info re tesseract language codes
Closes #3065
2023-04-10 14:04:30 -07:00
shamoon
6c12f65b2d Merge branch 'dev' into beta 2023-04-10 11:07:56 -07:00
shamoon
566f50ec66 Move zone.js dependency 2023-04-10 11:07:41 -07:00
shamoon
e702f9c317 Move zone.js dependency 2023-04-10 10:59:54 -07:00
dependabot[bot]
680f8086e7 Merge pull request #3071 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/typescript-4.9.5 2023-04-10 17:56:43 +00:00
dependabot[bot]
9216f000ad Bump typescript from 4.8.4 to 4.9.5 in /src-ui
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.8.4 to 4.9.5.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v4.8.4...v4.9.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-10 17:42:24 +00:00
shamoon
cea6ef7a66 Merge pull request #3068 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/angular/platform-browser-15.2.6
Bulk Bump npm packages 04.23
2023-04-10 10:39:32 -07:00
shamoon
3287daf4e4 Update cypress 2023-04-10 10:27:10 -07:00
shamoon
376b40b25f Update ng-bootstrap 2023-04-10 10:24:08 -07:00
shamoon
b00ca90d15 Update zone.js 2023-04-10 10:21:17 -07:00
shamoon
06ec83701c Update @typescript-eslint/eslint-plugin 2023-04-10 10:20:18 -07:00
shamoon
2b61ec32d0 Update eslint-parser 2023-04-10 10:19:53 -07:00
shamoon
08299dd85d Update concurrently 2023-04-10 10:13:48 -07:00
shamoon
a2e7199ff5 Update wait-on to 7.0.1 2023-04-10 10:13:12 -07:00
shamoon
28d68c8a77 Update @types/jest 2023-04-10 10:12:29 -07:00
shamoon
999abb7016 Update eslint 2023-04-10 10:11:29 -07:00
shamoon
5af2658d88 Update @typescript-eslint/parser 2023-04-10 10:09:02 -07:00
shamoon
46fd55d100 Update ngx-ui-tour-ng-bootstrap 2023-04-10 10:08:39 -07:00
shamoon
fd4d747927 Update jest-preset-angular 2023-04-10 10:06:17 -07:00
shamoon
ec3ea965d0 Update @typescript-eslint/eslint-plugin 2023-04-10 10:05:21 -07:00
shamoon
41e4438a05 Update jest-environment-jsdom 2023-04-10 10:04:13 -07:00
shamoon
254e0ea132 Update ng2-pdf-viewer 2023-04-10 10:04:02 -07:00
shamoon
190e24b25d Update ngx-file-drop 2023-04-10 10:00:08 -07:00
shamoon
3f22aa9638 Update popperjs 2023-04-10 09:58:38 -07:00
shamoon
0e679841a4 Update all angular packages 2023-04-10 09:56:33 -07:00
dependabot[bot]
e512e658e6 Bump @angular/platform-browser from 15.2.5 to 15.2.6 in /src-ui
Bumps [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) from 15.2.5 to 15.2.6.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/15.2.6/packages/platform-browser)

---
updated-dependencies:
- dependency-name: "@angular/platform-browser"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-10 16:54:00 +00:00
shamoon
f7cea2f92e Add tasks endpoint to list, clarify use 2023-04-10 09:38:14 -07:00
shamoon
de5689f5b2 Update paperlesstask on hard consumption failures 2023-04-09 20:40:16 -07:00
shamoon
e6cf5a5984 Update messages.xlf 2023-04-09 16:44:37 -07:00
shamoon
23e7ccb543 Update messages.xlf 2023-04-09 16:44:27 -07:00
shamoon
b4d97d4a2b Merge pull request #3060 from paperless-ngx/fix/issue-3052
Fix: Hide UI tour steps if user doesnt have permissions
2023-04-09 16:41:54 -07:00
shamoon
8f90fe79c8 Merge pull request #3061 from paperless-ngx/fix/issue-3053
Fix: Hide Permissions tab if user cannot view users
2023-04-09 16:41:45 -07:00
shamoon
eb0df5d5e9 Hide UI tour steps if user doesnt have permissions 2023-04-09 16:39:41 -07:00
shamoon
e75510309d Hide Permissions if user cannot view users 2023-04-09 16:17:48 -07:00
shamoon
3425d01853 Create feature-requests.yml 2023-04-05 16:22:28 -07:00
shamoon
606737f3b2 Update messages.xlf 2023-04-04 16:18:56 -07:00
shamoon
bf3b5fbf8e Update messages.xlf 2023-04-04 16:18:33 -07:00
shamoon
f2fb06e6f3 Hide delete button on detail page if no perms, fix error display & allow retry confirm button (#3020) 2023-04-04 16:16:17 -07:00
shamoon
e58ba44e3d Merge pull request #2990 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/wait-on-7.0.1
Bump wait-on from 6.0.1 to 7.0.1 in /src-ui
2023-04-03 16:55:02 -07:00
shamoon
1e19ec6b9a Merge pull request #3013 from paperless-ngx/feature-inline-plaintext-docs 2023-04-03 13:12:38 -07:00
shamoon
6ed637cfdd Inline plaintext document previews for complete styling 2023-04-03 10:03:59 -07:00
shamoon
1d17e24c6e Update version strings 2023-04-01 21:12:08 -07:00
shamoon
de155a753d Merge branch 'main' into dev 2023-04-01 21:08:33 -07:00
Trenton Holmes
1b4020b3d7 Fixes barcode tests not running 2023-04-01 17:38:18 -07:00
tooomm
b948750d55 Update README.md
Co-Authored-By: tooomm <tooomm@users.noreply.github.com>
2023-04-01 17:10:57 -07:00
Trenton H
ce41ac9158 Configures ruff as the one stop linter and resolves warnings it raised 2023-04-01 17:03:52 -07:00
dependabot[bot]
5869467db3 Merge pull request #2991 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/angular/common-15.2.5 2023-04-01 21:36:57 +00:00
dependabot[bot]
80472af53c Merge pull request #2993 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/types/node-18.15.11 2023-04-01 21:30:20 +00:00
shamoon
eaa6039082 Update angular packages 2023-04-01 14:24:21 -07:00
dependabot[bot]
03b84e7c43 Merge pull request #2992 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/ng-select/ng-select-10.0.4 2023-04-01 21:18:57 +00:00
dependabot[bot]
0ee8f5c498 Bump @types/node from 18.11.18 to 18.15.11 in /src-ui
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.11.18 to 18.15.11.
- [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-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 21:18:21 +00:00
shamoon
41d15e8731 Merge pull request #2989 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/typescript-eslint/eslint-plugin-5.57.0
Bump @typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui
2023-04-01 14:17:32 -07:00
dependabot[bot]
bef081d353 Bump @ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui
Bumps [@ng-select/ng-select](https://github.com/ng-select/ng-select) from 10.0.3 to 10.0.4.
- [Release notes](https://github.com/ng-select/ng-select/releases)
- [Changelog](https://github.com/ng-select/ng-select/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ng-select/ng-select/compare/v10.0.3...v10.0.4)

---
updated-dependencies:
- dependency-name: "@ng-select/ng-select"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 20:59:48 +00:00
dependabot[bot]
a79045c064 Bump @angular/common from 15.2.1 to 15.2.5 in /src-ui
Bumps [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) from 15.2.1 to 15.2.5.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/15.2.5/packages/common)

---
updated-dependencies:
- dependency-name: "@angular/common"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 20:59:19 +00:00
dependabot[bot]
24ae8249f9 Bump wait-on from 6.0.1 to 7.0.1 in /src-ui
Bumps [wait-on](https://github.com/jeffbski/wait-on) from 6.0.1 to 7.0.1.
- [Release notes](https://github.com/jeffbski/wait-on/releases)
- [Commits](https://github.com/jeffbski/wait-on/compare/v6.0.1...v7.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 20:58:31 +00:00
dependabot[bot]
81341df635 Bump @typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.50.0 to 5.57.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/v5.57.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 20:58:01 +00:00
Trenton H
3c2bbf244d Creates a data model for the document consumption, allowing stronger typing of arguments and setting of some information about the file only once 2023-04-01 11:05:34 -07:00
shamoon
fa60251c18 Merge pull request #2983 from paperless-ngx/fix-2982
Fix: Use exclude instead of difference for mariadb
2023-03-31 14:39:13 -07:00
shamoon
5bd06494d5 Use exclude instead of difference for mariadb 2023-03-31 13:52:06 -07:00
shamoon
2fd217ef1f Fix doc detail button reset on error 2023-03-31 13:47:35 -07:00
Paperless-ngx Bot [bot]
d7068ca42b New Crowdin updates (#2688)
* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations django.po (Italian)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations django.po (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations django.po (German)
[ci skip]

* New translations django.po (Russian)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations django.po (Swedish)
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]

* New translations messages.xlf (French)
[ci skip]

* New translations messages.xlf (Arabic)
[ci skip]

* New translations messages.xlf (German)
[ci skip]

* New translations messages.xlf (Russian)
[ci skip]

* New translations messages.xlf (Romanian)
[ci skip]

* New translations messages.xlf (Spanish)
[ci skip]

* New translations messages.xlf (Belarusian)
[ci skip]

* New translations messages.xlf (Czech)
[ci skip]

* New translations messages.xlf (Danish)
[ci skip]

* New translations messages.xlf (Finnish)
[ci skip]

* New translations messages.xlf (Hebrew)
[ci skip]

* New translations messages.xlf (Italian)
[ci skip]

* New translations messages.xlf (Dutch)
[ci skip]

* New translations messages.xlf (Norwegian)
[ci skip]

* New translations messages.xlf (Polish)
[ci skip]

* New translations messages.xlf (Portuguese)
[ci skip]

* New translations messages.xlf (Slovenian)
[ci skip]

* New translations messages.xlf (Swedish)
[ci skip]

* New translations messages.xlf (Turkish)
[ci skip]

* New translations messages.xlf (Chinese Simplified)
[ci skip]

* New translations messages.xlf (Portuguese, Brazilian)
[ci skip]

* New translations messages.xlf (Croatian)
[ci skip]

* New translations messages.xlf (Luxembourgish)
[ci skip]

* New translations messages.xlf (Serbian (Latin))
[ci skip]
2023-03-30 19:56:48 -07:00
shamoon
f7b19cddbf Update messages.xlf 2023-03-30 19:53:52 -07:00
shamoon
62e756a11e Merge pull request #2818 from paperless-ngx/fix-2809
Fix: permissions display should not show users with inherited permissions & unable to change owner
2023-03-30 19:49:12 -07:00
shamoon
c992661a17 Merge pull request #2966 from paperless-ngx/feature-double-click
Feature: double-click docs
2023-03-30 18:40:37 -07:00
Trenton H
dde3205425 Merge pull request #2907 from margau/feature-multiple-barcode-scanners
feature: Add support for zxing as barcode scanning lib
2023-03-29 12:12:56 -07:00
Trenton H
15a264de3d Enables images to be release to Quay.io, alongside the existing registries 2023-03-29 11:35:57 -07:00
Trenton H
66929a9088 Merge remote-tracking branch 'origin/dev' into feature-multiple-barcode-scanners 2023-03-29 09:40:10 -07:00
shamoon
45c9518a6d Add visual feedback to table titles 2023-03-29 09:20:26 -07:00
shamoon
95d32dc0da Implement double-click documents 2023-03-28 23:26:13 -07:00
shamoon
d5ab1119d3 Fix heights on transitions, text/plain display in dark mode 2023-03-28 22:47:04 -07:00
shamoon
d9110f4ef7 Merge pull request #2949 from paperless-ngx/feature-test-mailaccount
Feature: test mail account
2023-03-25 23:38:01 -07:00
Trenton Holmes
5468394ef2 Disables mingle and gossip. Not useful with the single worker we use 2023-03-25 19:17:02 -07:00
Trenton Holmes
7ad21e0e45 Configures logging to capture celery and kombu debugging to library 2023-03-25 19:17:02 -07:00
shamoon
5012c0c97c Adds testing for test mail account 2023-03-24 15:14:02 -07:00
shamoon
698208fcd5 Add test mail account 2023-03-24 15:14:02 -07:00
Trenton H
e0d5fd9290 Unlock channels_redis and implement the workaround from the issue to use pub/sub instead 2023-03-23 19:54:19 -07:00
Trenton H
4bd1974911 Updates to the latest and still working pipenv version. Updates to latest wheels 2023-03-23 18:00:08 -07:00
Trenton H
d246e4090a Adds a tip for using tokens instead of passwords, now that support is integrated 2023-03-23 08:52:12 -07:00
shamoon
ff172f5ea1 Update is_token checkbox and frontend strings 2023-03-23 08:52:12 -07:00
Trenton H
09b1413748 Allows users to use OAuth tokens instead of passwords 2023-03-23 08:52:12 -07:00
shamoon
14b997fe2c Merge pull request #2938 from paperless-ngx/fix-2935
Fix: unable to edit correspondents (in `dev`)
2023-03-23 08:00:14 -07:00
shamoon
908b412a9a Update messages.xlf
[ci skip]
2023-03-23 07:59:13 -07:00
shamoon
cbd80615be Owner/name unique constraint violation should exclude self 2023-03-23 07:35:18 -07:00
shamoon
a9707f0ab0 Update permissions-select.component.ts
[ci skip]
2023-03-21 08:30:43 -07:00
Trenton H
4637e33326 Adds possible scary looking log line that is actually fine to troubleshooting 2023-03-21 07:46:57 -07:00
Trenton H
4a5f21dd87 Limit the number of threads waiting for files to be ready during polling 2023-03-21 07:46:57 -07:00
Trenton H
0778c2808b Instead of using PIL directly to convert TIFF to PDF, use the existing library of img2pdf 2023-03-20 13:48:05 -07:00
Marvin Gaube
567a1bb770 fix: skip tiff tests for zxing 2023-03-20 20:59:59 +01:00
Marvin Gaube
743ee886be feat: add tests for barcode scanner value checks 2023-03-20 20:31:50 +01:00
shamoon
20c6abae63 exclude current user from permissions retrieval users
Revert "exclude current user from permissions retrieval users"

This reverts commit 87efd0ccc8d4eb9d8acb614d22a5c95ffdb895ae.

Update permissions-user.component.ts
2023-03-19 23:41:36 -07:00
shamoon
ae0c585918 Fix inherited permissions should not display per user in permissions form 2023-03-19 23:41:36 -07:00
shamoon
4cfc416cdc Handle user saved and no longer has permissions 2023-03-19 23:39:52 -07:00
shamoon
9902c4745d fix doc detail discard perm changes 2023-03-19 23:39:52 -07:00
shamoon
e373ca7bdc fix unable to change owner to someone else 2023-03-19 23:39:52 -07:00
shamoon
6a34a35585 Merge pull request #2910 from paperless-ngx/feature-improved-statistics-widget
Feature: Improved statistics widget
2023-03-19 23:34:19 -07:00
shamoon
ee935a2988 Update dashboard.png 2023-03-19 23:33:11 -07:00
shamoon
0a977a9d0a Re-implement file type progress bar 2023-03-19 23:22:28 -07:00
Tobias Schürg
4d26a3d2c6 add file-types bar to statistics widget (#2914) 2023-03-19 21:06:59 -07:00
shamoon
276d11e4e8 Merge pull request #2904 from paperless-ngx/feature-improve-comments-ui
Enhancement: rename comments to notes and improve notes UI
2023-03-19 14:34:49 -07:00
Marvin Gaube
e89c0f15dd feature: Add support for zxing as barcode scanning lib 2023-03-19 13:48:35 +01:00
shamoon
2bdf0aae14 simplify character count query
Co-Authored-By: Trenton H <797416+stumpylog@users.noreply.github.com>
2023-03-18 14:31:27 -07:00
shamoon
2bc7f0b8e0 truncate long mime types + limit total types displayed 2023-03-18 14:25:37 -07:00
shamoon
bf8ae22f3f Rename comments --> notes 2023-03-18 13:59:17 -07:00
Markus Ongyerth
a5c6dab7c3 Allow psql client certificate authentication 2023-03-18 07:43:18 -07:00
shamoon
f3eedec402 Improved statistics widget 2023-03-18 01:51:18 -07:00
shamoon
741152dd50 Update bulk-editor.component.html
[ci skip]
2023-03-17 23:13:01 -07:00
shamoon
89c639f850 Just include comments on document object 2023-03-17 18:47:03 -07:00
shamoon
727fb38baf Frontend testing for new comment UI features 2023-03-17 18:47:03 -07:00
shamoon
e19dd2d527 Support navigating directly to comments 2023-03-17 18:47:03 -07:00
shamoon
9aa41b3524 Support control/command-enter submit comment form 2023-03-17 18:47:03 -07:00
shamoon
3911740360 Show number of comments on cards, tab 2023-03-17 18:47:03 -07:00
shamoon
f161722b34 Merge pull request #2893 from paperless-ngx/feature-enhanced-object-filtering
Enhancement: support filtering multiple correspondents, doctypes & storage paths
2023-03-17 18:46:22 -07:00
shamoon
adb956467b Add frontend testing of multi-object filtering 2023-03-17 17:57:54 -07:00
shamoon
00e17f4d69 Allow filtering on multiple correspondents, doctypes, storage paths
Preserve 'Not assigned' option
Fix default logical operator
Update frontend strings
Fix radio button name overlaps
Use include / exclude with multi-select for OneToOne objects
2023-03-17 17:57:54 -07:00
shamoon
dbe49b24df Merge pull request #2839 from paperless-ngx/handle-private-objects
Fix: frontend handle "private" tags, doctypes, correspondents
2023-03-17 00:21:19 -07:00
shamoon
7e75193f4a Update settings.component.ts
[ci skip]
2023-03-15 22:44:34 -07:00
Trenton H
96e8cfb765 Couple more documentation improvements 2023-03-15 10:40:10 -07:00
Trenton H
d47ca6109a Apply suggestions from code review
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-03-15 10:40:10 -07:00
Trenton H
8ac7d56fc5 Improve documentation around barcodes, re-organize configuration and update links 2023-03-15 10:40:10 -07:00
Trenton Holmes
bfaede26c4 Replace commas with underscores to handle Chrome issues with commas 2023-03-15 10:29:04 -07:00
Trenton H
477fd360f8 Unlock cryptography version now that PiWheels built the most recent version. Update in bulk. 2023-03-15 06:35:05 -07:00
shamoon
5b50870f21 Merge pull request #2885 from maxtruxa/fix-docs-master-main
Fix: Update outdated docs referencing master
2023-03-14 07:31:13 -07:00
Max Truxa
8161316c01 Fix: Update outdated docs referencing master
The `master` branch is now called `main`.
2023-03-14 10:19:00 +01:00
shamoon
3cb26722f1 Merge pull request #2880 from igrybkov/patch-1
Fix formatting in "Setup" documentation page
2023-03-13 09:06:55 -07:00
Illia Grybkov
7912f4a22a Fix formatting in "Setup" documentation page 2023-03-13 09:40:24 -05:00
Trenton Holmes
851b23fb09 Adds additional note for bare metal suggesting Redis be secured 2023-03-12 20:53:53 -07:00
Trenton H
849a108520 Changes the celery serializer to use pickle over json 2023-03-12 20:53:53 -07:00
Trenton Holmes
97ff2e126c Adds owner and original name to the possible naming schemes 2023-03-12 15:29:58 -07:00
shamoon
ef6c4e6789 Update frontend strings for mail rule filter_to 2023-03-12 10:31:42 -07:00
Trenton H
3e467c517d Allows filtering email by the TO value(s) as well 2023-03-12 10:31:42 -07:00
shamoon
70ac696f17 Merge pull request #2863 from paperless-ngx/feature-fix-2814
Fix: logout on change password via frontend
2023-03-11 19:57:02 -08:00
shamoon
39c80ded58 Merge pull request #2869 from bsvka/patch-1
Fix typo
2023-03-11 09:57:58 -08:00
bsvka
98782ca69d Fix typo 2023-03-11 18:06:12 +01:00
shamoon
c332eea354 Force logout on change own password 2023-03-11 00:36:09 -08:00
shamoon
41a3f039b5 Update messages.xlf
[ci skip]
2023-03-10 23:36:50 -08:00
shamoon
2d3cf43bc5 Merge pull request #2820 from paperless-ngx/fix-2812
Fix: give superuser full doc perms
2023-03-10 21:53:35 -08:00
Trenton H
7c90702ff7 Updates to libqpdf 11.3.0 2023-03-10 20:36:17 -08:00
shamoon
952cf11b9e Merge pull request #2855 from white-gecko/patch-1
Update docker-compose steps to support podman
2023-03-10 19:19:07 -08:00
Trenton H
4383550d98 When tagging an email using Gmail label extensions, append the label instead of replacing 2023-03-10 09:19:58 -08:00
shamoon
fcba2cca77 Update filter-editor.component.ts
[ci skip]
2023-03-10 08:38:27 -08:00
shamoon
2042b85056 Merge pull request #2827 from paperless-ngx/feature-owner-aware-unique-model-names
Feature: owner-aware unique model name constraint
2023-03-09 22:34:14 -08:00
Natanael Arndt
283a2ab648 Update docker-compose start steps
As also written in the docker-compose file it is necessary to do the steps in the order:

1. Run 'docker-compose pull'.
2. Run 'docker-compose run --rm webserver createsuperuser' to create a user.
3. Run 'docker-compose up -d'.
2023-03-09 22:30:55 +01:00
Trenton H
5e7b93d153 Comment up the testing a bit more 2023-03-09 08:43:31 -08:00
shamoon
c4ac35164b API should 400 on unique violations 2023-03-08 20:16:21 -08:00
shamoon
22a13981f3 Handle "private" tags, doctypes, correspondents 2023-03-08 19:07:47 -08:00
shamoon
29251b6e38 Add test coverage for owner-aware unique constraints 2023-03-08 19:07:32 -08:00
shamoon
b382f1412a Change model uniqueness from name to name+owner 2023-03-08 19:07:32 -08:00
shamoon
320537a054 Give superuser full doc permissions 2023-03-08 19:07:06 -08:00
shamoon
2fe7f8be46 TagViewSet should use PassUserMixin 2023-03-08 19:03:59 -08:00
Trenton H
f100198a8a Handle the possilbe case of splitting on an empty string returning a list with an empty string 2023-03-08 07:32:17 -08:00
Trenton Holmes
b470fc0140 Adds a utility for the settings to parse out a list, seperated by something, from an environment key 2023-03-08 07:32:17 -08:00
Trenton H
db02d5eff0 Ensure dates from emails are made timezone aware if not already 2023-03-07 10:01:40 -08:00
shamoon
9564a9c28d Merge pull request #2830 from tooomm/patch-1
docs: better language code help
2023-03-06 16:56:08 -08:00
shamoon
55295922c8 Merge pull request #2838 from tooomm/patch-3
Chore: Properly collapse `All Changes` section in releases
2023-03-06 15:21:26 -08:00
tooomm
c5b701f99d add hints to ocr languages installation 2023-03-06 23:58:32 +01:00
tooomm
3c606efc46 fix collapse-after setting 2023-03-06 23:40:20 +01:00
shamoon
cbab1a51f1 Hide selects when user doesnt have view permissions
[ci skip]
2023-03-06 11:07:40 -08:00
Trenton H
41bcfcaffe Changes out the settings and a decent amount of test code to be pathlib compatible 2023-03-06 09:16:07 -08:00
shamoon
7cb14374cf Update permissions-dialog.component.html
[ci skip]
2023-03-06 08:51:47 -08:00
shamoon
19b9fd0578 Merge pull request #2819 from paperless-ngx/fix-2815
Fix: disable bulk edit dialog buttons during operation
2023-03-06 08:50:08 -08:00
shamoon
d668c475de Merge pull request #2832 from tooomm/patch-2
Chore: Don't include changelog PR for different releases
2023-03-05 15:53:59 -08:00
tooomm
248f3f2181 don't append changelog PR to unrelated release 2023-03-05 16:36:24 +01:00
tooomm
bcd10f63ea better language code help 2023-03-05 16:03:42 +01:00
Jonas Winkler
db9733f0d5 Merge pull request #2808 from paperless-ngx/bugfix-database-locked-on-permission-change
fix database locked error
2023-03-04 16:25:51 +01:00
shamoon
e6aa213aa1 disable bulk edit permissions dialog buttons on submit 2023-03-03 19:32:39 -08:00
shamoon
f0fa726e71 Merge pull request #2813 from paperless-ngx/fix-2811
Fix: Disable suggestions for read-only docs
2023-03-03 15:36:43 -08:00
shamoon
ae46ef7add Disable suggestions for read-only docs 2023-03-03 15:21:02 -08:00
Jonas Winkler
c87ca25f22 fix database locked error 2023-03-03 23:30:12 +01:00
Jonas Winkler
ef627d53e5 Merge pull request #2806 from paperless-ngx/update-django-po-messages
update django.po messages
2023-03-03 20:45:10 +01:00
Jonas Winkler
d0fcf3607d update django.po messages 2023-03-03 20:16:57 +01:00
shamoon
3dbb7e5781 Merge pull request #2804 from paperless-ngx/fix-processed-mail-migration
Update processed mail migration
2023-03-03 11:11:54 -08:00
shamoon
9597358cb0 Update processed mail migration 2023-03-03 10:40:29 -08:00
shamoon
c5a21a3b0e Fix edit dialog error surfacing 2023-03-03 10:21:08 -08:00
shamoon
f56ccec77f Surface edit dialog errors all the way 2023-03-03 08:55:52 -08:00
shamoon
489340a338 Update admin.py 2023-03-02 19:37:09 -08:00
Jonas Winkler
e9e3d75383 Merge pull request #2718 from paperless-ngx/feature/2396-better-mail-actions
Feature/2396 better mail actions
2023-03-02 23:14:04 +01:00
Trenton H
74a1e5ed86 Disables creation of videos during testing with Cypress 2023-03-02 08:03:41 -08:00
Trenton H
3d961a3dbb Enable package caching for frontend testing 2023-03-02 08:03:41 -08:00
dependabot[bot]
604d56d0b8 Bump leonsteinhaeuser/project-beta-automations from 2.0.1 to 2.1.0
Bumps [leonsteinhaeuser/project-beta-automations](https://github.com/leonsteinhaeuser/project-beta-automations) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/leonsteinhaeuser/project-beta-automations/releases)
- [Commits](https://github.com/leonsteinhaeuser/project-beta-automations/compare/v2.0.1...v2.1.0)

---
updated-dependencies:
- dependency-name: leonsteinhaeuser/project-beta-automations
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 14:57:16 -08:00
shamoon
a82e259c1d Merge pull request #2793 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/zone.js-0.12.0
Bump zone.js from 0.11.8 to 0.12.0 in /src-ui
2023-03-01 14:31:39 -08:00
dependabot[bot]
34ef99a8ab Bump zone.js from 0.11.8 to 0.12.0 in /src-ui
Bumps [zone.js](https://github.com/angular/angular/tree/HEAD/packages/zone.js) from 0.11.8 to 0.12.0.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/packages/zone.js/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/zone.js-0.12.0/packages/zone.js)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 22:10:43 +00:00
shamoon
fa389d19d0 Merge pull request #2792 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/typescript-eslint/parser-5.54.0
Bump @typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui
2023-03-01 13:44:31 -08:00
shamoon
ebe70d996c Merge pull request #2788 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/angular/compiler-15.2.1
Bulk Bump angular packages to 15.2.1 in /src-ui
2023-03-01 13:41:22 -08:00
dependabot[bot]
e83e13fd57 Bulk bump angular to 15.2.1
Bump @angular/compiler from 15.1.2 to 15.2.1 in /src-ui

Bumps [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) from 15.1.2 to 15.2.1.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/15.2.1/packages/compiler)

---
updated-dependencies:
- dependency-name: "@angular/compiler"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 13:26:42 -08:00
dependabot[bot]
02362ae5e1 Bump @typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.50.0 to 5.54.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/v5.54.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 21:00:01 +00:00
Jonas Winkler
e0f324f61c fix links in django admin 2023-03-01 18:17:55 +01:00
Trenton H
c422a081bf Be sure the scratch directory exists before using it as temporary directory 2023-03-01 07:13:31 -08:00
shamoon
72efb24b73 fix settings change detection on delete 2023-03-01 01:14:10 -08:00
shamoon
ee7653a8cd Make user_permissions not required 2023-03-01 00:33:01 -08:00
Jonas Winkler
020abaf7d6 Merge pull request #2777 from paperless-ngx/bugfix-owner-on-new-document
Don't submit owner via API on document upload
2023-03-01 01:08:54 +01:00
Jonas Winkler
6e2f6350e6 don't submit owner via API 2023-02-28 18:32:09 +01:00
Trenton Holmes
6b939f7567 Returns to using hashing against primary keys, at least for fields. Improves testing coverage 2023-02-28 08:13:10 -08:00
Trenton Holmes
c958a7c593 Changes from a hash based system to a time based system to prevent extra retrains 2023-02-28 08:13:10 -08:00
Trenton H
8709ea4df0 Changes classifier training to hold less data in memory at the same time 2023-02-28 08:13:10 -08:00
Trenton H
16d3041d7a Add new packages catagory for mypy typing stubs and configure some mypy settings in setup.cfg 2023-02-27 15:59:55 -08:00
shamoon
64b2037eda Update release-drafter.yml
[ci skip]
2023-02-27 11:46:43 -08:00
Jonas Winkler
4133001c73 Merge pull request #2743 from bdr99/ocr_skip_archive_file
Feature: Add PAPERLESS_OCR_SKIP_ARCHIVE_FILE config setting
2023-02-27 11:01:54 +01:00
Brandon Rothweiler
d5f46eedab Add tests for checks.py 2023-02-24 11:27:40 -05:00
Jonas Winkler
7a2a3e048e cleanup test code 2023-02-24 12:49:54 +01:00
Brandon Rothweiler
20891a370b Fix typo in deprecation log message 2023-02-23 22:52:31 -05:00
Brandon Rothweiler
ca412e0184 Add PAPERLESS_OCR_SKIP_ARCHIVE_FILE config setting 2023-02-23 22:42:57 -05:00
Brandon Rothweiler
8a89f5ae27 Revert "Merge pull request #2732 from bdr99/skip_neverarchive"
This reverts commit 77b23d3acb, reversing
changes made to 5d8aa27831.
2023-02-23 21:26:53 -05:00
shamoon
dbea2acc8f Merge pull request #2739 from paperless-ngx/fix-2738
Fix: only offer log files that exist
2023-02-23 15:32:29 -08:00
shamoon
65167625c4 Merge pull request #2704 from paperless-ngx/feature-dynamic-document-counts 2023-02-23 15:32:08 -08:00
shamoon
77b23d3acb Merge pull request #2732 from bdr99/skip_neverarchive
Feature: Add a setting to disable creating archive files
2023-02-23 15:22:49 -08:00
shamoon
5d8aa27831 Merge pull request #2717 from paperless-ngx/fix-user-perms-editing-issues
Fix: permissions editing and initial view issues
2023-02-23 15:19:53 -08:00
shamoon
b15eda9466 Merge pull request #2703 from paperless-ngx/fix-2702
Fix: reset saved view ID on quickFilter
2023-02-23 15:18:48 -08:00
Jonas Winkler
5eb4b975ae fix the test cases for python 3.8 2023-02-24 00:15:40 +01:00
Jonas Winkler
3ce1e01d96 fix the test cases 2023-02-24 00:03:28 +01:00
Trenton H
afcefe3d04 Fixes creation of the paperless.conf in the release dist 2023-02-23 14:59:34 -08:00
shamoon
4726fe8b6f Only return logs that exist 2023-02-23 14:43:43 -08:00
Jonas Winkler
201a4a7ef9 changes 2023-02-23 22:02:38 +01:00
Brandon Rothweiler
93a6391f96 Add a setting to disable creating an archive file 2023-02-22 15:27:17 -05:00
shamoon
782db3f324 Merge pull request #2727 from bdr99/disable-matching
Feature: Add an option to disable matching
2023-02-22 07:13:27 -08:00
Brandon Rothweiler
7610a0459e Add test 2023-02-22 09:39:29 -05:00
shamoon
927616decb Reorder frontend matching model options & update strings 2023-02-21 20:58:52 -08:00
Brandon Rothweiler
8b2b7bbe6d Add an option to disable matching 2023-02-21 20:01:30 -05:00
shamoon
ca30dbc832 Update translation strings 2023-02-21 13:26:40 -08:00
Jonas Winkler
3c3c847db5 reconfigure mail admin 2023-02-21 22:07:14 +01:00
Jonas Winkler
b7a2601724 Merge branch 'dev' into feature/2396-better-mail-actions 2023-02-21 18:37:17 +01:00
Jonas Winkler
1189df1fe6 changes 2023-02-21 18:37:08 +01:00
Jonas Winkler
a37177703c mark mails as processed internally, don't process processed mails again 2023-02-21 13:50:34 +01:00
Trenton H
8df1324afd Updates the latest test to use status codes 2023-02-20 10:25:21 -08:00
Trenton Holmes
a6e2708605 Changes testing to use more declarative status code names from DRF 2023-02-20 10:25:21 -08:00
Trenton Holmes
0df91c31f1 Creates a mix-in for asserting file system states 2023-02-20 10:25:21 -08:00
shamoon
1718cf6504 prevent edit docs when dont have global edit perms 2023-02-20 08:20:37 -08:00
Trenton Holmes
bec8d00232 Allow setting the ASN on document upload 2023-02-20 07:56:37 -08:00
Trenton Holmes
1471dd72a6 Bulk update of all Python libraries 2023-02-20 07:15:48 -08:00
shamoon
588a786d73 Fix startup without saved view permissions 2023-02-20 03:10:03 -08:00
Jonas Winkler
7e1c1da424 remove unused argument 2023-02-20 11:57:56 +01:00
Jonas Winkler
94ebe3b61c implement better mail actions 2023-02-20 11:46:46 +01:00
shamoon
75c5ccccec Fix dyanmic disabling checkboxes in permissions select 2023-02-20 02:15:11 -08:00
shamoon
eb4c8e1b1e Fix inherited permissions being set at user level & unable to unselect existing perms 2023-02-20 01:27:44 -08:00
shamoon
73b1b942a9 Merge pull request #2701 from paperless-ngx/fix-bulk-edit-reset-apply-button
Fix: bulk edit reset apply button state
2023-02-19 18:40:14 -08:00
Jonas Winkler
8c5ef111d8 Merge branch 'dev' into feature/2396-better-mail-actions 2023-02-19 23:29:52 +01:00
shamoon
b6266ad18f Live document counts for document filtering 2023-02-18 20:07:33 -08:00
shamoon
2635c3a1a0 Live document counts for bulk edit 2023-02-18 20:07:07 -08:00
shamoon
13ece25de0 Merge pull request #2359 from paperless-ngx/feature-log-failed-auth
Feature: Log failed login attempts
2023-02-18 19:40:51 -08:00
shamoon
c69ece1d0e Fix: reset saved view ID on quickFilter 2023-02-18 18:36:19 -08:00
Trenton H
07ec6ff7ab Adds some quick testing of the IP logging during a failed login 2023-02-18 15:26:09 -08:00
shamoon
66e23bd356 Fix apply button should reset state on close dropdown 2023-02-18 14:29:49 -08:00
Trenton H
abc58000b4 Moves the renaming ttask into the serialiser update instead of post_save. Feels more correct 2023-02-18 12:19:33 -08:00
Trenton H
5e3ef94697 Moves the renaming triggered from a storage path change to be a background task 2023-02-18 12:19:33 -08:00
shamoon
2daee375d0 Remove obsolete UI warning on edit storage path 2023-02-18 12:19:33 -08:00
Trenton H
857944aabe When a StoragePath is changed, check if related documents require a rename 2023-02-18 12:19:33 -08:00
Trenton H
72f58d54a3 Moves django-ipware up to be with other Django libraries 2023-02-17 08:12:27 -08:00
Michael Shamoon
668b068bb5 Log failed login attempts 2023-02-17 08:12:27 -08:00
shamoon
9893ae9880 Merge pull request #2689 from paperless-ngx/feature-update-error-messages
Feature: update error message colors & show on document failures
2023-02-17 07:52:31 -08:00
shamoon
9cdf2f046f Make error message toasts more visually distinct 2023-02-17 07:51:21 -08:00
shamoon
f7f841ce6d Show errors on document save 2023-02-17 07:51:21 -08:00
shamoon
e8a52d48cf Merge pull request #2694 from paperless-ngx/fix-2693 2023-02-17 07:40:37 -08:00
shamoon
21eb253c57 Merge pull request #2147 from paperless-ngx/feature-permissions
Feature: multi-user permissions
2023-02-17 07:21:18 -08:00
shamoon
754286cb9a Merge pull request #2692 from nathanaelhoun/fix-missing-i18n-for-mobile-preview
fix: add missing i18n for mobile "preview" pane
2023-02-17 07:19:05 -08:00
Nathanaël Houn
08f5d9a92f docs: fix command used for i18n extraction 2023-02-17 07:14:14 -08:00
shamoon
a1a61000ab Remove outdated PAPERLESS_WORKER_RETRY 2023-02-17 07:07:13 -08:00
Nathanaël Houn
dd91d4264a fix: added missing i18n placeholder for file preview 2023-02-17 14:08:05 +01:00
shamoon
9d87ac5244 Update messages.xlf 2023-02-16 20:45:11 -08:00
shamoon
3559e27cdd Merge branch 'dev' into feature-permissions 2023-02-16 20:44:51 -08:00
shamoon
4b9c79fa07 Update messages.xlf 2023-02-16 20:44:02 -08:00
shamoon
ee197bf89f Add dev tag to dev version 2023-02-16 20:43:14 -08:00
shamoon
31dac60d04 Merge pull request #2690 from paperless-ngx/v1.13.0-changelog
[Documentation] Add v1.13.0 changelog
2023-02-16 20:42:01 -08:00
github-actions
75a7dd38a1 Changelog v1.13.0 - GHA 2023-02-16 20:38:57 -08:00
Jonas
d7cb7c78af adjust mail workflow, execute mail actions only after consumption is successful 2023-02-16 22:51:46 +01:00
shamoon
148f394679 Update frontend strings 2023-02-14 11:53:10 -08:00
shamoon
f57873fb1b Merge branch 'dev' into feature-permissions 2023-02-14 11:35:48 -08:00
shamoon
32754defef Merge branch 'dev' into feature-permissions 2023-02-14 11:32:37 -08:00
shamoon
0e83c94832 Resolve migration conflicts 2023-02-03 14:25:22 -08:00
shamoon
d2a6f79612 Merge branch 'dev' into feature-permissions 2023-02-03 14:23:50 -08:00
Trenton H
94db39e055 A few minor tweaks to the backend 2023-01-30 14:37:09 -08:00
Michael Shamoon
d15773f282 Merge branch 'dev' into feature-permissions 2023-01-27 12:35:48 -08:00
Michael Shamoon
118e3703dc Disable redo OCR without edit permissions 2023-01-27 12:21:45 -08:00
Michael Shamoon
9b1b620a9c Include group model in frontend permissions 2023-01-25 14:03:45 -08:00
Michael Shamoon
6d3feaebfd Merge branch 'dev' into feature-permissions 2023-01-25 09:58:36 -08:00
Michael Shamoon
781929e9a8 Add permissions docs 2023-01-25 09:37:49 -08:00
Michael Shamoon
5fc7c15039 Fix conflicting migrations from dev 2023-01-24 14:23:01 -08:00
Michael Shamoon
44f860d9b0 Merge branch 'dev' into feature-permissions 2023-01-24 14:10:45 -08:00
shamoon
0cfa5211e9 Merge branch 'dev' into feature-permissions 2023-01-16 15:59:25 -08:00
Michael Shamoon
d689a707a4 Update Pipfile.lock 2023-01-06 18:09:42 -08:00
Michael Shamoon
55e1745889 Merge branch 'dev' into feature-permissions 2023-01-06 18:04:00 -08:00
Michael Shamoon
43ec058593 Update Pipfile.lock 2023-01-05 19:47:25 -08:00
Michael Shamoon
a4d96061de Merge branch 'dev' into feature-permissions 2023-01-05 19:45:12 -08:00
Michael Shamoon
f1eecd146d include email + pw for frontend user editing 2023-01-03 08:29:36 -08:00
Michael Shamoon
1663450c1f include owner on mailrule / account creation 2023-01-01 21:13:08 -08:00
Michael Shamoon
d840308392 fix merge conflict for edit dialog succeeded and pw not required 2023-01-01 17:55:52 -08:00
Michael Shamoon
a08467342c Merge branch 'dev' into feature-permissions 2023-01-01 17:51:41 -08:00
Michael Shamoon
d71d388c08 Merge branch 'dev' into feature-permissions 2022-12-29 20:12:42 -08:00
Michael Shamoon
e2093436ac lint for eslint 2022-12-17 21:49:08 -08:00
Michael Shamoon
b7e2013589 visually disable edit fields for permissions 2022-12-17 21:49:07 -08:00
Michael Shamoon
f31cee75f3 Merge branch 'dev' into feature-permissions 2022-12-17 20:05:12 -08:00
Michael Shamoon
ec27f3c053 move permissions input components 2022-12-14 00:47:54 -08:00
Michael Shamoon
737f00df3a Fix bulk setting null owner / permissions 2022-12-14 00:47:54 -08:00
Michael Shamoon
e6804dad2f consumed via mail should default to owner 2022-12-13 22:22:12 -08:00
Michael Shamoon
1875e9852e Resolve migration conflict 2022-12-13 07:00:52 -08:00
Michael Shamoon
f021e7fcc3 Merge branch 'dev' into feature-permissions 2022-12-13 06:57:33 -08:00
Michael Shamoon
4cf9ed9d26 Support owner and object permissions for advanced queries 2022-12-12 22:40:31 -08:00
Michael Shamoon
f8b77d7ef7 fix inherited permissions not visually showing as checked 2022-12-12 22:40:31 -08:00
Michael Shamoon
31850c3351 fix empty set permissions 2022-12-12 13:37:59 -08:00
Michael Shamoon
446842ecfc Document uploads should be owned by user 2022-12-12 13:24:59 -08:00
Michael Shamoon
8159b7574c Use accordion for permissions in object edit dialogs 2022-12-10 17:02:02 -08:00
Michael Shamoon
7050f29cff Forgot to include ObjectOwnedOrGrandtedPermissionsFilter on documents 2022-12-10 15:40:34 -08:00
Michael Shamoon
2f32565476 fix user / group editing 2022-12-10 15:36:07 -08:00
Michael Shamoon
ceeb2da3fe Merge branch 'dev' into feature-permissions 2022-12-09 17:54:14 -08:00
Michael Shamoon
6dc5c1de32 Support bulk edit owner 2022-12-09 17:51:01 -08:00
Michael Shamoon
a5ab6f2558 Add ability to set owner per object 2022-12-09 15:54:30 -08:00
Michael Shamoon
f846c2934c fix missing perms on Tags 2022-12-09 09:29:31 -08:00
Michael Shamoon
1adb5e724d fix object creation, user serialization, user creation 2022-12-09 04:59:15 -08:00
Michael Shamoon
8fad13b500 Merge branch 'dev' into feature-permissions 2022-12-09 03:31:26 -08:00
Michael Shamoon
6b2ee0e301 Merge branch 'dev' into feature-permissions 2022-12-08 12:53:27 -08:00
Michael Shamoon
7a241950d4 disable instead of hide doc edit buttons 2022-12-08 11:19:52 -08:00
Michael Shamoon
c1a1f6d74e Return all perms for superusers 2022-12-08 11:10:13 -08:00
Michael Shamoon
b99422da12 Address CodeQL 2022-12-08 09:31:00 -08:00
Michael Shamoon
2ec695fba7 remove dupe mail tab from settings 2022-12-08 02:39:33 -08:00
Michael Shamoon
109c07b23b Merge branch 'dev' into feature-permissions 2022-12-08 02:24:17 -08:00
Michael Shamoon
bf34c955ff Bulk editor enabling/disabling by permissions 2022-12-08 02:22:58 -08:00
Michael Shamoon
6ece5240a5 Bulk edit permissions 2022-12-08 02:03:50 -08:00
Michael Shamoon
211fbf0cf6 Refactor permissions API endpoints, UI group permissions 2022-12-08 00:05:16 -08:00
Michael Shamoon
f2d635671d Management lists edit / delete button disabling by permissions 2022-12-07 17:49:02 -08:00
Michael Shamoon
8b204cac99 disable document form components when no object permissions 2022-12-07 15:46:52 -08:00
Michael Shamoon
d15c701510 Remove display_name property 2022-12-07 14:59:27 -08:00
Michael Shamoon
c73688d167 add share to c/dt/t/sp, refactor share input, ifOwner directive 2022-12-07 14:55:40 -08:00
Michael Shamoon
32da039d5f fix tests for auth 2022-12-07 08:04:51 -08:00
Michael Shamoon
79da613cb6 Unify API perm endpoint to set_permissions, initial frontend support for doc sharing 2022-12-07 00:49:26 -08:00
Michael Shamoon
2973e4672a fix python tests for user object perms 2022-12-06 22:05:24 -08:00
Michael Shamoon
18e0012a59 API object permissions retrieval, grant and revoke 2022-12-06 22:05:24 -08:00
Michael Shamoon
2554ced198 Object creation with owner 2022-12-05 23:41:17 -08:00
Michael Shamoon
fad13c148e Object-level permissions + filtering 2022-12-05 22:56:03 -08:00
Michael Shamoon
dbaa606a9f add django-guardian, djangorestframework-guardian 2022-12-05 21:02:56 -08:00
Michael Shamoon
c0bccc6a95 Merge branch 'dev' into feature-global-ui-permissions 2022-12-05 15:56:32 -08:00
Michael Shamoon
b1a4eec7be Change toggle all, fix multiple group inheritance, fix select dark mode display 2022-12-05 15:51:53 -08:00
Michael Shamoon
bb8a0d26e2 Fix superuser initial disable individual perms, permissions select setup 2022-12-05 13:23:08 -08:00
Michael Shamoon
629a5dd61e Fix some merge errors, integrate permissions for frontend mail 2022-12-05 12:28:44 -08:00
Michael Shamoon
b21970fd53 Merge branch 'dev'
commit fb9d3f736b
Merge: 4d4d5453 049dc179
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sun Dec 4 16:47:58 2022 -0800

    Merge pull request #2000 from paperless-ngx/feature-frontend-paperless-mail

    Feature: frontend paperless mail

commit 4d4d545343
Merge: 2704bcb9 4b31e5d0
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 16:34:41 2022 -0800

    Merge pull request #848 from p-h-a-i-l/feature-consume-eml

    Feature ability to consume mails and eml files

commit 049dc17902
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 16:33:07 2022 -0800

    Moves where the mail views live and puts the ordering on those

commit 4b31e5d0b4
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 14:00:59 2022 -0800

    Fixes my broken formatting

commit 8076ebd78c
Merge: fe2db4db 2704bcb9
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 13:55:46 2022 -0800

    Merge remote-tracking branch 'upstream/dev' into feature-consume-eml

commit 2704bcb979
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 13:06:18 2022 -0800

    Resets to -dev versioning

commit 59f6074093
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 12:58:03 2022 -0800

    Bumps version to 1.10.2

commit b1da7f3491
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 12:57:19 2022 -0800

    Probably fixes the changelog step not working

commit adde88e7b9
Merge: a8f3c4be 8e876ef2
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 12:55:55 2022 -0800

    Merge branch 'dev'

commit 8e876ef2d1
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Dec 4 10:20:48 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit 2ea0f83a91
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 05:12:02 2022 -0800

    New translations messages.xlf (Italian)
    [ci skip]

commit 05d8ea5a9d
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:09:05 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit 967248233f
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:09:04 2022 -0800

    New translations messages.xlf (French)
    [ci skip]

commit b4c4b9fb6a
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:09:03 2022 -0800

    New translations messages.xlf (Spanish)
    [ci skip]

commit adb6483abc
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:09:01 2022 -0800

    New translations messages.xlf (Arabic)
    [ci skip]

commit 908db55bb7
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:09:00 2022 -0800

    New translations messages.xlf (Belarusian)
    [ci skip]

commit 610f20de28
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:59 2022 -0800

    New translations messages.xlf (Czech)
    [ci skip]

commit b2513a5cde
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:57 2022 -0800

    New translations messages.xlf (Danish)
    [ci skip]

commit bfa1c13d01
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:56 2022 -0800

    New translations messages.xlf (Finnish)
    [ci skip]

commit 12aaff431f
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:55 2022 -0800

    New translations messages.xlf (Hebrew)
    [ci skip]

commit 547e5ea55e
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:54 2022 -0800

    New translations messages.xlf (Italian)
    [ci skip]

commit c301127096
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:52 2022 -0800

    New translations messages.xlf (Dutch)
    [ci skip]

commit 19147855e7
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:51 2022 -0800

    New translations messages.xlf (Romanian)
    [ci skip]

commit 4e7c7ea1d6
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:49 2022 -0800

    New translations messages.xlf (Norwegian)
    [ci skip]

commit fcf8a49160
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:48 2022 -0800

    New translations messages.xlf (Portuguese)
    [ci skip]

commit c6d658a954
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:47 2022 -0800

    New translations messages.xlf (Russian)
    [ci skip]

commit a78cd6526c
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:45 2022 -0800

    New translations messages.xlf (Slovenian)
    [ci skip]

commit bf895b54f4
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:44 2022 -0800

    New translations messages.xlf (Swedish)
    [ci skip]

commit e5f84ef583
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:43 2022 -0800

    New translations messages.xlf (Turkish)
    [ci skip]

commit 8c690a9a51
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:41 2022 -0800

    New translations messages.xlf (Chinese Simplified)
    [ci skip]

commit 56526b970a
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:40 2022 -0800

    New translations messages.xlf (Portuguese, Brazilian)
    [ci skip]

commit 94fbf92916
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:38 2022 -0800

    New translations messages.xlf (Croatian)
    [ci skip]

commit 37f5e46d09
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:37 2022 -0800

    New translations messages.xlf (Luxembourgish)
    [ci skip]

commit 38be817637
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:36 2022 -0800

    New translations messages.xlf (Polish)
    [ci skip]

commit 17303f41da
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Dec 3 02:08:34 2022 -0800

    New translations messages.xlf (German)
    [ci skip]

commit 55ef0d4a1b
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Dec 4 08:44:35 2022 -0800

    Fixes language code checks around two part languages

commit a8f3c4be54
Merge: fa62ae82 1b9de2be
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 18:47:09 2022 -0800

    Merge pull request #1947 from alexander-bauer/helm

    Take ownership of k8s-at-home Helm chart,

commit 1b9de2be5a
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 18:46:19 2022 -0800

    Use checkout v3

commit 0e8265f1ae
Merge: ea38eb01 5b45a140
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 18:44:28 2022 -0800

    Merge pull request #2109 from paperless-ngx/fix/redis-socket-parsing

    Bugfix: Redis socket compatibility didn't handle URLs with ports

commit 5b45a140b9
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sat Dec 3 18:30:21 2022 -0800

    Fixes issue when the Redis URL also specifies a port

commit 72fb9a475d
Author: Alexander Bauer <sasha@linux.com>
Date:   Thu Nov 10 02:24:04 2022 +0000

    Ignore end-of-lines on generated Chart README

commit bf97f5807f
Author: Alexander Bauer <sasha@linux.com>
Date:   Thu Nov 10 02:21:29 2022 +0000

    Ignore non-yaml Helm chart template

commit a707818b4d
Author: Alexander Bauer <sasha@linux.com>
Date:   Thu Nov 10 01:54:35 2022 +0000

    Change Helm chart releaser to use version tags only

commit fb46c1b96a
Author: Alexander Bauer <sasha@linux.com>
Date:   Thu Nov 10 01:52:02 2022 +0000

    Ignore generated Helm chart README from prettier

commit 3226d8b25b
Author: Alexander Bauer <sasha@linux.com>
Date:   Tue Nov 8 00:46:27 2022 +0000

    fixup! Add mostly-unchanged Helm chart from k8s-at-home

commit 5c4363cbea
Author: Alexander Bauer <sasha@linux.com>
Date:   Tue Nov 8 00:24:04 2022 +0000

    Add mostly-unchanged Helm chart from k8s-at-home

    - Add the chart from k8s-at-home with some modifications
    - Add the Apache 2.0 license to the new charts/paperless-ngx
      subdirectory, the license under which the chart was distributed by
      k8s-at-home. I believe the chart will have to maintain this license.

    - Update the maintainers section and contact information to point to
      Paperless-ngx.
    - Regenerate the README (using helm-docs)

    - Add a GitHub actions configuration to publish the chart using GitHub
      pages. This makes the GitHub Pages page rendered by this repository
      usable as a Helm repository, without affecting potential future uses
      of the Pages site.

    These are in response to discussion #1790.

commit fa62ae820b
Merge: bcc029a2 17891baf
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 14:19:36 2022 -0800

    Merge pull request #2106 from tooomm/docs/edit

    Docs: Some more small MkDocs updates

commit 17891bafaf
Author: tooomm <tooomm@users.noreply.github.com>
Date:   Sat Dec 3 20:02:40 2022 +0100

    lint

commit 15fdadadef
Author: tooomm <tooomm@users.noreply.github.com>
Date:   Sat Dec 3 19:36:49 2022 +0100

    open demo in new page

commit ce9f604d81
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 09:29:34 2022 -0800

    Explicit default ordering for rule / account views

commit 4f876db5d1
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Nov 28 21:38:52 2022 -0800

    prevent loss of unsaved changes to settings on tab nav

commit 5e5f56dc67
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Nov 28 20:39:03 2022 -0800

    Re-org where some of the new classes are found

commit 93fab8bb95
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Nov 28 12:53:20 2022 -0800

    Apply code suggestions from @stumpylog

commit 35ca2195fe
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Nov 28 15:51:39 2022 -0800

    frontend mail rule validation

    Display non-field validation errors, hide action param field if not needed

commit 7ace66d7fd
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Nov 28 13:58:37 2022 -0800

    fix edit dialog getters

commit 4f9a31244b
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Nov 18 20:23:40 2022 -0800

    Add settings routing

commit 14cf4f7095
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Nov 18 19:38:49 2022 -0800

    Update frontend strings

commit 8bd7c27826
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Nov 18 17:11:15 2022 -0800

    Hide order parameter, fix imap port

commit 8c4f486fe9
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Nov 18 14:22:07 2022 -0800

    API mail rule & account tests

    and fix use of assign_tags

commit 2849414445
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Nov 18 14:21:31 2022 -0800

    one-way imap password setting via API, ObfuscatedPasswordField

commit ea1ea0816f
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Nov 18 14:10:17 2022 -0800

    Fix mail account / rule delete

commit 52d3a8703c
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Nov 12 15:14:58 2022 -0800

    Dynamically load mail rules / accounts settings

commit 4cb4d6adcd
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Nov 12 15:15:59 2022 -0800

    update settings tests to not wait on data which is now on-demand

commit 24444237f2
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Nov 12 14:46:57 2022 -0800

    dynamic loading of settings tab contents

commit 40c8629aef
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Nov 10 21:04:29 2022 -0800

    Update welcome tour, move admin button

commit 98cdf614a5
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Wed Nov 9 19:59:35 2022 -0800

    Mail form tweaks

    Include add button

    Include add button

commit 2eb2d99a91
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Wed Nov 9 03:43:57 2022 -0800

    Update frontend fixtures & tests for compatibility

commit 18ad9bcbf2
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 8 12:18:47 2022 -0800

    Working mail rule & account edit

commit 997bff4917
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Wed Nov 9 02:40:45 2022 -0800

    Update deprecated edit-dialog rxjs

commit 78f9a80895
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 8 12:09:16 2022 -0800

    mail account + rule deletion

commit 9231df7a4a
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 8 11:50:57 2022 -0800

    Mail rule edit dialog

commit 6f25917c86
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 8 11:11:35 2022 -0800

    Mail account edit dialog

commit c41d1a78a8
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 8 10:53:41 2022 -0800

    remove unused toastService from edit dialogs and add confirmation

commit c3331086d5
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 8 03:39:54 2022 -0800

    Basic data retrieval

commit 6bd9ccd8f6
Author: tooomm <tooomm@users.noreply.github.com>
Date:   Sat Dec 3 18:30:02 2022 +0100

    update default edit path

commit 68c7cecb07
Author: tooomm <tooomm@users.noreply.github.com>
Date:   Sat Dec 3 18:29:14 2022 +0100

    add mkdocs site to gitignore

commit bcc029a2c7
Merge: 9d418055 1727eb00
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 09:00:02 2022 -0800

    Merge pull request #2104 from paperless-ngx/docs-cleanup

    Chore: Cleans up documentation links

commit ea38eb01b2
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Fri Dec 2 13:54:15 2022 -0800

    Adds support for database number specification

commit 01d070b882
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Fri Dec 2 09:34:59 2022 -0800

    Adds a layer to translate between differing formats of socket based Redis URLs

commit 1727eb00cc
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Fri Dec 2 19:34:43 2022 -0800

    Cleans up a number of internal links

commit 9d4180553c
Merge: 7c614264 8049af4b
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 07:58:12 2022 -0800

    Merge pull request #2102 from tooomm/patch-1

    Fix doc links in contributing

commit 8049af4b22
Author: tooomm <tooomm@users.noreply.github.com>
Date:   Sat Dec 3 14:38:55 2022 +0100

    Fix doc links in contributing

commit 7c6142643d
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 02:08:51 2022 -0800

    Update more docs references

commit 2e8706f4e2
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 02:05:49 2022 -0800

    Update frontend translation strings

commit d39d32d555
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 02:04:30 2022 -0800

    Fix docs references

commit 6f52945449
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 01:47:04 2022 -0800

    docs index formatting error

commit 37025297b5
Merge: aa023ea2 dc9e9e3b
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 01:33:31 2022 -0800

    Merge pull request #2095 from paperless-ngx/update-readme-doc-links

    Documentation: Update docs links and screenshot in readme, add favicon

commit aa023ea2e3
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Dec 3 01:30:07 2022 -0800

    correct docs deploy domain

commit 78bf0b63a5
Merge: 29391c1c a96ecd67
Author: Felix E <felix@eckhofer.com>
Date:   Sat Dec 3 09:10:20 2022 +0100

    Merge pull request #2087 from Ricks-ha/main

    Add examples to URL and TIME_ZONE

commit dc9e9e3b48
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Dec 2 20:06:51 2022 -0800

    add favicon

commit ab29c49b7a
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Dec 2 19:09:19 2022 -0800

    Update docs links and screenshot in readme

commit 1c0ac474b8
Merge: 25fb8d9c 29391c1c
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Fri Dec 2 19:05:28 2022 -0800

    Merge branch 'main' into dev

commit 29391c1c7b
Merge: 58a01a57 69383497
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Dec 2 15:22:39 2022 -0800

    Merge pull request #2067 from paperless-ngx/material-docs

    [WIP] Feature: Move docs to material-mkdocs

commit 693834971c
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 20:00:23 2022 -0800

    Add v1.10.1 changelog

commit 97376d4b72
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Dec 2 09:09:29 2022 -0800

    update ci for documentation build vs deploy

commit 3ee1d2a9a9
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 29 21:20:45 2022 -0800

    Add changes from #2069

commit 605f885e19
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 29 12:49:23 2022 -0800

    Move docs to material-mkdocs

commit 25fb8d9c3b
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Dec 2 08:30:42 2022 -0800

    Update dev version string

commit a96ecd673b
Author: Ricks-ha <ricks@ricksha.eu>
Date:   Fri Dec 2 13:27:57 2022 +0100

    Add examples to URL and TIME_ZONE

commit 58a01a57ee
Merge: a96f79f6 c18fc03e
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Dec 2 03:36:55 2022 -0800

    Merge pull request #2082 from paperless-ngx/v1.10.1-changelog

    Chore: Add v1.10.1 changelong

commit c18fc03ef3
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 20:00:23 2022 -0800

    Add v1.10.1 changelong

commit a96f79f6a3
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 18:54:00 2022 -0800

    Bump version to 1.10.1

commit d6f1d004a3
Merge: 88cf6ef8 da72d357
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 18:52:35 2022 -0800

    Merge branch 'dev'

commit da72d3571b
Merge: 8241da0e 86592928
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 18:52:06 2022 -0800

    Merge pull request #2050 from paperless-ngx/l10n_dev

    New Crowdin updates

commit 8241da0eb3
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 17:01:22 2022 -0800

    fix broken npm package-lock

commit 51562667bf
Merge: 1aee2988 97eeae65
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 16:40:07 2022 -0800

    Merge pull request #2076 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/tslib-2.4.1

    Bump tslib from 2.4.0 to 2.4.1 in /src-ui

commit 97eeae65a3
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Fri Dec 2 00:39:26 2022 +0000

    Bump tslib from 2.4.0 to 2.4.1 in /src-ui

    Bumps [tslib](https://github.com/Microsoft/tslib) from 2.4.0 to 2.4.1.
    - [Release notes](https://github.com/Microsoft/tslib/releases)
    - [Commits](https://github.com/Microsoft/tslib/compare/2.4.0...2.4.1)

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

    Signed-off-by: dependabot[bot] <support@github.com>

commit 1aee2988f7
Merge: a63a8dd4 6f0077ef
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 16:39:24 2022 -0800

    Merge pull request #2079 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/angular-builders/jest-14.1.0

    Bump @angular-builders/jest from 14.0.1 to 14.1.0 in /src-ui

commit a63a8dd488
Merge: 06a9df6d 39be68a1
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 16:38:38 2022 -0800

    Merge pull request #2078 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/jest-preset-angular-12.2.3

    Bump jest-preset-angular from 12.2.2 to 12.2.3 in /src-ui

commit 06a9df6dbd
Merge: 49933bb5 7d7d9630
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 16:37:25 2022 -0800

    Merge pull request #2080 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/ngx-file-drop-14.0.2

    Bump ngx-file-drop from 14.0.1 to 14.0.2 in /src-ui

commit 49933bb5a8
Merge: 02c782a1 ac69babf
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 16:18:07 2022 -0800

    Merge pull request #2077 from paperless-ngx/dependabot/npm_and_yarn/src-ui/dev/ngneat/dirty-check-forms-3.0.3

    Bump @ngneat/dirty-check-forms from 3.0.2 to 3.0.3 in /src-ui

commit 7d7d9630c1
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Thu Dec 1 20:03:32 2022 +0000

    Bump ngx-file-drop from 14.0.1 to 14.0.2 in /src-ui

    Bumps [ngx-file-drop](https://github.com/georgipeltekov/ngx-file-drop) from 14.0.1 to 14.0.2.
    - [Release notes](https://github.com/georgipeltekov/ngx-file-drop/releases)
    - [Changelog](https://github.com/georgipeltekov/ngx-file-drop/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/georgipeltekov/ngx-file-drop/compare/v14.0.1...v14.0.2)

    ---
    updated-dependencies:
    - dependency-name: ngx-file-drop
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

commit 6f0077efac
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Thu Dec 1 20:03:05 2022 +0000

    Bump @angular-builders/jest from 14.0.1 to 14.1.0 in /src-ui

    Bumps [@angular-builders/jest](https://github.com/just-jeb/angular-builders/tree/HEAD/packages/jest) from 14.0.1 to 14.1.0.
    - [Release notes](https://github.com/just-jeb/angular-builders/releases)
    - [Changelog](https://github.com/just-jeb/angular-builders/blob/master/packages/jest/CHANGELOG.md)
    - [Commits](https://github.com/just-jeb/angular-builders/commits/@angular-builders/jest@14.1.0/packages/jest)

    ---
    updated-dependencies:
    - dependency-name: "@angular-builders/jest"
      dependency-type: direct:development
      update-type: version-update:semver-minor
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

commit 39be68a1a4
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Thu Dec 1 20:02:39 2022 +0000

    Bump jest-preset-angular from 12.2.2 to 12.2.3 in /src-ui

    Bumps [jest-preset-angular](https://github.com/thymikee/jest-preset-angular) from 12.2.2 to 12.2.3.
    - [Release notes](https://github.com/thymikee/jest-preset-angular/releases)
    - [Changelog](https://github.com/thymikee/jest-preset-angular/blob/main/CHANGELOG.md)
    - [Commits](https://github.com/thymikee/jest-preset-angular/compare/v12.2.2...v12.2.3)

    ---
    updated-dependencies:
    - dependency-name: jest-preset-angular
      dependency-type: direct:development
      update-type: version-update:semver-patch
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

commit ac69babfce
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Thu Dec 1 20:02:11 2022 +0000

    Bump @ngneat/dirty-check-forms from 3.0.2 to 3.0.3 in /src-ui

    Bumps [@ngneat/dirty-check-forms](https://github.com/ngneat/dirty-check-forms) from 3.0.2 to 3.0.3.
    - [Release notes](https://github.com/ngneat/dirty-check-forms/releases)
    - [Changelog](https://github.com/ngneat/dirty-check-forms/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/ngneat/dirty-check-forms/compare/v3.0.2...v3.0.3)

    ---
    updated-dependencies:
    - dependency-name: "@ngneat/dirty-check-forms"
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

commit 02c782a127
Merge: 4e90fda8 9b602a4b
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Dec 1 08:19:59 2022 -0800

    Merge pull request #2073 from paperless-ngx/fix-frontend-tasks-display

    Fix: frontend tasks display in 1.10.0

commit 4e90fda80f
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Tue Nov 29 20:06:56 2022 -0800

    Expands documentation around the permissions of the custom scripts and the folder

commit 88e3e556a1
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Tue Nov 29 20:05:08 2022 -0800

    Fixes the custom scripts not running as root

commit 88cf6ef843
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Wed Nov 30 15:14:21 2022 -0800

    add demo badge

commit 9b602a4bf0
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Wed Nov 30 13:55:51 2022 -0800

    Fix frontend tasks display

commit fe2db4dbf7
Author: phail <phail@hacknology.de>
Date:   Wed Nov 30 10:16:39 2022 +0100

    adapt compose file for eml parsing

commit 47c88a6bdd
Merge: 4aa31859 a3bc3b78
Author: phail <phail@hacknology.de>
Date:   Wed Nov 30 10:10:57 2022 +0100

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit a3bc3b78d5
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Tue Nov 29 14:34:12 2022 -0800

    Also display the container logs

commit fed7d3e993
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Tue Nov 29 13:59:48 2022 -0800

    Use docker compose to start and stop containers which match directly to our command overrides

commit 3a74f24e49
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Tue Nov 29 12:44:53 2022 -0800

    Adds libatomic1 for supporting armv7 better

commit 52afab39cf
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Tue Nov 29 12:16:51 2022 -0800

    Organizes the system packages a little bit more

commit 8659292852
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Tue Nov 29 00:29:45 2022 -0800

    New translations django.po (Norwegian)
    [ci skip]

commit ce73f159fd
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Mon Nov 28 14:13:54 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit 71382e9c62
Merge: 5d3a6e23 a1a802fc
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Nov 28 14:05:57 2022 -0800

    Merge pull request #2062 from paperless-ngx/fix/2053-long-names-too-quiet

    Bugfix: Don't silence an exception when trying to handle file naming

commit a1a802fc92
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Mon Nov 28 13:44:17 2022 -0800

    Don't silence an exception when trying to handle file naming

commit 4200fc610d
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Mon Nov 28 13:17:22 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit 32d212cd9f
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Mon Nov 28 11:17:07 2022 -0800

    New translations messages.xlf (German)
    [ci skip]

commit 5d3a6e230d
Merge: b33fcc11 f0497e77
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Nov 28 11:04:44 2022 -0800

    Merge pull request #2057 from paperless-ngx/fix/2044-lang-code-diffs

    Bugfix: Some tesseract languages aren't detected as installed.

commit b33fcc117e
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Mon Nov 28 09:25:03 2022 -0800

    Transition to a maintained upload release assert

commit e96d65f945
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Mon Nov 14 15:38:35 2022 -0800

    Allows parsing of WebP format images

commit cfeed0ce6e
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Mon Nov 28 08:30:32 2022 -0800

    New translations django.po (Polish)
    [ci skip]

commit b89ecf7d77
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Mon Nov 28 05:28:39 2022 -0800

    New translations messages.xlf (Luxembourgish)
    [ci skip]

commit 5ca25d44ba
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Mon Nov 28 04:27:31 2022 -0800

    New translations messages.xlf (Luxembourgish)
    [ci skip]

commit 1e11c12d96
Merge: e74d7dad 3e22e8e0
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sun Nov 27 21:16:50 2022 -0800

    Merge branch 'main' into dev

commit 3e22e8e0b9
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 27 19:22:59 2022 -0800

    prepends the latest changelog

commit dba45f93a4
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 27 19:22:03 2022 -0800

    Fixes the pre-commit command

commit 18f3f44ae9
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:25 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit 85a6a271dc
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:23 2022 -0800

    New translations messages.xlf (French)
    [ci skip]

commit abb515d4ea
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:22 2022 -0800

    New translations messages.xlf (Spanish)
    [ci skip]

commit 309d1f2b67
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:21 2022 -0800

    New translations messages.xlf (Arabic)
    [ci skip]

commit fa2f09bc4b
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:19 2022 -0800

    New translations messages.xlf (Belarusian)
    [ci skip]

commit c51590cd12
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:18 2022 -0800

    New translations messages.xlf (Czech)
    [ci skip]

commit 8e01406acf
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:17 2022 -0800

    New translations messages.xlf (Danish)
    [ci skip]

commit 7cce2f0fe6
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:16 2022 -0800

    New translations messages.xlf (Finnish)
    [ci skip]

commit 95091c2f39
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:14 2022 -0800

    New translations messages.xlf (Hebrew)
    [ci skip]

commit 4a0aa12bd9
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:13 2022 -0800

    New translations messages.xlf (Italian)
    [ci skip]

commit 9a0329746a
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:11 2022 -0800

    New translations messages.xlf (Dutch)
    [ci skip]

commit 8392a6fd4a
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:10 2022 -0800

    New translations messages.xlf (Romanian)
    [ci skip]

commit 8fa18bb8a6
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:09 2022 -0800

    New translations messages.xlf (Norwegian)
    [ci skip]

commit 0095b593fb
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:08 2022 -0800

    New translations messages.xlf (Portuguese)
    [ci skip]

commit b1e5135e21
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:05 2022 -0800

    New translations messages.xlf (Russian)
    [ci skip]

commit e88755e7ac
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:04 2022 -0800

    New translations messages.xlf (Slovenian)
    [ci skip]

commit c582947291
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:02 2022 -0800

    New translations messages.xlf (Swedish)
    [ci skip]

commit 98fe3a2cb7
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:58:01 2022 -0800

    New translations messages.xlf (Turkish)
    [ci skip]

commit 61647606fa
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:57:59 2022 -0800

    New translations messages.xlf (Chinese Simplified)
    [ci skip]

commit 95a1e5c645
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:57:58 2022 -0800

    New translations messages.xlf (Portuguese, Brazilian)
    [ci skip]

commit 8ead77f128
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:57:57 2022 -0800

    New translations messages.xlf (Croatian)
    [ci skip]

commit b9e9e82f33
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:57:55 2022 -0800

    New translations messages.xlf (Luxembourgish)
    [ci skip]

commit 487fd3a5dd
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:57:54 2022 -0800

    New translations messages.xlf (Polish)
    [ci skip]

commit 657786a2fe
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sun Nov 27 17:57:52 2022 -0800

    New translations messages.xlf (German)
    [ci skip]

commit e74d7dadfb
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 27 17:43:46 2022 -0800

    Adds the -dev back to the UI version

commit a2937cd54d
Merge: 9b01aa92 7b3ce628
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 27 17:42:41 2022 -0800

    Merge branch 'main' into dev

commit 7b3ce6289f
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 27 17:21:12 2022 -0800

    Bumps version number to 1.10.0

commit a16e8324be
Merge: 34a0111f 39de531d
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 27 17:18:08 2022 -0800

    Merge pull request #1960 from paperless-ngx/beta

    [Beta] Paperless-ngx v1.10.0 Release Candidate

commit 39de531df5
Merge: 4764d4fd c9d6c208
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sun Nov 27 14:47:14 2022 -0800

    Merge pull request #2041 from paperless-ngx/l10n_dev

    New Crowdin updates

commit 4764d4fd2b
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Nov 26 12:28:51 2022 -0800

    New translations django.po (German)
    [ci skip]

commit e147d4571f
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Nov 26 09:54:00 2022 -0800

    New translations django.po (German)
    [ci skip]

commit dc9aaa6472
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Tue Nov 22 15:21:31 2022 -0800

    New translations django.po (German)
    [ci skip]

commit 8a061c4ac2
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Tue Nov 22 15:21:30 2022 -0800

    New translations messages.xlf (German)
    [ci skip]

commit d051c5c282
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Nov 12 08:48:48 2022 -0800

    Remove ar-SA

commit 9e60810a8b
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Nov 12 08:33:08 2022 -0800

    New translations messages.xlf (Arabic)
    [ci skip]

commit 96ee7990b2
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Fri Nov 11 13:59:54 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit 224bfeb72e
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Fri Nov 11 13:04:01 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit f0497e7744
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 27 08:28:22 2022 -0800

    Fixes how a language code like chi-sim is treated in the checks

commit c9d6c208af
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Nov 26 12:28:51 2022 -0800

    New translations django.po (German)
    [ci skip]

commit 9f2b8b1734
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Nov 26 09:54:00 2022 -0800

    New translations django.po (German)
    [ci skip]

commit a04b9e3755
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Tue Nov 22 15:21:31 2022 -0800

    New translations django.po (German)
    [ci skip]

commit a81d4c5e9d
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Tue Nov 22 15:21:30 2022 -0800

    New translations messages.xlf (German)
    [ci skip]

commit 2140d42098
Merge: a5283525 2a5dc4de
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 22 14:35:34 2022 -0800

    Merge pull request #2025 from paperless-ngx/fix-redo-ocr-message

    Add info that re-do OCR doesnt automatically refresh content

commit 43325371fc
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Nov 12 08:48:48 2022 -0800

    Remove ar-SA

commit d10721089e
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Nov 12 08:33:08 2022 -0800

    New translations messages.xlf (Arabic)
    [ci skip]

commit f1a1a2da8b
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Fri Nov 11 13:59:54 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit 612e0a1163
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Fri Nov 11 13:04:01 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit 2a5dc4de38
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 22 14:16:04 2022 -0800

    Add info that re-do OCR doesnt automatically refresh content

commit a5283525bc
Merge: f0155565 de98d748
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Nov 22 13:53:08 2022 -0800

    Merge pull request #2023 from paperless-ngx/fix/2019-create-date

    Bugfix: Fix created_date being a string

commit de98d748a9
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Tue Nov 22 10:11:27 2022 -0800

    If override_date is provided, coerce it into a datetime

commit f015556562
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Mon Nov 21 14:56:14 2022 -0800

    Adds a test to cover this edge case

commit b897d6de2e
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Mon Nov 21 14:45:20 2022 -0800

    Don't use the sidecar file when redoing the OCR, it only contains new text

commit 54f20b381e
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Mon Nov 21 12:59:14 2022 -0800

    Documents some issues and the required manual fixes for MariaDB

commit c0d4248021
Merge: 27f7f0a9 870e295a
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Nov 21 22:19:02 2022 -0800

    Merge pull request #1973 from paperless-ngx/l10n_dev

    New Crowdin updates

commit 870e295aae
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Mon Nov 21 21:43:54 2022 -0800

    New translations messages.xlf (German)
    [ci skip]

commit 4aa318598f
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 23:26:20 2022 +0100

    add test comments

commit 00f39d8b58
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 22:49:42 2022 +0100

    add test comments

commit 0b1a16908f
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 20:33:07 2022 +0100

    Include .eml reference in docs

commit d9796e5003
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 20:24:36 2022 +0100

    change order of elements in parsed Texts

commit 3599bb52c0
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 20:12:41 2022 +0100

    minor test improvements

commit af8a6c3764
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 19:53:57 2022 +0100

    fix filenames

commit 6d37ebf79e
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 20 09:15:06 2022 -0800

    Fixes one more place which used manual size formatting

commit f6a70b85f4
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 20 09:13:08 2022 -0800

    Use Django templating engine

commit 538a4219bd
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 20 09:10:44 2022 -0800

    Fixes missing return

commit 85c41b79be
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Sun Nov 20 08:02:06 2022 -0800

    Adds the new packages without updating other dependencies

commit 25d014d8ef
Merge: 9ec89762 27f7f0a9
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sun Nov 20 07:48:55 2022 -0800

    Merge branch 'beta' into l10n_dev

commit 9b01aa9202
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Mon Nov 14 15:47:22 2022 -0800

    Fixes the link for flake8 to the new (?) GitHub repo

commit df101f5e7a
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 16:09:46 2022 +0100

    split handle_message function

commit 1fa735eb23
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 15:44:43 2022 +0100

    use imagehash instead of bitwise hashing

commit ebe21a0114
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 14:22:30 2022 +0100

    eml parsing requires tika

commit d132eba143
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 12:48:03 2022 +0100

    optimize regex

commit 073c3c8fed
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 12:36:49 2022 +0100

    use html.escape instead of some self build functions

commit e3c1bde793
Author: phail <phail@hacknology.de>
Date:   Sun Nov 20 12:06:35 2022 +0100

    remove log mocking, replace pytest raises, use humanfriendly

commit 27f7f0a941
Merge: 9f5fd6c3 914661fd
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Nov 17 14:31:46 2022 -0800

    Merge pull request #1998 from paperless-ngx/fix/1993-date-overflow

    Bugfix: Don't allow exceptions during date parsing to fail consume

commit 9f5fd6c3ba
Merge: 0ae82005 3dfeee93
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Nov 17 14:30:23 2022 -0800

    Merge pull request #1967 from paperless-ngx/feature-scripts-output

    Feature: Capture stdout & stderr of the pre/post consume scripts

commit 914661fdbb
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Thu Nov 17 13:37:37 2022 -0800

    Don't allow an exception when trying to parse a date cause complete failure

commit 0ae8200593
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Mon Nov 14 15:47:22 2022 -0800

    Fixes the link for flake8 to the new (?) GitHub repo

commit b68906b14e
Author: phail <phail@hacknology.de>
Date:   Sun Nov 13 22:49:52 2022 +0100

    merge pipfile

commit 681eecc46e
Merge: 1578e8de d4712234
Author: phail <phail@hacknology.de>
Date:   Sun Nov 13 22:43:55 2022 +0100

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit 1578e8de2d
Author: phail <phail@hacknology.de>
Date:   Sun Nov 13 22:33:26 2022 +0100

    fix live tests

commit 023c931401
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sun Nov 13 07:11:45 2022 -0800

    Fix top search not working due to missing button type

commit 9ec89762a3
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Nov 12 09:31:54 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit fa47595ac8
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Nov 12 08:58:01 2022 -0800

    remove ar_SA

    [ci skip]

commit 79f5019b40
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Sat Nov 12 08:53:52 2022 -0800

    New Crowdin updates (#1971)

    * New translations messages.xlf (Serbian (Latin))
    [ci skip]

    * New translations messages.xlf (Serbian (Latin))
    [ci skip]

    * New translations messages.xlf (Italian)
    [ci skip]

    * New translations django.po (Italian)
    [ci skip]

    * New translations django.po (Serbian (Latin))
    [ci skip]

    * New translations messages.xlf (Russian)
    [ci skip]

    * New translations messages.xlf (Polish)
    [ci skip]

    * New translations messages.xlf (Serbian (Latin))
    [ci skip]

    * New translations messages.xlf (Luxembourgish)
    [ci skip]

    * New translations messages.xlf (Croatian)
    [ci skip]

    * New translations messages.xlf (Portuguese, Brazilian)
    [ci skip]

    * New translations messages.xlf (Chinese Simplified)
    [ci skip]

    * New translations messages.xlf (Turkish)
    [ci skip]

    * New translations messages.xlf (Swedish)
    [ci skip]

    * New translations messages.xlf (Slovenian)
    [ci skip]

    * New translations messages.xlf (Portuguese)
    [ci skip]

    * New translations messages.xlf (Norwegian)
    [ci skip]

    * New translations messages.xlf (German)
    [ci skip]

    * New translations messages.xlf (Dutch)
    [ci skip]

    * New translations messages.xlf (Italian)
    [ci skip]

    * New translations messages.xlf (Hebrew)
    [ci skip]

    * New translations messages.xlf (Finnish)
    [ci skip]

    * New translations messages.xlf (Danish)
    [ci skip]

    * New translations messages.xlf (Czech)
    [ci skip]

    * New translations messages.xlf (Belarusian)
    [ci skip]

    * New translations messages.xlf (Spanish)
    [ci skip]

    * New translations messages.xlf (French)
    [ci skip]

    * New translations messages.xlf (Romanian)
    [ci skip]

    * New translations messages.xlf (Arabic)
    [ci skip]

    * Remove ar-SA

    * remote ar other than ar-ar

    Co-authored-by: Michael Shamoon <4887959+shamoon@users.noreply.github.com>

commit 756ce2f9d8
Merge: 50a211f3 d4712234
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Nov 12 08:33:43 2022 -0800

    Merge branch 'dev' into beta

commit d47122340a
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sat Nov 12 08:31:25 2022 -0800

    Add translation strings for welcome tour buttons

commit b01cbc9aa0
Author: phail <phail@hacknology.de>
Date:   Sat Nov 12 15:48:30 2022 +0100

    add conditions to unittests

commit 3dfeee9332
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Fri Nov 11 10:09:56 2022 -0800

    Don't do decoding work if not needed

commit 057f6016cc
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Fri Nov 11 08:58:49 2022 -0800

    Adds further testing to cover scripts with non-zero exit codes

commit c4965580de
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Thu Nov 10 17:40:36 2022 -0800

    Fixes stderr appearing to have content when it doesn't

commit 9a47963fd5
Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com>
Date:   Wed Nov 9 20:11:36 2022 -0800

    Captures the stdout and stderr of the pre/post scripts into the log

commit 50a211f367
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Thu Nov 10 17:25:39 2022 -0800

    Fixes an issue with the install of languages and read-only variable

commit 5f278d7fbb
Merge: e5106bdc a17d2519
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Wed Nov 9 21:37:29 2022 -0800

    Merge pull request #1956 from paperless-ngx/l10n_dev

    New Crowdin updates

commit a17d251913
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:37 2022 -0800

    New translations django.po (Serbian (Latin))
    [ci skip]

commit 1cbf088656
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:36 2022 -0800

    New translations messages.xlf (Serbian (Latin))
    [ci skip]

commit d3254d6bcf
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:35 2022 -0800

    New translations messages.xlf (Luxembourgish)
    [ci skip]

commit 1543729c7b
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:34 2022 -0800

    New translations messages.xlf (Croatian)
    [ci skip]

commit ef2a96c34b
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:32 2022 -0800

    New translations messages.xlf (Portuguese, Brazilian)
    [ci skip]

commit 656b1e150f
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:31 2022 -0800

    New translations messages.xlf (Chinese Simplified)
    [ci skip]

commit e0f61003cf
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:30 2022 -0800

    New translations messages.xlf (Turkish)
    [ci skip]

commit 1ca98678cd
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:28 2022 -0800

    New translations messages.xlf (Swedish)
    [ci skip]

commit 9919cc1956
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:27 2022 -0800

    New translations messages.xlf (Slovenian)
    [ci skip]

commit d2096e3c05
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:26 2022 -0800

    New translations messages.xlf (Portuguese)
    [ci skip]

commit 5f2b508b7a
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:24 2022 -0800

    New translations messages.xlf (Polish)
    [ci skip]

commit 752d4f4249
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:23 2022 -0800

    New translations django.po (German)
    [ci skip]

commit 72e7d5150e
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:22 2022 -0800

    New translations messages.xlf (Norwegian)
    [ci skip]

commit 42a9e05a7f
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:21 2022 -0800

    New translations messages.xlf (Italian)
    [ci skip]

commit b4add2ed55
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:19 2022 -0800

    New translations messages.xlf (Hebrew)
    [ci skip]

commit ed7d9295bd
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:18 2022 -0800

    New translations messages.xlf (Finnish)
    [ci skip]

commit 5b7b1b2349
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:16 2022 -0800

    New translations messages.xlf (Danish)
    [ci skip]

commit d5c930acc9
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:15 2022 -0800

    New translations messages.xlf (Czech)
    [ci skip]

commit 4c93d6d7e6
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:14 2022 -0800

    New translations messages.xlf (Belarusian)
    [ci skip]

commit 066f3264fb
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:12 2022 -0800

    New translations messages.xlf (Spanish)
    [ci skip]

commit 88a803f949
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:11 2022 -0800

    New translations messages.xlf (French)
    [ci skip]

commit e69615dc06
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:10 2022 -0800

    New translations messages.xlf (Romanian)
    [ci skip]

commit a1e0840e24
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:08 2022 -0800

    New translations messages.xlf (Dutch)
    [ci skip]

commit d814353e83
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:07 2022 -0800

    New translations messages.xlf (German)
    [ci skip]

commit 06d7845eca
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:04 2022 -0800

    New translations django.po (Dutch)
    [ci skip]

commit ae8682c7a5
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:03 2022 -0800

    New translations django.po (Romanian)
    [ci skip]

commit c9c0b3d430
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:02 2022 -0800

    New translations django.po (Luxembourgish)
    [ci skip]

commit cc46fc7e4b
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:01 2022 -0800

    New translations django.po (Croatian)
    [ci skip]

commit d1b1ba21cd
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:12:00 2022 -0800

    New translations django.po (Portuguese, Brazilian)
    [ci skip]

commit a009417a99
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:59 2022 -0800

    New translations django.po (Chinese Simplified)
    [ci skip]

commit 775da720ec
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:58 2022 -0800

    New translations django.po (Turkish)
    [ci skip]

commit aeae6ea0d3
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:57 2022 -0800

    New translations django.po (Swedish)
    [ci skip]

commit 0ae46d2269
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:56 2022 -0800

    New translations django.po (Slovenian)
    [ci skip]

commit 0e7f1ec0de
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:55 2022 -0800

    New translations django.po (Russian)
    [ci skip]

commit 13cd55b96f
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:53 2022 -0800

    New translations django.po (Portuguese)
    [ci skip]

commit 9139e807ec
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:52 2022 -0800

    New translations messages.xlf (Arabic)
    [ci skip]

commit 53616f6625
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:51 2022 -0800

    New translations django.po (Polish)
    [ci skip]

commit 526fdf1153
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:50 2022 -0800

    New translations django.po (Italian)
    [ci skip]

commit fc4aceb0ee
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:49 2022 -0800

    New translations django.po (Hebrew)
    [ci skip]

commit 3d8421b718
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:48 2022 -0800

    New translations django.po (Finnish)
    [ci skip]

commit 6cebceda15
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:47 2022 -0800

    New translations django.po (Danish)
    [ci skip]

commit e1fd6bda19
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:46 2022 -0800

    New translations django.po (Czech)
    [ci skip]

commit fd34414b17
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:45 2022 -0800

    New translations django.po (Belarusian)
    [ci skip]

commit 3ce1886a54
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:44 2022 -0800

    New translations django.po (Arabic)
    [ci skip]

commit 8ed43779a8
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:43 2022 -0800

    New translations django.po (Spanish)
    [ci skip]

commit a7949b3e22
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:42 2022 -0800

    New translations django.po (French)
    [ci skip]

commit 19c293c3e6
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:41 2022 -0800

    New translations django.po (Norwegian)
    [ci skip]

commit ccb1ec4ff5
Author: Paperless-ngx Translation Bot [bot] <99855517+paperless-l10n@users.noreply.github.com>
Date:   Wed Nov 9 15:11:40 2022 -0800

    New translations messages.xlf (Russian)
    [ci skip]

commit e5106bdca0
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Wed Nov 9 14:00:09 2022 -0800

    Updates the version strings to 1.10.0

commit ba1366f49a
Merge: 34a0111f f3b3db30
Author: Trenton H <797416+stumpylog@users.noreply.github.com>
Date:   Wed Nov 9 13:51:10 2022 -0800

    Merge branch 'dev' into beta

commit acd3832417
Author: phail <phail@hacknology.de>
Date:   Thu Nov 3 21:08:15 2022 +0100

    merge Pipfile.lock

commit 82b2ba3cc2
Merge: 3de6e0bc 7e3e0a0f
Author: phail <phail@hacknology.de>
Date:   Thu Nov 3 21:00:01 2022 +0100

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit 3de6e0bcf1
Author: phail <phail@hacknology.de>
Date:   Thu Nov 3 00:58:36 2022 +0100

    put parser into setup
    make test using convert optional
    Gotenberg live testing

commit 34a0111ff5
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Oct 31 13:06:17 2022 -0700

    update logs section

commit b511b084d0
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Sun Oct 30 06:48:41 2022 -0700

    Update matrix url

    [ci skip]

commit 6df73ae940
Author: phail <phail@hacknology.de>
Date:   Sat Oct 29 23:20:35 2022 +0200

    gotenberg with modified cmd

commit 4a24ba51c5
Merge: 87472b31 d5fb98b7
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Oct 28 22:22:08 2022 -0700

    Merge pull request #1876 from astubenbord/main

    Added new application to list of affiliated projects

commit d5fb98b7c4
Author: Anton Stubenbord <79228196+astubenbord@users.noreply.github.com>
Date:   Fri Oct 28 11:07:42 2022 +0200

    Added new application to list of affiliated projects

commit 2204090151
Author: phail <phail@hacknology.de>
Date:   Thu Oct 27 23:53:47 2022 +0200

    fix string

commit 3c81a7468b
Author: phail <phail@hacknology.de>
Date:   Thu Oct 27 23:41:29 2022 +0200

    replace thumbnail creation with mock

commit 5ef86f9489
Merge: 90cb0836 9b82ab95
Author: phail <phail@hacknology.de>
Date:   Thu Oct 27 23:12:51 2022 +0200

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit 90cb0836bb
Author: phail <phail@hacknology.de>
Date:   Thu Oct 27 23:11:41 2022 +0200

    Downgrade pdf validation to text only

commit ef1d4264b5
Author: phail <phail@hacknology.de>
Date:   Thu Oct 27 00:27:15 2022 +0200

    improve test coverage a little

commit e1fa59122d
Merge: 5bf26369 3357fa19
Author: phail <phail@hacknology.de>
Date:   Wed Oct 26 20:59:49 2022 +0200

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit 5bf26369e2
Author: phail <phail@hacknology.de>
Date:   Tue Oct 25 21:17:40 2022 +0200

    remove erroring paramerter

commit 36239ba09f
Author: phail <phail@hacknology.de>
Date:   Mon Oct 24 22:15:33 2022 +0200

    rename help text

commit 318c1d2fbd
Merge: e7c40fc3 f8ce6285
Author: phail <phail@hacknology.de>
Date:   Mon Oct 24 21:12:35 2022 +0200

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit e7c40fc3dc
Author: phail <phail@hacknology.de>
Date:   Sun Oct 23 22:02:11 2022 +0200

    Update Pipfile

commit 0da0b1c062
Author: phail <phail@hacknology.de>
Date:   Sun Oct 23 21:39:15 2022 +0200

    update variable names

commit 08988e11f8
Merge: 30372b0e 8be6c707
Author: phail <phail@hacknology.de>
Date:   Sun Oct 23 20:37:22 2022 +0200

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit 30372b0e85
Author: phail <phail@hacknology.de>
Date:   Sun Oct 23 17:18:10 2022 +0200

    add tests for mail_to_html and generate_pdf_from_mail

commit 567e89d1c7
Author: phail <phail@hacknology.de>
Date:   Sat Oct 22 02:25:23 2022 +0200

    test for broken eml, add test_generate_pdf

commit f1f5227ccd
Author: phail <phail@hacknology.de>
Date:   Sat Oct 22 00:44:32 2022 +0200

    add unittest for external images

commit 09b5bd17f2
Author: phail <phail@hacknology.de>
Date:   Wed Oct 19 23:19:33 2022 +0200

    add unittest for generate_pdf_from_html

commit e384bd78c5
Author: phail <phail@hacknology.de>
Date:   Tue Oct 18 23:48:07 2022 +0200

    add unittest for transform_inline_html

commit fda844f64c
Author: phail <phail@hacknology.de>
Date:   Sat Oct 15 15:41:43 2022 +0200

    add unittest for parse

commit daf90399bd
Author: phail <phail@hacknology.de>
Date:   Sat Oct 15 13:13:29 2022 +0200

    Add unitest for tika_parse()

commit 3d37e49c1a
Author: phail <phail@hacknology.de>
Date:   Fri Oct 14 15:43:43 2022 +0200

    add 2 more tests

commit 261c6fb990
Author: phail <phail@hacknology.de>
Date:   Thu Oct 13 01:03:09 2022 +0200

    add unittest for get_thumbnail

commit 87472b31d2
Merge: 430c5c3b 1024d7e6
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Oct 11 19:59:46 2022 -0700

    Merge pull request #1780 from paperless-ngx/fix/issue-1647

    Documentation: Add note re MS exchange servers

commit 1024d7e6e2
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Oct 11 15:12:22 2022 -0700

    Add note re MS exchange servers

commit 430c5c3b87
Merge: 0b5c6d35 b7c33550
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Fri Oct 7 23:45:51 2022 -0700

    Merge pull request #1761 from paperless-ngx/docs/lsio-tweak

    Documentation: Tweak LinuxServer

commit b7c335507f
Author: Trenton Holmes <holmes.trenton@gmail.com>
Date:   Thu Oct 6 18:24:25 2022 -0700

    Fixes the LSIO migration setting for the media root

commit 0b5c6d3532
Merge: fdac108c 5fd39472
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Thu Oct 6 13:22:58 2022 -0700

    Merge pull request #1731 from paperless-ngx/fix/1624

    Documentation: Adds troubleshooting note about Kubernetes and ports

commit fdac108cab
Merge: 5639659b 821c14fb
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Mon Oct 3 17:07:06 2022 -0700

    Merge pull request #1733 from paperless-ngx/docs-lsio-migrate

    Documentation: LinuxServer.io Migration

commit 821c14fbce
Author: Trenton H <holmes.trenton@gmail.com>
Date:   Mon Oct 3 11:14:18 2022 -0700

    Corrects how the link to example compose files looks

commit 8c03d9c638
Author: Trenton H <holmes.trenton@gmail.com>
Date:   Mon Oct 3 11:11:51 2022 -0700

    Corrects a re-numbered step

commit 174a609449
Author: Trenton H <holmes.trenton@gmail.com>
Date:   Mon Oct 3 10:16:53 2022 -0700

    Adds a few steps for migration from the LinuxServer.io image

commit 5fd394726e
Author: Trenton H <holmes.trenton@gmail.com>
Date:   Mon Oct 3 09:01:07 2022 -0700

    Adds troubleshooting note for Kubernetes about needing to set the port again

commit 5639659b63
Merge: 807b7130 7ba9cdbe
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Wed Sep 28 09:48:20 2022 -0700

    Merge pull request #1683 from paperless-ngx/fix/issue-1660

    Mariadb compose files should use `PAPERLESS_DBPASS`

commit 7ba9cdbe23
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Wed Sep 28 09:07:30 2022 -0700

    Mariadb compose files should use `PAPERLESS_DBPASS`

commit 807b7130e5
Merge: 9d117ee1 e2d593c0
Author: shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Sep 27 16:50:23 2022 -0700

    Merge pull request #1671 from paperless-ngx/v1.9.2-changelog

    [Documentation] Add v1.9.2 changelog

commit e2d593c023
Author: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
Date:   Tue Sep 27 10:04:41 2022 -0700

    Fix formatting, add note about 1.9.1 version string

commit 7455963124
Author: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Date:   Tue Sep 27 17:01:37 2022 +0000

    Changelog  - GHA

commit cdd2b99b6b
Merge: d0a0ae91 72ce4405
Author: phail <phail@hacknology.de>
Date:   Mon Jul 11 23:58:21 2022 +0200

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit d0a0ae91c4
Merge: c04b9fd7 feaf2da8
Author: phail <phail@hacknology.de>
Date:   Fri May 20 19:29:52 2022 +0200

    Merge branch 'dev' into feature-consume-eml

commit c04b9fd7f6
Author: phail <phail@hacknology.de>
Date:   Thu May 19 22:51:17 2022 +0200

    switch to From: Header instead of date to compensate for older libmagic versions

commit 6809b15ce1
Author: phail <phail@hacknology.de>
Date:   Sat May 14 16:47:12 2022 +0200

    workaround for wrong mime detection of .eml files

commit c317eca1ca
Author: phail <phel@hacknology.de>
Date:   Thu May 5 00:20:32 2022 +0200

    add attachment size to pdf

commit 466afa8203
Author: phail <phel@hacknology.de>
Date:   Wed May 4 23:42:59 2022 +0200

    fix consumption of mails without html
    split pdf generation functions

commit c2e3dc76d9
Author: phail <phel@hacknology.de>
Date:   Tue May 3 23:21:33 2022 +0200

    add parsing of inline attachments
    remove insecure chromium option
    fix html parsing

commit 5a899664f8
Author: phail <phel@hacknology.de>
Date:   Tue May 3 18:02:08 2022 +0200

    remove .eml parser from tika

commit 990e905a04
Merge: 6b7155a8 98ebb095
Author: phail <phel@hacknology.de>
Date:   Tue May 3 17:42:56 2022 +0200

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit 6b7155a849
Author: phail <phel@hacknology.de>
Date:   Sat Apr 30 17:33:12 2022 +0200

    merge migrations

commit 47851ddd3f
Merge: 47189643 0f1e3164
Author: phail <phel@hacknology.de>
Date:   Fri Apr 29 23:52:56 2022 +0200

    Merge remote-tracking branch 'paperless/dev' into feature-consume-eml

commit 47189643ff
Author: phail <phel@hacknology.de>
Date:   Fri Apr 29 22:58:11 2022 +0200

    add eml parser to paperless_mail

commit c1efe11cf3
Author: phail <phel@hacknology.de>
Date:   Wed Apr 27 23:32:10 2022 +0200

    improve pdf generation

commit 0e40ef5f35
Author: phail <phel@hacknology.de>
Date:   Wed Apr 27 19:52:59 2022 +0200

    add css for pdf generation

commit c8081595c4
Author: phail <phel@hacknology.de>
Date:   Tue Apr 26 23:25:48 2022 +0200

    improve pdf generation

commit a2b5b3b253
Author: phail <phel@hacknology.de>
Date:   Tue Apr 26 23:12:36 2022 +0200

    moved files

commit 790bcf05ed
Author: phail <phel@hacknology.de>
Date:   Mon Apr 25 20:55:00 2022 +0200

    add prototype archive pdf

commit d8d2d53c59
Author: phail <phel@hacknology.de>
Date:   Tue Apr 19 20:14:31 2022 +0200

    fix Mail actions mixup

commit 027897ff03
Author: phail <phel@hacknology.de>
Date:   Tue Apr 19 00:39:00 2022 +0200

    work in progress Mail parsing

commit cca576f518
Author: phail <phel@hacknology.de>
Date:   Fri Apr 15 14:40:02 2022 +0200

    add feature to consume imap mail als .eml

commit 5fcf1b5434
Author: phail <phel@hacknology.de>
Date:   Thu Apr 14 00:19:30 2022 +0200

    remove uneeded print and fix merge fail

commit 942b5aa9df
Merge: c05b39a0 cc936160
Author: phail <phel@hacknology.de>
Date:   Wed Apr 13 23:55:38 2022 +0200

    Merge branch 'dev' into fix-mail-starttls

commit c05b39a056
Author: phail <phel@hacknology.de>
Date:   Wed Apr 13 23:37:21 2022 +0200

    fix unittest

commit 3c8196527f
Author: phail <phel@hacknology.de>
Date:   Sat Apr 9 13:07:14 2022 +0200

    adapt to starttls interface change in imap_tools
    pin imap-tools version to avoid breaking changes
    improve mail log

Update settings.component.ts

Update settings.component.ts
2022-12-05 01:35:42 -08:00
Michael Shamoon
4279ba13e9 Redirect and notify for perms guard, add frontend tests 2022-11-25 00:10:34 -08:00
Michael Shamoon
28d70438ec add api permissions test 2022-11-24 22:09:28 -08:00
Michael Shamoon
ca6454f9fd update frontend test fixture 2022-11-24 22:09:28 -08:00
Michael Shamoon
0ffc9955b2 Fix python tests with auth on API endpoints, add python tests for User/Group endpoints 2022-11-24 21:19:00 -08:00
Michael Shamoon
cf53d0866a Allow create / update password via UI 2022-11-23 00:35:17 -08:00
Trenton H
3f19c0ed03 Fixes the link for flake8 to the new (?) GitHub repo 2022-11-22 23:36:02 -08:00
Michael Shamoon
355efadf87 Inherited permissions 2022-11-15 20:54:57 -08:00
Michael Shamoon
927a9781ad implement superuser select-permissions disable 2022-11-15 01:06:12 -08:00
Michael Shamoon
70eb22df42 Add Django model permissions to API endpoints 2022-11-15 00:44:32 -08:00
Michael Shamoon
f461485aa0 frontend permissions dialogs 2022-11-15 00:44:32 -08:00
Michael Shamoon
b6f1ced455 retain user / group permissions the UI doesnt use 2022-11-15 00:44:32 -08:00
Michael Shamoon
10f36870e6 Merge frontend user model 2022-11-13 21:31:46 -08:00
Michael Shamoon
fdaf9e9b46 Revert "fix: update user permissions and groups, update group permissions"
This reverts commit 57b709824f.
2022-11-13 14:18:44 -08:00
Kaaybi
57b709824f fix: update user permissions and groups, update group permissions 2022-11-13 14:02:54 -08:00
Michael Shamoon
c7b46ac861 skeleton user / group admin dialogs [WIP] 2022-11-13 09:06:56 -08:00
Michael Shamoon
bf28a512c6 dynamic loading of settings tab contents 2022-11-12 14:46:57 -08:00
Kaaybi
4333bd58cf feat: add users and groups API routes 2022-11-12 13:46:50 -08:00
Michael Shamoon
96a29883cd Refactor permissions to use enums, permissions service 2022-11-12 04:31:42 -08:00
Michael Shamoon
59e359ff98 Refactor permissions check code
Directly check permissions and no subscription (uisettings is always initialized on frontend startup)
update permission directive to accept single string
add explicit management permission name
2022-11-11 15:45:37 -08:00
Kaaybi
4603813896 feat: reflect django permissions on UI 2022-11-11 18:33:04 +00:00
543 changed files with 138566 additions and 36203 deletions

View File

@@ -1,9 +0,0 @@
{
"qpdf": {
"version": "11.2.0"
},
"jbig2enc": {
"version": "0.29",
"git_tag": "0.29"
}
}

View File

@@ -0,0 +1,14 @@
title: "[Feature Request] "
body:
- type: textarea
id: description
attributes:
label: Description
description: A clear and concise description of what you would like to see.
validations:
required: true
- type: textarea
id: other
attributes:
label: Other
description: Add any other context or information about the feature request here.

View File

@@ -40,7 +40,7 @@ categories:
labels:
- 'frontend'
- 'backend'
collapse-after: 0
collapse-after: 1
include-labels:
- 'enhancement'
- 'bug'
@@ -54,6 +54,8 @@ include-labels:
- 'ci-cd'
- 'breaking-change'
- 'notable'
exclude-labels:
- 'skip-changelog'
category-template: '### $TITLE'
change-template: '- $TITLE @$AUTHOR ([#$NUMBER]($URL))'
change-title-escapes: '\<*_&#@'

View File

@@ -1,491 +0,0 @@
#!/usr/bin/env python3
import json
import logging
import os
import shutil
import subprocess
from argparse import ArgumentParser
from typing import Dict
from typing import Final
from typing import Iterator
from typing import List
from typing import Optional
from common import get_log_level
from github import ContainerPackage
from github import GithubBranchApi
from github import GithubContainerRegistryApi
logger = logging.getLogger("cleanup-tags")
class ImageProperties:
"""
Data class wrapping the properties of an entry in the image index
manifests list. It is NOT an actual image with layers, etc
https://docs.docker.com/registry/spec/manifest-v2-2/
https://github.com/opencontainers/image-spec/blob/main/manifest.md
https://github.com/opencontainers/image-spec/blob/main/descriptor.md
"""
def __init__(self, data: Dict) -> None:
self._data = data
# This is the sha256: digest string. Corresponds to GitHub API name
# if the package is an untagged package
self.digest = self._data["digest"]
platform_data_os = self._data["platform"]["os"]
platform_arch = self._data["platform"]["architecture"]
platform_variant = self._data["platform"].get(
"variant",
"",
)
self.platform = f"{platform_data_os}/{platform_arch}{platform_variant}"
class ImageIndex:
"""
Data class wrapping up logic for an OCI Image Index
JSON data. Primary use is to access the manifests listing
See https://github.com/opencontainers/image-spec/blob/main/image-index.md
"""
def __init__(self, package_url: str, tag: str) -> None:
self.qualified_name = f"{package_url}:{tag}"
logger.info(f"Getting image index for {self.qualified_name}")
try:
proc = subprocess.run(
[
shutil.which("docker"),
"buildx",
"imagetools",
"inspect",
"--raw",
self.qualified_name,
],
capture_output=True,
check=True,
)
self._data = json.loads(proc.stdout)
except subprocess.CalledProcessError as e:
logger.error(
f"Failed to get image index for {self.qualified_name}: {e.stderr}",
)
raise e
@property
def image_pointers(self) -> Iterator[ImageProperties]:
for manifest_data in self._data["manifests"]:
yield ImageProperties(manifest_data)
class RegistryTagsCleaner:
"""
This is the base class for the image registry cleaning. Given a package
name, it will keep all images which are tagged and all untagged images
referred to by a manifest. This results in only images which have been untagged
and cannot be referenced except by their SHA in being removed. None of these
images should be referenced, so it is fine to delete them.
"""
def __init__(
self,
package_name: str,
repo_owner: str,
repo_name: str,
package_api: GithubContainerRegistryApi,
branch_api: Optional[GithubBranchApi],
):
self.actually_delete = False
self.package_api = package_api
self.branch_api = branch_api
self.package_name = package_name
self.repo_owner = repo_owner
self.repo_name = repo_name
self.tags_to_delete: List[str] = []
self.tags_to_keep: List[str] = []
# Get the information about all versions of the given package
# These are active, not deleted, the default returned from the API
self.all_package_versions = self.package_api.get_active_package_versions(
self.package_name,
)
# Get a mapping from a tag like "1.7.0" or "feature-xyz" to the ContainerPackage
# tagged with it. It makes certain lookups easy
self.all_pkgs_tags_to_version: Dict[str, ContainerPackage] = {}
for pkg in self.all_package_versions:
for tag in pkg.tags:
self.all_pkgs_tags_to_version[tag] = pkg
logger.info(
f"Located {len(self.all_package_versions)} versions of package {self.package_name}",
)
self.decide_what_tags_to_keep()
def clean(self):
"""
This method will delete image versions, based on the selected tags to delete.
It behaves more like an unlinking than actual deletion. Removing the tag
simply removes a pointer to an image, but the actual image data remains accessible
if one has the sha256 digest of it.
"""
for tag_to_delete in self.tags_to_delete:
package_version_info = self.all_pkgs_tags_to_version[tag_to_delete]
if self.actually_delete:
logger.info(
f"Deleting {tag_to_delete} (id {package_version_info.id})",
)
self.package_api.delete_package_version(
package_version_info,
)
else:
logger.info(
f"Would delete {tag_to_delete} (id {package_version_info.id})",
)
else:
logger.info("No tags to delete")
def clean_untagged(self, is_manifest_image: bool):
"""
This method will delete untagged images, that is those which are not named. It
handles if the image tag is actually a manifest, which points to images that look otherwise
untagged.
"""
def _clean_untagged_manifest():
"""
Handles the deletion of untagged images, but where the package is a manifest, ie a multi
arch image, which means some "untagged" images need to exist still.
Ok, bear with me, these are annoying.
Our images are multi-arch, so the manifest is more like a pointer to a sha256 digest.
These images are untagged, but pointed to, and so should not be removed (or every pull fails).
So for each image getting kept, parse the manifest to find the digest(s) it points to. Then
remove those from the list of untagged images. The final result is the untagged, not pointed to
version which should be safe to remove.
Example:
Tag: ghcr.io/paperless-ngx/paperless-ngx:1.7.1 refers to
amd64: sha256:b9ed4f8753bbf5146547671052d7e91f68cdfc9ef049d06690b2bc866fec2690
armv7: sha256:81605222df4ba4605a2ba4893276e5d08c511231ead1d5da061410e1bbec05c3
arm64: sha256:374cd68db40734b844705bfc38faae84cc4182371de4bebd533a9a365d5e8f3b
each of which appears as untagged image, but isn't really.
So from the list of untagged packages, remove those digests. Once all tags which
are being kept are checked, the remaining untagged packages are actually untagged
with no referrals in a manifest to them.
"""
# Simplify the untagged data, mapping name (which is a digest) to the version
# At the moment, these are the images which APPEAR untagged.
untagged_versions = {}
for x in self.all_package_versions:
if x.untagged:
untagged_versions[x.name] = x
skips = 0
# Parse manifests to locate digests pointed to
for tag in sorted(self.tags_to_keep):
try:
image_index = ImageIndex(
f"ghcr.io/{self.repo_owner}/{self.package_name}",
tag,
)
for manifest in image_index.image_pointers:
if manifest.digest in untagged_versions:
logger.info(
f"Skipping deletion of {manifest.digest},"
f" referred to by {image_index.qualified_name}"
f" for {manifest.platform}",
)
del untagged_versions[manifest.digest]
skips += 1
except Exception as err:
self.actually_delete = False
logger.exception(err)
return
logger.info(
f"Skipping deletion of {skips} packages referred to by a manifest",
)
# Delete the untagged and not pointed at packages
logger.info(f"Deleting untagged packages of {self.package_name}")
for to_delete_name in untagged_versions:
to_delete_version = untagged_versions[to_delete_name]
if self.actually_delete:
logger.info(
f"Deleting id {to_delete_version.id} named {to_delete_version.name}",
)
self.package_api.delete_package_version(
to_delete_version,
)
else:
logger.info(
f"Would delete {to_delete_name} (id {to_delete_version.id})",
)
def _clean_untagged_non_manifest():
"""
If the package is not a multi-arch manifest, images without tags are safe to delete.
"""
for package in self.all_package_versions:
if package.untagged:
if self.actually_delete:
logger.info(
f"Deleting id {package.id} named {package.name}",
)
self.package_api.delete_package_version(
package,
)
else:
logger.info(
f"Would delete {package.name} (id {package.id})",
)
else:
logger.info(
f"Not deleting tag {package.tags[0]} of package {self.package_name}",
)
logger.info("Beginning untagged image cleaning")
if is_manifest_image:
_clean_untagged_manifest()
else:
_clean_untagged_non_manifest()
def decide_what_tags_to_keep(self):
"""
This method holds the logic to delete what tags to keep and there fore
what tags to delete.
By default, any image with at least 1 tag will be kept
"""
# By default, keep anything which is tagged
self.tags_to_keep = list(set(self.all_pkgs_tags_to_version.keys()))
def check_remaining_tags_valid(self):
"""
Checks the non-deleted tags are still valid. The assumption is if the
manifest is can be inspected and each image manifest if points to can be
inspected, the image will still pull.
https://github.com/opencontainers/image-spec/blob/main/image-index.md
"""
logger.info("Beginning confirmation step")
a_tag_failed = False
for tag in sorted(self.tags_to_keep):
try:
image_index = ImageIndex(
f"ghcr.io/{self.repo_owner}/{self.package_name}",
tag,
)
for manifest in image_index.image_pointers:
logger.info(f"Checking {manifest.digest} for {manifest.platform}")
# This follows the pointer from the index to an actual image, layers and all
# Note the format is @
digest_name = f"ghcr.io/{self.repo_owner}/{self.package_name}@{manifest.digest}"
try:
subprocess.run(
[
shutil.which("docker"),
"buildx",
"imagetools",
"inspect",
"--raw",
digest_name,
],
capture_output=True,
check=True,
)
except subprocess.CalledProcessError as e:
logger.error(f"Failed to inspect digest: {e.stderr}")
a_tag_failed = True
except subprocess.CalledProcessError as e:
a_tag_failed = True
logger.error(f"Failed to inspect: {e.stderr}")
continue
if a_tag_failed:
raise Exception("At least one image tag failed to inspect")
class MainImageTagsCleaner(RegistryTagsCleaner):
def decide_what_tags_to_keep(self):
"""
Overrides the default logic for deciding what images to keep. Images tagged as "feature-"
will be removed, if the corresponding branch no longer exists.
"""
# Default to everything gets kept still
super().decide_what_tags_to_keep()
# Locate the feature branches
feature_branches = {}
for branch in self.branch_api.get_branches(
repo=self.repo_name,
):
if branch.name.startswith("feature-"):
logger.debug(f"Found feature branch {branch.name}")
feature_branches[branch.name] = branch
logger.info(f"Located {len(feature_branches)} feature branches")
if not len(feature_branches):
# Our work here is done, delete nothing
return
# Filter to packages which are tagged with feature-*
packages_tagged_feature: List[ContainerPackage] = []
for package in self.all_package_versions:
if package.tag_matches("feature-"):
packages_tagged_feature.append(package)
# Map tags like "feature-xyz" to a ContainerPackage
feature_pkgs_tags_to_versions: Dict[str, ContainerPackage] = {}
for pkg in packages_tagged_feature:
for tag in pkg.tags:
feature_pkgs_tags_to_versions[tag] = pkg
logger.info(
f'Located {len(feature_pkgs_tags_to_versions)} versions of package {self.package_name} tagged "feature-"',
)
# All the feature tags minus all the feature branches leaves us feature tags
# with no corresponding branch
self.tags_to_delete = list(
set(feature_pkgs_tags_to_versions.keys()) - set(feature_branches.keys()),
)
# All the tags minus the set of going to be deleted tags leaves us the
# tags which will be kept around
self.tags_to_keep = list(
set(self.all_pkgs_tags_to_version.keys()) - set(self.tags_to_delete),
)
logger.info(
f"Located {len(self.tags_to_delete)} versions of package {self.package_name} to delete",
)
class LibraryTagsCleaner(RegistryTagsCleaner):
"""
Exists for the off chance that someday, the installer library images
will need their own logic
"""
pass
def _main():
parser = ArgumentParser(
description="Using the GitHub API locate and optionally delete container"
" tags which no longer have an associated feature branch",
)
# Requires an affirmative command to actually do a delete
parser.add_argument(
"--delete",
action="store_true",
default=False,
help="If provided, actually delete the container tags",
)
# When a tagged image is updated, the previous version remains, but it no longer tagged
# Add this option to remove them as well
parser.add_argument(
"--untagged",
action="store_true",
default=False,
help="If provided, delete untagged containers as well",
)
# If given, the package is assumed to be a multi-arch manifest. Cache packages are
# not multi-arch, all other types are
parser.add_argument(
"--is-manifest",
action="store_true",
default=False,
help="If provided, the package is assumed to be a multi-arch manifest following schema v2",
)
# Allows configuration of log level for debugging
parser.add_argument(
"--loglevel",
default="info",
help="Configures the logging level",
)
# Get the name of the package being processed this round
parser.add_argument(
"package",
help="The package to process",
)
args = parser.parse_args()
logging.basicConfig(
level=get_log_level(args),
datefmt="%Y-%m-%d %H:%M:%S",
format="%(asctime)s %(levelname)-8s %(message)s",
)
# Must be provided in the environment
repo_owner: Final[str] = os.environ["GITHUB_REPOSITORY_OWNER"]
repo: Final[str] = os.environ["GITHUB_REPOSITORY"]
gh_token: Final[str] = os.environ["TOKEN"]
# Find all branches named feature-*
# Note: Only relevant to the main application, but simpler to
# leave in for all packages
with GithubBranchApi(gh_token) as branch_api:
with GithubContainerRegistryApi(gh_token, repo_owner) as container_api:
if args.package in {"paperless-ngx", "paperless-ngx/builder/cache/app"}:
cleaner = MainImageTagsCleaner(
args.package,
repo_owner,
repo,
container_api,
branch_api,
)
else:
cleaner = LibraryTagsCleaner(
args.package,
repo_owner,
repo,
container_api,
None,
)
# Set if actually doing a delete vs dry run
cleaner.actually_delete = args.delete
# Clean images with tags
cleaner.clean()
# Clean images which are untagged
cleaner.clean_untagged(args.is_manifest)
# Verify remaining tags still pull
if args.is_manifest:
cleaner.check_remaining_tags_valid()
if __name__ == "__main__":
_main()

View File

@@ -1,48 +0,0 @@
#!/usr/bin/env python3
import logging
def get_image_tag(
repo_name: str,
pkg_name: str,
pkg_version: str,
) -> str:
"""
Returns a string representing the normal image for a given package
"""
return f"ghcr.io/{repo_name.lower()}/builder/{pkg_name}:{pkg_version}"
def get_cache_image_tag(
repo_name: str,
pkg_name: str,
pkg_version: str,
branch_name: str,
) -> str:
"""
Returns a string representing the expected image cache tag for a given package
Registry type caching is utilized for the builder images, to allow fast
rebuilds, generally almost instant for the same version
"""
return f"ghcr.io/{repo_name.lower()}/builder/cache/{pkg_name}:{pkg_version}"
def get_log_level(args) -> int:
"""
Returns a logging level, based
:param args:
:return:
"""
levels = {
"critical": logging.CRITICAL,
"error": logging.ERROR,
"warn": logging.WARNING,
"warning": logging.WARNING,
"info": logging.INFO,
"debug": logging.DEBUG,
}
level = levels.get(args.loglevel.lower())
if level is None:
level = logging.INFO
return level

View File

@@ -1,92 +0,0 @@
#!/usr/bin/env python3
"""
This is a helper script for the mutli-stage Docker image builder.
It provides a single point of configuration for package version control.
The output JSON object is used by the CI workflow to determine what versions
to build and pull into the final Docker image.
Python package information is obtained from the Pipfile.lock. As this is
kept updated by dependabot, it usually will need no further configuration.
The sole exception currently is pikepdf, which has a dependency on qpdf,
and is configured here to use the latest version of qpdf built by the workflow.
Other package version information is configured directly below, generally by
setting the version and Git information, if any.
"""
import argparse
import json
import os
from pathlib import Path
from typing import Final
from common import get_cache_image_tag
from common import get_image_tag
def _main():
parser = argparse.ArgumentParser(
description="Generate a JSON object of information required to build the given package, based on the Pipfile.lock",
)
parser.add_argument(
"package",
help="The name of the package to generate JSON for",
)
PIPFILE_LOCK_PATH: Final[Path] = Path("Pipfile.lock")
BUILD_CONFIG_PATH: Final[Path] = Path(".build-config.json")
# Read the main config file
build_json: Final = json.loads(BUILD_CONFIG_PATH.read_text())
# Read Pipfile.lock file
pipfile_data: Final = json.loads(PIPFILE_LOCK_PATH.read_text())
args: Final = parser.parse_args()
# Read from environment variables set by GitHub Actions
repo_name: Final[str] = os.environ["GITHUB_REPOSITORY"]
branch_name: Final[str] = os.environ["GITHUB_REF_NAME"]
# Default output values
version = None
extra_config = {}
if args.package in pipfile_data["default"]:
# Read the version from Pipfile.lock
pkg_data = pipfile_data["default"][args.package]
pkg_version = pkg_data["version"].split("==")[-1]
version = pkg_version
# Any extra/special values needed
if args.package == "pikepdf":
extra_config["qpdf_version"] = build_json["qpdf"]["version"]
elif args.package in build_json:
version = build_json[args.package]["version"]
else:
raise NotImplementedError(args.package)
# The JSON object we'll output
output = {
"name": args.package,
"version": version,
"image_tag": get_image_tag(repo_name, args.package, version),
"cache_tag": get_cache_image_tag(
repo_name,
args.package,
version,
branch_name,
),
}
# Add anything special a package may need
output.update(extra_config)
# Output the JSON info to stdout
print(json.dumps(output))
if __name__ == "__main__":
_main()

View File

@@ -1,274 +0,0 @@
#!/usr/bin/env python3
"""
This module contains some useful classes for interacting with the Github API.
The full documentation for the API can be found here: https://docs.github.com/en/rest
Mostly, this focusses on two areas, repo branches and repo packages, as the use case
is cleaning up container images which are no longer referred to.
"""
import functools
import logging
import re
import urllib.parse
from typing import Dict
from typing import List
from typing import Optional
import httpx
logger = logging.getLogger("github-api")
class _GithubApiBase:
"""
A base class for interacting with the Github API. It
will handle the session and setting authorization headers.
"""
def __init__(self, token: str) -> None:
self._token = token
self._client: Optional[httpx.Client] = None
def __enter__(self) -> "_GithubApiBase":
"""
Sets up the required headers for auth and response
type from the API
"""
self._client = httpx.Client()
self._client.headers.update(
{
"Accept": "application/vnd.github.v3+json",
"Authorization": f"token {self._token}",
},
)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
"""
Ensures the authorization token is cleaned up no matter
the reason for the exit
"""
if "Accept" in self._client.headers:
del self._client.headers["Accept"]
if "Authorization" in self._client.headers:
del self._client.headers["Authorization"]
# Close the session as well
self._client.close()
self._client = None
def _read_all_pages(self, endpoint):
"""
Helper function to read all pages of an endpoint, utilizing the
next.url until exhausted. Assumes the endpoint returns a list
"""
internal_data = []
while True:
resp = self._client.get(endpoint)
if resp.status_code == 200:
internal_data += resp.json()
if "next" in resp.links:
endpoint = resp.links["next"]["url"]
else:
logger.debug("Exiting pagination loop")
break
else:
logger.warning(f"Request to {endpoint} return HTTP {resp.status_code}")
resp.raise_for_status()
return internal_data
class _EndpointResponse:
"""
For all endpoint JSON responses, store the full
response data, for ease of extending later, if need be.
"""
def __init__(self, data: Dict) -> None:
self._data = data
class GithubBranch(_EndpointResponse):
"""
Simple wrapper for a repository branch, only extracts name information
for now.
"""
def __init__(self, data: Dict) -> None:
super().__init__(data)
self.name = self._data["name"]
class GithubBranchApi(_GithubApiBase):
"""
Wrapper around branch API.
See https://docs.github.com/en/rest/branches/branches
"""
def __init__(self, token: str) -> None:
super().__init__(token)
self._ENDPOINT = "https://api.github.com/repos/{REPO}/branches"
def get_branches(self, repo: str) -> List[GithubBranch]:
"""
Returns all current branches of the given repository owned by the given
owner or organization.
"""
# The environment GITHUB_REPOSITORY already contains the owner in the correct location
endpoint = self._ENDPOINT.format(REPO=repo)
internal_data = self._read_all_pages(endpoint)
return [GithubBranch(branch) for branch in internal_data]
class ContainerPackage(_EndpointResponse):
"""
Data class wrapping the JSON response from the package related
endpoints
"""
def __init__(self, data: Dict):
super().__init__(data)
# This is a numerical ID, required for interactions with this
# specific package, including deletion of it or restoration
self.id: int = self._data["id"]
# A string name. This might be an actual name or it could be a
# digest string like "sha256:"
self.name: str = self._data["name"]
# URL to the package, including its ID, can be used for deletion
# or restoration without needing to build up a URL ourselves
self.url: str = self._data["url"]
# The list of tags applied to this image. Maybe an empty list
self.tags: List[str] = self._data["metadata"]["container"]["tags"]
@functools.cached_property
def untagged(self) -> bool:
"""
Returns True if the image has no tags applied to it, False otherwise
"""
return len(self.tags) == 0
@functools.cache
def tag_matches(self, pattern: str) -> bool:
"""
Returns True if the image has at least one tag which matches the given regex,
False otherwise
"""
for tag in self.tags:
if re.match(pattern, tag) is not None:
return True
return False
def __repr__(self):
return f"Package {self.name}"
class GithubContainerRegistryApi(_GithubApiBase):
"""
Class wrapper to deal with the Github packages API. This class only deals with
container type packages, the only type published by paperless-ngx.
"""
def __init__(self, token: str, owner_or_org: str) -> None:
super().__init__(token)
self._owner_or_org = owner_or_org
if self._owner_or_org == "paperless-ngx":
# https://docs.github.com/en/rest/packages#get-all-package-versions-for-a-package-owned-by-an-organization
self._PACKAGES_VERSIONS_ENDPOINT = "https://api.github.com/orgs/{ORG}/packages/{PACKAGE_TYPE}/{PACKAGE_NAME}/versions"
# https://docs.github.com/en/rest/packages#delete-package-version-for-an-organization
self._PACKAGE_VERSION_DELETE_ENDPOINT = "https://api.github.com/orgs/{ORG}/packages/{PACKAGE_TYPE}/{PACKAGE_NAME}/versions/{PACKAGE_VERSION_ID}"
else:
# https://docs.github.com/en/rest/packages#get-all-package-versions-for-a-package-owned-by-the-authenticated-user
self._PACKAGES_VERSIONS_ENDPOINT = "https://api.github.com/user/packages/{PACKAGE_TYPE}/{PACKAGE_NAME}/versions"
# https://docs.github.com/en/rest/packages#delete-a-package-version-for-the-authenticated-user
self._PACKAGE_VERSION_DELETE_ENDPOINT = "https://api.github.com/user/packages/{PACKAGE_TYPE}/{PACKAGE_NAME}/versions/{PACKAGE_VERSION_ID}"
self._PACKAGE_VERSION_RESTORE_ENDPOINT = (
f"{self._PACKAGE_VERSION_DELETE_ENDPOINT}/restore"
)
def get_active_package_versions(
self,
package_name: str,
) -> List[ContainerPackage]:
"""
Returns all the versions of a given package (container images) from
the API
"""
package_type: str = "container"
# Need to quote this for slashes in the name
package_name = urllib.parse.quote(package_name, safe="")
endpoint = self._PACKAGES_VERSIONS_ENDPOINT.format(
ORG=self._owner_or_org,
PACKAGE_TYPE=package_type,
PACKAGE_NAME=package_name,
)
pkgs = []
for data in self._read_all_pages(endpoint):
pkgs.append(ContainerPackage(data))
return pkgs
def get_deleted_package_versions(
self,
package_name: str,
) -> List[ContainerPackage]:
package_type: str = "container"
# Need to quote this for slashes in the name
package_name = urllib.parse.quote(package_name, safe="")
endpoint = (
self._PACKAGES_VERSIONS_ENDPOINT.format(
ORG=self._owner_or_org,
PACKAGE_TYPE=package_type,
PACKAGE_NAME=package_name,
)
+ "?state=deleted"
)
pkgs = []
for data in self._read_all_pages(endpoint):
pkgs.append(ContainerPackage(data))
return pkgs
def delete_package_version(self, package_data: ContainerPackage):
"""
Deletes the given package version from the GHCR
"""
resp = self._client.delete(package_data.url)
if resp.status_code != 204:
logger.warning(
f"Request to delete {package_data.url} returned HTTP {resp.status_code}",
)
def restore_package_version(
self,
package_name: str,
package_data: ContainerPackage,
):
package_type: str = "container"
endpoint = self._PACKAGE_VERSION_RESTORE_ENDPOINT.format(
ORG=self._owner_or_org,
PACKAGE_TYPE=package_type,
PACKAGE_NAME=package_name,
PACKAGE_VERSION_ID=package_data.id,
)
resp = self._client.post(endpoint)
if resp.status_code != 204:
logger.warning(
f"Request to delete {endpoint} returned HTTP {resp.status_code}",
)

View File

@@ -16,7 +16,7 @@ on:
env:
# This is the version of pipenv all the steps will use
# If changing this, change Dockerfile
DEFAULT_PIP_ENV_VERSION: "2022.11.30"
DEFAULT_PIP_ENV_VERSION: "2023.4.20"
# This is the default version of Python to use in most steps
# If changing this, change Dockerfile
DEFAULT_PYTHON_VERSION: "3.9"
@@ -161,7 +161,7 @@ jobs:
pipenv --python ${{ steps.setup-python.outputs.python-version }} run pytest -ra
-
name: Upload coverage to Codecov
if: ${{ matrix.python-version == env.DEFAULT_PYTHON_VERSION }}
if: ${{ matrix.python-version == env.DEFAULT_PYTHON_VERSION && github.event_name == 'push'}}
uses: codecov/codecov-action@v3
with:
# not required for public repos, but intermittently fails otherwise
@@ -190,95 +190,42 @@ jobs:
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: cd src-ui && npm ci
- run: cd src-ui && npm run lint
- run: cd src-ui && npm run test
- run: cd src-ui && npm run e2e:ci
prepare-docker-build:
name: Prepare Docker Pipeline Data
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/beta' || contains(github.ref, 'beta.rc') || startsWith(github.ref, 'refs/tags/v'))
runs-on: ubuntu-22.04
needs:
- documentation
- tests-backend
- tests-frontend
steps:
cache: 'npm'
cache-dependency-path: 'src-ui/package-lock.json'
-
name: Set ghcr repository name
id: set-ghcr-repository
run: |
ghcr_name=$(echo "${GITHUB_REPOSITORY}" | awk '{ print tolower($0) }')
echo "repository=${ghcr_name}" >> $GITHUB_OUTPUT
name: Install dependencies
run: cd src-ui && npm ci
-
name: Checkout
uses: actions/checkout@v3
name: Install Playwright
run: npx playwright install --with-deps
-
name: Set up Python
uses: actions/setup-python@v4
name: Linting checks
run: cd src-ui && npm run lint
-
name: Run Playwright tests
run: cd src-ui && npx playwright test
-
name: Upload test results
if: always()
uses: actions/upload-artifact@v3
with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
-
name: Setup qpdf image
id: qpdf-setup
run: |
build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py qpdf)
name: playwright-report
path: src-ui/playwright-report
echo ${build_json}
echo "qpdf-json=${build_json}" >> $GITHUB_OUTPUT
-
name: Setup psycopg2 image
id: psycopg2-setup
run: |
build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py psycopg2)
echo ${build_json}
echo "psycopg2-json=${build_json}" >> $GITHUB_OUTPUT
-
name: Setup pikepdf image
id: pikepdf-setup
run: |
build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py pikepdf)
echo ${build_json}
echo "pikepdf-json=${build_json}" >> $GITHUB_OUTPUT
-
name: Setup jbig2enc image
id: jbig2enc-setup
run: |
build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py jbig2enc)
echo ${build_json}
echo "jbig2enc-json=${build_json}" >> $GITHUB_OUTPUT
outputs:
ghcr-repository: ${{ steps.set-ghcr-repository.outputs.repository }}
qpdf-json: ${{ steps.qpdf-setup.outputs.qpdf-json }}
pikepdf-json: ${{ steps.pikepdf-setup.outputs.pikepdf-json }}
psycopg2-json: ${{ steps.psycopg2-setup.outputs.psycopg2-json }}
jbig2enc-json: ${{ steps.jbig2enc-setup.outputs.jbig2enc-json}}
# build and push image to docker hub.
build-docker-image:
name: Build Docker image for ${{ github.ref_name }}
runs-on: ubuntu-22.04
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/beta' || contains(github.ref, 'beta.rc') || startsWith(github.ref, 'refs/tags/v'))
concurrency:
group: ${{ github.workflow }}-build-docker-image-${{ github.ref_name }}
cancel-in-progress: true
needs:
- prepare-docker-build
- tests-backend
- tests-frontend
steps:
-
name: Check pushing to Docker Hub
id: docker-hub
id: push-other-places
# Only push to Dockerhub from the main repo AND the ref is either:
# main
# dev
@@ -286,21 +233,29 @@ jobs:
# a tag
# Otherwise forks would require a Docker Hub account and secrets setup
run: |
if [[ ${{ needs.prepare-docker-build.outputs.ghcr-repository }} == "paperless-ngx/paperless-ngx" && ( ${{ github.ref_name }} == "main" || ${{ github.ref_name }} == "dev" || ${{ github.ref_name }} == "beta" || ${{ startsWith(github.ref, 'refs/tags/v') }} == "true" ) ]] ; then
if [[ ${{ github.repository_owner }} == "paperless-ngx" && ( ${{ github.ref_name }} == "main" || ${{ github.ref_name }} == "dev" || ${{ github.ref_name }} == "beta" || ${{ startsWith(github.ref, 'refs/tags/v') }} == "true" ) ]] ; then
echo "Enabling DockerHub image push"
echo "enable=true" >> $GITHUB_OUTPUT
else
echo "Not pushing to DockerHub"
echo "enable=false" >> $GITHUB_OUTPUT
fi
-
name: Set ghcr repository name
id: set-ghcr-repository
run: |
ghcr_name=$(echo "${{ github.repository }}" | awk '{ print tolower($0) }')
echo "Name is ${ghcr_name}"
echo "ghcr-repository=${ghcr_name}" >> $GITHUB_OUTPUT
-
name: Gather Docker metadata
id: docker-meta
uses: docker/metadata-action@v4
with:
images: |
ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}
name=paperlessngx/paperless-ngx,enable=${{ steps.docker-hub.outputs.enable }}
ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}
name=paperlessngx/paperless-ngx,enable=${{ steps.push-other-places.outputs.enable }}
name=quay.io/paperlessngx/paperless-ngx,enable=${{ steps.push-other-places.outputs.enable }}
tags: |
# Tag branches with branch name
type=ref,event=branch
@@ -311,6 +266,9 @@ jobs:
-
name: Checkout
uses: actions/checkout@v3
# If https://github.com/docker/buildx/issues/1044 is resolved,
# the append input with a native arm64 arch could be used to
# significantly speed up building
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
@@ -328,10 +286,19 @@ jobs:
name: Login to Docker Hub
uses: docker/login-action@v2
# Don't attempt to login is not pushing to Docker Hub
if: steps.docker-hub.outputs.enable == 'true'
if: steps.push-other-places.outputs.enable == 'true'
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Login to Quay.io
uses: docker/login-action@v2
# Don't attempt to login is not pushing to Quay.io
if: steps.push-other-places.outputs.enable == 'true'
with:
registry: quay.io
username: ${{ secrets.QUAY_USERNAME }}
password: ${{ secrets.QUAY_ROBOT_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v4
@@ -342,19 +309,13 @@ jobs:
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.docker-meta.outputs.tags }}
labels: ${{ steps.docker-meta.outputs.labels }}
build-args: |
JBIG2ENC_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).version }}
QPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }}
PIKEPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).version }}
PSYCOPG2_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).version }}
# Get cache layers from this branch, then dev, then main
# This allows new branches to get at least some cache benefits, generally from dev
cache-from: |
type=registry,ref=ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }}
type=registry,ref=ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}/builder/cache/app:dev
type=registry,ref=ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}/builder/cache/app:main
type=registry,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }}
type=registry,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:dev
cache-to: |
type=registry,mode=max,ref=ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }}
type=registry,mode=max,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }}
-
name: Inspect image
run: |
@@ -451,7 +412,7 @@ jobs:
do
cp --verbose ${file_name} dist/paperless-ngx/
done
mv --verbose dist/paperless-ngx/paperless.conf.example paperless.conf
mv --verbose dist/paperless-ngx/paperless.conf.example dist/paperless-ngx/paperless.conf
echo "Copying Docker related files"
cp --recursive docker/ dist/paperless-ngx/docker
@@ -586,5 +547,5 @@ jobs:
owner,
repo,
issue_number: result.data.number,
labels: ['documentation']
labels: ['documentation', 'skip-changelog']
});

View File

@@ -12,9 +12,6 @@ on:
push:
paths:
- ".github/workflows/cleanup-tags.yml"
- ".github/scripts/cleanup-tags.py"
- ".github/scripts/github.py"
- ".github/scripts/common.py"
concurrency:
group: registry-tags-cleanup
@@ -22,62 +19,65 @@ concurrency:
jobs:
cleanup-images:
name: Cleanup Image Tags for ${{ matrix.primary-name }}
name: Cleanup Image Tags for paperless-ngx
if: github.repository_owner == 'paperless-ngx'
runs-on: ubuntu-22.04
strategy:
matrix:
include:
- primary-name: "paperless-ngx"
cache-name: "paperless-ngx/builder/cache/app"
- primary-name: "paperless-ngx/builder/qpdf"
cache-name: "paperless-ngx/builder/cache/qpdf"
- primary-name: "paperless-ngx/builder/pikepdf"
cache-name: "paperless-ngx/builder/cache/pikepdf"
- primary-name: "paperless-ngx/builder/jbig2enc"
cache-name: "paperless-ngx/builder/cache/jbig2enc"
- primary-name: "paperless-ngx/builder/psycopg2"
cache-name: "paperless-ngx/builder/cache/psycopg2"
env:
# Requires a personal access token with the OAuth scope delete:packages
TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }}
steps:
-
name: Checkout
uses: actions/checkout@v3
-
name: Login to Github Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
-
name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.10"
-
name: Install Python libraries
run: |
python -m pip install httpx docker
#
# Clean up primary package
#
-
name: Cleanup for package "${{ matrix.primary-name }}"
name: Clean temporary images
if: "${{ env.TOKEN != '' }}"
run: |
python ${GITHUB_WORKSPACE}/.github/scripts/cleanup-tags.py --untagged --is-manifest --delete "${{ matrix.primary-name }}"
#
# Clean up registry cache package
#
uses: stumpylog/image-cleaner-action/ephemeral@v0.1.0
with:
token: "${{ env.TOKEN }}"
owner: "${{ github.repository_owner }}"
is_org: "true"
package_name: "paperless-ngx"
scheme: "branch"
repo_name: "paperless-ngx"
match_regex: "feature-"
cleanup-untagged-images:
name: Cleanup Untagged Images Tags for ${{ matrix.primary-name }}
if: github.repository_owner == 'paperless-ngx'
runs-on: ubuntu-22.04
needs:
- cleanup-images
strategy:
fail-fast: false
matrix:
include:
- primary-name: "paperless-ngx"
- primary-name: "paperless-ngx/builder/cache/app"
- primary-name: "paperless-ngx/builder/qpdf"
- primary-name: "paperless-ngx/builder/cache/qpdf"
- primary-name: "paperless-ngx/builder/pikepdf"
- primary-name: "paperless-ngx/builder/cache/pikepdf"
- primary-name: "paperless-ngx/builder/jbig2enc"
- primary-name: "paperless-ngx/builder/cache/jbig2enc"
- primary-name: "paperless-ngx/builder/psycopg2"
- primary-name: "paperless-ngx/builder/cache/psycopg2"
# TODO: Remove the above and replace with the below
# - primary-name: "builder/qpdf"
# - primary-name: "builder/cache/qpdf"
# - primary-name: "builder/pikepdf"
# - primary-name: "builder/cache/pikepdf"
# - primary-name: "builder/jbig2enc"
# - primary-name: "builder/cache/jbig2enc"
# - primary-name: "builder/psycopg2"
# - primary-name: "builder/cache/psycopg2"
env:
# Requires a personal access token with the OAuth scope delete:packages
TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }}
steps:
-
name: Cleanup for package "${{ matrix.cache-name }}"
name: Clean untagged images
if: "${{ env.TOKEN != '' }}"
run: |
python ${GITHUB_WORKSPACE}/.github/scripts/cleanup-tags.py --untagged --delete "${{ matrix.cache-name }}"
uses: stumpylog/image-cleaner-action/untagged@v0.1.0
with:
token: "${{ env.TOKEN }}"
owner: "${{ github.repository_owner }}"
is_org: "true"
package_name: "${{ matrix.primary-name }}"

View File

@@ -1,310 +0,0 @@
# This workflow will run to update the installer library of
# Docker images. These are the images which provide updated wheels
# .deb installation packages or maybe just some compiled library
name: Build Image Library
on:
push:
# Must match one of these branches AND one of the paths
# to be triggered
branches:
- "main"
- "dev"
- "library-*"
- "feature-*"
paths:
# Trigger the workflow if a Dockerfile changed
- "docker-builders/**"
# Trigger if a package was updated
- ".build-config.json"
- "Pipfile.lock"
# Also trigger on workflow changes related to the library
- ".github/workflows/installer-library.yml"
- ".github/workflows/reusable-workflow-builder.yml"
- ".github/scripts/**"
# Set a workflow level concurrency group so primary workflow
# can wait for this to complete if needed
# DO NOT CHANGE without updating main workflow group
concurrency:
group: build-installer-library
cancel-in-progress: false
jobs:
prepare-docker-build:
name: Prepare Docker Image Version Data
runs-on: ubuntu-22.04
steps:
-
name: Set ghcr repository name
id: set-ghcr-repository
run: |
ghcr_name=$(echo "${GITHUB_REPOSITORY}" | awk '{ print tolower($0) }')
echo "repository=${ghcr_name}" >> $GITHUB_OUTPUT
-
name: Checkout
uses: actions/checkout@v3
-
name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.9"
-
name: Install jq
run: |
sudo apt-get update
sudo apt-get install jq
-
name: Setup qpdf image
id: qpdf-setup
run: |
build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py qpdf)
echo ${build_json}
echo "qpdf-json=${build_json}" >> $GITHUB_OUTPUT
-
name: Setup psycopg2 image
id: psycopg2-setup
run: |
build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py psycopg2)
echo ${build_json}
echo "psycopg2-json=${build_json}" >> $GITHUB_OUTPUT
-
name: Setup pikepdf image
id: pikepdf-setup
run: |
build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py pikepdf)
echo ${build_json}
echo "pikepdf-json=${build_json}" >> $GITHUB_OUTPUT
-
name: Setup jbig2enc image
id: jbig2enc-setup
run: |
build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py jbig2enc)
echo ${build_json}
echo "jbig2enc-json=${build_json}" >> $GITHUB_OUTPUT
-
name: Setup other versions
id: cache-bust-setup
run: |
pillow_version=$(jq -r '.default.pillow.version | gsub("=";"")' Pipfile.lock)
lxml_version=$(jq -r '.default.lxml.version | gsub("=";"")' Pipfile.lock)
echo "Pillow is ${pillow_version}"
echo "lxml is ${lxml_version}"
echo "pillow-version=${pillow_version}" >> $GITHUB_OUTPUT
echo "lxml-version=${lxml_version}" >> $GITHUB_OUTPUT
outputs:
ghcr-repository: ${{ steps.set-ghcr-repository.outputs.repository }}
qpdf-json: ${{ steps.qpdf-setup.outputs.qpdf-json }}
pikepdf-json: ${{ steps.pikepdf-setup.outputs.pikepdf-json }}
psycopg2-json: ${{ steps.psycopg2-setup.outputs.psycopg2-json }}
jbig2enc-json: ${{ steps.jbig2enc-setup.outputs.jbig2enc-json }}
pillow-version: ${{ steps.cache-bust-setup.outputs.pillow-version }}
lxml-version: ${{ steps.cache-bust-setup.outputs.lxml-version }}
build-qpdf-debs:
name: qpdf
needs:
- prepare-docker-build
uses: ./.github/workflows/reusable-workflow-builder.yml
with:
dockerfile: ./docker-builders/Dockerfile.qpdf
build-platforms: linux/amd64
build-json: ${{ needs.prepare-docker-build.outputs.qpdf-json }}
build-args: |
QPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }}
build-jbig2enc:
name: jbig2enc
needs:
- prepare-docker-build
uses: ./.github/workflows/reusable-workflow-builder.yml
with:
dockerfile: ./docker-builders/Dockerfile.jbig2enc
build-json: ${{ needs.prepare-docker-build.outputs.jbig2enc-json }}
build-args: |
JBIG2ENC_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).version }}
build-psycopg2-wheel:
name: psycopg2
needs:
- prepare-docker-build
uses: ./.github/workflows/reusable-workflow-builder.yml
with:
dockerfile: ./docker-builders/Dockerfile.psycopg2
build-json: ${{ needs.prepare-docker-build.outputs.psycopg2-json }}
build-args: |
PSYCOPG2_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).version }}
build-pikepdf-wheel:
name: pikepdf
needs:
- prepare-docker-build
- build-qpdf-debs
uses: ./.github/workflows/reusable-workflow-builder.yml
with:
dockerfile: ./docker-builders/Dockerfile.pikepdf
build-json: ${{ needs.prepare-docker-build.outputs.pikepdf-json }}
build-args: |
REPO=${{ needs.prepare-docker-build.outputs.ghcr-repository }}
QPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }}
PIKEPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).version }}
PILLOW_VERSION=${{ needs.prepare-docker-build.outputs.pillow-version }}
LXML_VERSION=${{ needs.prepare-docker-build.outputs.lxml-version }}
commit-binary-files:
name: Store installers
needs:
- prepare-docker-build
- build-qpdf-debs
- build-jbig2enc
- build-psycopg2-wheel
- build-pikepdf-wheel
runs-on: ubuntu-22.04
steps:
-
name: Checkout
uses: actions/checkout@v3
with:
ref: binary-library
-
name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.9"
-
name: Install system dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -qq --no-install-recommends tree
-
name: Extract qpdf files
run: |
version=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }}
tag=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).image_tag }}
docker pull --quiet ${tag}
docker create --name qpdf-extract ${tag}
mkdir --parents qpdf/${version}/amd64
docker cp qpdf-extract:/usr/src/qpdf/${version}/amd64 qpdf/${version}
mkdir --parents qpdf/${version}/arm64
docker cp qpdf-extract:/usr/src/qpdf/${version}/arm64 qpdf/${version}
mkdir --parents qpdf/${version}/armv7
docker cp qpdf-extract:/usr/src/qpdf/${version}/armv7 qpdf/${version}
-
name: Extract psycopg2 files
run: |
version=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).version }}
tag=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).image_tag }}
docker pull --quiet --platform linux/amd64 ${tag}
docker create --platform linux/amd64 --name psycopg2-extract ${tag}
mkdir --parents psycopg2/${version}/amd64
docker cp psycopg2-extract:/usr/src/wheels/ psycopg2/${version}/amd64
mv psycopg2/${version}/amd64/wheels/* psycopg2/${version}/amd64
rm -r psycopg2/${version}/amd64/wheels/
docker rm psycopg2-extract
docker pull --quiet --platform linux/arm64 ${tag}
docker create --platform linux/arm64 --name psycopg2-extract ${tag}
mkdir --parents psycopg2/${version}/arm64
docker cp psycopg2-extract:/usr/src/wheels/ psycopg2/${version}/arm64
mv psycopg2/${version}/arm64/wheels/* psycopg2/${version}/arm64
rm -r psycopg2/${version}/arm64/wheels/
docker rm psycopg2-extract
docker pull --quiet --platform linux/arm/v7 ${tag}
docker create --platform linux/arm/v7 --name psycopg2-extract ${tag}
mkdir --parents psycopg2/${version}/armv7
docker cp psycopg2-extract:/usr/src/wheels/ psycopg2/${version}/armv7
mv psycopg2/${version}/armv7/wheels/* psycopg2/${version}/armv7
rm -r psycopg2/${version}/armv7/wheels/
docker rm psycopg2-extract
-
name: Extract pikepdf files
run: |
version=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).version }}
tag=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).image_tag }}
docker pull --quiet --platform linux/amd64 ${tag}
docker create --platform linux/amd64 --name pikepdf-extract ${tag}
mkdir --parents pikepdf/${version}/amd64
docker cp pikepdf-extract:/usr/src/wheels/ pikepdf/${version}/amd64
mv pikepdf/${version}/amd64/wheels/* pikepdf/${version}/amd64
rm -r pikepdf/${version}/amd64/wheels/
docker rm pikepdf-extract
docker pull --quiet --platform linux/arm64 ${tag}
docker create --platform linux/arm64 --name pikepdf-extract ${tag}
mkdir --parents pikepdf/${version}/arm64
docker cp pikepdf-extract:/usr/src/wheels/ pikepdf/${version}/arm64
mv pikepdf/${version}/arm64/wheels/* pikepdf/${version}/arm64
rm -r pikepdf/${version}/arm64/wheels/
docker rm pikepdf-extract
docker pull --quiet --platform linux/arm/v7 ${tag}
docker create --platform linux/arm/v7 --name pikepdf-extract ${tag}
mkdir --parents pikepdf/${version}/armv7
docker cp pikepdf-extract:/usr/src/wheels/ pikepdf/${version}/armv7
mv pikepdf/${version}/armv7/wheels/* pikepdf/${version}/armv7
rm -r pikepdf/${version}/armv7/wheels/
docker rm pikepdf-extract
-
name: Extract jbig2enc files
run: |
version=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).version }}
tag=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).image_tag }}
docker pull --quiet --platform linux/amd64 ${tag}
docker create --platform linux/amd64 --name jbig2enc-extract ${tag}
mkdir --parents jbig2enc/${version}/amd64
docker cp jbig2enc-extract:/usr/src/jbig2enc/build jbig2enc/${version}/amd64/
mv jbig2enc/${version}/amd64/build/* jbig2enc/${version}/amd64/
docker rm jbig2enc-extract
docker pull --quiet --platform linux/arm64 ${tag}
docker create --platform linux/arm64 --name jbig2enc-extract ${tag}
mkdir --parents jbig2enc/${version}/arm64
docker cp jbig2enc-extract:/usr/src/jbig2enc/build jbig2enc/${version}/arm64
mv jbig2enc/${version}/arm64/build/* jbig2enc/${version}/arm64/
docker rm jbig2enc-extract
docker pull --quiet --platform linux/arm/v7 ${tag}
docker create --platform linux/arm/v7 --name jbig2enc-extract ${tag}
mkdir --parents jbig2enc/${version}/armv7
docker cp jbig2enc-extract:/usr/src/jbig2enc/build jbig2enc/${version}/armv7
mv jbig2enc/${version}/armv7/build/* jbig2enc/${version}/armv7/
docker rm jbig2enc-extract
-
name: Show file structure
run: |
tree .
-
name: Commit files
run: |
git config --global user.name "github-actions"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add pikepdf/ qpdf/ psycopg2/ jbig2enc/
git commit -m "Updating installer packages" || true
git push origin || true

View File

@@ -28,7 +28,7 @@ jobs:
if: github.event_name == 'issues' && (github.event.action == 'opened' || github.event.action == 'reopened')
steps:
- name: Add issue to project and set status to ${{ env.todo }}
uses: leonsteinhaeuser/project-beta-automations@v2.0.1
uses: leonsteinhaeuser/project-beta-automations@v2.1.0
with:
gh_token: ${{ secrets.GH_TOKEN }}
organization: paperless-ngx
@@ -44,7 +44,7 @@ jobs:
if: github.event_name == 'pull_request_target' && (github.event.action == 'opened' || github.event.action == 'reopened') && github.event.pull_request.user.login != 'dependabot'
steps:
- name: Add PR to project and set status to "Needs Review"
uses: leonsteinhaeuser/project-beta-automations@v2.0.1
uses: leonsteinhaeuser/project-beta-automations@v2.1.0
with:
gh_token: ${{ secrets.GH_TOKEN }}
organization: paperless-ngx

47
.github/workflows/repo-maintenance.yml vendored Normal file
View File

@@ -0,0 +1,47 @@
name: 'Repository Maintenance'
on:
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
concurrency:
group: lock
jobs:
stale:
name: 'Stale'
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
with:
days-before-stale: 30
days-before-close: 7
only-labels: 'cant-reproduce'
stale-issue-label: stale
stale-pr-label: stale
stale-issue-message: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
lock-threads:
name: 'Lock Old Threads'
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v4
with:
issue-inactive-days: '30'
pr-inactive-days: '30'
log-output: true
issue-comment: >
This issue has been automatically locked since there
has not been any recent activity after it was closed.
Please open a new discussion or issue for related concerns.
pr-comment: >
This pull request has been automatically locked since there
has not been any recent activity after it was closed.
Please open a new discussion or issue for related concerns.

View File

@@ -1,57 +0,0 @@
name: Reusable Image Builder
on:
workflow_call:
inputs:
dockerfile:
required: true
type: string
build-json:
required: true
type: string
build-args:
required: false
default: ""
type: string
build-platforms:
required: false
default: linux/amd64,linux/arm64,linux/arm/v7
type: string
concurrency:
group: ${{ github.workflow }}-${{ fromJSON(inputs.build-json).name }}-${{ fromJSON(inputs.build-json).version }}
cancel-in-progress: false
jobs:
build-image:
name: Build ${{ fromJSON(inputs.build-json).name }} @ ${{ fromJSON(inputs.build-json).version }}
runs-on: ubuntu-22.04
steps:
-
name: Checkout
uses: actions/checkout@v3
-
name: Login to Github Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
-
name: Set up QEMU
uses: docker/setup-qemu-action@v2
-
name: Build ${{ fromJSON(inputs.build-json).name }}
uses: docker/build-push-action@v4
with:
context: .
file: ${{ inputs.dockerfile }}
tags: ${{ fromJSON(inputs.build-json).image_tag }}
platforms: ${{ inputs.build-platforms }}
build-args: ${{ inputs.build-args }}
push: true
cache-from: type=registry,ref=${{ fromJSON(inputs.build-json).cache_tag }}
cache-to: type=registry,mode=max,ref=${{ fromJSON(inputs.build-json).cache_tag }}

1
.gitignore vendored
View File

@@ -73,6 +73,7 @@ virtualenv
.venv/
/docker-compose.env
/docker-compose.yml
.ruff_cache/
# Used for development
scripts/import-for-development

View File

@@ -27,7 +27,7 @@ repos:
- id: check-case-conflict
- id: detect-private-key
- repo: https://github.com/pre-commit/mirrors-prettier
rev: "v2.7.1"
rev: 'v2.7.1'
hooks:
- id: prettier
types_or:
@@ -36,42 +36,17 @@ repos:
- markdown
exclude: "(^Pipfile\\.lock$)"
# Python hooks
- repo: https://github.com/asottile/reorder_python_imports
rev: v3.9.0
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: 'v0.0.265'
hooks:
- id: reorder-python-imports
exclude: "(migrations)"
- repo: https://github.com/asottile/yesqa
rev: "v1.4.0"
hooks:
- id: yesqa
exclude: "(migrations)"
- repo: https://github.com/asottile/add-trailing-comma
rev: "v2.4.0"
hooks:
- id: add-trailing-comma
exclude: "(migrations)"
- repo: https://github.com/PyCQA/flake8
rev: 6.0.0
hooks:
- id: flake8
files: ^src/
args:
- "--config=./src/setup.cfg"
- id: ruff
- repo: https://github.com/psf/black
rev: 22.12.0
rev: 23.3.0
hooks:
- id: black
- repo: https://github.com/asottile/pyupgrade
rev: v3.3.1
hooks:
- id: pyupgrade
exclude: "(migrations)"
args:
- "--py38-plus"
# Dockerfile hooks
- repo: https://github.com/AleksaC/hadolint-py
rev: v2.10.0
rev: v2.12.0.2
hooks:
- id: hadolint
# Shell script hooks

23
.ruff.toml Normal file
View File

@@ -0,0 +1,23 @@
# https://beta.ruff.rs/docs/settings/
# https://beta.ruff.rs/docs/rules/
extend-select = ["I", "W", "UP", "COM", "DJ", "EXE", "ISC", "ICN", "G201", "INP", "PIE", "RSE", "SIM", "TID", "PLC", "PLE", "RUF"]
# TODO PTH
ignore = ["DJ001", "SIM105"]
fix = true
line-length = 88
respect-gitignore = true
src = ["src"]
target-version = "py38"
format = "grouped"
show-fixes = true
[per-file-ignores]
".github/scripts/*.py" = ["E501", "INP001", "SIM117"]
"docker/wait-for-redis.py" = ["INP001"]
"*/tests/*.py" = ["E501", "SIM117"]
"*/migrations/*.py" = ["E501", "SIM"]
"src/paperless_tesseract/tests/test_parser.py" = ["RUF001"]
"src/documents/models.py" = ["SIM115"]
[isort]
force-single-line = true

View File

@@ -21,7 +21,7 @@ RUN set -eux \
# Comments:
# - pipenv dependencies are not left in the final image
# - pipenv can't touch the final image somehow
FROM --platform=$BUILDPLATFORM python:3.9-slim-bullseye as pipenv-base
FROM --platform=$BUILDPLATFORM python:3.9-alpine as pipenv-base
WORKDIR /usr/src/pipenv
@@ -29,7 +29,7 @@ COPY Pipfile* ./
RUN set -eux \
&& echo "Installing pipenv" \
&& python3 -m pip install --no-cache-dir --upgrade pipenv==2022.11.30 \
&& python3 -m pip install --no-cache-dir --upgrade pipenv==2023.4.20 \
&& echo "Generating requirement.txt" \
&& pipenv requirements > requirements.txt
@@ -46,15 +46,6 @@ LABEL org.opencontainers.image.url="https://github.com/paperless-ngx/paperless-n
LABEL org.opencontainers.image.licenses="GPL-3.0-only"
ARG DEBIAN_FRONTEND=noninteractive
# Buildx provided, must be defined to use though
ARG TARGETARCH
ARG TARGETVARIANT
# Workflow provided
ARG JBIG2ENC_VERSION
ARG QPDF_VERSION
ARG PIKEPDF_VERSION
ARG PSYCOPG2_VERSION
#
# Begin installation and configuration
@@ -175,12 +166,22 @@ RUN set -eux \
&& chmod +x install_management_commands.sh \
&& ./install_management_commands.sh
# Buildx provided, must be defined to use though
ARG TARGETARCH
ARG TARGETVARIANT
# Can be workflow provided, defaults set for manual building
ARG JBIG2ENC_VERSION=0.29
ARG QPDF_VERSION=11.3.0
ARG PIKEPDF_VERSION=7.2.0
ARG PSYCOPG2_VERSION=2.9.6
# Install the built packages from the installer library images
# These change sometimes
RUN set -eux \
&& echo "Getting binaries" \
&& mkdir paperless-ngx \
&& curl --fail --silent --show-error --output paperless-ngx.tar.gz --location https://github.com/paperless-ngx/paperless-ngx/archive/41d6e7e407af09a0882736d50c89b6e015997bff.tar.gz \
&& curl --fail --silent --show-error --output paperless-ngx.tar.gz --location https://github.com/paperless-ngx/builder/archive/3d6574e2dbaa8b8cdced864a256b0de59015f605.tar.gz \
&& tar -xf paperless-ngx.tar.gz --directory paperless-ngx --strip-components=1 \
&& cd paperless-ngx \
# Setting a specific revision ensures we know what this installed

65
Pipfile
View File

@@ -10,64 +10,70 @@ name = "piwheels"
[packages]
dateparser = "~=1.1"
django = "~=4.1"
# WARNING: django does not use semver.
# Only patch versions are guaranteed to not introduce breaking changes.
django = "~=4.1.9"
django-cors-headers = "*"
django-celery-results = "*"
django-compression-middleware = "*"
django-guardian = "*"
django-extensions = "*"
django-filter = "~=22.1"
djangorestframework = "~=3.14"
djangorestframework-guardian = "*"
filelock = "*"
gunicorn = "*"
imap-tools = "*"
langdetect = "*"
pathvalidate = "*"
pillow = "~=9.3"
pillow = "*"
pikepdf = "*"
python-gnupg = "*"
python-dotenv = "*"
python-dateutil = "*"
python-magic = "*"
python-ipware = "*"
psycopg2 = "*"
rapidfuzz = "*"
redis = {extras = ["hiredis"], version = "*"}
scikit-learn = "~=1.1"
scikit-learn = "~=1.2"
numpy = "*"
whitenoise = "~=6.2"
watchdog = "~=2.1"
whitenoise = "~=6.3"
watchdog = "~=2.2"
whoosh="~=2.7"
inotifyrecursive = "~=0.3"
ocrmypdf = "~=14.0"
tqdm = "*"
tika = "*"
# TODO: This will sadly also install daphne+dependencies,
# which an ASGI server we don't need. Adds about 15MB image size.
channels = "~=3.0"
channels = "~=4.0"
channels-redis = "*"
uvicorn = {extras = ["standard"], version = "*"}
concurrent-log-handler = "*"
"pdfminer.six" = "*"
pyzbar = "*"
mysqlclient = "*"
celery = {extras = ["redis"], version = "*"}
django-celery-results = "*"
setproctitle = "*"
nltk = "*"
pdf2image = "*"
flower = "*"
bleach = "*"
zxing-cpp = {version = "*", platform_machine = "== 'x86_64'"}
#
# Packages locked due to issues (try to check if these are fixed in a release every so often)
#
# Pin this until piwheels is building 1.9 (see https://www.piwheels.org/project/scipy/)
scipy = "==1.8.1"
# Newer versions aren't builting yet (see https://www.piwheels.org/project/cryptography/)
cryptography = "==38.0.1"
# Locked version until https://github.com/django/channels_redis/issues/332
# is resolved
channels-redis = "==3.4.1"
# v4 brings in extra dependencies for features not used here
reportlab = "==3.6.12"
# Pin this until piwheels is building a newer version (see https://www.piwheels.org/project/cryptography/)
cryptography = "==40.0.1"
[dev-packages]
coveralls = "*"
# Linting
black = "*"
pre-commit = "*"
ruff = "*"
# Testing
factory-boy = "*"
pytest = "*"
pytest-cov = "*"
@@ -75,7 +81,28 @@ pytest-django = "*"
pytest-env = "*"
pytest-sugar = "*"
pytest-xdist = "*"
black = "*"
pre-commit = "*"
"pdfminer.six" = "*"
imagehash = "*"
daphne = "*"
# Documentation
mkdocs-material = "*"
[typing-dev]
mypy = "*"
types-Pillow = "*"
django-filter-stubs = "*"
types-python-dateutil = "*"
djangorestframework-stubs = {extras= ["compatible-mypy"], version="*"}
celery-types = "*"
django-stubs = {extras= ["compatible-mypy"], version="*"}
types-dateparser = "*"
types-bleach = "*"
types-humanfriendly = "*"
types-redis = "*"
types-tqdm = "*"
types-Markdown = "*"
types-Pygments = "*"
types-backports = "*"
types-colorama = "*"
types-psycopg2 = "*"
types-setuptools = "*"

3688
Pipfile.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -101,13 +101,9 @@ For bugs please [open an issue](https://github.com/paperless-ngx/paperless-ngx/i
# Affiliated Projects
Paperless has been around a while now, and people are starting to build stuff on top of it. If you're one of those people, we can add your project to this list:
- [Paperless App](https://github.com/bauerj/paperless_app): An Android/iOS app for Paperless-ngx. Also works with the original Paperless and Paperless-ng.
- [Paperless Share](https://github.com/qcasey/paperless_share). Share any files from your Android application with paperless. Very simple, but works with all of the mobile scanning apps out there that allow you to share scanned documents.
- [Scan to Paperless](https://github.com/sbrunner/scan-to-paperless): Scan and prepare (crop, deskew, OCR, ...) your documents for Paperless.
- [Paperless Mobile](https://github.com/astubenbord/paperless-mobile): A modern, feature rich mobile application for Paperless.
Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Affiliated-Projects) for a user-maintained list of affiliated projects and software that is compatible with Paperless-ngx.
# Important Note
Document scanners are typically used to scan sensitive documents. Things like your social insurance number, tax records, invoices, etc. Everything is stored in the clear without encryption. This means that Paperless should never be run on an untrusted host. Instead, I recommend that if you do want to use it, run it locally on a server in your own home.
> Document scanners are typically used to scan sensitive documents like your social insurance number, tax records, invoices, etc. **Paperless-ngx should never be run on an untrusted host** because information is stored in clear text without encryption. No guarantees are made regarding security (but we do try!) and you use the app at your own risk.
> **The safest way to run Paperless-ngx is on a local server in your own home with backups in place**.

View File

@@ -1,81 +0,0 @@
#!/usr/bin/env bash
# Helper script for building the Docker image locally.
# Parses and provides the nessecary versions of other images to Docker
# before passing in the rest of script args.
# First Argument: The Dockerfile to build
# Other Arguments: Additional arguments to docker build
# Example Usage:
# ./build-docker-image.sh Dockerfile -t paperless-ngx:my-awesome-feature
set -eu
if ! command -v jq &> /dev/null ; then
echo "jq required"
exit 1
elif [ ! -f "$1" ]; then
echo "$1 is not a file, please provide the Dockerfile"
exit 1
fi
# Get the branch name (used for caching)
branch_name=$(git rev-parse --abbrev-ref HEAD)
# Parse eithe Pipfile.lock or the .build-config.json
jbig2enc_version=$(jq -r '.jbig2enc.version' .build-config.json)
qpdf_version=$(jq -r '.qpdf.version' .build-config.json)
psycopg2_version=$(jq -r '.default.psycopg2.version | gsub("=";"")' Pipfile.lock)
pikepdf_version=$(jq -r '.default.pikepdf.version | gsub("=";"")' Pipfile.lock)
pillow_version=$(jq -r '.default.pillow.version | gsub("=";"")' Pipfile.lock)
lxml_version=$(jq -r '.default.lxml.version | gsub("=";"")' Pipfile.lock)
base_filename="$(basename -- "${1}")"
build_args_str=""
cache_from_str=""
case "${base_filename}" in
*.jbig2enc)
build_args_str="--build-arg JBIG2ENC_VERSION=${jbig2enc_version}"
cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/jbig2enc:${jbig2enc_version}"
;;
*.psycopg2)
build_args_str="--build-arg PSYCOPG2_VERSION=${psycopg2_version}"
cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/psycopg2:${psycopg2_version}"
;;
*.qpdf)
build_args_str="--build-arg QPDF_VERSION=${qpdf_version}"
cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/qpdf:${qpdf_version}"
;;
*.pikepdf)
build_args_str="--build-arg QPDF_VERSION=${qpdf_version} --build-arg PIKEPDF_VERSION=${pikepdf_version} --build-arg PILLOW_VERSION=${pillow_version} --build-arg LXML_VERSION=${lxml_version}"
cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/pikepdf:${pikepdf_version}"
;;
Dockerfile)
build_args_str="--build-arg QPDF_VERSION=${qpdf_version} --build-arg PIKEPDF_VERSION=${pikepdf_version} --build-arg PSYCOPG2_VERSION=${psycopg2_version} --build-arg JBIG2ENC_VERSION=${jbig2enc_version}"
cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/app:${branch_name} --cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/app:dev"
;;
*)
echo "Unable to match ${base_filename}"
exit 1
;;
esac
read -r -a build_args_arr <<< "${build_args_str}"
read -r -a cache_from_arr <<< "${cache_from_str}"
set -eux
docker buildx build --file "${1}" \
--progress=plain \
--output=type=docker \
"${cache_from_arr[@]}" \
"${build_args_arr[@]}" \
"${@:2}" .

View File

@@ -1,4 +1,8 @@
commit_message: '[ci skip]'
pull_request_labels: [
"skip-changelog",
"translation"
]
files:
- source: /src/locale/en_US/LC_MESSAGES/django.po
translation: /src/locale/%locale_with_underscore%/LC_MESSAGES/django.po

View File

@@ -1,48 +0,0 @@
# This Dockerfile compiles the jbig2enc library
# Inputs:
# - JBIG2ENC_VERSION - the Git tag to checkout and build
FROM debian:bullseye-slim as main
LABEL org.opencontainers.image.description="A intermediate image with jbig2enc built"
ARG DEBIAN_FRONTEND=noninteractive
ARG JBIG2ENC_VERSION
ARG BUILD_PACKAGES="\
build-essential \
automake \
libtool \
libleptonica-dev \
zlib1g-dev \
git \
ca-certificates"
WORKDIR /usr/src/jbig2enc
RUN set -eux \
&& echo "Installing build tools" \
&& apt-get update --quiet \
&& apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \
&& echo "Building jbig2enc" \
&& git clone --quiet --branch $JBIG2ENC_VERSION https://github.com/agl/jbig2enc . \
&& ./autogen.sh \
&& ./configure \
&& make \
&& echo "Gathering package data" \
&& dpkg-query -f '${Package;-40}${Version}\n' -W > ./pkg-list.txt \
&& echo "Cleaning up image" \
&& apt-get -y purge ${BUILD_PACKAGES} \
&& apt-get -y autoremove --purge \
&& rm -rf /var/lib/apt/lists/* \
&& echo "Moving files around" \
&& mkdir build \
# Unlink a symlink that causes problems
&& unlink ./src/.libs/libjbig2enc.la \
# Move what the link pointed to
&& mv ./src/libjbig2enc.la ./build/ \
# Move the shared library .so files
&& mv ./src/.libs/libjbig2enc* ./build/ \
# And move the cli binary
&& mv ./src/jbig2 ./build/ \
&& mv ./pkg-list.txt ./build/

View File

@@ -1,118 +0,0 @@
# This Dockerfile builds the pikepdf wheel
# Inputs:
# - REPO - Docker repository to pull qpdf from
# - QPDF_VERSION - The image qpdf version to copy .deb files from
# - PIKEPDF_VERSION - Version of pikepdf to build wheel for
# Default to pulling from the main repo registry when manually building
ARG REPO="paperless-ngx/paperless-ngx"
# This does nothing, except provide a name for a copy below
ARG QPDF_VERSION
FROM --platform=$BUILDPLATFORM ghcr.io/${REPO}/builder/qpdf:${QPDF_VERSION} as qpdf-builder
#
# Stage: builder
# Purpose:
# - Build the pikepdf wheel
# - Build any dependent wheels which can't be found
#
FROM python:3.9-slim-bullseye as builder
LABEL org.opencontainers.image.description="A intermediate image with pikepdf wheel built"
# Buildx provided
ARG TARGETARCH
ARG TARGETVARIANT
ARG DEBIAN_FRONTEND=noninteractive
# Workflow provided
ARG QPDF_VERSION
ARG PIKEPDF_VERSION
# These are not used, but will still bust the cache if one changes
# Otherwise, the main image will try to build thing (and fail)
ARG PILLOW_VERSION
ARG LXML_VERSION
ARG BUILD_PACKAGES="\
build-essential \
python3-dev \
python3-pip \
# qpdf requirement - https://github.com/qpdf/qpdf#crypto-providers
libgnutls28-dev \
# lxml requrements - https://lxml.de/installation.html
libxml2-dev \
libxslt1-dev \
# Pillow requirements - https://pillow.readthedocs.io/en/stable/installation.html#external-libraries
# JPEG functionality
libjpeg62-turbo-dev \
# conpressed PNG
zlib1g-dev \
# compressed TIFF
libtiff-dev \
# type related services
libfreetype-dev \
# color management
liblcms2-dev \
# WebP format
libwebp-dev \
# JPEG 2000
libopenjp2-7-dev \
# improved color quantization
libimagequant-dev \
# complex text layout support
libraqm-dev"
WORKDIR /usr/src
COPY --from=qpdf-builder /usr/src/qpdf/${QPDF_VERSION}/${TARGETARCH}${TARGETVARIANT}/*.deb ./
# As this is an base image for a multi-stage final image
# the added size of the install is basically irrelevant
RUN set -eux \
&& echo "Installing build tools" \
&& apt-get update --quiet \
&& apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \
&& echo "Installing qpdf" \
&& dpkg --install libqpdf29_*.deb \
&& dpkg --install libqpdf-dev_*.deb \
&& echo "Installing Python tools" \
&& python3 -m pip install --no-cache-dir --upgrade \
pip \
wheel \
# https://pikepdf.readthedocs.io/en/latest/installation.html#requirements
pybind11 \
&& echo "Building pikepdf wheel ${PIKEPDF_VERSION}" \
&& mkdir wheels \
&& python3 -m pip wheel \
# Build the package at the required version
pikepdf==${PIKEPDF_VERSION} \
# Look to piwheels for additional pre-built wheels
--extra-index-url https://www.piwheels.org/simple \
# Output the *.whl into this directory
--wheel-dir wheels \
# Do not use a binary packge for the package being built
--no-binary=pikepdf \
# Do use binary packages for dependencies
--prefer-binary \
# Don't cache build files
--no-cache-dir \
&& ls -ahl wheels \
&& echo "Gathering package data" \
&& dpkg-query -f '${Package;-40}${Version}\n' -W > ./wheels/pkg-list.txt \
&& echo "Cleaning up image" \
&& apt-get -y purge ${BUILD_PACKAGES} \
&& apt-get -y autoremove --purge \
&& rm -rf /var/lib/apt/lists/*
#
# Stage: package
# Purpose: Holds the compiled .whl files in a tiny image to pull
#
FROM alpine:3.17 as package
WORKDIR /usr/src/wheels/
COPY --from=builder /usr/src/wheels/*.whl ./
COPY --from=builder /usr/src/wheels/pkg-list.txt ./

View File

@@ -1,66 +0,0 @@
# This Dockerfile builds the psycopg2 wheel
# Inputs:
# - PSYCOPG2_VERSION - Version to build
#
# Stage: builder
# Purpose:
# - Build the psycopg2 wheel
#
FROM python:3.9-slim-bullseye as builder
LABEL org.opencontainers.image.description="A intermediate image with psycopg2 wheel built"
ARG PSYCOPG2_VERSION
ARG DEBIAN_FRONTEND=noninteractive
ARG BUILD_PACKAGES="\
build-essential \
python3-dev \
python3-pip \
# https://www.psycopg.org/docs/install.html#prerequisites
libpq-dev"
WORKDIR /usr/src
# As this is an base image for a multi-stage final image
# the added size of the install is basically irrelevant
RUN set -eux \
&& echo "Installing build tools" \
&& apt-get update --quiet \
&& apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \
&& echo "Installing Python tools" \
&& python3 -m pip install --no-cache-dir --upgrade pip wheel \
&& echo "Building psycopg2 wheel ${PSYCOPG2_VERSION}" \
&& cd /usr/src \
&& mkdir wheels \
&& python3 -m pip wheel \
# Build the package at the required version
psycopg2==${PSYCOPG2_VERSION} \
# Output the *.whl into this directory
--wheel-dir wheels \
# Do not use a binary packge for the package being built
--no-binary=psycopg2 \
# Do use binary packages for dependencies
--prefer-binary \
# Don't cache build files
--no-cache-dir \
&& ls -ahl wheels/ \
&& echo "Gathering package data" \
&& dpkg-query -f '${Package;-40}${Version}\n' -W > ./wheels/pkg-list.txt \
&& echo "Cleaning up image" \
&& apt-get -y purge ${BUILD_PACKAGES} \
&& apt-get -y autoremove --purge \
&& rm -rf /var/lib/apt/lists/*
#
# Stage: package
# Purpose: Holds the compiled .whl files in a tiny image to pull
#
FROM alpine:3.17 as package
WORKDIR /usr/src/wheels/
COPY --from=builder /usr/src/wheels/*.whl ./
COPY --from=builder /usr/src/wheels/pkg-list.txt ./

View File

@@ -1,156 +0,0 @@
#
# Stage: pre-build
# Purpose:
# - Installs common packages
# - Sets common environment variables related to dpkg
# - Aquires the qpdf source from bookwork
# Useful Links:
# - https://qpdf.readthedocs.io/en/stable/installation.html#system-requirements
# - https://wiki.debian.org/Multiarch/HOWTO
# - https://wiki.debian.org/CrossCompiling
#
FROM debian:bullseye-slim as pre-build
ARG QPDF_VERSION
ARG COMMON_BUILD_PACKAGES="\
cmake \
debhelper\
debian-keyring \
devscripts \
dpkg-dev \
equivs \
packaging-dev \
libtool"
ENV DEB_BUILD_OPTIONS="terse nocheck nodoc parallel=2"
WORKDIR /usr/src
RUN set -eux \
&& echo "Installing common packages" \
&& apt-get update --quiet \
&& apt-get install --yes --quiet --no-install-recommends ${COMMON_BUILD_PACKAGES} \
&& echo "Getting qpdf source" \
&& echo "deb-src http://deb.debian.org/debian/ bookworm main" > /etc/apt/sources.list.d/bookworm-src.list \
&& apt-get update --quiet \
&& apt-get source --yes --quiet qpdf=${QPDF_VERSION}-1/bookworm
#
# Stage: amd64-builder
# Purpose: Builds qpdf for x86_64 (native build)
#
FROM pre-build as amd64-builder
ARG AMD64_BUILD_PACKAGES="\
build-essential \
libjpeg62-turbo-dev:amd64 \
libgnutls28-dev:amd64 \
zlib1g-dev:amd64"
WORKDIR /usr/src/qpdf-${QPDF_VERSION}
RUN set -eux \
&& echo "Beginning amd64" \
&& echo "Install amd64 packages" \
&& apt-get update --quiet \
&& apt-get install --yes --quiet --no-install-recommends ${AMD64_BUILD_PACKAGES} \
&& echo "Building amd64" \
&& dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean \
&& echo "Removing debug files" \
&& rm -f ../libqpdf29-dbgsym* \
&& rm -f ../qpdf-dbgsym* \
&& echo "Gathering package data" \
&& dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt
#
# Stage: armhf-builder
# Purpose:
# - Sets armhf specific environment
# - Builds qpdf for armhf (cross compile)
#
FROM pre-build as armhf-builder
ARG ARMHF_PACKAGES="\
crossbuild-essential-armhf \
libjpeg62-turbo-dev:armhf \
libgnutls28-dev:armhf \
zlib1g-dev:armhf"
WORKDIR /usr/src/qpdf-${QPDF_VERSION}
ENV CXX="/usr/bin/arm-linux-gnueabihf-g++" \
CC="/usr/bin/arm-linux-gnueabihf-gcc"
RUN set -eux \
&& echo "Beginning armhf" \
&& echo "Install armhf packages" \
&& dpkg --add-architecture armhf \
&& apt-get update --quiet \
&& apt-get install --yes --quiet --no-install-recommends ${ARMHF_PACKAGES} \
&& echo "Building armhf" \
&& dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean --host-arch armhf \
&& echo "Removing debug files" \
&& rm -f ../libqpdf29-dbgsym* \
&& rm -f ../qpdf-dbgsym* \
&& echo "Gathering package data" \
&& dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt
#
# Stage: aarch64-builder
# Purpose:
# - Sets aarch64 specific environment
# - Builds qpdf for aarch64 (cross compile)
#
FROM pre-build as aarch64-builder
ARG ARM64_PACKAGES="\
crossbuild-essential-arm64 \
libjpeg62-turbo-dev:arm64 \
libgnutls28-dev:arm64 \
zlib1g-dev:arm64"
ENV CXX="/usr/bin/aarch64-linux-gnu-g++" \
CC="/usr/bin/aarch64-linux-gnu-gcc"
WORKDIR /usr/src/qpdf-${QPDF_VERSION}
RUN set -eux \
&& echo "Beginning arm64" \
&& echo "Install arm64 packages" \
&& dpkg --add-architecture arm64 \
&& apt-get update --quiet \
&& apt-get install --yes --quiet --no-install-recommends ${ARM64_PACKAGES} \
&& echo "Building arm64" \
&& dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean --host-arch arm64 \
&& echo "Removing debug files" \
&& rm -f ../libqpdf29-dbgsym* \
&& rm -f ../qpdf-dbgsym* \
&& echo "Gathering package data" \
&& dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt
#
# Stage: package
# Purpose: Holds the compiled .deb files in arch/variant specific folders
#
FROM alpine:3.17 as package
LABEL org.opencontainers.image.description="A image with qpdf installers stored in architecture & version specific folders"
ARG QPDF_VERSION
WORKDIR /usr/src/qpdf/${QPDF_VERSION}/amd64
COPY --from=amd64-builder /usr/src/*.deb ./
COPY --from=amd64-builder /usr/src/pkg-list.txt ./
# Note this is ${TARGETARCH}${TARGETVARIANT} for armv7
WORKDIR /usr/src/qpdf/${QPDF_VERSION}/armv7
COPY --from=armhf-builder /usr/src/*.deb ./
COPY --from=armhf-builder /usr/src/pkg-list.txt ./
WORKDIR /usr/src/qpdf/${QPDF_VERSION}/arm64
COPY --from=aarch64-builder /usr/src/*.deb ./
COPY --from=aarch64-builder /usr/src/pkg-list.txt ./

View File

@@ -1,57 +0,0 @@
# Installer Library
This folder contains the Dockerfiles for building certain installers or libraries, which are then pulled into the main image.
## [jbig2enc](https://github.com/agl/jbig2enc)
### Why
JBIG is an image coding which can achieve better compression of images for PDFs.
### What
The Docker image builds a shared library file and utility, which is copied into the correct location in the final image.
### Updating
1. Ensure the given qpdf version is present in [Debian bookworm](https://packages.debian.org/bookworm/qpdf)
2. Update `.build-config.json` to the given version
3. If the Debian specific version has incremented, update `Dockerfile.qpdf`
See Also:
- [OCRMyPDF Documentation](https://ocrmypdf.readthedocs.io/en/latest/jbig2.html)
## [psycopg2](https://www.psycopg.org/)
### Why
The pre-built wheels of psycopg2 are built on Debian 9, which provides a quite old version of libpq-dev. This causes issue with authentication methods.
### What
The image builds psycopg2 wheels on Debian 10 and places the produced wheels into `/usr/src/wheels/`.
See Also:
- [Issue 266](https://github.com/paperless-ngx/paperless-ngx/issues/266)
## [qpdf](https://qpdf.readthedocs.io/en/stable/index.html)
### Why
qpdf and it's library provide tools to read, manipulate and fix up PDFs. Version 11 is also required by `pikepdf` 6+ and Debian 9 does not provide above version 10.
### What
The Docker image cross compiles .deb installers for each supported architecture of the main image. The installers are placed in `/usr/src/qpdf/${QPDF_VERSION}/${TARGETARCH}${TARGETVARIANT}/`
## [pikepdf](https://pikepdf.readthedocs.io/en/latest/)
### Why
Required by OCRMyPdf, this is a general purpose library for PDF manipulation in Python via the qpdf libraries.
### What
The built wheels are placed into `/usr/src/wheels/`

View File

@@ -80,7 +80,7 @@ django_checks() {
search_index() {
local -r index_version=3
local -r index_version=5
local -r index_version_file=${DATA_DIR}/.index_version
if [[ (! -f "${index_version_file}") || $(<"${index_version_file}") != "$index_version" ]]; then

View File

@@ -15,6 +15,10 @@ do
env_name=${line%%=*}
# Check if it starts with "PAPERLESS_" and ends in "_FILE"
if [[ ${env_name} == PAPERLESS_*_FILE ]]; then
# This should have been named different..
if [[ ${env_name} == "PAPERLESS_OCR_SKIP_ARCHIVE_FILE" ]]; then
continue
fi
# Extract the value of the environment
env_value=${line#*=}

View File

@@ -28,7 +28,7 @@ stderr_logfile_maxbytes=0
[program:celery]
command = celery --app paperless worker --loglevel INFO
command = celery --app paperless worker --loglevel INFO --without-mingle --without-gossip
user=paperless
stopasgroup = true
stopwaitsecs = 60

View File

@@ -12,13 +12,12 @@ from typing import Final
from redis import Redis
if __name__ == "__main__":
MAX_RETRY_COUNT: Final[int] = 5
RETRY_SLEEP_SECONDS: Final[int] = 5
REDIS_URL: Final[str] = os.getenv("PAPERLESS_REDIS", "redis://localhost:6379")
print(f"Waiting for Redis...", flush=True)
print("Waiting for Redis...", flush=True)
attempt = 0
with Redis.from_url(url=REDIS_URL) as client:
@@ -37,8 +36,8 @@ if __name__ == "__main__":
attempt += 1
if attempt >= MAX_RETRY_COUNT:
print(f"Failed to connect to redis using environment variable PAPERLESS_REDIS.")
print("Failed to connect to redis using environment variable PAPERLESS_REDIS.")
sys.exit(os.EX_UNAVAILABLE)
else:
print(f"Connected to Redis broker.")
print("Connected to Redis broker.")
sys.exit(os.EX_OK)

View File

@@ -98,7 +98,7 @@ the background.
won't automatically update to newer versions. In order to enable
updates as described above, either get the new `docker-compose.yml`
file from
[here](https://github.com/paperless-ngx/paperless-ngx/tree/master/docker/compose)
[here](https://github.com/paperless-ngx/paperless-ngx/tree/main/docker/compose)
or edit the `docker-compose.yml` file, find the line that says
```
@@ -148,6 +148,13 @@ following:
$ pip install -r requirements.txt
```
!!! note
At times, some dependencies will be removed from requirements.txt.
Comparing the versions and removing no longer needed dependencies
will keep your system or virtual environment clean and prevent
possible conflicts.
3. Migrate the database.
```shell-session
@@ -296,7 +303,7 @@ will be placed in individual json files, instead of a single JSON file. The main
manifest.json will still contain application wide information (e.g. tags, correspondent,
documenttype, etc)
If `-z` or `--zip` is provided, the export will be a zipfile
If `-z` or `--zip` is provided, the export will be a zip file
in the target directory, named according to the current date.
!!! warning
@@ -475,12 +482,13 @@ mail_fetcher
The command takes no arguments and processes all your mail accounts and
rules.
!!! note
!!! tip
As of October 2022 Microsoft no longer supports IMAP authentication
for Exchange servers, thus Exchange is no longer supported until a
solution is implemented in the Python IMAP library used by Paperless.
See [learn.microsoft.com](https://learn.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/deprecation-of-basic-authentication-exchange-online)
To use OAuth access tokens for mail fetching,
select the box to indicate the password is actually
a token when creating or editing a mail account. The
details for creating a token depend on your email
provider.
### Creating archived documents {#archiver}

View File

@@ -9,7 +9,7 @@ Paperless will compare the matching algorithms defined by every tag,
correspondent, document type, and storage path in your database to see
if they apply to the text in a document. In other words, if you define a
tag called `Home Utility` that had a `match` property of `bc hydro` and
a `matching_algorithm` of `literal`, Paperless will automatically tag
a `matching_algorithm` of `Exact`, Paperless will automatically tag
your newly-consumed document with your `Home Utility` tag so long as the
text `bc hydro` appears in the body of the document somewhere.
@@ -25,12 +25,13 @@ documents.
The following algorithms are available:
- **None:** No matching will be performed.
- **Any:** Looks for any occurrence of any word provided in match in
the PDF. If you define the match as `Bank1 Bank2`, it will match
documents containing either of these terms.
- **All:** Requires that every word provided appears in the PDF,
albeit not in the order provided.
- **Literal:** Matches only if the match appears exactly as provided
- **Exact:** Matches only if the match appears exactly as provided
(i.e. preserve ordering) in the PDF.
- **Regular expression:** Parses the match as a regular expression and
tries to find a match within the document.
@@ -308,6 +309,8 @@ Paperless provides the following placeholders within filenames:
- `{added_month_name_short}`: Month added abbreviated name, as per
locale
- `{added_day}`: Day added only (number 01-31).
- `{owner_username}`: Username of document owner, if any, or "none"
- `{original_name}`: Document original filename, minus the extension, if any, or "none"
Paperless will try to conserve the information from your database as
much as possible. However, some characters that you can use in document
@@ -368,7 +371,7 @@ value.
One of the best things in Paperless is that you can not only access the
documents via the web interface, but also via the file system.
When as single storage layout is not sufficient for your use case,
When a single storage layout is not sufficient for your use case,
storage paths come to the rescue. Storage paths allow you to configure
more precisely where each document is stored in the file system.
@@ -400,7 +403,7 @@ structure as in the previous example above.
Statement January.pdf
Statement February.pdf
Insurances/ # Insurances
Insurances/ # Insurances
Healthcare 123/
2022-01-01 Statement January.pdf
2022-02-02 Letter.pdf
@@ -414,13 +417,6 @@ structure as in the previous example above.
Defining a storage path is optional. If no storage path is defined for a
document, the global `PAPERLESS_FILENAME_FORMAT` is applied.
!!! warning
If you adjust the format of an existing storage path, old documents
don't get relocated automatically. You need to run the
[document renamer](/administration#renamer) to
adjust their paths.
## Celery Monitoring {#celery-monitoring}
The monitoring tool
@@ -492,7 +488,7 @@ database to be case sensitive. This would prevent a user from creating a
tag `Name` and `NAME` as they are considered the same.
Per Django documentation, to enable this requires manual intervention.
To enable case sensetive tables, you can execute the following command
To enable case sensitive tables, you can execute the following command
against each table:
`ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;`
@@ -507,3 +503,43 @@ existing tables) with:
Using mariadb version 10.4+ is recommended. Using the `utf8mb3` character set on
an older system may fix issues that can arise while setting up Paperless-ngx but
`utf8mb3` can cause issues with consumption (where `utf8mb4` does not).
## Barcodes {#barcodes}
Paperless is able to utilize barcodes for automatically preforming some tasks.
At this time, the library utilized for detection of barcodes supports the following types:
- AN-13/UPC-A
- UPC-E
- EAN-8
- Code 128
- Code 93
- Code 39
- Codabar
- Interleaved 2 of 5
- QR Code
- SQ Code
You may check for updates on the [zbar library homepage](https://github.com/mchehab/zbar).
For usage in Paperless, the type of barcode does not matter, only the contents of it.
For how to enable barcode usage, see [the configuration](/configuration#barcodes).
The two settings may be enabled independently, but do have interactions as explained
below.
### Document Splitting
When enabled, Paperless will look for a barcode with the configured value and create a new document
starting from the next page. The page with the barcode on it will _not_ be retained. It
is expected to be a page existing only for triggering the split.
### Archive Serial Number Assignment
When enabled, the value of the barcode (as an integer) will be used to set the document's
archive serial number, allowing quick reference back to the original, paper document.
If document splitting via barcode is also enabled, documents will be split when an ASN
barcode is located. However, differing from the splitting, the page with the
barcode _will_ be retained. This allows application of a barcode to any page, including
one which holds data to keep in the document.

View File

@@ -14,12 +14,15 @@ The API provides 7 main endpoints:
- `/api/document_types/`: Full CRUD support.
- `/api/logs/`: Read-Only.
- `/api/tags/`: Full CRUD support.
- `/api/tasks/`: Read-only.
- `/api/mail_accounts/`: Full CRUD support.
- `/api/mail_rules/`: Full CRUD support.
- `/api/users/`: Full CRUD support.
- `/api/groups/`: Full CRUD support.
All of these endpoints except for the logging endpoint allow you to
fetch, edit and delete individual objects by appending their primary key
to the path, for example `/api/documents/454/`.
fetch (and edit and delete where appropriate) individual objects by
appending their primary key to the path, e.g. `/api/documents/454/`.
The objects served by the document endpoint contain the following
fields:
@@ -44,6 +47,8 @@ fields:
Read-only.
- `archived_file_name`: Verbose filename of the archived document.
Read-only. Null if no archived document is available.
- `set_permissions`: Allows setting document permissions. Optional,
write-only. See [below](#permissions).
## Downloading documents
@@ -254,11 +259,38 @@ The endpoint supports the following optional form fields:
- `document_type`: Similar to correspondent.
- `tags`: Similar to correspondent. Specify this multiple times to
have multiple tags added to the document.
- `archive_serial_number`: An optional archive serial number to set.
The endpoint will immediately return "OK" if the document consumption
process was started successfully. No additional status information about
the consumption process itself is available, since that happens in a
different process.
The endpoint will immediately return HTTP 200 if the document consumption
process was started successfully, with the UUID of the consumption task
as the data. No additional status information about the consumption process
itself is available immediately, since that happens in a different process.
However, querying the tasks endpoint with the returned UUID e.g.
`/api/tasks/?task_id={uuid}` will provide information on the state of the
consumption including the ID of a created document if consumption succeeded.
## Permissions
All objects (documents, tags, etc.) allow setting object-level permissions
with an optional `set_permissions` parameter which is of the form:
```
{
"owner": user_id,
"view": {
"users": [...],
"groups": [...],
},
"change": {
"users": [...],
"groups": [...],
},
}
```
If this parameter is supplied the object's permissions will be overwritten,
assuming the authenticated user has permission to do so (the user must be
the object owner or a superuser).
## API Versioning

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 KiB

After

Width:  |  Height:  |  Size: 740 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 KiB

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 KiB

After

Width:  |  Height:  |  Size: 704 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 KiB

After

Width:  |  Height:  |  Size: 474 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 608 KiB

After

Width:  |  Height:  |  Size: 616 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 KiB

After

Width:  |  Height:  |  Size: 708 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 706 KiB

After

Width:  |  Height:  |  Size: 705 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 KiB

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 680 KiB

After

Width:  |  Height:  |  Size: 689 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 686 KiB

After

Width:  |  Height:  |  Size: 685 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 848 KiB

After

Width:  |  Height:  |  Size: 859 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 703 KiB

After

Width:  |  Height:  |  Size: 706 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 KiB

After

Width:  |  Height:  |  Size: 393 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 KiB

After

Width:  |  Height:  |  Size: 516 KiB

View File

@@ -1,5 +1,489 @@
# Changelog
## paperless-ngx 1.15.0
### Features
- Feature: quick filters from document detail [@shamoon](https://github.com/shamoon) ([#3476](https://github.com/paperless-ngx/paperless-ngx/pull/3476))
- Feature: Add explanations to relative dates [@shamoon](https://github.com/shamoon) ([#3471](https://github.com/paperless-ngx/paperless-ngx/pull/3471))
- Enhancement: paginate frontend tasks [@shamoon](https://github.com/shamoon) ([#3445](https://github.com/paperless-ngx/paperless-ngx/pull/3445))
- Feature: Better encapsulation of barcode logic [@stumpylog](https://github.com/stumpylog) ([#3425](https://github.com/paperless-ngx/paperless-ngx/pull/3425))
- Enhancement: Improve frontend error handling [@shamoon](https://github.com/shamoon) ([#3413](https://github.com/paperless-ngx/paperless-ngx/pull/3413))
### Bug Fixes
- Fix: KeyError error on unauthenticated API calls \& persist authentication when enabled [@ajgon](https://github.com/ajgon) ([#3516](https://github.com/paperless-ngx/paperless-ngx/pull/3516))
- Fix: exclude consumer \& AnonymousUser users from export manifest [@shamoon](https://github.com/shamoon) ([#3487](https://github.com/paperless-ngx/paperless-ngx/pull/3487))
- Fix: prevent date suggestion search if disabled [@shamoon](https://github.com/shamoon) ([#3472](https://github.com/paperless-ngx/paperless-ngx/pull/3472))
- Sync Pipfile.lock based on latest Pipfile [@adamantike](https://github.com/adamantike) ([#3475](https://github.com/paperless-ngx/paperless-ngx/pull/3475))
- Fix: DocumentSerializer should return correct original filename [@jayme-github](https://github.com/jayme-github) ([#3473](https://github.com/paperless-ngx/paperless-ngx/pull/3473))
- consumer.py: read from original file (instead of temp copy) [@chrisblech](https://github.com/chrisblech) ([#3466](https://github.com/paperless-ngx/paperless-ngx/pull/3466))
- Bugfix: Catch an nltk AttributeError and handle it [@stumpylog](https://github.com/stumpylog) ([#3453](https://github.com/paperless-ngx/paperless-ngx/pull/3453))
### Documentation
- Adding doc on how to setup Fail2ban [@GuillaumeHullin](https://github.com/GuillaumeHullin) ([#3414](https://github.com/paperless-ngx/paperless-ngx/pull/3414))
- Docs: Fix typo [@MarcelBochtler](https://github.com/MarcelBochtler) ([#3437](https://github.com/paperless-ngx/paperless-ngx/pull/3437))
- [Documentation] Move nginx [@shamoon](https://github.com/shamoon) ([#3420](https://github.com/paperless-ngx/paperless-ngx/pull/3420))
- Documentation: Note possible dependency removal for bare metal [@stumpylog](https://github.com/stumpylog) ([#3408](https://github.com/paperless-ngx/paperless-ngx/pull/3408))
### Development
- Development: migrate frontend tests to playwright [@shamoon](https://github.com/shamoon) ([#3401](https://github.com/paperless-ngx/paperless-ngx/pull/3401))
### Dependencies
<details>
<summary>10 changes</summary>
- Bump eslint from 8.39.0 to 8.41.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3513](https://github.com/paperless-ngx/paperless-ngx/pull/3513))
- Bump concurrently from 8.0.1 to 8.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3510](https://github.com/paperless-ngx/paperless-ngx/pull/3510))
- Bump [@<!---->ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot](https://github.com/<!---->ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot) ([#3507](https://github.com/paperless-ngx/paperless-ngx/pull/3507))
- Bump [@<!---->popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot](https://github.com/<!---->popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot) ([#3508](https://github.com/paperless-ngx/paperless-ngx/pull/3508))
- Bump [@<!---->typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3505](https://github.com/paperless-ngx/paperless-ngx/pull/3505))
- Bump bootstrap from 5.2.3 to 5.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3497](https://github.com/paperless-ngx/paperless-ngx/pull/3497))
- Bump [@<!---->typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3500](https://github.com/paperless-ngx/paperless-ngx/pull/3500))
- Bump tslib from 2.5.0 to 2.5.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3501](https://github.com/paperless-ngx/paperless-ngx/pull/3501))
- Bump [@<!---->types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot](https://github.com/<!---->types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot) ([#3498](https://github.com/paperless-ngx/paperless-ngx/pull/3498))
- Bump [@<!---->playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot](https://github.com/<!---->playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot) ([#3499](https://github.com/paperless-ngx/paperless-ngx/pull/3499))
</details>
### All App Changes
<details>
<summary>22 changes</summary>
- Fix: KeyError error on unauthenticated API calls \& persist authentication when enabled [@ajgon](https://github.com/ajgon) ([#3516](https://github.com/paperless-ngx/paperless-ngx/pull/3516))
- Bump eslint from 8.39.0 to 8.41.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3513](https://github.com/paperless-ngx/paperless-ngx/pull/3513))
- Bump concurrently from 8.0.1 to 8.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3510](https://github.com/paperless-ngx/paperless-ngx/pull/3510))
- Bump [@<!---->ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot](https://github.com/<!---->ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot) ([#3507](https://github.com/paperless-ngx/paperless-ngx/pull/3507))
- Bump [@<!---->popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot](https://github.com/<!---->popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot) ([#3508](https://github.com/paperless-ngx/paperless-ngx/pull/3508))
- Bump [@<!---->typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3505](https://github.com/paperless-ngx/paperless-ngx/pull/3505))
- Bump bootstrap from 5.2.3 to 5.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3497](https://github.com/paperless-ngx/paperless-ngx/pull/3497))
- Bump [@<!---->typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3500](https://github.com/paperless-ngx/paperless-ngx/pull/3500))
- Bump tslib from 2.5.0 to 2.5.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3501](https://github.com/paperless-ngx/paperless-ngx/pull/3501))
- Bump [@<!---->types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot](https://github.com/<!---->types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot) ([#3498](https://github.com/paperless-ngx/paperless-ngx/pull/3498))
- Bump [@<!---->playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot](https://github.com/<!---->playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot) ([#3499](https://github.com/paperless-ngx/paperless-ngx/pull/3499))
- Feature: quick filters from document detail [@shamoon](https://github.com/shamoon) ([#3476](https://github.com/paperless-ngx/paperless-ngx/pull/3476))
- Fix: exclude consumer \& AnonymousUser users from export manifest [@shamoon](https://github.com/shamoon) ([#3487](https://github.com/paperless-ngx/paperless-ngx/pull/3487))
- Fix: prevent date suggestion search if disabled [@shamoon](https://github.com/shamoon) ([#3472](https://github.com/paperless-ngx/paperless-ngx/pull/3472))
- Feature: Add explanations to relative dates [@shamoon](https://github.com/shamoon) ([#3471](https://github.com/paperless-ngx/paperless-ngx/pull/3471))
- Fix: DocumentSerializer should return correct original filename [@jayme-github](https://github.com/jayme-github) ([#3473](https://github.com/paperless-ngx/paperless-ngx/pull/3473))
- consumer.py: read from original file (instead of temp copy) [@chrisblech](https://github.com/chrisblech) ([#3466](https://github.com/paperless-ngx/paperless-ngx/pull/3466))
- Bugfix: Catch an nltk AttributeError and handle it [@stumpylog](https://github.com/stumpylog) ([#3453](https://github.com/paperless-ngx/paperless-ngx/pull/3453))
- Chore: Improves the logging mixin and allows it to be typed better [@stumpylog](https://github.com/stumpylog) ([#3451](https://github.com/paperless-ngx/paperless-ngx/pull/3451))
- Enhancement: paginate frontend tasks [@shamoon](https://github.com/shamoon) ([#3445](https://github.com/paperless-ngx/paperless-ngx/pull/3445))
- Add SSL Support for MariaDB [@kimdre](https://github.com/kimdre) ([#3444](https://github.com/paperless-ngx/paperless-ngx/pull/3444))
- Enhancement: Improve frontend error handling [@shamoon](https://github.com/shamoon) ([#3413](https://github.com/paperless-ngx/paperless-ngx/pull/3413))
</details>
## paperless-ngx 1.14.5
### Features
- Feature: owner filtering [@shamoon](https://github.com/shamoon) ([#3309](https://github.com/paperless-ngx/paperless-ngx/pull/3309))
- Enhancement: dynamic counts include all pages, hide for Any [@shamoon](https://github.com/shamoon) ([#3329](https://github.com/paperless-ngx/paperless-ngx/pull/3329))
- Enhancement: save tour completion, hide welcome widget [@shamoon](https://github.com/shamoon) ([#3321](https://github.com/paperless-ngx/paperless-ngx/pull/3321))
### Bug Fixes
- Fix: Adds better handling for files with invalid utf8 content [@stumpylog](https://github.com/stumpylog) ([#3387](https://github.com/paperless-ngx/paperless-ngx/pull/3387))
- Fix: respect permissions for autocomplete suggestions [@shamoon](https://github.com/shamoon) ([#3359](https://github.com/paperless-ngx/paperless-ngx/pull/3359))
- Fix: Transition to new library for finding IPs for failed logins [@stumpylog](https://github.com/stumpylog) ([#3382](https://github.com/paperless-ngx/paperless-ngx/pull/3382))
- [Security] Render frontend text as plain text [@shamoon](https://github.com/shamoon) ([#3366](https://github.com/paperless-ngx/paperless-ngx/pull/3366))
- Fix: default frontend to current owner, allow setting no owner on create [@shamoon](https://github.com/shamoon) ([#3347](https://github.com/paperless-ngx/paperless-ngx/pull/3347))
- Fix: dont perform mail actions when rule filename filter not met [@shamoon](https://github.com/shamoon) ([#3336](https://github.com/paperless-ngx/paperless-ngx/pull/3336))
- Fix: permission-aware bulk editing in 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3345](https://github.com/paperless-ngx/paperless-ngx/pull/3345))
### Maintenance
- Chore: Rework workflows [@stumpylog](https://github.com/stumpylog) ([#3242](https://github.com/paperless-ngx/paperless-ngx/pull/3242))
### Dependencies
- Chore: Upgrade channels to v4 [@stumpylog](https://github.com/stumpylog) ([#3383](https://github.com/paperless-ngx/paperless-ngx/pull/3383))
- Chore: Upgrades Python dependencies to their latest allowed versions [@stumpylog](https://github.com/stumpylog) ([#3365](https://github.com/paperless-ngx/paperless-ngx/pull/3365))
### All App Changes
<details>
<summary>13 changes</summary>
- Fix: Adds better handling for files with invalid utf8 content [@stumpylog](https://github.com/stumpylog) ([#3387](https://github.com/paperless-ngx/paperless-ngx/pull/3387))
- Fix: respect permissions for autocomplete suggestions [@shamoon](https://github.com/shamoon) ([#3359](https://github.com/paperless-ngx/paperless-ngx/pull/3359))
- Chore: Upgrade channels to v4 [@stumpylog](https://github.com/stumpylog) ([#3383](https://github.com/paperless-ngx/paperless-ngx/pull/3383))
- Fix: Transition to new library for finding IPs for failed logins [@stumpylog](https://github.com/stumpylog) ([#3382](https://github.com/paperless-ngx/paperless-ngx/pull/3382))
- Feature: owner filtering [@shamoon](https://github.com/shamoon) ([#3309](https://github.com/paperless-ngx/paperless-ngx/pull/3309))
- [Security] Render frontend text as plain text [@shamoon](https://github.com/shamoon) ([#3366](https://github.com/paperless-ngx/paperless-ngx/pull/3366))
- Enhancement: dynamic counts include all pages, hide for Any [@shamoon](https://github.com/shamoon) ([#3329](https://github.com/paperless-ngx/paperless-ngx/pull/3329))
- Fix: default frontend to current owner, allow setting no owner on create [@shamoon](https://github.com/shamoon) ([#3347](https://github.com/paperless-ngx/paperless-ngx/pull/3347))
- [Fix] Position:fixed for .global-dropzone-overlay [@denilsonsa](https://github.com/denilsonsa) ([#3367](https://github.com/paperless-ngx/paperless-ngx/pull/3367))
- Fix: dont perform mail actions when rule filename filter not met [@shamoon](https://github.com/shamoon) ([#3336](https://github.com/paperless-ngx/paperless-ngx/pull/3336))
- Enhancement: save tour completion, hide welcome widget [@shamoon](https://github.com/shamoon) ([#3321](https://github.com/paperless-ngx/paperless-ngx/pull/3321))
- Fix: permission-aware bulk editing in 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3345](https://github.com/paperless-ngx/paperless-ngx/pull/3345))
- Fix: Add proper testing for \*\_\_id\_\_in testing [@shamoon](https://github.com/shamoon) ([#3315](https://github.com/paperless-ngx/paperless-ngx/pull/3315))
</details>
## paperless-ngx 1.14.4
### Bug Fixes
- Fix: Inversion in tagged mail searching [@stumpylog](https://github.com/stumpylog) ([#3305](https://github.com/paperless-ngx/paperless-ngx/pull/3305))
- Fix dynamic count labels hidden in light mode [@shamoon](https://github.com/shamoon) ([#3303](https://github.com/paperless-ngx/paperless-ngx/pull/3303))
### All App Changes
<details>
<summary>3 changes</summary>
- New Crowdin updates [@paperlessngx-bot](https://github.com/paperlessngx-bot) ([#3298](https://github.com/paperless-ngx/paperless-ngx/pull/3298))
- Fix: Inversion in tagged mail searching [@stumpylog](https://github.com/stumpylog) ([#3305](https://github.com/paperless-ngx/paperless-ngx/pull/3305))
- Fix dynamic count labels hidden in light mode [@shamoon](https://github.com/shamoon) ([#3303](https://github.com/paperless-ngx/paperless-ngx/pull/3303))
</details>
## paperless-ngx 1.14.3
### Features
- Enhancement: better keyboard nav for filter/edit dropdowns [@shamoon](https://github.com/shamoon) ([#3227](https://github.com/paperless-ngx/paperless-ngx/pull/3227))
### Bug Fixes
- Bump filelock from 3.10.2 to 3.12.0 to fix permissions bug [@rbrownwsws](https://github.com/rbrownwsws) ([#3282](https://github.com/paperless-ngx/paperless-ngx/pull/3282))
- Fix: Handle cases where media files aren't all in the same filesystem [@stumpylog](https://github.com/stumpylog) ([#3261](https://github.com/paperless-ngx/paperless-ngx/pull/3261))
- Fix: Prevent erroneous warning when starting container [@stumpylog](https://github.com/stumpylog) ([#3262](https://github.com/paperless-ngx/paperless-ngx/pull/3262))
- Retain doc changes on tab switch after refresh doc [@shamoon](https://github.com/shamoon) ([#3243](https://github.com/paperless-ngx/paperless-ngx/pull/3243))
- Fix: Don't send Gmail related setting if the server doesn't support it [@stumpylog](https://github.com/stumpylog) ([#3240](https://github.com/paperless-ngx/paperless-ngx/pull/3240))
- Fix: close all docs on logout [@shamoon](https://github.com/shamoon) ([#3232](https://github.com/paperless-ngx/paperless-ngx/pull/3232))
- Fix: Respect superuser for advanced queries, test coverage for object perms [@shamoon](https://github.com/shamoon) ([#3222](https://github.com/paperless-ngx/paperless-ngx/pull/3222))
- Fix: ALLOWED_HOSTS logic being overwritten when \* is set [@ikaruswill](https://github.com/ikaruswill) ([#3218](https://github.com/paperless-ngx/paperless-ngx/pull/3218))
### Dependencies
<details>
<summary>7 changes</summary>
- Bump eslint from 8.38.0 to 8.39.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3276](https://github.com/paperless-ngx/paperless-ngx/pull/3276))
- Bump [@<!---->typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3278](https://github.com/paperless-ngx/paperless-ngx/pull/3278))
- Bump [@<!---->types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot](https://github.com/<!---->types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot) ([#3275](https://github.com/paperless-ngx/paperless-ngx/pull/3275))
- Bump rxjs from 7.8.0 to 7.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3277](https://github.com/paperless-ngx/paperless-ngx/pull/3277))
- Bump [@<!---->typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3274](https://github.com/paperless-ngx/paperless-ngx/pull/3274))
- Bump cypress from 12.9.0 to 12.11.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3268](https://github.com/paperless-ngx/paperless-ngx/pull/3268))
- Bulk bump angular packages to 15.2.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#3270](https://github.com/paperless-ngx/paperless-ngx/pull/3270))
</details>
### All App Changes
<details>
<summary>14 changes</summary>
- Bump eslint from 8.38.0 to 8.39.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3276](https://github.com/paperless-ngx/paperless-ngx/pull/3276))
- Bump [@<!---->typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3278](https://github.com/paperless-ngx/paperless-ngx/pull/3278))
- Bump [@<!---->types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot](https://github.com/<!---->types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot) ([#3275](https://github.com/paperless-ngx/paperless-ngx/pull/3275))
- Bump rxjs from 7.8.0 to 7.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3277](https://github.com/paperless-ngx/paperless-ngx/pull/3277))
- Bump [@<!---->typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3274](https://github.com/paperless-ngx/paperless-ngx/pull/3274))
- Bump cypress from 12.9.0 to 12.11.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3268](https://github.com/paperless-ngx/paperless-ngx/pull/3268))
- Bulk bump angular packages to 15.2.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#3270](https://github.com/paperless-ngx/paperless-ngx/pull/3270))
- Fix: Handle cases where media files aren't all in the same filesystem [@stumpylog](https://github.com/stumpylog) ([#3261](https://github.com/paperless-ngx/paperless-ngx/pull/3261))
- Retain doc changes on tab switch after refresh doc [@shamoon](https://github.com/shamoon) ([#3243](https://github.com/paperless-ngx/paperless-ngx/pull/3243))
- Fix: Don't send Gmail related setting if the server doesn't support it [@stumpylog](https://github.com/stumpylog) ([#3240](https://github.com/paperless-ngx/paperless-ngx/pull/3240))
- Fix: close all docs on logout [@shamoon](https://github.com/shamoon) ([#3232](https://github.com/paperless-ngx/paperless-ngx/pull/3232))
- Enhancement: better keyboard nav for filter/edit dropdowns [@shamoon](https://github.com/shamoon) ([#3227](https://github.com/paperless-ngx/paperless-ngx/pull/3227))
- Fix: Respect superuser for advanced queries, test coverage for object perms [@shamoon](https://github.com/shamoon) ([#3222](https://github.com/paperless-ngx/paperless-ngx/pull/3222))
- Fix: ALLOWED_HOSTS logic being overwritten when \* is set [@ikaruswill](https://github.com/ikaruswill) ([#3218](https://github.com/paperless-ngx/paperless-ngx/pull/3218))
</details>
## paperless-ngx 1.14.2
### Features
- Feature: Finnish translation [@shamoon](https://github.com/shamoon) ([#3215](https://github.com/paperless-ngx/paperless-ngx/pull/3215))
### Bug Fixes
- Fix: Load saved views from app frame, not dashboard [@shamoon](https://github.com/shamoon) ([#3211](https://github.com/paperless-ngx/paperless-ngx/pull/3211))
- Fix: advanced search or date searching + doc type/correspondent/storage path broken [@shamoon](https://github.com/shamoon) ([#3209](https://github.com/paperless-ngx/paperless-ngx/pull/3209))
- Fix MixedContentTypeError in add_inbox_tags handler [@e1mo](https://github.com/e1mo) ([#3212](https://github.com/paperless-ngx/paperless-ngx/pull/3212))
### All App Changes
<details>
<summary>4 changes</summary>
- Feature: Finnish translation [@shamoon](https://github.com/shamoon) ([#3215](https://github.com/paperless-ngx/paperless-ngx/pull/3215))
- Fix: Load saved views from app frame, not dashboard [@shamoon](https://github.com/shamoon) ([#3211](https://github.com/paperless-ngx/paperless-ngx/pull/3211))
- Fix: advanced search or date searching + doc type/correspondent/storage path broken [@shamoon](https://github.com/shamoon) ([#3209](https://github.com/paperless-ngx/paperless-ngx/pull/3209))
- Fix MixedContentTypeError in add_inbox_tags handler [@e1mo](https://github.com/e1mo) ([#3212](https://github.com/paperless-ngx/paperless-ngx/pull/3212))
</details>
## paperless-ngx 1.14.1
### Bug Fixes
- Fix: reduce frequency of permissions queries to speed up v1.14.0 [@shamoon](https://github.com/shamoon) ([#3201](https://github.com/paperless-ngx/paperless-ngx/pull/3201))
- Fix: permissions-aware statistics [@shamoon](https://github.com/shamoon) ([#3199](https://github.com/paperless-ngx/paperless-ngx/pull/3199))
- Fix: Use document owner for matching if set [@shamoon](https://github.com/shamoon) ([#3198](https://github.com/paperless-ngx/paperless-ngx/pull/3198))
- Fix: respect permissions on document view actions [@shamoon](https://github.com/shamoon) ([#3174](https://github.com/paperless-ngx/paperless-ngx/pull/3174))
- Increment API version for 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3191](https://github.com/paperless-ngx/paperless-ngx/pull/3191))
- Fix: dropdown Private items with empty set [@shamoon](https://github.com/shamoon) ([#3189](https://github.com/paperless-ngx/paperless-ngx/pull/3189))
- Documentation: add note for macOS [@shamoon](https://github.com/shamoon) ([#3190](https://github.com/paperless-ngx/paperless-ngx/pull/3190))
- Fix: make the importer a little more robust against some errors [@stumpylog](https://github.com/stumpylog) ([#3188](https://github.com/paperless-ngx/paperless-ngx/pull/3188))
- Fix: Specify backend for auto-login [@shamoon](https://github.com/shamoon) ([#3163](https://github.com/paperless-ngx/paperless-ngx/pull/3163))
- Fix: StoragePath missing the owned or granted filter [@stumpylog](https://github.com/stumpylog) ([#3180](https://github.com/paperless-ngx/paperless-ngx/pull/3180))
- Fix: Redis socket connections fail due to redis-py [@stumpylog](https://github.com/stumpylog) ([#3176](https://github.com/paperless-ngx/paperless-ngx/pull/3176))
- Fix: Handle delete mail action with no filters [@shamoon](https://github.com/shamoon) ([#3161](https://github.com/paperless-ngx/paperless-ngx/pull/3161))
- Fix typos and wrong version number in doc [@FizzyMUC](https://github.com/FizzyMUC) ([#3171](https://github.com/paperless-ngx/paperless-ngx/pull/3171))
### Documentation
- Documentation: add note for macOS [@shamoon](https://github.com/shamoon) ([#3190](https://github.com/paperless-ngx/paperless-ngx/pull/3190))
- Fix typos and wrong version number in doc [@FizzyMUC](https://github.com/FizzyMUC) ([#3171](https://github.com/paperless-ngx/paperless-ngx/pull/3171))
### Maintenance
- Chore: Fix isort not running, upgrade to the latest black [@stumpylog](https://github.com/stumpylog) ([#3177](https://github.com/paperless-ngx/paperless-ngx/pull/3177))
### All App Changes
<details>
<summary>11 changes</summary>
- Fix: reduce frequency of permissions queries to speed up v1.14.0 [@shamoon](https://github.com/shamoon) ([#3201](https://github.com/paperless-ngx/paperless-ngx/pull/3201))
- Fix: permissions-aware statistics [@shamoon](https://github.com/shamoon) ([#3199](https://github.com/paperless-ngx/paperless-ngx/pull/3199))
- Fix: Use document owner for matching if set [@shamoon](https://github.com/shamoon) ([#3198](https://github.com/paperless-ngx/paperless-ngx/pull/3198))
- Chore: Fix isort not running, upgrade to the latest black [@stumpylog](https://github.com/stumpylog) ([#3177](https://github.com/paperless-ngx/paperless-ngx/pull/3177))
- Fix: respect permissions on document view actions [@shamoon](https://github.com/shamoon) ([#3174](https://github.com/paperless-ngx/paperless-ngx/pull/3174))
- Increment API version for 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3191](https://github.com/paperless-ngx/paperless-ngx/pull/3191))
- Fix: dropdown Private items with empty set [@shamoon](https://github.com/shamoon) ([#3189](https://github.com/paperless-ngx/paperless-ngx/pull/3189))
- Fix: make the importer a little more robust against some errors [@stumpylog](https://github.com/stumpylog) ([#3188](https://github.com/paperless-ngx/paperless-ngx/pull/3188))
- Fix: Specify backend for auto-login [@shamoon](https://github.com/shamoon) ([#3163](https://github.com/paperless-ngx/paperless-ngx/pull/3163))
- Fix: StoragePath missing the owned or granted filter [@stumpylog](https://github.com/stumpylog) ([#3180](https://github.com/paperless-ngx/paperless-ngx/pull/3180))
- Fix: Handle delete mail action with no filters [@shamoon](https://github.com/shamoon) ([#3161](https://github.com/paperless-ngx/paperless-ngx/pull/3161))
</details>
## paperless-ngx 1.14.0
### Notable Changes
- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147))
### Features
- Feature: Stronger typing for file consumption [@stumpylog](https://github.com/stumpylog) ([#2744](https://github.com/paperless-ngx/paperless-ngx/pull/2744))
- Feature: double-click docs [@shamoon](https://github.com/shamoon) ([#2966](https://github.com/paperless-ngx/paperless-ngx/pull/2966))
- feature: Add support for zxing as barcode scanning lib [@margau](https://github.com/margau) ([#2907](https://github.com/paperless-ngx/paperless-ngx/pull/2907))
- Feature: Enable images to be released on Quay.io [@stumpylog](https://github.com/stumpylog) ([#2972](https://github.com/paperless-ngx/paperless-ngx/pull/2972))
- Feature: test mail account [@shamoon](https://github.com/shamoon) ([#2949](https://github.com/paperless-ngx/paperless-ngx/pull/2949))
- Feature: Capture celery and kombu logs to a file [@stumpylog](https://github.com/stumpylog) ([#2954](https://github.com/paperless-ngx/paperless-ngx/pull/2954))
- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939))
- Feature: Allow mail account to use access tokens [@stumpylog](https://github.com/stumpylog) ([#2930](https://github.com/paperless-ngx/paperless-ngx/pull/2930))
- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922))
- Feature: Improved statistics widget [@shamoon](https://github.com/shamoon) ([#2910](https://github.com/paperless-ngx/paperless-ngx/pull/2910))
- Enhancement: rename comments to notes and improve notes UI [@shamoon](https://github.com/shamoon) ([#2904](https://github.com/paperless-ngx/paperless-ngx/pull/2904))
- Allow psql client certificate authentication [@Ongy](https://github.com/Ongy) ([#2899](https://github.com/paperless-ngx/paperless-ngx/pull/2899))
- Enhancement: support filtering multiple correspondents, doctypes \& storage paths [@shamoon](https://github.com/shamoon) ([#2893](https://github.com/paperless-ngx/paperless-ngx/pull/2893))
- Feature: Change celery serializer to pickle [@stumpylog](https://github.com/stumpylog) ([#2861](https://github.com/paperless-ngx/paperless-ngx/pull/2861))
- Feature: Allow naming to include owner and original name [@stumpylog](https://github.com/stumpylog) ([#2873](https://github.com/paperless-ngx/paperless-ngx/pull/2873))
- Feature: Allows filtering email by the TO value(s) as well [@stumpylog](https://github.com/stumpylog) ([#2871](https://github.com/paperless-ngx/paperless-ngx/pull/2871))
- Feature: owner-aware unique model name constraint [@shamoon](https://github.com/shamoon) ([#2827](https://github.com/paperless-ngx/paperless-ngx/pull/2827))
- Feature/2396 better mail actions [@jonaswinkler](https://github.com/jonaswinkler) ([#2718](https://github.com/paperless-ngx/paperless-ngx/pull/2718))
- Feature: Reduce classifier memory usage somewhat during training [@stumpylog](https://github.com/stumpylog) ([#2733](https://github.com/paperless-ngx/paperless-ngx/pull/2733))
- Feature: Add PAPERLESS_OCR_SKIP_ARCHIVE_FILE config setting [@bdr99](https://github.com/bdr99) ([#2743](https://github.com/paperless-ngx/paperless-ngx/pull/2743))
- Feature: dynamic document counts in dropdowns [@shamoon](https://github.com/shamoon) ([#2704](https://github.com/paperless-ngx/paperless-ngx/pull/2704))
- Allow setting the ASN on document upload [@stumpylog](https://github.com/stumpylog) ([#2713](https://github.com/paperless-ngx/paperless-ngx/pull/2713))
- Feature: Log failed login attempts [@shamoon](https://github.com/shamoon) ([#2359](https://github.com/paperless-ngx/paperless-ngx/pull/2359))
- Feature: Rename documents when storage path format changes [@stumpylog](https://github.com/stumpylog) ([#2696](https://github.com/paperless-ngx/paperless-ngx/pull/2696))
- Feature: update error message colors \& show on document failures [@shamoon](https://github.com/shamoon) ([#2689](https://github.com/paperless-ngx/paperless-ngx/pull/2689))
- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147))
### Bug Fixes
- Fix: Allow setting additional Django settings for proxies [@stumpylog](https://github.com/stumpylog) ([#3135](https://github.com/paperless-ngx/paperless-ngx/pull/3135))
- Fix: Use exclude instead of difference for mariadb [@shamoon](https://github.com/shamoon) ([#2983](https://github.com/paperless-ngx/paperless-ngx/pull/2983))
- Fix: permissions display should not show users with inherited permissions \& unable to change owner [@shamoon](https://github.com/shamoon) ([#2818](https://github.com/paperless-ngx/paperless-ngx/pull/2818))
- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939))
- Fix: unable to edit correspondents (in ) [@shamoon](https://github.com/shamoon) ([#2938](https://github.com/paperless-ngx/paperless-ngx/pull/2938))
- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922))
- Fix: Chrome struggles with commas [@stumpylog](https://github.com/stumpylog) ([#2892](https://github.com/paperless-ngx/paperless-ngx/pull/2892))
- Fix formatting in Setup documentation page [@igrybkov](https://github.com/igrybkov) ([#2880](https://github.com/paperless-ngx/paperless-ngx/pull/2880))
- Fix: logout on change password via frontend [@shamoon](https://github.com/shamoon) ([#2863](https://github.com/paperless-ngx/paperless-ngx/pull/2863))
- Fix: give superuser full doc perms [@shamoon](https://github.com/shamoon) ([#2820](https://github.com/paperless-ngx/paperless-ngx/pull/2820))
- Fix: Append Gmail labels instead of replacing [@stumpylog](https://github.com/stumpylog) ([#2860](https://github.com/paperless-ngx/paperless-ngx/pull/2860))
- Fix: Ensure email date is made aware during action processing [@stumpylog](https://github.com/stumpylog) ([#2837](https://github.com/paperless-ngx/paperless-ngx/pull/2837))
- Fix: disable bulk edit dialog buttons during operation [@shamoon](https://github.com/shamoon) ([#2819](https://github.com/paperless-ngx/paperless-ngx/pull/2819))
- fix database locked error [@jonaswinkler](https://github.com/jonaswinkler) ([#2808](https://github.com/paperless-ngx/paperless-ngx/pull/2808))
- Fix: Disable suggestions for read-only docs [@shamoon](https://github.com/shamoon) ([#2813](https://github.com/paperless-ngx/paperless-ngx/pull/2813))
- Update processed mail migration [@shamoon](https://github.com/shamoon) ([#2804](https://github.com/paperless-ngx/paperless-ngx/pull/2804))
- Fix: Ensure scratch directory exists before using [@stumpylog](https://github.com/stumpylog) ([#2775](https://github.com/paperless-ngx/paperless-ngx/pull/2775))
- Don't submit owner via API on document upload [@jonaswinkler](https://github.com/jonaswinkler) ([#2777](https://github.com/paperless-ngx/paperless-ngx/pull/2777))
- Fix: only offer log files that exist [@shamoon](https://github.com/shamoon) ([#2739](https://github.com/paperless-ngx/paperless-ngx/pull/2739))
- Fix: permissions editing and initial view issues [@shamoon](https://github.com/shamoon) ([#2717](https://github.com/paperless-ngx/paperless-ngx/pull/2717))
- Fix: reset saved view ID on quickFilter [@shamoon](https://github.com/shamoon) ([#2703](https://github.com/paperless-ngx/paperless-ngx/pull/2703))
- Fix: bulk edit reset apply button state [@shamoon](https://github.com/shamoon) ([#2701](https://github.com/paperless-ngx/paperless-ngx/pull/2701))
- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692))
### Documentation
- Whitespace changes, making sure the example is correcly aligned [@denilsonsa](https://github.com/denilsonsa) ([#3089](https://github.com/paperless-ngx/paperless-ngx/pull/3089))
- Docs: Include additional information about barcodes [@stumpylog](https://github.com/stumpylog) ([#2889](https://github.com/paperless-ngx/paperless-ngx/pull/2889))
- Fix formatting in Setup documentation page [@igrybkov](https://github.com/igrybkov) ([#2880](https://github.com/paperless-ngx/paperless-ngx/pull/2880))
- [Documentation] Update docker-compose steps to support podman [@white-gecko](https://github.com/white-gecko) ([#2855](https://github.com/paperless-ngx/paperless-ngx/pull/2855))
- docs: better language code help [@tooomm](https://github.com/tooomm) ([#2830](https://github.com/paperless-ngx/paperless-ngx/pull/2830))
- Feature: Add an option to disable matching [@bdr99](https://github.com/bdr99) ([#2727](https://github.com/paperless-ngx/paperless-ngx/pull/2727))
- Docs: Remove outdated PAPERLESS_WORKER_RETRY [@shamoon](https://github.com/shamoon) ([#2694](https://github.com/paperless-ngx/paperless-ngx/pull/2694))
- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692))
### Maintenance
- Chore: Configure ruff as the primary linter for Python [@stumpylog](https://github.com/stumpylog) ([#2988](https://github.com/paperless-ngx/paperless-ngx/pull/2988))
- Feature: Enable images to be released on Quay.io [@stumpylog](https://github.com/stumpylog) ([#2972](https://github.com/paperless-ngx/paperless-ngx/pull/2972))
- Chore: Updates locked pipenv to latest version [@stumpylog](https://github.com/stumpylog) ([#2943](https://github.com/paperless-ngx/paperless-ngx/pull/2943))
- Chore: Properly collapse section in releases [@tooomm](https://github.com/tooomm) ([#2838](https://github.com/paperless-ngx/paperless-ngx/pull/2838))
- Chore: Don't include changelog PR for different releases [@tooomm](https://github.com/tooomm) ([#2832](https://github.com/paperless-ngx/paperless-ngx/pull/2832))
- Chore: Speed up frontend CI testing [@stumpylog](https://github.com/stumpylog) ([#2796](https://github.com/paperless-ngx/paperless-ngx/pull/2796))
- Bump leonsteinhaeuser/project-beta-automations from 2.0.1 to 2.1.0 [@dependabot](https://github.com/dependabot) ([#2789](https://github.com/paperless-ngx/paperless-ngx/pull/2789))
### Dependencies
<details>
<summary>15 changes</summary>
- Bump ng2-pdf-viewer from 9.1.4 to 9.1.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3109](https://github.com/paperless-ngx/paperless-ngx/pull/3109))
- Grouped bump angular packages from 15.2.6 to 15.2.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#3108](https://github.com/paperless-ngx/paperless-ngx/pull/3108))
- Bump typescript from 4.8.4 to 4.9.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3071](https://github.com/paperless-ngx/paperless-ngx/pull/3071))
- Bulk Bump npm packages 04.23 [@dependabot](https://github.com/dependabot) ([#3068](https://github.com/paperless-ngx/paperless-ngx/pull/3068))
- Bump wait-on from 6.0.1 to 7.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2990](https://github.com/paperless-ngx/paperless-ngx/pull/2990))
- Bulk bump angular packages to 15.2.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#2991](https://github.com/paperless-ngx/paperless-ngx/pull/2991))
- Bump [@<!---->types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot](https://github.com/<!---->types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot) ([#2993](https://github.com/paperless-ngx/paperless-ngx/pull/2993))
- Bump [@<!---->ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot](https://github.com/<!---->ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot) ([#2992](https://github.com/paperless-ngx/paperless-ngx/pull/2992))
- Bump [@<!---->typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot) ([#2989](https://github.com/paperless-ngx/paperless-ngx/pull/2989))
- Chore: Update cryptography to latest version [@stumpylog](https://github.com/stumpylog) ([#2891](https://github.com/paperless-ngx/paperless-ngx/pull/2891))
- Chore: Update to qpdf 11.3.0 in Docker image [@stumpylog](https://github.com/stumpylog) ([#2862](https://github.com/paperless-ngx/paperless-ngx/pull/2862))
- Bump leonsteinhaeuser/project-beta-automations from 2.0.1 to 2.1.0 [@dependabot](https://github.com/dependabot) ([#2789](https://github.com/paperless-ngx/paperless-ngx/pull/2789))
- Bump zone.js from 0.11.8 to 0.12.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#2793](https://github.com/paperless-ngx/paperless-ngx/pull/2793))
- Bump [@<!---->typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot) ([#2792](https://github.com/paperless-ngx/paperless-ngx/pull/2792))
- Bulk Bump angular packages to 15.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2788](https://github.com/paperless-ngx/paperless-ngx/pull/2788))
</details>
### All App Changes
<details>
<summary>72 changes</summary>
- Feature: Catalan translation [@shamoon](https://github.com/shamoon) ([#3146](https://github.com/paperless-ngx/paperless-ngx/pull/3146))
- Fix: Allow setting additional Django settings for proxies [@stumpylog](https://github.com/stumpylog) ([#3135](https://github.com/paperless-ngx/paperless-ngx/pull/3135))
- Fix: Increase mail account password field length [@stumpylog](https://github.com/stumpylog) ([#3134](https://github.com/paperless-ngx/paperless-ngx/pull/3134))
- Fix: respect permissions for matching suggestions [@shamoon](https://github.com/shamoon) ([#3103](https://github.com/paperless-ngx/paperless-ngx/pull/3103))
- Bump ng2-pdf-viewer from 9.1.4 to 9.1.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3109](https://github.com/paperless-ngx/paperless-ngx/pull/3109))
- Grouped bump angular packages from 15.2.6 to 15.2.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#3108](https://github.com/paperless-ngx/paperless-ngx/pull/3108))
- Fix: update PaperlessTask on hard failures [@shamoon](https://github.com/shamoon) ([#3062](https://github.com/paperless-ngx/paperless-ngx/pull/3062))
- Bump typescript from 4.8.4 to 4.9.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3071](https://github.com/paperless-ngx/paperless-ngx/pull/3071))
- Bulk Bump npm packages 04.23 [@dependabot](https://github.com/dependabot) ([#3068](https://github.com/paperless-ngx/paperless-ngx/pull/3068))
- Fix: Hide UI tour steps if user doesnt have permissions [@shamoon](https://github.com/shamoon) ([#3060](https://github.com/paperless-ngx/paperless-ngx/pull/3060))
- Fix: Hide Permissions tab if user cannot view users [@shamoon](https://github.com/shamoon) ([#3061](https://github.com/paperless-ngx/paperless-ngx/pull/3061))
- v1.14.0 delete document fixes [@shamoon](https://github.com/shamoon) ([#3020](https://github.com/paperless-ngx/paperless-ngx/pull/3020))
- Bump wait-on from 6.0.1 to 7.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2990](https://github.com/paperless-ngx/paperless-ngx/pull/2990))
- Fix: inline plaintext docs to enforce styling [@shamoon](https://github.com/shamoon) ([#3013](https://github.com/paperless-ngx/paperless-ngx/pull/3013))
- Chore: Configure ruff as the primary linter for Python [@stumpylog](https://github.com/stumpylog) ([#2988](https://github.com/paperless-ngx/paperless-ngx/pull/2988))
- Bulk bump angular packages to 15.2.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#2991](https://github.com/paperless-ngx/paperless-ngx/pull/2991))
- Bump [@<!---->types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot](https://github.com/<!---->types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot) ([#2993](https://github.com/paperless-ngx/paperless-ngx/pull/2993))
- Bump [@<!---->ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot](https://github.com/<!---->ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot) ([#2992](https://github.com/paperless-ngx/paperless-ngx/pull/2992))
- Bump [@<!---->typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot) ([#2989](https://github.com/paperless-ngx/paperless-ngx/pull/2989))
- Feature: Stronger typing for file consumption [@stumpylog](https://github.com/stumpylog) ([#2744](https://github.com/paperless-ngx/paperless-ngx/pull/2744))
- Fix: Use exclude instead of difference for mariadb [@shamoon](https://github.com/shamoon) ([#2983](https://github.com/paperless-ngx/paperless-ngx/pull/2983))
- Fix: permissions display should not show users with inherited permissions \& unable to change owner [@shamoon](https://github.com/shamoon) ([#2818](https://github.com/paperless-ngx/paperless-ngx/pull/2818))
- Feature: double-click docs [@shamoon](https://github.com/shamoon) ([#2966](https://github.com/paperless-ngx/paperless-ngx/pull/2966))
- feature: Add support for zxing as barcode scanning lib [@margau](https://github.com/margau) ([#2907](https://github.com/paperless-ngx/paperless-ngx/pull/2907))
- Feature: test mail account [@shamoon](https://github.com/shamoon) ([#2949](https://github.com/paperless-ngx/paperless-ngx/pull/2949))
- Feature: Capture celery and kombu logs to a file [@stumpylog](https://github.com/stumpylog) ([#2954](https://github.com/paperless-ngx/paperless-ngx/pull/2954))
- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939))
- Feature: Allow mail account to use access tokens [@stumpylog](https://github.com/stumpylog) ([#2930](https://github.com/paperless-ngx/paperless-ngx/pull/2930))
- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922))
- Feature: Improved statistics widget [@shamoon](https://github.com/shamoon) ([#2910](https://github.com/paperless-ngx/paperless-ngx/pull/2910))
- Enhancement: rename comments to notes and improve notes UI [@shamoon](https://github.com/shamoon) ([#2904](https://github.com/paperless-ngx/paperless-ngx/pull/2904))
- Allow psql client certificate authentication [@Ongy](https://github.com/Ongy) ([#2899](https://github.com/paperless-ngx/paperless-ngx/pull/2899))
- Enhancement: support filtering multiple correspondents, doctypes \& storage paths [@shamoon](https://github.com/shamoon) ([#2893](https://github.com/paperless-ngx/paperless-ngx/pull/2893))
- Fix: frontend handle private tags, doctypes, correspondents [@shamoon](https://github.com/shamoon) ([#2839](https://github.com/paperless-ngx/paperless-ngx/pull/2839))
- Fix: Chrome struggles with commas [@stumpylog](https://github.com/stumpylog) ([#2892](https://github.com/paperless-ngx/paperless-ngx/pull/2892))
- Feature: Change celery serializer to pickle [@stumpylog](https://github.com/stumpylog) ([#2861](https://github.com/paperless-ngx/paperless-ngx/pull/2861))
- Feature: Allow naming to include owner and original name [@stumpylog](https://github.com/stumpylog) ([#2873](https://github.com/paperless-ngx/paperless-ngx/pull/2873))
- Feature: Allows filtering email by the TO value(s) as well [@stumpylog](https://github.com/stumpylog) ([#2871](https://github.com/paperless-ngx/paperless-ngx/pull/2871))
- Fix: logout on change password via frontend [@shamoon](https://github.com/shamoon) ([#2863](https://github.com/paperless-ngx/paperless-ngx/pull/2863))
- Fix: give superuser full doc perms [@shamoon](https://github.com/shamoon) ([#2820](https://github.com/paperless-ngx/paperless-ngx/pull/2820))
- Fix: Append Gmail labels instead of replacing [@stumpylog](https://github.com/stumpylog) ([#2860](https://github.com/paperless-ngx/paperless-ngx/pull/2860))
- Feature: owner-aware unique model name constraint [@shamoon](https://github.com/shamoon) ([#2827](https://github.com/paperless-ngx/paperless-ngx/pull/2827))
- Chore: Create list parsing utility for settings [@stumpylog](https://github.com/stumpylog) ([#2816](https://github.com/paperless-ngx/paperless-ngx/pull/2816))
- Fix: Ensure email date is made aware during action processing [@stumpylog](https://github.com/stumpylog) ([#2837](https://github.com/paperless-ngx/paperless-ngx/pull/2837))
- Chore: Convert more code to pathlib [@stumpylog](https://github.com/stumpylog) ([#2817](https://github.com/paperless-ngx/paperless-ngx/pull/2817))
- Fix: disable bulk edit dialog buttons during operation [@shamoon](https://github.com/shamoon) ([#2819](https://github.com/paperless-ngx/paperless-ngx/pull/2819))
- fix database locked error [@jonaswinkler](https://github.com/jonaswinkler) ([#2808](https://github.com/paperless-ngx/paperless-ngx/pull/2808))
- Fix: Disable suggestions for read-only docs [@shamoon](https://github.com/shamoon) ([#2813](https://github.com/paperless-ngx/paperless-ngx/pull/2813))
- update django.po messages [@jonaswinkler](https://github.com/jonaswinkler) ([#2806](https://github.com/paperless-ngx/paperless-ngx/pull/2806))
- Update processed mail migration [@shamoon](https://github.com/shamoon) ([#2804](https://github.com/paperless-ngx/paperless-ngx/pull/2804))
- Feature/2396 better mail actions [@jonaswinkler](https://github.com/jonaswinkler) ([#2718](https://github.com/paperless-ngx/paperless-ngx/pull/2718))
- Bump zone.js from 0.11.8 to 0.12.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#2793](https://github.com/paperless-ngx/paperless-ngx/pull/2793))
- Bump [@<!---->typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot](https://github.com/<!---->typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot) ([#2792](https://github.com/paperless-ngx/paperless-ngx/pull/2792))
- Bulk Bump angular packages to 15.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2788](https://github.com/paperless-ngx/paperless-ngx/pull/2788))
- Fix: Ensure scratch directory exists before using [@stumpylog](https://github.com/stumpylog) ([#2775](https://github.com/paperless-ngx/paperless-ngx/pull/2775))
- Don't submit owner via API on document upload [@jonaswinkler](https://github.com/jonaswinkler) ([#2777](https://github.com/paperless-ngx/paperless-ngx/pull/2777))
- Feature: Reduce classifier memory usage somewhat during training [@stumpylog](https://github.com/stumpylog) ([#2733](https://github.com/paperless-ngx/paperless-ngx/pull/2733))
- Chore: Setup for mypy typing checks [@stumpylog](https://github.com/stumpylog) ([#2742](https://github.com/paperless-ngx/paperless-ngx/pull/2742))
- Feature: Add PAPERLESS_OCR_SKIP_ARCHIVE_FILE config setting [@bdr99](https://github.com/bdr99) ([#2743](https://github.com/paperless-ngx/paperless-ngx/pull/2743))
- Fix: only offer log files that exist [@shamoon](https://github.com/shamoon) ([#2739](https://github.com/paperless-ngx/paperless-ngx/pull/2739))
- Feature: dynamic document counts in dropdowns [@shamoon](https://github.com/shamoon) ([#2704](https://github.com/paperless-ngx/paperless-ngx/pull/2704))
- Fix: permissions editing and initial view issues [@shamoon](https://github.com/shamoon) ([#2717](https://github.com/paperless-ngx/paperless-ngx/pull/2717))
- Fix: reset saved view ID on quickFilter [@shamoon](https://github.com/shamoon) ([#2703](https://github.com/paperless-ngx/paperless-ngx/pull/2703))
- Feature: Add an option to disable matching [@bdr99](https://github.com/bdr99) ([#2727](https://github.com/paperless-ngx/paperless-ngx/pull/2727))
- Chore: Improve clarity of some test asserting [@stumpylog](https://github.com/stumpylog) ([#2714](https://github.com/paperless-ngx/paperless-ngx/pull/2714))
- Allow setting the ASN on document upload [@stumpylog](https://github.com/stumpylog) ([#2713](https://github.com/paperless-ngx/paperless-ngx/pull/2713))
- Fix: bulk edit reset apply button state [@shamoon](https://github.com/shamoon) ([#2701](https://github.com/paperless-ngx/paperless-ngx/pull/2701))
- Feature: Log failed login attempts [@shamoon](https://github.com/shamoon) ([#2359](https://github.com/paperless-ngx/paperless-ngx/pull/2359))
- Feature: Rename documents when storage path format changes [@stumpylog](https://github.com/stumpylog) ([#2696](https://github.com/paperless-ngx/paperless-ngx/pull/2696))
- Feature: update error message colors \& show on document failures [@shamoon](https://github.com/shamoon) ([#2689](https://github.com/paperless-ngx/paperless-ngx/pull/2689))
- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147))
- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692))
</details>
## paperless-ngx 1.13.0
### Features
- Feature: allow disable warn on close saved view with changes [@shamoon](https://github.com/shamoon) ([#2681](https://github.com/paperless-ngx/paperless-ngx/pull/2681))
- Feature: Add option to enable response compression [@stumpylog](https://github.com/stumpylog) ([#2621](https://github.com/paperless-ngx/paperless-ngx/pull/2621))
- Feature: split documents on ASN barcode [@muued](https://github.com/muued) ([#2554](https://github.com/paperless-ngx/paperless-ngx/pull/2554))
### Bug Fixes
- Fix: Ignore path filtering didn't handle sub directories [@stumpylog](https://github.com/stumpylog) ([#2674](https://github.com/paperless-ngx/paperless-ngx/pull/2674))
- Bugfix: Generation of secret key hangs during install script [@stumpylog](https://github.com/stumpylog) ([#2657](https://github.com/paperless-ngx/paperless-ngx/pull/2657))
- Fix: Remove files produced by barcode splitting when completed [@stumpylog](https://github.com/stumpylog) ([#2648](https://github.com/paperless-ngx/paperless-ngx/pull/2648))
- Fix: add missing storage path placeholders [@shamoon](https://github.com/shamoon) ([#2651](https://github.com/paperless-ngx/paperless-ngx/pull/2651))
- Fix long dropdown contents break document detail column view [@shamoon](https://github.com/shamoon) ([#2638](https://github.com/paperless-ngx/paperless-ngx/pull/2638))
- Fix: tags dropdown should stay closed when removing [@shamoon](https://github.com/shamoon) ([#2625](https://github.com/paperless-ngx/paperless-ngx/pull/2625))
- Bugfix: Configure scheduled tasks to expire after some time [@stumpylog](https://github.com/stumpylog) ([#2614](https://github.com/paperless-ngx/paperless-ngx/pull/2614))
- Bugfix: Limit management list pagination maxSize to 5 [@Kaaybi](https://github.com/Kaaybi) ([#2618](https://github.com/paperless-ngx/paperless-ngx/pull/2618))
- Fix: Don't crash on bad ASNs during indexing [@stumpylog](https://github.com/stumpylog) ([#2586](https://github.com/paperless-ngx/paperless-ngx/pull/2586))
- Fix: Prevent mktime OverflowError except in even more rare caes [@stumpylog](https://github.com/stumpylog) ([#2574](https://github.com/paperless-ngx/paperless-ngx/pull/2574))
- Bugfix: Whoosh relative date queries weren't handling timezones [@stumpylog](https://github.com/stumpylog) ([#2566](https://github.com/paperless-ngx/paperless-ngx/pull/2566))
- Fix importing files with non-ascii names [@Kexogg](https://github.com/Kexogg) ([#2555](https://github.com/paperless-ngx/paperless-ngx/pull/2555))
### Documentation
- Chore: update recommended Gotenberg to 7.8, docs note possible incompatibility [@shamoon](https://github.com/shamoon) ([#2608](https://github.com/paperless-ngx/paperless-ngx/pull/2608))
- [Documentation] Add v1.12.2 changelog [@github-actions](https://github.com/github-actions) ([#2553](https://github.com/paperless-ngx/paperless-ngx/pull/2553))
### Maintenance
- Chore: Faster Docker image cleanup [@stumpylog](https://github.com/stumpylog) ([#2687](https://github.com/paperless-ngx/paperless-ngx/pull/2687))
- Chore: Remove duplicated folder [@stumpylog](https://github.com/stumpylog) ([#2561](https://github.com/paperless-ngx/paperless-ngx/pull/2561))
- Chore: Switch test coverage to Codecov [@stumpylog](https://github.com/stumpylog) ([#2582](https://github.com/paperless-ngx/paperless-ngx/pull/2582))
- Bump docker/build-push-action from 3 to 4 [@dependabot](https://github.com/dependabot) ([#2576](https://github.com/paperless-ngx/paperless-ngx/pull/2576))
- Chore: Run tests which require convert in the CI [@stumpylog](https://github.com/stumpylog) ([#2570](https://github.com/paperless-ngx/paperless-ngx/pull/2570))
- Feature: split documents on ASN barcode [@muued](https://github.com/muued) ([#2554](https://github.com/paperless-ngx/paperless-ngx/pull/2554))
- Bugfix: Whoosh relative date queries weren't handling timezones [@stumpylog](https://github.com/stumpylog) ([#2566](https://github.com/paperless-ngx/paperless-ngx/pull/2566))
- Fix importing files with non-ascii names [@Kexogg](https://github.com/Kexogg) ([#2555](https://github.com/paperless-ngx/paperless-ngx/pull/2555))
## paperless-ngx 1.12.2
_Note: Version 1.12.x introduced searching of comments which will work for comments added after the upgrade but a reindex of the search index is required in order to be able to search

View File

@@ -17,6 +17,8 @@ run paperless, these settings have to be defined in different places.
## Required services
### Redis Broker
`PAPERLESS_REDIS=<url>`
: This is required for processing scheduled tasks such as email
@@ -33,6 +35,8 @@ matcher.
Defaults to `redis://localhost:6379`.
### Database
`PAPERLESS_DBENGINE=<engine_name>`
: Optional, gives the ability to choose Postgres or MariaDB for
@@ -79,12 +83,58 @@ changed here.
`PAPERLESS_DBSSLMODE=<mode>`
: SSL mode to use when connecting to PostgreSQL.
: SSL mode to use when connecting to PostgreSQL or MariaDB.
See [the official documentation about
sslmode](https://www.postgresql.org/docs/current/libpq-ssl.html).
sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html).
Default is `prefer`.
See [the official documentation about
sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-mode).
*Note*: SSL mode values differ between PostgreSQL and MariaDB.
Default is `prefer` for PostgreSQL and `PREFERRED` for MariaDB.
`PAPERLESS_DBSSLROOTCERT=<ca-path>`
: SSL root certificate path
See [the official documentation about
sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html).
Changes path of `root.crt`.
See [the official documentation about
sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-ca).
Defaults to unset, using the documented path in the home directory.
`PAPERLESS_DBSSLCERT=<client-cert-path>`
: SSL client certificate path
See [the official documentation about
sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html).
See [the official documentation about
sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-cert).
Changes path of `postgresql.crt`.
Defaults to unset, using the documented path in the home directory.
`PAPERLESS_DBSSLKEY=<client-cert-key>`
: SSL client key path
See [the official documentation about
sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html).
See [the official documentation about
sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-key).
Changes path of `postgresql.key`.
Defaults to unset, using the documented path in the home directory.
`PAPERLESS_DB_TIMEOUT=<float>`
@@ -94,6 +144,47 @@ changing to postgresql if you need to increase this.
Defaults to unset, keeping the Django defaults.
## Optional Services
### Tika {#tika}
Paperless can make use of [Tika](https://tika.apache.org/) and
[Gotenberg](https://gotenberg.dev/) for parsing and converting
"Office" documents (such as ".doc", ".xlsx" and ".odt").
Tika and Gotenberg are also needed to allow parsing of E-Mails (.eml).
If you wish to use this, you must provide a Tika server and a Gotenberg server,
configure their endpoints, and enable the feature.
`PAPERLESS_TIKA_ENABLED=<bool>`
: Enable (or disable) the Tika parser.
Defaults to false.
`PAPERLESS_TIKA_ENDPOINT=<url>`
: Set the endpoint URL were Paperless can reach your Tika server.
Defaults to "<http://localhost:9998>".
`PAPERLESS_TIKA_GOTENBERG_ENDPOINT=<url>`
: Set the endpoint URL were Paperless can reach your Gotenberg server.
Defaults to "<http://localhost:3000>".
If you run paperless on docker, you can add those services to the
docker-compose file (see the provided
[`docker-compose.sqlite-tika.yml`](https://github.com/paperless-ngx/paperless-ngx/blob/main/docker/compose/docker-compose.sqlite-tika.yml)
file for reference).
Add all three configuration parameters to your configuration. If using
Docker, this may be the `environment` key of the webserver or a
`docker-compose.env` file. Bare metal installations may have a `.conf` file
containing the configuration parameters. Be sure to use the correct format
and watch out for indentation if editing the YAML file.
## Paths and folders
`PAPERLESS_CONSUMPTION_DIR=<path>`
@@ -227,8 +318,7 @@ not include a trailing slash. E.g. <https://paperless.domain.com>
: A list of trusted origins for unsafe requests (e.g. POST). As of
Django 4.0 this is required to access the Django admin via the web.
See
<https://docs.djangoproject.com/en/4.0/ref/settings/#csrf-trusted-origins>
See the [Django project documentation on the settings](https://docs.djangoproject.com/en/4.1/ref/settings/#csrf-trusted-origins)
Can also be set using PAPERLESS_URL (see above).
@@ -239,8 +329,8 @@ See
: If you're planning on putting Paperless on the open internet, then
you really should set this value to the domain name you're using.
Failing to do so leaves you open to HTTP host header attacks:
<https://docs.djangoproject.com/en/3.1/topics/security/#host-header-validation>
Failing to do so leaves you open to HTTP host header attacks.
You can read more about this in [the Django project's documentation](https://docs.djangoproject.com/en/4.1/topics/security/#host-header-validation)
Just remember that this is a comma-separated list, so
"example.com" is fine, as is "example.com,www.example.com", but
@@ -248,8 +338,7 @@ Failing to do so leaves you open to HTTP host header attacks:
Can also be set using PAPERLESS_URL (see above).
If manually set, please remember to include "localhost". Otherwise
docker healthcheck will fail.
"localhost" is always allowed for docker healthcheck
Defaults to "\*", which is all hosts.
@@ -262,6 +351,14 @@ do CORS calls. Set this to your public domain name.
Defaults to "<http://localhost:8000>".
`PAPERLESS_TRUSTED_PROXIES=<comma-separated-list>`
: This may be needed to prevent IP address spoofing if you are using e.g.
fail2ban with log entries for failed authorization attempts. Value should be
IP address(es).
Defaults to empty string.
`PAPERLESS_FORCE_SCRIPT_NAME=<path>`
: To host paperless under a subpath url like example.com/paperless you
@@ -348,16 +445,16 @@ applications.
If you're exposing paperless to the internet directly, do not use
this.
Also see the warning [in the official documentation](https://docs.djangoproject.com/en/3.1/howto/auth-remote-user/#configuration).
Also see the warning [in the official documentation](https://docs.djangoproject.com/en/4.1/howto/auth-remote-user/#configuration).
Defaults to "false" which disables this feature.
`PAPERLESS_HTTP_REMOTE_USER_HEADER_NAME=<str>`
: If "PAPERLESS*ENABLE_HTTP_REMOTE_USER" is enabled, this
: If "PAPERLESS_ENABLE_HTTP_REMOTE_USER" is enabled, this
property allows to customize the name of the HTTP header from which
the authenticated username is extracted. Values are in terms of
[HttpRequest.META](https://docs.djangoproject.com/en/3.1/ref/request-response/#django.http.HttpRequest.META).
[HttpRequest.META](https://docs.djangoproject.com/en/4.1/ref/request-response/#django.http.HttpRequest.META).
Thus, the configured value must start with `HTTP*`
followed by the normalized actual header name.
@@ -371,6 +468,33 @@ redirect the user back to the SSO application's logout page.
Defaults to None, which disables this feature.
`PAPERLESS_USE_X_FORWARD_HOST=<bool>`
: Configures the Django setting [USE_X_FORWARDED_HOST](https://docs.djangoproject.com/en/4.2/ref/settings/#use-x-forwarded-host)
which may be needed for hosting behind a proxy.
Defaults to False
`PAPERLESS_USE_X_FORWARD_PORT=<bool>`
: Configures the Django setting [USE_X_FORWARDED_PORT](https://docs.djangoproject.com/en/4.2/ref/settings/#use-x-forwarded-port)
which may be needed for hosting behind a proxy.
Defaults to False
`PAPERLESS_PROXY_SSL_HEADER=<json-list>`
: Configures the Django setting [SECURE_PROXY_SSL_HEADER](https://docs.djangoproject.com/en/4.2/ref/settings/#secure-proxy-ssl-header)
which may be needed for hosting behind a proxy. The two values in the list will form the tuple of
HTTP header/value expected by Django, eg `'["HTTP_X_FORWARDED_PROTO", "https"]'`.
Defaults to None
!!! warning
Settings this value has security implications. Read the Django documentation
and be sure you understand its usage before setting it.
## OCR settings {#ocr}
Paperless uses [OCRmyPDF](https://ocrmypdf.readthedocs.io/en/latest/)
@@ -383,21 +507,20 @@ needs.
: Customize the language that paperless will attempt to use when
parsing documents.
It should be a 3-letter language code consistent with ISO 639:
https://www.loc.gov/standards/iso639-2/php/code_list.php
It should be a 3-letter code, see the list of [languages Tesseract supports](https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html).
Set this to the language most of your documents are written in.
This can be a combination of multiple languages such as `deu+eng`,
in which case tesseract will use whatever language matches best.
Keep in mind that tesseract uses much more cpu time with multiple
in which case Tesseract will use whatever language matches best.
Keep in mind that Tesseract uses much more CPU time with multiple
languages enabled.
Defaults to "eng".
!!! note
If your language contains a '-' such as chi-sim, you must use chi_sim
If your language contains a '-' such as chi-sim, you must use `chi_sim`.
`PAPERLESS_OCR_MODE=<mode>`
@@ -407,12 +530,6 @@ modes are available:
- `skip`: Paperless skips all pages and will perform ocr only on
pages where no text is present. This is the safest option.
- `skip_noarchive`: In addition to skip, paperless won't create
an archived version of your documents when it finds any text in
them. This is useful if you don't want to have two
almost-identical versions of your digital documents in the media
folder. This is the fastest option.
- `redo`: Paperless will OCR all pages of your documents and
attempt to replace any existing text layers with new text. This
will be useful for documents from scanners that already
@@ -435,6 +552,19 @@ modes are available:
Read more about this in the [OCRmyPDF
documentation](https://ocrmypdf.readthedocs.io/en/latest/advanced.html#when-ocr-is-skipped).
`PAPERLESS_OCR_SKIP_ARCHIVE_FILE=<mode>`
: Specify when you would like paperless to skip creating an archived
version of your documents. This is useful if you don't want to have two
almost-identical versions of your documents in the media folder.
- `never`: Never skip creating an archived version.
- `with_text`: Skip creating an archived version for documents
that already have embedded text.
- `always`: Always skip creating an archived version.
The default is `never`.
`PAPERLESS_OCR_CLEAN=<mode>`
: Tells paperless to use `unpaper` to clean any input document before
@@ -577,76 +707,6 @@ they use underscores instead of dashes.
{"deskew": true, "optimize": 3, "unpaper_args": "--pre-rotate 90"}
```
## Tika settings {#tika}
Paperless can make use of [Tika](https://tika.apache.org/) and
[Gotenberg](https://gotenberg.dev/) for parsing and converting
"Office" documents (such as ".doc", ".xlsx" and ".odt").
Tika and Gotenberg are also needed to allow parsing of E-Mails (.eml).
If you wish to use this, you must provide a Tika server and a Gotenberg server,
configure their endpoints, and enable the feature.
`PAPERLESS_TIKA_ENABLED=<bool>`
: Enable (or disable) the Tika parser.
Defaults to false.
`PAPERLESS_TIKA_ENDPOINT=<url>`
: Set the endpoint URL were Paperless can reach your Tika server.
Defaults to "<http://localhost:9998>".
`PAPERLESS_TIKA_GOTENBERG_ENDPOINT=<url>`
: Set the endpoint URL were Paperless can reach your Gotenberg server.
Defaults to "<http://localhost:3000>".
If you run paperless on docker, you can add those services to the
docker-compose file (see the provided `docker-compose.sqlite-tika.yml`
file for reference). The changes requires are as follows:
```yaml
services:
# ...
webserver:
# ...
environment:
# ...
PAPERLESS_TIKA_ENABLED: 1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
# ...
gotenberg:
image: gotenberg/gotenberg:7.8
restart: unless-stopped
# The gotenberg chromium route is used to convert .eml files. We do not
# want to allow external content like tracking pixels or even javascript.
command:
- 'gotenberg'
- '--chromium-disable-javascript=true'
- '--chromium-allow-list=file:///tmp/.*'
tika:
image: ghcr.io/paperless-ngx/tika:latest
restart: unless-stopped
```
Add the configuration variables to the environment of the webserver
(alternatively put the configuration in the `docker-compose.env` file)
and add the additional services below the webserver service. Watch out
for indentation.
Make sure to use the correct format `PAPERLESS_TIKA_ENABLED = 1` so python_dotenv can parse the statement correctly.
## Software tweaks {#software_tweaks}
`PAPERLESS_TASK_WORKERS=<num>`
@@ -698,17 +758,10 @@ paperless will process in parallel on a single document.
on large documents within the default 1800 seconds. So extending
this timeout may prove to be useful on weak hardware setups.
`PAPERLESS_WORKER_RETRY=<num>`
: If PAPERLESS_WORKER_TIMEOUT has been configured, the retry time for
a task can also be configured. By default, this value will be set to
10s more than the worker timeout. This value should never be set
less than the worker timeout.
`PAPERLESS_TIME_ZONE=<timezone>`
: Set the time zone here. See
<https://docs.djangoproject.com/en/3.1/ref/settings/#std:setting-TIME_ZONE>
: Set the time zone here. See more details on
why and how to set it [in the Django project documentation](https://docs.djangoproject.com/en/4.1/ref/settings/#std:setting-TIME_ZONE)
for details on how to set it.
Defaults to UTC.
@@ -770,46 +823,33 @@ should be a valid crontab(5) expression describing when to run.
to enable compression in your proxy configuration rather than
the webserver
## Polling {#polling}
`PAPERLESS_CONVERT_MEMORY_LIMIT=<num>`
`PAPERLESS_CONSUMER_POLLING=<num>`
: On smaller systems, or even in the case of Very Large Documents, the
consumer may explode, complaining about how it's "unable to extend
pixel cache". In such cases, try setting this to a reasonably low
value, like 32. The default is to use whatever is necessary to do
everything without writing to disk, and units are in megabytes.
: If paperless won't find documents added to your consume folder, it
might not be able to automatically detect filesystem changes. In
that case, specify a polling interval in seconds here, which will
then cause paperless to periodically check your consumption
directory for changes. This will also disable listening for file
system changes with `inotify`.
For more information on how to use this value, you should search the
web for "MAGICK_MEMORY_LIMIT".
Defaults to 0, which disables polling and uses filesystem
notifications.
Defaults to 0, which disables the limit.
`PAPERLESS_CONSUMER_POLLING_RETRY_COUNT=<num>`
`PAPERLESS_CONVERT_TMPDIR=<path>`
: If consumer polling is enabled, sets the number of times paperless
will check for a file to remain unmodified.
: Similar to the memory limit, if you've got a small system and your
OS mounts /tmp as tmpfs, you should set this to a path that's on a
physical disk, like /home/your_user/tmp or something. ImageMagick
will use this as scratch space when crunching through very large
documents.
Defaults to 5.
For more information on how to use this value, you should search the
web for "MAGICK_TMPDIR".
`PAPERLESS_CONSUMER_POLLING_DELAY=<num>`
Default is none, which disables the temporary directory.
: If consumer polling is enabled, sets the delay in seconds between
each check (above) paperless will do while waiting for a file to
remain unmodified.
Defaults to 5.
## iNotify {#inotify}
`PAPERLESS_CONSUMER_INOTIFY_DELAY=<num>`
: Sets the time in seconds the consumer will wait for additional
events from inotify before the consumer will consider a file ready
and begin consumption. Certain scanners or network setups may
generate multiple events for a single file, leading to multiple
consumers working on the same file. Configure this to prevent that.
Defaults to 0.5 seconds.
## Document Consumption {#consume_config}
`PAPERLESS_CONSUMER_DELETE_DUPLICATES=<bool>`
@@ -840,96 +880,51 @@ don't exist yet.
Defaults to false.
`PAPERLESS_CONSUMER_ENABLE_BARCODES=<bool>`
`PAPERLESS_CONSUMER_IGNORE_PATTERNS=<json>`
: Enables the scanning and page separation based on detected barcodes.
This allows for scanning and adding multiple documents per uploaded
file, which are separated by one or multiple barcode pages.
: By default, paperless ignores certain files and folders in the
consumption directory, such as system files created by the Mac OS
or hidden folders some tools use to store data.
For ease of use, it is suggested to use a standardized separation
page, e.g. [here](https://www.alliancegroup.co.uk/patch-codes.htm).
This can be adjusted by configuring a custom json array with
patterns to exclude.
If no barcodes are detected in the uploaded file, no page separation
will happen.
For example, `.DS_STORE/*` will ignore any files found in a folder
named `.DS_STORE`, including `.DS_STORE/bar.pdf` and `foo/.DS_STORE/bar.pdf`
The original document will be removed and the separated pages will
be saved as pdf.
A pattern like `._*` will ignore anything starting with `._`, including:
`._foo.pdf` and `._bar/foo.pdf`
Defaults to false.
Defaults to
`[".DS_STORE/*", "._*", ".stfolder/*", ".stversions/*", ".localized/*", "desktop.ini", "@eaDir/*"]`.
`PAPERLESS_CONSUMER_BARCODE_TIFF_SUPPORT=<bool>`
`PAPERLESS_CONSUMER_BARCODE_SCANNER=<string>`
: Whether TIFF image files should be scanned for barcodes. This will
automatically convert any TIFF image(s) to pdfs for later
processing. This only has an effect, if
PAPERLESS_CONSUMER_ENABLE_BARCODES has been enabled.
: Sets the barcode scanner used for barcode functionality.
Defaults to false.
Currently, "PYZBAR" (the default) or "ZXING" might be selected.
If you have problems that your Barcodes/QR-Codes are not detected
(especially with bad scan quality and/or small codes), try the other one.
`PAPERLESS_CONSUMER_BARCODE_STRING=PATCHT`
zxing is not available on all platforms.
: Defines the string to be detected as a separator barcode. If
paperless is used with the PATCH-T separator pages, users shouldn't
change this.
`PAPERLESS_PRE_CONSUME_SCRIPT=<filename>`
Defaults to "PATCHT"
: After some initial validation, Paperless can trigger an arbitrary
script if you like before beginning consumption. This script will be provided
data for it to work with via the environment.
`PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE=<bool>`
For more information, take a look at [pre-consumption script](/advanced_usage#pre-consume-script).
: Enables the detection of barcodes in the scanned document and
setting the ASN (archive serial number) if a properly formatted
barcode is detected.
The barcode must consist of a (configurable) prefix and the ASN
to be set, for instance `ASN00123`.
This option is compatible with barcode page separation, since
pages will be split up before reading the ASN.
If no ASN barcodes are detected in the uploaded file, no ASN will
be set. If a barcode with an already existing ASN is detected, no ASN
will be set either and a warning will be logged.
Defaults to false.
`PAPERLESS_CONSUMER_ASN_BARCODE_PREFIX=ASN`
: Defines the prefix that is used to identify a barcode as an ASN
barcode.
Defaults to "ASN"
`PAPERLESS_CONVERT_MEMORY_LIMIT=<num>`
: On smaller systems, or even in the case of Very Large Documents, the
consumer may explode, complaining about how it's "unable to extend
pixel cache". In such cases, try setting this to a reasonably low
value, like 32. The default is to use whatever is necessary to do
everything without writing to disk, and units are in megabytes.
For more information on how to use this value, you should search the
web for "MAGICK_MEMORY_LIMIT".
Defaults to 0, which disables the limit.
`PAPERLESS_CONVERT_TMPDIR=<path>`
: Similar to the memory limit, if you've got a small system and your
OS mounts /tmp as tmpfs, you should set this to a path that's on a
physical disk, like /home/your_user/tmp or something. ImageMagick
will use this as scratch space when crunching through very large
documents.
For more information on how to use this value, you should search the
web for "MAGICK_TMPDIR".
Default is none, which disables the temporary directory.
The default is blank, which means nothing will be executed.
`PAPERLESS_POST_CONSUME_SCRIPT=<filename>`
: After a document is consumed, Paperless can trigger an arbitrary
script if you like. This script will be passed a number of arguments
for you to work with. For more information, take a look at [Post-consumption script](/advanced_usage#post-consume-script).
script if you like. This script will be provided
data for it to work with via the environment.
For more information, take a look at [Post-consumption script](/advanced_usage#post-consume-script).
The default is blank, which means nothing will be executed.
@@ -996,23 +991,109 @@ within your documents.
second, and year last order. Characters D, M, or Y can be shuffled
to meet the required order.
`PAPERLESS_CONSUMER_IGNORE_PATTERNS=<json>`
### Polling {#polling}
: By default, paperless ignores certain files and folders in the
consumption directory, such as system files created by the Mac OS
or hidden folders some tools use to store data.
`PAPERLESS_CONSUMER_POLLING=<num>`
This can be adjusted by configuring a custom json array with
patterns to exclude.
: If paperless won't find documents added to your consume folder, it
might not be able to automatically detect filesystem changes. In
that case, specify a polling interval in seconds here, which will
then cause paperless to periodically check your consumption
directory for changes. This will also disable listening for file
system changes with `inotify`.
For example, `.DS_STORE/*` will ignore any files found in a folder
named `.DS_STORE`, including `.DS_STORE/bar.pdf` and `foo/.DS_STORE/bar.pdf`
Defaults to 0, which disables polling and uses filesystem
notifications.
A pattern like `._*` will ignore anything starting with `._`, including:
`._foo.pdf` and `._bar/foo.pdf`
`PAPERLESS_CONSUMER_POLLING_RETRY_COUNT=<num>`
Defaults to
`[".DS_STORE/*", "._*", ".stfolder/*", ".stversions/*", ".localized/*", "desktop.ini", "@eaDir/*"]`.
: If consumer polling is enabled, sets the number of times paperless
will check for a file to remain unmodified.
Defaults to 5.
`PAPERLESS_CONSUMER_POLLING_DELAY=<num>`
: If consumer polling is enabled, sets the delay in seconds between
each check (above) paperless will do while waiting for a file to
remain unmodified.
Defaults to 5.
### iNotify {#inotify}
`PAPERLESS_CONSUMER_INOTIFY_DELAY=<num>`
: Sets the time in seconds the consumer will wait for additional
events from inotify before the consumer will consider a file ready
and begin consumption. Certain scanners or network setups may
generate multiple events for a single file, leading to multiple
consumers working on the same file. Configure this to prevent that.
Defaults to 0.5 seconds.
## Barcodes {#barcodes}
`PAPERLESS_CONSUMER_ENABLE_BARCODES=<bool>`
: Enables the scanning and page separation based on detected barcodes.
This allows for scanning and adding multiple documents per uploaded
file, which are separated by one or multiple barcode pages.
For ease of use, it is suggested to use a standardized separation
page, e.g. [here](https://www.alliancegroup.co.uk/patch-codes.htm).
If no barcodes are detected in the uploaded file, no page separation
will happen.
The original document will be removed and the separated pages will
be saved as pdf.
See additional information in the [advanced usage documentation](/advanced_usage#barcodes)
Defaults to false.
`PAPERLESS_CONSUMER_BARCODE_TIFF_SUPPORT=<bool>`
: Whether TIFF image files should be scanned for barcodes. This will
automatically convert any TIFF image(s) to pdfs for later
processing. This only has an effect, if
PAPERLESS_CONSUMER_ENABLE_BARCODES has been enabled.
Defaults to false.
`PAPERLESS_CONSUMER_BARCODE_STRING=<string>`
: Defines the string to be detected as a separator barcode. If
paperless is used with the PATCH-T separator pages, users shouldn't
change this.
Defaults to "PATCHT"
`PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE=<bool>`
: Enables the detection of barcodes in the scanned document and
setting the ASN (archive serial number) if a properly formatted
barcode is detected.
The barcode must consist of a (configurable) prefix and the ASN
to be set, for instance `ASN00123`.
This option is compatible with barcode page separation, since
pages will be split up before reading the ASN.
If no ASN barcodes are detected in the uploaded file, no ASN will
be set. If a barcode with an existing ASN is detected, the
document will not be consumed and an error logged.
Defaults to false.
`PAPERLESS_CONSUMER_ASN_BARCODE_PREFIX=<string>`
: Defines the prefix that is used to identify a barcode as an ASN
barcode.
Defaults to "ASN"
## Binaries
@@ -1104,12 +1185,17 @@ actual group ID on the host system, which you can get by executing
: Additional OCR languages to install. By default, paperless comes
with English, German, Italian, Spanish and French. If your language
is not in this list, install additional languages with this
configuration option:
configuration option. You will need to [find the right LangCodes](https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html)
but note that (tesseract-ocr-\* package names)[https://packages.debian.org/bullseye/graphics/]
do not always correspond with the language codes e.g. "chi_tra" should be
specified as "chi-tra".
``` bash
PAPERLESS_OCR_LANGUAGES=tur ces
PAPERLESS_OCR_LANGUAGES=tur ces chi-tra
```
Make sure it's a space separated list when using several values.
To actually use these languages, also set the default OCR language
of paperless:

View File

@@ -119,7 +119,9 @@ first-time setup.
## Back end development
The back end is a [Django](https://www.djangoproject.com/) application. [PyCharm](https://www.jetbrains.com/de-de/pycharm/) as well as [Visual Studio Code](https://code.visualstudio.com) work well for development, but you can use whatever you want.
The back end is a [Django](https://www.djangoproject.com/) application.
[PyCharm](https://www.jetbrains.com/de-de/pycharm/) as well as [Visual Studio Code](https://code.visualstudio.com)
work well for development, but you can use whatever you want.
Configure the IDE to use the `src/`-folder as the base source folder.
Configure the following launch configurations in your IDE:
@@ -138,7 +140,10 @@ $ python3 manage.py runserver & \
celery --app paperless worker -l DEBUG
```
You might need the front end to test your back end code. This assumes that you have AngularJS installed on your system. Go to the [Front end development](#front-end-development) section for further details. To build the front end once use this commmand:
You might need the front end to test your back end code.
This assumes that you have AngularJS installed on your system.
Go to the [Front end development](#front-end-development) section for further details.
To build the front end once use this command:
```bash
# src-ui/
@@ -181,7 +186,7 @@ The front end is built using AngularJS. In order to get started, you need Node.j
2. Make sure that it's on your path.
3. Install all neccessary modules:
3. Install all necessary modules:
```bash
$ npm install
@@ -251,7 +256,7 @@ these parts have to be translated separately.
- The translated strings need to be placed in the
`src-ui/src/locale/` folder.
- In order to extract added or changed strings from the source files,
call `ng xi18n --ivy`.
call `ng extract-i18n`.
Adding new languages requires adding the translated files in the
`src-ui/src/locale/` folder and adjusting a couple files.
@@ -357,7 +362,7 @@ If you want to build the documentation locally, this is how you do it:
3. Serve the documentation. This will spin up a
copy of the documentation at http://127.0.0.1:8000
that will automatically refresh everytime you change
that will automatically refresh every time you change
something.
```bash
@@ -369,13 +374,10 @@ If you want to build the documentation locally, this is how you do it:
The docker image is primarily built by the GitHub actions workflow, but
it can be faster when developing to build and tag an image locally.
To provide the build arguments automatically, build the image using the
helper script `build-docker-image.sh`.
Building the image works as with any image:
Building the docker image from source:
```bash
./build-docker-image.sh Dockerfile -t <your-tag>
```
docker build --file Dockerfile --tag paperless:local --progress simple .
```
## Extending Paperless-ngx
@@ -393,7 +395,7 @@ responsible for:
- Retrieving the content from the original
- Creating a thumbnail
- _optional:_ Retrieving a created date from the original
- _optional:_ Creainge an archived document from the original
- _optional:_ Creating an archived document from the original
Custom parsers can be added to Paperless-ngx to support more file types. In
order to do that, you need to write the parser itself and announce its

View File

@@ -103,7 +103,7 @@ see if it works.
## _How do I proxy this with NGINX?_
**A:** See [here](/setup#nginx).
**A:** See [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-a-Reverse-Proxy-with-Paperless-ngx#nginx).
## _How do I get WebSocket support with Apache mod_wsgi_?

View File

@@ -33,6 +33,11 @@ steps described in [Docker setup](#docker_hub) automatically.
$ bash -c "$(curl -L https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)"
```
!!! note
macOS users will need to install e.g. [gnu-sed](https://formulae.brew.sh/formula/gnu-sed) with support
for running as `sed`.
### From GHCR / Docker Hub {#docker_hub}
1. Login with your user and create a folder in your home-directory to have a place for your
@@ -43,7 +48,7 @@ steps described in [Docker setup](#docker_hub) automatically.
```
2. Go to the [/docker/compose directory on the project
page](https://github.com/paperless-ngx/paperless-ngx/tree/master/docker/compose)
page](https://github.com/paperless-ngx/paperless-ngx/tree/main/docker/compose)
and download one of the `docker-compose.*.yml` files,
depending on which database backend you want to use. Rename this
file to `docker-compose.yml`. If you want to enable
@@ -160,8 +165,7 @@ steps described in [Docker setup](#docker_hub) automatically.
`PAPERLESS_CONSUMER_POLLING`, which will disable inotify. See
[here](/configuration#polling).
6. Run `docker-compose pull`, followed by `docker-compose up -d`. This
will pull the image, create and start the necessary containers.
6. Run `docker-compose pull`. This will pull the image.
7. To be able to login, you will need a super user. To create it,
execute the following command:
@@ -170,10 +174,18 @@ steps described in [Docker setup](#docker_hub) automatically.
$ docker-compose run --rm webserver createsuperuser
```
or using docker exec from within the container:
```shell-session
$ python3 manage.py createsuperuser
```
This will prompt you to set a username, an optional e-mail address
and finally a password (at least 8 characters).
8. The default `docker-compose.yml` exports the webserver on your local
8. Run `docker-compose up -d`. This will create and start the necessary containers.
9. The default `docker-compose.yml` exports the webserver on your local
port
8000\. If you did not change this, you should now be able to visit
@@ -189,7 +201,7 @@ steps described in [Docker setup](#docker_hub) automatically.
git clone https://github.com/paperless-ngx/paperless-ngx
```
The master branch always reflects the latest stable version.
The main branch always reflects the latest stable version.
2. Copy one of the `docker/compose/docker-compose.*.yml` to
`docker-compose.yml` in the root folder, depending on which database
@@ -365,6 +377,10 @@ supported.
documents are written in.
- Set `PAPERLESS_TIME_ZONE` to your local time zone.
!!! warning
Ensure your Redis instance [is secured](https://redis.io/docs/getting-started/#securing-redis).
7. Create the following directories if they are missing:
- `/opt/paperless/media`
@@ -467,7 +483,7 @@ supported.
in front of gunicorn instead.
For instructions on how to use nginx for that,
[see the instructions below](/setup#nginx).
[see the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-a-Reverse-Proxy-with-Paperless-ngx#nginx).
!!! warning
@@ -543,7 +559,7 @@ Users who installed with the bare-metal route should also update their
Git clone to point to `https://github.com/paperless-ngx/paperless-ngx`,
e.g. using the command
`git remote set-url origin https://github.com/paperless-ngx/paperless-ngx`
and then pull the lastest version.
and then pull the latest version.
## Migrating from Paperless
@@ -585,7 +601,7 @@ Migration to paperless-ngx is then performed in a few simple steps:
3. Download the latest release of paperless-ngx. You can either go with
the docker-compose files from
[here](https://github.com/paperless-ngx/paperless-ngx/tree/master/docker/compose)
[here](https://github.com/paperless-ngx/paperless-ngx/tree/main/docker/compose)
or clone the repository to build the image yourself (see
[above](#docker_build)). You can
either replace your current paperless folder or put paperless-ngx in
@@ -818,14 +834,14 @@ performance immensely:
other tasks).
- Keep `PAPERLESS_OCR_MODE` at its default value `skip` and consider
OCR'ing your documents before feeding them into paperless. Some
scanners are able to do this! You might want to even specify
`skip_noarchive` to skip archive file generation for already ocr'ed
documents entirely.
scanners are able to do this!
- Set `PAPERLESS_OCR_SKIP_ARCHIVE_FILE` to `with_text` to skip archive
file generation for already ocr'ed documents, or `always` to skip it
for all documents.
- If you want to perform OCR on the device, consider using
`PAPERLESS_OCR_CLEAN=none`. This will speed up OCR times and use
less memory at the expense of slightly worse OCR results.
- If using docker, consider setting `PAPERLESS_WEBSERVER_WORKERS` to
1. This will save some memory.
- If using docker, consider setting `PAPERLESS_WEBSERVER_WORKERS` to 1. This will save some memory.
- Consider setting `PAPERLESS_ENABLE_NLTK` to false, to disable the
more advanced language processing, which can take more memory and
processing time.
@@ -846,45 +862,8 @@ For details, refer to [configuration](/configuration).
# Using nginx as a reverse proxy {#nginx}
If you want to expose paperless to the internet, you should hide it
behind a reverse proxy with SSL enabled.
Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-a-Reverse-Proxy-with-Paperless-ngx#nginx) for user-maintained documentation of using nginx with Paperless-ngx.
In addition to the usual configuration for SSL, the following
configuration is required for paperless to operate:
# Enhancing security {#security}
```nginx
http {
# Adjust as required. This is the maximum size for file uploads.
# The default value 1M might be a little too small.
client_max_body_size 10M;
server {
location / {
# Adjust host and port as required.
proxy_pass http://localhost:8000/;
# These configuration options are required for WebSockets to work.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
add_header P3P 'CP=""'; # may not be required in all setups
}
}
}
```
The `PAPERLESS_URL` configuration variable is also required when using a
reverse proxy. Please refer to the [hosting and security](/configuration#hosting-and-security) docs.
Also read
[this](https://channels.readthedocs.io/en/stable/deploying.html#nginx-supervisor-ubuntu),
towards the end of the section.
Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-Security-Tools-with-Paperless-ngx) for user-maintained documentation of how to configure security tools like Fail2ban with Paperless-ngx.

View File

@@ -332,3 +332,16 @@ change the port gunicorn listens on.
To fix this, set `PAPERLESS_PORT` again to your desired port, or the
default of 8000.
## Database Warns about unique constraint "documents_tag_name_uniq
You may see database log lines like:
```
ERROR: duplicate key value violates unique constraint "documents_tag_name_uniq"
DETAIL: Key (name)=(NameF) already exists.
STATEMENT: INSERT INTO "documents_tag" ("owner_id", "name", "match", "matching_algorithm", "is_insensitive", "color", "is_inbox_tag") VALUES (NULL, 'NameF', '', 1, true, '#a6cee3', false) RETURNING "documents_tag"."id"
```
This can happen during heavy consumption when using polling. Paperless will handle it correctly and the file
will still be consumed

View File

@@ -60,8 +60,8 @@ following operations on your documents:
This process can be configured to fit your needs. If you don't want
paperless to create archived versions for digital documents, you can
configure that by configuring `PAPERLESS_OCR_MODE=skip_noarchive`.
Please read the
configure that by configuring
`PAPERLESS_OCR_SKIP_ARCHIVE_FILE=with_text`. Please read the
[relevant section in the documentation](/configuration#ocr).
!!! note
@@ -202,6 +202,41 @@ configured via `PAPERLESS_EMAIL_TASK_CRON` (see [software tweaks](/configuration
You can also submit a document using the REST API, see [POSTing documents](/api#file-uploads)
for details.
## Permissions
As of version 1.14.0 Paperless-ngx added core support for user / group permissions. Permissions is
based around 'global' permissions as well as 'object-level' permissions. Global permissions designate
which parts of the application a user can access (e.g. Documents, Tags, Settings) and object-level
determine which objects are visible or editable. All objects have an 'owner' and 'view' and 'edit'
permissions which can be granted to other users or groups.
Permissions uses the built-in user model of the backend framework, Django.
!!! note
After migration to version 1.14.0 all existing documents, tags etc. will have no explicit owner
set which means they will be visible / editable by all users. Once an object has an owner set,
only the owner can explicitly grant / revoke permissions.
!!! note
When first migrating to permissions it is recommended to use a 'superuser' account (which
would usually have been setup during installation) to ensure you have full permissions.
Note that superusers have access to all objects.
Permissions can be set using the new "Permissions" tab when editing documents, or bulk-applied
in the UI by selecting documents and choosing the "Permissions" button. Owner can also optionally
be set for documents uploaded via the API. Documents consumed via the consumption dir currently
do not have an owner set.
### Users and Groups
Paperless-ngx versions after 1.14.0 allow creating and editing users and groups via the 'frontend' UI.
These can be found under Settings > Users & Groups, assuming the user has access. If a user is designated
as a member of a group those permissions will be inherited and this is reflected in the UI. Explicit
permissions can be granted to limit access to certain parts of the UI (and corresponding API endpoints).
## Best practices {#basic-searching}
Paperless offers a couple tools that help you organize your document

View File

@@ -30,7 +30,9 @@ def worker_int(worker):
worker.log.info("worker received INT or QUIT signal")
## get traceback info
import threading, sys, traceback
import sys
import threading
import traceback
id2name = {th.ident: th.name for th in threading.enumerate()}
code = []

View File

@@ -42,6 +42,7 @@
#PAPERLESS_OCR_LANGUAGE=eng
#PAPERLESS_OCR_MODE=skip
#PAPERLESS_OCR_SKIP_ARCHIVE_FILE=never
#PAPERLESS_OCR_OUTPUT_TYPE=pdfa
#PAPERLESS_OCR_PAGES=1
#PAPERLESS_OCR_IMAGE_DPI=300

3
src-ui/.gitignore vendored
View File

@@ -49,3 +49,6 @@ Thumbs.db
# Cypress
cypress/videos/**/*
cypress/screenshots/**/*
/test-results/
/playwright-report/
/playwright/.cache/

View File

@@ -18,11 +18,13 @@
"locales": {
"ar-AR": "src/locale/messages.ar_AR.xlf",
"be-BY": "src/locale/messages.be_BY.xlf",
"ca-ES": "src/locale/messages.ca_ES.xlf",
"cs-CZ": "src/locale/messages.cs_CZ.xlf",
"da-DK": "src/locale/messages.da_DK.xlf",
"de-DE": "src/locale/messages.de_DE.xlf",
"en-GB": "src/locale/messages.en_GB.xlf",
"es-ES": "src/locale/messages.es_ES.xlf",
"fi-FI": "src/locale/messages.fi_FI.xlf",
"fr-FR": "src/locale/messages.fr_FR.xlf",
"it-IT": "src/locale/messages.it_IT.xlf",
"lb-LU": "src/locale/messages.lb_LU.xlf",
@@ -145,37 +147,6 @@
"scripts": []
}
},
"e2e": {
"builder": "@cypress/schematic:cypress",
"options": {
"devServerTarget": "paperless-ui:serve",
"watch": true,
"headless": false
},
"configurations": {
"production": {
"devServerTarget": "paperless-ui:serve:production"
}
}
},
"cypress-run": {
"builder": "@cypress/schematic:cypress",
"options": {
"devServerTarget": "paperless-ui:serve"
},
"configurations": {
"production": {
"devServerTarget": "paperless-ui:serve:production"
}
}
},
"cypress-open": {
"builder": "@cypress/schematic:cypress",
"options": {
"watch": true,
"headless": false
}
},
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {

View File

@@ -1,13 +0,0 @@
import { defineConfig } from 'cypress'
export default defineConfig({
videosFolder: 'cypress/videos',
screenshotsFolder: 'cypress/screenshots',
fixturesFolder: 'cypress/fixtures',
e2e: {
setupNodeEvents(on, config) {
return require('./cypress/plugins/index.ts')(on, config)
},
baseUrl: 'http://localhost:4200',
},
})

View File

@@ -1,107 +0,0 @@
describe('document-detail', () => {
beforeEach(() => {
// also uses global fixtures from cypress/support/e2e.ts
this.modifiedDocuments = []
cy.fixture('documents/documents.json').then((documentsJson) => {
cy.intercept('GET', 'http://localhost:8000/api/documents/1/', (req) => {
let response = { ...documentsJson }
response = response.results.find((d) => d.id == 1)
req.reply(response)
})
})
cy.intercept('PUT', 'http://localhost:8000/api/documents/1/', (req) => {
this.modifiedDocuments.push(req.body) // store this for later
req.reply({ result: 'OK' })
}).as('saveDoc')
cy.fixture('documents/1/comments.json').then((commentsJson) => {
cy.intercept(
'GET',
'http://localhost:8000/api/documents/1/comments/',
(req) => {
req.reply(commentsJson.filter((c) => c.id != 10)) // 3
}
)
cy.intercept(
'DELETE',
'http://localhost:8000/api/documents/1/comments/?id=9',
(req) => {
req.reply(commentsJson.filter((c) => c.id != 9 && c.id != 10)) // 2
}
)
cy.intercept(
'POST',
'http://localhost:8000/api/documents/1/comments/',
(req) => {
req.reply(commentsJson) // 4
}
)
})
cy.viewport(1024, 1024)
cy.visit('/documents/1/').wait('@ui-settings')
})
it('should activate / deactivate save button when changes are saved', () => {
cy.contains('button', 'Save').should('be.disabled')
cy.get('app-input-text[formcontrolname="title"]')
.type(' additional')
.wait(1500) // this delay is for frontend debounce
cy.contains('button', 'Save').should('not.be.disabled')
})
it('should warn on unsaved changes', () => {
cy.get('app-input-text[formcontrolname="title"]')
.type(' additional')
.wait(1500) // this delay is for frontend debounce
cy.get('button[title="Close"]').click()
cy.contains('You have unsaved changes')
cy.contains('button', 'Cancel').click().wait(150)
cy.contains('button', 'Save').click().wait('@saveDoc').wait(2000) // navigates away after saving
cy.contains('You have unsaved changes').should('not.exist')
})
it('should show a mobile preview', () => {
cy.viewport(440, 1000)
cy.get('a')
.contains('Preview')
.scrollIntoView({ offset: { top: 150, left: 0 } })
.click()
cy.get('pdf-viewer').should('be.visible')
})
it('should show a list of comments', () => {
cy.wait(1000)
.get('a')
.contains('Comments')
.click({ force: true })
.wait(1000)
cy.get('app-document-comments').find('.card').its('length').should('eq', 3)
})
it('should support comment deletion', () => {
cy.wait(1000).get('a').contains('Comments').click().wait(1000)
cy.get('app-document-comments')
.find('.card')
.first()
.find('button')
.click({ force: true })
.wait(500)
cy.get('app-document-comments').find('.card').its('length').should('eq', 2)
})
it('should support comment insertion', () => {
cy.wait(1000).get('a').contains('Comments').click().wait(1000)
cy.get('app-document-comments')
.find('form textarea')
.type('Testing new comment')
.wait(500)
cy.get('app-document-comments').find('form button').click().wait(1500)
cy.get('app-document-comments').find('.card').its('length').should('eq', 4)
})
})

View File

@@ -1,155 +0,0 @@
describe('documents-list', () => {
beforeEach(() => {
// also uses global fixtures from cypress/support/e2e.ts
this.bulkEdits = {}
cy.fixture('documents/documents.json').then((documentsJson) => {
// bulk edit
cy.intercept(
'POST',
'http://localhost:8000/api/documents/bulk_edit/',
(req) => {
this.bulkEdits = req.body // store this for later
req.reply({ result: 'OK' })
}
)
cy.intercept('GET', 'http://localhost:8000/api/documents/*', (req) => {
let response = { ...documentsJson }
// bulkEdits was set earlier by bulk_edit intercept
if (this.bulkEdits.hasOwnProperty('documents')) {
response.results = response.results.map((d) => {
if ((this.bulkEdits['documents'] as Array<number>).includes(d.id)) {
switch (this.bulkEdits['method']) {
case 'modify_tags':
d.tags = (d.tags as Array<number>).concat([
this.bulkEdits['parameters']['add_tags'],
])
break
case 'set_correspondent':
d.correspondent =
this.bulkEdits['parameters']['correspondent']
break
case 'set_document_type':
d.document_type =
this.bulkEdits['parameters']['document_type']
break
}
}
return d
})
} else if (req.query.hasOwnProperty('tags__id__all')) {
// filtering e.g. http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&tags__id__all=2
const tag_id = +req.query['tags__id__all']
response.results = (documentsJson.results as Array<any>).filter((d) =>
(d.tags as Array<number>).includes(tag_id)
)
response.count = response.results.length
}
req.reply(response)
})
cy.intercept('http://localhost:8000/api/documents/selection_data/', {
fixture: 'documents/selection_data.json',
}).as('selection-data')
})
cy.viewport(1280, 1024)
cy.visit('/documents')
})
it('should show a list of documents rendered as cards with thumbnails', () => {
cy.contains('3 documents')
cy.contains('lorem ipsum')
cy.get('app-document-card-small:first-of-type img')
.invoke('attr', 'src')
.should('eq', 'http://localhost:8000/api/documents/1/thumb/')
})
it('should change to table "details" view', () => {
cy.get('div.btn-group input[value="details"]').next().click()
cy.get('table')
})
it('should change to large cards view', () => {
cy.get('div.btn-group input[value="largeCards"]').next().click()
cy.get('app-document-card-large')
})
it('should show partial tag selection', () => {
cy.get('app-document-card-small:nth-child(1)').click()
cy.get('app-document-card-small:nth-child(4)').click()
cy.get('app-bulk-editor button')
.contains('Tags')
.click()
.wait('@selection-data')
cy.get('svg.bi-dash').should('be.visible')
cy.get('svg.bi-check').should('be.visible')
})
it('should allow bulk removal', () => {
cy.get('app-document-card-small:nth-child(1)').click()
cy.get('app-document-card-small:nth-child(4)').click()
cy.get('app-bulk-editor').within(() => {
cy.get('button').contains('Tags').click().wait('@selection-data')
cy.get('button').contains('Another Sample Tag').click()
cy.get('button').contains('Apply').click()
})
cy.contains('operation will remove the tag')
})
it('should filter tags', () => {
cy.get('app-filter-editor app-filterable-dropdown[title="Tags"]').within(
() => {
cy.contains('button', 'Tags').click()
cy.contains('button', 'Tag 2').click()
}
)
cy.contains('One document')
})
it('should apply tags', () => {
cy.get('app-document-card-small:first-of-type').click()
cy.get('app-bulk-editor app-filterable-dropdown[title="Tags"]').within(
() => {
cy.contains('button', 'Tags').click()
cy.contains('button', 'Test Tag').click()
cy.contains('button', 'Apply').click()
}
)
cy.contains('button', 'Confirm').click()
cy.get('app-document-card-small:first-of-type').contains('Test Tag')
})
it('should apply correspondent', () => {
cy.get('app-document-card-small:first-of-type').click()
cy.get(
'app-bulk-editor app-filterable-dropdown[title="Correspondent"]'
).within(() => {
cy.contains('button', 'Correspondent').click()
cy.contains('button', 'ABC Test Correspondent').click()
cy.contains('button', 'Apply').click()
})
cy.contains('button', 'Confirm').click()
cy.get('app-document-card-small:first-of-type').contains(
'ABC Test Correspondent'
)
})
it('should apply document type', () => {
cy.get('app-document-card-small:first-of-type').click()
cy.get(
'app-bulk-editor app-filterable-dropdown[title="Document type"]'
).within(() => {
cy.contains('button', 'Document type').click()
cy.contains('button', 'Test Doc Type').click()
cy.contains('button', 'Apply').click()
})
cy.contains('button', 'Confirm').click()
cy.get('app-document-card-small:first-of-type').contains('Test Doc Type')
})
})

View File

@@ -1,331 +0,0 @@
import { PaperlessDocument } from 'src/app/data/paperless-document'
describe('documents query params', () => {
beforeEach(() => {
// also uses global fixtures from cypress/support/e2e.ts
cy.fixture('documents/documents.json').then((documentsJson) => {
// mock api filtering
cy.intercept('GET', 'http://localhost:8000/api/documents/*', (req) => {
let response = { ...documentsJson }
if (req.query.hasOwnProperty('ordering')) {
const sort_field = req.query['ordering'].toString().replace('-', '')
const reverse = req.query['ordering'].toString().indexOf('-') !== -1
response.results = (
documentsJson.results as Array<PaperlessDocument>
).sort((docA, docB) => {
let result = 0
switch (sort_field) {
case 'created':
case 'added':
result =
new Date(docA[sort_field]) < new Date(docB[sort_field])
? -1
: 1
break
case 'archive_serial_number':
result = docA[sort_field] < docB[sort_field] ? -1 : 1
break
}
if (reverse) result = -result
return result
})
}
if (req.query.hasOwnProperty('tags__id__in')) {
const tag_ids: Array<number> = req.query['tags__id__in']
.toString()
.split(',')
.map((v) => +v)
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter(
(d) =>
d.tags.length > 0 &&
d.tags.filter((t) => tag_ids.includes(t)).length > 0
)
response.count = response.results.length
} else if (req.query.hasOwnProperty('tags__id__none')) {
const tag_ids: Array<number> = req.query['tags__id__none']
.toString()
.split(',')
.map((v) => +v)
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.tags.filter((t) => tag_ids.includes(t)).length == 0)
response.count = response.results.length
} else if (
req.query.hasOwnProperty('is_tagged') &&
req.query['is_tagged'] == '0'
) {
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.tags.length == 0)
response.count = response.results.length
}
if (req.query.hasOwnProperty('document_type__id')) {
const doctype_id = +req.query['document_type__id']
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.document_type == doctype_id)
response.count = response.results.length
} else if (
req.query.hasOwnProperty('document_type__isnull') &&
req.query['document_type__isnull'] == '1'
) {
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.document_type == undefined)
response.count = response.results.length
}
if (req.query.hasOwnProperty('correspondent__id')) {
const correspondent_id = +req.query['correspondent__id']
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.correspondent == correspondent_id)
response.count = response.results.length
} else if (
req.query.hasOwnProperty('correspondent__isnull') &&
req.query['correspondent__isnull'] == '1'
) {
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.correspondent == undefined)
response.count = response.results.length
}
if (req.query.hasOwnProperty('storage_path__id')) {
const storage_path_id = +req.query['storage_path__id']
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.storage_path == storage_path_id)
response.count = response.results.length
} else if (
req.query.hasOwnProperty('storage_path__isnull') &&
req.query['storage_path__isnull'] == '1'
) {
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.storage_path == undefined)
response.count = response.results.length
}
if (req.query.hasOwnProperty('created__date__gt')) {
const date = new Date(req.query['created__date__gt'])
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => new Date(d.created) > date)
response.count = response.results.length
} else if (req.query.hasOwnProperty('created__date__lt')) {
const date = new Date(req.query['created__date__lt'])
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => new Date(d.created) < date)
response.count = response.results.length
}
if (req.query.hasOwnProperty('added__date__gt')) {
const date = new Date(req.query['added__date__gt'])
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => new Date(d.added) > date)
response.count = response.results.length
} else if (req.query.hasOwnProperty('added__date__lt')) {
const date = new Date(req.query['added__date__lt'])
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => new Date(d.added) < date)
response.count = response.results.length
}
if (req.query.hasOwnProperty('title_content')) {
const title_content_regexp = new RegExp(
req.query['title_content'].toString(),
'i'
)
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter(
(d) =>
title_content_regexp.test(d.title) ||
title_content_regexp.test(d.content)
)
response.count = response.results.length
}
if (req.query.hasOwnProperty('archive_serial_number')) {
const asn = +req.query['archive_serial_number']
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) => d.archive_serial_number == asn)
response.count = response.results.length
} else if (req.query.hasOwnProperty('archive_serial_number__isnull')) {
const isnull = req.query['storage_path__isnull'] == '1'
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter((d) =>
isnull
? d.archive_serial_number == undefined
: d.archive_serial_number != undefined
)
response.count = response.results.length
} else if (req.query.hasOwnProperty('archive_serial_number__gt')) {
const asn = +req.query['archive_serial_number__gt']
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter(
(d) => d.archive_serial_number > 0 && d.archive_serial_number > asn
)
response.count = response.results.length
} else if (req.query.hasOwnProperty('archive_serial_number__lt')) {
const asn = +req.query['archive_serial_number__lt']
response.results = (
documentsJson.results as Array<PaperlessDocument>
).filter(
(d) => d.archive_serial_number > 0 && d.archive_serial_number < asn
)
response.count = response.results.length
}
req.reply(response)
})
})
})
it('should show a list of documents sorted by created', () => {
cy.visit('/documents?sort=created')
cy.get('app-document-card-small').first().contains('No latin title')
})
it('should show a list of documents reverse sorted by created', () => {
cy.visit('/documents?sort=created&reverse=true')
cy.get('app-document-card-small').first().contains('sit amet')
})
it('should show a list of documents sorted by added', () => {
cy.visit('/documents?sort=added')
cy.get('app-document-card-small').first().contains('No latin title')
})
it('should show a list of documents reverse sorted by added', () => {
cy.visit('/documents?sort=added&reverse=true')
cy.get('app-document-card-small').first().contains('sit amet')
})
it('should show a list of documents filtered by any tags', () => {
cy.visit('/documents?sort=created&reverse=true&tags__id__in=2,4,5')
cy.contains('3 documents')
})
it('should show a list of documents filtered by excluded tags', () => {
cy.visit('/documents?sort=created&reverse=true&tags__id__none=2,4')
cy.contains('One document')
})
it('should show a list of documents filtered by no tags', () => {
cy.visit('/documents?sort=created&reverse=true&is_tagged=0')
cy.contains('One document')
})
it('should show a list of documents filtered by document type', () => {
cy.visit('/documents?sort=created&reverse=true&document_type__id=1')
cy.contains('3 documents')
})
it('should show a list of documents filtered by no document type', () => {
cy.visit('/documents?sort=created&reverse=true&document_type__isnull=1')
cy.contains('One document')
})
it('should show a list of documents filtered by correspondent', () => {
cy.visit('/documents?sort=created&reverse=true&correspondent__id=9')
cy.contains('2 documents')
})
it('should show a list of documents filtered by no correspondent', () => {
cy.visit('/documents?sort=created&reverse=true&correspondent__isnull=1')
cy.contains('2 documents')
})
it('should show a list of documents filtered by storage path', () => {
cy.visit('/documents?sort=created&reverse=true&storage_path__id=2')
cy.contains('One document')
})
it('should show a list of documents filtered by no storage path', () => {
cy.visit('/documents?sort=created&reverse=true&storage_path__isnull=1')
cy.contains('3 documents')
})
it('should show a list of documents filtered by title or content', () => {
cy.visit('/documents?sort=created&reverse=true&title_content=lorem')
cy.contains('2 documents')
})
it('should show a list of documents filtered by asn', () => {
cy.visit('/documents?sort=created&reverse=true&archive_serial_number=12345')
cy.contains('One document')
})
it('should show a list of documents filtered by empty asn', () => {
cy.visit(
'/documents?sort=created&reverse=true&archive_serial_number__isnull=1'
)
cy.contains('2 documents')
})
it('should show a list of documents filtered by non-empty asn', () => {
cy.visit(
'/documents?sort=created&reverse=true&archive_serial_number__isnull=0'
)
cy.contains('2 documents')
})
it('should show a list of documents filtered by asn greater than', () => {
cy.visit(
'/documents?sort=created&reverse=true&archive_serial_number__gt=12346'
)
cy.contains('One document')
})
it('should show a list of documents filtered by asn less than', () => {
cy.visit(
'/documents?sort=created&reverse=true&archive_serial_number__lt=12346'
)
cy.contains('One document')
})
it('should show a list of documents filtered by created date greater than', () => {
cy.visit(
'/documents?sort=created&reverse=true&created__date__gt=2022-03-23'
)
cy.contains('3 documents')
})
it('should show a list of documents filtered by created date less than', () => {
cy.visit(
'/documents?sort=created&reverse=true&created__date__lt=2022-03-23'
)
cy.contains('One document')
})
it('should show a list of documents filtered by added date greater than', () => {
cy.visit('/documents?sort=created&reverse=true&added__date__gt=2022-03-24')
cy.contains('2 documents')
})
it('should show a list of documents filtered by added date less than', () => {
cy.visit('/documents?sort=created&reverse=true&added__date__lt=2022-03-24')
cy.contains('2 documents')
})
it('should show a list of documents filtered by multiple filters', () => {
cy.visit(
'/documents?sort=created&reverse=true&document_type__id=1&correspondent__id=9&tags__id__in=4,5'
)
cy.contains('2 documents')
})
})

View File

@@ -1,25 +0,0 @@
describe('manage', () => {
// also uses global fixtures from cypress/support/e2e.ts
it('should show a list of correspondents with bottom pagination as well', () => {
cy.visit('/correspondents')
cy.get('tbody').find('tr').its('length').should('eq', 25)
cy.get('ngb-pagination').its('length').should('eq', 2)
})
it('should show a list of tags without bottom pagination', () => {
cy.visit('/tags')
cy.get('tbody').find('tr').its('length').should('eq', 8)
cy.get('ngb-pagination').its('length').should('eq', 1)
})
it('should show a list of documents filtered by tag', () => {
cy.intercept('http://localhost:8000/api/documents/*', (req) => {
if (req.url.indexOf('tags__id__all=4'))
req.reply({ count: 3, next: null, previous: null, results: [] })
})
cy.visit('/tags')
cy.get('tbody').find('button:visible').contains('Documents').first().click() // id = 4
cy.contains('3 documents')
})
})

View File

@@ -1,182 +0,0 @@
describe('settings', () => {
beforeEach(() => {
// also uses global fixtures from cypress/support/e2e.ts
this.modifiedViews = []
// mock API methods
cy.intercept('http://localhost:8000/api/ui_settings/', {
fixture: 'ui_settings/settings.json',
}).then(() => {
cy.fixture('saved_views/savedviews.json').then((savedViewsJson) => {
// saved views PATCH
cy.intercept(
'PATCH',
'http://localhost:8000/api/saved_views/*',
(req) => {
this.modifiedViews.push(req.body) // store this for later
req.reply({ result: 'OK' })
}
)
cy.intercept(
'GET',
'http://localhost:8000/api/saved_views/*',
(req) => {
let response = { ...savedViewsJson }
if (this.modifiedViews.length) {
response.results = response.results.map((v) => {
if (this.modifiedViews.find((mv) => mv.id == v.id))
v = this.modifiedViews.find((mv) => mv.id == v.id)
return v
})
}
req.reply(response)
}
).as('savedViews')
})
this.newMailAccounts = []
cy.intercept(
'POST',
'http://localhost:8000/api/mail_accounts/',
(req) => {
const newRule = req.body
newRule.id = 3
this.newMailAccounts.push(newRule) // store this for later
req.reply({ result: 'OK' })
}
).as('saveAccount')
cy.fixture('mail_accounts/mail_accounts.json').then(
(mailAccountsJson) => {
cy.intercept(
'GET',
'http://localhost:8000/api/mail_accounts/*',
(req) => {
console.log(req, this.newMailAccounts)
let response = { ...mailAccountsJson }
if (this.newMailAccounts.length) {
response.results = response.results.concat(this.newMailAccounts)
}
req.reply(response)
}
).as('getAccounts')
}
)
this.newMailRules = []
cy.intercept('POST', 'http://localhost:8000/api/mail_rules/', (req) => {
const newRule = req.body
newRule.id = 2
this.newMailRules.push(newRule) // store this for later
req.reply({ result: 'OK' })
}).as('saveRule')
cy.fixture('mail_rules/mail_rules.json').then((mailRulesJson) => {
cy.intercept('GET', 'http://localhost:8000/api/mail_rules/*', (req) => {
let response = { ...mailRulesJson }
if (this.newMailRules.length) {
response.results = response.results.concat(this.newMailRules)
}
req.reply(response)
}).as('getRules')
})
cy.fixture('documents/documents.json').then((documentsJson) => {
cy.intercept('GET', 'http://localhost:8000/api/documents/1/', (req) => {
let response = { ...documentsJson }
response = response.results.find((d) => d.id == 1)
req.reply(response)
})
})
})
cy.viewport(1024, 1600)
cy.visit('/settings')
})
it('should activate / deactivate save button when settings change and are saved', () => {
cy.contains('button', 'Save').should('be.disabled')
cy.contains('Use system settings').click()
cy.contains('button', 'Save').should('not.be.disabled')
cy.contains('button', 'Save').click()
cy.contains('button', 'Save').should('be.disabled')
})
it('should warn on unsaved changes', () => {
cy.contains('Use system settings').click()
cy.contains('a', 'Dashboard').click()
cy.contains('You have unsaved changes')
cy.contains('button', 'Cancel').click()
cy.contains('button', 'Save').click().wait('@savedViews').wait(2000)
cy.contains('a', 'Dashboard').click()
cy.contains('You have unsaved changes').should('not.exist')
})
it('should apply appearance changes when set', () => {
cy.contains('Use system settings').click()
cy.get('body').should('not.have.class', 'color-scheme-system')
cy.contains('Enable dark mode').click()
cy.get('body').should('have.class', 'color-scheme-dark')
})
it('should remove saved view from sidebar when unset', () => {
cy.contains('a', 'Saved views').click().wait(2000)
cy.get('#show_in_sidebar_1').click()
cy.contains('button', 'Save').click().wait('@savedViews').wait(2000)
cy.contains('li', 'Inbox').should('not.exist')
})
it('should remove saved view from dashboard when unset', () => {
cy.contains('a', 'Saved views').click()
cy.get('#show_on_dashboard_1').click()
cy.contains('button', 'Save').click().wait('@savedViews').wait(2000)
cy.visit('/dashboard')
cy.get('app-saved-view-widget').contains('Inbox').should('not.exist')
})
it('should show a list of mail accounts & rules & support creation', () => {
cy.contains('a', 'Mail').click()
cy.get('app-settings .tab-content ul li').its('length').should('eq', 5) // 2 headers, 2 accounts, 1 rule
cy.contains('button', 'Add Account').click()
cy.contains('Create new mail account')
cy.get('app-input-text[formcontrolname="name"]').type(
'Example Mail Account'
)
cy.get('app-input-text[formcontrolname="imap_server"]').type(
'mail.example.com'
)
cy.get('app-input-text[formcontrolname="imap_port"]').type('993')
cy.get('app-input-text[formcontrolname="username"]').type('username')
cy.get('app-input-password[formcontrolname="password"]').type('pass')
cy.contains('app-mail-account-edit-dialog button', 'Save')
.click()
.wait('@saveAccount')
.wait('@getAccounts')
cy.contains('Saved account')
cy.wait(1000)
cy.contains('button', 'Add Rule').click()
cy.contains('Create new mail rule')
cy.get('app-input-text[formcontrolname="name"]').type('Example Rule')
cy.get('app-input-select[formcontrolname="account"]').type('Example{enter}')
cy.get('app-input-number[formcontrolname="maximum_age"]').type('30')
cy.get('app-input-text[formcontrolname="filter_subject"]').type(
'[paperless]'
)
cy.contains('app-mail-rule-edit-dialog button', 'Save')
.click()
.wait('@saveRule')
.wait('@getRules')
cy.contains('Saved rule').wait(1000)
cy.get('app-settings .tab-content ul li').its('length').should('eq', 7)
})
})

View File

@@ -1,93 +0,0 @@
describe('tasks', () => {
beforeEach(() => {
this.dismissedTasks = new Set<number>()
cy.fixture('tasks/tasks.json').then((tasksViewsJson) => {
// acknowledge tasks POST
cy.intercept(
'POST',
'http://localhost:8000/api/acknowledge_tasks/',
(req) => {
req.body['tasks'].forEach((t) => this.dismissedTasks.add(t)) // store this for later
req.reply({ result: 'OK' })
}
)
cy.intercept('GET', 'http://localhost:8000/api/tasks/', (req) => {
let response = [...tasksViewsJson]
if (this.dismissedTasks.size) {
response = response.filter((t) => {
return !this.dismissedTasks.has(t.id)
})
}
req.reply(response)
}).as('tasks')
})
cy.visit('/tasks')
cy.wait('@tasks')
})
it('should show a list of dismissable tasks in tabs', () => {
cy.get('tbody').find('tr:visible').its('length').should('eq', 10) // double because collapsible result tr
cy.wait(500) // stabilizes the test, for some reason...
cy.get('tbody')
.find('button:visible')
.contains('Dismiss')
.first()
.click()
.wait('@tasks')
.wait(2000)
.then(() => {
cy.get('tbody').find('tr:visible').its('length').should('eq', 8) // double because collapsible result tr
})
})
it('should correctly switch between task tabs', () => {
cy.get('tbody').find('tr:visible').its('length').should('eq', 10) // double because collapsible result tr
cy.wait(500) // stabilizes the test, for some reason...
cy.get('app-tasks')
.find('a:visible')
.contains('Queued')
.first()
.click()
.wait(2000)
.then(() => {
cy.get('tbody').find('tr:visible').should('not.exist')
})
cy.get('app-tasks')
.find('a:visible')
.contains('Started')
.first()
.click()
.wait(2000)
.then(() => {
cy.get('tbody').find('tr:visible').its('length').should('eq', 2) // double because collapsible result tr
})
cy.get('app-tasks')
.find('a:visible')
.contains('Complete')
.first()
.click()
.wait('@tasks')
.wait(2000)
.then(() => {
cy.get('tbody').find('tr:visible').its('length').should('eq', 12) // double because collapsible result tr
})
})
it('should allow toggling all tasks in list and warn on dismiss', () => {
cy.get('thead').find('input[type="checkbox"]').first().click()
cy.get('body').find('button').contains('Dismiss selected').first().click()
cy.contains('Confirm')
cy.get('.modal')
.contains('button', 'Dismiss')
.click()
.wait('@tasks')
.wait(2000)
.then(() => {
cy.get('tbody').find('tr:visible').should('not.exist')
})
})
})

View File

@@ -1 +0,0 @@
{"count":27,"next":"http://localhost:8000/api/correspondents/?page=2","previous":null,"results":[{"id":9,"slug":"abc-test-correspondent","name":"ABC Test Correspondent","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":13,"slug":"corresp-10","name":"Corresp 10","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":14,"slug":"corresp-11","name":"Corresp 11","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":15,"slug":"corresp-12","name":"Corresp 12","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":16,"slug":"corresp-13","name":"Corresp 13","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":18,"slug":"corresp-15","name":"Corresp 15","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":19,"slug":"corresp-16","name":"Corresp 16","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":20,"slug":"corresp-17","name":"Corresp 17","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":21,"slug":"corresp-18","name":"Corresp 18","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":22,"slug":"corresp-19","name":"Corresp 19","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":23,"slug":"corresp-20","name":"Corresp 20","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":24,"slug":"corresp-21","name":"Corresp 21","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":25,"slug":"corresp-22","name":"Corresp 22","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":26,"slug":"corresp-23","name":"Corresp 23","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":5,"slug":"corresp-3","name":"Corresp 3","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":6,"slug":"corresp-4","name":"Corresp 4","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":7,"slug":"corresp-5","name":"Corresp 5","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":8,"slug":"corresp-6","name":"Corresp 6","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":10,"slug":"corresp-7","name":"Corresp 7","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":11,"slug":"corresp-8","name":"Corresp 8","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":12,"slug":"corresp-9","name":"Corresp 9","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":17,"slug":"correspondent-14","name":"Correspondent 14","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0,"last_correspondence":null},{"id":2,"slug":"correspondent-2","name":"Correspondent 2","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":7,"last_correspondence":"2021-01-20T23:37:58.204614Z"},{"id":27,"slug":"michael-shamoon","name":"Michael Shamoon","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":1,"last_correspondence":"2022-03-16T03:48:50.089624Z"},{"id":4,"slug":"newest-correspondent","name":"Newest Correspondent","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":1,"last_correspondence":"2021-02-07T08:00:00Z"}]}

View File

@@ -1 +0,0 @@
{"count":1,"next":null,"previous":null,"results":[{"id":1,"slug":"test","name":"Test Doc Type","match":"","matching_algorithm":1,"is_insensitive":true,"document_count":0}]}

View File

@@ -1,46 +0,0 @@
[
{
"id": 10,
"comment": "Testing new comment",
"created": "2022-08-08T04:24:55.176008Z",
"user": {
"id": 1,
"username": "user2",
"firstname": "",
"lastname": ""
}
},
{
"id": 9,
"comment": "Testing one more time",
"created": "2022-02-18T04:24:55.176008Z",
"user": {
"id": 2,
"username": "user1",
"firstname": "",
"lastname": ""
}
},
{
"id": 8,
"comment": "Another comment",
"created": "2021-11-08T04:24:47.925042Z",
"user": {
"id": 2,
"username": "user33",
"firstname": "",
"lastname": ""
}
},
{
"id": 7,
"comment": "Cupcake ipsum dolor sit amet cheesecake candy cookie tiramisu. Donut chocolate chupa chups macaroon brownie halvah pie cheesecake gummies. Sweet chocolate bar candy donut gummi bears bear claw liquorice bonbon shortbread.\n\nDonut chocolate bar candy wafer wafer tiramisu. Gummies chocolate cake muffin toffee carrot cake macaroon. Toffee toffee jelly beans danish lollipop cake.",
"created": "2021-02-08T02:37:49.724132Z",
"user": {
"id": 3,
"username": "admin",
"firstname": "",
"lastname": ""
}
}
]

View File

@@ -1 +0,0 @@
{"original_checksum":"e959bc7d593245d92685213264e962ba","original_size":963754,"original_mime_type":"application/pdf","media_filename":"2022/lorem-ipsum.pdf","has_archive_version":true,"original_metadata":[],"archive_checksum":"5a1f46a9150bcade978c764b039ce4d0","archive_media_filename":"2022/lorem-ipsum.pdf","archive_size":351160,"archive_metadata":[{"namespace":"http://ns.adobe.com/pdf/1.3/","prefix":"pdf","key":"Producer","value":"pikepdf5.0.1"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"ModifyDate","value":"2022-03-22T04:53:18+00:00"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"CreateDate","value":"2022-03-22T18:05:43+00:00"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"CreatorTool","value":"ocrmypdf13.4.0/TesseractOCR-PDF4.1.1"},{"namespace":"http://ns.adobe.com/xap/1.0/mm/","prefix":"xmpMM","key":"DocumentID","value":"uuid:df27edcf-e34a-11f7-0000-8fa6067a3c04"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"format","value":"application/pdf"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"title","value":"ScannedDocument"},{"namespace":"http://www.aiim.org/pdfa/ns/id/","prefix":"pdfaid","key":"part","value":"2"},{"namespace":"http://www.aiim.org/pdfa/ns/id/","prefix":"pdfaid","key":"conformance","value":"B"},{"namespace":"http://purl.org/dc/elements/1.1/","prefix":"dc","key":"creator","value":"None"},{"namespace":"http://ns.adobe.com/xap/1.0/","prefix":"xmp","key":"MetadataDate","value":"2022-03-22T21:53:18.882551-07:00"}]}

View File

@@ -1 +0,0 @@
{"correspondents":[],"tags":[3],"document_types":[1]}

View File

@@ -1,73 +0,0 @@
{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"correspondent": 9,
"document_type": 1,
"storage_path": null,
"title": "No latin title",
"content": "Test document PDF \n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla est purus, ultrices in porttitor \nin, accumsan non quam. Nam consectetur porttitor rhoncus. Curabitur eu est et leo feugiat \nauctor vel quis lorem. Ut et ligula dolor, sit amet consequat lorem. Aliquam porta eros sed \nvelit imperdiet egestas. Maecenas tempus eros ut diam ullamcorper id dictum libero \ntempor. Donec quis augue quis magna condimentum lobortis. Quisque imperdiet ipsum vel \nmagna viverra rutrum. Cras viverra molestie urna, vitae vestibulum turpis varius id. \nVestibulum mollis, arcu iaculis bibendum varius, velit sapien blandit metus, ac posuere lorem \nnulla ac dolor. Maecenas urna elit, tincidunt in dapibus nec, vehicula eu dui. Duis lacinia \nfringilla massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur \nridiculus mus. Ut consequat ultricies est, non rhoncus mauris congue porta. Vivamus viverra \nsuscipit felis eget condimentum. Cum sociis natoque penatibus et magnis dis parturient \nmontes, nascetur ridiculus mus. Integer bibendum sagittis ligula, non faucibus nulla volutpat \nvitae. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. \nIn aliquet quam et velit bibendum accumsan. Cum sociis natoque penatibus et magnis dis \nparturient montes, nascetur ridiculus mus. Vestibulum vitae ipsum nec arcu semper \nadipiscing at ac lacus. Praesent id pellentesque orci. Morbi congue viverra nisl nec rhoncus. \nInteger mattis, ipsum a tincidunt commodo, lacus arcu elementum elit, at mollis eros ante ac \nrisus. In volutpat, ante at pretium ultricies, velit magna suscipit enim, aliquet blandit massa \norci nec lorem. Nulla facilisi. Duis eu vehicula arcu. Nulla facilisi. Maecenas pellentesque \nvolutpat felis, quis tristique ligula luctus vel. Sed nec mi eros. Integer augue enim, sollicitudin \nullamcorper mattis eget, aliquam in est. Morbi sollicitudin libero nec augue dignissim ut \nconsectetur dui volutpat. Nulla facilisi. Mauris egestas vestibulum neque cursus tincidunt. \nDonec sit amet pulvinar orci. \nQuisque volutpat pharetra tincidunt. Fusce sapien arcu, molestie eget varius egestas, \nfaucibus ac urna. Sed at nisi in velit egestas aliquam ut a felis. Aenean malesuada iaculis nisl, \nut tempor lacus egestas consequat. Nam nibh lectus, gravida sed egestas ut, feugiat quis \ndolor. Donec eu leo enim, non laoreet ante. Morbi dictum tempor vulputate. Phasellus \nultricies risus vel augue sagittis euismod. Vivamus tincidunt placerat nisi in aliquam. Cras \nquis mi ac nunc pretium aliquam. Aenean elementum erat ac metus commodo rhoncus. \nAliquam nulla augue, porta non sagittis quis, accumsan vitae sem. Phasellus id lectus tortor, \neget pulvinar augue. Etiam eget velit ac purus fringilla blandit. Donec odio odio, sagittis sed \niaculis sed, consectetur eget sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. \nMaecenas accumsan velit vel turpis rutrum in sodales diam placerat. \nQuisque luctus ullamcorper velit sit amet lobortis. Etiam ligula felis, vulputate quis rhoncus \nnec, fermentum eget odio. Vivamus vel ipsum ac augue sodales mollis euismod nec tellus. \nFusce et augue rutrum nunc semper vehicula vel semper nisl. Nam laoreet euismod quam at \nvarius. Sed aliquet auctor nibh. Curabitur malesuada fermentum lacus vel accumsan. Duis \nornare scelerisque nulla, ac pulvinar ligula tempus sit amet. In placerat nulla ac ante \nscelerisque posuere. Phasellus at ante felis. Sed hendrerit risus a metus posuere rutrum. \nPhasellus eu augue dui. Proin in vestibulum ipsum. Aenean accumsan mollis sapien, ut \neleifend sem blandit at. Vivamus luctus mi eget lorem lobortis pharetra. Phasellus at tortor \nquam, a volutpat purus. Etiam sollicitudin arcu vel elit bibendum et imperdiet risus tincidunt. \nEtiam elit velit, posuere ut pulvinar ac, condimentum eget justo. Fusce a erat velit. Vivamus \nimperdiet ultrices orci in hendrerit.",
"tags": [
4
],
"created": "2022-03-22T07:24:18Z",
"modified": "2022-03-22T07:24:23.264859Z",
"added": "2022-03-22T07:24:22.922631Z",
"archive_serial_number": null,
"original_file_name": "2022-03-22 no latin title.pdf",
"archived_file_name": "2022-03-22 no latin title.pdf"
},
{
"id": 2,
"correspondent": null,
"document_type": null,
"storage_path": 2,
"title": "lorem ipsum dolor sit amet",
"content": "Test document PDF",
"tags": [],
"created": "2022-03-23T07:24:18Z",
"modified": "2022-03-23T07:24:23.264859Z",
"added": "2022-03-23T07:24:22.922631Z",
"archive_serial_number": 12345,
"original_file_name": "2022-03-23 lorem ipsum dolor sit amet.pdf",
"archived_file_name": "2022-03-23 llorem ipsum dolor sit amet.pdf"
},
{
"id": 3,
"correspondent": null,
"document_type": 1,
"storage_path": null,
"title": "dolor",
"content": "Test document PDF",
"tags": [
2
],
"created": "2022-03-24T07:24:18Z",
"modified": "2022-03-24T07:24:23.264859Z",
"added": "2022-03-24T07:24:22.922631Z",
"archive_serial_number": null,
"original_file_name": "2022-03-24 dolor.pdf",
"archived_file_name": "2022-03-24 dolor.pdf"
},
{
"id": 4,
"correspondent": 9,
"document_type": 1,
"storage_path": null,
"title": "sit amet",
"content": "Test document PDF",
"tags": [
4, 5
],
"created": "2022-06-01T07:24:18Z",
"modified": "2022-06-01T07:24:23.264859Z",
"added": "2022-06-01T07:24:22.922631Z",
"archive_serial_number": 12347,
"original_file_name": "2022-06-01 sit amet.pdf",
"archived_file_name": "2022-06-01 sit amet.pdf"
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

View File

@@ -1,293 +0,0 @@
{
"selected_correspondents": [
{
"id": 62,
"document_count": 0
},
{
"id": 75,
"document_count": 0
},
{
"id": 55,
"document_count": 0
},
{
"id": 56,
"document_count": 0
},
{
"id": 73,
"document_count": 0
},
{
"id": 58,
"document_count": 0
},
{
"id": 44,
"document_count": 0
},
{
"id": 42,
"document_count": 0
},
{
"id": 74,
"document_count": 0
},
{
"id": 54,
"document_count": 0
},
{
"id": 29,
"document_count": 0
},
{
"id": 71,
"document_count": 0
},
{
"id": 68,
"document_count": 0
},
{
"id": 82,
"document_count": 0
},
{
"id": 34,
"document_count": 0
},
{
"id": 41,
"document_count": 0
},
{
"id": 51,
"document_count": 0
},
{
"id": 46,
"document_count": 0
},
{
"id": 40,
"document_count": 0
},
{
"id": 43,
"document_count": 0
},
{
"id": 80,
"document_count": 0
},
{
"id": 70,
"document_count": 0
},
{
"id": 52,
"document_count": 0
},
{
"id": 67,
"document_count": 0
},
{
"id": 53,
"document_count": 0
},
{
"id": 32,
"document_count": 0
},
{
"id": 63,
"document_count": 0
},
{
"id": 35,
"document_count": 0
},
{
"id": 45,
"document_count": 0
},
{
"id": 38,
"document_count": 0
},
{
"id": 79,
"document_count": 0
},
{
"id": 48,
"document_count": 0
},
{
"id": 72,
"document_count": 0
},
{
"id": 78,
"document_count": 0
},
{
"id": 39,
"document_count": 0
},
{
"id": 57,
"document_count": 0
},
{
"id": 61,
"document_count": 0
},
{
"id": 81,
"document_count": 0
},
{
"id": 77,
"document_count": 0
},
{
"id": 69,
"document_count": 0
},
{
"id": 36,
"document_count": 3
},
{
"id": 31,
"document_count": 0
},
{
"id": 30,
"document_count": 0
},
{
"id": 50,
"document_count": 0
},
{
"id": 49,
"document_count": 0
},
{
"id": 60,
"document_count": 0
},
{
"id": 47,
"document_count": 0
},
{
"id": 66,
"document_count": 0
},
{
"id": 37,
"document_count": 0
},
{
"id": 28,
"document_count": 0
},
{
"id": 59,
"document_count": 0
},
{
"id": 33,
"document_count": 0
},
{
"id": 76,
"document_count": 0
}
],
"selected_tags": [
{
"id": 4,
"document_count": 2
},
{
"id": 7,
"document_count": 0
},
{
"id": 5,
"document_count": 1
},
{
"id": 6,
"document_count": 0
},
{
"id": 3,
"document_count": 0
},
{
"id": 2,
"document_count": 1
},
{
"id": 1,
"document_count": 0
},
{
"id": 8,
"document_count": 0
}
],
"selected_document_types": [
{
"id": 4,
"document_count": 0
},
{
"id": 10,
"document_count": 0
},
{
"id": 2,
"document_count": 0
},
{
"id": 11,
"document_count": 0
},
{
"id": 9,
"document_count": 0
},
{
"id": 7,
"document_count": 2
},
{
"id": 3,
"document_count": 0
},
{
"id": 1,
"document_count": 0
},
{
"id": 5,
"document_count": 0
},
{
"id": 8,
"document_count": 1
}
],
"selected_storage_paths": []
}

View File

@@ -1,27 +0,0 @@
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "IMAP Server",
"imap_server": "imap.example.com",
"imap_port": 993,
"imap_security": 2,
"username": "inbox@example.com",
"password": "pass",
"character_set": "UTF-8"
},
{
"id": 2,
"name": "Gmail",
"imap_server": "imap.gmail.com",
"imap_port": 993,
"imap_security": 2,
"username": "user@gmail.com",
"password": "pass",
"character_set": "UTF-8"
}
]
}

View File

@@ -1,30 +0,0 @@
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "Gmail",
"account": 2,
"folder": "INBOX",
"filter_from": null,
"filter_subject": "[paperless]",
"filter_body": null,
"filter_attachment_filename": null,
"maximum_age": 30,
"action": 3,
"action_parameter": null,
"assign_title_from": 1,
"assign_tags": [
9
],
"assign_correspondent_from": 1,
"assign_correspondent": 2,
"assign_document_type": null,
"order": 0,
"attachment_type": 2,
"consumption_scope": 1
}
]
}

View File

@@ -1 +0,0 @@
{"version":"v1.7.1","update_available":false,"feature_is_set":true}

View File

@@ -1,44 +0,0 @@
{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "Inbox",
"show_on_dashboard": true,
"show_in_sidebar": true,
"sort_field": "created",
"sort_reverse": true,
"filter_rules": [
{
"rule_type": 6,
"value": "18"
}
]
},
{
"id": 2,
"name": "Recently Added",
"show_on_dashboard": true,
"show_in_sidebar": false,
"sort_field": "created",
"sort_reverse": true,
"filter_rules": []
},
{
"id": 11,
"name": "Taxes",
"show_on_dashboard": false,
"show_in_sidebar": true,
"sort_field": "created",
"sort_reverse": true,
"filter_rules": [
{
"rule_type": 6,
"value": "39"
}
]
}
]
}

View File

@@ -1,17 +0,0 @@
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"slug": "year-title",
"name": "Year - Title",
"path": "{created_year}/{title}",
"match": "",
"matching_algorithm": 6,
"is_insensitive": true,
"document_count": 1
}
]
}

View File

@@ -1,103 +0,0 @@
{
"count": 8,
"next": null,
"previous": null,
"results": [
{
"id": 4,
"slug": "another-sample-tag",
"name": "Another Sample Tag",
"color": "#a6cee3",
"text_color": "#000000",
"match": "",
"matching_algorithm": 6,
"is_insensitive": true,
"is_inbox_tag": false,
"document_count": 3
},
{
"id": 7,
"slug": "newone",
"name": "NewOne",
"color": "#9e4ad1",
"text_color": "#ffffff",
"match": "",
"matching_algorithm": 1,
"is_insensitive": true,
"is_inbox_tag": false,
"document_count": 2
},
{
"id": 6,
"slug": "partial-tag",
"name": "Partial Tag",
"color": "#72dba7",
"text_color": "#000000",
"match": "",
"matching_algorithm": 1,
"is_insensitive": true,
"is_inbox_tag": false,
"document_count": 1
},
{
"id": 2,
"slug": "tag-2",
"name": "Tag 2",
"color": "#612db7",
"text_color": "#ffffff",
"match": "",
"matching_algorithm": 1,
"is_insensitive": true,
"is_inbox_tag": false,
"document_count": 3
},
{
"id": 3,
"slug": "tag-3",
"name": "Tag 3",
"color": "#b2df8a",
"text_color": "#000000",
"match": "",
"matching_algorithm": 1,
"is_insensitive": true,
"is_inbox_tag": false,
"document_count": 4
},
{
"id": 5,
"slug": "tagwithpartial",
"name": "TagWithPartial",
"color": "#3b2db4",
"text_color": "#ffffff",
"match": "",
"matching_algorithm": 6,
"is_insensitive": true,
"is_inbox_tag": false,
"document_count": 2
},
{
"id": 8,
"slug": "test-another",
"name": "Test Another",
"color": "#3ccea5",
"text_color": "#000000",
"match": "",
"matching_algorithm": 4,
"is_insensitive": true,
"is_inbox_tag": false,
"document_count": 0
},
{
"id": 1,
"slug": "test-tag",
"name": "Test Tag",
"color": "#fb9a99",
"text_color": "#000000",
"match": "",
"matching_algorithm": 1,
"is_insensitive": true,
"is_inbox_tag": false,
"document_count": 4
}
]
}

View File

@@ -1,142 +0,0 @@
[
{
"id": 141,
"type": "file",
"result": "sample 2.pdf: Not consuming sample 2.pdf: It is a duplicate. : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ngx.nosync-udqDZzaE/lib/python3.8/site-packages/django_q/cluster.py\", line 432, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/paperless-ngx/src/documents/tasks.py\", line 316, in consume_file\n document = Consumer().try_consume_file(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 218, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 113, in pre_check_duplicate\n self._fail(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 84, in _fail\n raise ConsumerError(f\"{self.filename}: {log_message or message}\")\ndocuments.consumer.ConsumerError: sample 2.pdf: Not consuming sample 2.pdf: It is a duplicate.\n",
"status": "FAILURE",
"task_id": "d8ddbe298a42427d82553206ddf0bc94",
"task_file_name": "sample 2.pdf",
"date_created": "2022-05-26T23:17:38.333474-07:00",
"date_done": null,
"acknowledged": false,
"related_document": null
},
{
"id": 132,
"type": "file",
"result": " : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 131, in get_version\n env=env,\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 68, in run\n proc = subprocess_run(args, env=env, **kwargs)\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 423, in run\n with Popen(*popenargs, **kwargs) as process:\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 729, in __init__\n restore_signals, start_new_session)\n File \"/Users/admin/opt/anaconda3/envs/paperless-ng/lib/python3.6/subprocess.py\", line 1364, in _execute_child\n raise child_exception_type(errno_num, err_msg, err_filename)\nFileNotFoundError: [Errno 2] No such file or directory: 'unpaper': 'unpaper'\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 287, in check_external_program\n found_version = version_checker()\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_exec/unpaper.py\", line 34, in version\n return get_version('unpaper')\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 137, in get_version\n ) from e\nocrmypdf.exceptions.MissingDependencyError: Could not find program 'unpaper' on the PATH\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_tesseract/parsers.py\", line 176, in parse\n ocrmypdf.ocr(**ocr_args)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/api.py\", line 315, in ocr\n check_options(options, plugin_manager)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 260, in check_options\n _check_options(options, plugin_manager, ocr_engine_languages)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 250, in _check_options\n check_options_preprocessing(options)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/_validation.py\", line 128, in check_options_preprocessing\n required_for=['--clean, --clean-final'],\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/ocrmypdf/subprocess.py\", line 293, in check_external_program\n raise MissingDependencyError()\nocrmypdf.exceptions.MissingDependencyError\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 179, in try_consume_file\n document_parser.parse(self.path, mime_type, self.filename)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_tesseract/parsers.py\", line 197, in parse\n raise ParseError(e)\ndocuments.parsers.ParseError\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 73, in consume_file\n override_tag_ids=override_tag_ids)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 196, in try_consume_file\n raise ConsumerError(e)\ndocuments.consumer.ConsumerError\n",
"status": "FAILURE",
"task_id": "4c554075552c4cc985abd76e6f274c90",
"task_file_name": "pdf-sample 10.24.48 PM.pdf",
"date_created": "2022-05-26T14:26:07.846365-07:00",
"date_done": null,
"acknowledged": null
},
{
"id": 115,
"type": "file",
"result": "2021-01-24 2021-01-20 sample_wide_orange.pdf: Document is a duplicate : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 75, in consume_file\n task_id=task_id\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 168, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 85, in pre_check_duplicate\n self._fail(\"Document is a duplicate\")\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 53, in _fail\n raise ConsumerError(f\"{self.filename}: {message}\")\ndocuments.consumer.ConsumerError: 2021-01-24 2021-01-20 sample_wide_orange.pdf: Document is a duplicate\n",
"status": "FAILURE",
"task_id": "86494713646a4364b01da17aadca071d",
"task_file_name": "2021-01-24 2021-01-20 sample_wide_orange.pdf",
"date_created": "2022-05-26T14:26:07.817608-07:00",
"date_done": null,
"acknowledged": null
},
{
"id": 85,
"type": "file",
"result": "cannot open resource : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/django_q/cluster.py\", line 436, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/tasks.py\", line 81, in consume_file\n task_id=task_id\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/consumer.py\", line 244, in try_consume_file\n self.path, mime_type, self.filename)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/documents/parsers.py\", line 302, in get_optimised_thumbnail\n thumbnail = self.get_thumbnail(document_path, mime_type, file_name)\n File \"/Users/admin/Documents/Work/Contributions/paperless-ng/src/paperless_text/parsers.py\", line 29, in get_thumbnail\n layout_engine=ImageFont.LAYOUT_BASIC)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 852, in truetype\n return freetype(font)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 849, in freetype\n return FreeTypeFont(font, size, index, encoding, layout_engine)\n File \"/Users/admin/.local/share/virtualenvs/paperless-ng/lib/python3.6/site-packages/PIL/ImageFont.py\", line 210, in __init__\n font, size, index, encoding, layout_engine=layout_engine\nOSError: cannot open resource\n",
"status": "FAILURE",
"task_id": "abca803fa46342e1ac81f3d3f2080e79",
"task_file_name": "simple.txt",
"date_created": "2022-05-26T14:26:07.771541-07:00",
"date_done": null,
"acknowledged": null
},
{
"id": 41,
"type": "file",
"result": "commands.txt: Not consuming commands.txt: It is a duplicate. : Traceback (most recent call last):\n File \"/Users/admin/.local/share/virtualenvs/paperless-ngx.nosync-udqDZzaE/lib/python3.8/site-packages/django_q/cluster.py\", line 432, in worker\n res = f(*task[\"args\"], **task[\"kwargs\"])\n File \"/Users/admin/Documents/paperless-ngx/src/documents/tasks.py\", line 70, in consume_file\n document = Consumer().try_consume_file(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 199, in try_consume_file\n self.pre_check_duplicate()\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 97, in pre_check_duplicate\n self._fail(\n File \"/Users/admin/Documents/paperless-ngx/src/documents/consumer.py\", line 69, in _fail\n raise ConsumerError(f\"{self.filename}: {log_message or message}\")\ndocuments.consumer.ConsumerError: commands.txt: Not consuming commands.txt: It is a duplicate.\n",
"status": "FAILURE",
"task_id": "0af67672e8e14404b060d4cf8f69313d",
"task_file_name": "commands.txt",
"date_created": "2022-05-26T14:26:07.704247-07:00",
"date_done": null,
"acknowledged": null
},
{
"id": 10,
"type": "file",
"result": "Success. New document id 260 created",
"status": "SUCCESS",
"task_id": "b7629a0f41bd40c7a3ea4680341321b5",
"task_file_name": "2022-03-24+Sonstige+ScanPC2022-03-24_081058.pdf",
"date_created": "2022-05-26T14:26:07.670577-07:00",
"date_done": "2022-05-26T14:26:07.670577-07:00",
"acknowledged": false,
"related_document": 260
},
{
"id": 9,
"type": "file",
"result": "Success. New document id 261 created",
"status": "SUCCESS",
"task_id": "02e276a86a424ccfb83309df5d8594be",
"task_file_name": "2sample-pdf-with-images.pdf",
"date_created": "2022-05-26T14:26:07.668987-07:00",
"date_done": "2022-05-26T14:26:07.668987-07:00",
"acknowledged": false,
"related_document": 261
},
{
"id": 8,
"type": "file",
"result": "Success. New document id 262 created",
"status": "SUCCESS",
"task_id": "41229b8be9b445c0a523697d0f58f13e",
"task_file_name": "2sample-pdf-with-images_pw.pdf",
"date_created": "2022-05-26T14:26:07.667993-07:00",
"date_done": "2022-05-26T14:26:07.667993-07:00",
"acknowledged": false,
"related_document": 262
},
{
"id": 6,
"type": "file",
"result": "Success. New document id 264 created",
"status": "SUCCESS",
"task_id": "bbbca32d408c4619bd0b512a8327c773",
"task_file_name": "homebridge.log",
"date_created": "2022-05-26T14:26:07.665560-07:00",
"date_done": "2022-05-26T14:26:07.665560-07:00",
"acknowledged": false,
"related_document": 264
},
{
"id": 5,
"type": "file",
"result": "Success. New document id 265 created",
"status": "SUCCESS",
"task_id": "00ab285ab4bf482ab30c7d580b252ecb",
"task_file_name": "IMG_7459.PNG",
"date_created": "2022-05-26T14:26:07.664506-07:00",
"date_done": "2022-05-26T14:26:07.664506-07:00",
"acknowledged": false,
"related_document": 265
},
{
"id": 3,
"type": "file",
"result": "Success. New document id 267 created",
"status": "SUCCESS",
"task_id": "289c5163cfec410db42948a0cacbeb9c",
"task_file_name": "IMG_7459.PNG",
"date_created": "2022-05-26T14:26:07.659661-07:00",
"date_done": "2022-05-26T14:26:07.659661-07:00",
"acknowledged": false,
"related_document": 267
},
{
"id": 1,
"type": "file",
"result": null,
"status": "STARTED",
"task_id": "7a4ebdb2bde04311935284027ef8ca65",
"task_file_name": "2019-08-04 DSA Questionnaire - 5-8-19.pdf",
"date_created": "2022-05-26T14:26:07.655276-07:00",
"date_done": null,
"acknowledged": false,
"related_document": null
}
]

View File

@@ -1,34 +0,0 @@
{
"user_id": 1,
"username": "admin",
"display_name": "Admin",
"settings": {
"language": "",
"bulk_edit": {
"confirmation_dialogs": true,
"apply_on_close": false
},
"documentListSize": 50,
"dark_mode": {
"use_system": true,
"enabled": "false",
"thumb_inverted": "true"
},
"theme": {
"color": "#b198e5"
},
"document_details": {
"native_pdf_viewer": false
},
"date_display": {
"date_locale": "",
"date_format": "mediumDate"
},
"notifications": {
"consumer_new_documents": true,
"consumer_success": true,
"consumer_failed": true,
"consumer_suppress_on_dashboard": true
}
}
}

View File

@@ -1,3 +0,0 @@
// Plugins enable you to tap into, modify, or extend the internal behavior of Cypress
// For more info, visit https://on.cypress.io/plugins-api
module.exports = (on, config) => {}

View File

@@ -1,43 +0,0 @@
// ***********************************************
// This example namespace declaration will help
// with Intellisense and code completion in your
// IDE or Text Editor.
// ***********************************************
// declare namespace Cypress {
// interface Chainable<Subject = any> {
// customCommand(param: any): typeof customCommand;
// }
// }
//
// function customCommand(param: any): void {
// console.warn(param);
// }
//
// NOTE: You can use it like so:
// Cypress.Commands.add('customCommand', customCommand);
//
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add("login", (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })

View File

@@ -1,47 +0,0 @@
// mock API methods
beforeEach(() => {
cy.intercept('http://localhost:8000/api/ui_settings/', {
fixture: 'ui_settings/settings.json',
}).as('ui-settings')
cy.intercept('http://localhost:8000/api/remote_version/', {
fixture: 'remote_version/remote_version.json',
})
cy.intercept('http://localhost:8000/api/saved_views/*', {
fixture: 'saved_views/savedviews.json',
})
cy.intercept('http://localhost:8000/api/tags/*', {
fixture: 'tags/tags.json',
})
cy.intercept('http://localhost:8000/api/correspondents/*', {
fixture: 'correspondents/correspondents.json',
})
cy.intercept('http://localhost:8000/api/document_types/*', {
fixture: 'document_types/doctypes.json',
})
cy.intercept('http://localhost:8000/api/storage_paths/*', {
fixture: 'storage_paths/storage_paths.json',
})
cy.intercept('http://localhost:8000/api/tasks/', {
fixture: 'tasks/tasks.json',
})
cy.intercept('http://localhost:8000/api/documents/1/metadata/', {
fixture: 'documents/1/metadata.json',
})
cy.intercept('http://localhost:8000/api/documents/1/suggestions/', {
fixture: 'documents/1/suggestions.json',
})
cy.intercept('http://localhost:8000/api/documents/1/thumb/', {
fixture: 'documents/lorem-ipsum.png',
})
})

View File

@@ -1,8 +0,0 @@
{
"extends": "../tsconfig.json",
"include": ["**/*.ts"],
"compilerOptions": {
"sourceMap": false,
"types": ["cypress"]
}
}

View File

@@ -0,0 +1,61 @@
import { test, expect } from '@playwright/test'
const REQUESTS_HAR1 = 'e2e/dashboard/requests/api-dashboard1.har'
const REQUESTS_HAR2 = 'e2e/dashboard/requests/api-dashboard2.har'
const REQUESTS_HAR3 = 'e2e/dashboard/requests/api-dashboard3.har'
const REQUESTS_HAR4 = 'e2e/dashboard/requests/api-dashboard4.har'
test('dashboard inbox link', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR1, { notFound: 'fallback' })
await page.goto('/dashboard')
await page.getByRole('link', { name: 'Documents in inbox' }).click()
await expect(page).toHaveURL(/tags__id__all=9/)
await expect(page.locator('app-document-list')).toHaveText(/8 documents/)
})
test('dashboard total documents link', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR2, { notFound: 'fallback' })
await page.goto('/dashboard')
await page.getByRole('link').filter({ hasText: 'Total documents' }).click()
await expect(page).toHaveURL(/documents/)
await expect(page.locator('app-document-list')).toHaveText(/61 documents/)
await page.getByRole('button', { name: 'Reset filters' })
})
test('dashboard saved view show all', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR3, { notFound: 'fallback' })
await page.goto('/dashboard')
await page
.locator('app-widget-frame')
.filter({ hasText: 'Inbox' })
.getByRole('link', { name: 'Show all' })
.click()
await expect(page).toHaveURL(/view\/7/)
await expect(page.locator('app-document-list')).toHaveText(/8 documents/)
})
test('dashboard saved view document links', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR4, { notFound: 'fallback' })
await page.goto('/dashboard')
await page
.locator('app-widget-frame')
.filter({ hasText: 'Inbox' })
.locator('table')
.getByRole('link', { name: /test/ })
.first()
.click({ position: { x: 0, y: 0 } })
await expect(page).toHaveURL(/documents\/310\/details/)
})
test('test slim sidebar', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR1, { notFound: 'fallback' })
await page.goto('/dashboard')
await page.locator('#sidebarMenu').getByRole('button').click()
await expect(
page.getByRole('link', { name: 'Dashboard' }).getByText('Dashboard')
).toBeHidden()
await page.locator('#sidebarMenu').getByRole('button').click()
await expect(
page.getByRole('link', { name: 'Dashboard' }).getByText('Dashboard')
).toBeVisible()
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,141 @@
import { test, expect } from '@playwright/test'
const REQUESTS_HAR = 'e2e/document-detail/requests/api-document-detail.har'
const REQUESTS_HAR2 = 'e2e/document-detail/requests/api-document-detail2.har'
test('should activate / deactivate save button when changes are saved', async ({
page,
}) => {
await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' })
await page.goto('/documents/175/')
await page.waitForSelector('app-document-detail app-input-text:first-child')
await expect(page.getByTitle('Storage path', { exact: true })).toHaveText(
/\w+/
)
await expect(page.getByRole('button', { name: 'Save' })).toBeDisabled()
await page.getByTitle('Storage path').getByTitle('Clear all').click()
await expect(page.getByRole('button', { name: 'Save' })).toBeEnabled()
})
test('should warn on unsaved changes', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' })
await page.goto('/documents/175/')
await expect(page.getByTitle('Correspondent', { exact: true })).toHaveText(
/\w+/
)
await expect(page.getByRole('button', { name: 'Save' })).toBeDisabled()
await page
.getByTitle('Storage path', { exact: true })
.getByTitle('Clear all')
.click()
await expect(page.getByRole('button', { name: 'Save' })).toBeEnabled()
await page.getByRole('button', { name: 'Close' }).click()
await expect(page.getByRole('dialog')).toHaveText(/unsaved changes/)
await page.getByRole('button', { name: 'Cancel' }).click()
await page.getByRole('link', { name: 'Close all' }).click()
await expect(page.getByRole('dialog')).toHaveText(/unsaved changes/)
})
test('should support tab direct navigation', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' })
await page.goto('/documents/175/details')
await expect(page.getByRole('tab', { name: 'Details' })).toHaveAttribute(
'aria-selected',
'true'
)
await page.goto('/documents/175/content')
await expect(page.getByRole('tab', { name: 'Content' })).toHaveAttribute(
'aria-selected',
'true'
)
await page.goto('/documents/175/metadata')
await expect(page.getByRole('tab', { name: 'Metadata' })).toHaveAttribute(
'aria-selected',
'true'
)
await page.goto('/documents/175/notes')
await expect(page.getByRole('tab', { name: 'Notes' })).toHaveAttribute(
'aria-selected',
'true'
)
await page.goto('/documents/175/permissions')
await expect(page.getByRole('tab', { name: 'Permissions' })).toHaveAttribute(
'aria-selected',
'true'
)
})
test('should show a mobile preview', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' })
await page.goto('/documents/175/')
await page.setViewportSize({ width: 400, height: 1000 })
await expect(page.getByRole('tab', { name: 'Preview' })).toBeVisible()
await page.getByRole('tab', { name: 'Preview' }).click()
await page.waitForSelector('pdf-viewer')
})
test('should show a list of notes', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' })
await page.goto('/documents/175/notes')
await expect(page.locator('app-document-notes')).toBeVisible()
await expect(
await page.getByRole('button', {
name: /delete note/i,
includeHidden: true,
})
).toHaveCount(4)
})
test('should support note deletion', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' })
await page.goto('/documents/175/notes')
await expect(page.locator('app-document-notes')).toBeVisible()
const deletePromise = page.waitForRequest(
(request) =>
request.method() === 'DELETE' &&
request.url().includes('/api/documents/175/notes/')
)
await page
.getByRole('button', { name: /delete note/i, includeHidden: true })
.first()
.click()
await deletePromise
})
test('should support note insertion', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' })
await page.goto('/documents/175/notes')
await expect(page.locator('app-document-notes')).toBeVisible()
await expect(
await page.getByRole('button', {
name: /delete note/i,
includeHidden: true,
})
).toHaveCount(4)
await page.getByPlaceholder('Enter note').fill('This is a new note')
const addPromise = page.waitForRequest((request) => {
if (!request.url().includes('/notes/')) {
// ignore other requests
return true
} else {
const data = request.postDataJSON()
const isValid = data['note'] === 'This is a new note'
return (
isValid &&
request.method() === 'POST' &&
request.url().includes('/notes/')
)
}
})
await page.getByRole('button', { name: 'Add note' }).click()
await addPromise
})
test('should support quick filters', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR2, { notFound: 'fallback' })
await page.goto('/documents/175/details')
await page
.getByRole('button', { name: 'Filter documents with these Tags' })
.click()
await expect(page).toHaveURL(/tags__id__all=4&sort=created&reverse=1&page=1/)
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,192 @@
import { test, expect } from '@playwright/test'
const REQUESTS_HAR1 = 'e2e/document-list/requests/api-document-list1.har'
const REQUESTS_HAR2 = 'e2e/document-list/requests/api-document-list2.har'
const REQUESTS_HAR3 = 'e2e/document-list/requests/api-document-list3.har'
const REQUESTS_HAR4 = 'e2e/document-list/requests/api-document-list4.har'
const REQUESTS_HAR5 = 'e2e/document-list/requests/api-document-list5.har'
const REQUESTS_HAR6 = 'e2e/document-list/requests/api-document-list6.har'
test('basic filtering', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR1, { notFound: 'fallback' })
await page.goto('/documents')
await page.getByRole('button', { name: 'Tags' }).click()
await page.getByRole('menuitem', { name: 'Inbox' }).click()
await expect(page).toHaveURL(/tags__id__all=9/)
await expect(page.locator('app-document-list')).toHaveText(/8 documents/)
await page.getByRole('button', { name: 'Document type' }).click()
await page.getByRole('menuitem', { name: 'Invoice Test 3' }).click()
await expect(page).toHaveURL(/document_type__id__in=1/)
await expect(page.locator('app-document-list')).toHaveText(/3 documents/)
await page.getByRole('button', { name: 'Reset filters' }).first().click()
await page.getByRole('button', { name: 'Correspondent' }).click()
await page.getByRole('menuitem', { name: 'Test Correspondent 1' }).click()
await page.getByRole('menuitem', { name: 'Correspondent 9' }).click()
await expect(page).toHaveURL(/correspondent__id__in=12,1/)
await expect(page.locator('app-document-list')).toHaveText(/7 documents/)
await page
.locator('app-filter-editor')
.getByTitle('Correspondent')
.getByText('Exclude')
.click()
await expect(page).toHaveURL(/correspondent__id__none=12,1/)
await expect(page.locator('app-document-list')).toHaveText(/54 documents/)
// clear button
await page.getByRole('button', { name: '2 selected', exact: true }).click()
await expect(page.locator('app-document-list')).toHaveText(/61 documents/)
await page.getByRole('button', { name: 'Storage path' }).click()
await page.getByRole('menuitem', { name: 'Testing 12' }).click()
await expect(page).toHaveURL(/storage_path__id__in=5/)
await expect(page.locator('app-document-list')).toHaveText(/8 documents/)
await page.getByRole('button', { name: 'Reset filters' }).first().click()
await expect(page.locator('app-document-list')).toHaveText(/61 documents/)
})
test('text filtering', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR2, { notFound: 'fallback' })
await page.goto('/documents')
await page.getByRole('textbox').click()
await page.getByRole('textbox').fill('test')
await expect(page.locator('app-document-list')).toHaveText(/32 documents/)
await expect(page).toHaveURL(/title_content=test/)
await page.getByRole('button', { name: 'Title & content' }).click()
await page.getByRole('button', { name: 'Title', exact: true }).click()
await expect(page.locator('app-document-list')).toHaveText(/9 documents/)
await expect(page).toHaveURL(/title__icontains=test/)
await page.getByRole('button', { name: 'Title', exact: true }).click()
await page.getByRole('button', { name: 'Advanced search' }).click()
await expect(page).toHaveURL(/query=test/)
await expect(page.locator('app-document-list')).toHaveText(/26 documents/)
await page.getByRole('button', { name: 'Advanced search' }).click()
await page.getByRole('button', { name: 'ASN' }).click()
await page.getByRole('textbox').fill('1123')
await expect(page).toHaveURL(/archive_serial_number=1123/)
await expect(page.locator('app-document-list')).toHaveText(/one document/i)
await page.locator('select').selectOption('greater')
await page.getByRole('textbox').click()
await page.getByRole('textbox').fill('1123')
await expect(page).toHaveURL(/archive_serial_number__gt=1123/)
await expect(page.locator('app-document-list')).toHaveText(/5 documents/)
await page.locator('select').selectOption('less')
await expect(page).toHaveURL(/archive_serial_number__lt=1123/)
await expect(page.locator('app-document-list')).toHaveText(/0 documents/)
await page.locator('select').selectOption('is null')
await expect(page).toHaveURL(/archive_serial_number__isnull=1/)
await expect(page.locator('app-document-list')).toHaveText(/55 documents/)
await page.locator('select').selectOption('not null')
await expect(page).toHaveURL(/archive_serial_number__isnull=0/)
await expect(page.locator('app-document-list')).toHaveText(/6 documents/)
})
test('date filtering', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR3, { notFound: 'fallback' })
await page.goto('/documents')
await page.getByRole('button', { name: 'Created' }).click()
await page.getByRole('menuitem', { name: 'Last 3 months' }).click()
await expect(page.locator('app-document-list')).toHaveText(/one document/i)
await page.getByRole('button', { name: 'Created Clear selected' }).click()
await page.getByRole('button', { name: 'Created' }).click()
await page
.getByRole('menuitem', { name: 'After mm/dd/yyyy' })
.getByRole('button')
.click()
await page.getByRole('combobox', { name: 'Select month' }).selectOption('12')
await page.getByRole('combobox', { name: 'Select year' }).selectOption('2022')
await page.getByText('11', { exact: true }).click()
await page.getByRole('button', { name: 'Title & content' }).click()
await expect(page.locator('app-document-list')).toHaveText(/2 documents/)
})
test('sorting', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR4, { notFound: 'fallback' })
await page.goto('/documents')
await page.getByRole('button', { name: 'Sort' }).click()
await page.getByRole('button', { name: 'ASN' }).click()
await expect(page).toHaveURL(/sort=archive_serial_number/)
await page.getByRole('button', { name: 'Sort' }).click()
await page
.locator('app-page-header')
.getByRole('button', { name: 'Correspondent' })
.click()
await expect(page).toHaveURL(/sort=correspondent__name/)
await page.getByRole('button', { name: 'Sort' }).click()
await page.getByRole('button', { name: 'Title', exact: true }).click()
await expect(page).toHaveURL(/sort=title/)
await page.getByRole('button', { name: 'Sort' }).click()
await page
.locator('app-page-header')
.getByRole('button', { name: 'Document type' })
.click()
await expect(page).toHaveURL(/sort=document_type__name/)
await page.getByRole('button', { name: 'Sort' }).click()
await page.getByRole('button', { name: 'Created', exact: true }).click()
await expect(page).toHaveURL(/sort=created/)
await page.getByRole('button', { name: 'Sort' }).click()
await page.getByRole('button', { name: 'Added', exact: true }).click()
await expect(page).toHaveURL(/sort=added/)
await page.getByRole('button', { name: 'Sort' }).click()
await page.getByRole('button', { name: 'Modified' }).click()
await expect(page).toHaveURL(/sort=modified/)
await page.getByRole('button', { name: 'Sort' }).click()
await page.getByRole('button', { name: 'Notes' }).click()
await expect(page).toHaveURL(/sort=num_notes/)
await page.getByRole('button', { name: 'Sort' }).click()
await page.locator('.w-100 > label > .toolbaricon').first().click()
await expect(page).not.toHaveURL(/reverse=1/)
})
test('change views', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR5, { notFound: 'fallback' })
await page.goto('/documents')
await page.locator('app-page-header label').first().click()
await expect(page.locator('app-document-list table')).toBeVisible()
await page.locator('app-page-header label').nth(1).click()
await expect(page.locator('app-document-card-small').first()).toBeAttached()
await page.locator('app-page-header label').nth(2).click()
await expect(page.locator('app-document-card-large').first()).toBeAttached()
})
test('bulk edit', async ({ page }) => {
await page.routeFromHAR(REQUESTS_HAR6, { notFound: 'fallback' })
await page.goto('/documents')
await page.locator('app-document-card-small').nth(0).click()
await page
.locator('app-document-card-small')
.nth(3)
.click({
modifiers: ['Shift'],
})
await expect(page.locator('app-document-list')).toHaveText(
/Selected 4 of 61 documents/i
)
await page.getByRole('button', { name: 'Page' }).click()
await expect(page.locator('app-document-list')).toHaveText(
/Selected 50 of 61 documents/i
)
await page.getByRole('button', { name: 'All' }).click()
await expect(page.locator('app-document-list')).toHaveText(
/Selected 61 of 61 documents/i
)
await page.getByRole('button', { name: 'Cancel' }).click()
await page.locator('app-document-card-small').nth(1).click()
await page.locator('app-document-card-small').nth(2).click()
await page.getByRole('button', { name: 'Tags' }).click()
await page.getByRole('menuitem', { name: 'TagWithPartial' }).click()
await page.getByRole('button', { name: 'Apply' }).click()
const bulkEditPromise = page.waitForRequest((request) => {
const postData = request.postDataJSON()
let isValid = postData['method'] == 'modify_tags'
isValid = isValid && postData['parameters']['add_tags'].includes(5)
return request.url().toString().includes('bulk_edit') && isValid
})
await page.getByRole('button', { name: 'Confirm' }).click()
await bulkEditPromise
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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