mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-07-28 18:24:38 -05:00
Merge remote-tracking branch 'paperless/dev' into feature-consume-eml
This commit is contained in:
@@ -10,12 +10,10 @@ from typing import Tuple
|
||||
import magic
|
||||
from django.conf import settings
|
||||
from pdf2image import convert_from_path
|
||||
from pdf2image.exceptions import PDFPageCountError
|
||||
from pikepdf import Page
|
||||
from pikepdf import PasswordError
|
||||
from pikepdf import Pdf
|
||||
from pikepdf import PdfImage
|
||||
from pikepdf.models.image import HifiPrintImageNotTranscodableError
|
||||
from PIL import Image
|
||||
from PIL import ImageSequence
|
||||
from pyzbar import pyzbar
|
||||
@@ -101,7 +99,7 @@ def convert_from_tiff_to_pdf(filepath: str) -> str:
|
||||
images[0].save(newpath)
|
||||
else:
|
||||
images[0].save(newpath, save_all=True, append_images=images[1:])
|
||||
except OSError as e:
|
||||
except OSError as e: # pragma: no cover
|
||||
logger.warning(
|
||||
f"Could not save the file as pdf. Error: {str(e)}",
|
||||
)
|
||||
@@ -122,13 +120,16 @@ def scan_file_for_separating_barcodes(filepath: str) -> Tuple[Optional[str], Lis
|
||||
for image_key in page.images:
|
||||
pdfimage = PdfImage(page.images[image_key])
|
||||
|
||||
# This type is known to have issues:
|
||||
# https://github.com/pikepdf/pikepdf/issues/401
|
||||
if "/CCITTFaxDecode" in pdfimage.filters:
|
||||
raise BarcodeImageFormatError(
|
||||
"Unable to decode CCITTFaxDecode images",
|
||||
)
|
||||
|
||||
# Not all images can be transcoded to a PIL image, which
|
||||
# is what pyzbar expects to receive
|
||||
# is what pyzbar expects to receive, so this may
|
||||
# raise an exception, triggering fallback
|
||||
pillow_img = pdfimage.as_pil_image()
|
||||
|
||||
detected_barcodes = barcode_reader(pillow_img)
|
||||
@@ -155,29 +156,23 @@ def scan_file_for_separating_barcodes(filepath: str) -> Tuple[Optional[str], Lis
|
||||
if mime_type == "image/tiff":
|
||||
pdf_filepath = convert_from_tiff_to_pdf(filepath)
|
||||
|
||||
# Chose the scanner
|
||||
if settings.CONSUMER_USE_LEGACY_DETECTION:
|
||||
logger.debug("Using pdf2image for barcodes")
|
||||
scanner_function = _pdf2image_barcode_scan
|
||||
else:
|
||||
logger.debug("Using pikepdf for barcodes")
|
||||
scanner_function = _pikepdf_barcode_scan
|
||||
|
||||
# Run the scanner
|
||||
# Always try pikepdf first, it's usually fine, faster and
|
||||
# uses less memory
|
||||
try:
|
||||
scanner_function(pdf_filepath)
|
||||
# Neither method can handle password protected PDFs without it being
|
||||
# provided. Log it and continue
|
||||
except (PasswordError, PDFPageCountError) as e:
|
||||
_pikepdf_barcode_scan(pdf_filepath)
|
||||
# Password protected files can't be checked
|
||||
except PasswordError as e:
|
||||
logger.warning(
|
||||
f"File is likely password protected, not splitting: {e}",
|
||||
f"File is likely password protected, not checking for barcodes: {e}",
|
||||
)
|
||||
# Handle pikepdf related image decoding issues with a fallback
|
||||
except (BarcodeImageFormatError, HifiPrintImageNotTranscodableError) as e:
|
||||
# Handle pikepdf related image decoding issues with a fallback to page
|
||||
# by page conversion to images in a temporary directory
|
||||
except Exception as e:
|
||||
logger.warning(
|
||||
f"Falling back to pdf2image because: {e}",
|
||||
)
|
||||
try:
|
||||
# Clear the list in case some processing worked
|
||||
separator_page_numbers = []
|
||||
_pdf2image_barcode_scan(pdf_filepath)
|
||||
# This file is really borked, allow the consumption to continue
|
||||
@@ -186,11 +181,6 @@ def scan_file_for_separating_barcodes(filepath: str) -> Tuple[Optional[str], Lis
|
||||
logger.warning(
|
||||
f"Exception during barcode scanning: {e}",
|
||||
)
|
||||
# We're not sure what happened, but allow the consumption to continue
|
||||
except Exception as e: # pragma: no cover
|
||||
logger.warning(
|
||||
f"Exception during barcode scanning: {e}",
|
||||
)
|
||||
|
||||
else:
|
||||
logger.warning(
|
||||
|
@@ -94,7 +94,7 @@ def _consume(filepath):
|
||||
logger.info(f"Adding {filepath} to the task queue.")
|
||||
consume_file.delay(
|
||||
filepath,
|
||||
override_tag_ids=tag_ids if tag_ids else None,
|
||||
override_tag_ids=list(tag_ids) if tag_ids else None,
|
||||
)
|
||||
except Exception:
|
||||
# Catch all so that the consumer won't crash.
|
||||
|
@@ -468,41 +468,6 @@ class TestBarcode(DirectoriesMixin, TestCase):
|
||||
self.assertTrue(os.path.isfile(target_file1))
|
||||
self.assertTrue(os.path.isfile(target_file2))
|
||||
|
||||
@override_settings(CONSUMER_USE_LEGACY_DETECTION=True)
|
||||
def test_barcode_splitter_legacy_fallback(self):
|
||||
"""
|
||||
GIVEN:
|
||||
- File containing barcode
|
||||
- Legacy method of detection is enabled
|
||||
WHEN:
|
||||
- File is scanned for barcodes
|
||||
THEN:
|
||||
- Barcodes are properly detected
|
||||
"""
|
||||
test_file = os.path.join(
|
||||
self.BARCODE_SAMPLE_DIR,
|
||||
"patch-code-t-middle.pdf",
|
||||
)
|
||||
tempdir = tempfile.mkdtemp(prefix="paperless-", dir=settings.SCRATCH_DIR)
|
||||
|
||||
pdf_file, separator_page_numbers = barcodes.scan_file_for_separating_barcodes(
|
||||
test_file,
|
||||
)
|
||||
|
||||
self.assertEqual(test_file, pdf_file)
|
||||
self.assertTrue(len(separator_page_numbers) > 0)
|
||||
|
||||
document_list = barcodes.separate_pages(test_file, separator_page_numbers)
|
||||
self.assertTrue(document_list)
|
||||
for document in document_list:
|
||||
barcodes.save_to_dir(document, target_dir=tempdir)
|
||||
|
||||
target_file1 = os.path.join(tempdir, "patch-code-t-middle_document_0.pdf")
|
||||
target_file2 = os.path.join(tempdir, "patch-code-t-middle_document_1.pdf")
|
||||
|
||||
self.assertTrue(os.path.isfile(target_file1))
|
||||
self.assertTrue(os.path.isfile(target_file2))
|
||||
|
||||
@override_settings(CONSUMER_ENABLE_BARCODES=True)
|
||||
def test_consume_barcode_file(self):
|
||||
test_file = os.path.join(
|
||||
@@ -586,7 +551,7 @@ class TestBarcode(DirectoriesMixin, TestCase):
|
||||
with mock.patch("documents.tasks.async_to_sync"):
|
||||
self.assertEqual(tasks.consume_file(dst), "File successfully split")
|
||||
|
||||
def test_scan_file_for_separating_barcodes_password_pikepdf(self):
|
||||
def test_scan_file_for_separating_barcodes_password(self):
|
||||
"""
|
||||
GIVEN:
|
||||
- Password protected PDF
|
||||
@@ -603,22 +568,3 @@ class TestBarcode(DirectoriesMixin, TestCase):
|
||||
|
||||
self.assertEqual(pdf_file, test_file)
|
||||
self.assertListEqual(separator_page_numbers, [])
|
||||
|
||||
@override_settings(CONSUMER_USE_LEGACY_DETECTION=True)
|
||||
def test_scan_file_for_separating_barcodes_password_pdf2image(self):
|
||||
"""
|
||||
GIVEN:
|
||||
- Password protected PDF
|
||||
- pdf2image based scanning
|
||||
WHEN:
|
||||
- File is scanned for barcode
|
||||
THEN:
|
||||
- Scanning handle the exception without exception
|
||||
"""
|
||||
test_file = os.path.join(self.SAMPLE_DIR, "password-is-test.pdf")
|
||||
pdf_file, separator_page_numbers = barcodes.scan_file_for_separating_barcodes(
|
||||
test_file,
|
||||
)
|
||||
|
||||
self.assertEqual(pdf_file, test_file)
|
||||
self.assertListEqual(separator_page_numbers, [])
|
||||
|
@@ -3,7 +3,7 @@ msgstr ""
|
||||
"Project-Id-Version: paperless-ngx\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-08 14:11-0700\n"
|
||||
"PO-Revision-Date: 2022-07-08 22:07\n"
|
||||
"PO-Revision-Date: 2022-10-20 23:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Arabic, Arabic\n"
|
||||
"Language: ar_AR\n"
|
||||
|
@@ -3,7 +3,7 @@ msgstr ""
|
||||
"Project-Id-Version: paperless-ngx\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-08 14:11-0700\n"
|
||||
"PO-Revision-Date: 2022-07-29 20:44\n"
|
||||
"PO-Revision-Date: 2022-10-16 13:46\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Belarusian\n"
|
||||
"Language: be_BY\n"
|
||||
@@ -104,11 +104,11 @@ msgstr "шлях"
|
||||
|
||||
#: documents/models.py:96 documents/models.py:124
|
||||
msgid "storage path"
|
||||
msgstr ""
|
||||
msgstr "шлях захоўвання"
|
||||
|
||||
#: documents/models.py:97
|
||||
msgid "storage paths"
|
||||
msgstr ""
|
||||
msgstr "шляхі захоўвання"
|
||||
|
||||
#: documents/models.py:105
|
||||
msgid "Unencrypted"
|
||||
@@ -376,7 +376,7 @@ msgstr "правілы фільтрацыі"
|
||||
|
||||
#: documents/models.py:521
|
||||
msgid "started"
|
||||
msgstr ""
|
||||
msgstr "пачата"
|
||||
|
||||
#: documents/serialisers.py:70
|
||||
#, python-format
|
||||
@@ -394,7 +394,7 @@ msgstr "Тып файла %(type)s не падтрымліваецца"
|
||||
|
||||
#: documents/serialisers.py:596
|
||||
msgid "Invalid variable detected."
|
||||
msgstr ""
|
||||
msgstr "Выяўлена няправільная зменная."
|
||||
|
||||
#: documents/templates/index.html:78
|
||||
msgid "Paperless-ngx is loading..."
|
||||
@@ -402,11 +402,11 @@ msgstr "Paperless-ngx загружаецца..."
|
||||
|
||||
#: documents/templates/index.html:79
|
||||
msgid "Still here?! Hmm, something might be wrong."
|
||||
msgstr ""
|
||||
msgstr "Яшчэ тут?! Хм, можа нешта не так."
|
||||
|
||||
#: documents/templates/index.html:79
|
||||
msgid "Here's a link to the docs."
|
||||
msgstr ""
|
||||
msgstr "Вось спасылка на дакументы."
|
||||
|
||||
#: documents/templates/registration/logged_out.html:14
|
||||
msgid "Paperless-ngx signed out"
|
||||
@@ -450,7 +450,7 @@ msgstr "Англійская (ЗША)"
|
||||
|
||||
#: paperless/settings.py:340
|
||||
msgid "Belarusian"
|
||||
msgstr ""
|
||||
msgstr "Беларуская"
|
||||
|
||||
#: paperless/settings.py:341
|
||||
msgid "Czech"
|
||||
@@ -510,11 +510,11 @@ msgstr "Руская"
|
||||
|
||||
#: paperless/settings.py:355
|
||||
msgid "Slovenian"
|
||||
msgstr ""
|
||||
msgstr "Славенская"
|
||||
|
||||
#: paperless/settings.py:356
|
||||
msgid "Serbian"
|
||||
msgstr ""
|
||||
msgstr "Сербская"
|
||||
|
||||
#: paperless/settings.py:357
|
||||
msgid "Swedish"
|
||||
@@ -522,11 +522,11 @@ msgstr "Шведская"
|
||||
|
||||
#: paperless/settings.py:358
|
||||
msgid "Turkish"
|
||||
msgstr ""
|
||||
msgstr "Турэцкая"
|
||||
|
||||
#: paperless/settings.py:359
|
||||
msgid "Chinese Simplified"
|
||||
msgstr ""
|
||||
msgstr "Кітайская спрошчаная"
|
||||
|
||||
#: paperless/urls.py:161
|
||||
msgid "Paperless-ngx administration"
|
||||
@@ -654,7 +654,7 @@ msgstr "Пазначыць пошту, не апрацоўваць пазнач
|
||||
|
||||
#: paperless_mail/models.py:68
|
||||
msgid "Tag the mail with specified tag, don't process tagged mails"
|
||||
msgstr ""
|
||||
msgstr "Пазначце ліст указаным тэгам, не апрацоўвайце пазначаныя лісты"
|
||||
|
||||
#: paperless_mail/models.py:71
|
||||
msgid "Use subject as title"
|
||||
@@ -694,7 +694,7 @@ msgstr "каталог"
|
||||
|
||||
#: paperless_mail/models.py:96
|
||||
msgid "Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server."
|
||||
msgstr ""
|
||||
msgstr "Укладзеныя папкі павінны быць падзеленыя падзельнікам, часта кропкай ('.') або касой рысай ('/'), але гэта адрозніваецца ў залежнасці ад паштовага сервера."
|
||||
|
||||
#: paperless_mail/models.py:102
|
||||
msgid "filter from"
|
||||
|
@@ -3,7 +3,7 @@ msgstr ""
|
||||
"Project-Id-Version: paperless-ngx\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-08 14:11-0700\n"
|
||||
"PO-Revision-Date: 2022-07-08 22:07\n"
|
||||
"PO-Revision-Date: 2022-10-18 20:06\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Czech\n"
|
||||
"Language: cs_CZ\n"
|
||||
@@ -84,7 +84,7 @@ msgstr "Označí tento tag jako tag pro příchozí: Všechny nově zkonzumovan
|
||||
|
||||
#: documents/models.py:78
|
||||
msgid "tag"
|
||||
msgstr ""
|
||||
msgstr "tagy"
|
||||
|
||||
#: documents/models.py:79 documents/models.py:153
|
||||
msgid "tags"
|
||||
@@ -100,15 +100,15 @@ msgstr "typy dokumentu"
|
||||
|
||||
#: documents/models.py:90
|
||||
msgid "path"
|
||||
msgstr ""
|
||||
msgstr "cesta"
|
||||
|
||||
#: documents/models.py:96 documents/models.py:124
|
||||
msgid "storage path"
|
||||
msgstr ""
|
||||
msgstr "cesta k úložišti"
|
||||
|
||||
#: documents/models.py:97
|
||||
msgid "storage paths"
|
||||
msgstr ""
|
||||
msgstr "cesta k úložišti"
|
||||
|
||||
#: documents/models.py:105
|
||||
msgid "Unencrypted"
|
||||
@@ -200,7 +200,7 @@ msgstr "dokumenty"
|
||||
|
||||
#: documents/models.py:318
|
||||
msgid "debug"
|
||||
msgstr ""
|
||||
msgstr "ladění"
|
||||
|
||||
#: documents/models.py:319
|
||||
msgid "information"
|
||||
@@ -356,7 +356,7 @@ msgstr "Podobné"
|
||||
|
||||
#: documents/models.py:396
|
||||
msgid "has tags in"
|
||||
msgstr ""
|
||||
msgstr "má značky v"
|
||||
|
||||
#: documents/models.py:406
|
||||
msgid "rule type"
|
||||
@@ -376,7 +376,7 @@ msgstr "filtrovací pravidla"
|
||||
|
||||
#: documents/models.py:521
|
||||
msgid "started"
|
||||
msgstr ""
|
||||
msgstr "zahájeno"
|
||||
|
||||
#: documents/serialisers.py:70
|
||||
#, python-format
|
||||
@@ -394,23 +394,23 @@ msgstr "Typ souboru %(type)s není podporován"
|
||||
|
||||
#: documents/serialisers.py:596
|
||||
msgid "Invalid variable detected."
|
||||
msgstr ""
|
||||
msgstr "Zjištěna neplatná proměnná."
|
||||
|
||||
#: documents/templates/index.html:78
|
||||
msgid "Paperless-ngx is loading..."
|
||||
msgstr ""
|
||||
msgstr "Paperless-ngx se načítá..."
|
||||
|
||||
#: documents/templates/index.html:79
|
||||
msgid "Still here?! Hmm, something might be wrong."
|
||||
msgstr ""
|
||||
msgstr "Stále tady?! Hmm, možná se něco pokazilo."
|
||||
|
||||
#: documents/templates/index.html:79
|
||||
msgid "Here's a link to the docs."
|
||||
msgstr ""
|
||||
msgstr "Zde je odkaz na dokumenty."
|
||||
|
||||
#: documents/templates/registration/logged_out.html:14
|
||||
msgid "Paperless-ngx signed out"
|
||||
msgstr ""
|
||||
msgstr "Odhlášeno z Paperless-ngx"
|
||||
|
||||
#: documents/templates/registration/logged_out.html:59
|
||||
msgid "You have been successfully logged out. Bye!"
|
||||
@@ -422,7 +422,7 @@ msgstr "Přihlašte se znovu"
|
||||
|
||||
#: documents/templates/registration/login.html:15
|
||||
msgid "Paperless-ngx sign in"
|
||||
msgstr ""
|
||||
msgstr "Paperless-ngx přihlášení"
|
||||
|
||||
#: documents/templates/registration/login.html:61
|
||||
msgid "Please sign in."
|
||||
@@ -450,15 +450,15 @@ msgstr "Angličtina (US)"
|
||||
|
||||
#: paperless/settings.py:340
|
||||
msgid "Belarusian"
|
||||
msgstr ""
|
||||
msgstr "Běloruština"
|
||||
|
||||
#: paperless/settings.py:341
|
||||
msgid "Czech"
|
||||
msgstr ""
|
||||
msgstr "Čeština"
|
||||
|
||||
#: paperless/settings.py:342
|
||||
msgid "Danish"
|
||||
msgstr ""
|
||||
msgstr "Dánština"
|
||||
|
||||
#: paperless/settings.py:343
|
||||
msgid "German"
|
||||
@@ -482,7 +482,7 @@ msgstr "Italština"
|
||||
|
||||
#: paperless/settings.py:348
|
||||
msgid "Luxembourgish"
|
||||
msgstr ""
|
||||
msgstr "Lucemburština"
|
||||
|
||||
#: paperless/settings.py:349
|
||||
msgid "Dutch"
|
||||
@@ -510,11 +510,11 @@ msgstr "Ruština"
|
||||
|
||||
#: paperless/settings.py:355
|
||||
msgid "Slovenian"
|
||||
msgstr ""
|
||||
msgstr "Slovinština"
|
||||
|
||||
#: paperless/settings.py:356
|
||||
msgid "Serbian"
|
||||
msgstr ""
|
||||
msgstr "Srbština"
|
||||
|
||||
#: paperless/settings.py:357
|
||||
msgid "Swedish"
|
||||
@@ -522,15 +522,15 @@ msgstr "Švédština"
|
||||
|
||||
#: paperless/settings.py:358
|
||||
msgid "Turkish"
|
||||
msgstr ""
|
||||
msgstr "Turečtina"
|
||||
|
||||
#: paperless/settings.py:359
|
||||
msgid "Chinese Simplified"
|
||||
msgstr ""
|
||||
msgstr "Čínština (zjednodušená)"
|
||||
|
||||
#: paperless/urls.py:161
|
||||
msgid "Paperless-ngx administration"
|
||||
msgstr ""
|
||||
msgstr "Správa Paperless-ngx"
|
||||
|
||||
#: paperless_mail/admin.py:29
|
||||
msgid "Authentication"
|
||||
@@ -558,7 +558,7 @@ msgstr "Akce provedena na emailu. Tato akce je provedena jen pokud byly dokument
|
||||
|
||||
#: paperless_mail/admin.py:75
|
||||
msgid "Metadata"
|
||||
msgstr ""
|
||||
msgstr "Metadata"
|
||||
|
||||
#: paperless_mail/admin.py:78
|
||||
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."
|
||||
@@ -590,11 +590,11 @@ msgstr "Používat STARTTLS"
|
||||
|
||||
#: paperless_mail/models.py:18
|
||||
msgid "IMAP server"
|
||||
msgstr ""
|
||||
msgstr "IMAP server"
|
||||
|
||||
#: paperless_mail/models.py:21
|
||||
msgid "IMAP port"
|
||||
msgstr ""
|
||||
msgstr "IMAP port"
|
||||
|
||||
#: paperless_mail/models.py:25
|
||||
msgid "This is usually 143 for unencrypted and STARTTLS connections, and 993 for SSL connections."
|
||||
@@ -654,7 +654,7 @@ msgstr "Označit email, nezpracovávat označené emaily"
|
||||
|
||||
#: paperless_mail/models.py:68
|
||||
msgid "Tag the mail with specified tag, don't process tagged mails"
|
||||
msgstr ""
|
||||
msgstr "Označit e-mail zadaným štítkem, nezpracovávat označené e-maily"
|
||||
|
||||
#: paperless_mail/models.py:71
|
||||
msgid "Use subject as title"
|
||||
@@ -694,7 +694,7 @@ msgstr "složka"
|
||||
|
||||
#: paperless_mail/models.py:96
|
||||
msgid "Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server."
|
||||
msgstr ""
|
||||
msgstr "Podsložky musí být odděleny oddělovačem, nejčastěji tečkou ('.') nebo lomítkem ('/'), ale závisí to na e-mailovém serveru."
|
||||
|
||||
#: paperless_mail/models.py:102
|
||||
msgid "filter from"
|
||||
|
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: paperless-ngx\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-08 14:11-0700\n"
|
||||
"POT-Creation-Date: 2022-11-09 21:50+0000\n"
|
||||
"PO-Revision-Date: 2022-02-17 04:17\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: English\n"
|
||||
@@ -21,382 +21,494 @@ msgstr ""
|
||||
msgid "Documents"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:29
|
||||
#: documents/models.py:32
|
||||
msgid "Any word"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:30
|
||||
#: documents/models.py:33
|
||||
msgid "All words"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:31
|
||||
#: documents/models.py:34
|
||||
msgid "Exact match"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:32
|
||||
#: documents/models.py:35
|
||||
msgid "Regular expression"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:33
|
||||
#: documents/models.py:36
|
||||
msgid "Fuzzy word"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:34
|
||||
#: documents/models.py:37
|
||||
msgid "Automatic"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:37 documents/models.py:354 paperless_mail/models.py:16
|
||||
#: documents/models.py:40 documents/models.py:367 paperless_mail/models.py:16
|
||||
#: paperless_mail/models.py:80
|
||||
msgid "name"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:39
|
||||
#: documents/models.py:42
|
||||
msgid "match"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:42
|
||||
#: documents/models.py:45
|
||||
msgid "matching algorithm"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:47
|
||||
#: documents/models.py:50
|
||||
msgid "is insensitive"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:60 documents/models.py:115
|
||||
#: documents/models.py:63 documents/models.py:118
|
||||
msgid "correspondent"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:61
|
||||
#: documents/models.py:64
|
||||
msgid "correspondents"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:66
|
||||
#: documents/models.py:69
|
||||
msgid "color"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:69
|
||||
#: documents/models.py:72
|
||||
msgid "is inbox tag"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:72
|
||||
#: documents/models.py:75
|
||||
msgid ""
|
||||
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
||||
"with inbox tags."
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:78
|
||||
#: documents/models.py:81
|
||||
msgid "tag"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:79 documents/models.py:153
|
||||
#: documents/models.py:82 documents/models.py:156
|
||||
msgid "tags"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:84 documents/models.py:135
|
||||
#: documents/models.py:87 documents/models.py:138
|
||||
msgid "document type"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:85
|
||||
#: documents/models.py:88
|
||||
msgid "document types"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:90
|
||||
#: documents/models.py:93
|
||||
msgid "path"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:96 documents/models.py:124
|
||||
#: documents/models.py:99 documents/models.py:127
|
||||
msgid "storage path"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:97
|
||||
#: documents/models.py:100
|
||||
msgid "storage paths"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:105
|
||||
#: documents/models.py:108
|
||||
msgid "Unencrypted"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:106
|
||||
#: documents/models.py:109
|
||||
msgid "Encrypted with GNU Privacy Guard"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:127
|
||||
#: documents/models.py:130
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:139
|
||||
#: documents/models.py:142 documents/models.py:611
|
||||
msgid "content"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:142
|
||||
#: documents/models.py:145
|
||||
msgid ""
|
||||
"The raw, text-only data of the document. This field is primarily used for "
|
||||
"searching."
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:147
|
||||
#: documents/models.py:150
|
||||
msgid "mime type"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:157
|
||||
#: documents/models.py:160
|
||||
msgid "checksum"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:161
|
||||
#: documents/models.py:164
|
||||
msgid "The checksum of the original document."
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:165
|
||||
#: documents/models.py:168
|
||||
msgid "archive checksum"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:170
|
||||
#: documents/models.py:173
|
||||
msgid "The checksum of the archived document."
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:173 documents/models.py:335 documents/models.py:520
|
||||
#: documents/models.py:176 documents/models.py:348 documents/models.py:617
|
||||
msgid "created"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:176
|
||||
#: documents/models.py:179
|
||||
msgid "modified"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:183
|
||||
#: documents/models.py:186
|
||||
msgid "storage type"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:191
|
||||
#: documents/models.py:194
|
||||
msgid "added"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:198
|
||||
#: documents/models.py:201
|
||||
msgid "filename"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:204
|
||||
#: documents/models.py:207
|
||||
msgid "Current filename in storage"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:208
|
||||
#: documents/models.py:211
|
||||
msgid "archive filename"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:214
|
||||
#: documents/models.py:217
|
||||
msgid "Current archive filename in storage"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:218
|
||||
msgid "archive serial number"
|
||||
#: documents/models.py:221
|
||||
msgid "original filename"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:224
|
||||
msgid "The position of this document in your physical document archive."
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:230
|
||||
msgid "document"
|
||||
#: documents/models.py:227
|
||||
msgid "The original name of the file when it was uploaded"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:231
|
||||
msgid "archive serial number"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:237
|
||||
msgid "The position of this document in your physical document archive."
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:243 documents/models.py:628
|
||||
msgid "document"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:244
|
||||
msgid "documents"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:318
|
||||
#: documents/models.py:331
|
||||
msgid "debug"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:319
|
||||
#: documents/models.py:332
|
||||
msgid "information"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:320
|
||||
#: documents/models.py:333
|
||||
msgid "warning"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:321
|
||||
#: documents/models.py:334
|
||||
msgid "error"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:322
|
||||
#: documents/models.py:335
|
||||
msgid "critical"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:325
|
||||
#: documents/models.py:338
|
||||
msgid "group"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:327
|
||||
#: documents/models.py:340
|
||||
msgid "message"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:330
|
||||
#: documents/models.py:343
|
||||
msgid "level"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:339
|
||||
#: documents/models.py:352
|
||||
msgid "log"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:340
|
||||
#: documents/models.py:353
|
||||
msgid "logs"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:350 documents/models.py:403
|
||||
#: documents/models.py:363 documents/models.py:419
|
||||
msgid "saved view"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:351
|
||||
#: documents/models.py:364
|
||||
msgid "saved views"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:353
|
||||
#: documents/models.py:366 documents/models.py:637
|
||||
msgid "user"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:357
|
||||
#: documents/models.py:370
|
||||
msgid "show on dashboard"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:360
|
||||
#: documents/models.py:373
|
||||
msgid "show in sidebar"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:364
|
||||
#: documents/models.py:377
|
||||
msgid "sort field"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:369
|
||||
#: documents/models.py:382
|
||||
msgid "sort reverse"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:374
|
||||
#: documents/models.py:387
|
||||
msgid "title contains"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:375
|
||||
#: documents/models.py:388
|
||||
msgid "content contains"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:376
|
||||
#: documents/models.py:389
|
||||
msgid "ASN is"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:377
|
||||
#: documents/models.py:390
|
||||
msgid "correspondent is"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:378
|
||||
#: documents/models.py:391
|
||||
msgid "document type is"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:379
|
||||
#: documents/models.py:392
|
||||
msgid "is in inbox"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:380
|
||||
#: documents/models.py:393
|
||||
msgid "has tag"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:381
|
||||
#: documents/models.py:394
|
||||
msgid "has any tag"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:382
|
||||
#: documents/models.py:395
|
||||
msgid "created before"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:383
|
||||
#: documents/models.py:396
|
||||
msgid "created after"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:384
|
||||
#: documents/models.py:397
|
||||
msgid "created year is"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:385
|
||||
#: documents/models.py:398
|
||||
msgid "created month is"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:386
|
||||
#: documents/models.py:399
|
||||
msgid "created day is"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:387
|
||||
#: documents/models.py:400
|
||||
msgid "added before"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:388
|
||||
#: documents/models.py:401
|
||||
msgid "added after"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:389
|
||||
#: documents/models.py:402
|
||||
msgid "modified before"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:390
|
||||
#: documents/models.py:403
|
||||
msgid "modified after"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:391
|
||||
#: documents/models.py:404
|
||||
msgid "does not have tag"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:392
|
||||
#: documents/models.py:405
|
||||
msgid "does not have ASN"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:393
|
||||
#: documents/models.py:406
|
||||
msgid "title or content contains"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:394
|
||||
#: documents/models.py:407
|
||||
msgid "fulltext query"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:395
|
||||
#: documents/models.py:408
|
||||
msgid "more like this"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:396
|
||||
#: documents/models.py:409
|
||||
msgid "has tags in"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:406
|
||||
msgid "rule type"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:408
|
||||
msgid "value"
|
||||
#: documents/models.py:410
|
||||
msgid "ASN greater than"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:411
|
||||
msgid "filter rule"
|
||||
msgid "ASN less than"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:412
|
||||
msgid "storage path is"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:422
|
||||
msgid "rule type"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:424
|
||||
msgid "value"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:427
|
||||
msgid "filter rule"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:428
|
||||
msgid "filter rules"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:521
|
||||
msgid "started"
|
||||
#: documents/models.py:536
|
||||
msgid "Task ID"
|
||||
msgstr ""
|
||||
|
||||
#: documents/serialisers.py:70
|
||||
#: documents/models.py:537
|
||||
msgid "Celery ID for the Task that was run"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:542
|
||||
msgid "Acknowledged"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:543
|
||||
msgid "If the task is acknowledged via the frontend or API"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:549 documents/models.py:556
|
||||
msgid "Task Name"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:550
|
||||
msgid "Name of the file which the Task was run for"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:557
|
||||
msgid "Name of the Task which was run"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:562
|
||||
msgid "Task Positional Arguments"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:564
|
||||
msgid "JSON representation of the positional arguments used with the task"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:569
|
||||
msgid "Task Named Arguments"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:571
|
||||
msgid "JSON representation of the named arguments used with the task"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:578
|
||||
msgid "Task State"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:579
|
||||
msgid "Current state of the task being run"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:584
|
||||
msgid "Created DateTime"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:585
|
||||
msgid "Datetime field when the task result was created in UTC"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:590
|
||||
msgid "Started DateTime"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:591
|
||||
msgid "Datetime field when the task was started in UTC"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:596
|
||||
msgid "Completed DateTime"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:597
|
||||
msgid "Datetime field when the task was completed in UTC"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:602
|
||||
msgid "Result Data"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:604
|
||||
msgid "The data returned by the task"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:613
|
||||
msgid "Comment for the document"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:642
|
||||
msgid "comment"
|
||||
msgstr ""
|
||||
|
||||
#: documents/models.py:643
|
||||
msgid "comments"
|
||||
msgstr ""
|
||||
|
||||
#: documents/serialisers.py:72
|
||||
#, python-format
|
||||
msgid "Invalid regular expression: %(error)s"
|
||||
msgstr ""
|
||||
|
||||
#: documents/serialisers.py:191
|
||||
#: documents/serialisers.py:193
|
||||
msgid "Invalid color."
|
||||
msgstr ""
|
||||
|
||||
#: documents/serialisers.py:515
|
||||
#: documents/serialisers.py:518
|
||||
#, python-format
|
||||
msgid "File type %(type)s not supported"
|
||||
msgstr ""
|
||||
|
||||
#: documents/serialisers.py:596
|
||||
#: documents/serialisers.py:599
|
||||
msgid "Invalid variable detected."
|
||||
msgstr ""
|
||||
|
||||
@@ -448,87 +560,87 @@ msgstr ""
|
||||
msgid "Sign in"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:339
|
||||
#: paperless/settings.py:378
|
||||
msgid "English (US)"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:340
|
||||
#: paperless/settings.py:379
|
||||
msgid "Belarusian"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:341
|
||||
#: paperless/settings.py:380
|
||||
msgid "Czech"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:342
|
||||
#: paperless/settings.py:381
|
||||
msgid "Danish"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:343
|
||||
#: paperless/settings.py:382
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:344
|
||||
#: paperless/settings.py:383
|
||||
msgid "English (GB)"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:345
|
||||
#: paperless/settings.py:384
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:346
|
||||
#: paperless/settings.py:385
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:347
|
||||
#: paperless/settings.py:386
|
||||
msgid "Italian"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:348
|
||||
#: paperless/settings.py:387
|
||||
msgid "Luxembourgish"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:349
|
||||
#: paperless/settings.py:388
|
||||
msgid "Dutch"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:350
|
||||
#: paperless/settings.py:389
|
||||
msgid "Polish"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:351
|
||||
#: paperless/settings.py:390
|
||||
msgid "Portuguese (Brazil)"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:352
|
||||
#: paperless/settings.py:391
|
||||
msgid "Portuguese"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:353
|
||||
#: paperless/settings.py:392
|
||||
msgid "Romanian"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:354
|
||||
#: paperless/settings.py:393
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:355
|
||||
#: paperless/settings.py:394
|
||||
msgid "Slovenian"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:356
|
||||
#: paperless/settings.py:395
|
||||
msgid "Serbian"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:357
|
||||
#: paperless/settings.py:396
|
||||
msgid "Swedish"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:358
|
||||
#: paperless/settings.py:397
|
||||
msgid "Turkish"
|
||||
msgstr ""
|
||||
|
||||
#: paperless/settings.py:359
|
||||
#: paperless/settings.py:398
|
||||
msgid "Chinese Simplified"
|
||||
msgstr ""
|
||||
|
||||
|
@@ -3,7 +3,7 @@ msgstr ""
|
||||
"Project-Id-Version: paperless-ngx\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-08 14:11-0700\n"
|
||||
"PO-Revision-Date: 2022-08-26 20:54\n"
|
||||
"PO-Revision-Date: 2022-10-27 09:51\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Language: nl_NL\n"
|
||||
@@ -406,7 +406,7 @@ msgstr "Nog steeds hier?! Hmm, er kan iets mis zijn."
|
||||
|
||||
#: documents/templates/index.html:79
|
||||
msgid "Here's a link to the docs."
|
||||
msgstr ""
|
||||
msgstr "Dit is een link naar de documentatie."
|
||||
|
||||
#: documents/templates/registration/logged_out.html:14
|
||||
msgid "Paperless-ngx signed out"
|
||||
|
@@ -573,11 +573,6 @@ CONSUMER_BARCODE_TIFF_SUPPORT: Final[bool] = __get_boolean(
|
||||
"PAPERLESS_CONSUMER_BARCODE_TIFF_SUPPORT",
|
||||
)
|
||||
|
||||
CONSUMER_USE_LEGACY_DETECTION: Final[bool] = __get_boolean(
|
||||
"PAPERLESS_CONSUMER_USE_LEGACY_DETECTION",
|
||||
"NO",
|
||||
)
|
||||
|
||||
CONSUMER_BARCODE_STRING: Final[str] = os.getenv(
|
||||
"PAPERLESS_CONSUMER_BARCODE_STRING",
|
||||
"PATCHT",
|
||||
|
Reference in New Issue
Block a user