mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-09 09:58:20 -05:00
Merge branch 'ENH_filename_date_parsing' of https://github.com/jat255/paperless into jat255-ENH_filename_date_parsing
This commit is contained in:
commit
650db75c2b
@ -43,6 +43,16 @@ These however wouldn't work:
|
|||||||
* ``Some Company Name, Invoice 2016-01-01, money, invoices.pdf``
|
* ``Some Company Name, Invoice 2016-01-01, money, invoices.pdf``
|
||||||
* ``Another Company- Letter of Reference.jpg``
|
* ``Another Company- Letter of Reference.jpg``
|
||||||
|
|
||||||
|
Do I have to be so strict about naming?
|
||||||
|
---------------------------------------
|
||||||
|
Rather than using the strict document naming rules, one can also set the option
|
||||||
|
``PAPERLESS_FILENAME_DATE_ORDER`` in ``paperless.conf`` to any date order
|
||||||
|
that is accepted by dateparser_. Doing so will cause ``paperless`` to default
|
||||||
|
to any date format that is found in the title, instead of a date pulled from
|
||||||
|
the document's text, without requiring the strict formatting of the document
|
||||||
|
filename as described above.
|
||||||
|
|
||||||
|
.. _dateparser: https://github.com/scrapinghub/dateparser/blob/v0.7.0/docs/usage.rst#settings
|
||||||
|
|
||||||
.. _guesswork-content:
|
.. _guesswork-content:
|
||||||
|
|
||||||
|
@ -127,6 +127,14 @@ PAPERLESS_DEBUG="false"
|
|||||||
# "true", the document will instead be opened in the browser, if possible.
|
# "true", the document will instead be opened in the browser, if possible.
|
||||||
#PAPERLESS_INLINE_DOC="false"
|
#PAPERLESS_INLINE_DOC="false"
|
||||||
|
|
||||||
|
# By default, paperless will check the document text for document date information.
|
||||||
|
# Uncomment the line below to enable checking the document filename for date
|
||||||
|
# information. The date order can be set to any option as specified in
|
||||||
|
# https://dateparser.readthedocs.io/en/latest/#settings. The filename will be
|
||||||
|
# checked first, and if nothing is found, the document text will be checked
|
||||||
|
# as normal.
|
||||||
|
#PAPERLESS_FILENAME_DATE_ORDER="YMD"
|
||||||
|
|
||||||
#
|
#
|
||||||
# The following values use sensible defaults for modern systems, but if you're
|
# The following values use sensible defaults for modern systems, but if you're
|
||||||
# running Paperless on a low-resource device (like a Raspberry Pi), modifying
|
# running Paperless on a low-resource device (like a Raspberry Pi), modifying
|
||||||
|
@ -14,14 +14,18 @@ from django.utils import timezone
|
|||||||
# - 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/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
|
||||||
|
# - ZZZZ.XX.YY with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits
|
||||||
|
# - ZZZZ/XX/YY with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits
|
||||||
|
# - ZZZZ-XX-YY 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
|
# - XX. MONTH ZZZZ with XX being 1 or 2 and ZZZZ being 2 or 4 digits
|
||||||
# - MONTH ZZZZ, with ZZZZ being 4 digits
|
# - MONTH ZZZZ, with ZZZZ being 4 digits
|
||||||
# - MONTH XX, ZZZZ with XX being 1 or 2 and ZZZZ being 4 digits
|
# - MONTH XX, ZZZZ with XX being 1 or 2 and ZZZZ being 4 digits
|
||||||
DATE_REGEX = re.compile(
|
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})[\.\/-]([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|(?!=([_-])))([0-9]{4}|[0-9]{2})[\.\/-]([0-9]{1,2})[\.\/-]([0-9]{1,2})(\b|(?=([_-])))|' +
|
||||||
r'\b([^\W\d_]{3,9} [0-9]{1,2}, ([0-9]{4}))\b|' +
|
r'(\b|(?!=([_-])))([0-9]{1,2}[\. ]+[^ ]{3,9} ([0-9]{4}|[0-9]{2}))(\b|(?=([_-])))|' +
|
||||||
r'\b([^\W\d_]{3,9} [0-9]{4})\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|(?=([_-])))'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -37,6 +41,7 @@ class DocumentParser:
|
|||||||
|
|
||||||
SCRATCH = settings.SCRATCH_DIR
|
SCRATCH = settings.SCRATCH_DIR
|
||||||
DATE_ORDER = settings.DATE_ORDER
|
DATE_ORDER = settings.DATE_ORDER
|
||||||
|
FILENAME_DATE_ORDER = settings.FILENAME_DATE_ORDER
|
||||||
OPTIPNG = settings.OPTIPNG_BINARY
|
OPTIPNG = settings.OPTIPNG_BINARY
|
||||||
|
|
||||||
def __init__(self, path):
|
def __init__(self, path):
|
||||||
@ -75,30 +80,53 @@ class DocumentParser:
|
|||||||
Returns the date of the document.
|
Returns the date of the document.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def __parser__(ds, date_order):
|
||||||
|
"""
|
||||||
|
Call dateparser.parse with a particular date ordering
|
||||||
|
"""
|
||||||
|
return dateparser.parse(ds,
|
||||||
|
settings={"DATE_ORDER": date_order,
|
||||||
|
"PREFER_DAY_OF_MONTH": "first",
|
||||||
|
"RETURN_AS_TIMEZONE_AWARE":
|
||||||
|
True})
|
||||||
date = None
|
date = None
|
||||||
date_string = None
|
date_string = None
|
||||||
|
|
||||||
|
next_year = timezone.now().year + 5 # Arbitrary 5 year future limit
|
||||||
|
title = os.path.basename(self.document_path)
|
||||||
|
|
||||||
|
# if filename date parsing is enabled, search there first:
|
||||||
|
if self.FILENAME_DATE_ORDER:
|
||||||
|
self.log("info", "Checking document title for date")
|
||||||
|
for m in re.finditer(DATE_REGEX, title):
|
||||||
|
date_string = m.group(0)
|
||||||
|
|
||||||
|
try:
|
||||||
|
date = __parser__(date_string, self.FILENAME_DATE_ORDER)
|
||||||
|
except TypeError:
|
||||||
|
# Skip all matches that do not parse to a proper date
|
||||||
|
continue
|
||||||
|
|
||||||
|
if date is not None and next_year > date.year > 1900:
|
||||||
|
self.log("info",
|
||||||
|
"Detected document date {} based on string {} "
|
||||||
|
"from document title"
|
||||||
|
"".format(date.isoformat(), date_string))
|
||||||
|
return date
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# getting text after checking filename will save time if only
|
||||||
|
# looking at the filename instead of the whole text
|
||||||
text = self.get_text()
|
text = self.get_text()
|
||||||
except ParseError:
|
except ParseError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
next_year = timezone.now().year + 5 # Arbitrary 5 year future limit
|
# Iterate through all regex matches in text and try to parse the date
|
||||||
|
|
||||||
# Iterate through all regex matches and try to parse the date
|
|
||||||
for m in re.finditer(DATE_REGEX, text):
|
for m in re.finditer(DATE_REGEX, text):
|
||||||
|
|
||||||
date_string = m.group(0)
|
date_string = m.group(0)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
date = dateparser.parse(
|
date = __parser__(date_string, self.DATE_ORDER)
|
||||||
date_string,
|
|
||||||
settings={
|
|
||||||
"DATE_ORDER": self.DATE_ORDER,
|
|
||||||
"PREFER_DAY_OF_MONTH": "first",
|
|
||||||
"RETURN_AS_TIMEZONE_AWARE": True
|
|
||||||
}
|
|
||||||
)
|
|
||||||
except TypeError:
|
except TypeError:
|
||||||
# Skip all matches that do not parse to a proper date
|
# Skip all matches that do not parse to a proper date
|
||||||
continue
|
continue
|
||||||
|
@ -306,6 +306,7 @@ FY_END = os.getenv("PAPERLESS_FINANCIAL_YEAR_END")
|
|||||||
|
|
||||||
# Specify the default date order (for autodetected dates)
|
# Specify the default date order (for autodetected dates)
|
||||||
DATE_ORDER = os.getenv("PAPERLESS_DATE_ORDER", "DMY")
|
DATE_ORDER = os.getenv("PAPERLESS_DATE_ORDER", "DMY")
|
||||||
|
FILENAME_DATE_ORDER = os.getenv("PAPERLESS_FILENAME_DATE_ORDER")
|
||||||
|
|
||||||
# Specify for how many years a correspondent is considered recent. Recent
|
# Specify for how many years a correspondent is considered recent. Recent
|
||||||
# correspondents will be shown in a separate "Recent correspondents" filter as
|
# correspondents will be shown in a separate "Recent correspondents" filter as
|
||||||
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 136 KiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 136 KiB |
@ -8,6 +8,7 @@ from dateutil import tz
|
|||||||
from django.test import TestCase, override_settings
|
from django.test import TestCase, override_settings
|
||||||
|
|
||||||
from ..parsers import RasterisedDocumentParser
|
from ..parsers import RasterisedDocumentParser
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
class TestDate(TestCase):
|
class TestDate(TestCase):
|
||||||
@ -59,9 +60,11 @@ class TestDate(TestCase):
|
|||||||
input_file = os.path.join(self.SAMPLE_FILES, "")
|
input_file = os.path.join(self.SAMPLE_FILES, "")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
document._text = "lorem ipsum 13.02.2018 lorem ipsum"
|
document._text = "lorem ipsum 13.02.2018 lorem ipsum"
|
||||||
|
date = document.get_date()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
date,
|
||||||
datetime.datetime(2018, 2, 13, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 2, 13, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -72,10 +75,13 @@ class TestDate(TestCase):
|
|||||||
input_file = os.path.join(self.SAMPLE_FILES, "")
|
input_file = os.path.join(self.SAMPLE_FILES, "")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
document._text = (
|
document._text = (
|
||||||
"lorem ipsum 130218, 2018, 20180213 and 13.02.2018 lorem ipsum")
|
"lorem ipsum 130218, 2018, 20180213 and lorem 13.02.2018 lorem "
|
||||||
|
"ipsum")
|
||||||
|
date = document.get_date()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
date,
|
||||||
datetime.datetime(2018, 2, 13, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 2, 13, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -110,9 +116,11 @@ class TestDate(TestCase):
|
|||||||
"März 2019\n"
|
"März 2019\n"
|
||||||
"lorem ipsum"
|
"lorem ipsum"
|
||||||
)
|
)
|
||||||
|
date = document.get_date()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
date,
|
||||||
datetime.datetime(2019, 3, 1, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2019, 3, 1, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -134,7 +142,8 @@ class TestDate(TestCase):
|
|||||||
"März 2020")
|
"März 2020")
|
||||||
self.assertEqual(document.get_date(),
|
self.assertEqual(document.get_date(),
|
||||||
datetime.datetime(2020, 3, 1, 0, 0,
|
datetime.datetime(2020, 3, 1, 0, 0,
|
||||||
tzinfo=tz.tzutc()))
|
tzinfo=tz.gettz(
|
||||||
|
settings.TIME_ZONE)))
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
"paperless_tesseract.parsers.RasterisedDocumentParser.SCRATCH",
|
"paperless_tesseract.parsers.RasterisedDocumentParser.SCRATCH",
|
||||||
@ -149,7 +158,8 @@ class TestDate(TestCase):
|
|||||||
"lorem ipsum")
|
"lorem ipsum")
|
||||||
self.assertEqual(document.get_date(),
|
self.assertEqual(document.get_date(),
|
||||||
datetime.datetime(2020, 3, 1, 0, 0,
|
datetime.datetime(2020, 3, 1, 0, 0,
|
||||||
tzinfo=tz.tzutc()))
|
tzinfo=tz.gettz(
|
||||||
|
settings.TIME_ZONE)))
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
"paperless_tesseract.parsers.RasterisedDocumentParser.SCRATCH",
|
"paperless_tesseract.parsers.RasterisedDocumentParser.SCRATCH",
|
||||||
@ -158,11 +168,14 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_1_pdf(self):
|
def test_get_text_1_pdf(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_1.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_1.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
|
date = document.get_date()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
date,
|
||||||
datetime.datetime(2018, 4, 1, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 4, 1, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -172,11 +185,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_1_png(self):
|
def test_get_text_1_png(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_1.png")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_1.png")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), False)
|
self.assertEqual(document._is_ocred(), False)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 4, 1, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 4, 1, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -186,11 +201,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_2_pdf(self):
|
def test_get_text_2_pdf(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_2.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_2.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2013, 2, 1, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2013, 2, 1, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -200,11 +217,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_2_png(self):
|
def test_get_text_2_png(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_2.png")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_2.png")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), False)
|
self.assertEqual(document._is_ocred(), False)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2013, 2, 1, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2013, 2, 1, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -215,11 +234,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_3_pdf(self):
|
def test_get_text_3_pdf(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_3.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_3.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 10, 5, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 10, 5, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -230,11 +251,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_3_png(self):
|
def test_get_text_3_png(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_3.png")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_3.png")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), False)
|
self.assertEqual(document._is_ocred(), False)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 10, 5, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 10, 5, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -245,11 +268,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_4_pdf(self):
|
def test_get_text_4_pdf(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_4.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_4.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 10, 5, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 10, 5, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -260,11 +285,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_4_png(self):
|
def test_get_text_4_png(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_4.png")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_4.png")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), False)
|
self.assertEqual(document._is_ocred(), False)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 10, 5, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 10, 5, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -274,11 +301,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_5_pdf(self):
|
def test_get_text_5_pdf(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_5.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_5.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 12, 17, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 12, 17, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -288,11 +317,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_5_png(self):
|
def test_get_text_5_png(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_5.png")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_5.png")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), False)
|
self.assertEqual(document._is_ocred(), False)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 12, 17, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 12, 17, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -307,7 +338,8 @@ class TestDate(TestCase):
|
|||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 12, 17, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 12, 17, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -322,7 +354,8 @@ class TestDate(TestCase):
|
|||||||
self.assertEqual(document._is_ocred(), False)
|
self.assertEqual(document._is_ocred(), False)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 12, 17, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 12, 17, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -332,6 +365,7 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_6_pdf_eu(self):
|
def test_get_text_6_pdf_eu(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_6.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_6.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(document.get_date(), None)
|
self.assertEqual(document.get_date(), None)
|
||||||
@ -343,6 +377,7 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_6_png_eu(self):
|
def test_get_text_6_png_eu(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_6.png")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_6.png")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), False)
|
self.assertEqual(document._is_ocred(), False)
|
||||||
self.assertEqual(document.get_date(), None)
|
self.assertEqual(document.get_date(), None)
|
||||||
@ -354,11 +389,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_7_pdf(self):
|
def test_get_text_7_pdf(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_7.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_7.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2018, 4, 1, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2018, 4, 1, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -368,11 +405,13 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_8_pdf(self):
|
def test_get_text_8_pdf(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_8.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_8.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2017, 12, 31, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2017, 12, 31, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
@ -382,11 +421,82 @@ class TestDate(TestCase):
|
|||||||
def test_get_text_9_pdf(self):
|
def test_get_text_9_pdf(self):
|
||||||
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_9.pdf")
|
input_file = os.path.join(self.SAMPLE_FILES, "tests_date_9.pdf")
|
||||||
document = RasterisedDocumentParser(input_file)
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.DATE_ORDER = 'DMY'
|
||||||
document.get_text()
|
document.get_text()
|
||||||
self.assertEqual(document._is_ocred(), True)
|
self.assertEqual(document._is_ocred(), True)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
document.get_date(),
|
document.get_date(),
|
||||||
datetime.datetime(2017, 12, 31, 0, 0, tzinfo=tz.tzutc())
|
datetime.datetime(2017, 12, 31, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
|
)
|
||||||
|
|
||||||
|
@mock.patch(
|
||||||
|
"paperless_tesseract.parsers.RasterisedDocumentParser.SCRATCH",
|
||||||
|
SCRATCH
|
||||||
|
)
|
||||||
|
def test_filename_date_1_pdf(self):
|
||||||
|
input_file = os.path.join(self.SAMPLE_FILES,
|
||||||
|
"tests_date_in_filename_2018-03-20_1.pdf")
|
||||||
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.FILENAME_DATE_ORDER = 'YMD'
|
||||||
|
document.get_text()
|
||||||
|
date = document.get_date()
|
||||||
|
self.assertEqual(document._is_ocred(), True)
|
||||||
|
self.assertEqual(
|
||||||
|
date,
|
||||||
|
datetime.datetime(2018, 3, 20, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
|
)
|
||||||
|
|
||||||
|
@mock.patch(
|
||||||
|
"paperless_tesseract.parsers.RasterisedDocumentParser.SCRATCH",
|
||||||
|
SCRATCH
|
||||||
|
)
|
||||||
|
def test_filename_date_1_png(self):
|
||||||
|
input_file = os.path.join(self.SAMPLE_FILES,
|
||||||
|
"tests_date_in_filename_2018-03-20_1.png")
|
||||||
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.FILENAME_DATE_ORDER = 'YMD'
|
||||||
|
date = document.get_date()
|
||||||
|
self.assertEqual(document._is_ocred(), False)
|
||||||
|
self.assertEqual(
|
||||||
|
date,
|
||||||
|
datetime.datetime(2018, 3, 20, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
|
)
|
||||||
|
|
||||||
|
@mock.patch(
|
||||||
|
"paperless_tesseract.parsers.RasterisedDocumentParser.SCRATCH",
|
||||||
|
SCRATCH
|
||||||
|
)
|
||||||
|
def test_filename_date_2_pdf(self):
|
||||||
|
input_file = os.path.join(self.SAMPLE_FILES,
|
||||||
|
"2013-12-11_tests_date_in_filename_2.pdf")
|
||||||
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.FILENAME_DATE_ORDER = 'YMD'
|
||||||
|
date = document.get_date()
|
||||||
|
self.assertEqual(document._is_ocred(), True)
|
||||||
|
self.assertEqual(
|
||||||
|
date,
|
||||||
|
datetime.datetime(2013, 12, 11, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
|
)
|
||||||
|
|
||||||
|
@mock.patch(
|
||||||
|
"paperless_tesseract.parsers.RasterisedDocumentParser.SCRATCH",
|
||||||
|
SCRATCH
|
||||||
|
)
|
||||||
|
def test_filename_date_2_png(self):
|
||||||
|
input_file = os.path.join(self.SAMPLE_FILES,
|
||||||
|
"2013-12-11_tests_date_in_filename_2.png")
|
||||||
|
document = RasterisedDocumentParser(input_file)
|
||||||
|
document.FILENAME_DATE_ORDER = 'YMD'
|
||||||
|
date = document.get_date()
|
||||||
|
self.assertEqual(document._is_ocred(), False)
|
||||||
|
self.assertEqual(
|
||||||
|
date,
|
||||||
|
datetime.datetime(2013, 12, 11, 0, 0,
|
||||||
|
tzinfo=tz.gettz(settings.TIME_ZONE))
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch(
|
@mock.patch(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user