Compare commits
156
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27ba139810 | ||
|
|
27ff38b79e | ||
|
|
b89b51b121 | ||
|
|
1b31388232 | ||
|
|
8256e73f04 | ||
|
|
fc4e59ec00 | ||
|
|
428e00ba23 | ||
|
|
2ccbb08c3f | ||
|
|
eefc026a17 | ||
|
|
d89022a280 | ||
|
|
93bd24c9d2 | ||
|
|
197aec2945 | ||
|
|
e16d58cff5 | ||
|
|
92667009be | ||
|
|
c93657f40e | ||
|
|
16658f5939 | ||
|
|
ec0af59596 | ||
|
|
9e1f9d6d9d | ||
|
|
e652b927ce | ||
|
|
5a97f3f94b | ||
|
|
9494c243a4 | ||
|
|
c0a1be4325 | ||
|
|
70fda8e2f8 | ||
|
|
5765893f69 | ||
|
|
17b9d7eb42 | ||
|
|
0a897cae32 | ||
|
|
37f56e824a | ||
|
|
a8e7ec0e96 | ||
|
|
b86d853cf1 | ||
|
|
da0c94c9a1 | ||
|
|
0547fd2760 | ||
|
|
e0a6df8435 | ||
|
|
c2d4ca7566 | ||
|
|
56ce278bbd | ||
|
|
e112541f5b | ||
|
|
17c7b0840b | ||
|
|
68658bd407 | ||
|
|
9184845a9d | ||
|
|
8ddb2fb305 | ||
|
|
96f53986b7 | ||
|
|
8566682209 | ||
|
|
4f9ae17059 | ||
|
|
7f9f805c5f | ||
|
|
5208e81715 | ||
|
|
01a786c117 | ||
|
|
8bf4f31954 | ||
|
|
07ab3e98ed | ||
|
|
ba5899de7b | ||
|
|
a4fef056ed | ||
|
|
c266cd6aae | ||
|
|
43d05b2e6d | ||
|
|
6f0c14cc07 | ||
|
|
2eac8fa91c | ||
|
|
31f5e178b3 | ||
|
|
c3d7088168 | ||
|
|
a9e11b1cb7 | ||
|
|
ee51a0be13 | ||
|
|
1091387f48 | ||
|
|
4db75537cb | ||
|
|
cb4e738a0f | ||
|
|
0cc32e7ed7 | ||
|
|
94f90e1e81 | ||
|
|
ce8f315747 | ||
|
|
b761a549c0 | ||
|
|
dd7c5da256 | ||
|
|
02dd7ec615 | ||
|
|
b7b448b870 | ||
|
|
b7326afe5a | ||
|
|
d521d7733b | ||
|
|
99bde7b613 | ||
|
|
cc5b7eb4e3 | ||
|
|
2b4a0efef8 | ||
|
|
9502917df6 | ||
|
|
6f3c72ef9a | ||
|
|
3915149ea1 | ||
|
|
f07fb6e1b3 | ||
|
|
e328c439ff | ||
|
|
caa9a340a4 | ||
|
|
b07537aa9a | ||
|
|
8e35e6c726 | ||
|
|
05a43a05a4 | ||
|
|
846a997323 | ||
|
|
e0231a4638 | ||
|
|
b4db388d58 | ||
|
|
e957d9aa53 | ||
|
|
72031824bf | ||
|
|
ae60fc8c2b | ||
|
|
cc3c7ad481 | ||
|
|
484edce5ab | ||
|
|
66aee1446c | ||
|
|
971392345b | ||
|
|
c5ae3377bd | ||
|
|
4ddd031976 | ||
|
|
c18180f344 | ||
|
|
c07bbcb33f | ||
|
|
142c2ac9ff | ||
|
|
88bf679fd9 | ||
|
|
a5de83fe7f | ||
|
|
63b4c33fb9 | ||
|
|
e0a1ba56dd | ||
|
|
aaa913f204 | ||
|
|
cf5747f0bd | ||
|
|
7df9e1f532 | ||
|
|
38d8b34ab4 | ||
|
|
24d07fcc17 | ||
|
|
14116c85e7 | ||
|
|
20b95fb506 | ||
|
|
3c25595fc2 | ||
|
|
af1034f84b | ||
|
|
cfc0925e04 | ||
|
|
746c03c198 | ||
|
|
baae3c2701 | ||
|
|
d88cd05857 | ||
|
|
73c80c3f7a | ||
|
|
35f9989255 | ||
|
|
33ddd033f2 | ||
|
|
b8fabb623e | ||
|
|
37c0fa4fab | ||
|
|
86ca37909b | ||
|
|
ce19525758 | ||
|
|
bb872ab56f | ||
|
|
ea342831da | ||
|
|
8d0ac690fb | ||
|
|
e0f14941e8 | ||
|
|
7cbb50565c | ||
|
|
274df28f39 | ||
|
|
4a6160869c | ||
|
|
87d969f44c | ||
|
|
7746ab4522 | ||
|
|
58cb42b44a | ||
|
|
8e330fc97a | ||
|
|
6a3ad77950 | ||
|
|
e3ba968fef | ||
|
|
3d56621253 | ||
|
|
9e6cb1b868 | ||
|
|
321fad0564 | ||
|
|
eb7b767e35 | ||
|
|
98b26b8e16 | ||
|
|
176d1fa2eb | ||
|
|
072134366c | ||
|
|
afd92af168 | ||
|
|
2d61698509 | ||
|
|
5e286798d5 | ||
|
|
b7a825301a | ||
|
|
02da012603 | ||
|
|
4d99e72a0e | ||
|
|
26c0568b1e | ||
|
|
aa4d9782b7 | ||
|
|
43ccf6682c | ||
|
|
5e096bc8ce | ||
|
|
1e131f0217 | ||
|
|
321869edb0 | ||
|
|
c6e8faa718 | ||
|
|
6696c4d7a5 | ||
|
|
88254bdb79 | ||
|
|
4cc6bf889e |
No files matched your search
+18
-13
@@ -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"]
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Executable
+72
@@ -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,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
@@ -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 "$@"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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">
|
||||
|
||||
Generated
+15
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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> <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> <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">×</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">×</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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-5
@@ -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> <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> <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> <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"])
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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>
|
||||
|
||||
+3
-3
@@ -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()">
|
||||
|
||||
+7
-4
@@ -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> <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> <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">×</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> <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> <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"> <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"> <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"> <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
|
||||
|
||||
@@ -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}/`
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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:")
|
||||
};
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 => t.id == +rule.value)?.name"/></target>
|
||||
<target state="translated">Label: <x id="PH" equiv-text="this.tags.find(t => 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 & 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 "<x id="PH" equiv-text="tag.name"/>" 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 "<x id="PH" equiv-text="tag.name"/>" 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
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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>
|
||||
|
||||
@@ -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 "<x id="PH" equiv-text="this.document.title"/>"?</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 & 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 & 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
@@ -4,4 +4,13 @@ $primaryFaded: #d1ddd2;
|
||||
|
||||
$theme-colors: (
|
||||
"primary": $primary
|
||||
);
|
||||
);
|
||||
|
||||
.bg-body {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.alert-heading {
|
||||
font-size: 80%;
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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.')
|
||||
@@ -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]
|
||||
@@ -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
|
||||
@@ -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}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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.")
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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")
|
||||
@@ -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
@@ -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])
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
Reference in new issue
Block a user