From 0b34894db9706dfaeea683fc6e0b1f6890eb2efc Mon Sep 17 00:00:00 2001 From: Tikitu de Jager Date: Mon, 7 Mar 2016 20:42:25 +0200 Subject: [PATCH 01/26] Add `FileInfo` class with `pass` implementations --- src/documents/models.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/documents/models.py b/src/documents/models.py index 0d79dba0a..bfc0224bd 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -12,6 +12,35 @@ from django.utils import timezone from .managers import LogManager +class FileInfo(object): + def __init__(self, title, suffix, + correspondent=None, tags=None, + file_mtime=None, path=None): + self._title = title + self._suffix = suffix + self._correspondent = correspondent + self._tags = tags + self._file_mtime = file_mtime + self._path = path + + @classmethod + def from_path(cls, path): + pass + + @classmethod + def from_document(cls, document): + pass + + def filename(self): + pass + + def kwargs_for_document_create(self): + pass + + def add_tags(self, tags): + self._tags = set(tags).union(self._tags) + + class SluggedModel(models.Model): name = models.CharField(max_length=128, unique=True) From 1f75af01373543d370218b6055f9afb525937c3b Mon Sep 17 00:00:00 2001 From: Tikitu de Jager Date: Mon, 7 Mar 2016 21:05:04 +0200 Subject: [PATCH 02/26] Extract filename parsing into testable class --- src/documents/consumer.py | 69 +++------------------------------------ src/documents/models.py | 65 +++++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 66 deletions(-) diff --git a/src/documents/consumer.py b/src/documents/consumer.py index fbdbbc276..74aced5c0 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -24,7 +24,7 @@ from pyocr.tesseract import TesseractError from paperless.db import GnuPG -from .models import Correspondent, Tag, Document, Log +from .models import Correspondent, Tag, Document, Log, FileInfo from .languages import ISO639 @@ -54,19 +54,6 @@ class Consumer(object): DEFAULT_OCR_LANGUAGE = settings.OCR_LANGUAGE - REGEX_TITLE = re.compile( - r"^.*/(.*)\.(pdf|jpe?g|png|gif|tiff)$", - flags=re.IGNORECASE - ) - REGEX_CORRESPONDENT_TITLE = re.compile( - r"^.*/(.+) - (.*)\.(pdf|jpe?g|png|gif|tiff)$", - flags=re.IGNORECASE - ) - REGEX_CORRESPONDENT_TITLE_TAGS = re.compile( - r"^.*/(.*) - (.*) - ([a-z0-9\-,]*)\.(pdf|jpe?g|png|gif|tiff)$", - flags=re.IGNORECASE - ) - def __init__(self): self.logger = logging.getLogger(__name__) @@ -105,7 +92,7 @@ class Consumer(object): if not os.path.isfile(doc): continue - if not re.match(self.REGEX_TITLE, doc): + if not re.match(FileInfo.REGEX_TITLE, doc): continue if doc in self._ignore: @@ -270,56 +257,8 @@ class Consumer(object): return re.sub(r"\s+", " ", r) def _guess_attributes_from_name(self, parseable): - """ - We use a crude naming convention to make handling the correspondent, - title, and tags easier: - " - - <tags>.<suffix>" - "<correspondent> - <title>.<suffix>" - "<title>.<suffix>" - """ - - def get_correspondent(correspondent_name): - return Correspondent.objects.get_or_create( - name=correspondent_name, - defaults={"slug": slugify(correspondent_name)} - )[0] - - def get_tags(tags): - r = [] - for t in tags.split(","): - r.append( - Tag.objects.get_or_create(slug=t, defaults={"name": t})[0]) - return tuple(r) - - def get_suffix(suffix): - suffix = suffix.lower() - if suffix == "jpeg": - return "jpg" - return suffix - - # First attempt: "<correspondent> - <title> - <tags>.<suffix>" - m = re.match(self.REGEX_CORRESPONDENT_TITLE_TAGS, parseable) - if m: - return ( - get_correspondent(m.group(1)), - m.group(2), - get_tags(m.group(3)), - get_suffix(m.group(4)) - ) - - # Second attempt: "<correspondent> - <title>.<suffix>" - m = re.match(self.REGEX_CORRESPONDENT_TITLE, parseable) - if m: - return ( - get_correspondent(m.group(1)), - m.group(2), - (), - get_suffix(m.group(3)) - ) - - # That didn't work, so we assume correspondent and tags are None - m = re.match(self.REGEX_TITLE, parseable) - return None, m.group(1), (), get_suffix(m.group(2)) + file_info = FileInfo.from_path(parseable) + return file_info.sender, file_info.title, file_info.tags, file_info.suffix def _store(self, text, doc, thumbnail): diff --git a/src/documents/models.py b/src/documents/models.py index bfc0224bd..c8342bf4a 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -23,9 +23,72 @@ class FileInfo(object): self._file_mtime = file_mtime self._path = path + REGEX_TITLE = re.compile( + r"^.*/(.*)\.(pdf|jpe?g|png|gif|tiff)$", + flags=re.IGNORECASE + ) + REGEX_CORRESPONDENT_TITLE = re.compile( + r"^.*/(.+) - (.*)\.(pdf|jpe?g|png|gif|tiff)$", + flags=re.IGNORECASE + ) + REGEX_CORRESPONDENT_TITLE_TAGS = re.compile( + r"^.*/(.*) - (.*) - ([a-z0-9\-,]*)\.(pdf|jpe?g|png|gif|tiff)$", + flags=re.IGNORECASE + ) + @classmethod def from_path(cls, path): - pass + """ + We use a crude naming convention to make handling the correspondent, + title, and tags easier: + "<correspondent> - <title> - <tags>.<suffix>" + "<correspondent> - <title>.<suffix>" + "<title>.<suffix>" + """ + + def get_correspondent(correspondent_name): + return Correspondent.objects.get_or_create( + name=correspondent_name, + defaults={"slug": slugify(correspondent_name)} + )[0] + + def get_tags(tags): + r = [] + for t in tags.split(","): + r.append( + Tag.objects.get_or_create(slug=t, defaults={"name": t})[0]) + return tuple(r) + + def get_suffix(suffix): + suffix = suffix.lower() + if suffix == "jpeg": + return "jpg" + return suffix + + # First attempt: "<correspondent> - <title> - <tags>.<suffix>" + m = re.match(cls.REGEX_CORRESPONDENT_TITLE_TAGS, path) + if m: + return cls( + title=m.group(2), + correspondent=get_correspondent(m.group(1)), + tags=get_tags(m.group(3)), + suffix=get_suffix(m.group(4)) + ) + + # Second attempt: "<correspondent> - <title>.<suffix>" + m = re.match(cls.REGEX_CORRESPONDENT_TITLE, path) + if m: + return cls( + title=m.group(2), + correspondent=get_correspondent(m.group(1)), + tags=(), + suffix=get_suffix(m.group(3)) + ) + + # That didn't work, so we assume correspondent and tags are None + m = re.match(cls.REGEX_TITLE, path) + return FileInfo( + title=m.group(1), tags=(), suffix=get_suffix(m.group(2))) @classmethod def from_document(cls, document): From 95217e8e21201f06beccf3f368a34396ba35660d Mon Sep 17 00:00:00 2001 From: Tikitu de Jager <tikitu@minddistrict.com> Date: Mon, 7 Mar 2016 21:08:07 +0200 Subject: [PATCH 03/26] Use FileInfo directly instead of via indirection --- src/documents/consumer.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 74aced5c0..704548013 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -256,24 +256,20 @@ class Consumer(object): # Strip out excess white space to allow matching to go smoother return re.sub(r"\s+", " ", r) - def _guess_attributes_from_name(self, parseable): - file_info = FileInfo.from_path(parseable) - return file_info.sender, file_info.title, file_info.tags, file_info.suffix - def _store(self, text, doc, thumbnail): - sender, title, tags, file_type = self._guess_attributes_from_name(doc) - relevant_tags = set(list(Tag.match_all(text)) + list(tags)) + file_info = FileInfo.from_path(doc) + relevant_tags = set(list(Tag.match_all(text)) + list(file_info.tags)) stats = os.stat(doc) self.log("debug", "Saving record to database") document = Document.objects.create( - correspondent=sender, - title=title, + correspondent=file_info.correspondent, + title=file_info.title, content=text, - file_type=file_type, + file_type=file_info.suffix, created=timezone.make_aware( datetime.datetime.fromtimestamp(stats.st_mtime)), modified=timezone.make_aware( From 4065d14fabd9122512f09726ba272cd54540db18 Mon Sep 17 00:00:00 2001 From: Tikitu de Jager <tikitu@minddistrict.com> Date: Mon, 7 Mar 2016 21:11:34 +0200 Subject: [PATCH 04/26] Remove stuff I intended to use but never did --- src/documents/models.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/documents/models.py b/src/documents/models.py index c8342bf4a..e60a699d2 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -14,14 +14,11 @@ from .managers import LogManager class FileInfo(object): def __init__(self, title, suffix, - correspondent=None, tags=None, - file_mtime=None, path=None): + correspondent=None, tags=None): self._title = title self._suffix = suffix self._correspondent = correspondent self._tags = tags - self._file_mtime = file_mtime - self._path = path REGEX_TITLE = re.compile( r"^.*/(.*)\.(pdf|jpe?g|png|gif|tiff)$", @@ -90,19 +87,6 @@ class FileInfo(object): return FileInfo( title=m.group(1), tags=(), suffix=get_suffix(m.group(2))) - @classmethod - def from_document(cls, document): - pass - - def filename(self): - pass - - def kwargs_for_document_create(self): - pass - - def add_tags(self, tags): - self._tags = set(tags).union(self._tags) - class SluggedModel(models.Model): From ad07eec3e1a0ead8127870967378edfb9e569b37 Mon Sep 17 00:00:00 2001 From: Tikitu de Jager <tikitu@minddistrict.com> Date: Mon, 7 Mar 2016 21:37:18 +0200 Subject: [PATCH 05/26] Make tests pass --- src/documents/models.py | 15 +++++++++++++++ src/documents/tests/test_consumer.py | 15 +++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/documents/models.py b/src/documents/models.py index e60a699d2..94dc60102 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -87,6 +87,21 @@ class FileInfo(object): return FileInfo( title=m.group(1), tags=(), suffix=get_suffix(m.group(2))) + @property + def title(self): + return self._title + + @property + def correspondent(self): + return self._correspondent + + @property + def tags(self): + return self._tags + + @property + def suffix(self): + return self._suffix class SluggedModel(models.Model): diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 04f92f98c..0e4c9d368 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -1,12 +1,11 @@ from django.test import TestCase -from ..consumer import Consumer +from ..models import FileInfo class TestAttachment(TestCase): TAGS = ("tag1", "tag2", "tag3") - CONSUMER = Consumer() SUFFIXES = ( "pdf", "png", "jpg", "jpeg", "gif", "PDF", "PNG", "JPG", "JPEG", "GIF", @@ -16,14 +15,14 @@ class TestAttachment(TestCase): def _test_guess_attributes_from_name(self, path, sender, title, tags): for suffix in self.SUFFIXES: f = path.format(suffix) - results = self.CONSUMER._guess_attributes_from_name(f) - self.assertEqual(results[0].name, sender, f) - self.assertEqual(results[1], title, f) - self.assertEqual(tuple([t.slug for t in results[2]]), tags, f) + file_info = FileInfo.from_path(f) + self.assertEqual(file_info.correspondent.name, sender, f) + self.assertEqual(file_info.title, title, f) + self.assertEqual(tuple([t.slug for t in file_info.tags]), tags, f) if suffix.lower() == "jpeg": - self.assertEqual(results[3], "jpg", f) + self.assertEqual(file_info.suffix, "jpg", f) else: - self.assertEqual(results[3], suffix.lower(), f) + self.assertEqual(file_info.suffix, suffix.lower(), f) def test_guess_attributes_from_name0(self): self._test_guess_attributes_from_name( From 8afdcabca8993bf2f26db504a27db74f3fe1c932 Mon Sep 17 00:00:00 2001 From: Tikitu de Jager <tikitu@minddistrict.com> Date: Mon, 7 Mar 2016 21:42:52 +0200 Subject: [PATCH 06/26] Template-based tests of combinations of valid elements --- src/documents/tests/test_consumer.py | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 0e4c9d368..37d765ac7 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -91,3 +91,63 @@ class TestAttachment(TestCase): "Τιτλε", self.TAGS ) + + +class Permutations(TestCase): + valid_correspondents = ['timmy', 'Dr. McWheelie', + 'Dash Gor-don', 'ο Θερμαστής'] + valid_titles = ['title', 'Title w Spaces', 'Title a-dash', 'Τίτλος', ''] + valid_tags = ['tag', 'tig,tag', '-', '0,1,2', ''] + valid_suffixes = ['pdf', 'png', 'jpg', 'jpeg', 'gif'] + + def _test_guessed_attributes( + self, filename, title, suffix, correspondent=None, tags=None): + file_info = FileInfo.from_path(filename) + + # Required + self.assertEqual(file_info.title, title, filename) + if suffix == 'jpeg': + suffix = 'jpg' + self.assertEqual(file_info.suffix, suffix, filename) + # Optional + if correspondent is None: + self.assertEqual(file_info.correspondent, + correspondent, filename) + else: + self.assertEqual(file_info.correspondent.name, + correspondent, filename) + if tags is None: + self.assertEqual(file_info.tags, (), filename) + else: + self.assertEqual([t.slug for t in file_info.tags], + tags.split(','), + filename) + + def test_just_title(self): + template = '/path/to/{title}.{suffix}' + for title in self.valid_titles: + for suffix in self.valid_suffixes: + spec = dict(title=title, suffix=suffix) + filename = template.format(**spec) + self._test_guessed_attributes(filename, **spec) + + def test_title_and_correspondent(self): + template = '/path/to/{correspondent} - {title}.{suffix}' + for correspondent in self.valid_correspondents: + for title in self.valid_titles: + for suffix in self.valid_suffixes: + spec = dict(correspondent=correspondent, title=title, + suffix=suffix) + filename = template.format(**spec) + self._test_guessed_attributes(filename, **spec) + + def test_title_and_correspondent_and_tags(self): + template = '/path/to/{correspondent} - {title} - {tags}.{suffix}' + for correspondent in self.valid_correspondents: + for title in self.valid_titles: + for tags in self.valid_tags: + for suffix in self.valid_suffixes: + spec = dict(correspondent=correspondent, title=title, + tags=tags, suffix=suffix) + filename = template.format(**spec) + self._test_guessed_attributes(filename, **spec) From a22f088e28335b4bb33e9226fbb460b4b24086e7 Mon Sep 17 00:00:00 2001 From: Tikitu de Jager <tikitu@minddistrict.com> Date: Mon, 7 Mar 2016 21:48:47 +0200 Subject: [PATCH 07/26] Add some failing edge case tests --- src/documents/tests/test_consumer.py | 32 ++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 37d765ac7..634e8c4f0 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -92,6 +92,38 @@ class TestAttachment(TestCase): self.TAGS ) + def test_guess_attributes_from_name_when_correspondent_empty(self): + self._test_guess_attributes_from_name( + '/path/to/ - weird empty correspondent but should not break.{}', + None, + ' - weird empty correspondent but should not break', + () + ) + + def test_guess_attributes_from_name_when_title_starts_with_dash(self): + self._test_guess_attributes_from_name( + '/path/to/- weird but should not break.{}', + None, + '- weird but should not break', + () + ) + + def test_guess_attributes_from_name_when_title_ends_with_dash(self): + self._test_guess_attributes_from_name( + '/path/to/weird but should not break -.{}', + None, + 'weird but should not break -', + () + ) + + def test_guess_attributes_from_name_when_title_is_empty(self): + self._test_guess_attributes_from_name( + '/path/to/weird correspondent but should not break - .{}', + 'weird correspondent but should not break', + '', + () + ) + class Permutations(TestCase): valid_correspondents = ['timmy', 'Dr. McWheelie', From 3f8bf74309d98a2d6cf2fc0eb307e8a973965a4e Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Mon, 14 Mar 2016 21:23:49 +0000 Subject: [PATCH 08/26] Added the sacrificial kitten --- presentation/img/kitten.jpg | Bin 0 -> 94669 bytes presentation/index.html | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 presentation/img/kitten.jpg diff --git a/presentation/img/kitten.jpg b/presentation/img/kitten.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb90ef944a206942fd0b70a134d8de22c8f5bc19 GIT binary patch literal 94669 zcmbTe2{@E(_&0nD$r8yD6;n|{QX)$jr9#q_vX`k;LQ%;+W{R>imJneol@ODJEE!u# zitM|YvF~OqW0;wHzRUApzW4t;&+&cl`-<amjO)7Z>pIWtJb%A)x#D(nDbSWPr_D}7 zJUl$mRqzku!q72e%TvcMp)B=wIp0uoy?4`jm-pd=hj#7v@^o=`-eq>iWY?MVr%ZNv z>l{)(u<O3pwL2~k{dO7b(mf=^?SqUV-VGbpzrhzD_~zfl&(FulFC-waag&IUh={O| zu<&Nlty?yWii-*hZ;{?2E+Hu;B_$%ZO-5Q$W~-!><oZK+c)=V#enEbILCMX+n<f8` zzqnP9_@)g<Hq7zz?146j^YDuEaO)rh1o7~Lt*-C(Kfic3fHiIu*d!<<3<eZ!fj02) z@^0YcU0*dA9SHso@rm<q-F^7@Mu`j81oqsQ)OZ~CYLmi=f@&$t7MkLb>konig`~I1 z$Zp@ePieohil)|4Z5>@b<CCXOo0yuNxp>LS+Q!z--s#58Th6y#Ts<FpdHeYK`3FCF z8WI{79uc4LEHNqhc}nW*%r|e}WxdbN`BeD1sJP@yX<1Ee-M8=cKN^0vwzYS3c6Imk zQip~|M#sh{Ca35Ni%ZLl73S*N`o4G|-v8LvfA8#X`w|EH+Q7%h%O|kDFP;rP;D=Y7 zkAL^!ja!dj5V&?<Vvok-O_C?#UKLaeDjcz-NnL-?A|$P-N!?3d-`Zb0``_DG(EruW z{(EEp@4k8=5ndjkJYI1K2`#9)tnB1j6cuPK-jx`X%^PPcO$p^Ydbldj&5}YH33e<r z)H?Pesa3bvwsVfKkHP1i?>%@*=XkYzQTdzG-z||(82Ns8+z??axX>e*Nc>#H3Qp|j z86{Rwg#`6a&(^EXI#P3k^4Bk*idE|gb<OS}^(R~9UYDk0Pn1_CwjEyOe*h~8xa{gY zJLnwaJ2nx;aeExW8dGTRavQEZGFY*&Pu|IYtSp<Ylzx6<W*+(I;k<oP*IOMq)#RdN zClN0LH`k^swfX!a&(rsQ{Z89#7m$}5*Dz_@`AIxY{+LZY?z7lz<}mIF7uvSWg@j$U z-+Jts)g4Iq8P6DWel}kcWBldAPrcIb(6CfQ<ekZPX#;VLsVkC`gCC6jJv&KS^=wI- zAyYowb*2Mh?O`bw8i}ytLP3#iGsjf*rzG0eaV`|E^7VzD!L#Nzsml5@MVlwD9zmxF zb0K~?X3|$pln@u9>}}>kiq`2RY{`=PIG2*cja0m71GX9y-r{T<J10w)jZOMFBBDWw z_4_W0{dqcKEAs4af?9(8(GrC?bW$UD)?wz$FW;Y1)!DpdU=68BNTzcAxBboAw>`n_ zI7WocGJ8xhQJnMUuk}2woyy&Hi9f%AWxm2(a!eHn=0Y@~X|PV0T39HOerYEcy6TJM zLQp<wbzef}KB3Ks+{2C<Y2&?l)%UDESzu9OOck4NR}XU@Q)X~oiDa<&b}%)Ye!~e? zp5KV0NP&;`S~8BPCKB>4pkj5i^%v3c4Pcp<nZ@b)1{4yTryMLZ$A@hYIyBD_9t7g3 z+ChTPWIx>Z(=2oO`R_9P=UHMy9GG&I`9%~*m8YR$Xn+eXSShg$a6{w&%bd3}`!1~Y z-3^TDV7k}Z4CA9ol=rx86{kG-^mh7dKZ*FBai`Pz`jDBTkapa7vXy1eZtr*=sL)9X zk7n-AniWbn+%*hS%5Yprq0QDWbsu&(@}=1ChO8G!_4aHX1nmN$cPH-m2`=>WU^*B2 zu{=Q%MpAMSl5EvL5v)d08^+_^wqL)lI;eg`cKbfUlQ$kATrhs6sY)PnA(yLuS#LWn z{P5N27{_hQRf;)Eig|9P`KIz=3y(v>25+i1w48aF{y{@;>!w{n$2X?X3x~;1an5Ak z%f6Z4N}@OClq7q&L7VUU9p(#rZF$<3vS13`i0Aj5#yY+VL|L<p-W3h1())&z*-}nJ z%@ND8Cc#5(7_oP%W8!k390#Ph&^x@wCj?W(joAg^D4C?sW?U#WlnXtxIL3wIrmaHW z|MqJ|-tV3F=2?25fq6KI4h@BcbXh00(P6mNlWn9``L9Q)NVb&ckWGmC)!=$PZ2GXp z{*w835mKMNUYN?05#Q<6>ooq3+8G-9zDPi`1K;Iz@9_Dr4V%%MF*m>=d&d;3fyG+q zD)?R0BbGVm$j#CvSNpzYJ+RqkV0N#H9p=Y-tV+dUn6L#`ZC+_OZJ$<RouT~c&nwS` z9+x$P+>-=j%?HS_?_n)zT}~2=RP*3e{%V<TSOo-gKWSFPpMCtlRI|iHQZmt>6)!4~ z@LRnuChVB#<Z<X8f^Z7<fsTQH5G5x@!+ABikj`4y$N?P98Xwu>P>o<Kz@kYfEk2p6 zC3fDpLwF(l02<!uKi<VdrZGs7TxjVaQwbP@2Xa;A?VtAo)7kNve#KEjY&?=?&4r>6 zO9y@b>+i8#sM^6$ov@m$FTsT#X%pCq=G~Wgms1_$`7b6-C!mwI<JeNfp)=neY9Tf; z?Z-}s*KKx9J`^@u-QBd^X7D8?k>8AWN9cuTWSSKz@-7$BSP2$r{XP$jGdn=&iDu7Q z>E5d4_i(Gx53SYHI7$vl+5x`Fh5pOtF5;+DXldjGn&tuXTv<04VKGhfNatxqy_PUa zYO#kx89sP%J3HEgsp9<2n+v7js%s~2`f#BJttq4^7xLgjVc5M)1-ip`8+)6O;SPNz zP69*bTG5v+W{ljV2$ZI5<4%>Ja=Ux}<8QT3yIK0#BaJ=oNRB%XYT-34jgEflcUu&L z<-gMJ4I9eS?CLo>e_8Emupy5~vGl>6G`qE)zgC94cIaLL(&F9okE*kF+NQ*~ew(p0 z0_~D|#Dl{~8lI_Zwp6(8B~o*h*piJyPePSW&|=r@25<`&S|?mm&OA$5Q+S_ktspBm z6`K;?d}=a+y_f(Cnb9?j6J9Y<KxK2d)jhdLw&ca3V}w;6=A}TjgW!|mOCvXD_F<!h zgQC7n=;R&K)i4%)N76E3OF9f0HM7n1RXn-Sxnv|e?jkr@{JWXS?$|40HKEfk;PVE_ zblpP?2_%XVn<((r-g4>)`nf6?rOA9rTI8YOVV?E%nc^r}ILRONjBQWub0J3`G&|wK z%q^tTk)@V*Dl=x&R{PRKkDyaEaMfqA`%Mo$R2LL`o8GnVMwMWp3v^w)9s(c|O>`YR zlvN~7mPt5I#@@Sh>s7oHVqg-TN}?^0!n^Ak|I4VX^@%!M=$BZH6WqVPb3(!M4#CW& zH<u+k-)wtpDogwg&Lsa{W-4w>02nmyUto0&7-%f}>~%4Q(o^Jrpp~-Tk!=Mz*fh@P zr_~0o%1S?$iOusHfNiSxGGz3fsSZxAGrWVh<25wRr$<d4d^il`c9u!);Ndn5n#z)M zHu;J_-=>}^as0j@wH<yLTrCiLTp-T&Oxml`wDxSa>D0Fgwdig}o`v3$uJ9x}SpgQ( zrtb%!bKTblxjeZpWT{(ZSjdL1*HdyZl&TRpGe=t8lVfZ5+3Q5waOv8|WTQtab)IQk zHe;=bY$@KM)TKZAyMeu}%lV=@TS{RlCq^GhnP+eK>-^MCc^&XM-siczXZhEool76g zQ)1Y+NJsi$p>X<zLN2sbOkfdce0}z%5g?D}?DKIYa$+@hjKaUb)J@Pzas=P@MX|R^ zTdQMI{TYvr*6L9L?IJQ_Qx(8U=1D@pI>zQ516D=&7I}VyZ$NdZe6bCVop|BE-djuC z-LluFukE;>QS_%TXp0a#AQ%>+(y`D6rbo4aeDS)QunuKQ3k>gx65H&%4V+wc<my2} zhnu&0s?zjK^Jgnv#fzPlr#O$f&>f^K+>t%p%rt*EAbbw4W(oA*3hs_Y;s}g%7Q5j_ zlYZj&!|mhxPE)xlHF*C8`nIftX6`X%E?N%_{eqS>f4D!sS`=r{<E-n>zlY4jHnLW^ z)u}yF#$&jAV-Q`e*P*<;Mc{Jh&CXX*LH+G!&&&hgiw~BvexD5;|9W(RS#YgfE5V@Z z&f?<52;FzL1M||&1|D1OYd^Y^chSG|(#lN%@^Gc9;iBdF3T>^t7~O3|Esfs|IeG8> zo?I)4828Y+`f{|;ZZh{~%ntdElEOb@o`nWNgG&wg7g}#OH}rLWG0?W$<-D)t?(*i^ zd7GWXx4cf+7%CTqpVr=ay@<Lic3aU6m#Tu*FttgC&W~F?WBIW!n}Z_@t}Du49}a0A zzp^i(?&ZeKeG%VH7mF=IM~8}*{=E95-0Rs{dTYk(Vxf;g2^FZgJnH&aaxJk;bIqn1 zE&7J%ymZ6wfccP-pGpR~4cYV~Jukg(u!BnTyiV7M>E?&;*w2$6;7C3GA*G^u8~xYS z-1~pJQt-=9V(Q=e<6<5Q_2a~e>OUk(^lz29u$7W8OkF9lv_0z2$TPoNOH}ABRC|6y zgzk`vabQ_TX!o0SmqHIRZ|@Rf*K-QNY2U0oECRTvF&AppQC(JP`ZHTSL^{ZY?mk=q z1cD^1p4ClSiV(sS>(TNTv7z$_wuVo&*qQ=P47iBo0xmRssh$&GDe&VER@9ddS5AGg zoBf(-ON2NTuriZCA<n!S#>+CbEw`h>HEXXi9BTPI!`O{1U&2V7-8oB>oxxEfS0A}# zWIJ8qJRv!g#f|7!*ow4YXKMMn?Ksh-jZa=79uu3nP+uD?=#hz0q3z3}BdD4snP#oA z{jQaA70;TkmLU9ZD<ThH+WD!}sl?NLSZYm{wT*qf)6fw63(HUM3gbic`KMP*dUsA1 z$eX&~eDuXJ*eCJJ<0{4Bh-G!ziCAWG_1avVr%V$0{Kt&elh<N@(m%!Gc#RMVNZM)A z6Ig)x3h;9rETO)UiTg&n2G_Hc7<0+|^F1q^5?u0F=G}pUBT>$-<1dM=MCOh8AjHyX z7{P_8>P}qfdoD$cxf{>!Y-R=FW;xiL^8$&uS|!XDF7#TP#)Y_$U;qNvT6e5=sP%WD zxsXsWyoC(jRfBeiyIE+4bTWT(@6o_W=akVsbA4awX~UjQ*~FJfS0qz~%szsy_mIE< z|N9hRn;?Rr-h&%*2EU2*VCMBYmAOzyU?OAqci&2k_jnWq!^84~`+@p;ku>1wze#YR zO+IV|v^y7iUeZ_D#=rx&)V8VkE(=-d<6XZCQG}#5kok}k(QG6as&TC6LeUqvkVrbs z7!D)Xav}EK86302KTnc}$pf6c7W2v*%zjROg;|y_&g9b{P1U|*sw{(J7RBZPzE&@7 z$v19qc&}lia8EA*oloFH0uep2M_1!{dfm`M7^&>(LlZ}p0|Nr7eY#m06o;(m3&&2| zrM$SWm^RY&4MDReKeZTY?j=wjn}!>zgs6)}lfF0jZ!{!L1}_mi`A$VkUE;TrfgWyn zq+bZj9;1YE#7UuCh-u!<h3GkKz^Q`DF$OeZExOmd*5CPw{*g?kjYV>eb(e<SM3T5& z&BBYuZyJ)(m!ws~w4HR$9~0s<5Wjga)zIv8<Wthj*&<*o(^C+TU=T2%YHdwYw4;0p zGo5}yd4%?+^-!y(%*gF?FU2E1x9L%zI6M~0IeuMG@t`)gfT=`91;IOPO>R<Af)kZ; zMN!wB+79dqrtiJ9HL!Uf{;8u>F-^NxY!lPFX*Yj<;+tMOlkH&4Q=2s#5RFtDRql2J z{2vG`tWuHInQ0i8*XPh%?GflYx;M0`B531{Yd?#797J>l;(ojobD)>h;P^3SALARp zVI^8Hr|#~mwm4U#OrH~0-o=VJg|z^W1T^kN8M+!N)=WP}#T==p>b$Y)SW;GWiAnz& z^x;qW%_xU3Yiq^qT|t-92`|B+LE#Z@1PPK;bExAU`oXuJAKYxVT&cZ}^V=QoQt_gJ zYVD(6csKe1N-2BnYrs&+)4Lc?TJ5(%xv$~3iaH*?C|6dvmKMJICj6O)naqXwikYwc zsL0+8Xu;L|UgwAdH>2|w7b3&N-<cV{k_O!JF-s^9oT-ycyx$P1SGVG5>krL&5!>S) zJNYY7dN=GwV#O>!oy_Vzd>O@-_%+M<h=Fi30FK|WQjwHbp+2+0!;1hVxe!OY&qgb` zWOdV;8!XrZ-rU}1c+l6qekk;t>8<2io3m&W+QP9@j1lX4!ZDFUVX@w?V;y#c_dO!# zW^86&qi~^6e~h=GG_4p<oi?o!mQHb!<i%gf(FknTB#BgL2?QJNU|uvTj=omX`uT-} z%<zRrxjR)J;f9Nb$+Yw6u<i3T^WCf=^>BTy?8~>;20lxF>?7Ojn!Q>i?s}Xe^B}L- zx>nTW!jJs8jJ#oDFqV&*p4D)3s9E54#-5Tm@3{Bfr&Ptfu4`oVZ#jiE$5o$1QeH@- zH)yKj!_gvei&C&coXw>crMR~VX9ugTZTm+vw$>?&m@DrZeS8de3P~YkAiE6rW9!MH z7?UB3GsCu>`D$~ozEqaSHfRo7jL=k%$=elwFLi2|@*~<XNz_e-yD<Cd$sz7eTdQ*? zR=f|qapv4O@DhK|RH6U8z@h<Ve$&(-lI|Es{krk@@@8l2vY4i(PQy=UW~5FBh-8>i zL=viq{e&K8STKQBPC<vxc<5VY+A>++XChW?);{bBFjbtg92D4bB70&+IQ~dtQ_Ct~ zoO~g)ypk}|9fuu_VNdd2-!3VOIu_#n<Al+Uh4kE&bB~nmCQ`lAZ>g!>QM;RGR23v+ zwMES0<@E}uVV@Zbn&<FXf~UujI{zdi^;ynI|G~Ho_UO8S=VyY)>sM}wRCX+C&nB{r ze8;PBwDVl3hgI#52-n(tq*i<O-42dMueYhXVb}Y{yGm)n;fLa)+?(2dRF9F2Z}YBx z<$NIBvIt;UGD`y}v)9ojJ$k}l)vZo;Cl`M(wW&XLd5cxD65q}nTTrvxW*S%;7<s^` zZ;_vF&&Z->R;|Un4WO#+8=G2~uT6UJTc7AGp&v6Vd*D}Hd|kYmVpkKH=0Fna?Psen z?++Po<$P+ie{s(4esi+s#uKFUGD1^jJ12oO(rLJv3w5Vt;wD8jp-xVMp}?1FrZz>a zwpQ90ptZFjk+lW0p>yc=oT0eyIjw6!cQw0b@s#UAr@Xk(XY~j#6fb52GkM5j>-da) zC!U&)I$uz_(23gTn|C8#yO)xC?b*&lyM|*=`4ZU@9*ihDdiDs*;IePz_k?Oc;$+#t z_XM?(EeDXdFGa{&^=#qa9L`|B6nl2R^O2z^=Od01Zzu_TxvCZ2rrOs-Gui|7bPips z(Qokk>(u_n0|!Qa#1HH6r`SGvdC(Jm6j!|mE6=nUvYFjGWO3vhEZf4idiRa0`r`S_ za``6WZnIOPso@(;Kk)MV>?lY(EcY8b(nTTE;Cs&@x}6z6nWcGszGr=354bPmMC-E- zzG8@P<wCbJL&ZkT(u4!cz42eu=s`Rz^?xE2;vaAZQgItdl>F4tdXGq0f+m_mbDk-& zpIxwjL1db-n+v}+njdX0i0)Ic!Q60m*U;;l_zhv!BQJSQMy0gx4#r_-Xdcspnib4O z=Gk*0=Rm@R)}<W|Zec#IM}PDwn${k)N;xOCJ8Z&jVTD2kfx9K=RXrz?w03!Utr0xO znI1!+lDbRkdT;j4meDuEgsh&I`k%u+<r=X(YJ??X10k5S;7a(c&1qbpB+)lU(zsc$ z?86o(Qjw40{kR%35Pf5HC4%nJjVpi~IOT7v0~mpT$&p7_-}m|4IXf)dTRNe-l>1Lm zWb(qB0H|mc!W04vht5g7iHJqeve|&+iKT(ZDgiPAey@?`LMO%<mk~YWg@dbP`g|c+ zx&y1Ze5KO8qHEITAJou_Ccqv?v$@cp0(8zZp4D}B@QjI~;GO~?d5@%Srg?<2_cG>Z z@c>h=x!ki0%yjN9_RFw5I9pDZZPGrfm&(F1Zg5fz#oV}1p+`+L>LT+3CD6q3D=jI( z)636?+NgUg!=^Ai!^Ar(>DG0#>t>4aZX+b-K_7Mtk`>K`W}gBPu#|8OA22((P{EPY z0K8>x1I`t4jtOAmqz6z2yp@4uyW;=J+j5u%!$hVPpnm!{ht)p<69Ymx_Ihv%go}$9 z;^)8&f#gPVQSn?)bl<rnY4VAy0IS5BxKNG~7fJ>+?*4g!apJ7@o9+q3=j3mJN6vmK zY5Ux#E<M%RS?nEm;C%H~$1~a6_dJraGU71;#R(!H6^{|0lxkEFK}a!5XQd=l^<wA6 zTE>Po2CKH%6QvK%7V7YbcU0lwyLIuNzp;|cWV?jnm07`@sTSLG4fJ;AYlk<Vwyu8f zAH0$zKHpo;Sp72a*;%$~65S@U#pEvEy}BTs%=2NHFQKbK(8BybH$997lyatn#;QSn zT5?pNIX|k<qFymJ@472LG;iE8J2MhLcq&O@ho<S9{M9`=`ZrHuLmZ|VU51LJ7I9MB zfmyYA#mh@E&M6YhB?${eQ9zR(`<lZN=<c?mqLAOS8)Ln8*P}lDNY-V)(&S;9vou_e z>H$UVrDdLNpUGR6JG%0%%%Z3xz2E%6k-C*Q)$bEkA=Z}1EjR6obz2ks7tN6%+>QBF zJzOx3p*uldyRsQ~<{{5WE8KwKeRo;Ax|xRuZVvg-wQ6#i7y*C~oTRSEyL(H@nN}}* zL;3ttFW<dBJ-1!@glZUAYbyN5QHS#ayV2L<n;}n!Q)`h6`+~={W4~RbYAoD4OCD(6 zym9f7{r)DK&GmdYx?0cz`ggVKNKYIE=z+fk@7^EUEL3k5FH=~2G-F_|%8@1>%z1$! z1Y2?kLpp(Rnr`?aXJT8j9`TV@m+#D2d3DB5uN~19AE3>NjS5${N<EgnoUsB6whT?D zn^()L(3XBRizfJO{>2}D%-Rd{a*5}a+Oj9w3s-Gdq3e+ce>2?wHTBTK?X?g>ps;v) zOqa5|>C&q6HD=d1o-Oe(7Q4p@enn<^*;&~{>fT4zI1_NyIvAx_%yC8&)9<x!!s#~l z@z(>m+nmgE9cq?igLlik8uOX`Qg<|RMPh`4+ihk6z5jc}XT=1^obL-4N|<2+igq8# z(HiKQUv~A9N2$*w(hO|}#HyR2M^)LX)W}^Xf5N^HYfwG4)SdqGvndo3<k}fGCEYow zYVN=?e_mU!Z`~%HB4=7{ZJM^lw_1xM+ch#i!=Vva$6#T^@W{fwRL!-lFz?}~+b$ez z1MjRwJcY2K{}Mo%{BxmGpU(?WOJ-JSD>Y?ZY^h)?TF5JEx;(IAmm#u5-@#zdYm!N- zk{8g=Gq-3w6MDKOXIQxCev}aB;lCX-6@ci3)w4-NF62arL@u4nL>FoDjH3SuC%@6O z3-dkGROiPeCq$S(IRxJBi>zJiAToS<mgUrs7ZraA_0GH#{pn<s#;Dyh%7RQx$X8y* zI0vM~sF5TpIOP#aumpl>h8^HShdn-WUd#Z?2efwU`~U-g=k9!lA;ftPiZ{79S}S1# z#)38sOMxJc(1!*Z2`8`>k**7v7w@yUkQL+7072DbP-Y<Geh?3kVD(NJ6*jt=bDRq? z7^G9`S?Ax8w85idwdGG>99G~TAlUBZY$~ffAbJYp4XAVP%>{Pc^m%yuuGBjP3XiRB z5Qx9yE;R4<(vkU4s&qr~)|c0=BaQ)-s@V^H<yG%(OSDceURX#Tl`$+z2*_0oyL71e zotu~N+>P<;4qs7xkNQ(zdqh&h=j|*9h$&xEvyOhqdE)#k|EaJ-hNb4gWhnog?}x}d zl((tu2i8}V!q~9E=39ePCpOuYMRaP;HR;8F9I!brq|MtfWuOwJO${09AD3!!)f*f$ z%)gI6lP8@cn`kVS9Q@lS2Rk`_#>V;eq<wJtU6D=s&F1)re(q*+xs95_zm8HJ<K9dm zzwo8qcRa0f@R%IaJ7vKt$!N1o&6<4CS65?|#b8@&kCYR2eUD`o<WwK@3OZ^)vKvXJ z2?ewttukk?eF{`P@$>SJG^eo-?GeX6e_CA1GuKqBdFL=#dNZfA!y==Q#<+C;xvuWm z*Ol6f8^Q!G+ceAbUEHeF_<1<Zrqb7Lai`t%r;6;k09(J?-i=Daw*DifQFOLd-j@F0 zG;70Ra+y|e`*c!Pj4$Wo4a&0CsH69dJ8_*~&Feoji$gxsj%Ir_n#N^h^UKVQf9Af4 z4shZ5_OR^OoR`#37xEF$-f}q^RVf`PV)9JAeo9x5eTssJz!~;?PU$x1S+ilQC6*W* z+t)QMovxAdI97-FQ>^dfI3tG+4j~c2*<JEh(dQ~DjD!3EN9K+KR6w$y6Y9vU5Zq*I zYh?~G5k~<haN#;m0yhVkL6-TM;2tsN-g+>qR-F~jg(h3)DzmT3Z1I;@9rgJ8A97xb z{UrU5w1~|pn!TkSc5~)bBN;HsYCrD+FJqY#RCx^J!uf#l90tjk9W3Ws|Kx6LLjZ?( zO(12o+o295t_yRc^xbtYq}{l8ocI*0#pa`vXJ&_T(VN*P{*b7M&ioGv=R^8tV=vD= z&M@s*IWd>1CK=2(J~|n6grnItRKk`f!siGzWX3+g-6p-3A#8i6+IU!IAsw6e`Y12C zXW+_i19tLbQ^b=VwyJA|>abV@j*8&CtAy;fb*I*q%_jKowEa+py)V}KNEaAP7D#a) z5Q|0@S`$ZBGf&c^ntn&kT)3$<h<Z72J$O1|rCEv@ffSkS?9y;LLhk8N$ruX=8ycRh zAk-A?D+(DhRZQ9&NAXlVTf29M%VoTA(epq-q8KMf|03tHC(XUiaEBc;^sQZ@K+e-t zC+4la>~By&9#$1s?Fvd3lWaA>Pi_+7WVFq!#lL)dUSL-9LfGq*a*~khDE@y#uMm=w zi~x!jA<Y3|lVx7EmT|kTKu_LSS!$u4y>%Eqi=rlTfF_nEeb81QIwS#nSkvJU_4)rQ z>a2N`X2L>3o-9Y-6%yMQH(A-60!F~Vo0rlM958y4|F=3@QW!orT~A;DO7=#&qnQh- zSE92GP!mrt?Rm-zi3qJaz(RN~v`>ky4O2nE`!g};ALp`6$Pmei0^aOBLKx}n(NkCr z7#YUwrEkrOeGA;f2wy5cW~bKoyCTD@yZJ%Xy-)9TFZ?htQR;mG3tyxev}e<ZbsIK; zN#S1Wud>O-)#f8_sjuxrucAAUtNZXwulkv9fH(r`tGWi<tKuJl@p-nm;~_3ogbELb z#WoIrRL$dJ<F&5Yo9n`tLIRCkT-Qh!oNU`QYXM=cU^05)8M&ts9&P3rUbdNf`!63s zSS;|>ZVCbnN7{=O`NPGC^u&3lO$X_d4?DHKn#7XO^x*6csRZ;ir~{NOKKMGo^~cbh z-Ic@~65vBxc)*AD-6pRYZ-x*>crfQXiY1{%;OtKQYmN%w#J*Wz3X!wB08DX1fGJS~ z#y&UXnz0rp7bxfwP>?Mh#fkAjuNgZTA#h!bHY}S*q$2h2hxEi`rxm!6(mUd$B`LMJ zw;ou~uo5T6zZp)pFhbnKRZAO+0iZojM}H%W=TipUsC`mxAJRh+uBA$z%FDKyHx1i_ zIN`)ZpsW<K006%8@Q=!^4q^J~7wfK782iNqou&Bct{Hu#Pp7VhFc_PUHU*StTMqUP z9!;{lp>ye!>@B5_kc1HekEYq9qY$(>%w-y(HrH&$p824PJh&&ru){Mtr?%tz$!oKR zi5r>sDK1OsZsVcx2&KWue6mY1EmL&6s@snc`m)~}G|SoXIDK*GF1g+#278$P;y`=@ z(e=}BH$lF#8iyO=!=<)$ZcLj2@@J*TL(FTejbx_fp~p*oYI@31IIl77kDB?&!MJqN z_L?_&Kg$cZ#}`J-HAVg{u3EJLQauc6;5}UE9*RREcAV+&X6C{&S@j6of(P?9au&TV zG~iARk+%sf6W9m@Myw1}GF(DfCirBK)B<x)N%E{ehabclslXiXlQ<uVz=Zy%$}v3u ze<L7Q_)n#DhrTCGcnBS`WR5PLwyzKIGBEt!_sf<&Ia(C2)8-kQn{-v9jwi!ZiW$s> zM89yda1$xGQJndDX_N!MeuPXTbbHi*aPB#_izN7vlW`Tb#li8@TBIi<n0Z|R-BN^= zz*Q^gtAlj3!0d}m@|}K7i+x<^eDjLWDFy~SrhXb-uF12Q^|-=|0hmYqP*w>07w1KF z8KNO0<MK*8Zgzq_-B;m9ea?2Hc!>M@-;pW0t2b7?^02NzV<#6PThUO}D7nBASa>r% zslDO(L5!Z}M4P@qkm?4U?I`;<HvEskBATUAy_Yz9g@%<qUw;6r)zZ>Zmc8vy5Qr6| z*svW4P`03$%HI=T@hwmbnR%`s^AEE!b23f1P>e>`l7JCn53bsR<jjS3Vq1|LDs-th zX!7vX+E-G9+WdHo!<W2HRj;D*=r?K#`*&#;L>+X<;Hf6QhBq@+a3SPP7%}RO6w82g z-V+6_Z<7wp`UDN^IdG)=*}fe1Rpu}S_XsQhu?rJOG@%acTU*uaJ~$R+cOhR+u0t#- z>eAf^<I<0r9!hanZl|hwn%I3%|5@v^DIj241HbTT^u~$mXSCz8d<bJB1dvAcWwzT* zDzSUore!=udcMv+Ju&+8Np|z-uaW~sOB+N{UzVj-S>O~>0yBq{h-`BbW2&6MR4JKh zp(|Cb6{paJ9q0@q9Z|DQ;)TqO4y&zK_E_^jxuuhMeG?Vc6qceIBHQcmcs=+1QvtE1 z5WgA<@~e-v(os*-z7VL$<S|bi%^bgK*c^ghkpOjsD+9od*-*sRVFFe7pD@wogC=#n zYQH{#-GjI7V4u4BWvh#JxN9xx_g#@Ha3(B~LNwF{j1v5VL&B=~4mb3cz@jaG%<&bi zjrw<vOl?d{S<8Ef5M*Cuka`Kj&7qN8sQ#Hf|I}_kkvrp6#kmmHW>IQR*iGn)*@J@p zU*e>-W5rSu&87I(Hh_>Oa68mkN|(InTaWtlMPtDB@*v^-o_IbEW_Z>5x9=rKWtQ`7 z{e3Ehl~hk1a@-;|;8L_Fi(aR?8nI#zv8_3&xKRyz5+??GfD5(gMPu6miI@S@S~(tg z;u%l6GaTOT#(4M05CVeAgBuAz5-upF6`7W=f8;+(G>oi1Af4H}7{alc44bvpi{6-Q z!@2t<X*Zk~d56(6&h$uzH!Y7CZn)bQ35#>2r<OID?zqo0b3W%96eC_-OX<FOJ$57t z^Yy`LT;>!=;Rpk#u&;pX!P+^CTMAiwr0)X@BB_m=3`KlNmm|pTxdFr%s*%w%KDGQ6 zsI9Y2Ek*hJbRh{+{Jq1#@Oq2{yfF8{!N{;67lI7zjB6=Km6+?X>@Qt;8DLZE^ad_C zwqo#0Kd{cT>*K1QYSo^P?!)`fq3kE;+okT<XulWXZNe5c2wv{IXF5_8N!Tx5_GQ-m zB7})v^vNShUXi>mFnL)%({pqjss1(K`RyxLGEUjJ*ai-Mp0ah<k(<_cb-X3hQ14&g zt}d*560_EUDCXnWe&FBrc4p{7>C(|TuMZnXiuG)?vZvjRZ~l;fmh2zIr<#VaAM<jk z8hO0h@jX>{>R6oP6zrm)D5W{Ac1}O&P1^DY-MQk!G6D);jh*jVpLKRkhz+<^uB)jJ z8Y~S^C%^VvJuvZKik6;veso+%YPigx=coH9$K=csS?t`6;I;@FJ$#?Pj(4+g!4rwn zdmrlcZOpQ&oOIRFIz>~zpW@qRSk&S|Kcdr%)MJ_bSlyKR=lHk^z1hE`xGi?e&rLe- zAC5qxhdhH*2SWNcRuK=rJ)Iu&Tn-g98<AL#)g^k+x|Mf2$>@CZoqsa4si7NhzdXBf z`0)EV{(C=t;%2Tfj&1tUyV37Mpi7~QT(m9gc-5{&JNu$e1t`NMJ$^x-RIh)s%D*cq z(n&E&6uaz?ixgdc;8&e5J-FqDXLsuSOT2W&*P&-yRxQV4RWn=qGar~3s7QYli7*-; zd~sJi=EMVIb=TQ~pJU!hmX#ZI6go-ZK)Y`vvo83ykfs5}F}*vzG=H`|YD)ZjtAIVb zic@?J=h7^jHV*5rmxX`6{$y~V(&qhoj1WEjFEN5N=Mz@Q4gJ|>hCDPMS}9-g@ngqw zu=7a2tNWyTkm?Vmz;EJxb9GhMP>K(CMv3_@&NKJ^P+&+hZxYtlBZ#Is5NN1#p2H%D zo_Pu~7)BT@xO(0${*Z8`?&(&$8;PT_@AYTN3QqdNQiHykHj%ZkY{#-$zscsrw623A z6qVP~N(%rlasR+wHXt}bGF<5Q9WL}m2_|<<y@jyAT&pht|HCo_5Y-PX)xtY*ArHHR z2>^r9>;s(F*aL2)Efr=&W=*4gr#}Ak@wbEa_3o9I#H-4sX46Bg_bMImQ+i3k90%|# z3?}(w^gy0oc%o9B7E&}64KkN>KD|qEZa&tnHG2ZwQp|beDxAG1&O0k!&CuJz!$P8^ z;DJG9kaRU?M04Ujv{zkW_0*mhIyJu;w`B--&bZB<VFTn3YGlT-_vT@n*XnMBYtCB3 ztM|JOYbA({8X?|kfxLa+5TO8WA$_tAB61-FR#Q7avm~jLo{e1LkQC6jzp0?Mn(q*Z zZrAuYaeTsU5y_aLqk55)x9Gy7A;iRwrELdI;b~O1q{4KV&7vgFnln0rOtU9}ESoT{ zJH?F)z3u8?UHs>V?K~`VzSq7Au@B^o#p-Mtk+e&=)x*ee(uxRhcW>VYgjSK{dNAjh zM<@g-m&F5&-h8~9XX!cb(rBMoz)4=#i0jVI-@zDUn&q<}a*`_iC<GCQdLQD{d55p* z74aWV*n~{UGCZzJnTc-^+;t-=uJe%&{_nx%yV7UJJq|pf>`79ZPz7<xb&n^h<5i>{ z&nm1SUGZ?ATkqY9c|ShO54n;Fmm760ex4~nYx4!2K3=VmI$L?ncMkNxR^xXtbI+$- zEpGiBkemMNeres^0s+?9(MzJEAOR(Wt#U>b5g&`8nClh%R^bSwM;oEHuihE1KrRIh zrm*;ql6xDgvf5_JYsc@K%+6JFAvbk7@iq=GFe|lbvDLr@j@cCM<d5q1LldV@VSt|a z0o_QDV7>t4u$iN0Z}Sx+PtVJ$!#$N3qgy;_G{`5u=^e~eZqly%aC~W3{HB@XQsboJ z`5FVCVd6~Da5EqC)~30l*)zgEg(dM;Vdje3=bIz~w&Xbc+$9Y}6|0-~b3a^-maIV0 zvl!=S+EEoZvq4i2Gr^MO(>srCmXvo+#@*kFiBox5b2|8`?01x6>e_}16NWPLR32s% zC%Hm^f)_X0xqa-#-D88sl97A99q7_%y7(YohWO%htmzLOMNh{8BSZw6b}IZNuE-`_ zayg;8%N0q}07<1YoIGN6GgEOsW~M@l<uu{F(xz7752yRQF;PfUPyPAnJIVU?3A|;M z&Ai;d#Yh-kmL=R^sLL#5d1J(xFJ9aBHB*sdYIsJ`Nb-eDhaKiU?xAztp@Hz#3m@e@ z(?s3o^dL4H*h=S5fthOR{>4V$?>z-epT2UT?Q7+XbL-I!6J)-w---qi=b^4z9H_#{ z^%zr#A%h}ziOW0EPXs!e9$(Fj&|$y1B^NB4CUzxy68!+%KwfY|Yy?PuwuQ75vK>PH zTkOP#ZIoADp{IAjvE5xg=p7Xjfpk?0316}Mow>)xw?roHd~4p#@>{l+cC&B7Wq*e3 zHr7#mbneI_f1BsnT4bTr{7gDc1G#Z3^=&>ew}0x$luwDYN)3-<M3|H?^lQV(v{((# zZ&08hy4g9(P#Q%qfra)CaUtHmPz48Obavla`f`j|$*(q3<Usfp5=Dz6*fr|RmI$u$ zMvIf&oAD$G+j@OH`D`4+aKs$vcfa@)7b-sgi^OPsguHm*PTo?ZYQQmD%fZe;t%&_j zGM7%tSn+;@c+iJHHy(TlSM!ns0xrhls$N!D5YxX|fbYellih1Zg*(@VD&G+|a&mA^ z_)TzEv7!7YdPw<@!NJCp@h&e*{^VbMx;NhF<>!n$8aLjbJ$N{Jwo4zv@?dt*_XShP z5%N2_D$MyuJMr(X<c-93@6m6fk7h#0RN}_?nowuEdePgFF6tuiAKWJ{R7a=w$=Uy! zMD$?&I(A1G4Bnjy@ScfVgtH6NyyOCW(8bPdP!*&)&&;xp`qmC@3t8quGLF;s$ZoiK zW452$-g3W^SfjoUwYV5*YXuQq-uD#tO<H0B>o6ujp45$4vtN!j-PisVd1QN>MYccI zxgSR}My%!$R`@`yvc|bY{96*s`g=V{WBqs0D{(zi)9vCy$fW}y%m>FBAdDwz3}9Qo z2QWR=dBD7m!4^&wGABG$8;-3-L%9F%0Y(C|pjNl9fSv%?{RRPv=`G^eC(?U-n4?eu zGm#>;m1%r2X=t-Hy6xb@-0Zuu);A)2Q<ZKU0EN^C$9F{y?^+^;A*nw><IRK%^D!3+ z-hqIPUy5x2cCw3!p2bO2?qlL_VXHIyTv!~#mct2%Rn;|{=}}A~O9=bB3^CI&)Ewi8 zppAZi<(Jtvy%re#wJCRxndh!62YV+=H1;Uhl67P*RLPyQ2y`<-==mOD$kLGDJuZPZ z!%t&Mhg>S`vMszc89v(9vrepKm7iOT5UxQ-$4;DXiFcbQWB0Ci&+^COL1PAS6H^tI zQfIjO2HO|4ZUYtjC&|ATFsn(sm692!2BNEG`;WBkA(`FgrN3ajqb0NVfI!rS#D7`E z@7}bbGVS|Ynfjf-?@AE94S6!VW`1LD<El?!_A)^4Hex1s=<4(BNd@m*MhjM=D{}!u zSADf+GZ_f|6*>cUkYGzI;ly~8){FzuHrSslVqUC6m|YpxYKj@6Ed$S&6?;yY5uf2G zMYshwd1+8wYyx^V^~jwf{!fh>$pgdUKmXYr-|aRe67}-)*2z!14e*SoW#bD@=oAtS zbry7C1;!BQ>flVJazHUGC=(=f!r2ypnmEJhYO0G8u;AoMg}(u=5G3u#3bSd2$x>{k z1@^DM@~Q;q|4g{%&yjGsGyzx;5P78@S|dD!TXQQXlBfPm8LBevh6shY>PxWZ1V1Bh z{)y&v?2(mJ$s#E5{ylPDU^Y4>DMJ~q1#j<nJ^GZfFZ=DgjJgcuh}cdFR&6V+wdQPu zkYcOQQH&L~6lz#4HgNK-@4@d4fjUP&#W6K!nPZjh#9z(b$={GPkkqNZfV<sS#p;^r zjsB#aQ~ln-=uN;ier(Dgfq#vaNK&MKDX#n@(ebkkjzGGSyR$%;SS-fgL#Cy;R_<y; zQsr1SJ;;ywyCQMD`suLq3z3xi*yrE%iaoy@nls6O{)ICQXkF|67yZsRp<ZIjULbUN zvvsFxIqT@t(V$+l3zyYi$G?r;z#|}AEq9x@8A*vJNPYI9t%SicoKzOPRjlYTGhtTV zJ}`Nv@4zg>om~El+;nsp@hwAjNyWDbC8xRoA}+-~<n8&b2$WzypszR6v3Y2;O0GD; zpBdF8q?6*1pH=$Q=Uu*&YrKlPe8*4Mt}~Ghl!⪙-i?;jCn^N;&jzLQQv$a<&sxL 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 literal 0 HcmV?d00001 diff --git a/presentation/index.html b/presentation/index.html index 0b6921f9f..25ce83ad9 100644 --- a/presentation/index.html +++ b/presentation/index.html @@ -148,12 +148,12 @@ <section data-background="img/pony.png"> <h2>Demo!</h2> - <p>(Time to sacrifice a kitten)</p> + <img src="img/kitten.jpg" style="width: 50%;" /> </section> <section> <h2>TODO</h2> - <p>It works, but it could use polish</p> + <p>It works, but it needs polish</p> <ul> <li>The UI is the Django admin</li> <li>Mail consumption is really raw</li> @@ -163,11 +163,11 @@ <aside class="notes"> <ul> <li> - <strong>Plugin architecture</strong>: there've been requests for - some overly custom stuff to happen before and after consumption, - but in the UNIX spirit of "do one job well", I think this sort - of thing is better written as a plugin -- which means I need to - figure out a best practise for that. + <strong>Plugin architecture</strong>: there've been requests + for some overly custom stuff to happen before and after + consumption, but in the UNIX spirit of "do one job well", I + think this sort of thing is better written as a plugin -- which + means I need to figure out a best practise for that. </li> </ul> </aside> From d288aece38d1c66c39e9bd92db8e6b732c02c8fe Mon Sep 17 00:00:00 2001 From: Steve Vandervalk <stevenvandervalk@users.noreply.github.com> Date: Tue, 15 Mar 2016 17:32:39 +1000 Subject: [PATCH 09/26] Add brew install libmagic to apple requirements. `./manage.py migrate` ran into `raise ImportError('Unable to find magic library')` on latest Apple tastic. --- docs/requirements.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.rst b/docs/requirements.rst index 36bc234c0..5d4fddaf0 100644 --- a/docs/requirements.rst +++ b/docs/requirements.rst @@ -52,6 +52,7 @@ well as ImageMagick: $ brew install ghostscript $ brew install imagemagick + $ brew install libmagic .. _requirements-baremetal: From 5d2eb05edb5f8f77c188bfffcf8da90e34a03c33 Mon Sep 17 00:00:00 2001 From: Jean Snyman <git@jsnyman.com> Date: Sat, 19 Mar 2016 01:57:54 -0700 Subject: [PATCH 10/26] Add directions for automatic starting at bootup on Ubuntu 14.04 --- docs/setup.rst | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/setup.rst b/docs/setup.rst index 9992418c1..3ff614983 100644 --- a/docs/setup.rst +++ b/docs/setup.rst @@ -295,3 +295,56 @@ using Docker, you can set a restart-policy_ in the ``docker-compose.yml`` to have the containers automatically start with the Docker daemon. .. _restart-policy: https://docs.docker.com/engine/reference/commandline/run/#restart-policies-restart + +.. _auto-init-ubuntu-14.04: + +Automatically Start Paperless on Ubuntu 14.04 +............................................. + +Ubuntu 14.04 and earlier use the Upstart init system to start services during the boot process. To configure Upstart to run Paperless automatically after restarting your system: + +1. Change to the directory where Upstart's configuration files are kept: ``cd /etc/init`` + +2. Create a new file: ``sudo nano paperless-server.conf`` + +3. In the newly-created file enter:: + + start on (local-filesystems and net-device-up IFACE=eth0) + stop on shutdown + + respawn + respawn limit 10 5 + + script + export PAPERLESS_PASSPHRASE=passphrase + export PAPERLESS_CONSUMPTION_DIR=/srv/ftp/paperless + + exec /srv/paperless/src/manage.py runserver 0.0.0.0:80 + end script + + Replace ``passphrase`` with a random value, ``/srv/ftp/paperless`` with the path to your consumption directory and ``/srv/paperless/src/manage.py`` with the path to the ``manage.py`` script in your installation directory. + + If you are using a network interface other than ``eth0``, you will have to change this value. For example, if you are connected via Wi-Fi, you will likely need to replace ``eth0`` above with ``wlan0``. To see all interfaces, run ``ifconfig``. + + Save the file. + +4. Create a new file: ``sudo nano paperless-consumer.conf`` + +5. In the newly-created file enter:: + + start on (local-filesystems and net-device-up IFACE=eth0) + stop on shutdown + + respawn + respawn limit 10 5 + + script + export PAPERLESS_PASSPHRASE=passphrase + export PAPERLESS_CONSUMPTION_DIR=/srv/ftp/paperless + + exec /srv/paperless/src/manage.py document_consumer + end script + + Replace ``passphrase``, ``/srv/ftp/paperless`` and ``/srv/paperless/src/manage.py`` with the same values as in step 3 above. Replace ``eth0`` with the appropriate value, if necessary. Save the file. + +These two configuration files together will start both the Paperless webserver and document consumer processes when the file system and network interface specified is available after bootup. Furthermore, if either process ever exits unexpectedly, Upstart will try to restart it a maximum of 10 times within a 5 second period. \ No newline at end of file From bcbc8c6b22386cd8d5c03b9fa63ee648916f605e Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Sat, 19 Mar 2016 11:39:52 +0000 Subject: [PATCH 11/26] #91: Further explanation for less-advanced scanners --- README.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 8bdf66319..bd3bae412 100644 --- a/README.rst +++ b/README.rst @@ -24,7 +24,9 @@ How it Works 1. Buy a document scanner like `this one`_. 2. Set it up to "scan to FTP" or something similar. It should be able to push - scanned images to a server without you having to do anything. + scanned images to a server without you having to do anything. If your + scanner doesn't know how to automatically upload the file somewhere, you can + always do that manually. 3. Have the target server run the *Paperless* consumption script to OCR the PDF and index it into a local database. 4. Use the web frontend to sift through the database and find what you want. From 702085022cf56f0d3aa72b9db7745b4bdd0c6956 Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Sat, 19 Mar 2016 11:47:18 +0000 Subject: [PATCH 12/26] #91: Further explanation for less-advanced scanners --- README.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index bd3bae412..71b59750b 100644 --- a/README.rst +++ b/README.rst @@ -26,8 +26,9 @@ How it Works 2. Set it up to "scan to FTP" or something similar. It should be able to push scanned images to a server without you having to do anything. If your scanner doesn't know how to automatically upload the file somewhere, you can - always do that manually. -3. Have the target server run the *Paperless* consumption script to OCR the PDF + always do that manually. Paperless doesn't care how the documents get into + its local consumption directory. +3. Have the target server run the Paperless consumption script to OCR the PDF and index it into a local database. 4. Use the web frontend to sift through the database and find what you want. 5. Download the PDF you need/want via the web interface and do whatever you From 15d758952b21525f5266c2cf27aec05add7da318 Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Sat, 19 Mar 2016 12:18:57 +0000 Subject: [PATCH 13/26] Added PAPERLESS_OCR_THREADS --- paperless.conf.example | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/paperless.conf.example b/paperless.conf.example index 3ee429ea8..d254b7320 100644 --- a/paperless.conf.example +++ b/paperless.conf.example @@ -20,7 +20,7 @@ PAPERLESS_CONSUME_MAIL_PASS="" # # The passphrase you use here will be used when storing your documents in # Paperless, but you can always export them in an unencrypted format by using -# document exporter. See the documentaiton for more information. +# document exporter. See the documentation for more information. # # One final note about the passphrase. Once you've consumed a document with # one passphrase, DON'T CHANGE IT. Paperless assumes this to be a constant and @@ -31,3 +31,8 @@ PAPERLESS_PASSPHRASE="secret" # If you intend to consume documents either via HTTP POST or by email, you must # have a shared secret here. PAPERLESS_SHARED_SECRET="" + +# By default, Paperless will attempt to use all available CPU cores to process +# a document, but if you would like to limit that, you can set this value to +# an integer: +#PAPERLESS_OCR_THREADS=1 From d29e91eb703a0f3990f3c0f62165c5db4ef65e76 Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Sat, 19 Mar 2016 12:20:36 +0000 Subject: [PATCH 14/26] Removed references to editing settings.py and cleaned up formatting --- docs/setup.rst | 188 ++++++++++++++++++++++++++++++------------------- 1 file changed, 114 insertions(+), 74 deletions(-) diff --git a/docs/setup.rst b/docs/setup.rst index 3ff614983..9cb23b122 100644 --- a/docs/setup.rst +++ b/docs/setup.rst @@ -5,7 +5,8 @@ Setup Paperless isn't a very complicated app, but there are a few components, so some basic documentation is in order. If you go follow along in this document and -still have trouble, please open an `issue on GitHub`_ so I can fill in the gaps. +still have trouble, please open an `issue on GitHub`_ so I can fill in the +gaps. .. _issue on GitHub: https://github.com/danielquinn/paperless/issues @@ -15,8 +16,8 @@ still have trouble, please open an `issue on GitHub`_ so I can fill in the gaps. Download -------- -The source is currently only available via GitHub, so grab it from there, either -by using ``git``: +The source is currently only available via GitHub, so grab it from there, +either by using ``git``: .. code:: bash @@ -42,15 +43,16 @@ route`_ is quick & easy, but means you're running a VM which comes with memory consumption etc. We also `support Docker`_, which you can use natively under Linux and in a VM with `Docker Machine`_ (this guide was written for native Docker usage under Linux, you might have to adapt it for Docker Machine.) -Alternatively the standard, `bare metal`_ approach is a little more complicated, -but worth it because it makes it easier to should you want to contribute some -code back. +Alternatively the standard, `bare metal`_ approach is a little more +complicated, but worth it because it makes it easier to should you want to +contribute some code back. .. _Vagrant route: setup-installation-vagrant_ .. _support Docker: setup-installation-docker_ .. _bare metal: setup-installation-standard_ .. _Docker Machine: https://docs.docker.com/machine/ + .. _setup-installation-standard: Standard (Bare Metal) @@ -58,19 +60,16 @@ Standard (Bare Metal) 1. Install the requirements as per the :ref:`requirements <requirements>` page. 2. Change to the ``src`` directory in this repo. -3. Edit ``paperless/settings.py`` and be sure to set the values for: - * ``CONSUMPTION_DIR``: this is where your documents will be dumped to be - consumed by Paperless. - * ``PASSPHRASE``: this is the passphrase Paperless uses to encrypt/decrypt - the original document. The default value attempts to source the - passphrase from the environment, so if you don't set it to a static value - here, you must set ``PAPERLESS_PASSPHRASE=some-secret-string`` on the - command line whenever invoking the consumer or webserver. - * ``OCR_THREADS``: this is the number of threads the OCR process will spawn - to process document pages in parallel. The default value gets sourced from - the environment-variable ``PAPERLESS_OCR_THREADS`` and expects it to be an - integer. If the variable is not set, Python determines the core-count of - your CPU and uses that value. +3. Copy ``paperless.conf.example`` to ``/etc/paperless.conf`` and open it in + your favourite editor. Set the values for: + + * ``PAPERLESS_CONSUMPTION_DIR``: this is where your documents will be + dumped to be consumed by Paperless. + * ``PAPERLESS_PASSPHRASE``: this is the passphrase Paperless uses to + encrypt/decrypt the original document. + * ``PAPERLESS_OCR_THREADS``: this is the number of threads the OCR process + will spawn to process document pages in parallel. + 4. Initialise the database with ``./manage.py migrate``. 5. Create a user for your Paperless instance with ``./manage.py createsuperuser``. Follow the prompts to create your user. @@ -79,8 +78,8 @@ Standard (Bare Metal) You should now be able to visit your (empty) `Paperless webserver`_ at ``127.0.0.1:8000`` (or whatever you chose). You can login with the user/pass you created in #5. -7. In a separate window, change to the ``src`` directory in this repo again, but - this time, you should start the consumer script with +7. In a separate window, change to the ``src`` directory in this repo again, + but this time, you should start the consumer script with ``./manage.py document_consumer``. 8. Scan something. Put it in the ``CONSUMPTION_DIR``. 9. Wait a few minutes @@ -100,6 +99,7 @@ Vagrant Method provisioned... 3. Run ``vagrant ssh`` and once inside your new vagrant box, edit ``/etc/paperless.conf`` and set the values for: + * ``PAPERLESS_CONSUMPTION_DIR``: this is where your documents will be dumped to be consumed by Paperless. * ``PAPERLESS_PASSPHRASE``: this is the passphrase Paperless uses to @@ -107,6 +107,7 @@ Vagrant Method * ``PAPERLESS_SHARED_SECRET``: this is the "magic word" used when consuming documents from mail or via the API. If you don't use either, leaving it blank is just fine. + 4. Exit the vagrant box and re-enter it with ``vagrant ssh`` again. This updates the environment to make use of the changes you made to the config file. @@ -140,9 +141,9 @@ Docker Method .. caution:: As mentioned earlier, this guide assumes that you use Docker natively - under Linux. If you are using `Docker Machine`_ under Mac OS X or Windows, - you will have to adapt IP addresses, volume-mounting, command execution - and maybe more. + under Linux. If you are using `Docker Machine`_ under Mac OS X or + Windows, you will have to adapt IP addresses, volume-mounting, command + execution and maybe more. 2. Install `docker-compose`_. [#compose]_ @@ -161,14 +162,14 @@ Docker Method .. _Docker installation guide: https://docs.docker.com/engine/installation/ .. _docker-compose installation guide: https://docs.docker.com/compose/install/ -3. Create a copy of ``docker-compose.yml.example`` as ``docker-compose.yml`` and - a copy of ``docker-compose.env.example`` as ``docker-compose.env``. You'll be - editing both these files: taking a copy ensures that you can ``git pull`` to - receive updates without risking merge conflicts with your modified versions - of the configuration files. -4. Modify ``docker-compose.yml`` to your preferences, following the instructions - in comments in the file. The only change that is a hard requirement is to - specify where the consumption directory should mount. +3. Create a copy of ``docker-compose.yml.example`` as ``docker-compose.yml`` + and a copy of ``docker-compose.env.example`` as ``docker-compose.env``. + You'll be editing both these files: taking a copy ensures that you can + ``git pull`` to receive updates without risking merge conflicts with your + modified versions of the configuration files. +4. Modify ``docker-compose.yml`` to your preferences, following the + instructions in comments in the file. The only change that is a hard + requirement is to specify where the consumption directory should mount. 5. Modify ``docker-compose.env`` and adapt the following environment variables: ``PAPERLESS_PASSPHRASE`` @@ -181,10 +182,11 @@ Docker Method the core-count of your CPU and uses that value. ``PAPERLESS_OCR_LANGUAGES`` - If you want the OCR to recognize other languages in addition to the default - English, set this parameter to a space separated list of three-letter - language-codes after `ISO 639-2/T`_. For a list of available languages -- - including their three letter codes -- see the `Debian packagelist`_. + If you want the OCR to recognize other languages in addition to the + default English, set this parameter to a space separated list of + three-letter language-codes after `ISO 639-2/T`_. For a list of available + languages -- including their three letter codes -- see the + `Debian packagelist`_. ``USERMAP_UID`` and ``USERMAP_GID`` If you want to mount the consumption volume (directory ``/consume`` within @@ -192,11 +194,11 @@ Docker Method access rights might be an issue. The default user and group ``paperless`` in the containers have an id of 1000. The containers will enforce that the owning group of the consumption directory will be ``paperless`` to be able - to delete consumed documents. If your host-system has a group with an id of - 1000 and you don't want this group to have access rights to the consumption - directory, you can use ``USERMAP_GID`` to change the id in the container - and thus the one of the consumption directory. Furthermore, you can change - the id of the default user as well using ``USERMAP_UID``. + to delete consumed documents. If your host-system has a group with an ID + of 1000 and you don't want this group to have access rights to the + consumption directory, you can use ``USERMAP_GID`` to change the id in the + container and thus the one of the consumption directory. Furthermore, you + can change the id of the default user as well using ``USERMAP_UID``. 6. Run ``docker-compose up -d``. This will create and start the necessary containers. @@ -234,14 +236,14 @@ Docker Method .. danger:: While the consumption container will ensure at startup that it can - **delete** a consumed file from a host-mounted directory, it might not - be able to **read** the document in the first place if the access + **delete** a consumed file from a host-mounted directory, it might + not be able to **read** the document in the first place if the access rights to the file are incorrect. Make sure that the documents you put into the consumption directory will either be readable by everyone (``chmod o+r file.pdf``) or - readable by the default user or group id 1000 (or the one you have set - with ``USERMAP_UID`` or ``USERMAP_GID`` respectively). + readable by the default user or group id 1000 (or the one you have + set with ``USERMAP_UID`` or ``USERMAP_GID`` respectively). 2. Use ``docker cp`` to copy your files directly into the container: @@ -258,8 +260,8 @@ Docker Method ``docker cp`` is a one-shot-command, just like ``cp``. This means that every time you want to consume a new document, you will have to execute - ``docker cp`` again. You can of course automate this process, but option 1 - is generally the preferred one. + ``docker cp`` again. You can of course automate this process, but option + 1 is generally the preferred one. .. danger:: @@ -267,8 +269,8 @@ Docker Method to the acting user at the destination, which will be ``root``. You therefore need to ensure that the documents you want to copy into - the container are readable by everyone (``chmod o+r file.pdf``) before - copying them. + the container are readable by everyone (``chmod o+r file.pdf``) + before copying them. .. _Docker: https://www.docker.com/ @@ -281,32 +283,44 @@ Docker Method free to tinker around without using compose! -.. _making-things-a-little-more-permanent: +.. _setup-permanent: Making Things a Little more Permanent ------------------------------------- -Once you've tested things and are happy with the work flow, you can automate the -process of starting the webserver and consumer automatically. If you're running -on a bare metal system that's using Systemd, you can use the service unit files -in the ``scripts`` directory to set this up. If you're on another startup -system or are using a Vagrant box, then you're currently on your own. If you are -using Docker, you can set a restart-policy_ in the ``docker-compose.yml`` to -have the containers automatically start with the Docker daemon. +Once you've tested things and are happy with the work flow, you can automate +the process of starting the webserver and consumer automatically. -.. _restart-policy: https://docs.docker.com/engine/reference/commandline/run/#restart-policies-restart -.. _auto-init-ubuntu-14.04: +.. _setup-permanent-standard-systemd: -Automatically Start Paperless on Ubuntu 14.04 -............................................. +Standard (Bare Metal, Systemd) +.............................. -Ubuntu 14.04 and earlier use the Upstart init system to start services during the boot process. To configure Upstart to run Paperless automatically after restarting your system: +If you're running on a bare metal system that's using Systemd, you can use the +service unit files in the ``scripts`` directory to set this up. You'll need to +create a user called ``paperless`` and setup Paperless to be in a place that +this new user can read and write to. Then, you can just tell Systemd to enable +the two ``.service`` files: -1. Change to the directory where Upstart's configuration files are kept: ``cd /etc/init`` + # systemctl enable /path/to/paperless/scripts/paperless-consumer.service + # systemctl enable /path/to/paperless/scripts/paperless-webserver.service + # systemctl start /path/to/paperless/scripts/paperless-consumer.service + # systemctl start /path/to/paperless/scripts/paperless-webserver.service + +.. _setup-permanent-standard-ubuntu14: + +Ubuntu 14.04 (Bare Metal, Upstart) +.................................. + +Ubuntu 14.04 and earlier use the `Upstart`_ init system to start services +during the boot process. To configure Upstart to run Paperless automatically +after restarting your system: + +1. Change to the directory where Upstart's configuration files are kept: + ``cd /etc/init`` 2. Create a new file: ``sudo nano paperless-server.conf`` - 3. In the newly-created file enter:: start on (local-filesystems and net-device-up IFACE=eth0) @@ -316,15 +330,16 @@ Ubuntu 14.04 and earlier use the Upstart init system to start services during th respawn limit 10 5 script - export PAPERLESS_PASSPHRASE=passphrase - export PAPERLESS_CONSUMPTION_DIR=/srv/ftp/paperless - exec /srv/paperless/src/manage.py runserver 0.0.0.0:80 end script - Replace ``passphrase`` with a random value, ``/srv/ftp/paperless`` with the path to your consumption directory and ``/srv/paperless/src/manage.py`` with the path to the ``manage.py`` script in your installation directory. + Note that you'll need to replace ``/srv/paperless/src/manage.py`` with the + path to the ``manage.py`` script in your installation directory. - If you are using a network interface other than ``eth0``, you will have to change this value. For example, if you are connected via Wi-Fi, you will likely need to replace ``eth0`` above with ``wlan0``. To see all interfaces, run ``ifconfig``. + If you are using a network interface other than ``eth0``, you will have to + change ``IFACE=eth0``. For example, if you are connected via WiFi, you will + likely need to replace ``eth0`` above with ``wlan0``. To see all interfaces, + run ``ifconfig``. Save the file. @@ -339,12 +354,37 @@ Ubuntu 14.04 and earlier use the Upstart init system to start services during th respawn limit 10 5 script - export PAPERLESS_PASSPHRASE=passphrase - export PAPERLESS_CONSUMPTION_DIR=/srv/ftp/paperless - exec /srv/paperless/src/manage.py document_consumer end script - Replace ``passphrase``, ``/srv/ftp/paperless`` and ``/srv/paperless/src/manage.py`` with the same values as in step 3 above. Replace ``eth0`` with the appropriate value, if necessary. Save the file. + Replace ``/srv/paperless/src/manage.py`` with the same values as in step 3 + above and replace ``eth0`` with the appropriate value, if necessary. Save the + file. -These two configuration files together will start both the Paperless webserver and document consumer processes when the file system and network interface specified is available after bootup. Furthermore, if either process ever exits unexpectedly, Upstart will try to restart it a maximum of 10 times within a 5 second period. \ No newline at end of file +These two configuration files together will start both the Paperless webserver +and document consumer processes when the file system and network interface +specified is available after boot. Furthermore, if either process ever exits +unexpectedly, Upstart will try to restart it a maximum of 10 times within a 5 +second period. + +.. _Upstart: http://upstart.ubuntu.com/ + + +.. _setup-permanent-vagrant: + +Vagrant +....... + +You're currently on your own, but the Ubuntu explanation above may be enough. + + +.. _setup-permanent-docker: + +Docker +...... + +If you're using Docker, you can set a restart-policy_ in the +``docker-compose.yml`` to have the containers automatically start with the +Docker daemon. + +.. _restart-policy: https://docs.docker.com/engine/reference/commandline/run/#restart-policies-restart From 3250c47408cfc3377302860666bf7c6d1fcd62b7 Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Sat, 19 Mar 2016 12:26:19 +0000 Subject: [PATCH 15/26] rst vs md makes me sad --- docs/setup.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/setup.rst b/docs/setup.rst index 9cb23b122..e18d11dda 100644 --- a/docs/setup.rst +++ b/docs/setup.rst @@ -301,7 +301,7 @@ If you're running on a bare metal system that's using Systemd, you can use the service unit files in the ``scripts`` directory to set this up. You'll need to create a user called ``paperless`` and setup Paperless to be in a place that this new user can read and write to. Then, you can just tell Systemd to enable -the two ``.service`` files: +the two ``.service`` files:: # systemctl enable /path/to/paperless/scripts/paperless-consumer.service # systemctl enable /path/to/paperless/scripts/paperless-webserver.service From c199b0498d514fffed2b8191f01cf8bd958d8434 Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Sat, 19 Mar 2016 13:19:54 +0000 Subject: [PATCH 16/26] Added a comment as per #93 --- docker-compose.yml.example | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docker-compose.yml.example b/docker-compose.yml.example index 2a70c9ff7..fddda8198 100644 --- a/docker-compose.yml.example +++ b/docker-compose.yml.example @@ -11,6 +11,10 @@ services: - data:/usr/src/paperless/data - media:/usr/src/paperless/media env_file: docker-compose.env + # The reason the line is here is so that the webserver that doesn't do + # any text recognition and doesn't have to install unnecessary + # languages the user might have set in the env-file by overwriting the + # value with nothing. environment: - PAPERLESS_OCR_LANGUAGES= command: ["runserver", "0.0.0.0:8000"] From 840626e5719300d833e3e76205c7c4506972da7e Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Mon, 21 Mar 2016 13:54:32 +0000 Subject: [PATCH 17/26] Made the created field editable --- src/documents/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/documents/models.py b/src/documents/models.py index 0d79dba0a..20bc5004c 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -152,7 +152,7 @@ class Document(models.Model): ) tags = models.ManyToManyField( Tag, related_name="documents", blank=True) - created = models.DateTimeField(default=timezone.now, editable=False) + created = models.DateTimeField(default=timezone.now) modified = models.DateTimeField(auto_now=True, editable=False) class Meta(object): From 8115cf8905af3e4bc69a8d0b9f6a48b924dcee83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20G=C3=B3mez?= <jaime.gomez@iteisa.com> Date: Mon, 21 Mar 2016 21:57:36 +0100 Subject: [PATCH 18/26] Improves the docs: OCRing files in languages other than English + fixes typos --- README.rst | 2 +- docs/consumption.rst | 2 +- docs/index.rst | 1 + docs/requirements.rst | 2 +- docs/troubleshooting.rst | 18 ++++++++++++++++++ 5 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 docs/troubleshooting.rst diff --git a/README.rst b/README.rst index 71b59750b..6eec07d72 100644 --- a/README.rst +++ b/README.rst @@ -59,7 +59,7 @@ powerful tools. * `ImageMagick`_ converts the images between colour and greyscale. * `Tesseract`_ does the character recognition. -* `Unpaper`_ despeckles and and deskews the scanned image. +* `Unpaper`_ despeckles and deskews the scanned image. * `GNU Privacy Guard`_ is used as the encryption backend. * `Python 3`_ is the language of the project. diff --git a/docs/consumption.rst b/docs/consumption.rst index eadf12823..6e5bd8574 100644 --- a/docs/consumption.rst +++ b/docs/consumption.rst @@ -128,7 +128,7 @@ following name/value pairs: don't start uploading stuff to your server. The means of generating this signature is defined below. -Specify ``enctype="multipart/form-data"``, and then POST your file with::: +Specify ``enctype="multipart/form-data"``, and then POST your file with:: Content-Disposition: form-data; name="document"; filename="whatever.pdf" diff --git a/docs/index.rst b/docs/index.rst index 47710d376..43f77b15a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -33,4 +33,5 @@ Contents api utilities migrating + troubleshooting changelog diff --git a/docs/requirements.rst b/docs/requirements.rst index 5d4fddaf0..d31096257 100644 --- a/docs/requirements.rst +++ b/docs/requirements.rst @@ -8,7 +8,7 @@ should work) that has the following software installed on it: * `Python3`_ (with development libraries, pip and virtualenv) * `GNU Privacy Guard`_ -* `Tesseract`_ +* `Tesseract`_, plus it's language files matching your document base. * `Imagemagick`_ * `unpaper`_ diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst new file mode 100644 index 000000000..bf2890304 --- /dev/null +++ b/docs/troubleshooting.rst @@ -0,0 +1,18 @@ +.. _troubleshooting: + +Troubleshooting +=============== + +.. _troubleshooting_ocr_language_files_missing: + +Consumer warns ``OCR for XX failed`` +------------------------------------ + +If you find the OCR accuracy to be too low, and/or the document consumer warns that ``OCR for +XX failed, but we're going to stick with what we've got since FORGIVING_OCR is enabled``, then you +might need to install the `Tesseract language files +<http://packages.ubuntu.com/search?keywords=tesseract-ocr>`_ marching your documents languages. + +As an example, if your documents are written in Spanish you may need to run:: + + apt-get install -y tesseract-ocr-spa From a366542ed995415696b031a15b1c4eed9c5434c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20G=C3=B3mez?= <jaime.gomez@iteisa.com> Date: Wed, 23 Mar 2016 02:41:29 +0100 Subject: [PATCH 19/26] Docs: fixes typos + clarifies troubleshotting section --- docs/requirements.rst | 2 +- docs/troubleshooting.rst | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/requirements.rst b/docs/requirements.rst index d31096257..a1567361a 100644 --- a/docs/requirements.rst +++ b/docs/requirements.rst @@ -8,7 +8,7 @@ should work) that has the following software installed on it: * `Python3`_ (with development libraries, pip and virtualenv) * `GNU Privacy Guard`_ -* `Tesseract`_, plus it's language files matching your document base. +* `Tesseract`_, plus its language files matching your document base. * `Imagemagick`_ * `unpaper`_ diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index bf2890304..aab2d7759 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -13,6 +13,7 @@ XX failed, but we're going to stick with what we've got since FORGIVING_OCR is e might need to install the `Tesseract language files <http://packages.ubuntu.com/search?keywords=tesseract-ocr>`_ marching your documents languages. -As an example, if your documents are written in Spanish you may need to run:: +As an example, if you are runing Paperless from the Vagrant setup provided (or from any Ubuntu or Debian +box), and your documents are written in Spanish you may need to run:: apt-get install -y tesseract-ocr-spa From 37191f038366e571806d59503e79c774f9bf9bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20G=C3=B3mez=20Obreg=C3=B3n?= <jaime@iteisa.com> Date: Wed, 23 Mar 2016 02:48:04 +0100 Subject: [PATCH 20/26] Fixes typo --- docs/troubleshooting.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index aab2d7759..0fa7c1a29 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -13,7 +13,7 @@ XX failed, but we're going to stick with what we've got since FORGIVING_OCR is e might need to install the `Tesseract language files <http://packages.ubuntu.com/search?keywords=tesseract-ocr>`_ marching your documents languages. -As an example, if you are runing Paperless from the Vagrant setup provided (or from any Ubuntu or Debian +As an example, if you are running Paperless from the Vagrant setup provided (or from any Ubuntu or Debian box), and your documents are written in Spanish you may need to run:: apt-get install -y tesseract-ocr-spa From 0aa0513004f17e81462ff7fdfd450cced83c5cae Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Thu, 24 Mar 2016 19:18:33 +0000 Subject: [PATCH 21/26] Modifications for support for dates --- src/documents/consumer.py | 7 +- .../management/commands/document_exporter.py | 21 +- src/documents/models.py | 227 +++++++++++------- src/documents/tests/test_consumer.py | 205 ++++++++++++---- 4 files changed, 314 insertions(+), 146 deletions(-) diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 704548013..45239696b 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -19,12 +19,11 @@ from PIL import Image from django.conf import settings from django.utils import timezone -from django.template.defaultfilters import slugify from pyocr.tesseract import TesseractError from paperless.db import GnuPG -from .models import Correspondent, Tag, Document, Log, FileInfo +from .models import Tag, Document, Log, FileInfo from .languages import ISO639 @@ -92,7 +91,7 @@ class Consumer(object): if not os.path.isfile(doc): continue - if not re.match(FileInfo.REGEX_TITLE, doc): + if not re.match(FileInfo.REGEXES["title"], doc): continue if doc in self._ignore: @@ -269,7 +268,7 @@ class Consumer(object): correspondent=file_info.correspondent, title=file_info.title, content=text, - file_type=file_info.suffix, + file_type=file_info.extension, created=timezone.make_aware( datetime.datetime.fromtimestamp(stats.st_mtime)), modified=timezone.make_aware( diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index 913f7ae79..1c6ac6e44 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -96,11 +96,16 @@ class Command(Renderable, BaseCommand): @staticmethod def _get_legacy_file_name(doc): - if doc.correspondent and doc.title: - tags = ",".join([t.slug for t in doc.tags.all()]) - if tags: - return "{} - {} - {}.{}".format( - doc.correspondent, doc.title, tags, doc.file_type) - return "{} - {}.{}".format( - doc.correspondent, doc.title, doc.file_type) - return os.path.basename(doc.source_path) + + if not doc.correspondent and not doc.title: + return os.path.basename(doc.source_path) + + created = doc.created.strftime("%Y%m%d%H%M%SZ") + tags = ",".join([t.slug for t in doc.tags.all()]) + + if tags: + return "{} - {} - {} - {}.{}".format( + created, doc.correspondent, doc.title, tags, doc.file_type) + + return "{} - {} - {}.{}".format( + created, doc.correspondent, doc.title, doc.file_type) diff --git a/src/documents/models.py b/src/documents/models.py index 94dc60102..8880935e3 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -1,8 +1,11 @@ +import dateutil.parser import logging import os import re import uuid +from collections import OrderedDict + from django.conf import settings from django.core.urlresolvers import reverse from django.db import models @@ -12,97 +15,6 @@ from django.utils import timezone from .managers import LogManager -class FileInfo(object): - def __init__(self, title, suffix, - correspondent=None, tags=None): - self._title = title - self._suffix = suffix - self._correspondent = correspondent - self._tags = tags - - REGEX_TITLE = re.compile( - r"^.*/(.*)\.(pdf|jpe?g|png|gif|tiff)$", - flags=re.IGNORECASE - ) - REGEX_CORRESPONDENT_TITLE = re.compile( - r"^.*/(.+) - (.*)\.(pdf|jpe?g|png|gif|tiff)$", - flags=re.IGNORECASE - ) - REGEX_CORRESPONDENT_TITLE_TAGS = re.compile( - r"^.*/(.*) - (.*) - ([a-z0-9\-,]*)\.(pdf|jpe?g|png|gif|tiff)$", - flags=re.IGNORECASE - ) - - @classmethod - def from_path(cls, path): - """ - We use a crude naming convention to make handling the correspondent, - title, and tags easier: - "<correspondent> - <title> - <tags>.<suffix>" - "<correspondent> - <title>.<suffix>" - "<title>.<suffix>" - """ - - def get_correspondent(correspondent_name): - return Correspondent.objects.get_or_create( - name=correspondent_name, - defaults={"slug": slugify(correspondent_name)} - )[0] - - def get_tags(tags): - r = [] - for t in tags.split(","): - r.append( - Tag.objects.get_or_create(slug=t, defaults={"name": t})[0]) - return tuple(r) - - def get_suffix(suffix): - suffix = suffix.lower() - if suffix == "jpeg": - return "jpg" - return suffix - - # First attempt: "<correspondent> - <title> - <tags>.<suffix>" - m = re.match(cls.REGEX_CORRESPONDENT_TITLE_TAGS, path) - if m: - return cls( - title=m.group(2), - correspondent=get_correspondent(m.group(1)), - tags=get_tags(m.group(3)), - suffix=get_suffix(m.group(4)) - ) - - # Second attempt: "<correspondent> - <title>.<suffix>" - m = re.match(cls.REGEX_CORRESPONDENT_TITLE, path) - if m: - return cls( - title=m.group(2), - correspondent=get_correspondent(m.group(1)), - tags=(), - suffix=get_suffix(m.group(3)) - ) - - # That didn't work, so we assume correspondent and tags are None - m = re.match(cls.REGEX_TITLE, path) - return FileInfo( - title=m.group(1), tags=(), suffix=get_suffix(m.group(2))) - - @property - def title(self): - return self._title - - @property - def correspondent(self): - return self._correspondent - - @property - def tags(self): - return self._tags - - @property - def suffix(self): - return self._suffix - class SluggedModel(models.Model): name = models.CharField(max_length=128, unique=True) @@ -341,3 +253,136 @@ class Log(models.Model): self.group = uuid.uuid4() models.Model.save(self, *args, **kwargs) + + +class FileInfo(object): + + # This epic regex *almost* worked for our needs, so I'm keeping it here for + # posterity, in the hopes that we might find a way to make it work one day. + ALMOST_REGEX = re.compile( + r"^((?P<date>\d\d\d\d\d\d\d\d\d\d\d\d\d\dZ){separator})?" + r"((?P<correspondent>{non_separated_word}+){separator})??" + r"(?P<title>{non_separated_word}+)" + r"({separator}(?P<tags>[a-z,0-9-]+))?" + r"\.(?P<extension>[a-zA-Z.-]+)$".format( + separator=r"\s+-\s+", + non_separated_word=r"([\w,. ]|([^\s]-))" + ) + ) + + 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)$", + 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)$", + 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)$", + 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)$", + 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)$", + flags=re.IGNORECASE + )), + ("correspondent-title", re.compile( + r"(?P<correspondent>.*) - " + r"(?P<title>.*)?" + r"\.(?P<extension>pdf|jpe?g|png|gif|tiff)$", + flags=re.IGNORECASE + )), + ("title", re.compile( + r"(?P<title>.*)" + r"\.(?P<extension>pdf|jpe?g|png|gif|tiff)$", + flags=re.IGNORECASE + )) + ]) + + def __init__(self, created=None, correspondent=None, title=None, tags=(), + extension=None): + + self.created = created + self.title = title + self.extension = extension + self.correspondent = correspondent + self.tags = tags + + @classmethod + def _get_created(cls, created): + return dateutil.parser.parse("{:0<14}Z".format(created[:-1])) + + @classmethod + def _get_correspondent(cls, name): + if not name: + return None + return Correspondent.objects.get_or_create(name=name, defaults={ + "slug": slugify(name) + })[0] + + @classmethod + def _get_title(cls, title): + return title + + @classmethod + def _get_tags(cls, tags): + r = [] + for t in tags.split(","): + r.append( + Tag.objects.get_or_create(slug=t, defaults={"name": t})[0]) + return tuple(r) + + @classmethod + def _get_extension(cls, extension): + r = extension.lower() + if r == "jpeg": + return "jpg" + return r + + @classmethod + def _mangle_property(cls, properties, name): + if name in properties: + properties[name] = getattr(cls, "_get_{}".format(name))( + properties[name] + ) + + @classmethod + def from_path(cls, path): + """ + We use a crude naming convention to make handling the correspondent, + title, and tags easier: + "<correspondent> - <title> - <tags>.<suffix>" + "<correspondent> - <title>.<suffix>" + "<title>.<suffix>" + """ + + for regex in cls.REGEXES.values(): + m = regex.match(os.path.basename(path)) + if m: + properties = m.groupdict() + cls._mangle_property(properties, "created") + cls._mangle_property(properties, "correspondent") + cls._mangle_property(properties, "title") + cls._mangle_property(properties, "tags") + cls._mangle_property(properties, "extension") + return cls(**properties) diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 634e8c4f0..48407044d 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -1,28 +1,36 @@ from django.test import TestCase -from ..models import FileInfo +from ..models import Document, FileInfo class TestAttachment(TestCase): TAGS = ("tag1", "tag2", "tag3") - SUFFIXES = ( + EXTENSIONS = ( "pdf", "png", "jpg", "jpeg", "gif", "PDF", "PNG", "JPG", "JPEG", "GIF", "PdF", "PnG", "JpG", "JPeG", "GiF", ) def _test_guess_attributes_from_name(self, path, sender, title, tags): - for suffix in self.SUFFIXES: - f = path.format(suffix) + + for extension in self.EXTENSIONS: + + f = path.format(extension) file_info = FileInfo.from_path(f) - self.assertEqual(file_info.correspondent.name, sender, f) - self.assertEqual(file_info.title, title, f) - self.assertEqual(tuple([t.slug for t in file_info.tags]), tags, f) - if suffix.lower() == "jpeg": - self.assertEqual(file_info.suffix, "jpg", f) + + if sender: + self.assertEqual(file_info.correspondent.name, sender, f) else: - self.assertEqual(file_info.suffix, suffix.lower(), f) + self.assertIsNone(file_info.correspondent, f) + + self.assertEqual(file_info.title, title, f) + + self.assertEqual(tuple([t.slug for t in file_info.tags]), tags, f) + if extension.lower() == "jpeg": + self.assertEqual(file_info.extension, "jpg", f) + else: + self.assertEqual(file_info.extension, extension.lower(), f) def test_guess_attributes_from_name0(self): self._test_guess_attributes_from_name( @@ -96,7 +104,7 @@ class TestAttachment(TestCase): self._test_guess_attributes_from_name( '/path/to/ - weird empty correspondent but should not break.{}', None, - ' - weird empty correspondent but should not break', + 'weird empty correspondent but should not break', () ) @@ -126,60 +134,171 @@ class TestAttachment(TestCase): class Permutations(TestCase): - valid_correspondents = ['timmy', 'Dr. McWheelie', - 'Dash Gor-don', 'ο Θερμαστής'] - valid_titles = ['title', 'Title w Spaces', 'Title a-dash', 'Τίτλος', ''] - valid_tags = ['tag', 'tig,tag', '-', '0,1,2', ''] - valid_suffixes = ['pdf', 'png', 'jpg', 'jpeg', 'gif'] - def _test_guessed_attributes( - self, filename, title, suffix, correspondent=None, tags=None): - file_info = FileInfo.from_path(filename) + valid_dates = ( + "20150102030405Z", + "20150102Z", + ) + valid_correspondents = [ + "timmy", + "Dr. McWheelie", + "Dash Gor-don", + "ο Θερμαστής", + "" + ] + valid_titles = ["title", "Title w Spaces", "Title a-dash", "Τίτλος", ""] + valid_tags = ["tag", "tig,tag", "tag1,tag2,tag-3"] + valid_extensions = ["pdf", "png", "jpg", "jpeg", "gif"] - # Required - self.assertEqual(file_info.title, title, filename) - if suffix == 'jpeg': - suffix = 'jpg' - self.assertEqual(file_info.suffix, suffix, filename) - # Optional - if correspondent is None: - self.assertEqual(file_info.correspondent, - correspondent, filename) + def _test_guessed_attributes(self, filename, created=None, + correspondent=None, title=None, + extension=None, tags=None): + + # print(filename) + info = FileInfo.from_path(filename) + + # Created + if created is None: + self.assertIsNone(info.created, filename) else: - self.assertEqual(file_info.correspondent.name, - correspondent, filename) + self.assertEqual(info.created.year, int(created[:4]), filename) + self.assertEqual(info.created.month, int(created[4:6]), filename) + self.assertEqual(info.created.day, int(created[6:8]), filename) + + # Correspondent + if correspondent: + self.assertEqual(info.correspondent.name, correspondent, filename) + else: + self.assertEqual(info.correspondent, None, filename) + + # Title + self.assertEqual(info.title, title, filename) + + # Tags if tags is None: - self.assertEqual(file_info.tags, (), filename) + self.assertEqual(info.tags, (), filename) else: - self.assertEqual([t.slug for t in file_info.tags], - tags.split(','), - filename) + self.assertEqual( + [t.slug for t in info.tags], tags.split(','), + filename + ) + + # Extension + if extension == 'jpeg': + extension = 'jpg' + self.assertEqual(info.extension, extension, filename) def test_just_title(self): - template = '/path/to/{title}.{suffix}' + template = '/path/to/{title}.{extension}' for title in self.valid_titles: - for suffix in self.valid_suffixes: - spec = dict(title=title, suffix=suffix) + for extension in self.valid_extensions: + spec = dict(title=title, extension=extension) filename = template.format(**spec) self._test_guessed_attributes(filename, **spec) def test_title_and_correspondent(self): - template = '/path/to/{correspondent} - {title}.{suffix}' + template = '/path/to/{correspondent} - {title}.{extension}' for correspondent in self.valid_correspondents: for title in self.valid_titles: - for suffix in self.valid_suffixes: + for extension in self.valid_extensions: spec = dict(correspondent=correspondent, title=title, - suffix=suffix) + extension=extension) filename = template.format(**spec) self._test_guessed_attributes(filename, **spec) def test_title_and_correspondent_and_tags(self): - template = '/path/to/{correspondent} - {title} - {tags}.{suffix}' + template = '/path/to/{correspondent} - {title} - {tags}.{extension}' for correspondent in self.valid_correspondents: for title in self.valid_titles: for tags in self.valid_tags: - for suffix in self.valid_suffixes: + for extension in self.valid_extensions: spec = dict(correspondent=correspondent, title=title, - tags=tags, suffix=suffix) + tags=tags, extension=extension) filename = template.format(**spec) self._test_guessed_attributes(filename, **spec) + + def test_created_and_correspondent_and_title_and_tags(self): + + template = ("/path/to/{created} - " + "{correspondent} - " + "{title} - " + "{tags}" + ".{extension}") + + for created in self.valid_dates: + for correspondent in self.valid_correspondents: + for title in self.valid_titles: + for tags in self.valid_tags: + for extension in self.valid_extensions: + spec = { + "created": created, + "correspondent": correspondent, + "title": title, + "tags": tags, + "extension": extension + } + self._test_guessed_attributes( + template.format(**spec), **spec) + + def test_created_and_correspondent_and_title(self): + + template = ("/path/to/{created} - " + "{correspondent} - " + "{title}" + ".{extension}") + + for created in self.valid_dates: + for correspondent in self.valid_correspondents: + for title in self.valid_titles: + + # Skip cases where title looks like a tag as we can't + # accommodate such cases. + if title.lower() == title: + continue + + for extension in self.valid_extensions: + spec = { + "created": created, + "correspondent": correspondent, + "title": title, + "extension": extension + } + self._test_guessed_attributes( + template.format(**spec), **spec) + + def test_created_and_title(self): + + template = ("/path/to/{created} - " + "{title}" + ".{extension}") + + for created in self.valid_dates: + for title in self.valid_titles: + for extension in self.valid_extensions: + spec = { + "created": created, + "title": title, + "extension": extension + } + self._test_guessed_attributes( + template.format(**spec), **spec) + + def test_created_and_title_and_tags(self): + + template = ("/path/to/{created} - " + "{title} - " + "{tags}" + ".{extension}") + + for created in self.valid_dates: + for title in self.valid_titles: + for tags in self.valid_tags: + for extension in self.valid_extensions: + spec = { + "created": created, + "title": title, + "tags": tags, + "extension": extension + } + self._test_guessed_attributes( + template.format(**spec), **spec) From 868591562f71aa45c7de512b3f25d49ce781043e Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Thu, 24 Mar 2016 19:19:02 +0000 Subject: [PATCH 22/26] Version bump for Django --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 527ca4142..04ec38065 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Django==1.9.2 +Django==1.9.4 Pillow==3.1.1 django-crispy-forms==1.6.0 django-extensions==1.6.1 From b69d25d2b34f1f9b602b2a0bbb1fea25a283b2bb Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Thu, 24 Mar 2016 19:24:33 +0000 Subject: [PATCH 23/26] Document the new date support in file names --- docs/consumption.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/consumption.rst b/docs/consumption.rst index 6e5bd8574..28adf65e7 100644 --- a/docs/consumption.rst +++ b/docs/consumption.rst @@ -45,19 +45,25 @@ you name the file right, it'll automatically set some values in the database for you. This is is the logic the consumer follows: 1. Try to find the correspondent, title, and tags in the file name following + the pattern: ``Date - Correspondent - Title - tag,tag,tag.pdf``. Note that + the format of the date is **rigidly defined** as ``YYYYMMDDHHMMSSZ``. The + ``Z`` is for "Zulu time" AKA "UTC". +2. If that doesn't work, we skip the date and try this pattern: the pattern: ``Correspondent - Title - tag,tag,tag.pdf``. -2. If that doesn't work, try to find the correspondent and title in the file +3. If that doesn't work, we try to find the correspondent and title in the file name following the pattern: ``Correspondent - Title.pdf``. -3. If that doesn't work, just assume that the name of the file is the title. +4. If that doesn't work, just assume that the name of the file is the title. So given the above, the following examples would work as you'd expect: +* ``20150314000700Z - 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`` * ``Dad's Recipe for Pancakes.png`` These however wouldn't work: +* ``2015-03-14 00:07:00 UTC - 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`` From 0c2b6a6b28df6cab6bfe99e3427bae301f4d5261 Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Thu, 24 Mar 2016 19:30:15 +0000 Subject: [PATCH 24/26] Added reference to the new date feature in file names --- docs/changelog.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index f2ab6cabc..d7a973d39 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,6 +1,14 @@ Changelog ######### +* 0.2.0 + + * Added support for guessing the date from the file name along with the + correspondent, title, and tags. Thanks to `Tikitu de Jager`_ for his pull + request that I took forever to merge and to `Pit`_ for his efforts on the + regex front. + * `#94`_: Restored support for changing the created date in the UI. + * 0.1.1 * Potentially **Breaking Change**: All references to "sender" in the code @@ -99,3 +107,4 @@ Changelog .. _#67: https://github.com/danielquinn/paperless/issues/67 .. _#68: https://github.com/danielquinn/paperless/issues/68 .. _#71: https://github.com/danielquinn/paperless/issues/71 +.. _#94: https://github.com/danielquinn/paperless/issues/71 From 4187840844a5c88465c52f0bff4816e496c95c30 Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Fri, 25 Mar 2016 00:14:42 +0000 Subject: [PATCH 25/26] Update to include short form for dates --- docs/consumption.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/consumption.rst b/docs/consumption.rst index 28adf65e7..2e404fddd 100644 --- a/docs/consumption.rst +++ b/docs/consumption.rst @@ -46,8 +46,8 @@ for you. This is is the logic the consumer follows: 1. Try to find the correspondent, title, and tags in the file name following the pattern: ``Date - Correspondent - Title - tag,tag,tag.pdf``. Note that - the format of the date is **rigidly defined** as ``YYYYMMDDHHMMSSZ``. The - ``Z`` is for "Zulu time" AKA "UTC". + the format of the date is **rigidly defined** as ``YYYYMMDDHHMMSSZ`` or + ``YYYYMMDDZ``. The ``Z`` is for "Zulu time" AKA "UTC". 2. If that doesn't work, we skip the date and try this pattern: the pattern: ``Correspondent - Title - tag,tag,tag.pdf``. 3. If that doesn't work, we try to find the correspondent and title in the file @@ -57,6 +57,7 @@ for you. This is is the logic the consumer follows: So given the above, the following examples would work as you'd expect: * ``20150314000700Z - Some Company Name - Invoice 2016-01-01 - money,invoices.pdf`` +* ``20150314Z - 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`` * ``Dad's Recipe for Pancakes.png`` @@ -64,6 +65,7 @@ So given the above, the following examples would work as you'd expect: These however wouldn't work: * ``2015-03-14 00:07:00 UTC - Some Company Name, Invoice 2016-01-01, money, invoices.pdf`` +* ``2015-03-14 - 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`` From 396ff98b41a52fef3a82a63c1b599b0cf5e5462a Mon Sep 17 00:00:00 2001 From: Daniel Quinn <code@danielquinn.org> Date: Fri, 25 Mar 2016 00:35:56 +0000 Subject: [PATCH 26/26] Credit where it's due --- docs/changelog.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index d7a973d39..c1397bb6c 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,7 +7,8 @@ Changelog correspondent, title, and tags. Thanks to `Tikitu de Jager`_ for his pull request that I took forever to merge and to `Pit`_ for his efforts on the regex front. - * `#94`_: Restored support for changing the created date in the UI. + * `#94`_: Restored support for changing the created date in the UI. Thanks + to `Martin Honermeyer`_ and `Tim White`_ for working with me on this. * 0.1.1 @@ -94,6 +95,8 @@ Changelog .. _Wayne Werner: https://github.com/waynew .. _darkmatter: https://github.com/darkmatter .. _zedster: https://github.com/zedster +.. _Martin Honermeyer: https://github.com/djmaze +.. _Tim White: https://github.com/timwhite .. _#20: https://github.com/danielquinn/paperless/issues/20 .. _#44: https://github.com/danielquinn/paperless/issues/44