Merge branch 'dev' into feature-unified-search

This commit is contained in:
jonaswinkler
2021-04-03 20:31:16 +02:00
59 changed files with 1160 additions and 957 deletions

View File

@@ -64,9 +64,9 @@ class Consumer(LoggingMixin):
{'type': 'status_update',
'data': payload})
def _fail(self, message, log_message=None):
def _fail(self, message, log_message=None, exc_info=None):
self._send_progress(100, 100, 'FAILED', message)
self.log("error", log_message or message)
self.log("error", log_message or message, exc_info=exc_info)
raise ConsumerError(f"{self.filename}: {log_message or message}")
def __init__(self):
@@ -120,7 +120,8 @@ class Consumer(LoggingMixin):
except Exception as e:
self._fail(
MESSAGE_PRE_CONSUME_SCRIPT_ERROR,
f"Error while executing pre-consume script: {e}"
f"Error while executing pre-consume script: {e}",
exc_info=True
)
def run_post_consume_script(self, document):
@@ -150,7 +151,8 @@ class Consumer(LoggingMixin):
except Exception as e:
self._fail(
MESSAGE_POST_CONSUME_SCRIPT_ERROR,
f"Error while executing post-consume script: {e}"
f"Error while executing post-consume script: {e}",
exc_info=True
)
def try_consume_file(self,
@@ -255,7 +257,8 @@ class Consumer(LoggingMixin):
document_parser.cleanup()
self._fail(
str(e),
f"Error while consuming document {self.filename}: {e}"
f"Error while consuming document {self.filename}: {e}",
exc_info=True
)
# Prepare the document classifier.
@@ -326,7 +329,8 @@ class Consumer(LoggingMixin):
self._fail(
str(e),
f"The following error occured while consuming "
f"{self.filename}: {e}"
f"{self.filename}: {e}",
exc_info=True
)
finally:
document_parser.cleanup()

View File

@@ -6,15 +6,18 @@ import time
import tqdm
from django.conf import settings
from django.contrib.auth.models import User
from django.core import serializers
from django.core.management.base import BaseCommand, CommandError
from django.db import transaction
from filelock import FileLock
from documents.models import Document, Correspondent, Tag, DocumentType
from documents.models import Document, Correspondent, Tag, DocumentType, \
SavedView, SavedViewFilterRule
from documents.settings import EXPORTER_FILE_NAME, EXPORTER_THUMBNAIL_NAME, \
EXPORTER_ARCHIVE_NAME
from paperless.db import GnuPG
from paperless_mail.models import MailAccount, MailRule
from ...file_handling import generate_filename, delete_empty_directories
@@ -105,6 +108,21 @@ class Command(BaseCommand):
serializers.serialize("json", documents))
manifest += document_manifest
manifest += json.loads(serializers.serialize(
"json", MailAccount.objects.all()))
manifest += json.loads(serializers.serialize(
"json", MailRule.objects.all()))
manifest += json.loads(serializers.serialize(
"json", SavedView.objects.all()))
manifest += json.loads(serializers.serialize(
"json", SavedViewFilterRule.objects.all()))
manifest += json.loads(serializers.serialize(
"json", User.objects.all()))
# 3. Export files from each document
for index, document_dict in tqdm.tqdm(enumerate(document_manifest),
total=len(document_manifest)):

View File

@@ -90,7 +90,7 @@ def matches(matching_model, document):
elif matching_model.matching_algorithm == MatchingModel.MATCH_LITERAL:
result = bool(re.search(
rf"\b{matching_model.match}\b",
rf"\b{re.escape(matching_model.match)}\b",
document_content,
**search_kwargs
))
@@ -161,6 +161,9 @@ def _split_match(matching_model):
findterms = re.compile(r'"([^"]+)"|(\S+)').findall
normspace = re.compile(r"\s+").sub
return [
normspace(" ", (t[0] or t[1]).strip()).replace(" ", r"\s+")
# normspace(" ", (t[0] or t[1]).strip()).replace(" ", r"\s+")
re.escape(
normspace(" ", (t[0] or t[1]).strip())
).replace(r"\ ", r"\s+")
for t in findterms(matching_model.match)
]

