Compare commits

...
Author SHA1 Message Date
jonaswinkler 27ba139810 workaround for issue with pikepdf 2021-05-13 14:15:42 +02:00
jonaswinkler 27ff38b79e Merge branch 'dev' into feature-merge-tool 2021-05-13 14:08:31 +02:00
jonaswinkler b89b51b121 Merge branch 'master' into dev 2021-05-09 16:22:21 +02:00
Jonas Winkler 1b31388232 Merge pull request #995 from cmer/prevent-robot-indexing
Tell web crawlers to not index Paperless
2021-05-07 22:30:49 +02:00
Jonas Winkler 8256e73f04 Merge pull request #994 from shamoon/fix/issue-985
Respect user dark mode setting on login page
2021-05-07 22:30:03 +02:00
Carl Mercier fc4e59ec00 Tell web crawlers to not index Paperless 2021-05-07 14:02:11 -04:00
Michael Shamoon 428e00ba23 Respect user dark mode setting on login page 2021-05-07 10:50:08 -07:00
Jonas Winkler 2ccbb08c3f Merge pull request #992 from muued/patch-2
Mention lacking support for ARM in ansible setup
2021-05-06 20:58:59 +02:00
Jonas Winkler eefc026a17 Merge pull request #991 from muued/patch-1
Use ansible-galaxy for ansible setup
2021-05-06 17:51:21 +02:00
Fabian Ohler d89022a280 Mention lacking support for ARM in ansible setup
Since the jbig2enc dependency is pulled from a repository that only provides i386 and amd64 packages, the installation will fail on arm hosts.
2021-05-06 14:15:12 +02:00
Fabian Ohler 93bd24c9d2 Update setup.rst
use ansible-galaxy to fetch the ansible scripts to have a role called paperless-ng instead of ansible
2021-05-06 14:08:49 +02:00
Jonas Winkler 197aec2945 New Crowdin updates (#988)
* New translations django.po (French)
[ci skip]

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

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

* New translations messages.xlf (Portuguese)
[ci skip]
2021-05-05 22:36:22 +02:00
Jonas Winkler e16d58cff5 New Crowdin updates (#986) 2021-05-05 14:49:08 +02:00
Jonas Winkler 92667009be add swedish locale 2021-05-04 17:01:39 +02:00
Jonas Winkler c93657f40e New Crowdin updates (#976) 2021-05-04 15:28:10 +02:00
Jonas Winkler 16658f5939 Merge pull request #965 from jovandeginste/add-rtf
Add support for rtf
2021-04-30 19:11:07 +02:00
Jo Vandeginste ec0af59596 Add support for rtf
Signed-off-by: Jo Vandeginste <Jo.Vandeginste@kuleuven.be>
2021-04-30 13:19:12 +02:00
Jonas Winkler 9e1f9d6d9d Merge pull request #960 from shamoon/fix/issue-65-2
Remove PDF type attribute to fix macOS Safari native PDF viewer crashing
2021-04-28 16:45:22 +02:00
Michael Shamoon e652b927ce Remove type attribute of pdf object in document detail 2021-04-28 07:32:18 -07:00
Jonas Winkler 5a97f3f94b update libseccomp2 2021-04-28 02:12:55 +02:00
Jonas Winkler 9494c243a4 changelog, version bump 2021-04-27 22:52:50 +02:00
Jonas Winkler c0a1be4325 Merge pull request #956 from WhiteHatTux/bugfix/879
Use gosu as it is less complicated than sudo
2021-04-27 09:59:05 +02:00
Jonas Winkler 70fda8e2f8 New Crowdin updates (#932) 2021-04-27 09:52:30 +02:00
Christopher Timm 5765893f69 Use gosu instead of sudo for easier configuration
#879
2021-04-26 19:06:30 -05:00
jonaswinkler 17b9d7eb42 Merge branch 'master' into dev 2021-04-18 12:41:52 +02:00
jonaswinkler 0a897cae32 bugfix 2021-04-18 11:29:12 +02:00
jonaswinkler 37f56e824a Merge branch 'dev' of github.com:jonaswinkler/paperless-ng into dev 2021-04-18 11:25:21 +02:00
jonaswinkler a8e7ec0e96 changelog, version bump 2021-04-18 11:25:11 +02:00
Jonas Winkler b86d853cf1 New Crowdin updates (#931) 2021-04-18 10:49:22 +02:00
Jonas Winkler da0c94c9a1 New Crowdin updates (#930) 2021-04-17 22:33:42 +02:00
jonaswinkler 0547fd2760 fix minor issue 2021-04-17 22:33:06 +02:00
jonaswinkler e0a6df8435 Merge branch 'dev' of github.com:jonaswinkler/paperless-ng into dev 2021-04-17 22:30:45 +02:00
jonaswinkler c2d4ca7566 lets hope this works 2021-04-17 22:29:54 +02:00
jonaswinkler 56ce278bbd update FAQ 2021-04-17 22:29:24 +02:00
Jonas Winkler e112541f5b New Crowdin updates (#929) 2021-04-17 20:34:57 +02:00
jonaswinkler 17c7b0840b changes for django 3.2 2021-04-17 16:00:29 +02:00
jonaswinkler 68658bd407 update dependencies 2021-04-17 14:56:25 +02:00
Jonas Winkler 9184845a9d Merge pull request #890 from what-name/feature/superuser-manager
Create initial Paperless user automatically
2021-04-17 14:44:01 +02:00
Jonas Winkler 8ddb2fb305 New Crowdin updates (#928) 2021-04-17 14:37:31 +02:00
jonaswinkler 96f53986b7 pycodestyle 2021-04-17 14:36:04 +02:00
jonaswinkler 8566682209 add test case, update password if changed 2021-04-17 14:33:07 +02:00
jonaswinkler 4f9ae17059 Merge branch 'dev' into feature/superuser-manager
# Conflicts:
#	docker/docker-entrypoint.sh
2021-04-17 14:10:56 +02:00
jonaswinkler 7f9f805c5f Merge branch 'dev' into feature/superuser-manager 2021-04-17 14:01:42 +02:00
Jonas Winkler 5208e81715 Merge pull request #856 from sbrl/patch-1
docker-entrypoint.sh: don't crash on chown errors
2021-04-17 13:57:14 +02:00
Jonas Winkler 01a786c117 Merge pull request #894 from lknop/master
add single compose file for usage in portainer environments
2021-04-17 13:50:11 +02:00
Jonas Winkler 8bf4f31954 Merge pull request #918 from shamoon/fix/issue-907
"Sticky" filter editor and bulk editor
2021-04-17 13:48:54 +02:00
jonaswinkler 07ab3e98ed add pl-PL locale 2021-04-17 13:41:26 +02:00
Jonas Winkler ba5899de7b New Crowdin updates (#874) 2021-04-17 13:34:42 +02:00
Michael Shamoon a4fef056ed Fix breakpoint
File missing from last commit
2021-04-14 13:24:03 -07:00
Michael Shamoon c266cd6aae Spacing tweaks, mobile breakpoint 2021-04-14 09:34:39 -07:00
Michael Shamoon 43d05b2e6d Hide visible underlying shadows on filter / bulk editor 2021-04-14 09:00:57 -07:00
Michael Shamoon 6f0c14cc07 Make filter editor / bulk editor 'sticky' on scroll 2021-04-14 09:00:30 -07:00
Lukasz Knop 2eac8fa91c disabled unnecessary overrides, copied variable comments 2021-04-11 21:48:50 +02:00
Lukasz Knop 31f5e178b3 add single compose file for usage in portainer environments 2021-04-11 15:16:04 +02:00
Chris Nagy c3d7088168 Fix code guidelines 2021-04-10 16:10:45 +02:00
Chris Nagy a9e11b1cb7 Add newline end of file 2021-04-10 16:02:48 +02:00
Chris Nagy ee51a0be13 Minor docs change 2021-04-10 15:08:33 +02:00
jonaswinkler 1091387f48 better logging for the retagger 2021-04-10 14:38:39 +02:00
jonaswinkler 4db75537cb install sudo from stable 2021-04-10 14:38:19 +02:00
Chris Nagy cb4e738a0f Fix env variable in docker entrypoint 2021-04-10 13:50:52 +02:00
Chris Nagy 0cc32e7ed7 Extend docs with superuser 2021-04-10 13:47:31 +02:00
Jonas Winkler 94f90e1e81 Merge pull request #887 from alexpovel/master
Fix typo
2021-04-10 00:21:45 +02:00
Alex Povel ce8f315747 Fix typo
See also https://github.com/jonaswinkler/paperless-ng/blob/a3c4e4c6b65086f9c1af9569b9a771ef8320d917/docker/compose/docker-compose.env#L30
2021-04-09 22:14:09 +02:00
Starbeamrainbowlabs b761a549c0 docker-prepare.sh: remove rogue instances of sudo
This is being done by calling the script as the correct user in the 
first place.
2021-04-08 03:06:01 +01:00
Starbeamrainbowlabs dd7c5da256 docker-entrypoint.sh: split non-root tasks into docker-prepare.sh 2021-04-08 00:03:55 +01:00
Starbeamrainbowlabs 02dd7ec615 docker: mark scripts as executable 2021-04-07 23:19:20 +01:00
Jonas Winkler b7b448b870 Merge pull request #875 from shamoon/fix/large-card-info-layout
Fix alignment of card info on large cards
2021-04-06 23:41:03 +02:00
Michael Shamoon b7326afe5a Fix alignment of card info on large cards 2021-04-06 14:25:59 -07:00
Jonas Winkler d521d7733b Merge pull request #789 from shamoon/feature/merge-tool-ui
Feature: merge tool UI
2021-04-03 22:26:57 +02:00
Michael Shamoon 99bde7b613 Dont import entire dark mode theme just for 1 color 2021-04-02 14:18:48 -07:00
Michael Shamoon cc5b7eb4e3 Center preview title when empty 2021-04-02 11:10:42 -07:00
Michael Shamoon 2b4a0efef8 Move add to split merge directly into bulk editor 2021-04-02 10:57:06 -07:00
Michael Shamoon 9502917df6 Fix overhang of separator background 2021-04-02 08:05:02 -07:00
Michael Shamoon 6f3c72ef9a Fix options text color not visible in light mode 2021-04-02 07:54:03 -07:00
Michael Shamoon 3915149ea1 Remove separators from first / last position when dragged 2021-04-02 07:51:24 -07:00
Michael Shamoon f07fb6e1b3 Fix tabs in light mode 2021-04-02 07:47:06 -07:00
Michael Shamoon e328c439ff Change to 5/7 column width layout 2021-04-02 07:28:54 -07:00
Michael Shamoon caa9a340a4 Increase height of dropzone 2021-04-02 07:27:42 -07:00
Michael Shamoon b07537aa9a Merge branch 'feature-merge-tool' into feature/merge-tool-ui 2021-04-02 07:11:05 -07:00
jonaswinkler 8e35e6c726 fix test cases 2021-04-02 15:32:00 +02:00
jonaswinkler 05a43a05a4 Merge branch 'dev' into feature-merge-tool 2021-04-02 15:17:44 +02:00
Michael Shamoon 846a997323 Better button responsive layout 2021-03-31 10:35:39 -07:00
Michael Shamoon e0231a4638 Dont allow separator at start of document 2021-03-31 10:24:04 -07:00
Michael Shamoon b4db388d58 Dont initialize page number until page is rendered 2021-03-31 10:23:49 -07:00
Michael Shamoon e957d9aa53 Changes missed from last commit, enables page numbers in previews 2021-03-30 13:56:17 -07:00
Michael Shamoon 72031824bf Preview page numbers 2021-03-25 15:01:05 -07:00
Michael Shamoon ae60fc8c2b Fix popover shadow 2021-03-24 23:23:01 -07:00
Michael Shamoon cc3c7ad481 Apply danger on delete toggle to entire label 2021-03-24 23:21:23 -07:00
Michael Shamoon 484edce5ab Split button should respect pre-selected pages 2021-03-24 23:12:02 -07:00
Michael Shamoon 66aee1446c Light mode fixes, styling tweaks 2021-03-24 22:36:19 -07:00
Michael Shamoon 971392345b Dont allow separator at the end of document parts list 2021-03-24 22:24:18 -07:00
Michael Shamoon c5ae3377bd Basic error handling 2021-03-24 22:16:51 -07:00
Michael Shamoon 4ddd031976 Slightly increasing button spacing on cards 2021-03-24 21:46:18 -07:00
Michael Shamoon c18180f344 Remove debug stuff 2021-03-24 21:46:06 -07:00
Michael Shamoon c07bbcb33f No return type on setter 2021-03-24 21:35:13 -07:00
Michael Shamoon 142c2ac9ff Sanitize pages input 2021-03-24 21:34:43 -07:00
Michael Shamoon 88bf679fd9 Unified button toolbar 2021-03-24 21:08:22 -07:00
Michael Shamoon a5de83fe7f Better clear button 2021-03-24 20:55:19 -07:00
Michael Shamoon 63b4c33fb9 Metadata options & source options merged into options popover panel 2021-03-24 20:37:50 -07:00
Michael Shamoon e0a1ba56dd Typescript fixes 2021-03-24 20:04:16 -07:00
Michael Shamoon aaa913f204 Options popover 2021-03-24 16:16:18 -07:00
Michael Shamoon cf5747f0bd Toggle for source document handling 2021-03-24 13:46:35 -07:00
Michael Shamoon 7df9e1f532 Translation stuff 2021-03-23 14:58:09 -07:00
Michael Shamoon 38d8b34ab4 Clear pages button 2021-03-23 14:57:59 -07:00
Michael Shamoon 24d07fcc17 Missing handle 2021-03-23 14:57:41 -07:00
Michael Shamoon 14116c85e7 Hide preview after all documents removed 2021-03-23 14:28:11 -07:00
Michael Shamoon 20b95fb506 Disable page chooser button if no page chosen 2021-03-23 14:24:42 -07:00
Michael Shamoon 3c25595fc2 Separator styling 2021-03-23 14:21:46 -07:00
Michael Shamoon af1034f84b Visual reorganization 2021-03-23 11:01:10 -07:00
Michael Shamoon cfc0925e04 Split support including tabbed previews 2021-03-23 00:03:21 -07:00
Michael Shamoon 746c03c198 Remove 'mode' concept, basic split UI, many visual changes 2021-03-22 22:31:52 -07:00
Michael Shamoon baae3c2701 Allow removing last document 2021-03-20 22:56:36 -07:00
Michael Shamoon d88cd05857 Allow empty pages field 2021-03-20 22:50:23 -07:00
Michael Shamoon 73c80c3f7a Page field formatting 2021-03-20 22:47:20 -07:00
Michael Shamoon 35f9989255 Allow input-debounce input 2021-03-20 22:04:49 -07:00
Michael Shamoon 33ddd033f2 Allow additional classes for input-debounce & fix field display 2021-03-20 21:45:31 -07:00
Michael Shamoon b8fabb623e InputDebounce component for page fields 2021-03-20 21:32:52 -07:00
Michael Shamoon 37c0fa4fab Merge branch 'feature-merge-tool' into feature/merge-tool-ui 2021-03-18 14:25:24 -07:00
Michael Shamoon 86ca37909b Basic page support 2021-03-16 22:36:59 -07:00
Michael Shamoon ce19525758 Change icons 2021-03-16 20:31:31 -07:00
Michael Shamoon bb872ab56f Tooltip, random styling stuff 2021-03-16 15:31:54 -07:00
Michael Shamoon ea342831da Basic mode toggling 2021-03-16 14:53:23 -07:00
Michael Shamoon 8d0ac690fb Basic page chooser component 2021-03-16 10:29:22 -07:00
jonaswinkler e0f14941e8 added some test cases and validation 2021-03-16 10:20:58 +01:00
Michael Shamoon 7cbb50565c Basic duplicate & delete 2021-03-14 22:12:27 -07:00
Michael Shamoon 274df28f39 Spacer styling 2021-03-14 21:29:47 -07:00
Michael Shamoon 4a6160869c Naming 2021-03-14 21:27:58 -07:00
Michael Shamoon 87d969f44c Basic action buttons 2021-03-14 21:21:13 -07:00
Michael Shamoon 7746ab4522 Basic document chooser 2021-03-14 20:34:32 -07:00
Michael Shamoon 58cb42b44a Typescript 2021-03-14 14:53:32 -07:00
Michael Shamoon 8e330fc97a Basic live preview 2021-03-14 14:40:32 -07:00
Michael Shamoon 6a3ad77950 Skeleton UI for buttons 2021-03-14 14:02:01 -07:00
Chris Nagy e3ba968fef Add superuser management script 2021-03-14 19:43:22 +01:00
jonaswinkler 3d56621253 Merge branch 'dev' into feature-merge-tool 2021-03-14 19:22:08 +01:00
Michael Shamoon 9e6cb1b868 Basic layout elements, loading spinner 2021-03-14 09:30:29 -07:00
Michael Shamoon 321fad0564 Basic drag-n-drop 2021-03-13 22:34:47 -08:00
Michael Shamoon eb7b767e35 Basic button for initiating split/merge from bulk editor 2021-03-13 21:00:53 -08:00
jonaswinkler 98b26b8e16 changed page specification 2021-03-13 19:29:11 +01:00
jonaswinkler 176d1fa2eb a couple changes 2021-03-13 18:21:36 +01:00
jonaswinkler 072134366c codestyle 2021-03-13 18:02:52 +01:00
jonaswinkler afd92af168 codestyle 2021-03-13 17:59:56 +01:00
jonaswinkler 2d61698509 couple changes 2021-03-13 17:56:38 +01:00
jonaswinkler 5e286798d5 better error messages 2021-03-13 17:48:51 +01:00
jonaswinkler b7a825301a support for overriding the date created 2021-03-13 17:48:38 +01:00
jonaswinkler 02da012603 added tests for merge 2021-03-13 17:47:54 +01:00
jonaswinkler 4d99e72a0e Merge branch 'dev' into feature-merge-tool 2021-03-12 23:24:16 +01:00
jonaswinkler 26c0568b1e some changes 2021-03-11 22:26:29 +01:00
jonaswinkler aa4d9782b7 initial gui #335 2021-03-11 22:23:01 +01:00
jonaswinkler 43ccf6682c move a couple things around 2021-03-11 22:09:23 +01:00
jonaswinkler 5e096bc8ce Angular interfaces for split+merge API support #335 2021-03-11 18:00:19 +01:00
jonaswinkler 1e131f0217 added a very crude and largely untested API endpoint for document merging #335 2021-03-11 17:58:16 +01:00
jonaswinkler 321869edb0 Merge branch 'dev' into feature-merge-tool 2021-03-11 10:10:31 +01:00
jonaswinkler c6e8faa718 initial implementation of merge tool 2021-03-10 22:26:31 +01:00
jonaswinkler 6696c4d7a5 initial work on merge tool frontend 2021-03-10 21:43:14 +01:00
jonaswinkler 88254bdb79 Merge branch 'dev' into feature-merge-tool 2021-03-10 18:44:55 +01:00
jonaswinkler 4cc6bf889e Added a dummy endpoint with no functionality to the API 2021-02-13 14:56:58 +01:00
109 changed files with 9500 additions and 850 deletions

No files matched your search

+18 -13
View File
@@ -11,16 +11,15 @@ RUN ./configure && make
FROM python:3.7-slim
# Binary dependencies
RUN echo "deb http://deb.debian.org/debian bullseye main" > /etc/apt/sources.list.d/bullseye.list \
&& apt-get update \
&& apt-get -y --no-install-recommends install \
RUN apt-get update \
&& apt-get -y --no-install-recommends install \
# Basic dependencies
curl \
gnupg \
imagemagick \
gettext \
sudo \
tzdata \
gosu \
# fonts for text file thumbnail generation
fonts-liberation \
# for Numpy
@@ -28,16 +27,23 @@ RUN echo "deb http://deb.debian.org/debian bullseye main" > /etc/apt/sources.lis
libxslt1-dev \
# thumbnail size reduction
optipng \
libxml2 \
pngquant \
unpaper \
zlib1g \
ghostscript \
icc-profiles-free \
&& echo "deb http://deb.debian.org/debian bullseye main" > /etc/apt/sources.list.d/bullseye.list \
&& apt-get update \
&& apt-get -y --no-install-recommends install \
# fixes sudo / gosu issues
libseccomp2 \
# Mime type detection
file \
libmagic-dev \
media-types \
# OCRmyPDF dependencies
ghostscript \
icc-profiles-free \
# OCRmyPDF dependencies
liblept5 \
libxml2 \
pngquant \
qpdf \
tesseract-ocr \
tesseract-ocr-eng \
@@ -45,8 +51,6 @@ RUN echo "deb http://deb.debian.org/debian bullseye main" > /etc/apt/sources.lis
tesseract-ocr-fra \
tesseract-ocr-ita \
tesseract-ocr-spa \
unpaper \
zlib1g \
&& rm -rf /var/lib/apt/lists/*
# copy jbig2enc
@@ -78,6 +82,7 @@ RUN cd docker \
&& mkdir /var/log/supervisord /var/run/supervisord \
&& cp supervisord.conf /etc/supervisord.conf \
&& cp docker-entrypoint.sh /sbin/docker-entrypoint.sh \
&& cp docker-prepare.sh /sbin/docker-prepare.sh \
&& chmod 755 /sbin/docker-entrypoint.sh \
&& chmod +x install_management_commands.sh \
&& ./install_management_commands.sh \
@@ -93,8 +98,8 @@ COPY src/ ./
RUN addgroup --gid 1000 paperless \
&& useradd --uid 1000 --gid paperless --home-dir /usr/src/paperless paperless \
&& chown -R paperless:paperless ../ \
&& sudo -HEu paperless python3 manage.py collectstatic --clear --no-input \
&& sudo -HEu paperless python3 manage.py compilemessages
&& gosu paperless python3 manage.py collectstatic --clear --no-input \
&& gosu paperless python3 manage.py compilemessages
VOLUME ["/usr/src/paperless/data", "/usr/src/paperless/media", "/usr/src/paperless/consume", "/usr/src/paperless/export"]
ENTRYPOINT ["/sbin/docker-entrypoint.sh"]
+1 -1
View File
@@ -10,7 +10,7 @@ name = "piwheels"
[packages]
dateparser = "~=1.0.0"
django = "~=3.1.3"
django = "~=3.2"
django-cors-headers = "*"
django-extensions = "*"
django-filter = "~=2.4.0"
Generated
+187 -188
View File
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "e1b8a4e731cfb66e6e4cb43aa9160eeccdaf4c459710b197f7c7bf3e95825f6a"
"sha256": "6dd5af1c2a4025ca82cf6092121f4571fda57df7c47e028b8c25da20ef7e16cd"
},
"pipfile-spec": 6,
"requires": {},
@@ -36,11 +36,11 @@
},
"asgiref": {
"hashes": [
"sha256:5ee950735509d04eb673bd7f7120f8fa1c9e2df495394992c73234d526907e17",
"sha256:7162a3cb30ab0609f1a4c95938fd73e8604f63bdba516a7f7d64b83ff09478f0"
"sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee",
"sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"
],
"markers": "python_version >= '3.5'",
"version": "==3.3.1"
"markers": "python_version >= '3.6'",
"version": "==3.3.4"
},
"async-timeout": {
"hashes": [
@@ -209,11 +209,11 @@
},
"daphne": {
"hashes": [
"sha256:0052c9887600c57054a5867d4b0240159fa009faa3bcf6a1627271d9cdcb005a",
"sha256:c22b692707f514de9013651ecb687f2abe4f35cf6fe292ece634e9f1737bc7e3"
"sha256:76ffae916ba3aa66b46996c14fa713e46004788167a4873d647544e750e0e99f",
"sha256:a9af943c79717bc52fe64a3c236ae5d3adccc8b5be19c881b442d2c3db233393"
],
"markers": "python_version >= '3.6'",
"version": "==3.0.1"
"version": "==3.0.2"
},
"dateparser": {
"hashes": [
@@ -225,11 +225,11 @@
},
"django": {
"hashes": [
"sha256:32ce792ee9b6a0cbbec340123e229ac9f765dff8c2a4ae9247a14b2ba3a365a7",
"sha256:baf099db36ad31f970775d0be5587cc58a6256a6771a44eb795b554d45f211b8"
"sha256:0604e84c4fb698a5e53e5857b5aea945b2f19a18f25f10b8748dbdf935788927",
"sha256:21f0f9643722675976004eb683c55d33c05486f94506672df3d6a141546f389d"
],
"index": "pypi",
"version": "==3.1.7"
"version": "==3.2"
},
"django-cors-headers": {
"hashes": [
@@ -241,11 +241,11 @@
},
"django-extensions": {
"hashes": [
"sha256:674ad4c3b1587a884881824f40212d51829e662e52f85b012cd83d83fe1271d9",
"sha256:9507f8761ee760748938fd8af766d0608fb2738cf368adfa1b2451f61c15ae35"
"sha256:081828e985485662f62a22340c1506e37989d14b927652079a5b7cd84a82368b",
"sha256:17f85f4dcdd5eea09b8c4f0bad8f0370bf2db6d03e61b431fa7103fee29888de"
],
"index": "pypi",
"version": "==3.1.1"
"version": "==3.1.2"
},
"django-filter": {
"hashes": [
@@ -590,11 +590,11 @@
},
"pathvalidate": {
"hashes": [
"sha256:5263a75d6335b2e9ac2010f38fbd85225b8dff274ded63e5ac21d94ce6b130c8",
"sha256:d0dab13e121628829f5aeb01220ca7af00c3b3b2fe5d83dc81fa0612ad58ade9"
"sha256:3c9bd94c7ec23e9cfb211ffbe356ae75f979d6c099a2c745ee9490f524f32468",
"sha256:f5dde7efeeb4262784c5e1331e02752d07c1ec3ee5ea42683fe211155652b808"
],
"index": "pypi",
"version": "==2.4.0"
"version": "==2.4.1"
},
"pdfminer.six": {
"hashes": [
@@ -606,32 +606,32 @@
},
"pikepdf": {
"hashes": [
"sha256:018ee534527debd2cfcde0dd856a454a218ddb57e5ba1240810489e50be70a6e",
"sha256:19e4fdafb66b2093b42cd81230122f4789d0ef90d85d451bcb0249739295303d",
"sha256:232789113d6044816e5eeff0061e9014febfc889cf24be9fb17d172c504c1b53",
"sha256:6637f1895e5e93b2032077ded757846c9a90147fb9195bb73dd4b8a2f333e888",
"sha256:7a804515942049f846d548d3b817317f8136e06938737ff64b79c82d61908e27",
"sha256:7c90ae70684efad9477c4ada293187a4542afd685029f82b478f011d4f8cdcc0",
"sha256:7dea84178ebfb35195eedca47a38d99ca8264e1c6e8ff6f37ccb5d7b2ca903d3",
"sha256:95f36bd3920159320547c61c7aa753b9a423e43fedb350617c7eb9925bf48618",
"sha256:a5b57f1b5d5df49b0269e8039b1ba08abb42fdd6f5b6c4b49635be754a77472a",
"sha256:ae8ead8f975864aaf97b24cd916d1bf2e536eb64e7afb65ca679ed29b1ca5b89",
"sha256:b11e1bbc38eb90bfbf2eb0f2f50b300c4142732c148802d6e5f4caa5727fc81e",
"sha256:b192cb3f087509075febb28652d48800da1f3fc1842f94cea25a49fba7350a06",
"sha256:c024de7e57329353f82d287ca13e118e1438b6fd94b33475a474cd7fd16fbb8d",
"sha256:d05a5d22f1bec0979678388c453644f83f74348ab821815b9f1ccb947d4a21e4",
"sha256:d124e11eaacf5fe1bf77ca4c1b6b1a8d5285d00d3593c5cb6eba53058cdf9dae",
"sha256:dde6fde7a32c31aa515782ea967e32dbea97a19ef3fbbde45a93c5f65cabb36f",
"sha256:e03dd2131eba5c966fbb46b675006753945a251e9e9ad44ef141257db37b9c1a",
"sha256:e345206fe51b862022ece4e4e7468bbb955eacda9a9684387ff2f1c91c1def03",
"sha256:e7295619ea4b0fa714bfff24aaf865f7e6c298e82e77ce127b6a76f47377f7f3",
"sha256:f0cdb331b585074a50e9c8a967f68b905aa8674cc3d6577f004a93414f70f211",
"sha256:f3bd63e6db4a105074f6b5951a71313bc0ca8530b0050e3a03680639d05b5500",
"sha256:f6aaf410174ba10df545ccb6fe9b42fa5fd34b1bb4df366722af640275f3406a",
"sha256:ff48af76f461f40f36917baad52918f9afcb45762a7f4c07b6a7ec7e976d558d"
"sha256:14a93f2b61adc975453dfc9edf3335be704732a8750a009ba3d12913ff043abe",
"sha256:25ba3bf96eae3a7c897db5bf6a60b26ebde1c161145af73a044950901b754bcb",
"sha256:29742273f80e75c48e700c5438636fe78a856e1706e353ea57715732fb75fcd6",
"sha256:3790ed5b9d0db8c8bd28d96cb10b91649179eac04873ed23e6dc474515892cc3",
"sha256:3a76702b12f78abe591a6270756a56225a63a26c5a00aad8bc3ffd8680178ab2",
"sha256:56ce22cd134c96035abf984aa167a16e7c658c3ccc0cd626a7002f911eba7452",
"sha256:578e80adcd4703b752c381517853a074633baa219be4bd36d6752fb742a0f8b4",
"sha256:5b286e9862a21bbe9dfb0da827818f710a303d9b78f821710c37e8059839c7da",
"sha256:6b12c8835f52d07cb68f30d115e1361cd1143f1aa2c70f49ded6d69d9c4fcdd2",
"sha256:6e6dd17783c6cf038b179dcf662982d1cca891a3e30232aec0221cc69821b7f1",
"sha256:7e4e7e53781d85a609bdf899d585a39a69e9eedf2b9ac75261685a1aff0072ea",
"sha256:810488f80a1d93652498222f9d1391d9287b3b842971d7a8878e69a287c2476f",
"sha256:85ab867102d7c2182acf852c61ca60c90790bfbb4a939dc096054d904318ba37",
"sha256:8babd800331978d20d82ed1494868d15f5b953266c2b943a7d34e4826016e0b8",
"sha256:94f20e08cdfcba011440204fd9df381af1c423a9888dfd3287b66d9e7e1421bf",
"sha256:9d4a1cc8da1860d8772e831b03ea05386ae6a805718cd8621de736725d52a901",
"sha256:9f67e2c57413ac8be4eec5344c2bcaeb1a18c59fe348afd589d9b95bd4dfc077",
"sha256:b4c64ddc8fe9b11dc52f81d38076bd560ce97abf4695151d2eab390ae760fcac",
"sha256:b5d4431e77f32fd1edc10d214db89b33f2c7f8ceb7152a6651192ef90945db17",
"sha256:d3a0cf2dcc10cd7a7b877e955cfac7ddee6050860a39375f46218f7f1c02e903",
"sha256:dd551d5ff0e4c95537a366fb2281152c7293e60d60bf6ba909faba7d0ee669ad",
"sha256:dea790ae9809ab0ed0f5e32c938d36441f5ab3e74a884692ce84902e8ed1187b",
"sha256:fe47949abbf9f67416e545b0c61c8e75546f1ad8f4cfbe5ee608824258cdaa3e"
],
"index": "pypi",
"version": "==2.10.0"
"version": "==2.11.1"
},
"pillow": {
"hashes": [
@@ -794,11 +794,11 @@
},
"python-dotenv": {
"hashes": [
"sha256:31d752f5b748f4e292448c9a0cac6a08ed5e6f4cefab85044462dcad56905cec",
"sha256:9fa413c37d4652d3fa02fea0ff465c384f5db75eab259c4fc5d0c5b8bf20edd4"
"sha256:471b782da0af10da1a80341e8438fca5fadeba2881c54360d5fd8d03d03a4f4a",
"sha256:49782a97c9d641e8a09ae1d9af0856cc587c8d2474919342d5104d85be9890b2"
],
"index": "pypi",
"version": "==0.16.0"
"version": "==0.17.0"
},
"python-gnupg": {
"hashes": [
@@ -876,87 +876,87 @@
},
"regex": {
"hashes": [
"sha256:07ef35301b4484bce843831e7039a84e19d8d33b3f8b2f9aab86c376813d0139",
"sha256:13f50969028e81765ed2a1c5fcfdc246c245cf8d47986d5172e82ab1a0c42ee5",
"sha256:14de88eda0976020528efc92d0a1f8830e2fb0de2ae6005a6fc4e062553031fa",
"sha256:159fac1a4731409c830d32913f13f68346d6b8e39650ed5d704a9ce2f9ef9cb3",
"sha256:18e25e0afe1cf0f62781a150c1454b2113785401ba285c745acf10c8ca8917df",
"sha256:201e2619a77b21a7780580ab7b5ce43835e242d3e20fef50f66a8df0542e437f",
"sha256:360a01b5fa2ad35b3113ae0c07fb544ad180603fa3b1f074f52d98c1096fa15e",
"sha256:39c44532d0e4f1639a89e52355b949573e1e2c5116106a395642cbbae0ff9bcd",
"sha256:3d9356add82cff75413bec360c1eca3e58db4a9f5dafa1f19650958a81e3249d",
"sha256:3d9a7e215e02bd7646a91fb8bcba30bc55fd42a719d6b35cf80e5bae31d9134e",
"sha256:4651f839dbde0816798e698626af6a2469eee6d9964824bb5386091255a1694f",
"sha256:486a5f8e11e1f5bbfcad87f7c7745eb14796642323e7e1829a331f87a713daaa",
"sha256:4b8a1fb724904139149a43e172850f35aa6ea97fb0545244dc0b805e0154ed68",
"sha256:4c0788010a93ace8a174d73e7c6c9d3e6e3b7ad99a453c8ee8c975ddd9965643",
"sha256:4c2e364491406b7888c2ad4428245fc56c327e34a5dfe58fd40df272b3c3dab3",
"sha256:575a832e09d237ae5fedb825a7a5bc6a116090dd57d6417d4f3b75121c73e3be",
"sha256:5770a51180d85ea468234bc7987f5597803a4c3d7463e7323322fe4a1b181578",
"sha256:633497504e2a485a70a3268d4fc403fe3063a50a50eed1039083e9471ad0101c",
"sha256:63f3ca8451e5ff7133ffbec9eda641aeab2001be1a01878990f6c87e3c44b9d5",
"sha256:63f861afb575ee39fc42df919ca6c625b534cf51b2b95d54fc97f85d293a22a2",
"sha256:709f65bb2fa9825f09892617d01246002097f8f9b6dde8d1bb4083cf554701ba",
"sha256:808276b84e69346635da368f4b9d37ab8b27ce20a7b30e9cbb3717d1e81c78ec",
"sha256:808404898e9a765e4058bf3d7607d0629000e0a14a6782ccbb089296b76fa8fe",
"sha256:882f53afe31ef0425b405a3f601c0009b44206ea7f55ee1c606aad3cc213a52c",
"sha256:8bd4f91f3fb1c9b1380d6894bd5b4a519409135bec14c0c80151e58394a4e88a",
"sha256:8e65e3e4c6feadf6770e2ad89ad3deb524bcb03d8dc679f381d0568c024e0deb",
"sha256:976a54d44fd043d958a69b18705a910a8376196c6b6ee5f2596ffc11bff4420d",
"sha256:a0d04128e005142260de3733591ddf476e4902c0c23c1af237d9acf3c96e1b38",
"sha256:a0df9a0ad2aad49ea3c7f65edd2ffb3d5c59589b85992a6006354f6fb109bb18",
"sha256:a2ee026f4156789df8644d23ef423e6194fad0bc53575534101bb1de5d67e8ce",
"sha256:a59a2ee329b3de764b21495d78c92ab00b4ea79acef0f7ae8c1067f773570afa",
"sha256:b97ec5d299c10d96617cc851b2e0f81ba5d9d6248413cd374ef7f3a8871ee4a6",
"sha256:b98bc9db003f1079caf07b610377ed1ac2e2c11acc2bea4892e28cc5b509d8d5",
"sha256:b9d8d286c53fe0cbc6d20bf3d583cabcd1499d89034524e3b94c93a5ab85ca90",
"sha256:bcd945175c29a672f13fce13a11893556cd440e37c1b643d6eeab1988c8b209c",
"sha256:c66221e947d7207457f8b6f42b12f613b09efa9669f65a587a2a71f6a0e4d106",
"sha256:c782da0e45aff131f0bed6e66fbcfa589ff2862fc719b83a88640daa01a5aff7",
"sha256:cb4ee827857a5ad9b8ae34d3c8cc51151cb4a3fe082c12ec20ec73e63cc7c6f0",
"sha256:d47d359545b0ccad29d572ecd52c9da945de7cd6cf9c0cfcb0269f76d3555689",
"sha256:dc9963aacb7da5177e40874585d7407c0f93fb9d7518ec58b86e562f633f36cd",
"sha256:ea2f41445852c660ba7c3ebf7d70b3779b20d9ca8ba54485a17740db49f46932",
"sha256:f5d0c921c99297354cecc5a416ee4280bd3f20fd81b9fb671ca6be71499c3fdf",
"sha256:f85d6f41e34f6a2d1607e312820971872944f1661a73d33e1e82d35ea3305e14"
"sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5",
"sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79",
"sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31",
"sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500",
"sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11",
"sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14",
"sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3",
"sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439",
"sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c",
"sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82",
"sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711",
"sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093",
"sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a",
"sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb",
"sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8",
"sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17",
"sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000",
"sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d",
"sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480",
"sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc",
"sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0",
"sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9",
"sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765",
"sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e",
"sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a",
"sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07",
"sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f",
"sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac",
"sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7",
"sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed",
"sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968",
"sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7",
"sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2",
"sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4",
"sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87",
"sha256:d2c4616a9a56a6ecc39eeab09ecfed4dbc051b9200fb5c9f35b2a98ae6f99a96",
"sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8",
"sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10",
"sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29",
"sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605",
"sha256:f153be3ed31a48e47cc32cf0ffb14d27ccdefacac04f9eaf7fae1a59643ea9ef",
"sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6",
"sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"
],
"version": "==2021.3.17"
"version": "==2021.4.4"
},
"reportlab": {
"hashes": [
"sha256:13ac281c8d5c904089022377bd9646c910deae63e7342dd9552088d330d73e89",
"sha256:14f38792176e41642f9ea7a83678df156d8abb3a90bbe396425a200614eed03d",
"sha256:15aeb8f8bdad5fa666d18a7d229bc7eb8f4e5a1dc8423931b3e690b6ce5021bc",
"sha256:1db86072b0ec3e5f9c5ab2980c61658ae3acee86e204b0d4c48112bc5cffd2f5",
"sha256:202109018f40d620812cf30dc300ea73385aed305d1de63c42229cb881821ffb",
"sha256:30e82ec00c566c4d8bfdcca0b93131749cc51ea0884395054d2afedf266f3f29",
"sha256:374252d118719e7b9b1bd0e5ce3f7083b5aaaeb1a9422983aa63b116621d34ae",
"sha256:3c1be70cf168ed29a449a009d7cad6dcc3e45d129f7ddb07b3854b8cee8d125b",
"sha256:45fe94e90c6b48c4ae877339b777fcc4f822795c1d4c7a0d6cffaf24987199b1",
"sha256:536f1ebf951cd48623974ba160c95e7c7219d4aa5664cdae17dffa2f19cf1cf3",
"sha256:54827fa29843b15834e5bc618508f245f3addee7bf980eebacfebb74f150e611",
"sha256:55c903f8aea4fbfca26f9f821c77c576c9791ce487ddfa3ffa1f2c44c5af79e2",
"sha256:63fba51babad0047def4ffaa41d0065248ca39d680e98dc9e3010de5425539b4",
"sha256:6fc3f01e9005ac53d639eafe22b3852937e42161d74a7d0681bc83f48cff1b30",
"sha256:6ff269ea41daa5cfd6124b13da1481fc40db2539fa82107dd9675f6670d95c25",
"sha256:7711fcdb0c1edfb48dcffd7e73430e9b5ceba0816a37fd269a327cd13088bcaf",
"sha256:7d4a59975a743eddc15895014d738bb38cbdecdd2496f651fb05779486bcb536",
"sha256:879e1123d49e0df76c478cccdacd4a9f4a2b4b445beec3d72a05f8b3775daa84",
"sha256:aa1ec9557c0d9dbe3eceb6581220aa1d77c404b8ff3decb40eae0bf075512142",
"sha256:ad0d3f657addd9c4215faf2699eafd54e89e404e35d696dda9dbe3c126132900",
"sha256:b784685141fe3fc26d8f703b21f89073a0ce46a800d06b7d58f2ceb481a65644",
"sha256:bd0870c840d47a6639df17c54f0c5676a06ab6798bb92ed8ef9b983c0326c2d0",
"sha256:bdb0781d1d4d1ed0745f5f22c06ed60760865511e65046432d145f55fd908f60",
"sha256:ce04f4bf9d15895bbfee6d53eb168cffd9fcedc625f0fcb5c343d809d0b37271",
"sha256:cf76145a89bb0ebf562c3252ce4d254547fe59daeb80ce2076d89867e9c03735",
"sha256:e8ebb34f30a11ac4196ae83d0b4f1f87bbe326c0f8a6eb4b768e622ec7f017f5",
"sha256:ed4b80c24a4e5e91927aa95901cce3f6fef7551e94a72ac5a2fa22740708cbff",
"sha256:f8a8f8b62cc150f71310e444ded4e32e7136c75aced6738877c3328e84338c94",
"sha256:fdd08e1ef7bcf1dc92868bc527587286c89d92c141fed5ed89ccacc1e8f26ee8",
"sha256:fdf604246a5318157a581a483ceb0aab858582b478b24016768fdaff1c190f50"
"sha256:0cf2206c73fbca752c8bd39e12bb9ad7f2d01e6fcb2b25b9eaf94ea042fe86c9",
"sha256:0d670e119d7f7a68a1136de024464999e8e3d5d1491f23cdd39d5d72481af88f",
"sha256:1656722530b3bbce012b093abf6290ab76dcba39d21f9e703310b008ddc7ffe9",
"sha256:1e41b441542881e007420530bbc028f08c0f546ecaaebdf9f065f901acdac106",
"sha256:34d827c771d6b4d7b45f7fc49a638c97fbd8a0fab6c9d3838ff04d307420b739",
"sha256:370c5225f0c395a9f1482ac8d4f974d2073548f186eaf49ceb91414f534ad4d8",
"sha256:42b90b0cb3556f4d1cc1c538345abc249b6ff58939d3af5e37f5fa8421d9ae07",
"sha256:492bd47aabeaa3215cde7a8d3c0d88c909bf7e6b63f0b511a645f1ffc1e948f6",
"sha256:4c5785b018ed6f48e762737deaa6b7528b0ba43ad67fca566bf10d0337a76dcd",
"sha256:519ef25d49fe807c6c0402abb5fe4d14b47a8e2358050d8d7673beecfbe116b2",
"sha256:51a2d5de2c605117cd25dfb3f51d1d14caf1cbed4ef6db582f085eeb0a0c922f",
"sha256:55ef4476b2cdecfa643ae4d7591aa157568f903c378c83ea544650b33b2d856d",
"sha256:5b4acfb15ca028bbc652a6c8d63073dec2a3c8c0db7585d68b96b52940f65899",
"sha256:5c483c96d4cbeb4919ad9fcf2f262e8e08e34dcbcf8d2bda16263ef002c890d4",
"sha256:5c931032aa955431c808e469eb0780ca7d12b39228a02ae7ea09f63d47b1e260",
"sha256:6a3119d0e985e5c7dadfcf29fb79bbab19806b08ad901622b23f5868c0221fce",
"sha256:6b77f763af25cb609896c9355fcd42f59266a7a1fab6c37dfe59ba1e0b689022",
"sha256:72bb5417f198eb059f01d5a9e1ef80f2fbaf3eaa4cd63e9a681bbbd0ed9fcdf9",
"sha256:8cd355f8a4c7c126a246f4b4a9803c80498939709bb37d3db4f8dbee1eb7d8f0",
"sha256:9517f26a512a62d49fc4800222b306e21a14ceec8bd82c93182313ef1eefaa7a",
"sha256:9945e80a0a6e370f90a23907cc70a0811e808f79420fb9051e26d9c79eb8e26b",
"sha256:9989737a409235a734ec783b0545f2966247b26ff555e847f3d0f945e5a11493",
"sha256:9c0d71aef4fb5d30dc6ebd08a2bce317a7eaf37d468f85320947eb580daea90a",
"sha256:9d48fd4a1c2d98ec6686511717f0980d36f5590e038d5afe4e5241f328f06e38",
"sha256:af12fbff15a9652ef117456d1d6a4d6fade8fdc02670d6fd31212402e9d03559",
"sha256:b2b72a0742a493979c348dc3c9a329bd5b87e4243ffecf837b1c8739d58410ba",
"sha256:bda784ebb116d56d3e7133c8e0942cf68cb7fd58bdccf57231dbe56b6430eb01",
"sha256:df2784a474028b15a723f6b347625f1f91740de418bed4a0a2694c954de34dd7",
"sha256:e2b47a8e0126ec0a3820a2e299a94a6fc29ba132249957dd32c447d380eaae5f",
"sha256:e4b9b443e88735be4927529d66d9e1164b4fbd6a882e90114967eedc6ad608e7"
],
"markers": "python_version >= '2.7' and python_version < '4'",
"version": "==3.5.66"
"version": "==3.5.67"
},
"requests": {
"hashes": [
@@ -1078,11 +1078,11 @@
},
"tqdm": {
"hashes": [
"sha256:9fdf349068d047d4cfbe24862c425883af1db29bcddf4b0eeb2524f6fbdb23c7",
"sha256:d666ae29164da3e517fcf125e41d4fe96e5bb375cd87ff9763f6b38b5592fe33"
"sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3",
"sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"
],
"index": "pypi",
"version": "==4.59.0"
"version": "==4.60.0"
},
"twisted": {
"extras": [
@@ -1230,62 +1230,61 @@
},
"zope.interface": {
"hashes": [
"sha256:02d3535aa18e34ce97c58d241120b7554f7d1cf4f8002fc9675cc7e7745d20e8",
"sha256:0378a42ec284b65706d9ef867600a4a31701a0d6773434e6537cfc744e3343f4",
"sha256:07d289358a8c565ea09e426590dd1179f93cf5ac3dd17d43fcc4fc63c1a9d275",
"sha256:0e6cdbdd94ae94d1433ab51f46a76df0f2cd041747c31baec1c1ffa4e76bd0c1",
"sha256:11354fb8b8bdc5cdd66358ed4f1f0ce739d78ff6d215d33b8f3ae282258c0f11",
"sha256:12588a46ae0a99f172c4524cbbc3bb870f32e0f8405e9fa11a5ef3fa3a808ad7",
"sha256:16caa44a06f6b0b2f7626ced4b193c1ae5d09c1b49c9b4962c93ae8aa2134f55",
"sha256:18c478b89b6505756f007dcf76a67224a23dcf0f365427742ed0c0473099caa4",
"sha256:1bbb0bca8a3556a21f7b66c0a18876d8c617ddeda00982204b6218170b39526a",
"sha256:221b41442cf4428fcda7fc958c9721c916709e2a3a9f584edd70f1493a09a762",
"sha256:26109c50ccbcc10f651f76277cfc05fba8418a907daccc300c9247f24b3158a2",
"sha256:28d8157f8c77662a1e0796a7d3cfa8910289131d4b4dd4e10b2686ab1309b67b",
"sha256:2c51689b7b40c7d9c7e8a678350e73dc647945a13b4e416e7a02bbf0c37bdb01",
"sha256:2ec58e1e1691dde4fbbd97f8610de0f8f1b1a38593653f7d3b8e931b9cd6d67f",
"sha256:416feb6500f7b6fc00d32271f6b8495e67188cb5eb51fc8e289b81fdf465a9cb",
"sha256:520352b18adea5478bbf387e9c77910a914985671fe36bc5ef19fdcb67a854bc",
"sha256:527415b5ca201b4add44026f70278fbc0b942cf0801a26ca5527cb0389b6151e",
"sha256:54243053316b5eec92affe43bbace7c8cd946bc0974a4aa39ff1371df0677b22",
"sha256:61b8454190b9cc87279232b6de28dee0bad040df879064bb2f0e505cda907918",
"sha256:672668729edcba0f2ee522ab177fcad91c81cfce991c24d8767765e2637d3515",
"sha256:67aa26097e194947d29f2b5a123830e03da1519bcce10cac034a51fcdb99c34f",
"sha256:6e7305e42b5f54e5ccf51820de46f0a7c951ba7cb9e3f519e908545b0f5628d0",
"sha256:7234ac6782ca43617de803735949f79b894f0c5d353fbc001d745503c69e6d1d",
"sha256:7426bea25bdf92f00fa52c7b30fcd2a2f71c21cf007178971b1f248b6c2d3145",
"sha256:74b331c5d5efdddf5bbd9e1f7d8cb91a0d6b9c4ba45ca3e9003047a84dca1a3b",
"sha256:79b6db1a18253db86e9bf1e99fa829d60fd3fc7ac04f4451c44e4bdcf6756a42",
"sha256:7d79cd354ae0a033ac7b86a2889c9e8bb0bb48243a6ed27fc5064ce49b842ada",
"sha256:823d1b4a6a028b8327e64865e2c81a8959ae9f4e7c9c8e0eec814f4f9b36b362",
"sha256:8715717a5861932b7fe7f3cbd498c82ff4132763e2fea182cc95e53850394ec1",
"sha256:89a6091f2d07936c8a96ce56f2000ecbef20fb420a94845e7d53913c558a6378",
"sha256:8af4b3116e4a37059bc8c7fe36d4a73d7c1d8802a1d8b6e549f1380d13a40160",
"sha256:8b4b0034e6c7f30133fa64a1cc276f8f1a155ef9529e7eb93a3c1728b40c0f5c",
"sha256:92195df3913c1de80062635bf64cd7bd0d0934a7fa1689b6d287d1cbbd16922c",
"sha256:96c2e68385f3848d58f19b2975a675532abdb65c8fa5f04d94b95b27b6b1ffa7",
"sha256:9c7044dbbf8c58420a9ef4ed6901f5a8b7698d90cd984d7f57a18c78474686f6",
"sha256:a1937efed7e3fe0ee74630e1960df887d8aa83c571e1cf4db9d15b9c181d457d",
"sha256:a38c10423a475a1658e2cb8f52cf84ec20a4c0adff724dd43a6b45183f499bc1",
"sha256:a413c424199bcbab71bf5fa7538246f27177fbd6dd74b2d9c5f34878658807f8",
"sha256:b18a855f8504743e0a2d8b75d008c7720d44e4c76687e13f959e35d9a13eb397",
"sha256:b4d59ab3608538e550a72cea13d3c209dd72b6e19e832688da7884081c01594e",
"sha256:b51d3f1cd87f488455f43046d72003689024b0fa9b2d53635db7523033b19996",
"sha256:c02105deda867d09cdd5088d08708f06d75759df6f83d8f7007b06f422908a30",
"sha256:c7b6032dc4490b0dcaf078f09f5b382dc35493cb7f473840368bf0de3196c2b6",
"sha256:c95b355dba2aaf5177dff943b25ded0529a7feb80021d5fdb114a99f0a1ef508",
"sha256:c980ae87863d76b1ea9a073d6d95554b4135032d34bc541be50c07d4a085821b",
"sha256:d12895cd083e35e9e032eb4b57645b91116f8979527381a8d864d1f6b8cb4a2e",
"sha256:d3cd9bad547a8e5fbe712a1dc1413aff1b917e8d39a2cd1389a6f933b7a21460",
"sha256:e8809b01f27f679e3023b9e2013051e0a3f17abff4228cb5197663afd8a0f2c7",
"sha256:e8d49011baa7ce7765db46e53cfc8d125463a58e3eb478111b2c0c00ca098a33",
"sha256:f3c37b0dc1898e305aad4f7a1d75f6da83036588c28a9ce0afc681ff5245a601",
"sha256:f966765f54b536e791541458de84a737a6adba8467190f17a8fe7f85354ba908",
"sha256:fa939c2e2468142c9773443d4038e7c915b0cc1b670d3c9192bdc503f7ea73e9",
"sha256:fcc5c1f95102989d2e116ffc8467963554ce89f30a65a3ea86a4d06849c498d8"
"sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192",
"sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702",
"sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09",
"sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4",
"sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a",
"sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3",
"sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf",
"sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c",
"sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d",
"sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78",
"sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83",
"sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531",
"sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46",
"sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021",
"sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94",
"sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc",
"sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63",
"sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54",
"sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117",
"sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25",
"sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05",
"sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e",
"sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1",
"sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004",
"sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2",
"sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e",
"sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f",
"sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f",
"sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120",
"sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f",
"sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1",
"sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9",
"sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e",
"sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7",
"sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8",
"sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b",
"sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155",
"sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7",
"sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c",
"sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325",
"sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d",
"sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb",
"sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e",
"sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959",
"sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7",
"sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920",
"sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e",
"sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48",
"sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8",
"sha256:e0653479008a6118d2deec9ea3461d79331c65973ab4b25434ddc1018a982188",
"sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4",
"sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==5.3.0"
"version": "==5.4.0"
}
},
"develop": {
@@ -1448,11 +1447,11 @@
},
"faker": {
"hashes": [
"sha256:08c4cfbfd498c0e90aff6741771c01803d894013df858db6a573182c6a47951f",
"sha256:20c6e4253b73ef2a783d38e085e7c8d8916295fff31c7403116d2af8f908f7ca"
"sha256:26c7c3df8d46f1db595a34962f8967021dd90bbd38cc6e27461a3fb16cd413ae",
"sha256:44eb060fad3015690ff3fec6564d7171be393021e820ad1851d96cb968fbfcd4"
],
"markers": "python_version >= '3.6'",
"version": "==7.0.1"
"version": "==8.1.0"
},
"filelock": {
"hashes": [
@@ -1606,11 +1605,11 @@
},
"pytest": {
"hashes": [
"sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9",
"sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"
"sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634",
"sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"
],
"index": "pypi",
"version": "==6.2.2"
"version": "==6.2.3"
},
"pytest-cov": {
"hashes": [
@@ -1622,11 +1621,11 @@
},
"pytest-django": {
"hashes": [
"sha256:10e384e6b8912ded92db64c58be8139d9ae23fb8361e5fc139d8e4f8fc601bc2",
"sha256:26f02c16d36fd4c8672390deebe3413678d89f30720c16efb8b2a6bf63b9041f"
"sha256:80f8875226ec4dc0b205f0578072034563879d98d9b1bec143a80b9045716cb0",
"sha256:a51150d8962200250e850c6adcab670779b9c2aa07271471059d1fb92a843fa9"
],
"index": "pypi",
"version": "==4.1.0"
"version": "==4.2.0"
},
"pytest-env": {
"hashes": [
@@ -1709,11 +1708,11 @@
},
"sphinx-rtd-theme": {
"hashes": [
"sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5",
"sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"
"sha256:32bd3b5d13dc8186d7a42fc816a23d32e83a4827d7d9882948e7b837c232da5a",
"sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f"
],
"index": "pypi",
"version": "==0.5.1"
"version": "==0.5.2"
},
"sphinxcontrib-applehelp": {
"hashes": [
@@ -0,0 +1,94 @@
# docker-compose file for running paperless from the Docker Hub.
# This file contains everything paperless needs to run.
# Paperless supports amd64, arm and arm64 hardware.
#
# All compose files of paperless configure paperless in the following way:
#
# - Paperless is (re)started on system boot, if it was running before shutdown.
# - Docker volumes for storing data are managed by Docker.
# - Folders for importing and exporting files are created in the same directory
# as this file and mounted to the correct folders inside the container.
# - Paperless listens on port 8010.
#
# In addition to that, this docker-compose file adds the following optional
# configurations:
#
# - Instead of SQLite (default), PostgreSQL is used as the database server.
#
# To install and update paperless with this file, do the following:
#
# - Open portainer Stacks list and click 'Add stack'
# - Paste the contents of this file and assign a name, e.g. 'Paperless'
# - Click 'Deploy the stack' and wait for it to be deployed
# - Open the list of containers, select paperless_webserver_1
# - Click 'Console' and then 'Connect' to open the command line inside the container
# - Run 'python3 manage.py createsuperuser' to create a user
# - Exit the console
#
# For more extensive installation and update instructions, refer to the
# documentation.
version: "3.4"
services:
broker:
image: redis:6.0
restart: unless-stopped
db:
image: postgres:13
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
webserver:
image: jonaswinkler/paperless-ng:latest
restart: unless-stopped
depends_on:
- db
- broker
ports:
- 8010:8000
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000"]
interval: 30s
timeout: 10s
retries: 5
volumes:
- data:/usr/src/paperless/data
- media:/usr/src/paperless/media
- ./export:/usr/src/paperless/export
- ./consume:/usr/src/paperless/consume
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
# The UID and GID of the user used to run paperless in the container. Set this
# to your UID and GID on the host so that you have write access to the
# consumption directory.
USERMAP_UID: 1000
USERMAP_GID: 100
# Additional languages to install for text recognition, separated by a
# whitespace. Note that this is
# different from PAPERLESS_OCR_LANGUAGE (default=eng), which defines the
# language used for OCR.
# The container installs English, German, Italian, Spanish and French by
# default.
# See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster
# for available languages.
#PAPERLESS_OCR_LANGUAGES: tur ces
# Adjust this key if you plan to make paperless available publicly. It should
# be a very long sequence of random characters. You don't need to remember it.
#PAPERLESS_SECRET_KEY: change-me
# Use this variable to set a timezone for the Paperless Docker containers. If not specified, defaults to UTC.
#PAPERLESS_TIME_ZONE: America/Los_Angeles
# The default language to use for OCR. Set this to the language most of your
# documents are written in.
#PAPERLESS_OCR_LANGUAGE: eng
volumes:
data:
media:
pgdata:
Regular → Executable
+4 -69
View File
@@ -15,70 +15,6 @@ map_uidgid() {
fi
}
wait_for_postgres() {
attempt_num=1
max_attempts=5
echo "Waiting for PostgreSQL to start..."
host="${PAPERLESS_DBHOST}"
port="${PAPERLESS_DBPORT}"
if [[ -z $port ]] ;
then
port="5432"
fi
while !</dev/tcp/$host/$port ;
do
if [ $attempt_num -eq $max_attempts ]
then
echo "Unable to connect to database."
exit 1
else
echo "Attempt $attempt_num failed! Trying again in 5 seconds..."
fi
attempt_num=$(expr "$attempt_num" + 1)
sleep 5
done
}
migrations() {
if [[ -n "${PAPERLESS_DBHOST}" ]]
then
wait_for_postgres
fi
(
# flock is in place to prevent multiple containers from doing migrations
# simultaneously. This also ensures that the db is ready when the command
# of the current container starts.
flock 200
echo "Apply database migrations..."
sudo -HEu paperless python3 manage.py migrate
) 200>/usr/src/paperless/data/migration_lock
}
search_index() {
index_version=1
index_version_file=/usr/src/paperless/data/.index_version
if [[ (! -f "$index_version_file") || $(< $index_version_file) != "$index_version" ]]; then
echo "Search index out of date. Updating..."
sudo -HEu paperless python3 manage.py document_index reindex
echo $index_version | sudo -HEu paperless tee $index_version_file >/dev/null
fi
}
initialize() {
map_uidgid
@@ -93,12 +29,12 @@ initialize() {
echo "creating directory /tmp/paperless"
mkdir -p /tmp/paperless
set +e
chown -R paperless:paperless ../
chown -R paperless:paperless /tmp/paperless
set -e
migrations
search_index
gosu paperless /sbin/docker-prepare.sh
}
install_languages() {
@@ -149,9 +85,8 @@ initialize
if [[ "$1" != "/"* ]]; then
echo Executing management command "$@"
exec sudo -HEu paperless python3 manage.py "$@"
exec gosu paperless python3 manage.py "$@"
else
echo Executing "$@"
exec "$@"
fi
+72
View File
@@ -0,0 +1,72 @@
#!/usr/bin/env bash
wait_for_postgres() {
attempt_num=1
max_attempts=5
echo "Waiting for PostgreSQL to start..."
host="${PAPERLESS_DBHOST}"
port="${PAPERLESS_DBPORT}"
if [[ -z $port ]]; then
port="5432"
fi
while ! </dev/tcp/$host/$port; do
if [ $attempt_num -eq $max_attempts ]; then
echo "Unable to connect to database."
exit 1
else
echo "Attempt $attempt_num failed! Trying again in 5 seconds..."
fi
attempt_num=$(expr "$attempt_num" + 1)
sleep 5
done
}
migrations() {
(
# flock is in place to prevent multiple containers from doing migrations
# simultaneously. This also ensures that the db is ready when the command
# of the current container starts.
flock 200
echo "Apply database migrations..."
python3 manage.py migrate
) 200>/usr/src/paperless/data/migration_lock
}
search_index() {
index_version=1
index_version_file=/usr/src/paperless/data/.index_version
if [[ (! -f "$index_version_file") || $(<$index_version_file) != "$index_version" ]]; then
echo "Search index out of date. Updating..."
python3 manage.py document_index reindex
echo $index_version | tee $index_version_file >/dev/null
fi
}
superuser() {
if [[ -n "${PAPERLESS_ADMIN_USER}" ]]; then
python3 manage.py manage_superuser
fi
}
do_work() {
if [[ -n "${PAPERLESS_DBHOST}" ]]; then
wait_for_postgres
fi
migrations
search_index
superuser
}
do_work
+1 -1
View File
@@ -1,4 +1,4 @@
for command in document_archiver document_exporter document_importer mail_fetcher document_create_classifier document_index document_renamer document_retagger document_thumbnails document_sanity_checker;
for command in document_archiver document_exporter document_importer mail_fetcher document_create_classifier document_index document_renamer document_retagger document_thumbnails document_sanity_checker manage_superuser;
do
echo "installing $command..."
sed "s/management_command/$command/g" management_script.sh > /usr/local/bin/$command
Regular → Executable
+1 -1
View File
@@ -6,7 +6,7 @@ cd /usr/src/paperless/src/
if [[ $(id -u) == 0 ]] ;
then
sudo -HEu paperless python3 manage.py management_command "$@"
gosu paperless python3 manage.py management_command "$@"
elif [[ $(id -un) == "paperless" ]] ;
then
python3 manage.py management_command "$@"
+24
View File
@@ -5,6 +5,27 @@
Changelog
*********
paperless-ng 1.4.2
##################
* Fixed an issue with ``sudo`` that caused paperless to not start on many Raspberry Pi devices. Thank you `WhiteHatTux`_!
paperless-ng 1.4.1
##################
* Added Polish locale.
* Changed some parts of the Dockerfile to hopefully restore functionality on certain ARM devices.
* Updated python dependencies.
* `Michael Shamoon`_ added a sticky filter / bulk edit bar.
* `sbrl`_ changed the docker-entrypoint.sh script to increase compatibility with NFS shares.
* `Chris Nagy`_ added support for creating a super user by passing ``PAPERLESS_ADMIN_USER`` and
``PAPERLESS_ADMIN_PASSWORD`` as environment variables to the docker container.
paperless-ng 1.4.0
##################
@@ -1345,6 +1366,9 @@ bulk of the work on this big change.
* Initial release
.. _WhiteHatTux: https://github.com/WhiteHatTux
.. _Chris Nagy: https://github.com/what-name
.. _sbrl: https://github.com/sbrl
.. _slorenz: https://github.com/sisao
.. _Jo Vandeginste: https://github.com/jovandeginste
.. _zjean: https://github.com/zjean
+24
View File
@@ -177,6 +177,30 @@ PAPERLESS_AUTO_LOGIN_USERNAME=<username>
Defaults to none, which disables this feature.
PAPERLESS_ADMIN_USER=<username>
If this environment variable is specified, Paperless automatically creates
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
or AWS ECS.
Requires `PAPERLESS_ADMIN_PASSWORD` to be set.
.. note::
This will not change an existing [super]user's password, nor will
it recreate a user that already exists. You can leave this throughout
the lifecycle of the containers.
PAPERLESS_ADMIN_MAIL=<email>
(Optional) Specify superuser email address. Only used when
`PAPERLESS_ADMIN_USER` is set.
Defaults to ``root@localhost``.
PAPERLESS_ADMIN_PASSWORD=<password>
Only used when `PAPERLESS_ADMIN_USER` is set.
This will be the password of the automatically created superuser.
PAPERLESS_COOKIE_PREFIX=<str>
Specify a prefix that is added to the cookies used by paperless to identify
+11 -17
View File
@@ -460,6 +460,7 @@ Install Paperless using ansible
.. note::
This role currently only supports Debian 10 Buster and Ubuntu 20.04 Focal or later as target hosts.
Additionally, only i386 or amd64 based hosts are supported right now, i.e. installation on arm hosts will fail.
1. Install ansible 2.7+ on the management node.
This may be the target host paperless-ng is being installed on or any remote host which can access the target host.
@@ -485,29 +486,22 @@ Install Paperless using ansible
ansible -m ping YourAnsibleTargetHostGoesHere
2. Clone the repository of paperless-ng:
2. Install the latest tag of the ansible role using ansible-galaxy
.. code:: sh
git clone https://github.com/jonaswinkler/paperless-ng
ansible-galaxy install git+https://github.com/jonaswinkler/paperless-ng.git,ng-1.4.2
Checkout the latest release tag:
.. code:: sh
cd paperless-ng
git checkout ng-1.0.0
3. Create an ansible ``playbook.yml`` in the paperless-ng root directory:
3. Create an ansible ``playbook.yml`` in a directory of your choice:
.. code:: yaml
- hosts: YourAnsibleTargetHostGoesHere
become: yes
vars_files:
- ansible/vars.yml
- vars/paperless-ng.yml
roles:
- ansible
- paperless-ng
Optional: If you also want to use PostgreSQL on the target system, install and add (for example) the `geerlingguy.postgresql <https://github.com/geerlingguy/ansible-role-postgresql>`_ role:
@@ -520,10 +514,10 @@ Install Paperless using ansible
- hosts: YourAnsibleTargetHostGoesHere
become: yes
vars_files:
- ansible/vars.yml
- vars/paperless-ng.yml
roles:
- geerlingguy.postgresql
- ansible
- paperless-ng
Optional: If you also want to use a reverse proxy on the target system, install and add (for example) the `geerlingguy.nginx <https://github.com/geerlingguy/ansible-role-nginx>`_ role:
@@ -536,13 +530,13 @@ Install Paperless using ansible
- hosts: YourAnsibleTargetHostGoesHere
become: yes
vars_files:
- ansible/vars.yml
- vars/paperless-ng.yml
roles:
- geerlingguy.postgresql
- ansible
- paperless-ng
- geerlingguy.nginx
4. Create ``ansible/vars.yml`` to configure your ansible deployment:
4. Create ``vars/paperless-ng.yml`` to configure your ansible deployment:
.. code:: yaml
+13
View File
@@ -208,3 +208,16 @@ This might have multiple reasons.
SENDFILE=0
to your `docker-compose.env` file.
Error while reading metadata
############################
You might find messages like these in your log files:
.. code::
[WARNING] [paperless.parsing.tesseract] Error while reading metadata
This indicates that paperless failed to read PDF metadata from one of your documents. This happens when you
open the affected documents in paperless for editing. Paperless will continue to work, and will simply not
show the invalid metadata.
+1 -1
View File
@@ -291,7 +291,7 @@ DEFAULT_LANGUAGES="deu eng fra ita spa"
if [[ ! $USERMAP_GID == "1000" ]] ; then
echo "USERMAP_GID=$USERMAP_GID"
fi
echo "PAPERLESS_ZIME_ZONE=$TIME_ZONE"
echo "PAPERLESS_TIME_ZONE=$TIME_ZONE"
echo "PAPERLESS_OCR_LANGUAGE=$OCR_LANGUAGE"
echo "PAPERLESS_SECRET_KEY=$SECRET_KEY"
if [[ ! " ${DEFAULT_LANGUAGES[@]} " =~ " ${OCR_LANGUAGE} " ]] ; then
+11 -11
View File
@@ -9,7 +9,7 @@
--extra-index-url https://www.piwheels.org/simple
aioredis==1.3.1
arrow==1.0.3; python_version >= '3.6'
asgiref==3.3.1; python_version >= '3.5'
asgiref==3.3.4; python_version >= '3.6'
async-timeout==3.0.1; python_full_version >= '3.5.3'
attrs==20.3.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
autobahn==21.3.1; python_version >= '3.7'
@@ -25,14 +25,14 @@ coloredlogs==15.0; python_version >= '2.7' and python_version not in '3.0, 3.1,
concurrent-log-handler==0.9.19
constantly==15.1.0
cryptography==3.4.7
daphne==3.0.1; python_version >= '3.6'
daphne==3.0.2; python_version >= '3.6'
dateparser==1.0.0
django-cors-headers==3.7.0
django-extensions==3.1.1
django-extensions==3.1.2
django-filter==2.4.0
django-picklefield==3.0.1; python_version >= '3'
django-q==1.3.4
django==3.1.7
django==3.2
djangorestframework==3.12.4
filelock==3.0.12
fuzzywuzzy[speedup]==0.18.0
@@ -54,9 +54,9 @@ lxml==4.6.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3
msgpack==1.0.2
numpy==1.19.5
ocrmypdf==11.7.3
pathvalidate==2.4.0
pathvalidate==2.4.1
pdfminer.six==20201018
pikepdf==2.10.0
pikepdf==2.11.1
pillow==8.2.0
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'
@@ -66,15 +66,15 @@ pyasn1==0.4.8
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'
python-dateutil==2.8.1
python-dotenv==0.16.0
python-dotenv==0.17.0
python-gnupg==0.4.7
python-levenshtein==0.12.2
python-magic==0.4.22
pytz==2021.1
pyyaml==5.4.1
redis==3.5.3
regex==2021.3.17
reportlab==3.5.66; python_version >= '2.7' and python_version < '4'
regex==2021.4.4
reportlab==3.5.67; 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'
scikit-learn==0.24.0
scipy==1.5.4
@@ -84,7 +84,7 @@ sortedcontainers==2.3.0
sqlparse==0.4.1; python_version >= '3.5'
threadpoolctl==2.1.0; python_version >= '3.5'
tika==1.24
tqdm==4.59.0
tqdm==4.60.0
twisted[tls]==21.2.0; python_full_version >= '3.5.4'
txaio==21.2.1; python_version >= '3.6'
tzlocal==2.1
@@ -97,4 +97,4 @@ wcwidth==0.2.5
websockets==8.1
whitenoise==5.2.0
whoosh==2.7.4
zope.interface==5.3.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'
+3 -1
View File
@@ -25,7 +25,9 @@
"it-IT": "src/locale/messages.it_IT.xlf",
"ro-RO": "src/locale/messages.ro_RO.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",
"sv-SE": "src/locale/messages.sv_SE.xlf"
}
},
"architect": {
+31 -17
View File
@@ -188,35 +188,35 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
</trans-unit>
<trans-unit id="5382975254277698192" datatype="html">
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
</trans-unit>
<trans-unit id="6691075929777935948" datatype="html">
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="719892092227206532" datatype="html">
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1844801255494293730" datatype="html">
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
</trans-unit>
<trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7" datatype="html">
@@ -1057,63 +1057,63 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="3100631071441658964" datatype="html">
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="7517688192215738656" datatype="html">
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
</trans-unit>
<trans-unit id="1010505078885609376" datatype="html">
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="2649431021108393503" datatype="html">
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
</trans-unit>
<trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html">
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="4b089ca12c472cf0b46167bb5afe4b527b301bbc" datatype="html">
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
</trans-unit>
<trans-unit id="0ad509732aaf702b7ea8c771c7809fa84bc85908" datatype="html">
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="2d9d55f1b70142ff4597ba32179d16888fd9c6b2" datatype="html">
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
</trans-unit>
<trans-unit id="7593728289020204896" datatype="html">
@@ -1205,7 +1205,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="727d980bba2b3e0b3d8705607f1208eef046479b" datatype="html">
@@ -1411,7 +1411,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="27d158b47717ff9305d19866960418c603f19d55" datatype="html">
@@ -1724,11 +1724,25 @@
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2119857572761283468" datatype="html">
+15
View File
@@ -8361,6 +8361,21 @@
"tslib": "^2.0.0"
}
},
"ngx-drag-drop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ngx-drag-drop/-/ngx-drag-drop-2.0.0.tgz",
"integrity": "sha512-t+4/eiC8zaXKqU1ruNfFEfGs1GpMNwpffD0baopvZFKjQHCb5rhNqFilJ54wO4T0OwGp4/RnsVhlcxe1mX6UJg==",
"requires": {
"tslib": "^1.9.0"
},
"dependencies": {
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
}
}
},
"ngx-file-drop": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/ngx-file-drop/-/ngx-file-drop-10.0.0.tgz",
+1
View File
@@ -28,6 +28,7 @@
"ng2-pdf-viewer": "^6.3.2",
"ngx-color": "^6.2.0",
"ngx-cookie-service": "^10.1.1",
"ngx-drag-drop": "^2.0.0",
"ngx-file-drop": "^10.0.0",
"ngx-infinite-scroll": "^9.1.0",
"rxjs": "~6.6.0",
+2
View File
@@ -11,12 +11,14 @@ import { SettingsComponent } from './components/manage/settings/settings.compone
import { TagListComponent } from './components/manage/tag-list/tag-list.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
import {DocumentAsnComponent} from "./components/document-asn/document-asn.component";
import { SplitMergeComponent } from './components/split-merge/split-merge.component';
const routes: Routes = [
{path: '', redirectTo: 'dashboard', pathMatch: 'full'},
{path: '', component: AppFrameComponent, children: [
{path: 'dashboard', component: DashboardComponent },
{path: 'documents', component: DocumentListComponent },
{path: 'split_merge', component: SplitMergeComponent },
{path: 'view/:id', component: DocumentListComponent },
{path: 'documents/:id', component: DocumentDetailComponent },
{path: 'asn/:id', component: DocumentAsnComponent },
+17 -3
View File
@@ -33,6 +33,7 @@ import { DocumentCardSmallComponent } from './components/document-list/document-
import { BulkEditorComponent } from './components/document-list/bulk-editor/bulk-editor.component';
import { NgxFileDropModule } from 'ngx-file-drop';
import { TextComponent } from './components/common/input/text/text.component';
import { InputDebounceComponent } from './components/common/input/debounce/input-debounce.component';
import { SelectComponent } from './components/common/input/select/select.component';
import { CheckComponent } from './components/common/input/check/check.component';
import { SaveViewConfigDialogComponent } from './components/document-list/save-view-config-dialog/save-view-config-dialog.component';
@@ -63,6 +64,11 @@ import { LocalizedDateParserFormatter } from './utils/ngb-date-parser-formatter'
import { ApiVersionInterceptor } from './interceptors/api-version.interceptor';
import { ColorSliderModule } from 'ngx-color/slider';
import { ColorComponent } from './components/common/input/color/color.component';
import { DocumentAsnComponent } from './components/document-asn/document-asn.component';
import { SplitMergeComponent } from './components/split-merge/split-merge.component';
import { DndModule } from 'ngx-drag-drop';
import { DocumentChooserComponent } from './components/common/document-chooser/document-chooser.component';
import { PageChooserComponent } from './components/common/page-chooser/page-chooser.component';
import localeFr from '@angular/common/locales/fr';
import localeNl from '@angular/common/locales/nl';
@@ -73,7 +79,8 @@ import localeEnGb from '@angular/common/locales/en-GB';
import localeRo from '@angular/common/locales/ro';
import localeRu from '@angular/common/locales/ru';
import localeEs from '@angular/common/locales/es';
import { DocumentAsnComponent } from './components/document-asn/document-asn.component';
import localePl from '@angular/common/locales/pl';
import localeSv from '@angular/common/locales/sv';
registerLocaleData(localeFr)
@@ -86,6 +93,8 @@ registerLocaleData(localeEnGb)
registerLocaleData(localeRo)
registerLocaleData(localeRu)
registerLocaleData(localeEs)
registerLocaleData(localePl)
registerLocaleData(localeSv)
@NgModule({
declarations: [
@@ -115,6 +124,7 @@ registerLocaleData(localeEs)
DocumentCardSmallComponent,
BulkEditorComponent,
TextComponent,
InputDebounceComponent,
SelectComponent,
CheckComponent,
SaveViewConfigDialogComponent,
@@ -136,7 +146,10 @@ registerLocaleData(localeEs)
CustomDatePipe,
DateComponent,
ColorComponent,
DocumentAsnComponent
DocumentAsnComponent,
SplitMergeComponent,
DocumentChooserComponent,
PageChooserComponent
],
imports: [
BrowserModule,
@@ -149,7 +162,8 @@ registerLocaleData(localeEs)
InfiniteScrollModule,
PdfViewerModule,
NgSelectModule,
ColorSliderModule
ColorSliderModule,
DndModule
],
providers: [
DatePipe,
@@ -68,6 +68,13 @@
</svg>&nbsp;<ng-container i18n>Documents</ng-container>
</a>
</li>
<li class="nav-item" *ngIf="splitMergeToolVisible">
<a class="nav-link" routerLink="split_merge" routerLinkActive="active" (click)="closeMenu()">
<svg class="sidebaricon" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#scissors"/>
</svg>&nbsp;<ng-container i18n>Split & merge</ng-container>
</a>
</li>
</ul>
<h6 class="sidebar-heading px-3 mt-4 mb-1 text-muted" *ngIf='savedViewService.sidebarViews.length > 0'>
@@ -12,6 +12,7 @@ import { DocumentDetailComponent } from '../document-detail/document-detail.comp
import { Meta } from '@angular/platform-browser';
import { DocumentListViewService } from 'src/app/services/document-list-view.service';
import { FILTER_FULLTEXT_QUERY } from 'src/app/data/filter-rule-type';
import { SplitMergeService } from 'src/app/services/split-merge.service';
@Component({
selector: 'app-app-frame',
@@ -27,7 +28,8 @@ export class AppFrameComponent implements OnInit {
private searchService: SearchService,
public savedViewService: SavedViewService,
private list: DocumentListViewService,
private meta: Meta
private meta: Meta,
private splitMergeService: SplitMergeService
) {
}
@@ -106,6 +108,10 @@ export class AppFrameComponent implements OnInit {
}
}
get splitMergeToolVisible() {
return this.splitMergeService.hasDocuments()
}
ngOnInit() {
}
@@ -0,0 +1,15 @@
<div class="modal-header">
<h4 class="modal-title" id="modal-basic-title" i18n>Choose Documents</h4>
<button type="button" class="close" aria-label="Close" (click)="cancelClicked()">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="m-n2 row row-cols-paperless-cards">
<app-document-card-small [simpleCard]="true" [selected]="list.isSelected(d)" (toggleSelected)="toggleSelected(d, $event)" [document]="d" *ngFor="let d of list.documents"></app-document-card-small>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-danger" (click)="cancelClicked()" i18n>Cancel</button>
<button type="button" class="btn btn-outline-primary" [disabled]="list.selected.size == 0" (click)="confirmClicked.emit()" i18n>Add Selected</button>
</div>
@@ -0,0 +1,28 @@
@import "/src/theme";
.modal-body {
max-height: 70vh;
overflow-y: scroll;
}
$paperless-card-breakpoints: (
0: 2, // xs
768px: 3, //md
992px: 4, //lg
1200px: 5, //xl
1400px: 6, // xxl
1600px: 7,
1800px: 8,
2000px: 9
);
.row-cols-paperless-cards {
@each $width, $n_cols in $paperless-card-breakpoints {
@media(min-width: $width) {
> * {
flex: 0 0 auto;
width: 100% / $n_cols;
}
}
}
}
@@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DocumentChooserComponent } from './document-chooser.component';
describe('DocumentChooserComponent', () => {
let component: DocumentChooserComponent;
let fixture: ComponentFixture<DocumentChooserComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ DocumentChooserComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(DocumentChooserComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,36 @@
import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { PaperlessDocument } from 'src/app/data/paperless-document';
import { DocumentListViewService } from 'src/app/services/document-list-view.service';
@Component({
selector: 'app-document-chooser',
templateUrl: './document-chooser.component.html',
styleUrls: ['./document-chooser.component.scss']
})
export class DocumentChooserComponent implements OnInit {
constructor(
public activeModal: NgbActiveModal,
public list: DocumentListViewService
) { }
@Output()
public confirmClicked = new EventEmitter()
ngOnInit(): void {
this.list.selectNone()
this.list.activateSavedView(null)
this.list.reload()
}
cancelClicked() {
this.list.selectNone()
this.activeModal.close()
}
toggleSelected(d: PaperlessDocument, event: MouseEvent): void {
if (!event.shiftKey) this.list.toggleSelected(d)
else this.list.selectRangeTo(d)
}
}
@@ -0,0 +1,2 @@
<input type="text" [class]="cssClasses" [placeholder]="placeholder" [(ngModel)]="inputValue" (keyup)="keyUp($event)" />
<span *ngIf="allowClear && inputValue?.length > 0" class="clear-wrapper" title="Clear all" (click)="clear()"><span aria-hidden="true" class="clear">×</span></span>
@@ -0,0 +1,23 @@
.clear-wrapper {
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
cursor: pointer;
position: absolute;
top: 5px;
right: 5px;
user-select: none;
width: 17px;
color: #999;
.clear {
display: inline-block;
font-size: 18px;
line-height: 1;
pointer-events: none;
}
&:hover .clear {
color: #D0021B;
}
}
@@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { InputDebounceComponent } from './text.component';
describe('InputDebounceComponent', () => {
let component: InputDebounceComponent;
let fixture: ComponentFixture<InputDebounceComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ InputDebounceComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(InputDebounceComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,66 @@
import { Component, Input, Output, ElementRef, EventEmitter } from '@angular/core';
import { fromEvent } from 'rxjs';
import { map, debounceTime, distinctUntilChanged } from 'rxjs/operators';
@Component({
selector: 'app-input-debounce',
templateUrl: './input-debounce.component.html',
styleUrls: ['./input-debounce.component.scss']
})
export class InputDebounceComponent {
@Input()
placeholder: string
@Input()
delay: number = 500
@Input()
classes: string
@Input()
allowClear: boolean = true
@Input()
set pattern(regexStr: string) {
this._pattern = new RegExp(regexStr)
}
_pattern: RegExp
@Output()
value: EventEmitter<string> = new EventEmitter<string>()
@Input()
inputValue: string;
constructor(private elementRef: ElementRef) {
fromEvent(elementRef.nativeElement, 'keyup').pipe(
map(() => this.inputValue),
debounceTime(this.delay),
distinctUntilChanged()
).subscribe(input =>
this.value.emit(input)
);
}
keyUp(event: any) {
if (!this._pattern) return
if (event.key.length == 1 && !this._pattern.test(event.key)) { // e.g. dont do for backspace
// invalid character, prevent input
event.preventDefault()
event.stopImmediatePropagation()
this.inputValue = this.inputValue.slice(this.inputValue.length, 1)
}
}
get cssClasses(): string {
return 'form-control ' + this.classes
}
clear() {
this.inputValue = ''
this.value.emit(this.inputValue)
}
}
@@ -0,0 +1,13 @@
<div class="modal-header">
<h4 class="modal-title" id="modal-basic-title">{{title}}: {{document.title}}</h4>
<button type="button" class="close" aria-label="Close" (click)="cancelClicked()">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<pdf-viewer class="page-chooser-viewer" [class.splitting]="splitting" [src]="previewUrl" [original-size]="false" [zoom]=".25" [autoresize]="true" [show-borders]="true" [show-all]="true" [render-text-mode]="2" (page-rendered)="afterPageRendered($event)" (after-load-complete)="pdfLoaded($event)"></pdf-viewer>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-danger" (click)="cancelClicked()" i18n>Cancel</button>
<button type="button" class="btn btn-outline-primary" (click)="confirmClicked()" [disabled]="pages.length == 0">{{title}}</button>
</div>
@@ -0,0 +1,89 @@
@import "src/theme";
.modal-body {
max-height: 70vh;
overflow-y: scroll;
}
::ng-deep .page-chooser-viewer {
min-height: 400px;
width: 100%;
.pdfViewer {
display: flex !important;
flex-wrap: wrap;
justify-content: space-between;
align-items: flex-start;
.page:not(.disabled) {
margin: 2px 3% 2rem !important;
cursor: pointer;
.textLayer {
pointer-events: none;
}
&:hover {
.textLayer {
background-color: $primary !important;
opacity: 0.5;
}
}
}
}
&:not(.splitting) {
.pdfViewer {
.page.selected {
&::after {
position: absolute;
top: 0.5rem;
left: 0.5rem;
display: block;
width: 1rem;
height: 1rem;
border-radius: 0.25rem;
content: "";
background: $primary no-repeat 50%/50% 50%;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e");
}
.textLayer {
background-color: $primary !important;
opacity: 0.5;
}
}
}
}
&.splitting {
.pdfViewer {
.page:not(:last-child).selected::after,
.page:not(:last-child):not(.disabled):hover::after {
background-color: $primary;
width: 2rem;
height: 100%;
content: "Split Here";
color: #abb2bf; // dark mode text color
position: absolute;
top: 0;
right: -2rem;
writing-mode: vertical-lr;
padding: 0.5rem;
text-align: center;
text-transform: uppercase;
letter-spacing: 0.1rem;
font-size: 80%;
font-weight: bold;
}
.page.disabled {
.canvasWrapper,
.textLayer {
opacity: 0.25;
pointer-events: none;
}
}
}
}
}
@@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PageChooserComponent } from './page-chooser.component';
describe('PageChooserComponent', () => {
let component: PageChooserComponent;
let fixture: ComponentFixture<PageChooserComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ PageChooserComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(PageChooserComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,90 @@
import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { PaperlessDocument, PaperlessDocumentPart } from 'src/app/data/paperless-document';
import { DocumentService } from 'src/app/services/rest/document.service';
import { PDFDocumentProxy } from 'ng2-pdf-viewer';
@Component({
selector: 'app-page-chooser',
templateUrl: './page-chooser.component.html',
styleUrls: ['./page-chooser.component.scss']
})
export class PageChooserComponent implements OnInit {
constructor(
public activeModal: NgbActiveModal,
private documentService: DocumentService
) { }
get previewUrl(): string {
return this.documentService.getPreviewUrl(this.document.id)
}
@Input()
document: PaperlessDocument
@Input()
splitting: boolean = false
public pages: number[]
public enabledPages: number[]
private nPages: number
@Output()
public confirmPages = new EventEmitter<number[]>()
get title(): string {
return this.splitting ? 'Select Split' : 'Select Pages'
}
ngOnInit(): void {
this.pages = (this.document as PaperlessDocumentPart).pages
if (this.splitting && this.pages?.length) this.enabledPages = this.pages.concat([])
if (!this.pages) this.pages = []
}
cancelClicked() {
this.activeModal.close()
}
confirmClicked() {
if (this.splitting) {
// we need pages as the full range since we wont know length of document later
const startPage = this.pages.pop()
for (let page = startPage + 1; page <= this.nPages; page++) {
if (!this.enabledPages || (this.enabledPages && this.enabledPages.indexOf(page) !== -1)) this.pages.push(page)
}
}
this.confirmPages.emit(this.pages.sort((a, b) => { return a - b }))
}
pdfLoaded(pdf: PDFDocumentProxy) {
this.nPages = pdf.numPages
}
public afterPageRendered(pageRenderedEvent: any) {
const pageView = pageRenderedEvent.source /* as PDFPageView */
const div = pageView.div as HTMLDivElement
if (this.splitting && this.enabledPages?.length) {
div.classList.toggle('disabled', this.enabledPages.indexOf(parseInt(div.dataset.pageNumber)) == -1)
} else {
div.classList.toggle('selected', this.pages.indexOf(parseInt(div.dataset.pageNumber)) !== -1)
}
div.onclick = () => {
let pageNum: number = parseInt(div.dataset.pageNumber)
if (this.splitting) { // only select 1 page
if (pageNum == this.nPages || (this.enabledPages?.length && pageNum == Math.max(...this.enabledPages))) return
this.pages = [pageNum]
div.parentNode.childNodes.forEach(pageEl => {
(pageEl as Element).classList.toggle('selected', false)
})
div.classList.toggle('selected', true)
} else {
this.pages.indexOf(pageNum) !== -1 ? this.pages.splice(this.pages.indexOf(pageNum), 1) : this.pages.push(pageNum)
div.classList.toggle('selected', this.pages.indexOf(pageNum) !== -1)
}
}
}
}
@@ -4,11 +4,6 @@ form {
position: relative;
}
.alert-heading {
font-size: 80%;
font-weight: bold;
}
.alerts-hidden {
.btn {
line-height: 1;
@@ -38,6 +38,12 @@
</svg>&nbsp;<span class="d-none d-lg-inline" i18n>More like this</span>
</button>
<button type="button" class="btn btn-sm btn-outline-primary mr-2" (click)="splitMerge()">
<svg class="buttonicon" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#scissors" />
</svg>&nbsp;<span class="d-none d-lg-inline" i18n>Add to split/merge</span>
</button>
<button type="button" class="btn btn-sm btn-outline-primary" (click)="close()">
<svg class="buttonicon" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#x" />
@@ -139,7 +145,7 @@
<pdf-viewer [src]="previewUrl" [original-size]="false" [show-borders]="true" [show-all]="true" [(page)]="previewCurrentPage" [render-text-mode]="2" (after-load-complete)="pdfPreviewLoaded($event)"></pdf-viewer>
</div>
<ng-template #nativePdfViewer>
<object [data]="previewUrl | safe" type="application/pdf" class="preview-sticky" width="100%"></object>
<object [data]="previewUrl | safe" class="preview-sticky" width="100%"></object>
</ng-template>
</ng-container>
<ng-container *ngIf="getContentType() == 'text/plain'">
@@ -21,6 +21,7 @@ import { TextComponent } from '../common/input/text/text.component';
import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service';
import { PaperlessDocumentSuggestions } from 'src/app/data/paperless-document-suggestions';
import { FILTER_FULLTEXT_MORELIKE } from 'src/app/data/filter-rule-type';
import { SplitMergeService } from 'src/app/services/split-merge.service';
@Component({
selector: 'app-document-detail',
@@ -76,7 +77,8 @@ export class DocumentDetailComponent implements OnInit {
private documentListViewService: DocumentListViewService,
private documentTitlePipe: DocumentTitlePipe,
private toastService: ToastService,
private settings: SettingsService) { }
private settings: SettingsService,
private splitMergeService: SplitMergeService) { }
get useNativePdfViewer(): boolean {
return this.settings.get(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER)
@@ -225,6 +227,11 @@ export class DocumentDetailComponent implements OnInit {
this.documentListViewService.quickFilter([{rule_type: FILTER_FULLTEXT_MORELIKE, value: this.documentId.toString()}])
}
splitMerge() {
this.splitMergeService.addDocument(this.document)
this.router.navigate(["split_merge"])
}
hasNext() {
return this.documentListViewService.hasNext(this.documentId)
}
@@ -56,6 +56,12 @@
</div>
</div>
<div class="col-auto ml-auto mb-2 mb-xl-0 d-flex">
<button type="button" class="btn btn-sm btn-outline-primary mr-2" (click)="addToSplitMerge()">
<svg class="buttonicon" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#scissors" />
</svg>&nbsp;<span class="d-none d-lg-inline" i18n>Add to split/merge</span>
</button>
<div class="btn-group btn-group-sm mr-2">
<button type="button" class="btn btn-outline-primary btn-sm" (click)="downloadSelected()">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
@@ -1,4 +1,4 @@
import { Component } from '@angular/core';
import { Component, EventEmitter, Output } from '@angular/core';
import { PaperlessTag } from 'src/app/data/paperless-tag';
import { PaperlessCorrespondent } from 'src/app/data/paperless-correspondent';
import { PaperlessDocumentType } from 'src/app/data/paperless-document-type';
@@ -16,6 +16,8 @@ import { MatchingModel } from 'src/app/data/matching-model';
import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service';
import { ToastService } from 'src/app/services/toast.service';
import { saveAs } from 'file-saver';
import { SplitMergeService } from 'src/app/services/split-merge.service';
import { Router } from '@angular/router';
@Component({
selector: 'app-bulk-editor',
@@ -41,7 +43,9 @@ export class BulkEditorComponent {
private modalService: NgbModal,
private openDocumentService: OpenDocumentsService,
private settings: SettingsService,
private toastService: ToastService
private toastService: ToastService,
private splitMergeService: SplitMergeService,
private router: Router
) { }
applyOnClose: boolean = this.settings.get(SETTINGS_KEYS.BULK_EDIT_APPLY_ON_CLOSE)
@@ -214,4 +218,9 @@ export class BulkEditorComponent {
saveAs(result, 'documents.zip');
})
}
addToSplitMerge() {
this.splitMergeService.addDocuments(this.list.selectedDocuments)
this.router.navigate(["split_merge"])
}
}
@@ -82,7 +82,8 @@
</svg>
<small>{{document.created | customDate:'mediumDate'}}</small>
</div>
<div *ngIf="document.__search_hit__" class="list-group-item bg-light text-dark border-0 d-flex search-score">
<div *ngIf="document.__search_hit__" class="list-group-item bg-light text-dark border-0 d-flex p-0 pl-4 search-score">
<small class="text-muted" i18n>Score:</small>
<ngb-progressbar [type]="searchScoreClass" [value]="document.__search_hit__.score" class="search-score-bar mx-2 mt-1" [max]="1"></ngb-progressbar>
</div>
@@ -10,7 +10,7 @@
</div>
</div>
<div style="top: 0; right: 0; font-size: large" class="text-right position-absolute mr-1">
<div *ngIf="!simpleCard" style="top: 0; right: 0; font-size: large" class="text-right position-absolute mr-1">
<div *ngFor="let t of getTagsLimited$() | async">
<app-tag [tag]="t" (click)="clickTag.emit(t.id);$event.stopPropagation()" [clickable]="true" linkTitle="Filter by tag" i18n-linkTitle></app-tag>
</div>
@@ -22,13 +22,13 @@
<div class="card-body p-2">
<p class="card-text">
<ng-container *ngIf="document.correspondent">
<ng-container *ngIf="document.correspondent && !simpleCard">
<a [routerLink]="" title="Filter by correspondent" i18n-title (click)="clickCorrespondent.emit(document.correspondent);$event.stopPropagation()" class="font-weight-bold">{{(document.correspondent$ | async)?.name}}</a>:
</ng-container>
{{document.title | documentTitle}}
</p>
</div>
<div class="card-footer pt-0 pb-2 px-2">
<div *ngIf="!simpleCard" class="card-footer pt-0 pb-2 px-2">
<div class="list-group list-group-flush border-0 pt-1 pb-2 card-info">
<button *ngIf="document.document_type" type="button" class="list-group-item list-group-item-action bg-transparent pl-0 p-1 border-0" title="Filter by document type"
(click)="clickDocumentType.emit(document.document_type);$event.stopPropagation()">
@@ -17,12 +17,15 @@ export class DocumentCardSmallComponent implements OnInit {
@Input()
selected = false
@Output()
toggleSelected = new EventEmitter()
@Input()
document: PaperlessDocument
@Input()
simpleCard: boolean = false
@Output()
toggleSelected = new EventEmitter()
@Output()
clickTag = new EventEmitter<number>()
@@ -93,6 +96,6 @@ export class DocumentCardSmallComponent implements OnInit {
}
mouseLeaveCard() {
this.popover.close()
this.popover?.close()
}
}
@@ -75,7 +75,7 @@
</app-page-header>
<div class="w-100 mb-2 mb-sm-4">
<div class="sticky-top py-2 mt-n2 mt-sm-n3 py-sm-4 bg-body mx-n3 px-3">
<app-filter-editor [hidden]="isBulkEditing" [(filterRules)]="list.filterRules" [unmodifiedFilterRules]="unmodifiedFilterRules" #filterEditor></app-filter-editor>
<app-bulk-editor [hidden]="!isBulkEditing"></app-bulk-editor>
</div>
@@ -99,7 +99,7 @@
<app-document-card-large [selected]="list.isSelected(d)" (toggleSelected)="toggleSelected(d, $event)" *ngFor="let d of list.documents; trackBy: trackByDocumentId" [document]="d" (clickTag)="clickTag($event)" (clickCorrespondent)="clickCorrespondent($event)" (clickDocumentType)="clickDocumentType($event)" (clickMoreLike)="clickMoreLike(d.id)">
</app-document-card-large>
</div>
<table class="table table-sm border shadow-sm" *ngIf="displayMode == 'details'">
<thead>
<th></th>
@@ -174,10 +174,10 @@
</tr>
</tbody>
</table>
<div class="m-n2 row row-cols-paperless-cards" *ngIf="displayMode == 'smallCards'">
<app-document-card-small [selected]="list.isSelected(d)" (toggleSelected)="toggleSelected(d, $event)" [document]="d" *ngFor="let d of list.documents; trackBy: trackByDocumentId" (clickTag)="clickTag($event)" (clickCorrespondent)="clickCorrespondent($event)" (clickDocumentType)="clickDocumentType($event)"></app-document-card-small>
</div>
</ng-template>
@@ -34,3 +34,12 @@ $paperless-card-breakpoints: (
right: 0 !important;
left: auto !important;
}
.sticky-top {
z-index: 990; // below main navbar
top: calc(7rem - 2px); // height of navbar (mobile)
@media (min-width: 580px) {
top: 3.5rem; // height of navbar
}
}
@@ -0,0 +1,166 @@
<app-page-header i18n-title title="Split & Merge Editor">
<div class="btn-group mt-2 mt-sm-0">
<button class="btn btn-sm btn-outline-primary" i18n-title title="Add Documents" (click)="chooseDocuments()">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#plus-circle" />
</svg>&nbsp;<ng-container i18n>Add Documents</ng-container>
</button>
</div>
<div class="btn-group ml-2 mt-2 mt-sm-0">
<button type="button" class="btn btn-sm btn-outline-primary"
[popoverTitle]="optionsTitle" [autoClose]="'outside'" [ngbPopover]="optionsPopoverBody" popoverClass="shadow" #optionsPopover="ngbPopover">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#gear" />
</svg>&nbsp;<ng-container i18n>Options</ng-container>
</button>
<ng-template #optionsTitle>
<ng-container i18n>Options</ng-container>
<button type="button" class="close" aria-label="Close" (click)="optionsPopover.close()">
<span aria-hidden="true">&times;</span>
</button>
</ng-template>
<ng-template #optionsPopoverBody>
<div class="form-group row text-dark">
<label for="source_options" class="col-sm-3 col-form-label pt-0" i18n>Delete source documents</label>
<div class="col-sm-9">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="source_options-delete" [(ngModel)]="delete_source_documents">
<label class="custom-control-label" for="source_options-delete" [class.text-danger]="delete_source_documents"><ng-container i18n>Delete</ng-container><br/><small [class.text-muted]="!delete_source_documents" i18n>Source documents will be immediately deleted.</small></label>
</div>
</div>
</div>
<div class="form-group mt-4 row text-dark">
<label for="metadata_options" class="col-sm-3 col-form-label pt-0" i18n>Output document metadata</label>
<div class="col-sm-9">
<div class="custom-control custom-radio">
<input type="radio" id="metadata_setting-copy" name="metadata_setting" class="custom-control-input" [value]="splitMergeMetadata.COPY_FIRST" [(ngModel)]="metadata_setting">
<label class="custom-control-label" for="metadata_setting-copy"><ng-container i18n>First document</ng-container><br/><small class="text-muted" i18n>Metadata will be copied from first document.</small></label>
</div>
<div class="custom-control custom-radio">
<input type="radio" id="metadata_setting-redo" name="metadata_setting" class="custom-control-input" [value]="splitMergeMetadata.REDO" [(ngModel)]="metadata_setting">
<label class="custom-control-label" for="metadata_setting-redo"><ng-container i18n>Redo</ng-container><br/><small class="text-muted" i18n>Metadata detection will be re-run on new document.</small></label>
</div>
</div>
</div>
</ng-template>
</div>
<div class="btn-group ml-2 mr-2 mr-sm-5 mt-2 mt-sm-0">
<button class="btn btn-sm btn-outline-primary" i18n-title title="Save" (click)="save()" [disabled]="splitMergeService.getDocuments().length < 1">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#check-circle" />
</svg>&nbsp;<ng-container i18n>Save</ng-container>
</button>
</div>
<div class="btn-group ml-sm-5 mt-2 mt-sm-0">
<button class="btn btn-sm btn-outline-danger" i18n-title title="Cancel" (click)="cancel()">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#slash-circle" />
</svg>&nbsp;<ng-container i18n>Cancel</ng-container>
</button>
</div>
</app-page-header>
<div class="row">
<div class="col-md-6 col-lg-5">
<div class="h-100" dndDropzone (dndDrop)="onDrop($event, documents)">
<div class="spacer bg-primary" dndPlaceholderRef>
</div>
<div *ngFor="let d of documents; let i = index" class="card w-100 mb-3" [class.separator-card]="d.is_separator" [dndDraggable]="d" dndEffectAllowed="move" (dndMoved)="onDragged(d, documents)">
<ng-container *ngIf="d.is_separator">
<div class="separator"></div>
<h6 class="text-muted small font-weight-bold d-inline-block py-2 px-3 mb-0 mx-auto bg-body" i18n>Document End</h6>
<button class="btn btn-sm btn-danger" title="Remove" (click)="removeDocument(d, i)">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#trash" />
</svg>
</button>
</ng-container>
<div *ngIf="!d.is_separator" class="row no-gutters">
<div class="col-md-3 bg-light d-flex handle" dndHandle>
<svg width="2em" height="100%" viewBox="0 0 16 16" fill="currentColor" class="mx-auto">
<use xlink:href="assets/bootstrap-icons.svg#grip-horizontal" />
</svg>
<div class="doc-thumb" [style.background-image]="'url(' + getThumbUrl(d.id) + ')'"></div>
</div>
<div class="col-md-9">
<div class="card-body p-3">
<h6 class="card-title mb-2">{{d.title}}</h6>
<div class="card-actions">
<div class="btn-toolbar btn-toolbar-sm justify-content-between w-100">
<button class="btn btn-sm btn-outline-danger flex-fill" i18n-title title="Remove" (click)="removeDocument(d, i)">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#trash" />
</svg><span class="d-none d-xl-inline">&nbsp;<ng-container i18n>Remove</ng-container></span>
</button>
<button class="btn btn-sm btn-outline-primary ml-3 flex-fill" i18n-title title="Split" (click)="chooseSplit(d, i)">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#scissors" />
</svg><span class="d-none d-xl-inline">&nbsp;<ng-container i18n>Split</ng-container></span>
</button>
</div>
<div class="input-group input-group-sm w-100 mt-3">
<div class="input-group-prepend">
<div class="input-group-text"><ng-container i18n>Pages</ng-container>:</div>
</div>
<app-input-debounce delay="500" classes="form-control-sm" placeholder="All" ngbTooltip="e.g. 1-3,5" pattern="[0-9\,\-]" [inputValue]="formatPages(d.pages)" (value)="pagesFieldChange($event, d, i)"></app-input-debounce>
<div class="input-group-append">
<button class="btn btn-outline-primary" type="button" i18n-title title="Select Pages" (click)="choosePages(d, i)">
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#pencil" />
</svg><span class="d-none d-xl-inline">&nbsp;<ng-container i18n>Select Pages</ng-container></span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-7">
<ngb-alert *ngIf="error" type="danger" class="mt-2 mb-0" [dismissible]="false">
<h6 class="alert-heading" i18n>An error occurred during operation</h6>
<p class="mb-0 pb-1" i18n>Please check document settings and parts.</p>
<p class="mb-0 pb-1 small"><ng-container i18n>Message</ng-container>: <span class="font-italic">{{error}}</span></p>
</ngb-alert>
<ng-container *ngIf="!error && previewUrls.length > 1">
<ul ngbNav #previewNav="ngbNav" class="nav-tabs">
<li *ngFor="let previewUrl of previewUrls; let j = index" [ngbNavItem]="j">
<a class="bg-light" ngbNavLink><ng-container i18n>Document</ng-container> {{j + 1}}</a>
<ng-template ngbNavContent>
<div class="preview-container px-2 tabbed text-center bg-light">
<ng-container [ngTemplateOutlet]="previewHeader" [ngTemplateOutletContext]="{ $implicit: j }"></ng-container>
<pdf-viewer [src]="previewUrl" [original-size]="false" [show-borders]="true" [show-all]="true" [render-text-mode]="2" [(page)]="previewCurrentPages[j]" (after-load-complete)="pdfPreviewLoaded($event, j)" (page-rendered)="pdfPageRendered($event, j)"></pdf-viewer>
</div>
</ng-template>
</li>
</ul>
<div [ngbNavOutlet]="previewNav"></div>
</ng-container>
<div *ngIf="!error && previewUrls.length <= 1" class="preview-container px-2 text-center bg-light">
<ng-container [ngTemplateOutlet]="previewHeader" [ngTemplateOutletContext]="{ $implicit: 0 }"></ng-container>
<pdf-viewer *ngIf="previewUrls.length > 0" [src]="previewUrls[0]" [original-size]="false" [show-borders]="true" [show-all]="true" [render-text-mode]="2" [(page)]="previewCurrentPages[0]" (after-load-complete)="pdfPreviewLoaded($event, 0)" (page-rendered)="pdfPageRendered($event, 0)"></pdf-viewer>
</div>
</div>
</div>
<ng-template #previewHeader let-index>
<div class="d-flex mt-2 p-2 w-100 justify-space-between">
<h6 class="text-muted mt-1" [class.mx-auto]="previewNumPages[index] == undefined" [class.mr-auto]="previewNumPages[index] !== undefined" i18n>Preview</h6>
<div *ngIf="previewNumPages[index] !== undefined" class="input-group input-group-sm w-auto">
<div class="input-group-prepend">
<div class="input-group-text" i18n>Page</div>
</div>
<input class="form-control flex-grow-0 w-auto" type="number" min="1" [max]="previewNumPages[index]" [(ngModel)]="previewCurrentPages[index]" />
<div class="input-group-append">
<div class="input-group-text" i18n>of {{previewNumPages[index]}}</div>
</div>
</div>
</div>
<div *ngIf="loading" class="spinner-border" role="status">
<span class="sr-only" i18n>Loading...</span>
</div>
</ng-template>
@@ -0,0 +1,116 @@
@import "/src/theme";
.card {
.handle {
cursor: move;
}
.doc-thumb {
background-position: top center;
background-size: cover;
background-repeat: no-repeat;
min-height: 5rem;
height: 100%;
width: 70%;
}
&.separator-card {
border: none;
background: transparent;
}
}
.spacer {
min-height: 0.25rem;
width: 100%;
margin: 1rem;
}
.preview-container {
height: calc(100vh - 170px);
overflow: hidden;
&.tabbed {
height: calc(100vh - 200px);
}
.spinner-border {
margin-top: 40%;
}
}
.split-document-preview ::ng-deep .ng2-pdf-viewer-container {
width: 1px !important;
height: 1px !important;
overflow: hidden !important;
}
::ng-deep .document-selector {
width: 80vw;
min-width: 50vw;
}
button span {
margin-left: 0.15rem;
}
app-input-debounce {
flex: 1 1;
position: relative;
::ng-deep .form-control {
border-radius: 0;
}
}
.nav-link.bg-light {
border-bottom-color: #f8f9fa;
&:not(.active) {
background-color: #fff !important;
border-bottom-color: #dee2e6;
}
}
.separator-card {
.separator {
border: 0;
height: 20px;
opacity: 0.5;
background-color: transparent !important;
background-image: url("data:image/svg+xml;utf8, <svg viewBox='0 0 200 110' xmlns='http://www.w3.org/2000/svg'><path d='M -15 110 L100 10 L215 110' fill='none' stroke='%23000000' stroke-width='1' vector-effect='non-scaling-stroke'/></svg>");
background-position: bottom left;
background-size: 2% auto;
background-repeat: repeat-x;
}
h6 {
text-transform: uppercase;
text-align: center;
letter-spacing: 0.1em;
margin-top: -20px !important;
z-index: 10;
}
button {
transition: all 0.3s ease;
opacity: 0;
pointer-events: none;
position: absolute;
top: 0;
right: 0;
}
&:hover button {
opacity: 1;
pointer-events: all;
}
}
::ng-deep .popover {
min-width: 30rem;
.close {
line-height: 0.7;
}
}
@@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SplitMergeComponent } from './split-merge.component';
describe('SplitMergeComponent', () => {
let component: SplitMergeComponent;
let fixture: ComponentFixture<SplitMergeComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ SplitMergeComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(SplitMergeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,212 @@
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Router } from '@angular/router';
import { SplitMergeMetadata } from 'src/app/data/split-merge-request';
import { SplitMergeService } from 'src/app/services/split-merge.service';
import { DocumentService } from 'src/app/services/rest/document.service';
import { DocumentListViewService } from 'src/app/services/document-list-view.service';
import { PaperlessDocument, PaperlessDocumentPart } from 'src/app/data/paperless-document';
import { DndDropEvent } from 'ngx-drag-drop';
import { Subject, Subscription } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { DocumentChooserComponent } from 'src/app/components/common/document-chooser/document-chooser.component'
import { PageChooserComponent } from 'src/app/components/common/page-chooser/page-chooser.component'
import { PDFDocumentProxy } from 'ng2-pdf-viewer';
@Component({
selector: 'app-split-merge',
templateUrl: './split-merge.component.html',
styleUrls: ['./split-merge.component.scss']
})
export class SplitMergeComponent implements OnInit, OnDestroy {
public loading: boolean = false
public previewUrls: string[] = []
public previewNumPages: number[] = []
public previewCurrentPages: number[] = []
public delete_source_documents: boolean = false
public metadata_setting: SplitMergeMetadata = SplitMergeMetadata.COPY_FIRST
private previewDebounce$ = new Subject()
private previewSub: Subscription
public error: string
constructor(
public splitMergeService: SplitMergeService,
private documentService: DocumentService,
private list: DocumentListViewService,
private router: Router,
private modalService: NgbModal
) { }
ngOnInit() {
this.previewSub = this.previewDebounce$.pipe(
debounceTime(400)
).subscribe(() => {
if (this.splitMergeService.hasDocuments()) {
this.save(true)
} else {
this.previewUrls = []
this.error = undefined
}
})
this.previewDebounce$.next()
}
ngOnDestroy() {
this.previewDebounce$.complete()
}
get documents(): PaperlessDocument[] {
return this.splitMergeService.getDocuments()
}
getThumbUrl(documentId: number) {
return this.documentService.getThumbUrl(documentId)
}
get splitMergeMetadata() {
return SplitMergeMetadata
}
chooseDocuments() {
let modal = this.modalService.open(DocumentChooserComponent, { backdrop: 'static', size: 'xl' })
modal.componentInstance.confirmClicked.subscribe(() => {
modal.componentInstance.buttonsEnabled = false
this.splitMergeService.addDocuments(this.list.selectedDocuments)
this.list.selectNone()
modal.close()
this.previewDebounce$.next()
})
}
onDragged(document: PaperlessDocument, documents: PaperlessDocument[]) {
const index = this.documents.indexOf(document)
this.documents.splice(index, 1)
}
onDrop(event: DndDropEvent, documents: PaperlessDocument[]) {
let index = event.index
if (typeof index === "undefined") {
index = this.documents.length
}
this.documents.splice(index, 0, event.data)
this.previewDebounce$.next()
}
cancel() {
this.splitMergeService.clear()
this.router.navigate([""])
}
save(preview: boolean = false) {
this.loading = true
this.previewUrls = []
this.splitMergeService.executeSplitMerge(preview, this.delete_source_documents, this.metadata_setting).subscribe(
result => {
this.loading = false
this.error = undefined
if (preview) {
this.previewUrls = result.map(r => this.splitMergeService.getPreviewUrl(r))
} else {
this.splitMergeService.clear()
this.router.navigate([""])
}
},
error => {
this.error = error
this.loading = false
}
)
}
removeDocument(d: PaperlessDocument, index: number) {
this.splitMergeService.removeDocument(d, index)
this.previewNumPages[index] = this.previewCurrentPages[index] = undefined
this.previewDebounce$.next()
}
choosePages(d: PaperlessDocument, index: number) {
let modal = this.modalService.open(PageChooserComponent, { backdrop: 'static', size: 'lg' })
modal.componentInstance.document = d
modal.componentInstance.confirmPages.subscribe((pages) => {
this.splitMergeService.setDocumentPages(d, index, pages)
modal.componentInstance.buttonsEnabled = false
modal.close()
this.previewDebounce$.next()
})
}
chooseSplit(d: PaperlessDocument, index: number) {
let modal = this.modalService.open(PageChooserComponent, { backdrop: 'static', size: 'lg' })
modal.componentInstance.document = d
const enabledPages = (d as PaperlessDocumentPart).pages
modal.componentInstance.splitting = true
modal.componentInstance.confirmPages.subscribe((pages) => {
this.splitMergeService.splitDocument(d, index, pages, enabledPages)
modal.componentInstance.buttonsEnabled = false
modal.close()
this.previewDebounce$.next()
})
}
pagesFieldChange(pageStr: string, d: PaperlessDocument, index: number) {
let pages = pageStr.split(',').map(p => {
if (p.indexOf('-') !== -1) {
const minmax = p.split('-')
let range = []
for (let i = parseInt(minmax[0]); i <= parseInt(minmax[1]); i++) {
range.push(i)
}
return range
} else if (p.length > 0) {
return parseInt(p)
} else {
return null
}
})
pages = [].concat.apply([], pages) // e.g. flat()
pages = pages.filter(page => page !== null)
this.splitMergeService.setDocumentPages(d, index, pages as number[])
this.previewDebounce$.next()
}
formatPages(pages: number[]): string {
let pageStrings = []
let rangeStart, rangeEnd
pages?.forEach(page => {
if (rangeStart == undefined) {
rangeStart = page
} else if (page - rangeStart == 1) {
rangeEnd = page
} else if (rangeEnd !== undefined && page - rangeEnd == 1) {
rangeEnd = page
} else {
pageStrings.push(rangeEnd !== undefined ? rangeStart + '-' + rangeEnd : rangeStart)
rangeStart = page
rangeEnd = undefined
}
})
if (rangeEnd !== undefined) {
pageStrings.push(rangeStart + '-' + rangeEnd)
} else if (rangeStart !== undefined) {
pageStrings.push(rangeStart)
}
return pageStrings.join(',')
}
pdfPreviewLoaded(pdf: PDFDocumentProxy, index: number) {
this.previewNumPages[index] = pdf.numPages
}
pdfPageRendered(event: any, index) { // CustomEvent is es6
if (event.pageNumber > 0 && this.previewCurrentPages[index] == undefined) this.previewCurrentPages[index] = 1
}
}
@@ -52,3 +52,11 @@ export interface PaperlessDocument extends ObjectWithId {
__search_hit__?: SearchHit
}
export interface PaperlessDocumentPart extends PaperlessDocument {
pages: number[]
}
export interface PaperlessDocumentSeparator extends PaperlessDocument {
is_separator: boolean
}
@@ -0,0 +1,29 @@
export enum SplitMergeMetadata {
REDO = "redo",
COPY_FIRST = "copy_first"
}
export interface SplitMergePlanDocumentPart {
document: number,
pages?: string
}
export type SplitMergePlan = SplitMergePlanDocumentPart[][]
export interface SplitMergeRequest {
split_merge_plan: SplitMergePlan
delete_source: boolean
metadata: SplitMergeMetadata
preview: boolean
}
@@ -189,6 +189,10 @@ export class DocumentListViewService {
return this.activeListViewState.selected
}
get selectedDocuments(): PaperlessDocument[] {
return this.activeListViewState.documents.filter(d => this.activeListViewState.selected.has(d.id))
}
setSort(field: string, reverse: boolean) {
this.activeListViewState.sortField = field
this.activeListViewState.sortReverse = reverse
+2 -1
View File
@@ -98,7 +98,8 @@ export class SettingsService {
{code: "ro-ro", name: $localize`Romanian`, englishName: "Romanian", 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: "pl-pl", name: $localize`Polish`, englishName: "Polish", dateInputFormat: "dd.mm.yyyy"},
{code: "sv-se", name: $localize`Swedish`, englishName: "Swedish", dateInputFormat: "yyyy-mm-dd"}
]
}
@@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { SplitMergeService } from './split-merge.service';
describe('SplitMergeService', () => {
let service: SplitMergeService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(SplitMergeService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});
@@ -0,0 +1,103 @@
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { environment } from 'src/environments/environment';
import { PaperlessDocument, PaperlessDocumentPart, PaperlessDocumentSeparator } from '../data/paperless-document';
import { SplitMergeMetadata, SplitMergeRequest } from '../data/split-merge-request';
@Injectable({
providedIn: 'root'
})
export class SplitMergeService {
// this also needs to incorporate pages, if we want to support that.
private documents: PaperlessDocument[] = []
constructor(private http: HttpClient) { }
addDocument(document: PaperlessDocument, atIndex?: number) {
if (atIndex !== undefined) this.documents.splice(atIndex, 0, document)
else this.documents.push(document)
}
addDocuments(documents: PaperlessDocument[]) {
this.documents = this.documents.concat(documents)
}
removeDocument(document: PaperlessDocument, atIndex?: number) {
if (!atIndex) atIndex = this.documents.indexOf(document)
this.documents.splice(atIndex, 1)
this.sanitizeStartEndSeparators()
}
getDocuments() {
return this.documents
}
hasDocuments(): boolean {
return this.documents.length > 0
}
clear() {
this.documents = []
}
setDocumentPages(d: PaperlessDocument, index: number, pages: number[]) {
(this.documents[index] as PaperlessDocumentPart).pages = pages.length > 0 ? pages : null
}
splitDocument(d: PaperlessDocument, index: number, secondPages: number[], enabledPages?: number[]) {
const firstPages = []
for (let page = 1; page < secondPages[0]; page++) {
if (!enabledPages || (enabledPages?.length && enabledPages.indexOf(page) !== -1)) firstPages.push(page)
}
(this.documents[index] as PaperlessDocumentPart).pages = firstPages
this.documents.splice(index + 1, 0, { is_separator: true } as PaperlessDocumentSeparator)
let d2 = { ...d } as PaperlessDocumentPart
d2.pages = secondPages
this.documents.splice(index + 2, 0, d2)
}
sanitizeStartEndSeparators() {
if (this.documents.length > 0 && (this.documents[this.documents.length - 1] as PaperlessDocumentSeparator).is_separator) {
this.documents.pop()
} else if (this.documents.length > 0 && (this.documents[0] as PaperlessDocumentSeparator).is_separator) {
this.documents.shift()
}
}
executeSplitMerge(preview: boolean, delete_source: boolean, metadata: SplitMergeMetadata): Observable<string[]> {
this.sanitizeStartEndSeparators()
let currentDocument = []
let split_merge_plan = [currentDocument]
this.documents.forEach(d => {
if ((d as PaperlessDocumentSeparator).is_separator) {
currentDocument = []
split_merge_plan.push(currentDocument)
} else {
currentDocument.push({document: d.id, pages: (d as PaperlessDocumentPart).pages?.join(',')})
}
})
let request: SplitMergeRequest = {
delete_source: delete_source,
preview: preview,
metadata: metadata,
split_merge_plan: split_merge_plan
}
return this.http.post<string[]>(`${environment.apiBaseUrl}split_merge/`, request).pipe(
catchError(this.handleError)
)
}
handleError(error: HttpErrorResponse) {
console.log('API split_merge result error:', error)
return throwError(error.message)
}
getPreviewUrl(previewKey: string) {
return `${environment.apiBaseUrl}split_merge/${previewKey}/`
}
}
+1 -1
View File
@@ -3,7 +3,7 @@ export const environment = {
apiBaseUrl: "/api/",
apiVersion: "2",
appTitle: "Paperless-ng",
version: "1.4.0",
version: "1.4.2",
webSocketHost: window.location.host,
webSocketProtocol: (window.location.protocol == "https:" ? "wss:" : "ws:")
};
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="needs-translation">Confirm delete</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="needs-translation">Do you really want to delete document "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="needs-translation">The files for this document will be deleted permanently. This operation cannot be undone.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="needs-translation">Delete document</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="needs-translation">Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="needs-translation">Title</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="needs-translation">Title &amp; content</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="needs-translation">ASN</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="needs-translation">Advanced search</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="needs-translation">More like</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="needs-translation">Filter tags</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="needs-translation">Filter correspondents</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="needs-translation">Filter document types</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="needs-translation">Reset filters</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="needs-translation">Score:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="needs-translation">Suggestions:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="needs-translation">Spanish</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="needs-translation">Polish</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="needs-translation">Swedish</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="needs-translation">ISO 8601</target>
</trans-unit>
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Löschen bestätigen</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Möchten Sie das Dokument "<x id="PH" equiv-text="this.document.title"/>" wirklich löschen?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">Die Dateien dieses Dokuments werden permanent gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Dokument löschen</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Fehler beim Löschen des Dokuments: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Titel</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Titel &amp; Inhalt</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">ASN</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="translated">Erweiterte Suche</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="translated">Ähnlich zu</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Tags filtern</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Korrespondenten filtern</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Dokumenttypen filtern</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Filter zurücksetzen</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Relevanz:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Vorschläge:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Spanisch</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="translated">Polnisch</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="translated">Schwedisch</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
+39 -23
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Confirm delete</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Do you really want to delete document "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">The files for this document will be deleted permanently. This operation cannot be undone.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Delete document</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Title</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Title &amp; content</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">ASN</target>
</trans-unit>
@@ -1231,23 +1231,23 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="needs-translation">Advanced search</target>
<target state="translated">Advanced search</target>
</trans-unit>
<trans-unit id="2649431021108393503" datatype="html">
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="needs-translation">More like</target>
<target state="translated">More like</target>
</trans-unit>
<trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html">
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Filter tags</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Filter correspondents</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Filter document types</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Reset filters</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Score:</target>
</trans-unit>
@@ -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="linenumber">43</context>
</context-group>
<target state="needs-translation">Created: <x id="INTERPOLATION" equiv-text="{{ document.created | customDate}}"/></target>
<target state="translated">Created: <x id="INTERPOLATION" equiv-text="{{ document.created | customDate}}"/></target>
</trans-unit>
<trans-unit id="0f5d856cb63c69fde44fbfc653ec0655f9040865" datatype="html">
<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="linenumber">44</context>
</context-group>
<target state="needs-translation">Added: <x id="INTERPOLATION" equiv-text="{{ document.added | customDate}}"/></target>
<target state="translated">Added: <x id="INTERPOLATION" equiv-text="{{ document.added | customDate}}"/></target>
</trans-unit>
<trans-unit id="a205126adef6251fc63305f1a6228d07bc2795a8" datatype="html">
<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="linenumber">45</context>
</context-group>
<target state="needs-translation">Modified: <x id="INTERPOLATION" equiv-text="{{ document.modified | customDate}}"/></target>
<target state="translated">Modified: <x id="INTERPOLATION" equiv-text="{{ document.modified | customDate}}"/></target>
</trans-unit>
<trans-unit id="7985804062689412812" datatype="html">
<source>Error executing bulk operation: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Suggestions:</target>
</trans-unit>
@@ -1855,7 +1855,7 @@
<context context-type="sourcefile">src/app/components/document-asn/document-asn.component.html</context>
<context context-type="linenumber">1</context>
</context-group>
<target state="needs-translation">Searching document with asn <x id="INTERPOLATION" equiv-text="{{asn}}"/></target>
<target state="translated">Searching document with asn <x id="INTERPOLATION" equiv-text="{{asn}}"/></target>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Spanish</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="translated">Polish</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="needs-translation">Swedish</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Confirmar borrado</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">¿Estás seguro de querer borrar el documento "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">Los archivos para este documento serán borrados permanentemente. Esta operación no se puede deshacer.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Borrar documento</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Error borrando el documento: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Título</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Titulo y contenido</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">NSF</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="needs-translation">Advanced search</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="needs-translation">More like</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Filtrar etiquetas</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Filtrar tipos de documento</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Filtrar tipos de documento</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Quitar filtros</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Puntuación:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Sugerencias:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Español</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="needs-translation">Polish</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="needs-translation">Swedish</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Confirmer la suppression</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Voulez-vous vraiment supprimer le document "<x id="PH" equiv-text="this.document.title"/>" ?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">Les fichiers liés à ce document seront supprimés définitivement. Cette action est irréversible.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Supprimer le document</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Une erreur s'est produite lors de la suppression du document : <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Titre</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Titre &amp; contenu</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">NSA</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="translated">Recherche avancée</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="translated">Plus comme</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Filtrer les étiquettes</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Filtrer les correspondants</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Filtrer les types de documents</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Réinitialiser les filtres</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Score :</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Suggestions : </target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Espagnol</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="translated">Polonais</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="translated">Suédois</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Törlés megerősítése</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="needs-translation">Do you really want to delete document "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">A dokumentumhoz tartozó fájlok véglegesen törlésre kerülnek. Ez a művelet nem visszafordítható.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Dokumentum törlése</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="needs-translation">Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Cím</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="needs-translation">Title &amp; content</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">ASN</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="needs-translation">Advanced search</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="needs-translation">More like</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Cimkék szerinti szűrés</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Partnerek szerinti szűrés</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Dokumentum típus szerinti szűrés</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="needs-translation">Reset filters</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Pont:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="needs-translation">Suggestions:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="needs-translation">Spanish</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="needs-translation">Polish</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="needs-translation">Swedish</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="needs-translation">ISO 8601</target>
</trans-unit>
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Conferma eliminazione</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Vuoi eliminare il documento "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">I file di questo documento saranno eliminati permanentemente. Questa operazione è irreversibile.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Elimina documento</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Errore nell'eliminazione del documento: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Titolo</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Titolo &amp; contenuto</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">ASN</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="translated">Ricerca avanzata</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="translated">Più come</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Filtra tag</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Filtra corrispondenti</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Filtra tipi di documento</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Ripristina filtri</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Punteggio:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Suggerimenti:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Spagnolo</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="translated">Polacco</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="translated">Svedese</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
+59 -43
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Bevestig het verwijderen</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Wilt u het document echt verwijderen "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">De bestanden voor dit document worden definitief verwijderd. Deze bewerking kan niet ongedaan worden gemaakt.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Verwijder document</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Fout bij het verwijderen van het document: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -480,7 +480,7 @@
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context>
<context context-type="linenumber">26</context>
</context-group>
<target state="translated">Wil je het etiket echt verwijderen "<x id="PH" equiv-text="object.name"/>"?</target>
<target state="translated">Wil je dit label echt verwijderen "<x id="PH" equiv-text="object.name"/>"?</target>
</trans-unit>
<trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b" datatype="html">
<source>Tags</source>
@@ -488,7 +488,7 @@
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context>
<context context-type="linenumber">1</context>
</context-group>
<target state="translated">Etiketten</target>
<target state="translated">Labels</target>
</trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
<source>Create</source>
@@ -1000,7 +1000,7 @@
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">22</context>
</context-group>
<target state="translated">Nieuw etiket maken</target>
<target state="translated">Nieuw label aanmaken</target>
</trans-unit>
<trans-unit id="5872175735754226507" datatype="html">
<source>Edit tag</source>
@@ -1016,7 +1016,7 @@
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">13</context>
</context-group>
<target state="translated">"Postvak in"-etiket</target>
<target state="translated">"Postvak in"-label</target>
</trans-unit>
<trans-unit id="5e2f1a4ea12a1b8606ee3f0548d0ba64bf266077" datatype="html">
<source>Inbox tags are automatically assigned to all consumed documents.</source>
@@ -1024,7 +1024,7 @@
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">13</context>
</context-group>
<target state="translated">"Postvak in"-etiketten worden automatisch toegewezen aan alle verwerkte documenten.</target>
<target state="translated">"Postvak in"-labels worden automatisch toegewezen aan alle verwerkte documenten.</target>
</trans-unit>
<trans-unit id="6672809941092516947" datatype="html">
<source>Create new document type</source>
@@ -1177,7 +1177,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">50</context>
</context-group>
<target state="translated">Etiket: <x id="PH" equiv-text="this.tags.find(t =&gt; t.id == +rule.value)?.name"/></target>
<target state="translated">Label: <x id="PH" equiv-text="this.tags.find(t =&gt; t.id == +rule.value)?.name"/></target>
</trans-unit>
<trans-unit id="6494566478302448576" datatype="html">
<source>Without any tag</source>
@@ -1185,7 +1185,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">54</context>
</context-group>
<target state="translated">Zonder enig etiket</target>
<target state="translated">Zonder label</target>
</trans-unit>
<trans-unit id="6523384805359286307" datatype="html">
<source>Title: <x id="PH" equiv-text="rule.value"/></source>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Titel</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Titel en inhoud</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">ASN</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="translated">Geavanceerd zoeken</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="translated">Meer zoals</target>
</trans-unit>
@@ -1247,15 +1247,15 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Etiketten filteren</target>
<target state="translated">Labels filteren</target>
</trans-unit>
<trans-unit id="4b089ca12c472cf0b46167bb5afe4b527b301bbc" datatype="html">
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Correspondenten filteren</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Documenttypes filteren</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Filters terug zetten</target>
</trans-unit>
@@ -1282,7 +1282,7 @@
<context context-type="linenumber">166</context>
</context-group>
<note priority="1" from="description">Filter drop down element to filter for documents with no correspondent/type/tag assigned</note>
<target state="translated">Niet toegekend</target>
<target state="translated">Zonder toewijzing</target>
</trans-unit>
<trans-unit id="c2d0ac9f528bbd5f53fd34269fde8b59e029621b" datatype="html">
<source>Apply</source>
@@ -1370,13 +1370,13 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">24</context>
</context-group>
<target state="translated">Op etiket filteren</target>
<target state="translated">Op label filteren</target>
</trans-unit>
<trans-unit id="9c5fdf21ec2cc7baa6f062f2dc417af45c8dbe60" datatype="html">
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Score:</target>
</trans-unit>
@@ -1453,7 +1453,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
<context context-type="linenumber">127</context>
</context-group>
<target state="translated">Bevestig toewijzen van etiketten</target>
<target state="translated">Bevestig toewijzen van labels</target>
</trans-unit>
<trans-unit id="6619516195038467207" datatype="html">
<source>This operation will add the tag &quot;<x id="PH" equiv-text="tag.name"/>&quot; to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
@@ -1461,7 +1461,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
<context context-type="linenumber">130</context>
</context-group>
<target state="translated">Het etiket "<x id="PH" equiv-text="tag.name"/>" zal aan <x id="PH_1" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en) worden toegewezen.</target>
<target state="translated">Het label "<x id="PH" equiv-text="tag.name"/>" zal aan <x id="PH_1" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en) worden toegewezen.</target>
</trans-unit>
<trans-unit id="1894412783609570695" datatype="html">
<source>This operation will add the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
@@ -1469,7 +1469,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
<context context-type="linenumber">132</context>
</context-group>
<target state="translated">De etiketten <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> zullen aan <x id="PH_1" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en) worden toegewezen.</target>
<target state="translated">De labels <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> zullen aan <x id="PH_1" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en) worden toegewezen.</target>
</trans-unit>
<trans-unit id="7181166515756808573" datatype="html">
<source>This operation will remove the tag &quot;<x id="PH" equiv-text="tag.name"/>&quot; from <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
@@ -1477,7 +1477,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
<context context-type="linenumber">135</context>
</context-group>
<target state="translated">Het etiket "<x id="PH" equiv-text="tag.name"/>" zal verwijderd worden van <x id="PH_1" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en).</target>
<target state="translated">Het label "<x id="PH" equiv-text="tag.name"/>" zal verwijderd worden van <x id="PH_1" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en).</target>
</trans-unit>
<trans-unit id="3819792277998068944" datatype="html">
<source>This operation will remove the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> from <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
@@ -1485,7 +1485,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
<context context-type="linenumber">137</context>
</context-group>
<target state="translated">De etiketten <x id="PH" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> zullen verwijderd worden van <x id="PH_1" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en).</target>
<target state="translated">De labels <x id="PH" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> zullen verwijderd worden van <x id="PH_1" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en).</target>
</trans-unit>
<trans-unit id="2739066218579571288" datatype="html">
<source>This operation will add the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> and remove the tags <x id="PH_1" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> on <x id="PH_2" equiv-text="this.list.selected.size"/> selected document(s).</source>
@@ -1493,7 +1493,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
<context context-type="linenumber">139</context>
</context-group>
<target state="translated">De etiketten <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> zullen toegevoegd worden aan, en de etiketten <x id="PH_1" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> zullen verwijderd worden van <x id="PH_2" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en).</target>
<target state="translated">De labels <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> zullen toegevoegd worden aan, en de labels <x id="PH_1" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> zullen verwijderd worden van <x id="PH_2" equiv-text="this.list.selected.size"/> geselecteerd(e) document(en).</target>
</trans-unit>
<trans-unit id="2996713129519325161" datatype="html">
<source>Confirm correspondent assignment</source>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Suggesties:</target>
</trans-unit>
@@ -1629,7 +1629,7 @@
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
<context context-type="linenumber">3</context>
</context-group>
<target state="translated">Toon alles</target>
<target state="translated">Alles weergeven</target>
</trans-unit>
<trans-unit id="61e0f26d843eec0b33ff475e111b0c2f7a80b835" datatype="html">
<source>Statistics</source>
@@ -1669,7 +1669,7 @@
<context context-type="sourcefile">src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts</context>
<context context-type="linenumber">35</context>
</context-group>
<target state="translated">Gefaald: <x id="PH" equiv-text="countFailed"/></target>
<target state="translated">Mislukt: <x id="PH" equiv-text="countFailed"/></target>
</trans-unit>
<trans-unit id="534116346205124059" datatype="html">
<source>Added: <x id="PH" equiv-text="countSuccess"/></source>
@@ -1693,7 +1693,7 @@
<context context-type="sourcefile">src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts</context>
<context context-type="linenumber">123</context>
</context-group>
<target state="translated">Bezig met opladen...</target>
<target state="translated">Bezig met uploaden...</target>
</trans-unit>
<trans-unit id="7446520539098045935" datatype="html">
<source>Upload complete, waiting...</source>
@@ -1701,7 +1701,7 @@
<context context-type="sourcefile">src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts</context>
<context context-type="linenumber">126</context>
</context-group>
<target state="translated">Upload voltooid, wachten om te verwerken...</target>
<target state="translated">Upload voltooid, wachten op verwerking...</target>
</trans-unit>
<trans-unit id="1405142710727603568" datatype="html">
<source>HTTP error: <x id="PH" equiv-text="error.status"/> <x id="PH_1" equiv-text="error.statusText"/></source>
@@ -1717,7 +1717,7 @@
<context context-type="sourcefile">src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html</context>
<context context-type="linenumber">1</context>
</context-group>
<target state="translated">Nieuwe documenten opladen</target>
<target state="translated">Nieuwe documenten uploaden</target>
</trans-unit>
<trans-unit id="52d5d56b6667ba3f7c759cbc0d4c39d34a99701e" datatype="html">
<source>Drop documents here or</source>
@@ -1783,7 +1783,7 @@
<context context-type="sourcefile">src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html</context>
<context context-type="linenumber">6,7</context>
</context-group>
<target state="translated">Je kunt documenten uploaden door bestanden in het oplaadvak rechts te slepen of door ze in de map te kopiëren die geconfigureerd werd als consumptiemap. Ze zullen vervolgens beginnen verschijnen in de lijst met documenten. Nadat je metadata hebt toegevoegd aan je documenten, kun je de filters in Paperless gebruiken om eigen views te maken (zoals 'Recent toegevoegd', 'Te bekijken'). Deze views zullen hier verschijnen in plaats van dit bericht.</target>
<target state="translated">Je kunt documenten uploaden door bestanden in het upload vak rechts te slepen of door ze in de map te kopiëren die geconfigureerd werd als consumptiemap. Ze zullen vervolgens verschijnen in de lijst met documenten. Nadat je metadata hebt toegevoegd aan je documenten, kun je de filters in Paperless gebruiken om eigen views te maken (zoals 'Recent toegevoegd', 'Te bekijken'). Deze views zullen hier verschijnen in plaats van dit bericht.</target>
</trans-unit>
<trans-unit id="cf5f85690feaba6e29343f9881e57a6c0ea6e82b" datatype="html">
<source>Paperless offers some more features that try to make your life easier:</source>
@@ -1799,7 +1799,7 @@
<context context-type="sourcefile">src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html</context>
<context context-type="linenumber">10</context>
</context-group>
<target state="translated">Eenmaal je documenten hebt toegevoegd en metadata hebt toegewezen, kan Paperless automatisch die metadata aan nieuwe documenten toewijzen.</target>
<target state="translated">Zodra je documenten hebt toegevoegd en metadata hebt toegewezen, kan Paperless die metadata automatisch aan nieuwe documenten toewijzen.</target>
</trans-unit>
<trans-unit id="9dca488928c0b7af46c3866f86a6c2c8548399aa" datatype="html">
<source>You can configure paperless to read your mails and add documents from attached files.</source>
@@ -1815,7 +1815,7 @@
<context context-type="sourcefile">src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html</context>
<context context-type="linenumber">13</context>
</context-group>
<target state="translated">Lees de documentatie na om deze functies te ontdekken. Het hoofdstuk over basisgebruik biedt ook inzichten over het gebruik van Paperless in het algemeen.</target>
<target state="translated">Raadpleeg de documentatie over het gebruik van deze functies. De sectie over basisgebruik bevat ook enige informatie over het gebruik van Paperless in het algemeen.</target>
</trans-unit>
<trans-unit id="218403386307979629" datatype="html">
<source>Metadata</source>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Spaans</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="translated">Pools</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="needs-translation">Swedish</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
@@ -2187,7 +2203,7 @@
<context context-type="sourcefile">src/app/components/manage/generic-list/generic-list.component.ts</context>
<context context-type="linenumber">104</context>
</context-group>
<target state="translated">Geassocieerde documenten zullen niet verwijderd worden.</target>
<target state="translated">Gekoppelde documenten zullen niet worden verwijderd.</target>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
<source>Delete</source>
@@ -2219,7 +2235,7 @@
<context context-type="sourcefile">src/app/data/matching-model.ts</context>
<context context-type="linenumber">12</context>
</context-group>
<target state="translated">Eender welk: Documenten die eender welk van deze woorden bevatten (gescheiden door spaties)</target>
<target state="translated">Een of meer: Documenten die een of meer van deze woorden bevatten (gescheiden door spaties)</target>
</trans-unit>
<trans-unit id="700315718208181326" datatype="html">
<source>All words</source>
File diff suppressed because it is too large. Load diff
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Confirmar exclusão</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Você realmente deseja excluir o documento "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">Os arquivos desse documento serão excluídos permanentemente. Essa operação não pode ser revertida.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Excluir documento</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Erro ao excluir documento: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Título</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Título &amp; conteúdo</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">NSA</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="needs-translation">Advanced search</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="needs-translation">More like</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Filtrar etiquetas</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Filtrar correspondentes</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Filtrar tipos de documento</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Limpar filtros</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Nota:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Sugestões:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="needs-translation">Spanish</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="needs-translation">Polish</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="needs-translation">Swedish</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Confirmar exclusão</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Você realmente deseja excluir o documento "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">Os arquivos desse documento serão excluídos permanentemente. Essa operação não pode ser revertida.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Excluir documento</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Erro ao excluir documento: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Título</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Título &amp; conteúdo</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">NSA</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="translated">Pesquisa avançada</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="translated">Mais semelhante</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Filtrar etiquetas</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Filtrar correspondentes</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Filtrar tipos de documentos</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Limpar filtros</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Pontuação:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Sugestões:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Espanhol</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="translated">Polaco</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="translated">Sueco</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
+39 -23
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Confirmă ștergerea</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Sunteţi sigur că doriţi să ştergeţi documentul "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">Fișierele pentru acest document vor fi șterse permanent. Operațiunea este ireversibila.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Șterge document</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Eroare la ștergerea documentului: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Titlu</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Titlu si conținut</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">Aviz prealabil de expediție</target>
</trans-unit>
@@ -1231,23 +1231,23 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="needs-translation">Advanced search</target>
<target state="translated">Căutare avansată</target>
</trans-unit>
<trans-unit id="2649431021108393503" datatype="html">
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="needs-translation">More like</target>
<target state="translated">Asemănătoare</target>
</trans-unit>
<trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html">
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Filtrează etichete</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Filtrează corespondenți</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Filtrează tipuri de documente</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Resetare filtre</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Scor:</target>
</trans-unit>
@@ -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="linenumber">43</context>
</context-group>
<target state="needs-translation">Created: <x id="INTERPOLATION" equiv-text="{{ document.created | customDate}}"/></target>
<target state="translated">S-a creat: <x id="INTERPOLATION" equiv-text="{{ document.created | customDate}}"/></target>
</trans-unit>
<trans-unit id="0f5d856cb63c69fde44fbfc653ec0655f9040865" datatype="html">
<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="linenumber">44</context>
</context-group>
<target state="needs-translation">Added: <x id="INTERPOLATION" equiv-text="{{ document.added | customDate}}"/></target>
<target state="translated">S-a adăugat: <x id="INTERPOLATION" equiv-text="{{ document.added | customDate}}"/></target>
</trans-unit>
<trans-unit id="a205126adef6251fc63305f1a6228d07bc2795a8" datatype="html">
<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="linenumber">45</context>
</context-group>
<target state="needs-translation">Modified: <x id="INTERPOLATION" equiv-text="{{ document.modified | customDate}}"/></target>
<target state="translated">S-a modificat: <x id="INTERPOLATION" equiv-text="{{ document.modified | customDate}}"/></target>
</trans-unit>
<trans-unit id="7985804062689412812" datatype="html">
<source>Error executing bulk operation: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Sugestii:</target>
</trans-unit>
@@ -1855,7 +1855,7 @@
<context context-type="sourcefile">src/app/components/document-asn/document-asn.component.html</context>
<context context-type="linenumber">1</context>
</context-group>
<target state="needs-translation">Searching document with asn <x id="INTERPOLATION" equiv-text="{{asn}}"/></target>
<target state="translated">Se caută documentul cu asn <x id="INTERPOLATION" equiv-text="{{asn}}"/></target>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Spaniolă</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="translated">Poloneză</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="translated">Suedeză</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="translated">Подтвердите удаление</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Вы действительно хотите удалить документ "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">Файлы из этого документа будут удалены незамедлительно. Это операцию нельзя отменить.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">Удалить документ</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="translated">Ошибка удаления документа: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">Заголовок</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="translated">Название и содержимое</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="translated">АН</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="translated">Расширенный поиск</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="translated">Больше похожих</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Фильтр тегов</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="translated">Фильтр корреспондентов</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="translated">Фильтр типа документов</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">Сбросить фильтры</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="translated">Оценка:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="translated">Рекомендации:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="translated">Испанский</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="needs-translation">Polish</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="needs-translation">Swedish</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">ISO 8601</target>
</trans-unit>
File diff suppressed because it is too large. Load diff
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target>crwdns2890:0crwdne2890:0</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target>crwdns2892:0crwdne2892:0</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target>crwdns2894:0crwdne2894:0</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target>crwdns2896:0crwdne2896:0</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target>crwdns2898:0crwdne2898:0</target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target>crwdns3134:0crwdne3134:0</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target>crwdns3136:0crwdne3136:0</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target>crwdns3354:0crwdne3354:0</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target>crwdns3434:0crwdne3434:0</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target>crwdns3436:0crwdne3436:0</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target>crwdns3152:0crwdne3152:0</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target>crwdns3154:0crwdne3154:0</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target>crwdns3156:0crwdne3156:0</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target>crwdns3158:0crwdne3158:0</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target>crwdns3186:0crwdne3186:0</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target>crwdns3240:0crwdne3240:0</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target>crwdns3418:0crwdne3418:0</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target>crwdns3442:0crwdne3442:0</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target>crwdns3446:0crwdne3446:0</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target>crwdns3322:0crwdne3322:0</target>
</trans-unit>
+33 -17
View File
@@ -214,7 +214,7 @@
<source>Confirm delete</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">206</context>
</context-group>
<target state="needs-translation">Confirm delete</target>
</trans-unit>
@@ -222,7 +222,7 @@
<source>Do you really want to delete document &quot;<x id="PH" equiv-text="this.document.title"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">205</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="needs-translation">Do you really want to delete document "<x id="PH" equiv-text="this.document.title"/>"?</target>
</trans-unit>
@@ -230,7 +230,7 @@
<source>The files for this document will be deleted permanently. This operation cannot be undone.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="needs-translation">The files for this document will be deleted permanently. This operation cannot be undone.</target>
</trans-unit>
@@ -238,7 +238,7 @@
<source>Delete document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="needs-translation">Delete document</target>
</trans-unit>
@@ -246,7 +246,7 @@
<source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">217</context>
</context-group>
<target state="needs-translation">Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></target>
</trans-unit>
@@ -1207,7 +1207,7 @@
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="needs-translation">Title</target>
</trans-unit>
@@ -1215,7 +1215,7 @@
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">89</context>
</context-group>
<target state="needs-translation">Title &amp; content</target>
</trans-unit>
@@ -1223,7 +1223,7 @@
<source>ASN</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">90</context>
</context-group>
<target state="needs-translation">ASN</target>
</trans-unit>
@@ -1231,7 +1231,7 @@
<source>Advanced search</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">91</context>
</context-group>
<target state="needs-translation">Advanced search</target>
</trans-unit>
@@ -1239,7 +1239,7 @@
<source>More like</source>
<context-group purpose="location">
<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">94</context>
</context-group>
<target state="needs-translation">More like</target>
</trans-unit>
@@ -1247,7 +1247,7 @@
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="needs-translation">Filter tags</target>
</trans-unit>
@@ -1255,7 +1255,7 @@
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">28</context>
<context context-type="linenumber">27</context>
</context-group>
<target state="needs-translation">Filter correspondents</target>
</trans-unit>
@@ -1263,7 +1263,7 @@
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">34</context>
</context-group>
<target state="needs-translation">Filter document types</target>
</trans-unit>
@@ -1271,7 +1271,7 @@
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="needs-translation">Reset filters</target>
</trans-unit>
@@ -1376,7 +1376,7 @@
<source>Score:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">87</context>
</context-group>
<target state="needs-translation">Score:</target>
</trans-unit>
@@ -1611,7 +1611,7 @@
<source>Suggestions:</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="needs-translation">Suggestions:</target>
</trans-unit>
@@ -1969,11 +1969,27 @@
</context-group>
<target state="needs-translation">Spanish</target>
</trans-unit>
<trans-unit id="792060551707690640" datatype="html">
<source>Polish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">101</context>
</context-group>
<target state="needs-translation">Polish</target>
</trans-unit>
<trans-unit id="499386805970351976" datatype="html">
<source>Swedish</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">102</context>
</context-group>
<target state="needs-translation">Swedish</target>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="needs-translation">ISO 8601</target>
</trans-unit>
+10 -1
View File
@@ -4,4 +4,13 @@ $primaryFaded: #d1ddd2;
$theme-colors: (
"primary": $primary
);
);
.bg-body {
background-color: #fff;
}
.alert-heading {
font-size: 80%;
font-weight: bold;
}
+25
View File
@@ -37,6 +37,10 @@ $border-color-dark-mode: #47494f;
}
}
.bg-body {
background-color: $bg-dark-mode !important;
}
.text-light {
color: $text-color-dark-mode !important;
}
@@ -90,6 +94,23 @@ $border-color-dark-mode: #47494f;
color: $text-color-dark-mode !important;
}
}
.nav-link.bg-light {
border-bottom-color: $border-color-dark-mode !important;
&:not(.active) {
background-color: $bg-dark-mode !important;
&:hover {
background-color: $bg-dark-mode !important;
}
}
&.active {
background-color: $bg-light-dark-mode !important;
border-bottom-color: $bg-light-dark-mode !important;
}
}
}
.dropdown-menu {
@@ -420,6 +441,10 @@ $border-color-dark-mode: #47494f;
.ngb-dp-month {
background-color: $bg-light-dark-mode;
}
app-split-merge .separator {
filter: invert(1);
}
}
body.color-scheme-dark {
+6
View File
@@ -74,6 +74,7 @@ class Consumer(LoggingMixin):
self.path = None
self.filename = None
self.override_title = None
self.override_date = None
self.override_correspondent_id = None
self.override_tag_ids = None
self.override_document_type_id = None
@@ -167,6 +168,7 @@ class Consumer(LoggingMixin):
path,
override_filename=None,
override_title=None,
override_date=None,
override_correspondent_id=None,
override_document_type_id=None,
override_tag_ids=None,
@@ -178,6 +180,7 @@ class Consumer(LoggingMixin):
self.path = path
self.filename = override_filename or os.path.basename(path)
self.override_title = override_title
self.override_date = override_date
self.override_correspondent_id = override_correspondent_id
self.override_document_type_id = override_document_type_id
self.override_tag_ids = override_tag_ids
@@ -399,6 +402,9 @@ class Consumer(LoggingMixin):
for tag_id in self.override_tag_ids:
document.tags.add(Tag.objects.get(pk=tag_id))
if self.override_date:
document.created = self.override_date
def _write(self, storage_type, source, target):
with open(source, "rb") as read_file:
with open(target, "wb") as write_file:
@@ -1,5 +1,6 @@
import logging
import tqdm
from django.core.management.base import BaseCommand
from documents.classifier import load_classifier
@@ -67,9 +68,7 @@ class Command(BaseCommand):
classifier = load_classifier()
for document in documents:
logger.info(
f"Processing document {document.title}")
for document in tqdm.tqdm(documents):
if options['correspondent']:
set_correspondent(
@@ -0,0 +1,42 @@
import logging
import os
from django.contrib.auth.models import User
from django.core.management.base import BaseCommand, CommandError
logger = logging.getLogger("paperless.management.superuser")
class Command(BaseCommand):
help = """
Creates a Django superuser based on env variables.
""".replace(" ", "")
def handle(self, *args, **options):
username = os.getenv('PAPERLESS_ADMIN_USER')
if not username:
return
mail = os.getenv('PAPERLESS_ADMIN_MAIL', 'root@localhost')
password = os.getenv('PAPERLESS_ADMIN_PASSWORD')
# Check if user exists already, leave as is if it does
if User.objects.filter(username=username).exists():
user: User = User.objects.get_by_natural_key(username)
user.set_password(password)
user.save()
self.stdout.write(f"Changed password of user {username}.")
elif password:
# Create superuser based on env variables
User.objects.create_superuser(username, mail, password)
self.stdout.write(
f'Created superuser "{username}" with provided password.')
else:
self.stdout.write(
f'Did not create superuser "{username}".')
self.stdout.write(
'Make sure you specified "PAPERLESS_ADMIN_PASSWORD" in your '
'"docker-compose.env" file.')
+201
View File
@@ -0,0 +1,201 @@
import logging
import os
import re
import tempfile
from django_q.tasks import async_task
from documents import tasks
from documents.consumer import ConsumerError
from documents.models import Document
from pikepdf import Pdf
logger = logging.getLogger("paperless.merge")
class MergeError(Exception):
pass
class PdfCache:
def __init__(self):
self.cache = dict()
def open_from_document(self, document: Document):
if document.pk in self.cache:
return self.cache[document.pk]
if document.mime_type == 'application/pdf':
filename = document.source_path
elif document.has_archive_version:
filename = document.archive_path
else:
raise MergeError(f"Document {document.pk} does not have a PDF.")
if not os.path.exists(filename):
raise MergeError(f"{filename} does not exist.")
pdf = Pdf.open(filename)
self.cache[document.pk] = pdf
return pdf
def close_all(self):
for pk in self.cache:
self.cache[pk].close()
self.cache.clear()
def parse_page_list(page_list: str):
if not page_list:
return []
result = []
re_simple = re.compile(r"^\d+$")
re_range = re.compile(r"^(\d+)-(\d+)$")
for page_list_part in page_list.split(","):
match_simple = re_simple.match(page_list_part)
match_range = re_range.match(page_list_part)
if match_simple:
result.append(int(page_list_part))
elif match_range:
first = int(match_range.group(1))
last = int(match_range.group(2))
if first <= last:
result.extend(range(first, last+1))
else:
result.extend(reversed(range(last, first+1)))
else:
raise MergeError(f"Invalid page range: {page_list}")
return result
def consume_many_files(kwargs_list, delete_document_ids=None):
new_document_ids = []
try:
for kwargs in kwargs_list:
new_document_ids.append(tasks.consume_file(**kwargs))
except ConsumerError:
# in case something goes wrong, delete all previously created documents
for document_id in new_document_ids:
Document.objects.get(id=document_id).delete()
raise
else:
# If everything goes well, optionally delete source documents
if delete_document_ids:
for document_id in delete_document_ids:
Document.objects.get(id=document_id).delete()
def copy_pdf_metadata(source: Pdf, target: Pdf):
with source.open_metadata() as source_meta:
with target.open_metadata() as target_meta:
for k in source_meta:
try:
target_meta[k] = source_meta[k]
except TypeError:
# TODO: https://github.com/pikepdf/pikepdf/issues/188
logger.warning(f"Could not copy metadata {k} while "
f"merging documents", exc_info=True)
def copy_document_metadata(document: Document, consume_task):
if document.correspondent:
consume_task["override_correspondent_id"] = document.correspondent.id
if document.document_type:
consume_task["override_document_type_id"] = document.document_type.id
if document.tags.count() > 0:
consume_task["override_tag_ids"] = [
tag.id for tag in document.tags.all()
]
consume_task['override_date'] = document.created
def execute_split_merge_plan(plan,
tempdir: str,
metadata: str = "redo",
delete_source: bool = False,
preview: bool = True):
consume_tasks = []
cache = PdfCache()
source_documents = set()
try:
for target_doc_spec in plan:
# create a new document from documents in target_doc_spec
target_pdf: Pdf = None
try:
target_pdf = Pdf.new()
target_pdf_filename = tempfile.NamedTemporaryFile(
prefix="merge_", suffix="_pdf", dir=tempdir).name
version = target_pdf.pdf_version
consume_task = {"path": target_pdf_filename}
for (i, source_doc_spec) in enumerate(target_doc_spec):
source_document_id = source_doc_spec['document']
source_documents.add(source_document_id)
if 'pages' in source_doc_spec:
pages = parse_page_list(source_doc_spec['pages'])
else:
pages = None
try:
source_document: Document = Document.objects.get(
id=source_document_id)
except Document.DoesNotExist:
raise MergeError(
f"Document {source_document_id} does not exist.")
source_pdf: Pdf = cache.open_from_document(source_document)
version = max(version, source_pdf.pdf_version)
if i == 0:
# first source document for this target
consume_task["override_title"] = source_document.title
copy_pdf_metadata(source_pdf, target_pdf)
if metadata == "copy_first":
copy_document_metadata(
source_document, consume_task)
if pages is not None:
for page in pages:
if page > len(source_pdf.pages) or page < 1:
raise MergeError(
f"Page {page} is out of range.")
target_pdf.pages.append(source_pdf.pages[page - 1])
else:
target_pdf.pages.extend(source_pdf.pages)
target_pdf.remove_unreferenced_resources()
target_pdf.save(target_pdf_filename, min_version=version)
target_pdf.close()
consume_tasks.append(consume_task)
finally:
if target_pdf is not None:
target_pdf.close()
finally:
cache.close_all()
if not preview:
async_task(
"documents.merge.consume_many_files",
kwargs_list=consume_tasks,
delete_document_ids=list(source_documents) if delete_source else None # NOQA: E501
)
return [t["path"] for t in consume_tasks]
+91
View File
@@ -494,3 +494,94 @@ class BulkDownloadSerializer(DocumentListSerializer):
"bzip2": zipfile.ZIP_BZIP2,
"lzma": zipfile.ZIP_LZMA
}[compression]
class DocumentSplitMergePlanSerializer(serializers.Serializer):
"""
A split/merge plan describes how a set of documents should be transformed
into a new set of documents.
split_merge_plan is a list. The split and merge tool will create a new
document for each element in that list. Each item in split_merge_plan
is by itself a list that lists document IDs and pages to take from this
document.
Example:
split_merge_plan = [
[
{
"document": 1,
"pages": "1-3"
},
{
"document": 2,
},
{
"document": 1,
"pages": "4"
}
],
[
{
"document": 1,
"pages": "6,5"
}
]
]
This will split document 1 into two documents. The first document contains
pages 1 to 4, the second document contains pages 5 and 6 in reverse.
Additionally, all pages from document 2 are inserted into the first
document between pages 3 and 4.
If delete_source is true, the split and merge tool will delete the source
files in the plan after all resulting documents have been added
successfully to paperless.
metadata selects how to assign new metadata to the created documents.
With 'redo', paperless will run the matching algorithms on the resulting
document again. With 'copy_first', each document created by the merge plan
will keep the metadata of the first document used to create that new
document.
If preview is true, the split and merge tool will execute the split and
merge plan without modifying any data in paperless. The previews are
temporarily made available for download. If preview is true,
delete_source and metadata is ignored.
"""
split_merge_plan = serializers.ListField(
required=True,
min_length=1,
child=serializers.ListField(
required=True,
min_length=1,
child=serializers.DictField()
)
)
delete_source = serializers.BooleanField(default=False)
metadata = serializers.ChoiceField(
choices=("redo", "copy_first"),
default="copy_first"
)
preview = serializers.BooleanField(default=True)
def validate_split_merge_plan(self, split_merge_plan):
for target_doc in split_merge_plan:
for source_doc in target_doc:
if "document" not in source_doc:
raise serializers.ValidationError(
'"document" is required'
)
try:
Document.objects.get(id=source_doc["document"])
except Document.DoesNotExist:
raise serializers.ValidationError(
f"document {source_doc['document']} does not exist"
)
return split_merge_plan
+2 -2
View File
@@ -46,13 +46,13 @@ def set_correspondent(sender,
selected = None
if potential_count > 1:
if use_first:
logger.info(
logger.debug(
f"Detected {potential_count} potential correspondents, "
f"so we've opted for {selected}",
extra={'group': logging_group}
)
else:
logger.info(
logger.debug(
f"Detected {potential_count} potential correspondents, "
f"not assigning any correspondent",
extra={'group': logging_group}
+55
View File
@@ -42,3 +42,58 @@ body {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
@media (prefers-color-scheme: dark) {
/*
From theme_dark.scss
$primary-dark-mode: #45973a;
$danger-dark-mode: #b71631;
$bg-dark-mode: #161618;
$bg-dark-mode-accent: #21262d;
$bg-light-dark-mode: #1c1c1f;
$text-color-dark-mode: #abb2bf;
$border-color-dark-mode: #47494f;
*/
body {
background-color: #161618 !important;
color: #abb2bf;
}
svg.logo .text {
fill: #abb2bf!important;
}
.form-control:not(.is-invalid):not(.btn) {
border-color: #47494f;
}
.form-control:not(.btn) {
background-color: #161618;
color: #abb2bf;
}
.form-control:not(.btn)::placeholder {
color: #abb2bf;
}
.form-control:not(.btn):focus {
background-color: #1c1c1f !important;
color: #8e97a9 !important;
}
.btn-primary {
color: #fff;
background-color: #17541f;
border-color: #17541f;
}
.btn-primary:hover, .btn-primary:focus {
background-color: #0f3614;
border-color: #0c2c10;
}
.btn-primary:not(:disabled):not(.disabled):active {
background-color: #0c2c10;
border-color: #09220d;
}
}
+3 -3
View File
@@ -66,6 +66,7 @@ def train_classifier():
def consume_file(path,
override_filename=None,
override_title=None,
override_date=None,
override_correspondent_id=None,
override_document_type_id=None,
override_tag_ids=None,
@@ -75,6 +76,7 @@ def consume_file(path,
path,
override_filename=override_filename,
override_title=override_title,
override_date=override_date,
override_correspondent_id=override_correspondent_id,
override_document_type_id=override_document_type_id,
override_tag_ids=override_tag_ids,
@@ -82,9 +84,7 @@ def consume_file(path,
)
if document:
return "Success. New document id {} created".format(
document.pk
)
return document.pk
else:
raise ConsumerError("Unknown error: Returned document was null, but "
"no error message was given.")
+1
View File
@@ -12,6 +12,7 @@
<meta name="username" content="{{username}}">
<meta name="full_name" content="{{full_name}}">
<meta name="cookie_prefix" content="{{cookie_prefix}}">
<meta name="robots" content="noindex,nofollow">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="manifest" href="{% static webmanifest %}">
<link rel="stylesheet" href="{% static styles_css %}">
@@ -10,6 +10,7 @@
<meta name="description" content="">
<meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
<meta name="generator" content="Jekyll v4.1.1">
<meta name="robots" content="noindex,nofollow">
<title>{% translate "Paperless-ng signed out" %}</title>
<!-- Bootstrap core CSS -->
@@ -37,7 +38,10 @@
<body class="text-center">
<div class="form-signin">
<img class="mb-4" src="{% static 'frontend/en-US/assets/logo.svg' %}" alt="" width="300">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2897.4 896.64" width="300" class="logo mb-4">
<path class="leaf" d="M730.71,0C616.3,266.24,66.21,299.25,242.24,728.31c2.2,5.5-40.71,63.81-69.31,112.22-6.6-24.21-14.3-50.61-13.2-52.81C302.75,618.29,57.41,522.58,44.21,384-17.4,494-39.4,686.5,146.53,797.62c1.1,0,9.9,41.81,14.3,62.71-4.4,8.8-8.8,17.6-11,24.2-4.4,11,28.6,9.91,28.6,12.11,3.3-1.1,81.41-138.63,83.61-139.73C704.31,655.7,782.42,257.44,730.71,0ZM105.82,544.58C145.43,580.89,211.44,692,155.33,756.91,168.53,727.21,172.93,660.1,105.82,544.58ZM269.74,670C200.43,506.08,404,325.65,505.18,280.54,298.35,465.37,263.14,602.89,269.74,670Z" transform="translate(0)" style="fill:#17541f"/>
<path class="text" style="fill:#000" d="M1169.27,231.44q.7,17.06.71,38.73t-.71,38a112,112,0,0,1-6.76,38A100.16,100.16,0,0,1,1142.25,380a93.87,93.87,0,0,1-33.76,23.46q-20.25,8.54-46.56,8.53h-36.25V597.5q0,9.94,2.85,14.57c1.89,3.08,3.79,4.86,5.68,5.33a10.54,10.54,0,0,0,9.24,0v18.48h-86V617.4q5.68,2.13,8.53,0,3.56-.71,7.1-5.33t3.56-14.57V166q0-10.66-3.56-15.28t-7.1-6q-2.85-1.42-8.53,0V127.66h104.48q26.31,0,46.56,8.53a93.75,93.75,0,0,1,33.76,23.46,101,101,0,0,1,20.26,33.4A111.05,111.05,0,0,1,1169.27,231.44ZM1118.8,215.8q0-18.48-6-32t-14.22-21.32a74.68,74.68,0,0,0-17.06-12.44q-8.88-4.62-15.28-4.62h-40.52V392.79h40.52q6.39,0,15.28-3.56t17.06-12.44a86,86,0,0,0,14.22-21.67q6-12.8,6-32Zm337.63,389.52a27.35,27.35,0,0,1-2.85,11.72,40.58,40.58,0,0,1-8.17,11.38,54.8,54.8,0,0,1-13.5,9.59,40.07,40.07,0,0,1-18.84,4.27,60,60,0,0,1-30.57-7.82q-13.5-7.82-18.48-20.61a56.12,56.12,0,0,1-6.39-16.35q-9.24,19.18-28.08,32a72.42,72.42,0,0,1-41.58,12.8q-28.44,0-49.76-20.61-12.07-10.67-19.9-27.73t-9.24-39.09q-.71-2.13-.71-8.53v-.71a124.43,124.43,0,0,1,4.26-25.23,113.22,113.22,0,0,1,11-26.3,149.46,149.46,0,0,1,17.77-24.88,128.6,128.6,0,0,1,22.39-20.26,17.39,17.39,0,0,0,4.62-3.2,28.53,28.53,0,0,1,5.33-3.91l2.13-1.06,2.14-1.07q12.8-7.81,22.39-14.22t17.41-12.08a97.25,97.25,0,0,0,8.53-6.4c2.84-2.37,5.93-4.73,9.24-7.1a79.43,79.43,0,0,0,12.09-10,36.51,36.51,0,0,0,8.53-13.5q4.26-7.11,4.26-17.06a67.74,67.74,0,0,0-2.13-17.77,49.09,49.09,0,0,0-14.57-27q-11.73-11.37-26-14.93a38.26,38.26,0,0,0-12.08-2.13q-19.9,0-34.12,7.11-9.24,4.26-13.51,9.59t-4.62,10a10.73,10.73,0,0,0,1.78,7.46,12.91,12.91,0,0,0,5.69,4.26,6,6,0,0,0,1.78.71,6.28,6.28,0,0,1,1.77.72,32.21,32.21,0,0,1,15.28,12.43,34,34,0,0,1,6,19.55,32.78,32.78,0,0,1-32.7,32.7,33.53,33.53,0,0,1-24.17-9.6,30.94,30.94,0,0,1-10-23.1,106.83,106.83,0,0,1,3.2-25.23,84.65,84.65,0,0,1,9.6-23.81q13.5-19.91,32.34-28.79a96.24,96.24,0,0,1,41.58-8.89,93.82,93.82,0,0,1,33.76,6.4,96.18,96.18,0,0,1,29.86,18.13,103.38,103.38,0,0,1,22,28.07q8.88,16.35,8.88,37.68v209q0,12.79.36,16.7t.36,5.34h0q0,9.24,5.68,14.92a18.45,18.45,0,0,0,13.51,5.69q9.24,0,14.92-5.33a20.62,20.62,0,0,0,6.4-13.86Zm-111.6-17.77a52.58,52.58,0,0,0,6.76-21.33q1.07-11.37,1.06-21.32V413.4a63.92,63.92,0,0,1-6,5.33,74,74,0,0,0-6.75,6q-20.62,14.93-35.19,27.37a164.06,164.06,0,0,0-24.52,25.59,113,113,0,0,0-15.64,28.07,121,121,0,0,0-7.11,34.12v10.67q.72,27,14.58,42.29t39.44,15.28a38.56,38.56,0,0,0,20.62-5.69q9.24-6.39,12.79-14.92Zm244.52-304.23q40.51.72,64.68,24.53t24.17,75.7V542.77q0,51.88-24.17,75.34T1589.35,643h-2.13a80.27,80.27,0,0,1-22-2.84h-.71a.63.63,0,0,1-.71-.71,91.74,91.74,0,0,1-28.43-15.64l-6.76-6.76-5.33-7.46v118q0,10,2.85,14.58c1.89,3.08,3.79,5.09,5.68,6a10.54,10.54,0,0,0,9.24,0V766h-86V748.19q5.68,2.13,8.53,0,3.56-1.43,6.75-6t3.2-14.58V326.68q0-9.94-3.2-14.57t-6.75-6q-2.85-1.43-8.53,0V289h68.23v27.72a68.68,68.68,0,0,1,12.09-14.21,75.62,75.62,0,0,1,28.43-15.64.63.63,0,0,1,.71-.71h.71a90.55,90.55,0,0,1,22-2.85Zm35.54,84.59v-.71q-.72-36.26-8.89-51.18t-26.65-16.35a63.12,63.12,0,0,0-24.17,3.2,48,48,0,0,0-19.9,13.15q-8.54,9.24-14.22,24.88t-7.82,37V548.45q2.13,22,7.82,37.32t14.22,24.17a53.23,53.23,0,0,0,19.9,13.15,58.92,58.92,0,0,0,24.17,3.55q18.48-1.42,26.65-16.35t8.89-51.18V367.91Zm179.83-84.59a105.36,105.36,0,0,1,33.41,5.69,86.38,86.38,0,0,1,30.56,17.77,88.06,88.06,0,0,1,21.68,30.57q8.18,18.48,8.18,44.06v90.28H1757.1V544.9q0,44.07,15.28,62.9t38,18.13a113.94,113.94,0,0,0,26.65-4.62,54.83,54.83,0,0,0,22.75-13.15q9.59-9.24,16-26.3t6.4-44.78h16.35V547a153.56,153.56,0,0,1-4.27,36.61A72,72,0,0,1,1852,634.1q-16.71,7.47-40.87,8.18a102.25,102.25,0,0,1-34.83-6.4,96,96,0,0,1-32-19.19,108.91,108.91,0,0,1-23.45-30.21q-9.24-17.41-9.25-39.45v-16.7s-.11-9.12-.35-27.37-.36-29.5-.36-33.76-.11-16-.35-35.19-.36-29.49-.36-30.92v-21q0-25.59,8.89-44.43t22-30.56A90.72,90.72,0,0,1,1771,289.37a98.55,98.55,0,0,1,33.76-6.05Zm46.2,169.89V397.05q0-27-3.55-45.13t-9.6-29.15q-6-11-14.57-15.28a42.36,42.36,0,0,0-19.19-4.26q-22.76,0-34.48,19.9t-11.72,73.92v56.16Zm279.35-113.73a42.31,42.31,0,0,0,.71,5.68,17.92,17.92,0,0,1,0,7.11q-.72,14.93-10.31,24.52a33,33,0,0,1-46.91-.35,33.52,33.52,0,0,1-9.6-24.17q0-17.76,13.51-27a8.33,8.33,0,0,0,1.77-1.06l1.07-1.07a16.22,16.22,0,0,0,6.4-10.31q1.41-6.75-8.53-11.73a26.26,26.26,0,0,0-12.8-3.55q-21.32-1.43-37.67,12.8t-22,49.75V597.5q0,9.94,2.84,14.57t5.69,5.33a10.54,10.54,0,0,0,9.24,0v18.48h-86V617.4q5.68,2.13,8.53,0,3.55-.71,7.11-5.33t3.55-14.57V326.68q0-9.94-3.55-14.57t-7.11-6q-2.85-1.43-8.53,0V288.3h68.24v29.14q5-7.81,9.95-14.57a48.44,48.44,0,0,1,11.72-11.37,59.79,59.79,0,0,1,15.64-7.46q8.89-2.85,22.39-2.85,20.61,0,38.39,14.93t26.3,43.36Zm95.95,258q0,9.94,3.2,14.57c2.13,3.08,4.15,4.86,6,5.33q3.55,2.13,9.24,0v18.48h-86V617.4q5.68,2.13,10,0,2.13-.71,5.69-5.33t3.55-14.57V166.75q0-10.65-3.55-15.28a28.82,28.82,0,0,0-5.69-6q-4.26-2.13-10,0V128.37h67.52V597.5Zm154.25-314.18a105.25,105.25,0,0,1,33.4,5.69,86.33,86.33,0,0,1,30.57,17.77,88.19,88.19,0,0,1,21.68,30.57q8.18,18.48,8.17,44.06v90.28H2332.84V544.9q0,44.07,15.29,62.9t38,18.13a113.93,113.93,0,Line truncated
</svg>
<p>{% translate "You have been successfully logged out. Bye!" %}</p>
<a href="/">{% translate "Sign in again" %}</a>
</div>
@@ -10,6 +10,8 @@
<meta name="description" content="">
<meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
<meta name="generator" content="Jekyll v4.1.1">
<meta name="robots" content="noindex,nofollow">
<title>{% translate "Paperless-ng sign in" %}</title>
<!-- Bootstrap core CSS -->
@@ -38,7 +40,10 @@
<body class="text-center">
<form class="form-signin" method="post">
{% csrf_token %}
<img class="mb-4" src="{% static 'frontend/en-US/assets/logo.svg' %}" alt="" width="300">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2897.4 896.64" width="300" class="logo mb-4">
<path class="leaf" d="M730.71,0C616.3,266.24,66.21,299.25,242.24,728.31c2.2,5.5-40.71,63.81-69.31,112.22-6.6-24.21-14.3-50.61-13.2-52.81C302.75,618.29,57.41,522.58,44.21,384-17.4,494-39.4,686.5,146.53,797.62c1.1,0,9.9,41.81,14.3,62.71-4.4,8.8-8.8,17.6-11,24.2-4.4,11,28.6,9.91,28.6,12.11,3.3-1.1,81.41-138.63,83.61-139.73C704.31,655.7,782.42,257.44,730.71,0ZM105.82,544.58C145.43,580.89,211.44,692,155.33,756.91,168.53,727.21,172.93,660.1,105.82,544.58ZM269.74,670C200.43,506.08,404,325.65,505.18,280.54,298.35,465.37,263.14,602.89,269.74,670Z" transform="translate(0)" style="fill:#17541f"/>
<path class="text" style="fill:#000" d="M1169.27,231.44q.7,17.06.71,38.73t-.71,38a112,112,0,0,1-6.76,38A100.16,100.16,0,0,1,1142.25,380a93.87,93.87,0,0,1-33.76,23.46q-20.25,8.54-46.56,8.53h-36.25V597.5q0,9.94,2.85,14.57c1.89,3.08,3.79,4.86,5.68,5.33a10.54,10.54,0,0,0,9.24,0v18.48h-86V617.4q5.68,2.13,8.53,0,3.56-.71,7.1-5.33t3.56-14.57V166q0-10.66-3.56-15.28t-7.1-6q-2.85-1.42-8.53,0V127.66h104.48q26.31,0,46.56,8.53a93.75,93.75,0,0,1,33.76,23.46,101,101,0,0,1,20.26,33.4A111.05,111.05,0,0,1,1169.27,231.44ZM1118.8,215.8q0-18.48-6-32t-14.22-21.32a74.68,74.68,0,0,0-17.06-12.44q-8.88-4.62-15.28-4.62h-40.52V392.79h40.52q6.39,0,15.28-3.56t17.06-12.44a86,86,0,0,0,14.22-21.67q6-12.8,6-32Zm337.63,389.52a27.35,27.35,0,0,1-2.85,11.72,40.58,40.58,0,0,1-8.17,11.38,54.8,54.8,0,0,1-13.5,9.59,40.07,40.07,0,0,1-18.84,4.27,60,60,0,0,1-30.57-7.82q-13.5-7.82-18.48-20.61a56.12,56.12,0,0,1-6.39-16.35q-9.24,19.18-28.08,32a72.42,72.42,0,0,1-41.58,12.8q-28.44,0-49.76-20.61-12.07-10.67-19.9-27.73t-9.24-39.09q-.71-2.13-.71-8.53v-.71a124.43,124.43,0,0,1,4.26-25.23,113.22,113.22,0,0,1,11-26.3,149.46,149.46,0,0,1,17.77-24.88,128.6,128.6,0,0,1,22.39-20.26,17.39,17.39,0,0,0,4.62-3.2,28.53,28.53,0,0,1,5.33-3.91l2.13-1.06,2.14-1.07q12.8-7.81,22.39-14.22t17.41-12.08a97.25,97.25,0,0,0,8.53-6.4c2.84-2.37,5.93-4.73,9.24-7.1a79.43,79.43,0,0,0,12.09-10,36.51,36.51,0,0,0,8.53-13.5q4.26-7.11,4.26-17.06a67.74,67.74,0,0,0-2.13-17.77,49.09,49.09,0,0,0-14.57-27q-11.73-11.37-26-14.93a38.26,38.26,0,0,0-12.08-2.13q-19.9,0-34.12,7.11-9.24,4.26-13.51,9.59t-4.62,10a10.73,10.73,0,0,0,1.78,7.46,12.91,12.91,0,0,0,5.69,4.26,6,6,0,0,0,1.78.71,6.28,6.28,0,0,1,1.77.72,32.21,32.21,0,0,1,15.28,12.43,34,34,0,0,1,6,19.55,32.78,32.78,0,0,1-32.7,32.7,33.53,33.53,0,0,1-24.17-9.6,30.94,30.94,0,0,1-10-23.1,106.83,106.83,0,0,1,3.2-25.23,84.65,84.65,0,0,1,9.6-23.81q13.5-19.91,32.34-28.79a96.24,96.24,0,0,1,41.58-8.89,93.82,93.82,0,0,1,33.76,6.4,96.18,96.18,0,0,1,29.86,18.13,103.38,103.38,0,0,1,22,28.07q8.88,16.35,8.88,37.68v209q0,12.79.36,16.7t.36,5.34h0q0,9.24,5.68,14.92a18.45,18.45,0,0,0,13.51,5.69q9.24,0,14.92-5.33a20.62,20.62,0,0,0,6.4-13.86Zm-111.6-17.77a52.58,52.58,0,0,0,6.76-21.33q1.07-11.37,1.06-21.32V413.4a63.92,63.92,0,0,1-6,5.33,74,74,0,0,0-6.75,6q-20.62,14.93-35.19,27.37a164.06,164.06,0,0,0-24.52,25.59,113,113,0,0,0-15.64,28.07,121,121,0,0,0-7.11,34.12v10.67q.72,27,14.58,42.29t39.44,15.28a38.56,38.56,0,0,0,20.62-5.69q9.24-6.39,12.79-14.92Zm244.52-304.23q40.51.72,64.68,24.53t24.17,75.7V542.77q0,51.88-24.17,75.34T1589.35,643h-2.13a80.27,80.27,0,0,1-22-2.84h-.71a.63.63,0,0,1-.71-.71,91.74,91.74,0,0,1-28.43-15.64l-6.76-6.76-5.33-7.46v118q0,10,2.85,14.58c1.89,3.08,3.79,5.09,5.68,6a10.54,10.54,0,0,0,9.24,0V766h-86V748.19q5.68,2.13,8.53,0,3.56-1.43,6.75-6t3.2-14.58V326.68q0-9.94-3.2-14.57t-6.75-6q-2.85-1.43-8.53,0V289h68.23v27.72a68.68,68.68,0,0,1,12.09-14.21,75.62,75.62,0,0,1,28.43-15.64.63.63,0,0,1,.71-.71h.71a90.55,90.55,0,0,1,22-2.85Zm35.54,84.59v-.71q-.72-36.26-8.89-51.18t-26.65-16.35a63.12,63.12,0,0,0-24.17,3.2,48,48,0,0,0-19.9,13.15q-8.54,9.24-14.22,24.88t-7.82,37V548.45q2.13,22,7.82,37.32t14.22,24.17a53.23,53.23,0,0,0,19.9,13.15,58.92,58.92,0,0,0,24.17,3.55q18.48-1.42,26.65-16.35t8.89-51.18V367.91Zm179.83-84.59a105.36,105.36,0,0,1,33.41,5.69,86.38,86.38,0,0,1,30.56,17.77,88.06,88.06,0,0,1,21.68,30.57q8.18,18.48,8.18,44.06v90.28H1757.1V544.9q0,44.07,15.28,62.9t38,18.13a113.94,113.94,0,0,0,26.65-4.62,54.83,54.83,0,0,0,22.75-13.15q9.59-9.24,16-26.3t6.4-44.78h16.35V547a153.56,153.56,0,0,1-4.27,36.61A72,72,0,0,1,1852,634.1q-16.71,7.47-40.87,8.18a102.25,102.25,0,0,1-34.83-6.4,96,96,0,0,1-32-19.19,108.91,108.91,0,0,1-23.45-30.21q-9.24-17.41-9.25-39.45v-16.7s-.11-9.12-.35-27.37-.36-29.5-.36-33.76-.11-16-.35-35.19-.36-29.49-.36-30.92v-21q0-25.59,8.89-44.43t22-30.56A90.72,90.72,0,0,1,1771,289.37a98.55,98.55,0,0,1,33.76-6.05Zm46.2,169.89V397.05q0-27-3.55-45.13t-9.6-29.15q-6-11-14.57-15.28a42.36,42.36,0,0,0-19.19-4.26q-22.76,0-34.48,19.9t-11.72,73.92v56.16Zm279.35-113.73a42.31,42.31,0,0,0,.71,5.68,17.92,17.92,0,0,1,0,7.11q-.72,14.93-10.31,24.52a33,33,0,0,1-46.91-.35,33.52,33.52,0,0,1-9.6-24.17q0-17.76,13.51-27a8.33,8.33,0,0,0,1.77-1.06l1.07-1.07a16.22,16.22,0,0,0,6.4-10.31q1.41-6.75-8.53-11.73a26.26,26.26,0,0,0-12.8-3.55q-21.32-1.43-37.67,12.8t-22,49.75V597.5q0,9.94,2.84,14.57t5.69,5.33a10.54,10.54,0,0,0,9.24,0v18.48h-86V617.4q5.68,2.13,8.53,0,3.55-.71,7.11-5.33t3.55-14.57V326.68q0-9.94-3.55-14.57t-7.11-6q-2.85-1.43-8.53,0V288.3h68.24v29.14q5-7.81,9.95-14.57a48.44,48.44,0,0,1,11.72-11.37,59.79,59.79,0,0,1,15.64-7.46q8.89-2.85,22.39-2.85,20.61,0,38.39,14.93t26.3,43.36Zm95.95,258q0,9.94,3.2,14.57c2.13,3.08,4.15,4.86,6,5.33q3.55,2.13,9.24,0v18.48h-86V617.4q5.68,2.13,10,0,2.13-.71,5.69-5.33t3.55-14.57V166.75q0-10.65-3.55-15.28a28.82,28.82,0,0,0-5.69-6q-4.26-2.13-10,0V128.37h67.52V597.5Zm154.25-314.18a105.25,105.25,0,0,1,33.4,5.69,86.33,86.33,0,0,1,30.57,17.77,88.19,88.19,0,0,1,21.68,30.57q8.18,18.48,8.17,44.06v90.28H2332.84V544.9q0,44.07,15.29,62.9t38,18.13a113.93,113.93,0,Line truncated
</svg>
<p>{% translate "Please sign in." %}</p>
{% if form.errors %}
<div class="alert alert-danger" role="alert">
+71
View File
@@ -11,6 +11,7 @@ import pytest
from django.conf import settings
from django.contrib.auth.models import User
from django.test import override_settings
from pikepdf import Pdf
from rest_framework.test import APITestCase
from whoosh.writing import AsyncWriter
@@ -1372,6 +1373,75 @@ class TestBulkDownload(DirectoriesMixin, APITestCase):
"compression": "lzma"
}), content_type='application/json')
class TestSplitMerge(DirectoriesMixin, APITestCase):
def setUp(self):
super(TestSplitMerge, self).setUp()
user = User.objects.create_superuser(username="temp_admin")
self.client.force_login(user=user)
self.doc1 = Document.objects.create(title="document A", filename="docA.pdf", mime_type="application/pdf", checksum="A")
self.doc2 = Document.objects.create(title="document B", filename="docB.jpg", mime_type="image/jpeg", checksum="B", archive_filename="docB.pdf", archive_checksum="D")
self.doc3 = Document.objects.create(title="document C", filename="docC.jpg", mime_type="image/jpeg", checksum="C")
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.pdf"), self.doc1.source_path)
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.jpg"), self.doc2.source_path)
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.pdf"), self.doc2.archive_path)
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.jpg"), self.doc3.source_path)
@mock.patch("documents.merge.async_task")
def test_merge(self, m):
result = self.client.post("/api/split_merge/", json.dumps({
"split_merge_plan": [
[{"document": self.doc1.pk}, {"document": self.doc2.pk}]
],
"preview": False
}), content_type="application/json")
self.assertEqual(result.status_code, 200)
m.assert_called_once()
args, kwargs = m.call_args
self.assertEqual(kwargs["delete_document_ids"], None)
self.assertEqual(len(result.data), 1)
preview_key = result.data[0]
preview_response = self.client.get(f"/api/split_merge/{preview_key}/")
self.assertEqual(200, preview_response.status_code)
pdf: Pdf = Pdf.open(io.BytesIO(preview_response.content))
self.assertEqual(2, len(pdf.pages))
pdf.close()
@mock.patch("documents.merge.async_task")
def test_merge_delete_source(self, m):
result = self.client.post("/api/split_merge/", json.dumps({
"split_merge_plan": [
[{"document": self.doc1.pk}, {"document": self.doc2.pk}]
],
"preview": False,
"delete_source": True
}), content_type="application/json")
self.assertEqual(result.status_code, 200)
m.assert_called_once()
args, kwargs = m.call_args
self.assertCountEqual(kwargs["delete_document_ids"], [self.doc1.pk, self.doc2.pk])
@mock.patch("documents.merge.async_task")
def test_merge_invalid_doc(self, m):
result = self.client.post("/api/split_merge/", json.dumps({
"split_merge_plan": [
[{"document": self.doc1.pk}, {"document": self.doc3.pk}]
],
"preview": False
}), content_type="application/json")
self.assertEqual(result.status_code, 400)
m.assert_not_called()
class TestApiAuth(APITestCase):
def test_auth_required(self):
@@ -1396,6 +1466,7 @@ class TestApiAuth(APITestCase):
self.assertEqual(self.client.get("/api/documents/bulk_edit/").status_code, 401)
self.assertEqual(self.client.get("/api/documents/bulk_download/").status_code, 401)
self.assertEqual(self.client.get("/api/documents/selection_data/").status_code, 401)
self.assertEqual(self.client.get("/api/split_merge/").status_code, 401)
def test_api_version_no_auth(self):
@@ -0,0 +1,66 @@
import os
import shutil
from unittest import mock
from django.contrib.auth.models import User
from django.core.management import call_command
from django.test import TestCase
from documents.management.commands.document_thumbnails import _process_document
from documents.models import Document, Tag, Correspondent, DocumentType
from documents.tests.utils import DirectoriesMixin
class TestManageSuperUser(DirectoriesMixin, TestCase):
def reset_environment(self):
if "PAPERLESS_ADMIN_USER" in os.environ:
del os.environ["PAPERLESS_ADMIN_USER"]
if "PAPERLESS_ADMIN_PASSWORD" in os.environ:
del os.environ["PAPERLESS_ADMIN_PASSWORD"]
def setUp(self) -> None:
super().setUp()
self.reset_environment()
def tearDown(self) -> None:
super().tearDown()
self.reset_environment()
def test_no_user(self):
call_command("manage_superuser")
# just the consumer user.
self.assertEqual(User.objects.count(), 1)
self.assertTrue(User.objects.filter(username="consumer").exists())
def test_create(self):
os.environ["PAPERLESS_ADMIN_USER"] = "new_user"
os.environ["PAPERLESS_ADMIN_PASSWORD"] = "123456"
call_command("manage_superuser")
user: User = User.objects.get_by_natural_key("new_user")
self.assertTrue(user.check_password("123456"))
def test_update(self):
os.environ["PAPERLESS_ADMIN_USER"] = "new_user"
os.environ["PAPERLESS_ADMIN_PASSWORD"] = "123456"
call_command("manage_superuser")
os.environ["PAPERLESS_ADMIN_USER"] = "new_user"
os.environ["PAPERLESS_ADMIN_PASSWORD"] = "more_secure_pwd_7645"
call_command("manage_superuser")
user: User = User.objects.get_by_natural_key("new_user")
self.assertTrue(user.check_password("more_secure_pwd_7645"))
def test_no_password(self):
os.environ["PAPERLESS_ADMIN_USER"] = "new_user"
call_command("manage_superuser")
with self.assertRaises(User.DoesNotExist):
User.objects.get_by_natural_key("new_user")
+313
View File
@@ -0,0 +1,313 @@
import datetime
import hashlib
import os
import shutil
import tempfile
import uuid
from contextlib import contextmanager
from unittest import mock
from unittest.mock import MagicMock
from django.conf import settings
from django.test import TestCase, override_settings
from django.utils import timezone
from documents.consumer import ConsumerError
from documents.merge import PdfCache, MergeError, execute_split_merge_plan, consume_many_files, parse_page_list
from documents.models import Document, Correspondent, Tag, DocumentType
from documents.tests.utils import DirectoriesMixin
class TestPdfCache(DirectoriesMixin, TestCase):
def setUp(self) -> None:
super(TestPdfCache, self).setUp()
self.cache = PdfCache()
def test_open_no_pdf(self):
doc = Document.objects.create(mime_type="image/jpeg")
self.assertRaisesMessage(MergeError, "does not have a PDF.", self.cache.open_from_document, doc)
def test_open_original_pdf(self):
doc = Document.objects.create(mime_type="application/pdf", filename="test.pdf")
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.pdf"), doc.source_path)
self.cache.open_from_document(doc)
self.assertIn(doc.pk, self.cache.cache)
def test_document_does_not_exist(self):
doc = Document.objects.create(mime_type="application/pdf", filename="test.pdf")
self.assertRaisesMessage(MergeError, "does not exist.", self.cache.open_from_document, doc)
def test_open_archive_pdf(self):
doc = Document.objects.create(mime_type="image/jpef", archive_checksum="B", archive_filename="test.pdf")
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.pdf"), doc.archive_path)
self.cache.open_from_document(doc)
self.assertIn(doc.pk, self.cache.cache)
@mock.patch("documents.merge.Pdf.open")
def test_cached(self, pdf_open: MagicMock):
pdf_open.return_value = "the_pdf"
doc = Document.objects.create(mime_type="application/pdf", filename="test.pdf")
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.pdf"), doc.source_path)
self.assertEqual(self.cache.open_from_document(doc), "the_pdf")
pdf_open.assert_called_once()
self.assertIn(doc.pk, self.cache.cache)
pdf_open.reset_mock()
self.assertEqual(self.cache.open_from_document(doc), "the_pdf")
pdf_open.assert_not_called()
def test_close(self):
self.test_open_original_pdf()
self.assertEqual(len(self.cache.cache), 1)
self.cache.close_all()
self.assertEqual(len(self.cache.cache), 0)
class TestParsePageList(TestCase):
def test_ranges(self):
self.assertListEqual(parse_page_list(""), [])
self.assertListEqual(parse_page_list(None), [])
self.assertListEqual(parse_page_list("1,2,3"), [1, 2, 3])
self.assertListEqual(parse_page_list("1,3,2"), [1, 3, 2])
self.assertListEqual(parse_page_list("1-3,5"), [1, 2, 3, 5])
self.assertListEqual(parse_page_list("1-1,1,2-2,2,6-6,6"), [1, 1, 2, 2, 6, 6])
self.assertListEqual(parse_page_list("5-3,1"), [5, 4, 3, 1])
def test_error(self):
self.assertRaises(MergeError, parse_page_list, "as")
self.assertRaises(MergeError, parse_page_list, "1--2")
self.assertRaises(MergeError, parse_page_list, "1,2,3,")
self.assertRaises(MergeError, parse_page_list, "1-8,1-a")
self.assertRaises(MergeError, parse_page_list, "8,1-,8")
self.assertRaises(MergeError, parse_page_list, "1,,2")
class FakePdf:
def __init__(self):
self.pages = list()
def remove_unreferenced_resources(self):
pass
def close(self):
pass
def save(self, filename, min_version=None):
with open(filename, "w") as f:
f.write(" ".join(self.pages))
@property
def pdf_version(self):
return 0
@contextmanager
def open_metadata(self):
yield dict()
def fake_open(self, document):
pdf = FakePdf()
pdf.pages = document.content.split(" ")
return pdf
@mock.patch("documents.merge.Pdf.new", lambda: FakePdf())
@mock.patch("documents.merge.PdfCache.open_from_document", fake_open)
class TestExecuteSplitMergePlan(DirectoriesMixin, TestCase):
def setUp(self) -> None:
super(TestExecuteSplitMergePlan, self).setUp()
self.tempdir = os.path.join(settings.SCRATCH_DIR, "split_merge")
os.makedirs(self.tempdir, exist_ok=True)
def _verify_results(self, files, expected_content):
self.assertEqual(len(files), len(expected_content))
for (file, content) in zip(files, expected_content):
with open(file) as f:
self.assertEqual(f.read(), content)
def test_delete_page(self):
doc1 = Document.objects.create(content="A B C")
result = execute_split_merge_plan(
plan=[
[{"document": doc1.pk, "pages": "1,3"}]
],
tempdir=self.tempdir,
)
self._verify_results(result, ["A C"])
def test_split(self):
doc1 = Document.objects.create(content="A B C")
result = execute_split_merge_plan(
plan=[
[{"document": doc1.pk, "pages": "1,2"}],
[{"document": doc1.pk, "pages": "3"}],
],
tempdir=self.tempdir,
)
self._verify_results(result, ["A B", "C"])
def test_merge(self):
doc1 = Document.objects.create(content="A B C", checksum="A")
doc2 = Document.objects.create(content="D E", checksum="B")
result = execute_split_merge_plan(
plan=[
[{"document": doc2.pk}, {"document": doc1.pk}],
],
tempdir=self.tempdir,
)
self._verify_results(result, ["D E A B C"])
def test_partial_merge_reorder(self):
doc1 = Document.objects.create(content="A B C", checksum="A")
doc2 = Document.objects.create(content="D E", checksum="B")
result = execute_split_merge_plan(
plan=[
[{"document": doc1.pk, "pages": "3,1"}, {"document": doc2.pk, "pages": "2"}],
],
tempdir=self.tempdir,
)
self._verify_results(result, ["C A E"])
def test_document_does_not_exist(self):
self.assertRaisesMessage(
MergeError,
"Document 3456 does not exist.",
execute_split_merge_plan,
plan=[[{"document": 3456}]],
tempdir=self.tempdir,
)
def test_page_out_of_range(self):
doc1 = Document.objects.create(content="A B C")
self.assertRaisesMessage(
MergeError,
"Page 4 is out of range.",
execute_split_merge_plan,
plan=[[{"document": doc1.pk, "pages": "4"}]],
tempdir=self.tempdir,
)
@mock.patch("documents.merge.async_task")
def test_no_preview(self, async_task: MagicMock):
doc1 = Document.objects.create(content="A B C", checksum="A")
doc2 = Document.objects.create(content="D E", checksum="B")
result = execute_split_merge_plan(
plan=[
[{"document": doc2.pk}, {"document": doc1.pk}],
],
tempdir=self.tempdir,
preview=False,
delete_source=False
)
async_task.assert_called_once()
args, kwargs = async_task.call_args
self.assertListEqual(kwargs['kwargs_list'], [{"path": result[0], "override_title": ""}])
self.assertIsNone(kwargs['delete_document_ids'])
@mock.patch("documents.merge.async_task")
def test_no_preview_delete_source(self, async_task: MagicMock):
doc1 = Document.objects.create(content="A B C", checksum="A")
doc2 = Document.objects.create(content="D E", checksum="B")
result = execute_split_merge_plan(
plan=[
[{"document": doc2.pk}, {"document": doc1.pk}],
],
tempdir=self.tempdir,
preview=False,
delete_source=True
)
async_task.assert_called_once()
args, kwargs = async_task.call_args
self.assertCountEqual(kwargs['delete_document_ids'], [doc1.pk, doc2.pk])
@mock.patch("documents.merge.async_task")
@override_settings(TIME_ZONE="UTC")
def test_metadata_copy_first(self, async_task: MagicMock):
c1 = Correspondent.objects.create(name="c1")
c2 = Correspondent.objects.create(name="c2")
t1 = Tag.objects.create(name="t1")
t2 = Tag.objects.create(name="t2")
dt1 = DocumentType.objects.create(name="dt1")
dt2 = DocumentType.objects.create(name="dt2")
doc1 = Document.objects.create(content="A B C", checksum="A", title="titleA", correspondent=c1, document_type=dt1, created=timezone.datetime(2020, 12, 1, 0, 0, 0))
doc1.tags.add(t1)
doc2 = Document.objects.create(content="D E", checksum="B", title="titleB", correspondent=c2, document_type=dt2, created=timezone.datetime(2020, 2, 20, 0, 0, 0))
doc2.tags.add(t2)
result = execute_split_merge_plan(
plan=[
[{"document": doc2.pk}, {"document": doc1.pk}],
],
tempdir=self.tempdir,
preview=False,
metadata="copy_first",
)
async_task.assert_called_once()
args, kwargs = async_task.call_args
self.assertEqual(1, len(kwargs['kwargs_list']))
kwargs = kwargs['kwargs_list'][0]
self.assertEqual(kwargs["override_title"], "titleB")
self.assertEqual(kwargs["override_correspondent_id"], c2.pk)
self.assertEqual(kwargs["override_tag_ids"], [t2.pk])
self.assertEqual(kwargs["override_document_type_id"], dt2.pk)
self.assertEqual(kwargs["override_date"], timezone.make_aware(datetime.datetime(2020, 2, 20, 0, 0, 0)))
def fake_consume_file(fail, *args, **kwargs):
if fail:
raise ConsumerError()
return Document.objects.create(checksum=str(Document.objects.count())).pk
class TestConsumeManyFiles(DirectoriesMixin, TestCase):
@mock.patch("documents.merge.tasks.consume_file")
def test_success(self, consume_file: MagicMock):
consume_file.side_effect = fake_consume_file
consume_many_files([{"fail": False}, {"fail": False}])
self.assertEqual(consume_file.call_count, 2)
self.assertEqual(Document.objects.count(), 2)
@mock.patch("documents.merge.tasks.consume_file")
def test_fail(self, consume_file: MagicMock):
consume_file.side_effect = fake_consume_file
self.assertRaises(
ConsumerError,
consume_many_files,
[{"fail": False}, {"fail": True}, {"fail": False}]
)
self.assertEqual(consume_file.call_count, 2)
self.assertEqual(Document.objects.count(), 0)
@mock.patch("documents.merge.tasks.consume_file")
def test_success_delete_source(self, consume_file: MagicMock):
doc_id = Document.objects.create().id
self.assertTrue(Document.objects.filter(id=doc_id).exists())
consume_file.side_effect = fake_consume_file
consume_many_files([{"fail": False}, {"fail": False}], delete_document_ids=[doc_id])
self.assertEqual(consume_file.call_count, 2)
self.assertEqual(Document.objects.count(), 2)
self.assertFalse(Document.objects.filter(id=doc_id).exists())
@mock.patch("documents.merge.tasks.consume_file")
def test_fail_no_delete_source(self, consume_file: MagicMock):
doc_id = Document.objects.create().id
self.assertTrue(Document.objects.filter(id=doc_id).exists())
consume_file.side_effect = fake_consume_file
self.assertRaises(
ConsumerError,
consume_many_files,
[{"fail": False}, {"fail": True}],
delete_document_ids=[doc_id]
)
self.assertEqual(consume_file.call_count, 2)
self.assertEqual(Document.objects.count(), 1)
self.assertTrue(Document.objects.filter(id=doc_id).exists())
+54 -2
View File
@@ -6,6 +6,7 @@ import zipfile
from datetime import datetime
from time import mktime
import pathvalidate
from django.conf import settings
from django.db.models import Count, Max, Case, When, IntegerField
from django.db.models.functions import Lower
@@ -57,9 +58,10 @@ from .serialisers import (
DocumentTypeSerializer,
PostDocumentSerializer,
SavedViewSerializer,
BulkEditSerializer,
DocumentListSerializer,
BulkDownloadSerializer
BulkDownloadSerializer,
BulkEditSerializer,
DocumentSplitMergePlanSerializer
)
@@ -624,3 +626,53 @@ class BulkDownloadView(GenericAPIView):
"attachment", "documents.zip")
return response
class DocumentSplitMergeViewSet(GenericViewSet):
permission_classes = (IsAuthenticated,)
serializer_class = DocumentSplitMergePlanSerializer
def __init__(self, **kwargs):
super(DocumentSplitMergeViewSet, self).__init__(**kwargs)
self.tempdir = os.path.join(settings.SCRATCH_DIR, "split-merge")
os.makedirs(self.tempdir, exist_ok=True)
def get_queryset(self):
return os.listdir(self.tempdir)
def retrieve(self, request, pk, *args, **kwargs):
filename = os.path.join(
self.tempdir, pathvalidate.sanitize_filename(pk))
if not os.path.isfile(filename):
raise Http404()
with open(filename, "rb") as f:
return HttpResponse(f, content_type="application/pdf")
def list(self, request, *args, **kwargs):
return Response(self.get_queryset())
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
from .merge import execute_split_merge_plan, MergeError
split_merge_plan = serializer.validated_data.get("split_merge_plan")
preview = serializer.validated_data.get("preview")
delete_source = serializer.validated_data.get("delete_source")
metadata = serializer.validated_data.get("metadata")
try:
pdf_files = execute_split_merge_plan(
plan=split_merge_plan,
preview=preview,
delete_source=delete_source,
metadata=metadata,
tempdir=self.tempdir
)
except MergeError:
logger.exception("Error during merge")
return HttpResponseBadRequest()
return Response([os.path.basename(file) for file in pdf_files])
+21 -13
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-05 20:20\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-04 21:52\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -412,50 +412,58 @@ msgstr "Heslo"
msgid "Sign in"
msgstr "Přihlásit se"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr ""
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr ""
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Němčina"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Holandština"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "Francouzština"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr ""
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr ""
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr ""
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr ""
#: paperless/settings.py:311
msgid "Polish"
msgstr ""
#: paperless/settings.py:312
msgid "Swedish"
msgstr ""
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Správa Paperless-ng"
+23 -15
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-05 20:20\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-04 23:04\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -336,11 +336,11 @@ msgstr "Titel oder Inhalt enthält"
#: documents/models.py:393
msgid "fulltext query"
msgstr ""
msgstr "Volltextsuche"
#: documents/models.py:394
msgid "more like this"
msgstr ""
msgstr "Ähnliche Dokumente"
#: documents/models.py:405
msgid "rule type"
@@ -412,50 +412,58 @@ msgstr "Kennwort"
msgid "Sign in"
msgstr "Anmelden"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Englisch (US)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "Englisch (UK)"
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Deutsch"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Niederländisch"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "Französisch"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr "Portugiesisch"
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr "Italienisch"
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Rumänisch"
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr "Russisch"
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr "Spanisch"
#: paperless/settings.py:311
msgid "Polish"
msgstr "Polnisch"
#: paperless/settings.py:312
msgid "Swedish"
msgstr "Schwedisch"
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Paperless-ng Administration"
+23 -15
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-05 20:20\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-04 21:51\n"
"Last-Translator: \n"
"Language-Team: English, United Kingdom\n"
"Language: en_GB\n"
@@ -336,11 +336,11 @@ msgstr "title or content contains"
#: documents/models.py:393
msgid "fulltext query"
msgstr ""
msgstr "fulltext query"
#: documents/models.py:394
msgid "more like this"
msgstr ""
msgstr "more like this"
#: documents/models.py:405
msgid "rule type"
@@ -412,50 +412,58 @@ msgstr "Password"
msgid "Sign in"
msgstr "Sign in"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "English (US)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "English (GB)"
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "German"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Dutch"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "French"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Portuguese (Brazil)"
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr "Portuguese"
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr "Italian"
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Romanian"
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr "Russian"
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr "Spanish"
#: paperless/settings.py:311
msgid "Polish"
msgstr "Polish"
#: paperless/settings.py:312
msgid "Swedish"
msgstr ""
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Paperless-ng administration"
+20 -12
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -416,50 +416,58 @@ msgstr ""
msgid "Sign in"
msgstr ""
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr ""
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr ""
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr ""
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr ""
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr ""
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr ""
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr ""
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr ""
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr ""
#: paperless/settings.py:311
msgid "Polish"
msgstr ""
#: paperless/settings.py:312
msgid "Swedish"
msgstr ""
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr ""
+21 -13
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-05 20:20\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-04 21:52\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -412,50 +412,58 @@ msgstr "Contraseña"
msgid "Sign in"
msgstr "Iniciar sesión"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Inglés (US)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "Inglés (Gran Bretaña)"
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Alemán"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Alemán"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "Francés"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Portugués (Brasil)"
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Rumano"
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr "Ruso"
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr "Español"
#: paperless/settings.py:311
msgid "Polish"
msgstr ""
#: paperless/settings.py:312
msgid "Swedish"
msgstr ""
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Paperless-ng Administración"
+21 -13
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-06 12:03\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-05 15:10\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -412,50 +412,58 @@ msgstr "Mot de passe"
msgid "Sign in"
msgstr "S'identifier"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Anglais (US)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "Anglais (GB)"
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Allemand"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Néerlandais"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "Français"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Portugais (Brésil)"
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr "Portugais"
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr "Italien"
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Roumain"
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr "Russe"
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr "Espagnol"
#: paperless/settings.py:311
msgid "Polish"
msgstr "Polonais"
#: paperless/settings.py:312
msgid "Swedish"
msgstr "Suédois"
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Administration de Paperless-ng"
+21 -13
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-05 20:20\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-04 21:52\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
@@ -412,50 +412,58 @@ msgstr ""
msgid "Sign in"
msgstr ""
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Angol (US)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr ""
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Német"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr ""
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr ""
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr ""
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr ""
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr ""
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr ""
#: paperless/settings.py:311
msgid "Polish"
msgstr ""
#: paperless/settings.py:312
msgid "Swedish"
msgstr ""
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr ""
+21 -13
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-05 21:31\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-05 08:19\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -412,50 +412,58 @@ msgstr "Password"
msgid "Sign in"
msgstr "Accedi"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Inglese (US)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "Inglese (GB)"
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Tedesco"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Olandese"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "Francese"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Portoghese (Brasile)"
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr "Portoghese"
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Rumeno"
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr "Russo"
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr "Spagnolo"
#: paperless/settings.py:311
msgid "Polish"
msgstr "Polacco"
#: paperless/settings.py:312
msgid "Swedish"
msgstr "Svedese"
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Amministrazione di Paperless-ng"
+31 -23
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-06 12:03\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-04 21:51\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -23,7 +23,7 @@ msgstr "Documenten"
#: documents/models.py:32
msgid "Any word"
msgstr "Eender welk woord"
msgstr "Elk woord"
#: documents/models.py:33
msgid "All words"
@@ -76,19 +76,19 @@ msgstr "Kleur"
#: documents/models.py:87
msgid "is inbox tag"
msgstr "is \"Postvak in\"-etiket"
msgstr "is \"Postvak in\"-label"
#: documents/models.py:89
msgid "Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags."
msgstr "Markeer dit etiket als een \"Postvak in\"-etiket: alle nieuw verwerkte documenten krijgen de \"Postvak in\"-etiketten."
msgstr "Markeert dit label als een \"Postvak in\"-label: alle nieuw verwerkte documenten krijgen de \"Postvak in\"-labels."
#: documents/models.py:94
msgid "tag"
msgstr "etiket"
msgstr "label"
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "etiketten"
msgstr "labels"
#: documents/models.py:101 documents/models.py:133
msgid "document type"
@@ -128,7 +128,7 @@ msgstr "checksum"
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "Het controlecijfer van het originele document."
msgstr "De checksum van het oorspronkelijke document."
#: documents/models.py:163
msgid "archive checksum"
@@ -280,11 +280,11 @@ msgstr "zit in \"Postvak in\""
#: documents/models.py:379
msgid "has tag"
msgstr "heeft etiket"
msgstr "heeft label"
#: documents/models.py:380
msgid "has any tag"
msgstr "heeft één van de etiketten"
msgstr "heeft één van de labels"
#: documents/models.py:381
msgid "created before"
@@ -324,7 +324,7 @@ msgstr "gewijzigd na"
#: documents/models.py:390
msgid "does not have tag"
msgstr "heeft geen etiket"
msgstr "heeft geen label"
#: documents/models.py:391
msgid "does not have ASN"
@@ -412,50 +412,58 @@ msgstr "Wachtwoord"
msgid "Sign in"
msgstr "Aanmelden"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Engels (US)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "Engels (Brits)"
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Duits"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Nederlands"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "Frans"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Portugees (Brazilië)"
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr "Portugees"
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr "Italiaans"
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Roemeens"
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr "Russisch"
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr "Spaans"
#: paperless/settings.py:311
msgid "Polish"
msgstr "Pools"
#: paperless/settings.py:312
msgid "Swedish"
msgstr ""
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Paperless-ng administratie"
@@ -482,7 +490,7 @@ msgstr "Metadata"
#: paperless_mail/admin.py:48
msgid "Assign metadata to documents consumed from this rule automatically. If you do not assign tags, types or correspondents here, paperless will still process all matching rules that you have defined."
msgstr "Automatisch metadata toewijzen aan documenten vanuit deze regel. Indien je geen etiketten, documenttypes of correspondenten toewijst, zal Paperless nog steeds alle regels verwerken die je hebt gedefinieerd."
msgstr "Automatisch metadata toewijzen aan documenten vanuit deze regel. Indien je geen labels, documenttypes of correspondenten toewijst, zal Paperless nog steeds alle regels verwerken die je hebt gedefinieerd."
#: paperless_mail/apps.py:9
msgid "Paperless mail"
+678
View File
@@ -0,0 +1,678 @@
msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-04 21:51\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Crowdin-Project: paperless-ng\n"
"X-Crowdin-Project-ID: 434940\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /dev/src/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 54\n"
#: documents/apps.py:10
msgid "Documents"
msgstr "Dokumenty"
#: documents/models.py:32
msgid "Any word"
msgstr "Dowolne słowo"
#: documents/models.py:33
msgid "All words"
msgstr "Wszystkie słowa"
#: documents/models.py:34
msgid "Exact match"
msgstr "Dokładne dopasowanie"
#: documents/models.py:35
msgid "Regular expression"
msgstr "Wyrażenie regularne"
#: documents/models.py:36
msgid "Fuzzy word"
msgstr "Dopasowanie rozmyte"
#: documents/models.py:37
msgid "Automatic"
msgstr "Automatyczny"
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr "nazwa"
#: documents/models.py:45
msgid "match"
msgstr "dopasowanie"
#: documents/models.py:49
msgid "matching algorithm"
msgstr "algorytm dopasowania"
#: documents/models.py:55
msgid "is insensitive"
msgstr "bez rozróżniania wielkości liter"
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr "korespondent"
#: documents/models.py:75
msgid "correspondents"
msgstr "korespondenci"
#: documents/models.py:81
msgid "color"
msgstr "kolor"
#: documents/models.py:87
msgid "is inbox tag"
msgstr "jest tagiem skrzynki odbiorczej"
#: documents/models.py:89
msgid "Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags."
msgstr "Zaznacza ten tag jako tag skrzynki odbiorczej: Wszystkie nowo przetworzone dokumenty będą oznaczone tagami skrzynki odbiorczej."
#: documents/models.py:94
msgid "tag"
msgstr "tag"
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "tagi"
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr "typ dokumentu"
#: documents/models.py:102
msgid "document types"
msgstr "typy dokumentów"
#: documents/models.py:110
msgid "Unencrypted"
msgstr "Niezaszyfrowane"
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr "Zaszyfrowane przy użyciu GNU Privacy Guard"
#: documents/models.py:124
msgid "title"
msgstr "tytuł"
#: documents/models.py:137
msgid "content"
msgstr "zawartość"
#: documents/models.py:139
msgid "The raw, text-only data of the document. This field is primarily used for searching."
msgstr "Surowe, tekstowe dane dokumentu. To pole jest używane głównie do wyszukiwania."
#: documents/models.py:144
msgid "mime type"
msgstr "typ mime"
#: documents/models.py:155
msgid "checksum"
msgstr "suma kontrolna"
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "Suma kontrolna oryginalnego dokumentu."
#: documents/models.py:163
msgid "archive checksum"
msgstr "suma kontrolna archiwum"
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr "Suma kontrolna zarchiwizowanego dokumentu."
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr "utworzono"
#: documents/models.py:176
msgid "modified"
msgstr "zmodyfikowano"
#: documents/models.py:180
msgid "storage type"
msgstr "typ przechowywania"
#: documents/models.py:188
msgid "added"
msgstr "dodano"
#: documents/models.py:192
msgid "filename"
msgstr "nazwa pliku"
#: documents/models.py:198
msgid "Current filename in storage"
msgstr "Aktualna nazwa pliku w pamięci"
#: documents/models.py:202
msgid "archive filename"
msgstr "nazwa pliku archiwum"
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr "Aktualna nazwa pliku archiwum w pamięci"
#: documents/models.py:212
msgid "archive serial number"
msgstr "numer seryjny archiwum"
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr "Pozycja tego dokumentu w archiwum dokumentów fizycznych."
#: documents/models.py:223
msgid "document"
msgstr "dokument"
#: documents/models.py:224
msgid "documents"
msgstr "dokumenty"
#: documents/models.py:311
msgid "debug"
msgstr "debug"
#: documents/models.py:312
msgid "information"
msgstr "informacja"
#: documents/models.py:313
msgid "warning"
msgstr "ostrzeżenie"
#: documents/models.py:314
msgid "error"
msgstr "błąd"
#: documents/models.py:315
msgid "critical"
msgstr "krytyczne"
#: documents/models.py:319
msgid "group"
msgstr "grupa"
#: documents/models.py:322
msgid "message"
msgstr "wiadomość"
#: documents/models.py:325
msgid "level"
msgstr "poziom"
#: documents/models.py:332
msgid "log"
msgstr "log"
#: documents/models.py:333
msgid "logs"
msgstr "logi"
#: documents/models.py:344 documents/models.py:401
msgid "saved view"
msgstr "zapisany widok"
#: documents/models.py:345
msgid "saved views"
msgstr "zapisane widoki"
#: documents/models.py:348
msgid "user"
msgstr "użytkownik"
#: documents/models.py:354
msgid "show on dashboard"
msgstr "pokaż na pulpicie"
#: documents/models.py:357
msgid "show in sidebar"
msgstr "pokaż na pasku bocznym"
#: documents/models.py:361
msgid "sort field"
msgstr "pole sortowania"
#: documents/models.py:367
msgid "sort reverse"
msgstr "sortuj malejąco"
#: documents/models.py:373
msgid "title contains"
msgstr "tytuł zawiera"
#: documents/models.py:374
msgid "content contains"
msgstr "zawartość zawiera"
#: documents/models.py:375
msgid "ASN is"
msgstr "numer archiwum jest"
#: documents/models.py:376
msgid "correspondent is"
msgstr "korespondentem jest"
#: documents/models.py:377
msgid "document type is"
msgstr "typ dokumentu jest"
#: documents/models.py:378
msgid "is in inbox"
msgstr "jest w skrzynce odbiorczej"
#: documents/models.py:379
msgid "has tag"
msgstr "ma tag"
#: documents/models.py:380
msgid "has any tag"
msgstr "ma dowolny tag"
#: documents/models.py:381
msgid "created before"
msgstr "utworzony przed"
#: documents/models.py:382
msgid "created after"
msgstr "utworzony po"
#: documents/models.py:383
msgid "created year is"
msgstr "rok utworzenia to"
#: documents/models.py:384
msgid "created month is"
msgstr "miesiąc utworzenia to"
#: documents/models.py:385
msgid "created day is"
msgstr "dzień utworzenia to"
#: documents/models.py:386
msgid "added before"
msgstr "dodany przed"
#: documents/models.py:387
msgid "added after"
msgstr "dodany po"
#: documents/models.py:388
msgid "modified before"
msgstr "zmodyfikowany przed"
#: documents/models.py:389
msgid "modified after"
msgstr "zmodyfikowany po"
#: documents/models.py:390
msgid "does not have tag"
msgstr "nie ma tagu"
#: documents/models.py:391
msgid "does not have ASN"
msgstr "nie ma numeru archiwum"
#: documents/models.py:392
msgid "title or content contains"
msgstr "tytuł lub zawartość zawiera"
#: documents/models.py:393
msgid "fulltext query"
msgstr "zapytanie pełnotekstowe"
#: documents/models.py:394
msgid "more like this"
msgstr "podobne dokumenty"
#: documents/models.py:405
msgid "rule type"
msgstr "typ reguły"
#: documents/models.py:409
msgid "value"
msgstr "wartość"
#: documents/models.py:415
msgid "filter rule"
msgstr "reguła filtrowania"
#: documents/models.py:416
msgid "filter rules"
msgstr "reguły filtrowania"
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expression: %(error)s"
msgstr "Nieprawidłowe wyrażenie regularne: %(error)s"
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr "Nieprawidłowy kolor."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr "Typ pliku %(type)s nie jest obsługiwany"
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Ładowanie Paperless-ng..."
#: documents/templates/registration/logged_out.html:13
msgid "Paperless-ng signed out"
msgstr "Wylogowano z Paperless-ng"
#: documents/templates/registration/logged_out.html:41
msgid "You have been successfully logged out. Bye!"
msgstr "Poprawnie wylogowano. Do zobaczenia!"
#: documents/templates/registration/logged_out.html:42
msgid "Sign in again"
msgstr "Zaloguj się ponownie"
#: documents/templates/registration/login.html:13
msgid "Paperless-ng sign in"
msgstr "Logowanie do Paperless-ng"
#: documents/templates/registration/login.html:42
msgid "Please sign in."
msgstr "Proszę się zalogować."
#: documents/templates/registration/login.html:45
msgid "Your username and password didn't match. Please try again."
msgstr "Twoja nazwa użytkownika i hasło nie są zgodne. Spróbuj ponownie."
#: documents/templates/registration/login.html:48
msgid "Username"
msgstr "Użytkownik"
#: documents/templates/registration/login.html:49
msgid "Password"
msgstr "Hasło"
#: documents/templates/registration/login.html:54
msgid "Sign in"
msgstr "Zaloguj się"
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Angielski (USA)"
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "Angielski (Wielka Brytania)"
#: paperless/settings.py:302
msgid "German"
msgstr "Niemiecki"
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Holenderski"
#: paperless/settings.py:304
msgid "French"
msgstr "Francuski"
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Portugalski (Brazylia)"
#: paperless/settings.py:306
msgid "Portuguese"
msgstr "Portugalski"
#: paperless/settings.py:307
msgid "Italian"
msgstr "Włoski"
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Rumuński"
#: paperless/settings.py:309
msgid "Russian"
msgstr "Rosyjski"
#: paperless/settings.py:310
msgid "Spanish"
msgstr "Hiszpański"
#: paperless/settings.py:311
msgid "Polish"
msgstr "Polski"
#: paperless/settings.py:312
msgid "Swedish"
msgstr ""
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Administracja Paperless-ng"
#: paperless_mail/admin.py:25
msgid "Filter"
msgstr "Filtry"
#: paperless_mail/admin.py:27
msgid "Paperless will only process mails that match ALL of the filters given below."
msgstr "Paperless przetworzy tylko wiadomości pasujące do WSZYSTKICH filtrów podanych poniżej."
#: paperless_mail/admin.py:37
msgid "Actions"
msgstr "Akcje"
#: paperless_mail/admin.py:39
msgid "The action applied to the mail. This action is only performed when documents were consumed from the mail. Mails without attachments will remain entirely untouched."
msgstr "Akcja zastosowana do wiadomości. Ta akcja jest wykonywana tylko wtedy, gdy dokumenty zostały przetworzone z wiadomości. Poczta bez załączników pozostanie całkowicie niezmieniona."
#: paperless_mail/admin.py:46
msgid "Metadata"
msgstr "Metadane"
#: paperless_mail/admin.py:48
msgid "Assign metadata to documents consumed from this rule automatically. If you do not assign tags, types or correspondents here, paperless will still process all matching rules that you have defined."
msgstr "Przypisz metadane do dokumentów zużywanych z tej reguły automatycznie. Jeśli nie przypisujesz tutaj tagów, typów lub korespondentów, Paperless będzie nadal przetwarzał wszystkie zdefiniowane przez Ciebie reguły."
#: paperless_mail/apps.py:9
msgid "Paperless mail"
msgstr "Poczta Paperless"
#: paperless_mail/models.py:11
msgid "mail account"
msgstr "konto pocztowe"
#: paperless_mail/models.py:12
msgid "mail accounts"
msgstr "konta pocztowe"
#: paperless_mail/models.py:19
msgid "No encryption"
msgstr "Brak szyfrowania"
#: paperless_mail/models.py:20
msgid "Use SSL"
msgstr "Użyj SSL"
#: paperless_mail/models.py:21
msgid "Use STARTTLS"
msgstr "Użyj STARTTLS"
#: paperless_mail/models.py:29
msgid "IMAP server"
msgstr "Serwer IMAP"
#: paperless_mail/models.py:33
msgid "IMAP port"
msgstr "Port IMAP"
#: paperless_mail/models.py:36
msgid "This is usually 143 for unencrypted and STARTTLS connections, and 993 for SSL connections."
msgstr "Zwykle jest to 143 dla połączeń niezaszyfrowanych i STARTTLS oraz 993 dla połączeń SSL."
#: paperless_mail/models.py:40
msgid "IMAP security"
msgstr "Zabezpieczenia IMAP"
#: paperless_mail/models.py:46
msgid "username"
msgstr "nazwa użytkownika"
#: paperless_mail/models.py:50
msgid "password"
msgstr "hasło"
#: paperless_mail/models.py:60
msgid "mail rule"
msgstr "reguła wiadomości"
#: paperless_mail/models.py:61
msgid "mail rules"
msgstr "reguły wiadomości"
#: paperless_mail/models.py:67
msgid "Only process attachments."
msgstr "Przetwarzaj tylko załączniki."
#: paperless_mail/models.py:68
msgid "Process all files, including 'inline' attachments."
msgstr "Przetwarzaj wszystkie pliki, łącznie z załącznikami „inline”."
#: paperless_mail/models.py:78
msgid "Mark as read, don't process read mails"
msgstr "Oznacz jako przeczytane, nie przetwarzaj przeczytanych wiadomości"
#: paperless_mail/models.py:79
msgid "Flag the mail, don't process flagged mails"
msgstr "Oznacz wiadomość, nie przetwarzaj oznaczonych wiadomości"
#: paperless_mail/models.py:80
msgid "Move to specified folder"
msgstr "Przenieś do określonego folderu"
#: paperless_mail/models.py:81
msgid "Delete"
msgstr "Usuń"
#: paperless_mail/models.py:88
msgid "Use subject as title"
msgstr "Użyj tematu jako tytułu"
#: paperless_mail/models.py:89
msgid "Use attachment filename as title"
msgstr "Użyj nazwy pliku załącznika jako tytułu"
#: paperless_mail/models.py:99
msgid "Do not assign a correspondent"
msgstr "Nie przypisuj korespondenta"
#: paperless_mail/models.py:101
msgid "Use mail address"
msgstr "Użyj adresu e-mail"
#: paperless_mail/models.py:103
msgid "Use name (or mail address if not available)"
msgstr "Użyj nazwy nadawcy (lub adresu e-mail, jeśli jest niedostępna)"
#: paperless_mail/models.py:105
msgid "Use correspondent selected below"
msgstr "Użyj korespondenta wybranego poniżej"
#: paperless_mail/models.py:113
msgid "order"
msgstr "kolejność"
#: paperless_mail/models.py:120
msgid "account"
msgstr "konto"
#: paperless_mail/models.py:124
msgid "folder"
msgstr "folder"
#: paperless_mail/models.py:128
msgid "filter from"
msgstr "filtruj po nadawcy"
#: paperless_mail/models.py:131
msgid "filter subject"
msgstr "filtruj po temacie"
#: paperless_mail/models.py:134
msgid "filter body"
msgstr "filtruj po treści"
#: paperless_mail/models.py:138
msgid "filter attachment filename"
msgstr "filtruj po nazwie pliku załącznika"
#: paperless_mail/models.py:140
msgid "Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive."
msgstr "Przetwarzaj tylko dokumenty, które całkowicie pasują do tej nazwy pliku, jeśli jest podana. Wzorce dopasowania jak *.pdf lub *faktura* są dozwolone. Wielkość liter nie jest rozróżniana."
#: paperless_mail/models.py:146
msgid "maximum age"
msgstr "nie starsze niż"
#: paperless_mail/models.py:148
msgid "Specified in days."
msgstr "dni."
#: paperless_mail/models.py:151
msgid "attachment type"
msgstr "typ załącznika"
#: paperless_mail/models.py:154
msgid "Inline attachments include embedded images, so it's best to combine this option with a filename filter."
msgstr "Załączniki typu \"inline\" zawierają osadzone obrazy, więc najlepiej połączyć tę opcję z filtrem nazwy pliku."
#: paperless_mail/models.py:159
msgid "action"
msgstr "akcja"
#: paperless_mail/models.py:165
msgid "action parameter"
msgstr "parametr akcji"
#: paperless_mail/models.py:167
msgid "Additional parameter for the action selected above, i.e., the target folder of the move to folder action."
msgstr "Dodatkowy parametr dla akcji wybranej powyżej, tj. docelowy folder akcji \"Przenieś do określonego folderu\"."
#: paperless_mail/models.py:173
msgid "assign title from"
msgstr "przypisz tytuł"
#: paperless_mail/models.py:183
msgid "assign this tag"
msgstr "przypisz ten tag"
#: paperless_mail/models.py:191
msgid "assign this document type"
msgstr "przypisz ten typ dokumentu"
#: paperless_mail/models.py:195
msgid "assign correspondent from"
msgstr "przypisz korespondenta z"
#: paperless_mail/models.py:205
msgid "assign this correspondent"
msgstr "przypisz tego korespondenta"
+21 -13
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-05 20:20\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-04 21:51\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -412,50 +412,58 @@ msgstr "Senha"
msgid "Sign in"
msgstr "Entrar"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Inglês (EUA)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "Inglês (GB)"
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Alemão"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Holandês"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "Francês"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Português (Brasil)"
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Romeno"
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr ""
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr ""
#: paperless/settings.py:311
msgid "Polish"
msgstr ""
#: paperless/settings.py:312
msgid "Swedish"
msgstr ""
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Administração do Paperless-ng"
+21 -13
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-05 22:05+0200\n"
"PO-Revision-Date: 2021-04-05 21:31\n"
"POT-Creation-Date: 2021-05-04 15:00+0000\n"
"PO-Revision-Date: 2021-05-05 18:07\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
@@ -412,50 +412,58 @@ msgstr "Palavra-passe"
msgid "Sign in"
msgstr "Iniciar sessão"
#: paperless/settings.py:298
#: paperless/settings.py:300
msgid "English (US)"
msgstr "Inglês (EUA)"
#: paperless/settings.py:299
#: paperless/settings.py:301
msgid "English (GB)"
msgstr "English (GB)"
#: paperless/settings.py:300
#: paperless/settings.py:302
msgid "German"
msgstr "Deutsch"
#: paperless/settings.py:301
#: paperless/settings.py:303
msgid "Dutch"
msgstr "Nederlandse"
#: paperless/settings.py:302
#: paperless/settings.py:304
msgid "French"
msgstr "Français"
#: paperless/settings.py:303
#: paperless/settings.py:305
msgid "Portuguese (Brazil)"
msgstr "Português (Brasil)"
#: paperless/settings.py:304
#: paperless/settings.py:306
msgid "Portuguese"
msgstr "Português"
#: paperless/settings.py:305
#: paperless/settings.py:307
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:306
#: paperless/settings.py:308
msgid "Romanian"
msgstr "Romeno"
#: paperless/settings.py:307
#: paperless/settings.py:309
msgid "Russian"
msgstr "Russo"
#: paperless/settings.py:308
#: paperless/settings.py:310
msgid "Spanish"
msgstr "Espanhol"
#: paperless/settings.py:311
msgid "Polish"
msgstr "Polaco"
#: paperless/settings.py:312
msgid "Swedish"
msgstr "Sueco"
#: paperless/urls.py:113
msgid "Paperless-ng administration"
msgstr "Administração do Paperless-ng"
Loaded 100 of 109 files, more files were not shown because too many files have changed in this diff. Show more