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

This commit is contained in:
phail
2022-11-13 22:43:55 +01:00
43 changed files with 14372 additions and 8013 deletions

View File

@@ -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(

View File

@@ -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.

View File

@@ -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, [])

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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",