mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/master'
This commit is contained in:
		| @@ -2,7 +2,7 @@ import textwrap | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.core.checks import Error, register | ||||
| from django.db.utils import OperationalError | ||||
| from django.db.utils import OperationalError, ProgrammingError | ||||
|  | ||||
|  | ||||
| @register() | ||||
| @@ -14,7 +14,7 @@ def changed_password_check(app_configs, **kwargs): | ||||
|     try: | ||||
|         encrypted_doc = Document.objects.filter( | ||||
|             storage_type=Document.STORAGE_TYPE_GPG).first() | ||||
|     except OperationalError: | ||||
|     except (OperationalError, ProgrammingError): | ||||
|         return []  # No documents table yet | ||||
|  | ||||
|     if encrypted_doc: | ||||
|   | ||||
| @@ -1,24 +1,24 @@ | ||||
| # coding=utf-8 | ||||
|  | ||||
| import dateutil.parser | ||||
| import logging | ||||
| import os | ||||
| import re | ||||
| import uuid | ||||
|  | ||||
| from collections import OrderedDict | ||||
|  | ||||
| import dateutil.parser | ||||
| from django.conf import settings | ||||
| from django.db import models | ||||
| from django.template.defaultfilters import slugify | ||||
| from django.utils import timezone | ||||
| from fuzzywuzzy import fuzz | ||||
|  | ||||
| from django.conf import settings | ||||
| from .managers import LogManager | ||||
|  | ||||
| try: | ||||
|     from django.core.urlresolvers import reverse | ||||
| except ImportError: | ||||
|     from django.urls import reverse | ||||
| from django.db import models | ||||
| from django.template.defaultfilters import slugify | ||||
| from django.utils import timezone | ||||
|  | ||||
| from .managers import LogManager | ||||
|  | ||||
|  | ||||
| class MatchingModel(models.Model): | ||||
| @@ -135,7 +135,7 @@ class MatchingModel(models.Model): | ||||
|         Example: | ||||
|           '  some random  words "with   quotes  " and   spaces' | ||||
|             ==> | ||||
|           ["some", "random", "words", "with\s+quotes", "and", "spaces"] | ||||
|           ["some", "random", "words", "with+quotes", "and", "spaces"] | ||||
|         """ | ||||
|         findterms = re.compile(r'"([^"]+)"|(\S+)').findall | ||||
|         normspace = re.compile(r"\s+").sub | ||||
| @@ -192,7 +192,11 @@ class Document(models.Model): | ||||
|     TYPE_JPG = "jpg" | ||||
|     TYPE_GIF = "gif" | ||||
|     TYPE_TIF = "tiff" | ||||
|     TYPES = (TYPE_PDF, TYPE_PNG, TYPE_JPG, TYPE_GIF, TYPE_TIF,) | ||||
|     TYPE_TXT = "txt" | ||||
|     TYPE_CSV = "csv" | ||||
|     TYPE_MD = "md" | ||||
|     TYPES = (TYPE_PDF, TYPE_PNG, TYPE_JPG, TYPE_GIF, TYPE_TIF, | ||||
|              TYPE_TXT, TYPE_CSV, TYPE_MD) | ||||
|  | ||||
|     STORAGE_TYPE_UNENCRYPTED = "unencrypted" | ||||
|     STORAGE_TYPE_GPG = "gpg" | ||||
| @@ -365,51 +369,52 @@ class FileInfo: | ||||
|         ) | ||||
|     ) | ||||
|  | ||||
|     formats = "pdf|jpe?g|png|gif|tiff?|te?xt|md|csv" | ||||
|     REGEXES = OrderedDict([ | ||||
|         ("created-correspondent-title-tags", re.compile( | ||||
|             r"^(?P<created>\d\d\d\d\d\d\d\d(\d\d\d\d\d\d)?Z) - " | ||||
|             r"(?P<correspondent>.*) - " | ||||
|             r"(?P<title>.*) - " | ||||
|             r"(?P<tags>[a-z0-9\-,]*)" | ||||
|             r"\.(?P<extension>pdf|jpe?g|png|gif|tiff?)$", | ||||
|             r"\.(?P<extension>{})$".format(formats), | ||||
|             flags=re.IGNORECASE | ||||
|         )), | ||||
|         ("created-title-tags", re.compile( | ||||
|             r"^(?P<created>\d\d\d\d\d\d\d\d(\d\d\d\d\d\d)?Z) - " | ||||
|             r"(?P<title>.*) - " | ||||
|             r"(?P<tags>[a-z0-9\-,]*)" | ||||
|             r"\.(?P<extension>pdf|jpe?g|png|gif|tiff?)$", | ||||
|             r"\.(?P<extension>{})$".format(formats), | ||||
|             flags=re.IGNORECASE | ||||
|         )), | ||||
|         ("created-correspondent-title", re.compile( | ||||
|             r"^(?P<created>\d\d\d\d\d\d\d\d(\d\d\d\d\d\d)?Z) - " | ||||
|             r"(?P<correspondent>.*) - " | ||||
|             r"(?P<title>.*)" | ||||
|             r"\.(?P<extension>pdf|jpe?g|png|gif|tiff?)$", | ||||
|             r"\.(?P<extension>{})$".format(formats), | ||||
|             flags=re.IGNORECASE | ||||
|         )), | ||||
|         ("created-title", re.compile( | ||||
|             r"^(?P<created>\d\d\d\d\d\d\d\d(\d\d\d\d\d\d)?Z) - " | ||||
|             r"(?P<title>.*)" | ||||
|             r"\.(?P<extension>pdf|jpe?g|png|gif|tiff?)$", | ||||
|             r"\.(?P<extension>{})$".format(formats), | ||||
|             flags=re.IGNORECASE | ||||
|         )), | ||||
|         ("correspondent-title-tags", re.compile( | ||||
|             r"(?P<correspondent>.*) - " | ||||
|             r"(?P<title>.*) - " | ||||
|             r"(?P<tags>[a-z0-9\-,]*)" | ||||
|             r"\.(?P<extension>pdf|jpe?g|png|gif|tiff?)$", | ||||
|             r"\.(?P<extension>{})$".format(formats), | ||||
|             flags=re.IGNORECASE | ||||
|         )), | ||||
|         ("correspondent-title", re.compile( | ||||
|             r"(?P<correspondent>.*) - " | ||||
|             r"(?P<title>.*)?" | ||||
|             r"\.(?P<extension>pdf|jpe?g|png|gif|tiff?)$", | ||||
|             r"\.(?P<extension>{})$".format(formats), | ||||
|             flags=re.IGNORECASE | ||||
|         )), | ||||
|         ("title", re.compile( | ||||
|             r"(?P<title>.*)" | ||||
|             r"\.(?P<extension>pdf|jpe?g|png|gif|tiff?)$", | ||||
|             r"\.(?P<extension>{})$".format(formats), | ||||
|             flags=re.IGNORECASE | ||||
|         )) | ||||
|     ]) | ||||
|   | ||||
| @@ -1,9 +1,25 @@ | ||||
| import logging | ||||
| import shutil | ||||
| import tempfile | ||||
| import re | ||||
|  | ||||
| from django.conf import settings | ||||
|  | ||||
| # This regular expression will try to find dates in the document at | ||||
| # hand and will match the following formats: | ||||
| # - XX.YY.ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits | ||||
| # - XX/YY/ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits | ||||
| # - XX-YY-ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits | ||||
| # - XX. MONTH ZZZZ with XX being 1 or 2 and ZZZZ being 2 or 4 digits | ||||
| # - MONTH ZZZZ, with ZZZZ being 4 digits | ||||
| # - MONTH XX, ZZZZ with XX being 1 or 2 and ZZZZ being 4 digits | ||||
| DATE_REGEX = re.compile( | ||||
|     r'\b([0-9]{1,2})[\.\/-]([0-9]{1,2})[\.\/-]([0-9]{4}|[0-9]{2})\b|' + | ||||
|     r'\b([0-9]{1,2}[\. ]+[^ ]{3,9} ([0-9]{4}|[0-9]{2}))\b|' + | ||||
|     r'\b([^\W\d_]{3,9} [0-9]{1,2}, ([0-9]{4}))\b|' + | ||||
|     r'\b([^\W\d_]{3,9} [0-9]{4})\b' | ||||
| ) | ||||
|  | ||||
|  | ||||
| class ParseError(Exception): | ||||
|     pass | ||||
|   | ||||
| @@ -166,7 +166,7 @@ class TestMatching(TestCase): | ||||
|     def test_match_regex(self): | ||||
|  | ||||
|         self._test_matching( | ||||
|             "alpha\w+gamma", | ||||
|             r"alpha\w+gamma", | ||||
|             "MATCH_REGEX", | ||||
|             ( | ||||
|                 "I have alpha_and_gamma in me", | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| from django.http import HttpResponse, HttpResponseBadRequest | ||||
| from django.views.generic import DetailView, FormView, TemplateView | ||||
| from django_filters.rest_framework import DjangoFilterBackend | ||||
| from django.conf import settings | ||||
|  | ||||
| from paperless.db import GnuPG | ||||
| from paperless.mixins import SessionOrBasicAuthMixin | ||||
| from paperless.views import StandardPagination | ||||
| @@ -48,6 +50,9 @@ class FetchView(SessionOrBasicAuthMixin, DetailView): | ||||
|             Document.TYPE_JPG: "image/jpeg", | ||||
|             Document.TYPE_GIF: "image/gif", | ||||
|             Document.TYPE_TIF: "image/tiff", | ||||
|             Document.TYPE_CSV: "text/csv", | ||||
|             Document.TYPE_MD:  "text/markdown", | ||||
|             Document.TYPE_TXT: "text/plain" | ||||
|         } | ||||
|  | ||||
|         if self.kwargs["kind"] == "thumb": | ||||
| @@ -60,8 +65,11 @@ class FetchView(SessionOrBasicAuthMixin, DetailView): | ||||
|             self._get_raw_data(self.object.source_file), | ||||
|             content_type=content_types[self.object.file_type] | ||||
|         ) | ||||
|         response["Content-Disposition"] = 'attachment; filename="{}"'.format( | ||||
|             self.object.file_name) | ||||
|  | ||||
|         DISPOSITION = 'inline' if settings.INLINE_DOC else 'attachment' | ||||
|  | ||||
|         response["Content-Disposition"] = '{}; filename="{}"'.format( | ||||
|             DISPOSITION, self.object.file_name) | ||||
|  | ||||
|         return response | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jonas Winkler
					Jonas Winkler