Compare commits

...
130 Commits
Author SHA1 Message Date
Jonas Winkler 3050ed3cb2 Update README.md 2023-01-12 13:26:31 +01:00
Jonas Winkler 7bc8325df9 Merge pull request #1311 from mattlamb99/patch-1
Incorrect path to docker-compose files
2021-09-14 21:34:36 +02:00
Matt Lamb 2aca64bfcd Incorrect path to docker-compose files 2021-09-13 16:33:46 +12:00
Jonas Winkler d656de8883 Merge pull request #1258 from tribut/logout-url
Add PAPERLESS_LOGOUT_REDIRECT_URL
2021-09-10 20:36:21 +02:00
Jonas Winkler 32f0ebaac3 Merge pull request #1270 from ajkavanagh/fix-ansible-role-gotenberg-endpoint
Fix PAPERLESS_TIKA_GOTENBERG_ENDPOINT in a/t/main.yml
2021-09-10 20:35:35 +02:00
Jonas Winkler 4e9c4ebd02 Merge pull request #1274 from padraigkitterick/patch-1
Updated docker instructions re webserver port
2021-09-10 20:28:47 +02:00
Pádraig Kitterick 12abb592be Updated docker instructions re webserver port
Clarified exactly what to change to modify the default webserver port (issue #1273)
2021-08-31 14:36:55 +01:00
Alex Kavanagh 4f0951402a Fix PAPERLESS_TIKA_GOTENBERG_ENDPOINT in a/t/main.yml
This fixes the ansible role for installing paperless-ng where the config
item PAPERLESS_TIKA_GOTENBERG_ENDPOINT derived from the wrong ansible
variable "paperlessng_tika_endpoint".  This patch corrects that to
"paperlessng_tika_gotenberg_endpoint".
2021-08-30 18:01:33 +01:00
Felix Eckhofer bf2cdae3b1 Add PAPERLESS_LOGOUT_REDIRECT_URL
When set, the user is redirected to this URL after a logout. Especially
useful in conjunction with PAPERLESS_ENABLE_HTTP_REMOTE_USER and SSO.
2021-08-26 18:40:12 +02:00
jonaswinkler cd43bc1f66 changelog 2021-08-22 17:15:14 +02:00
jonaswinkler 1b24136590 version bump 2021-08-22 17:11:36 +02:00
jonaswinkler e8d5b549de documentation 2021-08-22 17:10:10 +02:00
jonaswinkler 3866a77d68 Merge branch 'master' into dev 2021-08-22 17:03:58 +02:00
jonaswinkler 360fe68f92 fix whitespace 2021-08-22 17:03:45 +02:00
Jonas Winkler c9229f9c80 Merge pull request #1066 from holzhannes/patch-3
Info for The input device is not a TTY Errors
2021-08-22 17:02:08 +02:00
Jonas WinklerandStéphane Brunner e5b92d895d Update docs/administration.rst
Co-authored-by: Stéphane Brunner <stephane.brunner@camptocamp.com>
2021-08-22 17:00:36 +02:00
jonaswinkler a7643c1c29 Merge branch 'master' into dev 2021-08-22 16:27:59 +02:00
jonaswinkler 45fd4e8565 fix whitespace 2021-08-22 16:27:44 +02:00
jonaswinkler 211a9d720a changelog 2021-08-22 16:26:58 +02:00
Jonas Winkler da9c2735b4 Merge pull request #1201 from pewter77/patch-1
update configuration docs for languages
2021-08-22 16:26:27 +02:00
jonaswinkler d31baca442 downgrade numpy due to armv7 issues 2021-08-19 16:18:49 +02:00
jonaswinkler 499d6f79aa Merge remote-tracking branch 'origin/master' into dev 2021-08-19 00:06:47 +02:00
jonaswinkler 49e049f1c5 Merge branch 'dev' of github.com:jonaswinkler/paperless-ng into dev 2021-08-19 00:06:37 +02:00
jonaswinkler 7411d7c1e2 update dependencies 2021-08-19 00:06:23 +02:00
Jonas Winkler 3f5d3d15fd Merge pull request #1209 from Unkn0wnCat/patch-1
Add Doxie Q to scanners.rst
2021-08-18 23:53:14 +02:00
Jonas Winkler 68fb85ceca Merge pull request #1221 from AlD/master
Make ignores configurable
2021-08-18 22:41:27 +02:00
Daniel Albers 3ebe6d5aef Make ignores configurable
Adds config file setting PAPERLESS_CONSUMER_IGNORE_PATTERNS.
2021-08-18 22:23:18 +02:00
jonaswinkler 566b3ed53d Merge branch 'dev' of github.com:jonaswinkler/paperless-ng into dev 2021-08-18 22:03:31 +02:00
Jonas Winkler a688c747d7 New Crowdin updates (#1198) 2021-08-18 21:56:59 +02:00
jonaswinkler 83b90e1416 install required dependency for building paperless-ng on GitHub CI 2021-08-18 18:40:27 +02:00
jonaswinkler 23c6f849d6 fix bug with DPI calculation 2021-08-18 18:33:33 +02:00
jonaswinkler ba6843df83 update python dependencies 2021-08-18 18:21:41 +02:00
jonaswinkler 0b90e69119 update dockerfile 2021-08-18 18:21:31 +02:00
jonaswinkler dbe820323e switch to python 3.9 2021-08-18 17:47:53 +02:00
Kevin Kandlbinder 47d95d5b0a Add Doxie Q to scanners.rst
The Doxie Q / Q2 is a budget-scanner I've been using for my paperless-usage. It has POST-Support to a custom endpoint like paperless over WiFi and has a rather open API (See https://help.getdoxie.com/doxieq/wifi/api/).
2021-08-04 15:23:12 +02:00
pewter77 971192f6f3 update configuration docs for languages
Due to tesseract naming scheme, packages use '-' but the internal OCR uses '_' . This is to clarify in the documentation that this is the case for new users.
2021-07-30 23:21:22 +08:00
Jonas Winkler fbfc7df593 Merge pull request #1173 from mweimerskirch/feature/l10n-lb_LU
Added support for Luxembourgish (lb_LU) as an interface language
2021-07-18 21:42:58 +02:00
Jonas Winkler 3c7644ce79 Merge pull request #1153 from jonaswinkler/l10n_dev
New Crowdin updates
2021-07-18 17:36:14 +02:00
Jonas Winkler 4e4a8bcca8 New translations messages.xlf (Luxembourgish)
[ci skip]
2021-07-16 17:20:14 +02:00
Michel Weimerskirch dc5586b16d Added support for Luxembourgish (lb_LU) as an interface language 2021-07-16 16:43:55 +02:00
Jonas Winkler 1d87b48471 New translations messages.xlf (Luxembourgish)
[ci skip]
2021-07-16 16:22:10 +02:00
Jonas Winkler 353a3432df New translations django.po (Luxembourgish)
[ci skip]
2021-07-16 16:22:08 +02:00
Jonas Winkler efe94bbf18 New translations messages.xlf (Luxembourgish)
[ci skip]
2021-07-16 15:01:08 +02:00
Jonas Winkler cea6ec09bc New translations django.po (Luxembourgish)
[ci skip]
2021-07-16 15:01:07 +02:00
Jonas Winkler 4a3276f69c New translations messages.xlf (Luxembourgish)
[ci skip]
2021-07-16 13:47:43 +02:00
Jonas Winkler f164def2ed New translations django.po (Luxembourgish)
[ci skip]
2021-07-16 13:47:42 +02:00
Jonas Winkler 511c76ae7a New translations messages.xlf (Luxembourgish)
[ci skip]
2021-07-15 10:58:18 +02:00
Jonas Winkler bfa6dda0de New translations django.po (Luxembourgish)
[ci skip]
2021-07-15 10:58:16 +02:00
Jonas Winkler 54af734971 New translations django.po (Luxembourgish)
[ci skip]
2021-07-15 09:42:47 +02:00
Jonas Winkler 5b9763ecb4 New translations messages.xlf (Luxembourgish)
[ci skip]
2021-07-14 18:00:31 +02:00
Jonas Winkler 438bad23e8 New translations django.po (Luxembourgish)
[ci skip]
2021-07-14 18:00:29 +02:00
Jonas Winkler ae5a205ba3 New translations django.po (Luxembourgish)
[ci skip]
2021-07-14 10:42:55 +02:00
Jonas Winkler 19b683e7b0 New translations messages.xlf (Luxembourgish)
[ci skip]
2021-07-13 23:45:12 +02:00
Jonas Winkler 0c92027414 New translations django.po (Luxembourgish)
[ci skip]
2021-07-13 23:45:11 +02:00
Jonas Winkler c4e3b2ca2f New translations messages.xlf (Luxembourgish)
[ci skip]
2021-07-13 22:18:15 +02:00
Jonas Winkler ba67b89db7 New translations django.po (Luxembourgish)
[ci skip]
2021-07-13 22:18:14 +02:00
Jonas Winkler 06f308ede3 New translations messages.xlf (Spanish)
[ci skip]
2021-07-11 12:20:36 +02:00
Jonas Winkler 214fb8204b New translations messages.xlf (Spanish)
[ci skip]
2021-07-11 10:29:21 +02:00
Jonas Winkler 2a2d7be9f9 New translations django.po (Spanish)
[ci skip]
2021-07-11 10:29:20 +02:00
Jonas Winkler 23304c3746 New translations django.po (Spanish)
[ci skip]
2021-07-11 09:21:44 +02:00
Jonas Winkler 20829c90b2 New translations django.po (German)
[ci skip]
2021-07-05 13:17:50 +02:00
Jonas Winkler 33cc3ce7e0 Merge pull request #1127 from jonaswinkler/l10n_dev
New Crowdin updates
2021-07-04 12:47:07 +02:00
Jonas Winkler 3487b23e88 New translations django.po (English, United Kingdom)
[ci skip]
2021-06-19 23:20:13 +02:00
Jonas Winkler 4718fe13c2 Merge pull request #1116 from ytzelf/patch-1
Update scanners.rst
2021-06-14 18:18:57 +02:00
ytzelf 8592acf6b8 Update scanners.rst
Added ADS-1100w which has FTP (and only FTP) capabilities but is quite cheap
2021-06-14 18:11:06 +02:00
jonaswinkler 88042d7072 fix wording 2021-06-13 21:30:20 +02:00
jonaswinkler bf92e52d5c update dependencies 2021-06-13 21:21:56 +02:00
jonaswinkler 419580b3be changelog, versions 2021-06-13 19:17:29 +02:00
jonaswinkler 5ee1f6b82b Merge branch 'normalize-whitespace' into dev 2021-06-13 19:06:08 +02:00
Michael Lynch 410bb6a84e Fix trailing newlines in configuration.rst 2021-06-13 10:57:58 -04:00
Michael Lynch af2b5fef13 Add checkout step to whitespace CI job 2021-06-13 10:57:40 -04:00
Michael Lynch 372ac3a40c Normalize whitespace in source files
Ensure that no source files have trailing whitespace at end of lines and ensure that all files end with a single trailing newline.

This also adds Github Actions to enforce whitespace conventions.
2021-06-13 10:57:40 -04:00
jonaswinkler a1507d6079 update django-q 2021-06-13 16:36:05 +02:00
jonaswinkler 9242a8901a update django-q 2021-06-13 15:43:32 +02:00
jonaswinkler 1d4f25f930 update datepipe implementation due to interface change 2021-06-13 15:27:04 +02:00
jonaswinkler 7323ec8d16 update angular devkit 2021-06-13 15:18:23 +02:00
jonaswinkler 39d45367d0 replace ng-bootstrap with ngx-bootstrap 2021-06-13 15:12:56 +02:00
jonaswinkler a6521952b0 update to Angular 11 2021-06-13 15:08:56 +02:00
jonaswinkler 7148c10f1b update docker entrypoint 2021-06-13 12:54:24 +02:00
jonaswinkler 4a1a66248d update requirements.txt 2021-06-13 12:40:28 +02:00
Jonas Winkler 67d0773231 Merge pull request #933 from sbrunner/suggest
Add suggest
2021-06-13 12:20:34 +02:00
jonaswinkler ff370172b5 fix pycodestyle 2021-06-13 12:18:21 +02:00
jonaswinkler 1f707e86cc fix logging getting spammed with pdfminer warnings on JPG files 2021-06-13 12:09:16 +02:00
jonaswinkler a3dae02cfb write classifier model to temporary file before copying to final location 2021-06-13 12:03:20 +02:00
jonaswinkler 3eae8a2210 update dependencies 2021-06-13 12:02:49 +02:00
Jonas Winkler 0f18fe1853 Merge pull request #1107 from MJWcodr/patch-1
Update setup.rst
2021-06-13 11:34:03 +02:00
Jonas Winkler 513c61eb79 Merge pull request #1113 from magnetic6/master
Document specification of the expected creation date order
2021-06-13 11:33:43 +02:00
Peter M 4031233fd4 Document specification of the expected creation date order 2021-06-12 10:15:51 -04:00
Matthias J. Wünsch 76ff6100a3 Update setup.rst 2021-06-09 16:46:53 +02:00
Jonas Winkler 05c36f91cf Merge pull request #1105 from mtlynch/single-install-cmd
Simplify installation command
2021-06-07 00:48:29 +02:00
Michael Lynch 6625f8962a Simplify installation command
The installation for docker is currently three separate commands, but it can be a single command if the user simply pipes to the sh interpreter directly. I know there are some who object to piping to sh from a URL, but the current method has no security benefit over piping directly to sh.
2021-06-06 18:02:23 -04:00
Jonas Winkler 63402b70d2 Merge pull request #1057 from muued/patch-6
adjust ansible README to installation instructions
2021-06-03 15:14:36 +02:00
Stéphane Brunner 2ae4a7806d Add suggest 2021-05-30 14:50:29 +02:00
Jonas Winkler fcc4ecd007 Merge pull request #1068 from servusoft/dev
Solving issue with search criteria 'maximum age' for some mail server
2021-05-29 19:13:10 +02:00
Jonas Winkler 45497250cd Merge pull request #1074 from sbrunner/scan-to-paperless
Add Scan to Paperless as affiliated project
2021-05-29 19:12:46 +02:00
Stéphane Brunner 7dd957140e Add Scan to Paperless as affiliated project 2021-05-29 16:38:16 +02:00
servusoft 4cd772a39e Solving issue with search criteria maximum age for some mail server
Some mail servers (mail.ru) do not support search criteria for the maximum age. By setting the maximum age to 0, it is possible to hide the search criteria. This PR solves that problem.
2021-05-27 18:30:57 +02:00
HolzHannes b3906e7bc1 Corrected position of info 2021-05-27 10:01:30 +02:00
HolzHannes e5009b4cd2 Info for The input device is not a TTY Errors 2021-05-27 08:30:21 +02:00
Fabian Ohler 10bf9fd1f8 Adjusted paperlessng_version variable explanation 2021-05-26 08:30:17 +02:00
Jonas Winkler bd8e68692e New translations django.po (Dutch) (#1048) 2021-05-25 00:01:38 +02:00
Jonas Winkler b8386a1531 Merge pull request #1052 from muued/patch-5
Use ansible-galaxy during updates
2021-05-25 00:01:20 +02:00
Fabian OhlerandFabian Koller 61534fb29d Apply suggestions from code review
Co-authored-by: Fabian Koller <C0nsultant@users.noreply.github.com>
2021-05-24 15:27:11 +02:00
Fabian Ohler 9ad81be38c adjust ansible README to installation instructions
and fix some typos
2021-05-24 15:10:41 +02:00
Fabian Ohler cf7048e336 Use ansible-galaxy during updates
This mechanism is already used for the installation process.
2021-05-22 23:29:44 +02:00
jonaswinkler a6105b3ad3 update frontend dependencies 2021-05-21 15:27:10 +02:00
jonaswinkler a262a82cad Merge branch 'dev' of github.com:jonaswinkler/paperless-ng into dev 2021-05-19 23:11:43 +02:00
jonaswinkler 635c96accf better exception handling 2021-05-19 23:11:24 +02:00
Jonas Winkler 5c174a69c2 New Crowdin updates (#1043) 2021-05-19 23:00:51 +02:00
jonaswinkler de08d17835 changelog 2021-05-19 23:00:03 +02:00
jonaswinkler ca1e838c52 catch another exception regarding classifier loading 2021-05-19 22:57:52 +02:00
jonaswinkler 3b73146ecd changelog and version bump 2021-05-19 22:40:56 +02:00
jonaswinkler 8e3822f8e6 Merge remote-tracking branch 'origin/master' into dev 2021-05-19 22:37:01 +02:00
jonaswinkler 3b912a0de1 improved docker startup time 2021-05-19 22:26:51 +02:00
jonaswinkler c72791bd21 Fix file permissions 2021-05-19 22:05:23 +02:00
jonaswinkler 80ba5b561f codestyle 2021-05-19 20:26:12 +02:00
jonaswinkler f9f4d4c937 Merge branch 'dev' of github.com:jonaswinkler/paperless-ng into dev 2021-05-19 20:03:05 +02:00
jonaswinkler 0419c52d35 fix file permissions 2021-05-19 20:02:56 +02:00
jonaswinkler 93a79be1e2 delete macOS specific files 2021-05-19 20:02:47 +02:00
jonaswinkler f8afbae2cd ignore macOS specific files 2021-05-19 19:56:01 +02:00
jonaswinkler 4a52d346f9 remove dead code 2021-05-19 19:55:35 +02:00
Jonas Winkler 7d59d11725 New Crowdin updates (#1026) 2021-05-18 14:46:12 +02:00
Jonas Winkler 5886348188 Merge pull request #1034 from steviehs/patch-1
Update setup.rst
2021-05-18 14:45:52 +02:00
steviehs a8135528b1 Update setup.rst
Added hint to upgrade pip first.
2021-05-17 09:07:31 +02:00
jonaswinkler df6b991161 File permissions 2021-05-16 23:01:41 +02:00
Jonas Winkler 3f33f66387 New Crowdin updates (#1023) 2021-05-16 13:13:54 +02:00
jonaswinkler 870808f3c2 add support for configuring mail server character set per server. fixes #548 2021-05-16 11:58:32 +02:00
Jonas Winkler b12fcca20d Merge remote-tracking branch 'origin/dev' into dev 2021-05-16 01:23:07 +02:00
Jonas Winkler 61b47e358f correct file mode 2021-05-16 01:22:51 +02:00
Jonas Winkler 40a2fb7936 New Crowdin updates (#1022) 2021-05-15 21:14:03 +02:00
135 changed files with 27199 additions and 6713 deletions

No files matched your search

+1 -1
View File
@@ -1 +1 @@
COMPOSE_PROJECT_NAME=paperless COMPOSE_PROJECT_NAME=paperless
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
# Verify that all text files end in a trailing newline.
# Exit on first failing command.
set -e
# Exit on unset variable.
set -u
success=0
function is_plaintext_file() {
local file="$1"
if [[ $file == *.svg ]]; then
echo ""
return
fi
file --brief "${file}" | grep text
}
# Split strings on newlines.
IFS='
'
for file in $(git ls-files)
do
if [[ -z $(is_plaintext_file "${file}") ]]; then
continue
fi
if ! [[ -z "$(tail -c 1 "${file}")" ]]; then
printf "File must end in a trailing newline: %s\n" "${file}" >&2
success=255
fi
done
exit "${success}"
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
# Check for trailing whitespace at end of lines.
# Exit on first failing command.
set -e
# Exit on unset variable.
set -u
FOUND_TRAILING_WHITESPACE=0
while read -r line; do
if grep \
"\s$" \
--line-number \
--with-filename \
--binary-files=without-match \
--exclude="*.svg" \
--exclude="*.eps" \
"${line}"; then
echo "ERROR: Found trailing whitespace" >&2;
FOUND_TRAILING_WHITESPACE=1
fi
done < <(git ls-files)
exit "${FOUND_TRAILING_WHITESPACE}"
+21 -7
View File
@@ -20,7 +20,7 @@ jobs:
name: Set up Python name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.9
- -
name: Get pip cache dir name: Get pip cache dir
id: pip-cache id: pip-cache
@@ -59,7 +59,7 @@ jobs:
name: Set up Python name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.9
- -
name: Get pip cache dir name: Get pip cache dir
id: pip-cache id: pip-cache
@@ -81,12 +81,26 @@ jobs:
run: | run: |
cd src/ cd src/
pycodestyle pycodestyle
whitespace:
runs-on: ubuntu-20.04
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Ensure there are no trailing spaces
run: |
.github/workflow-scripts/check-trailing-whitespace
-
name: Ensure all text files end with a trailing newline
run: |
.github/workflow-scripts/check-trailing-whitespace
tests: tests:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
strategy: strategy:
matrix: matrix:
python-version: ['3.6', '3.7', '3.8', '3.9'] python-version: ['3.7', '3.8', '3.9']
fail-fast: false fail-fast: false
steps: steps:
- -
@@ -122,7 +136,7 @@ jobs:
pytest pytest
- -
name: Publish coverage results name: Publish coverage results
if: matrix.python-version == '3.8' if: matrix.python-version == '3.9'
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# https://github.com/coveralls-clients/coveralls-python/issues/251 # https://github.com/coveralls-clients/coveralls-python/issues/251
@@ -158,7 +172,7 @@ jobs:
path: src/documents/static/frontend/ path: src/documents/static/frontend/
build-release: build-release:
needs: [frontend, documentation, tests, codestyle] needs: [frontend, documentation, tests, whitespace, codestyle]
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- -
@@ -168,7 +182,7 @@ jobs:
name: Set up Python name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: 3.7 python-version: 3.9
- -
name: Install dependencies name: Install dependencies
run: | run: |
@@ -268,7 +282,7 @@ jobs:
build-docker-image: build-docker-image:
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || github.ref == 'refs/heads/dev' || startsWith(github.ref, 'refs/tags/ng-')) if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || github.ref == 'refs/heads/dev' || startsWith(github.ref, 'refs/tags/ng-'))
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [frontend, tests, codestyle] needs: [frontend, tests, whitespace, codestyle]
steps: steps:
- -
name: Prepare name: Prepare
+3 -8
View File
@@ -8,7 +8,7 @@ RUN git clone https://github.com/agl/jbig2enc .
RUN ./autogen.sh RUN ./autogen.sh
RUN ./configure && make RUN ./configure && make
FROM python:3.7-slim FROM python:3.9-slim-bullseye
# Binary dependencies # Binary dependencies
RUN apt-get update \ RUN apt-get update \
@@ -33,16 +33,11 @@ RUN apt-get update \
zlib1g \ zlib1g \
ghostscript \ ghostscript \
icc-profiles-free \ icc-profiles-free \
&& echo "deb http://deb.debian.org/debian bullseye main" > /etc/apt/sources.list.d/bullseye.list \ # Mime type detection
&& apt-get update \
&& apt-get -y --no-install-recommends install \
# fixes sudo / gosu issues
libseccomp2 \
# Mime type detection
file \ file \
libmagic-dev \ libmagic-dev \
media-types \ media-types \
# OCRmyPDF dependencies # OCRmyPDF dependencies
liblept5 \ liblept5 \
qpdf \ qpdf \
tesseract-ocr \ tesseract-ocr \
+7 -9
View File
@@ -14,15 +14,14 @@ django = "~=3.2"
django-cors-headers = "*" django-cors-headers = "*"
django-extensions = "*" django-extensions = "*"
django-filter = "~=2.4.0" django-filter = "~=2.4.0"
django-q = "==1.3.4" django-q = "~=1.3.4"
djangorestframework = "~=3.12.2" djangorestframework = "~=3.12.2"
filelock = "*" filelock = "*"
fuzzywuzzy = {extras = ["speedup"], version = "*"} fuzzywuzzy = {extras = ["speedup"], version = "*"}
gunicorn = "*" gunicorn = "*"
imap-tools = "*" imap-tools = "*"
langdetect = "*" langdetect = "*"
# numpy 1.20.0 drops python 3.6 support numpy = "~=1.20.0"
numpy = "~=1.19.5"
pathvalidate = "*" pathvalidate = "*"
pillow = "~=8.1" pillow = "~=8.1"
pikepdf = "~=2.5" pikepdf = "~=2.5"
@@ -34,13 +33,11 @@ psycopg2-binary = "*"
redis = "*" redis = "*"
# Pinned because aarch64 wheels and updates cause warnings when loading the classifier model. # Pinned because aarch64 wheels and updates cause warnings when loading the classifier model.
scikit-learn="==0.24.0" scikit-learn="==0.24.0"
# Prevent scipy updates because 1.6 is incompatible with python 3.6 whitenoise = "~=5.3.0"
scipy="~=1.5.4" watchdog = "~=2.1.0"
whitenoise = "~=5.2.0"
watchdog = "~=1.0.0"
whoosh="~=2.7.4" whoosh="~=2.7.4"
inotifyrecursive = "~=0.3.4" inotifyrecursive = "~=0.3.4"
ocrmypdf = "~=12.0" ocrmypdf = "~=12.3"
tqdm = "*" tqdm = "*"
tika = "*" tika = "*"
# TODO: This will sadly also install daphne+dependencies, # TODO: This will sadly also install daphne+dependencies,
@@ -50,9 +47,10 @@ channels-redis = "*"
uvicorn = {extras = ["standard"], version = "*"} uvicorn = {extras = ["standard"], version = "*"}
concurrent-log-handler = "*" concurrent-log-handler = "*"
# uvloop 0.15+ incompatible with python 3.6 # uvloop 0.15+ incompatible with python 3.6
uvloop = "~=0.14.0" uvloop = "~=0.15"
cryptography = "~=3.4" cryptography = "~=3.4"
"pdfminer.six" = "*" "pdfminer.six" = "*"
"backports.zoneinfo" = "*"
[dev-packages] [dev-packages]
coveralls = "*" coveralls = "*"
Generated
+656 -557
View File
File diff suppressed because it is too large. Load diff
+6 -1
View File
@@ -6,6 +6,10 @@
[![Docker Hub Pulls](https://img.shields.io/docker/pulls/jonaswinkler/paperless-ng.svg)](https://hub.docker.com/r/jonaswinkler/paperless-ng) [![Docker Hub Pulls](https://img.shields.io/docker/pulls/jonaswinkler/paperless-ng.svg)](https://hub.docker.com/r/jonaswinkler/paperless-ng)
[![Coverage Status](https://coveralls.io/repos/github/jonaswinkler/paperless-ng/badge.svg?branch=master)](https://coveralls.io/github/jonaswinkler/paperless-ng?branch=master) [![Coverage Status](https://coveralls.io/repos/github/jonaswinkler/paperless-ng/badge.svg?branch=master)](https://coveralls.io/github/jonaswinkler/paperless-ng?branch=master)
# Archive notice
This project is not dead! Rather, this project is now maintained as a community effort at https://github.com/paperless-ngx/paperless-ngx, a direct continuation of this project and drop-in replacement. Please see their project page and the documentation at https://docs.paperless-ngx.com/ for details.
# Paperless-ng # Paperless-ng
[Paperless (click me)](https://github.com/the-paperless-project/paperless) is an application by Daniel Quinn and contributors that indexes your scanned documents and allows you to easily search for documents and store metadata alongside your documents. [Paperless (click me)](https://github.com/the-paperless-project/paperless) is an application by Daniel Quinn and contributors that indexes your scanned documents and allows you to easily search for documents and store metadata alongside your documents.
@@ -62,7 +66,7 @@ If you want to see paperless-ng in action, [more screenshots are available in th
# Getting started # Getting started
The recommended way to deploy paperless is docker-compose. The files in the /docker/hub directory are configured to pull the image from Docker Hub. The recommended way to deploy paperless is docker-compose. The files in the /docker/compose directory are configured to pull the image from Docker Hub.
Read the [documentation](https://paperless-ng.readthedocs.io/en/latest/setup.html#installation) on how to get started. Read the [documentation](https://paperless-ng.readthedocs.io/en/latest/setup.html#installation) on how to get started.
@@ -100,6 +104,7 @@ Paperless has been around a while now, and people are starting to build stuff on
* [Paperless App](https://github.com/bauerj/paperless_app): An Android/iOS app for Paperless. Updated to work with paperless-ng. * [Paperless App](https://github.com/bauerj/paperless_app): An Android/iOS app for Paperless. Updated to work with 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. * [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.
These projects also exist, but their status and compatibility with paperless-ng is unknown. These projects also exist, but their status and compatibility with paperless-ng is unknown.
+10 -8
View File
@@ -12,27 +12,29 @@ Note that this role requires root access, so either run it in a playbook with a
- hosts: all - hosts: all
roles: roles:
- role: ansible - role: paperless-ng
become: yes become: yes
Role Variables Role Variables
-------------- --------------
Most configuration variables from paperless-ng itself are available and accept their respective arguments. Most configuration variables from paperless-ng itself are available and accept their respective arguments.
Every `PAPERLESS_*` configuration varaible is lowercased and instead prefixed with `paperlessng_*` in `defaults/main.yml`. Every `PAPERLESS_*` configuration variable is lowercased and instead prefixed with `paperlessng_*` in `defaults/main.yml`.
For a full listing including explainations and allowed values, see the current [documentation](https://paperless-ng.readthedocs.io/en/ng-0.9.14/configuration.html). For a full listing including explanations and allowed values, see the current [documentation](https://paperless-ng.readthedocs.io/en/latest/configuration.html).
Additional variables available in this role are listed below, along with default values: Additional variables available in this role are listed below, along with default values:
paperlessng_version: 0.9.14 paperlessng_version: latest
The [release](https://github.com/jonaswinkler/paperless-ng/releases) archive version of paperless-ng to install. The [release](https://github.com/jonaswinkler/paperless-ng/releases) archive version of paperless-ng to install.
`latest` stands for the latest release of paperless-ng.
To install a specific version of paperless-ng, use the tag name of the release, e. g. `ng-1.4.4`, or specify a branch or commit id.
paperlessng_redis_host: localhost paperlessng_redis_host: localhost
paperlessng_redis_port: 6379 paperlessng_redis_port: 6379
Seperate configuration values that combine into `PAPERLESS_REDIS`. Separate configuration values that combine into `PAPERLESS_REDIS`.
paperlessng_db_type: sqlite paperlessng_db_type: sqlite
@@ -96,11 +98,11 @@ Example Playbook
- hosts: all - hosts: all
become: yes become: yes
vars_files: vars_files:
- vars/main.yml - vars/paperless-ng.yml
roles: roles:
- ansible - paperless-ng
`vars/main.yml`: `vars/paperless-ng.yml`:
paperlessng_media_root: /mnt/media/smbshare paperlessng_media_root: /mnt/media/smbshare
+1 -1
View File
@@ -329,7 +329,7 @@
- regexp: PAPERLESS_TIKA_ENDPOINT - regexp: PAPERLESS_TIKA_ENDPOINT
line: "PAPERLESS_TIKA_ENDPOINT={{ paperlessng_tika_endpoint }}" line: "PAPERLESS_TIKA_ENDPOINT={{ paperlessng_tika_endpoint }}"
- regexp: PAPERLESS_TIKA_GOTENBERG_ENDPOINT - regexp: PAPERLESS_TIKA_GOTENBERG_ENDPOINT
line: "PAPERLESS_TIKA_GOTENBERG_ENDPOINT={{ paperlessng_tika_endpoint }}" line: "PAPERLESS_TIKA_GOTENBERG_ENDPOINT={{ paperlessng_tika_gotenberg_endpoint }}"
# Software tweaks # Software tweaks
- regexp: PAPERLESS_TIME_ZONE - regexp: PAPERLESS_TIME_ZONE
line: "PAPERLESS_TIME_ZONE={{ paperlessng_time_zone }}" line: "PAPERLESS_TIME_ZONE={{ paperlessng_time_zone }}"
+1 -1
View File
@@ -1 +1 @@
COMPOSE_PROJECT_NAME=paperless COMPOSE_PROJECT_NAME=paperless
+38 -38
View File
@@ -4,37 +4,37 @@ set -e
# Source: https://github.com/sameersbn/docker-gitlab/ # Source: https://github.com/sameersbn/docker-gitlab/
map_uidgid() { map_uidgid() {
USERMAP_ORIG_UID=$(id -u paperless) USERMAP_ORIG_UID=$(id -u paperless)
USERMAP_ORIG_GID=$(id -g paperless) USERMAP_ORIG_GID=$(id -g paperless)
USERMAP_NEW_UID=${USERMAP_UID:-$USERMAP_ORIG_UID} USERMAP_NEW_UID=${USERMAP_UID:-$USERMAP_ORIG_UID}
USERMAP_NEW_GID=${USERMAP_GID:-${USERMAP_ORIG_GID:-$USERMAP_NEW_UID}} USERMAP_NEW_GID=${USERMAP_GID:-${USERMAP_ORIG_GID:-$USERMAP_NEW_UID}}
if [[ ${USERMAP_NEW_UID} != "${USERMAP_ORIG_UID}" || ${USERMAP_NEW_GID} != "${USERMAP_ORIG_GID}" ]]; then if [[ ${USERMAP_NEW_UID} != "${USERMAP_ORIG_UID}" || ${USERMAP_NEW_GID} != "${USERMAP_ORIG_GID}" ]]; then
echo "Mapping UID and GID for paperless:paperless to $USERMAP_NEW_UID:$USERMAP_NEW_GID" echo "Mapping UID and GID for paperless:paperless to $USERMAP_NEW_UID:$USERMAP_NEW_GID"
usermod -u "${USERMAP_NEW_UID}" paperless usermod -u "${USERMAP_NEW_UID}" paperless
groupmod -o -g "${USERMAP_NEW_GID}" paperless groupmod -o -g "${USERMAP_NEW_GID}" paperless
fi fi
} }
initialize() { initialize() {
map_uidgid map_uidgid
for dir in export data data/index media media/documents media/documents/originals media/documents/thumbnails; do for dir in export data data/index media media/documents media/documents/originals media/documents/thumbnails; do
if [[ ! -d "../$dir" ]] if [[ ! -d "../$dir" ]]; then
then echo "Creating directory ../$dir"
echo "creating directory ../$dir"
mkdir ../$dir mkdir ../$dir
fi fi
done done
echo "creating directory /tmp/paperless" echo "Creating directory /tmp/paperless"
mkdir -p /tmp/paperless mkdir -p /tmp/paperless
set +e set +e
chown -R paperless:paperless ../ echo "Adjusting permissions of paperless files. This may take a while."
chown -R paperless:paperless /tmp/paperless chown -R paperless:paperless /tmp/paperless
set -e find .. -not \( -user paperless -and -group paperless \) -exec chown paperless:paperless {} +
set -e
gosu paperless /sbin/docker-prepare.sh gosu paperless /sbin/docker-prepare.sh
} }
install_languages() { install_languages() {
@@ -50,35 +50,35 @@ install_languages() {
apt-get update apt-get update
for lang in "${langs[@]}"; do for lang in "${langs[@]}"; do
pkg="tesseract-ocr-$lang" pkg="tesseract-ocr-$lang"
# English is installed by default # English is installed by default
#if [[ "$lang" == "eng" ]]; then #if [[ "$lang" == "eng" ]]; then
# continue # continue
#fi #fi
if dpkg -s $pkg &> /dev/null; then if dpkg -s $pkg &>/dev/null; then
echo "package $pkg already installed!" echo "Package $pkg already installed!"
continue continue
fi fi
if ! apt-cache show $pkg &> /dev/null; then if ! apt-cache show $pkg &>/dev/null; then
echo "package $pkg not found! :(" echo "Package $pkg not found! :("
continue continue
fi fi
echo "Installing package $pkg..." echo "Installing package $pkg..."
if ! apt-get -y install "$pkg" &> /dev/null; then if ! apt-get -y install "$pkg" &>/dev/null; then
echo "Could not install $pkg" echo "Could not install $pkg"
exit 1 exit 1
fi fi
done done
} }
echo "Paperless-ng docker container starting..." echo "Paperless-ng docker container starting..."
# Install additional languages if specified # Install additional languages if specified
if [[ ! -z "$PAPERLESS_OCR_LANGUAGES" ]]; then if [[ ! -z "$PAPERLESS_OCR_LANGUAGES" ]]; then
install_languages "$PAPERLESS_OCR_LANGUAGES" install_languages "$PAPERLESS_OCR_LANGUAGES"
fi fi
initialize initialize
+6 -11
View File
@@ -149,22 +149,15 @@ Ansible Route
Most of the update process is automated when using the ansible role. Most of the update process is automated when using the ansible role.
1. Backup your defined role variables file outside the paperless source-tree: 1. Update the role to the target release tag to make sure the ansible scripts are compatible:
.. code:: shell-session .. code:: shell-session
$ cp ansible/vars.yml ~/vars.yml.old $ ansible-galaxy install git+https://github.com/jonaswinkler/paperless-ng.git,master --force
2. Pull the release tag you want to update to: 2. Update the role variable definitions ``vars/paperless-ng.yml`` (where appropriate).
.. code:: shell-session 3. Run the ansible playbook you created created during :ref:`installation <setup-ansible>` again:
$ git fetch --all
$ git checkout ng-0.9.14
3. Update the role variable definitions ``ansible/vars.yml`` (where appropriate).
4. Run the ansible playbook you created created during :ref:`installation <setup-ansible>` again:
.. note:: .. note::
@@ -247,6 +240,8 @@ Document exporter
The document exporter exports all your data from paperless into a folder for The document exporter exports all your data from paperless into a folder for
backup or migration to another DMS. backup or migration to another DMS.
If you use the document exporter within a cronjob to backup your data you might use the ``-T`` flag behind exec to suppress "The input device is not a TTY" errors. For example: ``docker-compose exec -T webserver document_exporter ../export``
.. code:: .. code::
document_exporter target [-c] [-f] [-d] document_exporter target [-c] [-f] [-d]
+35 -12
View File
@@ -5,6 +5,39 @@
Changelog Changelog
********* *********
paperless-ng 1.5.0
##################
Support for Python 3.6 was dropped.
* Updated python dependencies.
* Base image of the docker image changed from Debian Buster to Debian Bullseye due to its recent release.
* The docker image now uses python 3.9.
* Added the Luxembourgish locale. Thanks for translating!
* `Daniel Albers`_ added support for making the files and folders ignored by the paperless consume folder scanner configurable. See ``PAPERLESS_CONSUMER_IGNORE_PATTERNS``.
paperless-ng 1.4.5
##################
This is a maintenance release.
* Updated Python and Angular dependencies.
* Changed the algorithm that changes permissions during startup. This is still fast,
and will hopefully cause less issues.
* Fixed an issue that would sometimes cause paperless to write an incomplete
classification model file to disk.
* Fixed an issue with the OCRmyPDF parser that would always try to extract text
with PDFminer even from non-PDF files.
paperless-ng 1.4.4
##################
* Drastically decreased the startup time of the docker container. The startup script adjusts file permissions of all data only if changes are required.
* Paperless mail: Added ability to specify the character set for each server.
* Document consumption: Ignore Mac OS specific files such as ``.DS_STORE`` and ``._XXXXX.pdf``.
* Fixed an issue with the automatic matching algorithm that prevents paperless from consuming new files.
* Updated translations.
paperless-ng 1.4.3 paperless-ng 1.4.3
################## ##################
@@ -16,7 +49,7 @@ paperless-ng 1.4.3
* `Michael Shamoon`_ added dark mode for the login and logout pages. * `Michael Shamoon`_ added dark mode for the login and logout pages.
* `Alexander Menk`_ added additional stylesheets for printing. You can now print any page of paperless and the print result will hide the page header, sidebar, and action buttons. * `Alexander Menk`_ added additional stylesheets for printing. You can now print any page of paperless and the print result will hide the page header, sidebar, and action buttons.
* Added support for sorting when using full text search. * Added support for sorting when using full text search.
* Fixes * Fixes
* `puuu`_ fixed ``PAPERLESS_FORCE_SCRIPT_NAME``. You can now host paperless on sub paths such as ``https://localhost:8000/paperless/``. * `puuu`_ fixed ``PAPERLESS_FORCE_SCRIPT_NAME``. You can now host paperless on sub paths such as ``https://localhost:8000/paperless/``.
@@ -76,17 +109,6 @@ paperless-ng 1.4.0
To do this, execute the ``document_index reindex`` management command To do this, execute the ``document_index reindex`` management command
(see :ref:`administration-index`). (see :ref:`administration-index`).
.. note::
Some packages that paperless depends on are slowly dropping Python 3.6
support one after another, including the web server. Supporting Python
3.6 means that I cannot update these packages anymore.
At some point, paperless will drop Python 3.6 support. If using a bare
metal installation and you're still on Python 3.6, upgrade to 3.7 or newer.
If using docker, this does not affect you.
paperless-ng 1.3.2 paperless-ng 1.3.2
################## ##################
@@ -1460,6 +1482,7 @@ bulk of the work on this big change.
.. _JOKer: https://github.com/MasterofJOKers .. _JOKer: https://github.com/MasterofJOKers
.. _Brian Cribbs: https://github.com/cribbstechnolog .. _Brian Cribbs: https://github.com/cribbstechnolog
.. _Brendan M. Sleight: https://github.com/bmsleight .. _Brendan M. Sleight: https://github.com/bmsleight
.. _Daniel Albers: https://github.com/AlD
.. _#20: https://github.com/the-paperless-project/paperless/issues/20 .. _#20: https://github.com/the-paperless-project/paperless/issues/20
.. _#44: https://github.com/the-paperless-project/paperless/issues/44 .. _#44: https://github.com/the-paperless-project/paperless/issues/44
+34 -11
View File
@@ -174,11 +174,11 @@ PAPERLESS_AUTO_LOGIN_USERNAME=<username>
Defaults to none, which disables this feature. Defaults to none, which disables this feature.
PAPERLESS_ADMIN_USER=<username> PAPERLESS_ADMIN_USER=<username>
If this environment variable is specified, Paperless automatically creates If this environment variable is specified, Paperless automatically creates
a superuser with the provided username at start. This is useful in cases a superuser with the provided username at start. This is useful in cases
where you can not run the `createsuperuser` command seperately, such as Kubernetes where you can not run the `createsuperuser` command seperately, such as Kubernetes
or AWS ECS. or AWS ECS.
Requires `PAPERLESS_ADMIN_PASSWORD` to be set. Requires `PAPERLESS_ADMIN_PASSWORD` to be set.
.. note:: .. note::
@@ -188,7 +188,7 @@ PAPERLESS_ADMIN_USER=<username>
the lifecycle of the containers. the lifecycle of the containers.
PAPERLESS_ADMIN_MAIL=<email> PAPERLESS_ADMIN_MAIL=<email>
(Optional) Specify superuser email address. Only used when (Optional) Specify superuser email address. Only used when
`PAPERLESS_ADMIN_USER` is set. `PAPERLESS_ADMIN_USER` is set.
Defaults to ``root@localhost``. Defaults to ``root@localhost``.
@@ -222,17 +222,24 @@ PAPERLESS_ENABLE_HTTP_REMOTE_USER=<bool>
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/3.1/howto/auth-remote-user/#configuration>`.
Defaults to `false` which disables this feature. Defaults to `false` which disables this feature.
PAPERLESS_HTTP_REMOTE_USER_HEADER_NAME=<str> PAPERLESS_HTTP_REMOTE_USER_HEADER_NAME=<str>
If `PAPERLESS_ENABLE_HTTP_REMOTE_USER` is enabled, this property allows to If `PAPERLESS_ENABLE_HTTP_REMOTE_USER` is enabled, this property allows to
customize the name of the HTTP header from which the authenticated username customize the name of the HTTP header from which the authenticated username
is extracted. Values are in terms of 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/3.1/ref/request-response/#django.http.HttpRequest.META).
Thus, the configured value must start with `HTTP_` followed by the Thus, the configured value must start with `HTTP_` followed by the
normalized actual header name. normalized actual header name.
Defaults to `HTTP_REMOTE_USER`. Defaults to `HTTP_REMOTE_USER`.
PAPERLESS_LOGOUT_REDIRECT_URL=<str>
URL to redirect the user to after a logout. This can be used together with
`PAPERLESS_ENABLE_HTTP_REMOTE_USER` to redirect the user back to the SSO
application's logout page.
Defaults to None, which disables this feature.
.. _configuration-ocr: .. _configuration-ocr:
OCR settings OCR settings
@@ -258,6 +265,8 @@ PAPERLESS_OCR_LANGUAGE=<lang>
Defaults to "eng". Defaults to "eng".
Note: If your language contains a '-' such as chi-sim, you must use chi_sim
PAPERLESS_OCR_MODE=<mode> PAPERLESS_OCR_MODE=<mode>
Tell paperless when and how to perform ocr on your documents. Four modes Tell paperless when and how to perform ocr on your documents. Four modes
are available: are available:
@@ -622,6 +631,20 @@ PAPERLESS_IGNORE_DATES=<string>
Defaults to an empty string to not ignore any dates. Defaults to an empty string to not ignore any dates.
PAPERLESS_DATE_ORDER=<format>
Paperless will try to determine the document creation date from its contents.
Specify the date format Paperless should expect to see within your documents.
This option defaults to DMY which translates to day first, month second, and year
last order. Characters D, M, or Y can be shuffled to meet the required order.
PAPERLESS_CONSUMER_IGNORE_PATTERNS=<json>
By default, paperless ignores certain files and folders in the consumption
directory, such as system files created by the Mac OS.
This can be adjusted by configuring a custom json array with patterns to exclude.
Defautls to ``[".DS_STORE/*", "._*", ".stfolder/*"]``.
Binaries Binaries
######## ########
+1 -1
View File
@@ -6,7 +6,7 @@ Contributing to Paperless
.. warning:: .. warning::
This section is not updated to paperless-ng yet. This section is not updated to paperless-ng yet.
Maybe you've been using Paperless for a while and want to add a feature or two, Maybe you've been using Paperless for a while and want to add a feature or two,
or maybe you've come across a bug that you have some ideas how to solve. The or maybe you've come across a bug that you have some ideas how to solve. The
beauty of Free software is that you can see what's wrong and help to get it beauty of Free software is that you can see what's wrong and help to get it
+9 -9
View File
@@ -23,10 +23,10 @@ Apart from that, the folder structure is as follows:
* ``scripts/`` - Various scripts that help with different parts of development. * ``scripts/`` - Various scripts that help with different parts of development.
* ``docker/`` - Files required to build the docker image. * ``docker/`` - Files required to build the docker image.
Initial setup and first start Initial setup and first start
============================= =============================
After you forked and cloned the code from github you need to perform a first-time setup. After you forked and cloned the code from github you need to perform a first-time setup.
To do the setup you need to perform the steps from the following chapters in a certain order: To do the setup you need to perform the steps from the following chapters in a certain order:
1. Install prerequisites + pipenv as mentioned in :ref:`Bare metal route <setup-bare_metal>` 1. Install prerequisites + pipenv as mentioned in :ref:`Bare metal route <setup-bare_metal>`
@@ -35,19 +35,19 @@ To do the setup you need to perform the steps from the following chapters in a c
.. code:: shell-session .. code:: shell-session
$ npm install -g @angular/cli $ npm install -g @angular/cli
4. Create ``consume`` and ``media`` folders in the cloned root folder. 4. Create ``consume`` and ``media`` folders in the cloned root folder.
.. code:: shell-session .. code:: shell-session
mkdir -p consume media mkdir -p consume media
5. You can now either ... 5. You can now either ...
* install redis or * install redis or
* use the included scripts/start-services.sh to use docker to fire up a redis instance (and some other services such as tika, gotenberg and a postgresql server) or * use the included scripts/start-services.sh to use docker to fire up a redis instance (and some other services such as tika, gotenberg and a postgresql server) or
* spin up a bare redis container * spin up a bare redis container
.. code:: shell-session .. code:: shell-session
@@ -79,7 +79,7 @@ To do the setup you need to perform the steps from the following chapters in a c
python3 manage.py runserver & python3 manage.py document_consumer & python3 manage.py qcluster python3 manage.py runserver & python3 manage.py document_consumer & python3 manage.py qcluster
10. Login with the superuser credentials provided in step 8 at ``http://localhost:8000`` to create a session that enables you to use the backend. 10. Login with the superuser credentials provided in step 8 at ``http://localhost:8000`` to create a session that enables you to use the backend.
Backend development environment is now ready, to start Frontend development go to ``/src-ui`` and run ``ng serve``. From there you can use ``http://localhost:4200`` for a preview. Backend development environment is now ready, to start Frontend development go to ``/src-ui`` and run ``ng serve``. From there you can use ``http://localhost:4200`` for a preview.
Back end development Back end development
@@ -207,7 +207,7 @@ Adding new languages requires adding the translated files in the "src-ui/src/loc
// Add your new language here // Add your new language here
] ]
} }
``dateInputFormat`` is a special string that defines the behavior of the date input fields and absolutely needs to contain "dd", "mm" and "yyyy". ``dateInputFormat`` is a special string that defines the behavior of the date input fields and absolutely needs to contain "dd", "mm" and "yyyy".
3. Import and register the Angular data for this locale in "src-ui/src/app/app.module.ts": 3. Import and register the Angular data for this locale in "src-ui/src/app/app.module.ts":
@@ -320,7 +320,7 @@ methods ``parse`` and ``get_thumbnail``. You can provide your own implementation
# The content of the document. # The content of the document.
self.text = "content" self.text = "content"
# Optional: path to a PDF document that you created from the original. # Optional: path to a PDF document that you created from the original.
self.archive_path = os.path.join(self.tempdir, "archived.pdf") self.archive_path = os.path.join(self.tempdir, "archived.pdf")
+2 -2
View File
@@ -68,10 +68,10 @@ reuse the text. The web interface is a lot snappier, since it runs
in your browser and paperless has to do much less work to serve the data. in your browser and paperless has to do much less work to serve the data.
.. note:: .. note::
You can adjust some of the settings so that paperless uses less processing You can adjust some of the settings so that paperless uses less processing
power. See :ref:`setup-less_powerful_devices` for details. power. See :ref:`setup-less_powerful_devices` for details.
**Q:** *How do I install paperless-ng on Raspberry Pi?* **Q:** *How do I install paperless-ng on Raspberry Pi?*
+1 -1
View File
@@ -49,7 +49,7 @@ resources in the documentation:
paperless-ng. paperless-ng.
* Paperless is now integrated with a * Paperless is now integrated with a
:ref:`task processing queue <setup-task_processor>` that tells you :ref:`task processing queue <setup-task_processor>` that tells you
at a glance when and why something is not working. at a glance when and why something is not working.
* The :ref:`changelog <paperless_changelog>` contains a detailed list of all changes * The :ref:`changelog <paperless_changelog>` contains a detailed list of all changes
in paperless-ng. in paperless-ng.
+35 -25
View File
@@ -13,42 +13,48 @@ that works right for you based on recommendations from other Paperless users.
Physical scanners Physical scanners
================= =================
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Brand | Model | Supports | Recommended By | | Brand | Model | Supports | Recommended By |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| | | FTP | NFS | SMB | SMTP | | | | | FTP | NFS | SMB | SMTP | API [1]_ | |
+=========+================+=====+=====+=====+======+================+ +=========+================+=====+=====+=====+======+==========+================+
| Brother | `ADS-1700W`_ | yes | no | yes | yes |`holzhannes`_ | | Brother | `ADS-1700W`_ | yes | no | yes | yes | |`holzhannes`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Brother | `ADS-1600W`_ | yes | no | yes | yes |`holzhannes`_ | | Brother | `ADS-1600W`_ | yes | no | yes | yes | |`holzhannes`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Brother | `ADS-1500W`_ | yes | no | yes | yes |`danielquinn`_ | | Brother | `ADS-1500W`_ | yes | no | yes | yes | |`danielquinn`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Brother | `MFC-J6930DW`_ | yes | | | |`ayounggun`_ | | Brother | `ADS-1100W`_ | yes | no | no | no | |`ytzelf`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Brother | `MFC-L5850DW`_ | yes | | | yes |`holzhannes`_ | | Brother | `MFC-J6930DW`_ | yes | | | | |`ayounggun`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Brother | `MFC-J5910DW`_ | yes | | | |`bmsleight`_ | | Brother | `MFC-L5850DW`_ | yes | | | yes | |`holzhannes`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Brother | `MFC-9142CDN`_ | yes | | yes | |`REOLDEV`_ | | Brother | `MFC-J5910DW`_ | yes | | | | |`bmsleight`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Fujitsu | `ix500`_ | yes | | yes | |`eonist`_ | | Brother | `MFC-9142CDN`_ | yes | | yes | | |`REOLDEV`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Epson | `WF-7710DWF`_ | yes | | yes | |`Skylinar`_ | | Fujitsu | `ix500`_ | yes | | yes | | |`eonist`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Fujitsu | `S1300i`_ | yes | | yes | |`jonaswinkler`_ | | Epson | `WF-7710DWF`_ | yes | | yes | | |`Skylinar`_ |
+---------+----------------+-----+-----+-----+------+----------------+ +---------+----------------+-----+-----+-----+------+----------+----------------+
| Fujitsu | `S1300i`_ | yes | | yes | | |`jonaswinkler`_ |
+---------+----------------+-----+-----+-----+------+----------+----------------+
| Doxie | `Q2`_ | no | no | no | no | yes |`Unkn0wnCat`_ |
+---------+----------------+-----+-----+-----+------+----------+----------------+
.. _MFC-L5850DW: https://www.brother-usa.com/products/mfcl5850dw .. _MFC-L5850DW: https://www.brother-usa.com/products/mfcl5850dw
.. _ADS-1700W: https://www.brother-usa.com/products/ads1700w .. _ADS-1700W: https://www.brother-usa.com/products/ads1700w
.. _ADS-1600W: https://www.brother-usa.com/products/ads1600w .. _ADS-1600W: https://www.brother-usa.com/products/ads1600w
.. _ADS-1500W: https://www.brother.ca/en/p/ads1500w .. _ADS-1500W: https://www.brother.ca/en/p/ads1500w
.. _ADS-1100W: https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=ads1100w_eu_as_cn
.. _MFC-J6930DW: https://www.brother.ca/en/p/MFCJ6930DW .. _MFC-J6930DW: https://www.brother.ca/en/p/MFCJ6930DW
.. _MFC-J5910DW: https://www.brother.co.uk/printers/inkjet-printers/mfcj5910dw .. _MFC-J5910DW: https://www.brother.co.uk/printers/inkjet-printers/mfcj5910dw
.. _MFC-9142CDN: https://www.brother.co.uk/printers/laser-printers/mfc9140cdn .. _MFC-9142CDN: https://www.brother.co.uk/printers/laser-printers/mfc9140cdn
.. _ix500: http://www.fujitsu.com/us/products/computing/peripheral/scanners/scansnap/ix500/ .. _ix500: http://www.fujitsu.com/us/products/computing/peripheral/scanners/scansnap/ix500/
.. _WF-7710DWF: https://www.epson.de/en/products/printers/inkjet-printers/for-home/workforce-wf-7710dwf .. _WF-7710DWF: https://www.epson.de/en/products/printers/inkjet-printers/for-home/workforce-wf-7710dwf
.. _S1300i: https://www.fujitsu.com/global/products/computing/peripheral/scanners/soho/s1300i/ .. _S1300i: https://www.fujitsu.com/global/products/computing/peripheral/scanners/soho/s1300i/
.. _Q2: https://www.getdoxie.com/product/doxie-q/
.. _danielquinn: https://github.com/danielquinn .. _danielquinn: https://github.com/danielquinn
@@ -59,6 +65,10 @@ Physical scanners
.. _Skylinar: https://github.com/Skylinar .. _Skylinar: https://github.com/Skylinar
.. _jonaswinkler: https://github.com/jonaswinkler .. _jonaswinkler: https://github.com/jonaswinkler
.. _holzhannes: https://github.com/holzhannes .. _holzhannes: https://github.com/holzhannes
.. _ytzelf: https://github.com/ytzelf
.. _Unkn0wnCat: https://github.com/Unkn0wnCat
.. [1] Scanners with API Integration allow to push scanned documents directly to :ref:`Paperless API <api-file_uploads>`, sometimes referred to as Webhook or Document POST.
Mobile phone software Mobile phone software
===================== =====================
+26 -6
View File
@@ -116,9 +116,7 @@ performs all the steps described in :ref:`setup-docker_hub` automatically.
.. code:: shell-session .. code:: shell-session
$ wget https://raw.githubusercontent.com/jonaswinkler/paperless-ng/master/install-paperless-ng.sh $ curl -L https://raw.githubusercontent.com/jonaswinkler/paperless-ng/master/install-paperless-ng.sh | bash
$ chmod +x install-paperless-ng.sh
$ ./install-paperless-ng.sh
.. _setup-docker_hub: .. _setup-docker_hub:
@@ -173,6 +171,24 @@ Install Paperless from Docker Hub
Don't change the part after the colon or paperless wont find your documents. Don't change the part after the colon or paperless wont find your documents.
You may also need to change the default port that the webserver will use
from the default (8000):
.. code::
ports:
- 8000:8000
Replace the part BEFORE the colon with a port of your choice:
.. code::
ports:
- 8010:8000
Don't change the part after the colon or edit other lines that refer to
port 8000. Modifying the part before the colon will map requests on another
port to the webserver running on the default port.
5. Modify ``docker-compose.env``, following the comments in the file. The 5. Modify ``docker-compose.env``, following the comments in the file. The
most important change is to set ``USERMAP_UID`` and ``USERMAP_GID`` most important change is to set ``USERMAP_UID`` and ``USERMAP_GID``
@@ -286,7 +302,7 @@ writing. Windows is not and will never be supported.
Use this list for your preferred package management: Use this list for your preferred package management:
.. code:: .. code::
python3 python3-pip python3-dev imagemagick fonts-liberation optipng gnupg libpq-dev libmagic-dev mime-support python3 python3-pip python3-dev imagemagick fonts-liberation optipng gnupg libpq-dev libmagic-dev mime-support
@@ -305,7 +321,7 @@ writing. Windows is not and will never be supported.
Use this list for your preferred package management: Use this list for your preferred package management:
.. code:: .. code::
unpaper ghostscript icc-profiles-free qpdf liblept5 libxml2 pngquant zlib1g tesseract-ocr unpaper ghostscript icc-profiles-free qpdf liblept5 libxml2 pngquant zlib1g tesseract-ocr
@@ -360,7 +376,11 @@ writing. Windows is not and will never be supported.
Adjust as necessary if you configured different folders. Adjust as necessary if you configured different folders.
8. Install python requirements from the ``requirements.txt`` file. 8. Install python requirements from the ``requirements.txt`` file.
It is up to you if you wish to use a virtual environment or not. It is up to you if you wish to use a virtual environment or not. First you should update your pip, so it gets the actual packages.
.. code:: shell-session
sudo -Hu paperless pip3 install --upgrade pip
.. code:: shell-session .. code:: shell-session
+3 -3
View File
@@ -81,7 +81,7 @@ UserWarning in sklearn on every single document
You may encounter warnings like this: You may encounter warnings like this:
.. code:: .. code::
/usr/local/lib/python3.7/site-packages/sklearn/base.py:315: /usr/local/lib/python3.7/site-packages/sklearn/base.py:315:
UserWarning: Trying to unpickle estimator CountVectorizer from version 0.23.2 when using version 0.24.0. UserWarning: Trying to unpickle estimator CountVectorizer from version 0.23.2 when using version 0.24.0.
This might lead to breaking code or invalid results. Use at your own risk. This might lead to breaking code or invalid results. Use at your own risk.
@@ -200,13 +200,13 @@ This might have multiple reasons.
File "/usr/local/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 386, in sendfile File "/usr/local/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 386, in sendfile
sent += os.sendfile(sockno, fileno, offset + sent, count) sent += os.sendfile(sockno, fileno, offset + sent, count)
OSError: [Errno 22] Invalid argument OSError: [Errno 22] Invalid argument
To fix this issue, add To fix this issue, add
.. code:: .. code::
SENDFILE=0 SENDFILE=0
to your `docker-compose.env` file. to your `docker-compose.env` file.
Error while reading metadata Error while reading metadata
+5 -5
View File
@@ -71,7 +71,7 @@ your documents:
This process can be configured to fit your needs. If you don't want paperless 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 to create archived versions for digital documents, you can configure that by
configuring ``PAPERLESS_OCR_MODE=skip_noarchive``. Please read the configuring ``PAPERLESS_OCR_MODE=skip_noarchive``. Please read the
:ref:`relevant section in the documentation <configuration-ocr>`. :ref:`relevant section in the documentation <configuration-ocr>`.
.. note:: .. note::
@@ -289,7 +289,7 @@ Matching specific tags, correspondents or types:
Matching dates: Matching dates:
.. code:: .. code::
created:[2005 to 2009] created:[2005 to 2009]
added:yesterday added:yesterday
modified:today modified:today
@@ -306,11 +306,11 @@ Matching inexact words:
auto complete and query correction. auto complete and query correction.
All of these constructs can be combined as you see fit. All of these constructs can be combined as you see fit.
If you want to learn more about the query language used by paperless, paperless uses Whoosh's default query language. If you want to learn more about the query language used by paperless, paperless uses Whoosh's default query language.
Head over to `Whoosh query language <https://whoosh.readthedocs.io/en/latest/querylang.html>`_. Head over to `Whoosh query language <https://whoosh.readthedocs.io/en/latest/querylang.html>`_.
For details on what date parsing utilities are available, see For details on what date parsing utilities are available, see
`Date parsing <https://whoosh.readthedocs.io/en/latest/dates.html#parsing-date-queries>`_. `Date parsing <https://whoosh.readthedocs.io/en/latest/dates.html#parsing-date-queries>`_.
.. _usage-recommended_workflow: .. _usage-recommended_workflow:
@@ -385,7 +385,7 @@ Once you have scanned in a document, proceed in paperless as follows.
6. Remove inbox tags from the documents. 6. Remove inbox tags from the documents.
.. hint:: .. hint::
You can setup manual matching rules for your correspondents and tags and You can setup manual matching rules for your correspondents and tags and
paperless will assign them automatically. After consuming a couple documents, paperless will assign them automatically. After consuming a couple documents,
you can even ask paperless to *learn* when to assign tags and correspondents you can even ask paperless to *learn* when to assign tags and correspondents
+1
View File
@@ -57,6 +57,7 @@
#PAPERLESS_CONSUMER_POLLING=10 #PAPERLESS_CONSUMER_POLLING=10
#PAPERLESS_CONSUMER_DELETE_DUPLICATES=false #PAPERLESS_CONSUMER_DELETE_DUPLICATES=false
#PAPERLESS_CONSUMER_RECURSIVE=false #PAPERLESS_CONSUMER_RECURSIVE=false
#PAPERLESS_CONSUMER_IGNORE_PATTERNS=[".DS_STORE/*", "._*", ".stfolder/*"]
#PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=false #PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=false
#PAPERLESS_OPTIMIZE_THUMBNAILS=true #PAPERLESS_OPTIMIZE_THUMBNAILS=true
#PAPERLESS_POST_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh #PAPERLESS_POST_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh
+42 -39
View File
@@ -8,42 +8,44 @@
-i https://pypi.python.org/simple -i https://pypi.python.org/simple
--extra-index-url https://www.piwheels.org/simple --extra-index-url https://www.piwheels.org/simple
aioredis==1.3.1 aioredis==1.3.1
arrow==1.1.0; python_version >= '3.6' arrow==1.1.1; python_version >= '3.6'
asgiref==3.3.4; python_version >= '3.6' asgiref==3.4.1; python_version >= '3.6'
async-timeout==3.0.1; python_full_version >= '3.5.3' async-timeout==3.0.1; python_full_version >= '3.5.3'
attrs==21.2.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' attrs==21.2.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
autobahn==21.3.1; python_version >= '3.7' autobahn==21.3.1; python_version >= '3.7'
automat==20.2.0 automat==20.2.0
blessed==1.18.0 backports.zoneinfo==0.2.1
certifi==2020.12.5 blessed==1.18.1; python_version >= '2.7'
cffi==1.14.5 certifi==2021.5.30
channels-redis==3.2.0 cffi==1.14.6
channels==3.0.3 channels-redis==3.3.0
channels==3.0.4
chardet==4.0.0; python_version >= '3.1' chardet==4.0.0; python_version >= '3.1'
click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' charset-normalizer==2.0.4; python_version >= '3'
coloredlogs==15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' click==8.0.1; python_version >= '3.6'
coloredlogs==15.0.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
concurrent-log-handler==0.9.19 concurrent-log-handler==0.9.19
constantly==15.1.0 constantly==15.1.0
cryptography==3.4.7 cryptography==3.4.7
daphne==3.0.2; python_version >= '3.6' daphne==3.0.2; python_version >= '3.6'
dateparser==1.0.0 dateparser==1.0.0
django-cors-headers==3.7.0 django-cors-headers==3.8.0
django-extensions==3.1.3 django-extensions==3.1.3
django-filter==2.4.0 django-filter==2.4.0
django-picklefield==3.0.1; python_version >= '3' django-picklefield==3.0.1; python_version >= '3'
django-q==1.3.4 django-q==1.3.9
django==3.2.3 django==3.2.6
djangorestframework==3.12.4 djangorestframework==3.12.4
filelock==3.0.12 filelock==3.0.12
fuzzywuzzy[speedup]==0.18.0 fuzzywuzzy[speedup]==0.18.0
gunicorn==20.1.0 gunicorn==20.1.0
h11==0.12.0; python_version >= '3.6' h11==0.12.0; python_version >= '3.6'
hiredis==2.0.0; python_version >= '3.6' hiredis==2.0.0; python_version >= '3.6'
httptools==0.1.2 httptools==0.2.0
humanfriendly==9.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' humanfriendly==9.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
hyperlink==21.0.0 hyperlink==21.0.0
idna==2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' idna==3.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
imap-tools==0.41.0 imap-tools==0.46.0
img2pdf==0.4.1 img2pdf==0.4.1
incremental==21.3.0 incremental==21.3.0
inotify-simple==1.3.5; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' inotify-simple==1.3.5; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
@@ -52,49 +54,50 @@ joblib==1.0.1; python_version >= '3.6'
langdetect==1.0.9 langdetect==1.0.9
lxml==4.6.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' lxml==4.6.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
msgpack==1.0.2 msgpack==1.0.2
numpy==1.19.5 numpy==1.20.3
ocrmypdf==12.0.1 ocrmypdf==12.3.2
pathvalidate==2.4.1 pathvalidate==2.4.1
pdfminer.six==20201018 pdfminer.six==20201018
pikepdf==2.12.0 pikepdf==2.16.1
pillow==8.2.0 pillow==8.3.1
pluggy==0.13.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' pluggy==0.13.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
portalocker==2.3.0; python_version >= '3' portalocker==2.3.0; python_version >= '3'
psycopg2-binary==2.8.6 psycopg2-binary==2.9.1
pyasn1-modules==0.2.8 pyasn1-modules==0.2.8
pyasn1==0.4.8 pyasn1==0.4.8
pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
pyopenssl==20.0.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' pyopenssl==20.0.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
python-dateutil==2.8.1 python-dateutil==2.8.2
python-dotenv==0.17.1 python-dotenv==0.19.0
python-gnupg==0.4.7 python-gnupg==0.4.7
python-levenshtein==0.12.2 python-levenshtein==0.12.2
python-magic==0.4.22 python-magic==0.4.24
pytz==2021.1 pytz==2021.1
pyyaml==5.4.1 pyyaml==5.4.1
redis==3.5.3 redis==3.5.3
regex==2021.4.4 regex==2021.8.3
reportlab==3.5.67; python_version >= '2.7' and python_version < '4' reportlab==3.6.1; python_version >= '2.7' and python_version < '4'
requests==2.25.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' requests==2.26.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
scikit-learn==0.24.0 scikit-learn==0.24.0
scipy==1.5.4 scipy==1.7.1; python_version < '3.10' and python_version >= '3.7'
service-identity==21.1.0 service-identity==21.1.0
six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
sortedcontainers==2.3.0 sortedcontainers==2.4.0
sqlparse==0.4.1; python_version >= '3.5' sqlparse==0.4.1; python_version >= '3.5'
threadpoolctl==2.1.0; python_version >= '3.5' threadpoolctl==2.2.0; python_version >= '3.6'
tika==1.24 tika==1.24
tqdm==4.60.0 tqdm==4.62.1
twisted[tls]==21.2.0; python_full_version >= '3.5.4' twisted[tls]==21.7.0; python_full_version >= '3.6.7'
txaio==21.2.1; python_version >= '3.6' txaio==21.2.1; python_version >= '3.6'
tzlocal==2.1 typing-extensions==3.10.0.0
urllib3==1.26.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' tzlocal==3.0; python_version >= '3.6'
uvicorn[standard]==0.13.4 urllib3==1.26.6; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'
uvloop==0.14.0 uvicorn[standard]==0.15.0
watchdog==1.0.2 uvloop==0.16.0
watchdog==2.1.3
watchgod==0.7 watchgod==0.7
wcwidth==0.2.5 wcwidth==0.2.5
websockets==8.1 websockets==9.1
whitenoise==5.2.0 whitenoise==5.3.0
whoosh==2.7.4 whoosh==2.7.4
zope.interface==5.4.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' zope.interface==5.4.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
+2 -2
View File
@@ -27,7 +27,8 @@
"ru-RU": "src/locale/messages.ru_RU.xlf", "ru-RU": "src/locale/messages.ru_RU.xlf",
"es-ES": "src/locale/messages.es_ES.xlf", "es-ES": "src/locale/messages.es_ES.xlf",
"pl-PL": "src/locale/messages.pl_PL.xlf", "pl-PL": "src/locale/messages.pl_PL.xlf",
"sv-SE": "src/locale/messages.sv_SE.xlf" "sv-SE": "src/locale/messages.sv_SE.xlf",
"lb-LU": "src/locale/messages.lb_LU.xlf"
} }
}, },
"architect": { "architect": {
@@ -72,7 +73,6 @@
"optimization": true, "optimization": true,
"outputHashing": "none", "outputHashing": "none",
"sourceMap": false, "sourceMap": false,
"extractCss": true,
"namedChunks": false, "namedChunks": false,
"extractLicenses": true, "extractLicenses": true,
"vendorChunk": false, "vendorChunk": false,
+1 -1
View File
@@ -33,4 +33,4 @@ exports.config = {
} }
})); }));
} }
}; };
+20659 -4490
View File
File diff suppressed because it is too large. Load diff
+20 -20
View File
@@ -11,41 +11,41 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "~10.1.5", "@angular/animations": "~11.2.14",
"@angular/common": "~10.1.5", "@angular/common": "~11.2.14",
"@angular/compiler": "~10.1.5", "@angular/compiler": "~11.2.14",
"@angular/core": "~10.1.5", "@angular/core": "~11.2.14",
"@angular/forms": "~10.1.5", "@angular/forms": "~11.2.14",
"@angular/localize": "~10.1.5", "@angular/localize": "~11.2.14",
"@angular/platform-browser": "~10.1.5", "@angular/platform-browser": "~11.2.14",
"@angular/platform-browser-dynamic": "~10.1.5", "@angular/platform-browser-dynamic": "~11.2.14",
"@angular/router": "~10.1.5", "@angular/router": "~11.2.14",
"@ng-bootstrap/ng-bootstrap": "^8.0.4", "@ng-bootstrap/ng-bootstrap": "^9.1.2",
"@ng-select/ng-select": "^5.0.9", "@ng-select/ng-select": "^7.0.0",
"bootstrap": "^4.5.0", "bootstrap": "^4.5.0",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"ng-bootstrap": "^1.6.3",
"ng2-pdf-viewer": "^6.3.2", "ng2-pdf-viewer": "^6.3.2",
"ngx-bootstrap": "^6.2.0",
"ngx-color": "^6.2.0", "ngx-color": "^6.2.0",
"ngx-cookie-service": "^10.1.1", "ngx-cookie-service": "^10.1.1",
"ngx-file-drop": "^10.0.0", "ngx-file-drop": "^11.1.0",
"ngx-infinite-scroll": "^9.1.0", "ngx-infinite-scroll": "^9.1.0",
"rxjs": "~6.6.0", "rxjs": "~6.6.0",
"tslib": "^2.0.0", "tslib": "^2.0.0",
"uuid": "^8.3.1", "uuid": "^8.3.1",
"zone.js": "~0.10.2" "zone.js": "~0.11.4"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^0.1002.0", "@angular-devkit/build-angular": "~0.1102.13",
"@angular/cli": "~10.1.5", "@angular/cli": "~11.2.14",
"@angular/compiler-cli": "~10.1.5", "@angular/compiler-cli": "~11.2.14",
"@types/jasmine": "~3.5.0", "@types/jasmine": "~3.6.0",
"@types/jasminewd2": "~2.0.3", "@types/jasminewd2": "~2.0.3",
"@types/node": "^12.11.1", "@types/node": "^12.11.1",
"codelyzer": "^6.0.0", "codelyzer": "^6.0.0",
"jasmine-core": "~3.6.0", "jasmine-core": "~3.6.0",
"jasmine-spec-reporter": "~5.0.0", "jasmine-spec-reporter": "~5.0.0",
"karma": "~5.0.0", "karma": "~6.3.3",
"karma-chrome-launcher": "~3.1.0", "karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2", "karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "~4.0.0", "karma-jasmine": "~4.0.0",
@@ -53,6 +53,6 @@
"protractor": "~7.0.0", "protractor": "~7.0.0",
"ts-node": "~8.3.0", "ts-node": "~8.3.0",
"tslint": "~6.1.0", "tslint": "~6.1.0",
"typescript": "~4.0.2" "typescript": "~4.1.5"
} }
} }
+1 -1
View File
@@ -33,7 +33,7 @@ const routes: Routes = [
]; ];
@NgModule({ @NgModule({
imports: [RouterModule.forRoot(routes)], imports: [RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' })],
exports: [RouterModule] exports: [RouterModule]
}) })
export class AppRoutingModule { } export class AppRoutingModule { }
+1 -1
View File
@@ -1,3 +1,3 @@
<app-toasts></app-toasts> <app-toasts></app-toasts>
<router-outlet></router-outlet> <router-outlet></router-outlet>
+1 -1
View File
@@ -45,7 +45,7 @@ export class AppComponent implements OnInit, OnDestroy {
ngOnInit(): void { ngOnInit(): void {
this.consumerStatusService.connect() this.consumerStatusService.connect()
this.successSubscription = this.consumerStatusService.onDocumentConsumptionFinished().subscribe(status => { this.successSubscription = this.consumerStatusService.onDocumentConsumptionFinished().subscribe(status => {
if (this.showNotification(SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUCCESS)) { if (this.showNotification(SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUCCESS)) {
this.toastService.show({title: $localize`Document added`, delay: 10000, content: $localize`Document ${status.filename} was added to paperless.`, actionName: $localize`Open document`, action: () => { this.toastService.show({title: $localize`Document added`, delay: 10000, content: $localize`Document ${status.filename} was added to paperless.`, actionName: $localize`Open document`, action: () => {
+2
View File
@@ -76,6 +76,7 @@ import localeRu from '@angular/common/locales/ru';
import localeEs from '@angular/common/locales/es'; import localeEs from '@angular/common/locales/es';
import localePl from '@angular/common/locales/pl'; import localePl from '@angular/common/locales/pl';
import localeSv from '@angular/common/locales/sv'; import localeSv from '@angular/common/locales/sv';
import localeLb from '@angular/common/locales/lb';
registerLocaleData(localeFr) registerLocaleData(localeFr)
@@ -90,6 +91,7 @@ registerLocaleData(localeRu)
registerLocaleData(localeEs) registerLocaleData(localeEs)
registerLocaleData(localePl) registerLocaleData(localePl)
registerLocaleData(localeSv) registerLocaleData(localeSv)
registerLocaleData(localeLb)
@NgModule({ @NgModule({
declarations: [ declarations: [
@@ -30,7 +30,7 @@ export class ConfirmDialogComponent implements OnInit {
@Input() @Input()
buttonsEnabled = true buttonsEnabled = true
confirmButtonEnabled = true confirmButtonEnabled = true
seconds = 0 seconds = 0
@@ -55,7 +55,7 @@
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@@ -83,7 +83,7 @@ export class FilterableDropdownSelectionModel {
if (fireEvent) { if (fireEvent) {
this.changed.next(this) this.changed.next(this)
} }
} }
private getNonTemporary(id: number) { private getNonTemporary(id: number) {
@@ -10,7 +10,7 @@
<path d="M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8z"/> <path d="M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8z"/>
</svg> </svg>
</ng-container> </ng-container>
</div> </div>
<div class="mr-1"> <div class="mr-1">
<app-tag *ngIf="isTag; else displayName" [tag]="item" [clickable]="true" linkTitle="Filter by tag"></app-tag> <app-tag *ngIf="isTag; else displayName" [tag]="item" [clickable]="true" linkTitle="Filter by tag"></app-tag>
@@ -11,7 +11,7 @@ export class AbstractInputComponent<T> implements OnInit, ControlValueAccessor {
constructor() { } constructor() { }
onChange = (newValue: T) => {}; onChange = (newValue: T) => {};
onTouched = () => {}; onTouched = () => {};
writeValue(newValue: any): void { writeValue(newValue: any): void {
@@ -2,4 +2,4 @@
<input type="checkbox" class="custom-control-input" [id]="inputId" [(ngModel)]="value" (change)="onChange(value)" (blur)="onTouched()" [disabled]="disabled"> <input type="checkbox" class="custom-control-input" [id]="inputId" [(ngModel)]="value" (change)="onChange(value)" (blur)="onTouched()" [disabled]="disabled">
<label class="custom-control-label" [for]="inputId">{{title}}</label> <label class="custom-control-label" [for]="inputId">{{title}}</label>
<small *ngIf="hint" class="form-text text-muted">{{hint}}</small> <small *ngIf="hint" class="form-text text-muted">{{hint}}</small>
</div> </div>
@@ -15,7 +15,7 @@ import { AbstractInputComponent } from '../abstract-input';
}) })
export class CheckComponent extends AbstractInputComponent<boolean> { export class CheckComponent extends AbstractInputComponent<boolean> {
constructor() { constructor() {
super() super()
} }
@@ -5,12 +5,12 @@
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text" [style.background-color]="value">&nbsp;&nbsp;&nbsp;</span> <span class="input-group-text" [style.background-color]="value">&nbsp;&nbsp;&nbsp;</span>
</div> </div>
<ng-template #popContent> <ng-template #popContent>
<div style="min-width: 200px;" class="pb-3"> <div style="min-width: 200px;" class="pb-3">
<color-slider [color]="value" (onChangeComplete)="colorChanged($event.color.hex)"></color-slider> <color-slider [color]="value" (onChangeComplete)="colorChanged($event.color.hex)"></color-slider>
</div> </div>
</ng-template> </ng-template>
<input class="form-control" [class.is-invalid]="error" [id]="inputId" [(ngModel)]="value" (change)="onChange(value)" [autoClose]="'outside'" [ngbPopover]="popContent" placement="bottom" popoverClass="shadow"> <input class="form-control" [class.is-invalid]="error" [id]="inputId" [(ngModel)]="value" (change)="onChange(value)" [autoClose]="'outside'" [ngbPopover]="popContent" placement="bottom" popoverClass="shadow">
@@ -30,4 +30,4 @@
<div class="invalid-feedback"> <div class="invalid-feedback">
{{error}} {{error}}
</div> </div>
</div> </div>
@@ -11,4 +11,4 @@
</div> </div>
<small *ngIf="hint" class="form-text text-muted">{{hint}}</small> <small *ngIf="hint" class="form-text text-muted">{{hint}}</small>
</div> </div>
@@ -5,4 +5,4 @@
<div class="invalid-feedback"> <div class="invalid-feedback">
{{error}} {{error}}
</div> </div>
</div> </div>
@@ -12,4 +12,4 @@
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-outline-dark" (click)="cancelClicked()" i18n>Cancel</button> <button type="button" class="btn btn-outline-dark" (click)="cancelClicked()" i18n>Cancel</button>
<button type="button" class="btn btn-primary" (click)="selectClicked.emit(selected)" i18n>Select</button> <button type="button" class="btn btn-primary" (click)="selectClicked.emit(selected)" i18n>Select</button>
</div> </div>
@@ -1,2 +1,2 @@
<span *ngIf="!clickable" class="badge" [style.background]="tag.color" [style.color]="tag.text_color">{{tag.name}}</span> <span *ngIf="!clickable" class="badge" [style.background]="tag.color" [style.color]="tag.text_color">{{tag.name}}</span>
<a [routerLink]="" [title]="linkTitle" *ngIf="clickable" class="badge" [style.background]="tag.color" [style.color]="tag.text_color">{{tag.name}}</a> <a [routerLink]="" [title]="linkTitle" *ngIf="clickable" class="badge" [style.background]="tag.color" [style.color]="tag.text_color">{{tag.name}}</a>
@@ -23,7 +23,7 @@ export class StatisticsWidgetComponent implements OnInit, OnDestroy {
statistics: Statistics = {} statistics: Statistics = {}
subscription: Subscription subscription: Subscription
private getStatistics(): Observable<Statistics> { private getStatistics(): Observable<Statistics> {
return this.http.get(`${environment.apiBaseUrl}statistics/`) return this.http.get(`${environment.apiBaseUrl}statistics/`)
} }
@@ -13,4 +13,4 @@
<p i18n>Consult the documentation on how to use these features. The section on basic usage also has some information on how to use paperless in general.</p> <p i18n>Consult the documentation on how to use these features. The section on basic usage also has some information on how to use paperless in general.</p>
</ng-container> </ng-container>
</app-widget-frame> </app-widget-frame>
@@ -4,9 +4,9 @@
<h5 class="card-title mb-0">{{title}}</h5> <h5 class="card-title mb-0">{{title}}</h5>
<ng-content select ="[header-buttons]"></ng-content> <ng-content select ="[header-buttons]"></ng-content>
</div> </div>
</div> </div>
<div class="card-body text-dark"> <div class="card-body text-dark">
<ng-content select ="[content]"></ng-content> <ng-content select ="[content]"></ng-content>
</div> </div>
</div> </div>
@@ -20,4 +20,4 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
@@ -1,3 +1,3 @@
.metadata-column { .metadata-column {
overflow-wrap: anywhere; overflow-wrap: anywhere;
} }
@@ -64,4 +64,4 @@
span ::ng-deep .match { span ::ng-deep .match {
color: black; color: black;
background-color: rgb(255, 211, 66); background-color: rgb(255, 211, 66);
} }
@@ -3,7 +3,7 @@
<div class="form-inline d-flex align-items-center"> <div class="form-inline d-flex align-items-center">
<div class="input-group input-group-sm flex-fill w-auto"> <div class="input-group input-group-sm flex-fill w-auto">
<div class="input-group-prepend" ngbDropdown> <div class="input-group-prepend" ngbDropdown>
<button class="btn btn-outline-primary" ngbDropdownToggle>{{textFilterTargetName}}</button> <button class="btn btn-outline-primary" ngbDropdownToggle>{{textFilterTargetName}}</button>
<div class="dropdown-menu shadow" ngbDropdownMenu> <div class="dropdown-menu shadow" ngbDropdownMenu>
<button *ngFor="let t of textFilterTargets" ngbDropdownItem [class.active]="textFilterTarget == t.id" (click)="changeTextFilterTarget(t.id)">{{t.name}}</button> <button *ngFor="let t of textFilterTargets" ngbDropdownItem [class.active]="textFilterTarget == t.id" (click)="changeTextFilterTarget(t.id)">{{t.name}}</button>
</div> </div>
@@ -32,6 +32,6 @@ export class CorrespondentEditDialogComponent extends EditDialogComponent<Paperl
match: new FormControl(""), match: new FormControl(""),
is_insensitive: new FormControl(true) is_insensitive: new FormControl(true)
}) })
} }
} }
@@ -18,7 +18,7 @@ export class CorrespondentListComponent extends GenericListComponent<PaperlessCo
constructor(correspondentsService: CorrespondentService, modalService: NgbModal, constructor(correspondentsService: CorrespondentService, modalService: NgbModal,
private list: DocumentListViewService, private list: DocumentListViewService,
toastService: ToastService toastService: ToastService
) { ) {
super(correspondentsService,modalService,CorrespondentEditDialogComponent, toastService) super(correspondentsService,modalService,CorrespondentEditDialogComponent, toastService)
} }
@@ -13,7 +13,7 @@ import { ToastService } from 'src/app/services/toast.service';
}) })
export class DocumentTypeEditDialogComponent extends EditDialogComponent<PaperlessDocumentType> { export class DocumentTypeEditDialogComponent extends EditDialogComponent<PaperlessDocumentType> {
constructor(service: DocumentTypeService, activeModal: NgbActiveModal, toastService: ToastService) { constructor(service: DocumentTypeService, activeModal: NgbActiveModal, toastService: ToastService) {
super(service, activeModal, toastService) super(service, activeModal, toastService)
} }
@@ -49,4 +49,4 @@
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -52,4 +52,4 @@
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -5,4 +5,4 @@
<path d="M7 6.5C7 7.328 6.552 8 6 8s-1-.672-1-1.5S5.448 5 6 5s1 .672 1 1.5zm4 0c0 .828-.448 1.5-1 1.5s-1-.672-1-1.5S9.448 5 10 5s1 .672 1 1.5z"/> <path d="M7 6.5C7 7.328 6.552 8 6 8s-1-.672-1-1.5S5.448 5 6 5s1 .672 1 1.5zm4 0c0 .828-.448 1.5-1 1.5s-1-.672-1-1.5S9.448 5 10 5s1 .672 1 1.5z"/>
</svg> </svg>
<h1 i18n>404 Not Found</h1> <h1 i18n>404 Not Found</h1>
</div> </div>
+2 -2
View File
@@ -6,7 +6,7 @@ export function cloneFilterRules(filterRules: FilterRule[]): FilterRule[] {
for (let rule of filterRules) { for (let rule of filterRules) {
newRules.push({rule_type: rule.rule_type, value: rule.value}) newRules.push({rule_type: rule.rule_type, value: rule.value})
} }
return newRules return newRules
} else { } else {
return null return null
} }
@@ -19,4 +19,4 @@ export function isFullTextFilterRule(filterRules: FilterRule[]): boolean {
export interface FilterRule { export interface FilterRule {
rule_type: number rule_type: number
value: string value: string
} }
@@ -1,7 +1,7 @@
import { MatchingModel } from './matching-model'; import { MatchingModel } from './matching-model';
export interface PaperlessCorrespondent extends MatchingModel { export interface PaperlessCorrespondent extends MatchingModel {
last_correspondence?: Date last_correspondence?: Date
} }
@@ -1,5 +1,5 @@
export interface PaperlessDocumentMetadata { export interface PaperlessDocumentMetadata {
original_checksum?: string original_checksum?: string
archived_checksum?: string archived_checksum?: string
@@ -10,4 +10,4 @@ export interface PaperlessDocumentMetadata {
has_archive_version?: boolean has_archive_version?: boolean
} }
@@ -6,4 +6,4 @@ export interface PaperlessDocumentSuggestions {
document_types?: number[] document_types?: number[]
} }
+1 -1
View File
@@ -15,4 +15,4 @@ export interface PaperlessSavedView extends ObjectWithId {
filter_rules: FilterRule[] filter_rules: FilterRule[]
} }
+1 -1
View File
@@ -3,5 +3,5 @@ export interface Results<T> {
count: number count: number
results: T[] results: T[]
} }
@@ -8,4 +8,4 @@ export interface WebsocketConsumerStatusMessage {
message?: string message?: string
document_id: number document_id: number
} }
@@ -19,7 +19,7 @@ export class ApiVersionInterceptor implements HttpInterceptor {
'Accept': `application/json; version=${environment.apiVersion}` 'Accept': `application/json; version=${environment.apiVersion}`
} }
}) })
return next.handle(request); return next.handle(request);
} }
} }
@@ -20,7 +20,7 @@ export class CsrfInterceptor implements HttpInterceptor {
let prefix = "" let prefix = ""
if (this.meta.getTag('name=cookie_prefix')) { if (this.meta.getTag('name=cookie_prefix')) {
prefix = this.meta.getTag('name=cookie_prefix').content prefix = this.meta.getTag('name=cookie_prefix').content
} }
let csrfToken = this.cookieService.get(`${prefix?prefix:''}csrftoken`) let csrfToken = this.cookieService.get(`${prefix?prefix:''}csrftoken`)
if (csrfToken) { if (csrfToken) {
request = request.clone({ request = request.clone({
+4 -5
View File
@@ -11,12 +11,11 @@ const FORMAT_TO_ISO_FORMAT = {
@Pipe({ @Pipe({
name: 'customDate' name: 'customDate'
}) })
export class CustomDatePipe extends DatePipe implements PipeTransform { export class CustomDatePipe implements PipeTransform {
private defaultLocale: string private defaultLocale: string
constructor(@Inject(LOCALE_ID) locale: string, private settings: SettingsService) { constructor(@Inject(LOCALE_ID) locale: string, private datePipe: DatePipe, private settings: SettingsService) {
super(locale)
this.defaultLocale = locale this.defaultLocale = locale
} }
@@ -24,9 +23,9 @@ export class CustomDatePipe extends DatePipe implements PipeTransform {
let l = locale || this.settings.get(SETTINGS_KEYS.DATE_LOCALE) || this.defaultLocale let l = locale || this.settings.get(SETTINGS_KEYS.DATE_LOCALE) || this.defaultLocale
let f = format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT) let f = format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT)
if (l == "iso-8601") { if (l == "iso-8601") {
return super.transform(value, FORMAT_TO_ISO_FORMAT[f], timezone) return this.datePipe.transform(value, FORMAT_TO_ISO_FORMAT[f], timezone)
} else { } else {
return super.transform(value, format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT), timezone, l) return this.datePipe.transform(value, format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT), timezone, l)
} }
} }
+1 -1
View File
@@ -1,6 +1,6 @@
/** /**
* https://gist.github.com/JonCatmull/ecdf9441aaa37336d9ae2c7f9cb7289a * https://gist.github.com/JonCatmull/ecdf9441aaa37336d9ae2c7f9cb7289a
* *
* @license * @license
* Copyright (c) 2019 Jonathan Catmull. * Copyright (c) 2019 Jonathan Catmull.
* *
+1 -1
View File
@@ -16,4 +16,4 @@ export class SafePipe implements PipeTransform {
} }
} }
} }
@@ -10,7 +10,7 @@ export class OpenDocumentsService {
private MAX_OPEN_DOCUMENTS = 5 private MAX_OPEN_DOCUMENTS = 5
constructor(private documentService: DocumentService) { constructor(private documentService: DocumentService) {
if (sessionStorage.getItem(OPEN_DOCUMENT_SERVICE.DOCUMENTS)) { if (sessionStorage.getItem(OPEN_DOCUMENT_SERVICE.DOCUMENTS)) {
try { try {
this.openDocuments = JSON.parse(sessionStorage.getItem(OPEN_DOCUMENT_SERVICE.DOCUMENTS)) this.openDocuments = JSON.parse(sessionStorage.getItem(OPEN_DOCUMENT_SERVICE.DOCUMENTS))
@@ -44,7 +44,7 @@ export class SavedViewService extends AbstractPaperlessService<PaperlessSavedVie
tap(() => this.reload()) tap(() => this.reload())
) )
} }
patchMany(objects: PaperlessSavedView[]): Observable<PaperlessSavedView[]> { patchMany(objects: PaperlessSavedView[]): Observable<PaperlessSavedView[]> {
return combineLatest(objects.map(o => super.patch(o))).pipe( return combineLatest(objects.map(o => super.patch(o))).pipe(
tap(() => this.reload()) tap(() => this.reload())
@@ -10,10 +10,10 @@ import { DocumentService } from './document.service';
providedIn: 'root' providedIn: 'root'
}) })
export class SearchService { export class SearchService {
constructor(private http: HttpClient) { } constructor(private http: HttpClient) { }
autocomplete(term: string): Observable<string[]> { autocomplete(term: string): Observable<string[]> {
return this.http.get<string[]>(`${environment.apiBaseUrl}search/autocomplete/`, {params: new HttpParams().set('term', term)}) return this.http.get<string[]>(`${environment.apiBaseUrl}search/autocomplete/`, {params: new HttpParams().set('term', term)})
} }
} }
+2 -1
View File
@@ -99,7 +99,8 @@ export class SettingsService {
{code: "ru-ru", name: $localize`Russian`, englishName: "Russian", dateInputFormat: "dd.mm.yyyy"}, {code: "ru-ru", name: $localize`Russian`, englishName: "Russian", dateInputFormat: "dd.mm.yyyy"},
{code: "es-es", name: $localize`Spanish`, englishName: "Spanish", dateInputFormat: "dd/mm/yyyy"}, {code: "es-es", name: $localize`Spanish`, englishName: "Spanish", dateInputFormat: "dd/mm/yyyy"},
{code: "pl-pl", name: $localize`Polish`, englishName: "Polish", dateInputFormat: "dd.mm.yyyy"}, {code: "pl-pl", name: $localize`Polish`, englishName: "Polish", dateInputFormat: "dd.mm.yyyy"},
{code: "sv-se", name: $localize`Swedish`, englishName: "Swedish", dateInputFormat: "yyyy-mm-dd"} {code: "sv-se", name: $localize`Swedish`, englishName: "Swedish", dateInputFormat: "yyyy-mm-dd"},
{code: "lb-lu", name: $localize`Luxembourgish`, englishName: "Luxembourgish", dateInputFormat: "dd.mm.yyyy"}
] ]
} }
+2 -2
View File
@@ -6,7 +6,7 @@ function componentToHex(c) {
/** /**
* https://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c * https://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
* *
* Converts an HSL color value to RGB. Conversion formula * Converts an HSL color value to RGB. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space. * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes h, s, and l are contained in the set [0, 1] and * Assumes h, s, and l are contained in the set [0, 1] and
@@ -45,4 +45,4 @@ function hslToRgb(h, s, l){
export function randomColor() { export function randomColor() {
let rgb = hslToRgb(Math.random(), 0.6, Math.random() * 0.4 + 0.4) let rgb = hslToRgb(Math.random(), 0.6, Math.random() * 0.4 + 0.4)
return `#${componentToHex(rgb[0])}${componentToHex(rgb[1])}${componentToHex(rgb[2])}` return `#${componentToHex(rgb[0])}${componentToHex(rgb[1])}${componentToHex(rgb[2])}`
} }
@@ -56,4 +56,4 @@ export class LocalizedDateParserFormatter extends NgbDateParserFormatter {
return null return null
} }
} }
} }
+1 -1
View File
@@ -5,7 +5,7 @@ export const environment = {
apiBaseUrl: document.baseURI + "api/", apiBaseUrl: document.baseURI + "api/",
apiVersion: "2", apiVersion: "2",
appTitle: "Paperless-ng", appTitle: "Paperless-ng",
version: "1.4.3", version: "1.5.0",
webSocketHost: window.location.host, webSocketHost: window.location.host,
webSocketProtocol: (window.location.protocol == "https:" ? "wss:" : "ws:"), webSocketProtocol: (window.location.protocol == "https:" ? "wss:" : "ws:"),
webSocketBaseUrl: base_url.pathname + "ws/", webSocketBaseUrl: base_url.pathname + "ws/",
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="needs-translation">Download originals</target> <target state="needs-translation">Download originals</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="needs-translation">Add item</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="needs-translation">Suggestions:</target> <target state="needs-translation">Suggestions:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="needs-translation">Save current view</target> <target state="needs-translation">Save current view</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="needs-translation">Add tag</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="needs-translation">Modified</target> <target state="needs-translation">Modified</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="needs-translation">Search score</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Originale herunterladen</target> <target state="translated">Originale herunterladen</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Element hinzufügen</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Vorschläge:</target> <target state="translated">Vorschläge:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Aktuelle Ansicht speichern</target> <target state="translated">Aktuelle Ansicht speichern</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Tag hinzufügen</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Geändert am</target> <target state="translated">Geändert am</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Relevanz</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Download originals</target> <target state="translated">Download originals</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Add item</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Suggestions:</target> <target state="translated">Suggestions:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Save current view</target> <target state="translated">Save current view</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Add tag</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Modified</target> <target state="translated">Modified</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Search score</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+39 -13
View File
@@ -176,7 +176,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
<context context-type="linenumber">117</context> <context context-type="linenumber">117</context>
</context-group> </context-group>
<target state="translated">Tipo de documento</target> <target state="translated">Correspondencia</target>
</trans-unit> </trans-unit>
<trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e" datatype="html"> <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e" datatype="html">
<source>Title</source> <source>Title</source>
@@ -208,7 +208,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
<context context-type="linenumber">141</context> <context context-type="linenumber">141</context>
</context-group> </context-group>
<target state="translated">Aggregado</target> <target state="translated">Añadido</target>
</trans-unit> </trans-unit>
<trans-unit id="9021887951960049161" datatype="html"> <trans-unit id="9021887951960049161" datatype="html">
<source>Confirm delete</source> <source>Confirm delete</source>
@@ -1201,7 +1201,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">61</context> <context context-type="linenumber">61</context>
</context-group> </context-group>
<target state="translated">ASN: <x id="PH" equiv-text="rule.value"/></target> <target state="translated">NSA: <x id="PH" equiv-text="rule.value"/></target>
</trans-unit> </trans-unit>
<trans-unit id="5701618810648052610" datatype="html"> <trans-unit id="5701618810648052610" datatype="html">
<source>Title</source> <source>Title</source>
@@ -1233,7 +1233,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">91</context> <context context-type="linenumber">91</context>
</context-group> </context-group>
<target state="needs-translation">Advanced search</target> <target state="translated">Búsqueda avanzada</target>
</trans-unit> </trans-unit>
<trans-unit id="2649431021108393503" datatype="html"> <trans-unit id="2649431021108393503" datatype="html">
<source>More like</source> <source>More like</source>
@@ -1241,7 +1241,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">94</context> <context context-type="linenumber">94</context>
</context-group> </context-group>
<target state="needs-translation">More like</target> <target state="translated">Más parecido</target>
</trans-unit> </trans-unit>
<trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html"> <trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html">
<source>Filter tags</source> <source>Filter tags</source>
@@ -1386,7 +1386,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context> <context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">43</context> <context context-type="linenumber">43</context>
</context-group> </context-group>
<target state="needs-translation">Created: <x id="INTERPOLATION" equiv-text="{{ document.created | customDate}}"/></target> <target state="translated">Creado: <x id="INTERPOLATION" equiv-text="{{ document.created | customDate}}"/></target>
</trans-unit> </trans-unit>
<trans-unit id="0f5d856cb63c69fde44fbfc653ec0655f9040865" datatype="html"> <trans-unit id="0f5d856cb63c69fde44fbfc653ec0655f9040865" datatype="html">
<source>Added: <x id="INTERPOLATION" equiv-text="{{ document.added | customDate}}"/></source> <source>Added: <x id="INTERPOLATION" equiv-text="{{ document.added | customDate}}"/></source>
@@ -1394,7 +1394,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context> <context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">44</context>
</context-group> </context-group>
<target state="needs-translation">Added: <x id="INTERPOLATION" equiv-text="{{ document.added | customDate}}"/></target> <target state="translated">Añadido: <x id="INTERPOLATION" equiv-text="{{ document.added | customDate}}"/></target>
</trans-unit> </trans-unit>
<trans-unit id="a205126adef6251fc63305f1a6228d07bc2795a8" datatype="html"> <trans-unit id="a205126adef6251fc63305f1a6228d07bc2795a8" datatype="html">
<source>Modified: <x id="INTERPOLATION" equiv-text="{{ document.modified | customDate}}"/></source> <source>Modified: <x id="INTERPOLATION" equiv-text="{{ document.modified | customDate}}"/></source>
@@ -1402,7 +1402,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context> <context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">45</context> <context context-type="linenumber">45</context>
</context-group> </context-group>
<target state="needs-translation">Modified: <x id="INTERPOLATION" equiv-text="{{ document.modified | customDate}}"/></target> <target state="translated">Modificado: <x id="INTERPOLATION" equiv-text="{{ document.modified | customDate}}"/></target>
</trans-unit> </trans-unit>
<trans-unit id="7985804062689412812" datatype="html"> <trans-unit id="7985804062689412812" datatype="html">
<source>Error executing bulk operation: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source> <source>Error executing bulk operation: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source>
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Descargar originales</target> <target state="translated">Descargar originales</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Añadir elemento</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Sugerencias:</target> <target state="translated">Sugerencias:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Guardar la vista actual</target> <target state="translated">Guardar la vista actual</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Añadir etiqueta</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -1855,7 +1872,7 @@
<context context-type="sourcefile">src/app/components/document-asn/document-asn.component.html</context> <context context-type="sourcefile">src/app/components/document-asn/document-asn.component.html</context>
<context context-type="linenumber">1</context> <context context-type="linenumber">1</context>
</context-group> </context-group>
<target state="needs-translation">Searching document with asn <x id="INTERPOLATION" equiv-text="{{asn}}"/></target> <target state="translated">Buscando documento con NSA <x id="INTERPOLATION" equiv-text="{{asn}}"/></target>
</trans-unit> </trans-unit>
<trans-unit id="2807800733729323332" datatype="html"> <trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source> <source>Yes</source>
@@ -1927,7 +1944,7 @@
<context context-type="sourcefile">src/app/services/settings.service.ts</context> <context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">95</context> <context context-type="linenumber">95</context>
</context-group> </context-group>
<target state="needs-translation">Portuguese</target> <target state="translated">Portugués</target>
</trans-unit> </trans-unit>
<trans-unit id="9184513005098760425" datatype="html"> <trans-unit id="9184513005098760425" datatype="html">
<source>Portuguese (Brazil)</source> <source>Portuguese (Brazil)</source>
@@ -1975,7 +1992,7 @@
<context context-type="sourcefile">src/app/services/settings.service.ts</context> <context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context> <context context-type="linenumber">101</context>
</context-group> </context-group>
<target state="needs-translation">Polish</target> <target state="translated">Polaco</target>
</trans-unit> </trans-unit>
<trans-unit id="499386805970351976" datatype="html"> <trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source> <source>Swedish</source>
@@ -1983,7 +2000,7 @@
<context context-type="sourcefile">src/app/services/settings.service.ts</context> <context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context> <context context-type="linenumber">102</context>
</context-group> </context-group>
<target state="needs-translation">Swedish</target> <target state="translated">Sueco</target>
</trans-unit> </trans-unit>
<trans-unit id="4912706592792948707" datatype="html"> <trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source> <source>ISO 8601</source>
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Modificado</target> <target state="translated">Modificado</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Puntuación de búsqueda</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Télécharger les originaux</target> <target state="translated">Télécharger les originaux</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Ajouter un élément</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Suggestions : </target> <target state="translated">Suggestions : </target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Enregistrer la vue actuelle</target> <target state="translated">Enregistrer la vue actuelle</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Ajouter une étiquette</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Date de modification</target> <target state="translated">Date de modification</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Pertinence</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="needs-translation">Download originals</target> <target state="needs-translation">Download originals</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="needs-translation">Add item</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="needs-translation">Suggestions:</target> <target state="needs-translation">Suggestions:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Jelenlegi nézet mentése</target> <target state="translated">Jelenlegi nézet mentése</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="needs-translation">Add tag</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Módosítva</target> <target state="translated">Módosítva</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="needs-translation">Search score</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+28 -2
View File
@@ -1378,7 +1378,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context> <context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">87</context> <context context-type="linenumber">87</context>
</context-group> </context-group>
<target state="translated">Punteggio:</target> <target state="translated">Rilevanza:</target>
</trans-unit> </trans-unit>
<trans-unit id="727d980bba2b3e0b3d8705607f1208eef046479b" datatype="html"> <trans-unit id="727d980bba2b3e0b3d8705607f1208eef046479b" datatype="html">
<source>Created: <x id="INTERPOLATION" equiv-text="{{ document.created | customDate}}"/></source> <source>Created: <x id="INTERPOLATION" equiv-text="{{ document.created | customDate}}"/></source>
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Scarica originali</target> <target state="translated">Scarica originali</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Aggiungi elemento</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Suggerimenti:</target> <target state="translated">Suggerimenti:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Salva vista corrente</target> <target state="translated">Salva vista corrente</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Aggiungi tag</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Modificato</target> <target state="translated">Modificato</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Rilevanza ricerca</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
File diff suppressed because it is too large. Load diff
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Originelen downloaden</target> <target state="translated">Originelen downloaden</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Item toevoegen</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Suggesties:</target> <target state="translated">Suggesties:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Huidige view opslaan</target> <target state="translated">Huidige view opslaan</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Label toevoegen</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Gewijzigd</target> <target state="translated">Gewijzigd</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Zoekscore</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+28 -2
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Pobierz oryginały</target> <target state="translated">Pobierz oryginały</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Dodaj element</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Sugestie:</target> <target state="translated">Sugestie:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Zapisz bieżący widok</target> <target state="translated">Zapisz bieżący widok</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Dodaj tag</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -1983,7 +2000,7 @@
<context context-type="sourcefile">src/app/services/settings.service.ts</context> <context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context> <context context-type="linenumber">102</context>
</context-group> </context-group>
<target state="needs-translation">Swedish</target> <target state="translated">Szwedzki</target>
</trans-unit> </trans-unit>
<trans-unit id="4912706592792948707" datatype="html"> <trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source> <source>ISO 8601</source>
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Zmodyfikowano</target> <target state="translated">Zmodyfikowano</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Dopasowanie</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Descarregar originais</target> <target state="translated">Descarregar originais</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="needs-translation">Add item</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Sugestões:</target> <target state="translated">Sugestões:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Salvar visualização atual</target> <target state="translated">Salvar visualização atual</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="needs-translation">Add tag</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Modificado</target> <target state="translated">Modificado</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="needs-translation">Search score</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Descarregar originais</target> <target state="translated">Descarregar originais</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Adicionar item</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Sugestões:</target> <target state="translated">Sugestões:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Guardar a vista atual</target> <target state="translated">Guardar a vista atual</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Adicionar etiqueta</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Modificado</target> <target state="translated">Modificado</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Pesquisar pontuação</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Descarcă originalele</target> <target state="translated">Descarcă originalele</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Adaugă element</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Sugestii:</target> <target state="translated">Sugestii:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Salvează vizualizarea curenta</target> <target state="translated">Salvează vizualizarea curenta</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Adaugă etichetă</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Modificat</target> <target state="translated">Modificat</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Scor de căutare</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Скачать оригиналы</target> <target state="translated">Скачать оригиналы</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="needs-translation">Add item</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Рекомендации:</target> <target state="translated">Рекомендации:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Сохранить текущее представление</target> <target state="translated">Сохранить текущее представление</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="needs-translation">Add tag</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Изменено</target> <target state="translated">Изменено</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="needs-translation">Search score</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="translated">Ladda ner original</target> <target state="translated">Ladda ner original</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="translated">Lägg till objekt</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="translated">Förslag:</target> <target state="translated">Förslag:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="translated">Spara aktuell vy</target> <target state="translated">Spara aktuell vy</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="translated">Lägg till tagg</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="translated">Ändrad</target> <target state="translated">Ändrad</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="translated">Sök resultat</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target>crwdns3238:0crwdne3238:0</target> <target>crwdns3238:0crwdne3238:0</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target>crwdns3450:0crwdne3450:0</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target>crwdns3240:0crwdne3240:0</target> <target>crwdns3240:0crwdne3240:0</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target>crwdns3242:0crwdne3242:0</target> <target>crwdns3242:0crwdne3242:0</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target>crwdns3452:0crwdne3452:0</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target>crwdns3364:0crwdne3364:0</target> <target>crwdns3364:0crwdne3364:0</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target>crwdns3454:0crwdne3454:0</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
+27 -1
View File
@@ -1607,11 +1607,20 @@
</context-group> </context-group>
<target state="needs-translation">Download originals</target> <target state="needs-translation">Download originals</target>
</trans-unit> </trans-unit>
<trans-unit id="0f72a164f5a5d10d1fbdeeb84ac80a63c04b7e1b" datatype="html">
<source>Add item</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<note priority="1" from="description">Used for both types and correspondents</note>
<target state="needs-translation">Add item</target>
</trans-unit>
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html"> <trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
<source>Suggestions:</source> <source>Suggestions:</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context> <context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">29</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<target state="needs-translation">Suggestions:</target> <target state="needs-translation">Suggestions:</target>
</trans-unit> </trans-unit>
@@ -1623,6 +1632,14 @@
</context-group> </context-group>
<target state="needs-translation">Save current view</target> <target state="needs-translation">Save current view</target>
</trans-unit> </trans-unit>
<trans-unit id="21fd41eb147f55ca26362f9c398e47733639837a" datatype="html">
<source>Add tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">11</context>
</context-group>
<target state="needs-translation">Add tag</target>
</trans-unit>
<trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html"> <trans-unit id="4eb84de23219c85432e38fb4fbdeb6c0f103ff8b" datatype="html">
<source>Show all</source> <source>Show all</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -2157,6 +2174,15 @@
</context-group> </context-group>
<target state="needs-translation">Modified</target> <target state="needs-translation">Modified</target>
</trans-unit> </trans-unit>
<trans-unit id="4460262093225954455" datatype="html">
<source>Search score</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">28</context>
</context-group>
<note priority="1" from="description">Score is a value returned by the full text search engine and specifies how well a result matches the given query</note>
<target state="needs-translation">Search score</target>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html"> <trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source> <source>Create new item</source>
<context-group purpose="location"> <context-group purpose="location">
Executable → Regular
View File
File mode changed.
Executable → Regular
+32 -11
View File
@@ -3,6 +3,7 @@ import logging
import os import os
import pickle import pickle
import re import re
import shutil
from django.conf import settings from django.conf import settings
@@ -13,6 +14,10 @@ class IncompatibleClassifierVersionError(Exception):
pass pass
class ClassifierModelCorruptError(Exception):
pass
logger = logging.getLogger("paperless.classifier") logger = logging.getLogger("paperless.classifier")
@@ -34,7 +39,8 @@ def load_classifier():
try: try:
classifier.load() classifier.load()
except (EOFError, IncompatibleClassifierVersionError) as e: except (ClassifierModelCorruptError,
IncompatibleClassifierVersionError):
# there's something wrong with the model file. # there's something wrong with the model file.
logger.exception( logger.exception(
f"Unrecoverable error while loading document " f"Unrecoverable error while loading document "
@@ -42,9 +48,14 @@ def load_classifier():
) )
os.unlink(settings.MODEL_FILE) os.unlink(settings.MODEL_FILE)
classifier = None classifier = None
except OSError as e: except OSError:
logger.error( logger.exception(
f"Error while loading document classification model: {str(e)}" f"IO error while loading document classification model"
)
classifier = None
except Exception:
logger.exception(
f"Unknown error while loading document classification model"
) )
classifier = None classifier = None
@@ -74,16 +85,22 @@ class DocumentClassifier(object):
raise IncompatibleClassifierVersionError( raise IncompatibleClassifierVersionError(
"Cannor load classifier, incompatible versions.") "Cannor load classifier, incompatible versions.")
else: else:
self.data_hash = pickle.load(f) try:
self.data_vectorizer = pickle.load(f) self.data_hash = pickle.load(f)
self.tags_binarizer = pickle.load(f) self.data_vectorizer = pickle.load(f)
self.tags_binarizer = pickle.load(f)
self.tags_classifier = pickle.load(f) self.tags_classifier = pickle.load(f)
self.correspondent_classifier = pickle.load(f) self.correspondent_classifier = pickle.load(f)
self.document_type_classifier = pickle.load(f) self.document_type_classifier = pickle.load(f)
except Exception:
raise ClassifierModelCorruptError()
def save(self): def save(self):
with open(settings.MODEL_FILE, "wb") as f: target_file = settings.MODEL_FILE
target_file_temp = settings.MODEL_FILE + ".part"
with open(target_file_temp, "wb") as f:
pickle.dump(self.FORMAT_VERSION, f) pickle.dump(self.FORMAT_VERSION, f)
pickle.dump(self.data_hash, f) pickle.dump(self.data_hash, f)
pickle.dump(self.data_vectorizer, f) pickle.dump(self.data_vectorizer, f)
@@ -94,6 +111,10 @@ class DocumentClassifier(object):
pickle.dump(self.correspondent_classifier, f) pickle.dump(self.correspondent_classifier, f)
pickle.dump(self.document_type_classifier, f) pickle.dump(self.document_type_classifier, f)
if os.path.isfile(target_file):
os.unlink(target_file)
shutil.move(target_file_temp, target_file)
def train(self): def train(self):
data = list() data = list()
Executable → Regular
+9
View File
@@ -333,6 +333,15 @@ class Consumer(LoggingMixin):
self.log("debug", "Deleting file {}".format(self.path)) self.log("debug", "Deleting file {}".format(self.path))
os.unlink(self.path) os.unlink(self.path)
# https://github.com/jonaswinkler/paperless-ng/discussions/1037
shadow_file = os.path.join(
os.path.dirname(self.path),
"._" + os.path.basename(self.path))
if os.path.isfile(shadow_file):
self.log("debug", "Deleting file {}".format(shadow_file))
os.unlink(shadow_file)
except Exception as e: except Exception as e:
self._fail( self._fail(
str(e), str(e),
Executable → Regular
View File
File mode changed.
@@ -1,6 +1,6 @@
import logging import logging
import os import os
from pathlib import Path from pathlib import Path, PurePath
from threading import Thread from threading import Thread
from time import sleep from time import sleep
@@ -36,8 +36,15 @@ def _tags_from_path(filepath):
return tag_ids return tag_ids
def _is_ignored(filepath: str) -> bool:
filepath_relative = PurePath(filepath).relative_to(
settings.CONSUMPTION_DIR)
return any(
filepath_relative.match(p) for p in settings.CONSUMER_IGNORE_PATTERNS)
def _consume(filepath): def _consume(filepath):
if os.path.isdir(filepath): if os.path.isdir(filepath) or _is_ignored(filepath):
return return
if not os.path.isfile(filepath): if not os.path.isfile(filepath):
@@ -71,6 +78,9 @@ def _consume(filepath):
def _consume_wait_unmodified(file): def _consume_wait_unmodified(file):
if _is_ignored(file):
return
logger.debug(f"Waiting for file {file} to remain unmodified") logger.debug(f"Waiting for file {file} to remain unmodified")
mtime = -1 mtime = -1
current_try = 0 current_try = 0
View File
File mode changed.
Loaded 100 of 135 files, more files were not shown because too many files have changed in this diff. Show more