View File

@@ -69,7 +69,7 @@ class TestExportImport(DirectoriesMixin, TestCase):
manifest = self._do_export(use_filename_format=use_filename_format)
self.assertEqual(len(manifest), 7)
self.assertEqual(len(manifest), 8)
self.assertEqual(len(list(filter(lambda e: e['model'] == 'documents.document', manifest))), 4)
self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json")))

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 13:58\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-17 21:47\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings.py:304
msgid "Italian"
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
msgid "Romanian"
msgid "Italian"
msgstr ""
#: paperless/settings.py:306
msgid "Russian"
msgid "Romanian"
msgstr ""
#: paperless/settings.py:307
msgid "Russian"
msgstr ""
#: paperless/settings.py:308
msgid "Spanish"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 13:58\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-18 13:43\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr "Portugiesisch"
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italienisch"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Rumänisch"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "Russisch"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "Spanisch"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 20:04\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-17 22:42\n"
"Last-Translator: \n"
"Language-Team: English, United Kingdom\n"
"Language: en_GB\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "Portuguese (Brazil)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr "Portuguese"
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italian"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Romanian"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "Russian"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "Spanish"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\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"
@@ -433,18 +433,22 @@ msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings.py:304
msgid "Italian"
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
msgid "Romanian"
msgid "Italian"
msgstr ""
#: paperless/settings.py:306
msgid "Russian"
msgid "Romanian"
msgstr ""
#: paperless/settings.py:307
msgid "Russian"
msgstr ""
#: paperless/settings.py:308
msgid "Spanish"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 20:04\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-17 21:47\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "Portugués (Brasil)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Rumano"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "Ruso"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "Español"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 20:04\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-18 07:48\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "Portugais (Brésil)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr "Portugais"
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italien"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Roumain"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "Russe"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "Espagnol"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 13:57\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-17 21:47\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings.py:304
msgid "Italian"
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
msgid "Romanian"
msgid "Italian"
msgstr ""
#: paperless/settings.py:306
msgid "Russian"
msgid "Romanian"
msgstr ""
#: paperless/settings.py:307
msgid "Russian"
msgstr ""
#: paperless/settings.py:308
msgid "Spanish"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 18:56\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-04-01 11:51\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -366,7 +366,7 @@ msgstr "Il tipo di file %(type)s non è supportato"
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Paperless-ng si sta caricando..."
msgstr "Paperless-ng è in caricamento..."
#: documents/templates/registration/logged_out.html:13
msgid "Paperless-ng signed out"
@@ -374,11 +374,11 @@ msgstr "Paperless-ng è uscito"
#: documents/templates/registration/logged_out.html:41
msgid "You have been successfully logged out. Bye!"
msgstr "Vi siete disconnessi. Ciao!"
msgstr "Ti sei disconnesso. A presto!"
#: documents/templates/registration/logged_out.html:42
msgid "Sign in again"
msgstr "Rientra nuovamente"
msgstr "Accedi nuovamente"
#: documents/templates/registration/login.html:13
msgid "Paperless-ng sign in"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "Portoghese (Brasile)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr "Portoghese"
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Rumeno"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "Russo"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "Spagnolo"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 15:58\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-18 20:12\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "Portugees (Brazilië)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr "Portugees"
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italiaans"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Roemeens"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "Russisch"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "Spaans"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 13:57\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-17 21:47\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "Português (Brasil)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Romeno"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr ""
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 14:58\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-18 22:23\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
@@ -80,7 +80,7 @@ msgstr "é etiqueta de novo"
#: documents/models.py:89
msgid "Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags."
msgstr ""
msgstr "Marca esta etiqueta como uma etiqueta de entrada. Todos os documentos recentemente consumidos serão etiquetados com a etiqueta de entrada."
#: documents/models.py:94
msgid "tag"
@@ -116,27 +116,27 @@ msgstr "conteúdo"
#: documents/models.py:139
msgid "The raw, text-only data of the document. This field is primarily used for searching."
msgstr ""
msgstr "Os dados de texto, em cru, do documento. Este campo é utilizado principalmente para pesquisar."
#: documents/models.py:144
msgid "mime type"
msgstr ""
msgstr "tipo mime"
#: documents/models.py:155
msgid "checksum"
msgstr ""
msgstr "soma de verificação"
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr ""
msgstr "A soma de verificação do documento original."
#: documents/models.py:163
msgid "archive checksum"
msgstr ""
msgstr "arquivar soma de verificação"
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr ""
msgstr "A soma de verificação do documento arquivado."
#: documents/models.py:172 documents/models.py:328
msgid "created"
@@ -160,23 +160,23 @@ msgstr "nome de ficheiro"
#: documents/models.py:198
msgid "Current filename in storage"
msgstr ""
msgstr "Nome do arquivo atual no armazenamento"
#: documents/models.py:202
msgid "archive filename"
msgstr ""
msgstr "nome do ficheiro de arquivo"
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr ""
msgstr "Nome do arquivo atual em no armazenamento"
#: documents/models.py:212
msgid "archive serial number"
msgstr ""
msgstr "numero de série de arquivo"
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr ""
msgstr "A posição do documento no seu arquivo físico de documentos."
#: documents/models.py:223
msgid "document"
@@ -228,11 +228,11 @@ msgstr "registos"
#: documents/models.py:344 documents/models.py:396
msgid "saved view"
msgstr ""
msgstr "vista guardada"
#: documents/models.py:345
msgid "saved views"
msgstr ""
msgstr "vistas guardadas"
#: documents/models.py:348
msgid "user"
@@ -244,165 +244,165 @@ msgstr "exibir no painel de controlo"
#: documents/models.py:357
msgid "show in sidebar"
msgstr ""
msgstr "mostrar na navegação lateral"
#: documents/models.py:361
msgid "sort field"
msgstr ""
msgstr "ordenar campo"
#: documents/models.py:364
msgid "sort reverse"
msgstr ""
msgstr "ordenar inversamente"
#: documents/models.py:370
msgid "title contains"
msgstr ""
msgstr "o título contém"
#: documents/models.py:371
msgid "content contains"
msgstr ""
msgstr "o conteúdo contém"
#: documents/models.py:372
msgid "ASN is"
msgstr ""
msgstr "O NSA é"
#: documents/models.py:373
msgid "correspondent is"
msgstr ""
msgstr "o correspondente é"
#: documents/models.py:374
msgid "document type is"
msgstr ""
msgstr "o tipo de documento é"
#: documents/models.py:375
msgid "is in inbox"
msgstr ""
msgstr "está na entrada"
#: documents/models.py:376
msgid "has tag"
msgstr ""
msgstr "tem etiqueta"
#: documents/models.py:377
msgid "has any tag"
msgstr ""
msgstr "tem qualquer etiqueta"
#: documents/models.py:378
msgid "created before"
msgstr ""
msgstr "criado antes"
#: documents/models.py:379
msgid "created after"
msgstr ""
msgstr "criado depois"
#: documents/models.py:380
msgid "created year is"
msgstr ""
msgstr "ano criada é"
#: documents/models.py:381
msgid "created month is"
msgstr ""
msgstr "mês criado é"
#: documents/models.py:382
msgid "created day is"
msgstr ""
msgstr "dia criado é"
#: documents/models.py:383
msgid "added before"
msgstr ""
msgstr "adicionada antes"
#: documents/models.py:384
msgid "added after"
msgstr ""
msgstr "adicionado depois de"
#: documents/models.py:385
msgid "modified before"
msgstr ""
msgstr "modificado antes de"
#: documents/models.py:386
msgid "modified after"
msgstr ""
msgstr "modificado depois de"
#: documents/models.py:387
msgid "does not have tag"
msgstr ""
msgstr "não tem etiqueta"
#: documents/models.py:388
msgid "does not have ASN"
msgstr ""
msgstr "não possui um NSA"
#: documents/models.py:389
msgid "title or content contains"
msgstr ""
msgstr "título ou conteúdo contém"
#: documents/models.py:400
msgid "rule type"
msgstr ""
msgstr "tipo de regra"
#: documents/models.py:404
msgid "value"
msgstr ""
msgstr "valor"
#: documents/models.py:410
msgid "filter rule"
msgstr ""
msgstr "regra de filtragem"
#: documents/models.py:411
msgid "filter rules"
msgstr ""
msgstr "regras de filtragem"
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expression: %(error)s"
msgstr ""
msgstr "Expressão regular inválida: %(error)s"
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr ""
msgstr "Cor invalida."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr ""
msgstr "Tipo de arquivo %(type)s não suportado"
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr ""
msgstr "O paperless-ng está a carregar..."
#: documents/templates/registration/logged_out.html:13
msgid "Paperless-ng signed out"
msgstr ""
msgstr "Paperless-ng com sessão terminada"
#: documents/templates/registration/logged_out.html:41
msgid "You have been successfully logged out. Bye!"
msgstr ""
msgstr "Terminou a sessão com sucesso. Adeus!"
#: documents/templates/registration/logged_out.html:42
msgid "Sign in again"
msgstr ""
msgstr "Iniciar sessão novamente"
#: documents/templates/registration/login.html:13
msgid "Paperless-ng sign in"
msgstr ""
msgstr "Inicio de sessão Paperless-ng"
#: documents/templates/registration/login.html:42
msgid "Please sign in."
msgstr ""
msgstr "Por favor inicie sessão."
#: documents/templates/registration/login.html:45
msgid "Your username and password didn't match. Please try again."
msgstr ""
msgstr "O utilizador e a senha não correspondem. Tente novamente."
#: documents/templates/registration/login.html:48
msgid "Username"
msgstr ""
msgstr "Nome de utilizador"
#: documents/templates/registration/login.html:49
msgid "Password"
msgstr ""
msgstr "Palavra-passe"
#: documents/templates/registration/login.html:54
msgid "Sign in"
msgstr ""
msgstr "Iniciar sessão"
#: paperless/settings.py:298
msgid "English (US)"
@@ -426,35 +426,39 @@ msgstr "Français"
#: paperless/settings.py:303
msgid "Portuguese (Brazil)"
msgstr ""
msgstr "Português (Brasil)"
#: paperless/settings.py:304
msgid "Italian"
msgstr ""
msgid "Portuguese"
msgstr "Português"
#: paperless/settings.py:305
msgid "Romanian"
msgstr ""
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Romeno"
#: paperless/settings.py:307
msgid "Russian"
msgstr "Russo"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "Espanhol"
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr ""
msgstr "Administração do Paperless-ng"
#: paperless_mail/admin.py:25
msgid "Filter"
msgstr ""
msgstr "Filtro"
#: paperless_mail/admin.py:27
msgid "Paperless will only process mails that match ALL of the filters given below."
msgstr ""
msgstr "O Paperless apenas irá processar emails que coincidem com TODOS os filtros dados abaixo."
#: paperless_mail/admin.py:37
msgid "Actions"
@@ -462,7 +466,7 @@ msgstr "Ações"
#: 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 ""
msgstr "A ação aplicada a correio. Esta ação apenas será efetuada com documentos que tenham sido consumidos através do correio. E-mails sem anexos permanecerão intactos."
#: paperless_mail/admin.py:46
msgid "Metadata"
@@ -470,83 +474,83 @@ msgstr "Metadados"
#: 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 ""
msgstr "Atribuir meta-dados aos documentos consumidos automaticamente através desta regra. Se você não atribuir etiquetas, tipos ou correspondentes aqui, o paperless ainda assim processará todas as regras correspondentes que tenha definido."
#: paperless_mail/apps.py:9
msgid "Paperless mail"
msgstr ""
msgstr "Correio Paperless"
#: paperless_mail/models.py:11
msgid "mail account"
msgstr ""
msgstr "conta de email"
#: paperless_mail/models.py:12
msgid "mail accounts"
msgstr ""
msgstr "contas de email"
#: paperless_mail/models.py:19
msgid "No encryption"
msgstr ""
msgstr "Sem encriptação"
#: paperless_mail/models.py:20
msgid "Use SSL"
msgstr ""
msgstr "Utilizar SSL"
#: paperless_mail/models.py:21
msgid "Use STARTTLS"
msgstr ""
msgstr "Utilizar STARTTLS"
#: paperless_mail/models.py:29
msgid "IMAP server"
msgstr ""
msgstr "Servidor IMAP"
#: paperless_mail/models.py:33
msgid "IMAP port"
msgstr ""
msgstr "Porto IMAP"
#: paperless_mail/models.py:36
msgid "This is usually 143 for unencrypted and STARTTLS connections, and 993 for SSL connections."
msgstr ""
msgstr "Por norma é o 143 sem encriptação e conexões STARTTLS, e o 993 para conexões com SSL."
#: paperless_mail/models.py:40
msgid "IMAP security"
msgstr ""
msgstr "Segurança IMAP"
#: paperless_mail/models.py:46
msgid "username"
msgstr ""
msgstr "nome de utilizador"
#: paperless_mail/models.py:50
msgid "password"
msgstr ""
msgstr "palavra-passe"
#: paperless_mail/models.py:60
msgid "mail rule"
msgstr ""
msgstr "regra de correio"
#: paperless_mail/models.py:61
msgid "mail rules"
msgstr ""
msgstr "regras de correio"
#: paperless_mail/models.py:67
msgid "Only process attachments."
msgstr ""
msgstr "Processar anexos apenas."
#: paperless_mail/models.py:68
msgid "Process all files, including 'inline' attachments."
msgstr ""
msgstr "Processar todos os ficheiros, incluindo ficheiros 'embutidos (inline)'."
#: paperless_mail/models.py:78
msgid "Mark as read, don't process read mails"
msgstr ""
msgstr "Marcar como lido, não processar emails lidos"
#: paperless_mail/models.py:79
msgid "Flag the mail, don't process flagged mails"
msgstr ""
msgstr "Marcar o email, não processar emails marcados"
#: paperless_mail/models.py:80
msgid "Move to specified folder"
msgstr ""
msgstr "Mover para uma diretoria específica"
#: paperless_mail/models.py:81
msgid "Delete"
@@ -554,105 +558,105 @@ msgstr "Excluir"
#: paperless_mail/models.py:88
msgid "Use subject as title"
msgstr ""
msgstr "Utilizar o assunto como título"
#: paperless_mail/models.py:89
msgid "Use attachment filename as title"
msgstr ""
msgstr "Utilizar o nome do anexo como título"
#: paperless_mail/models.py:99
msgid "Do not assign a correspondent"
msgstr ""
msgstr "Não atribuir um correspondente"
#: paperless_mail/models.py:101
msgid "Use mail address"
msgstr ""
msgstr "Utilizar o endereço de email"
#: paperless_mail/models.py:103
msgid "Use name (or mail address if not available)"
msgstr ""
msgstr "Utilizar nome (ou endereço de email se não disponível)"
#: paperless_mail/models.py:105
msgid "Use correspondent selected below"
msgstr ""
msgstr "Utilizar o correspondente selecionado abaixo"
#: paperless_mail/models.py:113
msgid "order"
msgstr ""
msgstr "ordem"
#: paperless_mail/models.py:120
msgid "account"
msgstr ""
msgstr "conta"
#: paperless_mail/models.py:124
msgid "folder"
msgstr ""
msgstr "directoria"
#: paperless_mail/models.py:128
msgid "filter from"
msgstr ""
msgstr "filtrar de"
#: paperless_mail/models.py:131
msgid "filter subject"
msgstr ""
msgstr "filtrar assunto"
#: paperless_mail/models.py:134
msgid "filter body"
msgstr ""
msgstr "filtrar corpo"
#: paperless_mail/models.py:138
msgid "filter attachment filename"
msgstr ""
msgstr "filtrar nome do arquivo anexo"
#: 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 ""
msgstr "Consumir apenas documentos que correspondam inteiramente ao nome de arquivo se especificado. Genéricos como *.pdf ou *fatura* são permitidos. Não é sensível a letras maiúsculas/minúsculas."
#: paperless_mail/models.py:146
msgid "maximum age"
msgstr ""
msgstr "idade máxima"
#: paperless_mail/models.py:148
msgid "Specified in days."
msgstr ""
msgstr "Especificado em dias."
#: paperless_mail/models.py:151
msgid "attachment type"
msgstr ""
msgstr "tipo de anexo"
#: paperless_mail/models.py:154
msgid "Inline attachments include embedded images, so it's best to combine this option with a filename filter."
msgstr ""
msgstr "Anexos embutidos incluem imagens incorporadas, por isso é melhor combinar esta opção com um filtro de nome do arquivo."
#: paperless_mail/models.py:159
msgid "action"
msgstr ""
msgstr "ação"
#: paperless_mail/models.py:165
msgid "action parameter"
msgstr ""
msgstr "parâmetro de ação"
#: 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 ""
msgstr "Parâmetro adicional para a ação selecionada acima, isto é, a diretoria de destino do movimento da ação para a pasta."
#: paperless_mail/models.py:173
msgid "assign title from"
msgstr ""
msgstr "atribuir titulo de"
#: paperless_mail/models.py:183
msgid "assign this tag"
msgstr ""
msgstr "atribuir esta etiqueta"
#: paperless_mail/models.py:191
msgid "assign this document type"
msgstr ""
msgstr "atribuir este tipo de documento"
#: paperless_mail/models.py:195
msgid "assign correspondent from"
msgstr ""
msgstr "atribuir correspondente de"
#: paperless_mail/models.py:205
msgid "assign this correspondent"
msgstr ""
msgstr "atribuir este correspondente"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 13:57\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-28 09:07\n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
@@ -429,20 +429,24 @@ msgid "Portuguese (Brazil)"
msgstr "Portugheză (Brazilia)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr "Portugheză"
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italiană"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Română"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "Rusă"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr ""
msgstr "Spaniolă"
#: paperless/urls.py:118
msgid "Paperless-ng administration"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-15 17:33\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-17 22:42\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "Portuguese (Brazil)"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr "Португальский"
#: paperless/settings.py:305
msgid "Italian"
msgstr "Italian"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "Romanian"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "Русский"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "Испанский"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 13:57\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-17 21:47\n"
"Last-Translator: \n"
"Language-Team: Xhosa\n"
"Language: xh_ZA\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr "crwdns2726:0crwdne2726:0"
#: paperless/settings.py:304
msgid "Portuguese"
msgstr "crwdns3424:0crwdne3424:0"
#: paperless/settings.py:305
msgid "Italian"
msgstr "crwdns2728:0crwdne2728:0"
#: paperless/settings.py:305
#: paperless/settings.py:306
msgid "Romanian"
msgstr "crwdns2730:0crwdne2730:0"
#: paperless/settings.py:306
#: paperless/settings.py:307
msgid "Russian"
msgstr "crwdns3414:0crwdne3414:0"
#: paperless/settings.py:307
#: paperless/settings.py:308
msgid "Spanish"
msgstr "crwdns3420:0crwdne3420:0"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ng\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-14 13:33+0100\n"
"PO-Revision-Date: 2021-03-14 13:57\n"
"POT-Creation-Date: 2021-03-17 22:31+0100\n"
"PO-Revision-Date: 2021-03-17 21:48\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -429,18 +429,22 @@ msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings.py:304
msgid "Italian"
msgid "Portuguese"
msgstr ""
#: paperless/settings.py:305
msgid "Romanian"
msgid "Italian"
msgstr ""
#: paperless/settings.py:306
msgid "Russian"
msgid "Romanian"
msgstr ""
#: paperless/settings.py:307
msgid "Russian"
msgstr ""
#: paperless/settings.py:308
msgid "Spanish"
msgstr ""

View File

@@ -301,6 +301,7 @@ LANGUAGES = [
("nl-nl", _("Dutch")),
("fr-fr", _("French")),
("pt-br", _("Portuguese (Brazil)")),
("pt-pt", _("Portuguese")),
("it-it", _("Italian")),
("ro-ro", _("Romanian")),
("ru-ru", _("Russian")),

View File

@@ -1 +1 @@
__version__ = (1, 3, 1)
__version__ = (1, 3, 2)

View File

@@ -104,7 +104,7 @@ class RasterisedDocumentParser(DocumentParser):
# This happens when there's already text in the input file.
# The sidecar file will only contain text for OCR'ed pages.
self.log("debug", "Using text from sidecar file")
return text
return post_process_text(text)
else:
self.log("debug", "Incomplete sidecar file: discarding.")
@@ -113,12 +113,12 @@ class RasterisedDocumentParser(DocumentParser):
if not os.path.isfile(pdf_file):
return None
from pdfminer.high_level import extract_text
from pdfminer.high_level import extract_text as pdfminer_extract_text
from pdfminer.pdftypes import PDFException
try:
text = extract_text(pdf_file)
stripped = strip_excess_whitespace(text)
stripped = post_process_text(pdfminer_extract_text(pdf_file))
self.log("debug", f"Extracted text from PDF file {pdf_file}")
return stripped
except PDFException:
@@ -244,9 +244,9 @@ class RasterisedDocumentParser(DocumentParser):
if original_has_text:
self.text = text_original
except (NoTextFoundException, InputFileError) as e:
self.log("exception",
f"Encountered the following error while running OCR, "
f"attempting force OCR to get the text.")
self.log("warning",
f"Encountered an error while running OCR: {str(e)}. "
f"Attempting force OCR to get the text.")
archive_path_fallback = os.path.join(
self.tempdir, "archive-fallback.pdf")
@@ -294,7 +294,7 @@ class RasterisedDocumentParser(DocumentParser):
self.text = ""
def strip_excess_whitespace(text):
def post_process_text(text):
if not text:
return None
@@ -305,4 +305,6 @@ def strip_excess_whitespace(text):
r"([^\S\n\r]+)$", '', no_leading_whitespace)
# TODO: this needs a rework
return no_trailing_whitespace.strip()
# replace \0 prevents issues with saving to postgres.
# text may contain \0 when this character is present in PDF files.
return no_trailing_whitespace.strip().replace("\0", " ")

View File

@@ -7,7 +7,7 @@ from django.test import TestCase, override_settings
from documents.parsers import ParseError, run_convert
from documents.tests.utils import DirectoriesMixin
from paperless_tesseract.parsers import RasterisedDocumentParser, strip_excess_whitespace
from paperless_tesseract.parsers import RasterisedDocumentParser, post_process_text
image_to_string_calls = []
@@ -32,8 +32,6 @@ class FakeImageFile(ContextManager):
return os.path.basename(self.fname)
class TestParser(DirectoriesMixin, TestCase):
def assertContainsStrings(self, content, strings):
@@ -58,9 +56,9 @@ class TestParser(DirectoriesMixin, TestCase):
)
]
def test_strip_excess_whitespace(self):
def test_post_process_text(self):
for source, result in self.text_cases:
actual_result = strip_excess_whitespace(source)
actual_result = post_process_text(source)
self.assertEqual(
result,
actual_result,