mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Merge branch 'dev' into feature-ocrmypdf
This commit is contained in:
		
							
								
								
									
										3
									
								
								Pipfile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Pipfile
									
									
									
									
									
								
							| @@ -8,6 +8,9 @@ url = "https://www.piwheels.org/simple" | |||||||
| verify_ssl = true | verify_ssl = true | ||||||
| name = "piwheels" | name = "piwheels" | ||||||
|  |  | ||||||
|  | [requires] | ||||||
|  | python_version = "3.6" | ||||||
|  |  | ||||||
| [packages] | [packages] | ||||||
| dateparser = "~=0.7.6" | dateparser = "~=0.7.6" | ||||||
| django = "~=3.1.3" | django = "~=3.1.3" | ||||||
|   | |||||||
							
								
								
									
										300
									
								
								Pipfile.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										300
									
								
								Pipfile.lock
									
									
									
										generated
									
									
									
								
							| @@ -1,10 +1,12 @@ | |||||||
| { | { | ||||||
|     "_meta": { |     "_meta": { | ||||||
|         "hash": { |         "hash": { | ||||||
|             "sha256": "26759fe167ac996e73955a87ed2e5406a8f6da74ce0c4f67b995cd4f434fc176" |             "sha256": "d6432a18280c092c108e998f00bcd377c0c55ef18f26cb0b8eb64f9618b9f383" | ||||||
|         }, |         }, | ||||||
|         "pipfile-spec": 6, |         "pipfile-spec": 6, | ||||||
|         "requires": {}, |         "requires": { | ||||||
|  |             "python_version": "3.6" | ||||||
|  |         }, | ||||||
|         "sources": [ |         "sources": [ | ||||||
|             { |             { | ||||||
|                 "name": "pypi", |                 "name": "pypi", | ||||||
| @@ -42,94 +44,6 @@ | |||||||
|             ], |             ], | ||||||
|             "version": "==1.17.11" |             "version": "==1.17.11" | ||||||
|         }, |         }, | ||||||
|         "cffi": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e", |  | ||||||
|                 "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d", |  | ||||||
|                 "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a", |  | ||||||
|                 "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec", |  | ||||||
|                 "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362", |  | ||||||
|                 "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668", |  | ||||||
|                 "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c", |  | ||||||
|                 "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b", |  | ||||||
|                 "sha256:23f318bf74b170c6e9adb390e8bd282457f6de46c19d03b52f3fd042b5e19654", |  | ||||||
|                 "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06", |  | ||||||
|                 "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698", |  | ||||||
|                 "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2", |  | ||||||
|                 "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c", |  | ||||||
|                 "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7", |  | ||||||
|                 "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009", |  | ||||||
|                 "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03", |  | ||||||
|                 "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b", |  | ||||||
|                 "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909", |  | ||||||
|                 "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53", |  | ||||||
|                 "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", |  | ||||||
|                 "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", |  | ||||||
|                 "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", |  | ||||||
|                 "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", |  | ||||||
|                 "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", |  | ||||||
|                 "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", |  | ||||||
|                 "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", |  | ||||||
|                 "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", |  | ||||||
|                 "sha256:be8661bcee1bc2fc4b033a6ab65bd1f87ce5008492601695d0b9a4e820c3bde5", |  | ||||||
|                 "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", |  | ||||||
|                 "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", |  | ||||||
|                 "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", |  | ||||||
|                 "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", |  | ||||||
|                 "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375", |  | ||||||
|                 "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b", |  | ||||||
|                 "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b", |  | ||||||
|                 "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f" |  | ||||||
|             ], |  | ||||||
|             "version": "==1.14.4" |  | ||||||
|         }, |  | ||||||
|         "chardet": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", |  | ||||||
|                 "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '3.1'", |  | ||||||
|             "version": "==3.0.4" |  | ||||||
|         }, |  | ||||||
|         "coloredlogs": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:346f58aad6afd48444c2468618623638dadab76e4e70d5e10822676f2d32226a", |  | ||||||
|                 "sha256:a1fab193d2053aa6c0a97608c4342d031f1f93a3d1218432c59322441d31a505", |  | ||||||
|                 "sha256:b0c2124367d4f72bd739f48e1f61491b4baf145d6bda33b606b4a53cb3f96a97" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", |  | ||||||
|             "version": "==14.0" |  | ||||||
|         }, |  | ||||||
|         "cryptography": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538", |  | ||||||
|                 "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f", |  | ||||||
|                 "sha256:257dab4f368fae15f378ea9a4d2799bf3696668062de0e9fa0ebb7a738a6917d", |  | ||||||
|                 "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77", |  | ||||||
|                 "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b", |  | ||||||
|                 "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33", |  | ||||||
|                 "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e", |  | ||||||
|                 "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb", |  | ||||||
|                 "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e", |  | ||||||
|                 "sha256:59f7d4cfea9ef12eb9b14b83d79b432162a0a24a91ddc15c2c9bf76a68d96f2b", |  | ||||||
|                 "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7", |  | ||||||
|                 "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297", |  | ||||||
|                 "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d", |  | ||||||
|                 "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7", |  | ||||||
|                 "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b", |  | ||||||
|                 "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7", |  | ||||||
|                 "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4", |  | ||||||
|                 "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8", |  | ||||||
|                 "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b", |  | ||||||
|                 "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851", |  | ||||||
|                 "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13", |  | ||||||
|                 "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b", |  | ||||||
|                 "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3", |  | ||||||
|                 "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", |  | ||||||
|             "version": "==3.2.1" |  | ||||||
|         }, |  | ||||||
|         "dateparser": { |         "dateparser": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:7552c994f893b5cb8fcf103b4cd2ff7f57aab9bfd2619fdf0cf571c0740fd90b", |                 "sha256:7552c994f893b5cb8fcf103b4cd2ff7f57aab9bfd2619fdf0cf571c0740fd90b", | ||||||
| @@ -209,14 +123,6 @@ | |||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==20.0.4" |             "version": "==20.0.4" | ||||||
|         }, |         }, | ||||||
|         "humanfriendly": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:bf52ec91244819c780341a3438d5d7b09f431d3f113a475147ac9b7b167a3d12", |  | ||||||
|                 "sha256:e78960b31198511f45fd455534ae7645a6207d33e512d2e842c766d15d9c8080" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", |  | ||||||
|             "version": "==8.2" |  | ||||||
|         }, |  | ||||||
|         "imap-tools": { |         "imap-tools": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:96e9a4ff6483462635737730a1df28e739faa71967b12a84f4363fb386542246", |                 "sha256:96e9a4ff6483462635737730a1df28e739faa71967b12a84f4363fb386542246", | ||||||
| @@ -225,13 +131,6 @@ | |||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==0.32.0" |             "version": "==0.32.0" | ||||||
|         }, |         }, | ||||||
|         "img2pdf": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:57905015579b1026acf1605aa95859cd79b051fa1c35485573d165526fc9dbb5", |  | ||||||
|                 "sha256:eaee690ab8403dd1a9cb4db10afee41dd3e6c7ed63bdace02a0121f9feadb0c9" |  | ||||||
|             ], |  | ||||||
|             "version": "==0.4.0" |  | ||||||
|         }, |  | ||||||
|         "inotify-simple": { |         "inotify-simple": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:8440ffe49c4ae81a8df57c1ae1eb4b6bfa7acb830099bfb3e305b383005cc128", |                 "sha256:8440ffe49c4ae81a8df57c1ae1eb4b6bfa7acb830099bfb3e305b383005cc128", | ||||||
| @@ -257,51 +156,6 @@ | |||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==1.0.8" |             "version": "==1.0.8" | ||||||
|         }, |         }, | ||||||
|         "lxml": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:098fb713b31050463751dcc694878e1d39f316b86366fb9fe3fbbe5396ac9fab", |  | ||||||
|                 "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", |  | ||||||
|                 "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", |  | ||||||
|                 "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", |  | ||||||
|                 "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", |  | ||||||
|                 "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", |  | ||||||
|                 "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", |  | ||||||
|                 "sha256:24e811118aab6abe3ce23ff0d7d38932329c513f9cef849d3ee88b0f848f2aa9", |  | ||||||
|                 "sha256:288ddf94d9d0488187f578fdcc1868af2a6fe6714444c8259b68a83fa27b76d2", |  | ||||||
|                 "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", |  | ||||||
|                 "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311", |  | ||||||
|                 "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", |  | ||||||
|                 "sha256:302160eb6e9764168e01d8c9ec6becddeb87776e81d3fcb0d97954dd51d48e0a", |  | ||||||
|                 "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", |  | ||||||
|                 "sha256:3d9b2b72eb0dbbdb0e276403873ecfae870599c83ba22cadff2db58541e72856", |  | ||||||
|                 "sha256:475325e037fdf068e0c2140b818518cf6bc4aa72435c407a798b2db9f8e90810", |  | ||||||
|                 "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", |  | ||||||
|                 "sha256:4e006fdb434609956a8f710ffffe650afab414dc43728786ebdbdca48e179b14", |  | ||||||
|                 "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", |  | ||||||
|                 "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", |  | ||||||
|                 "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", |  | ||||||
|                 "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", |  | ||||||
|                 "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", |  | ||||||
|                 "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", |  | ||||||
|                 "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", |  | ||||||
|                 "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", |  | ||||||
|                 "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", |  | ||||||
|                 "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", |  | ||||||
|                 "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", |  | ||||||
|                 "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", |  | ||||||
|                 "sha256:c152b2e93b639d1f36ec5a8ca24cde4a8eefb2b6b83668fcd8e83a67badcb367", |  | ||||||
|                 "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", |  | ||||||
|                 "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", |  | ||||||
|                 "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", |  | ||||||
|                 "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", |  | ||||||
|                 "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", |  | ||||||
|                 "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", |  | ||||||
|                 "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", |  | ||||||
|                 "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", |  | ||||||
|             "version": "==4.6.1" |  | ||||||
|         }, |  | ||||||
|         "numpy": { |         "numpy": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db", |                 "sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db", | ||||||
| @@ -343,14 +197,6 @@ | |||||||
|             "markers": "python_version >= '3.6'", |             "markers": "python_version >= '3.6'", | ||||||
|             "version": "==1.19.4" |             "version": "==1.19.4" | ||||||
|         }, |         }, | ||||||
|         "ocrmypdf": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:20722d89d2f0deeb5b3ffa8622ead59d54af46d44f21848ec0f15ef79ce1a4a3", |  | ||||||
|                 "sha256:c592e1bb37abafd24f067043bbf98d25405521cbe1e992de30d8b870dbe86928" |  | ||||||
|             ], |  | ||||||
|             "index": "pypi", |  | ||||||
|             "version": "==11.3.3" |  | ||||||
|         }, |  | ||||||
|         "pathtools": { |         "pathtools": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0", |                 "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0", | ||||||
| @@ -366,14 +212,6 @@ | |||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==2.3.0" |             "version": "==2.3.0" | ||||||
|         }, |         }, | ||||||
|         "pdfminer.six": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:b9aac0ebeafb21c08bf65f2039f4b2c5f78a3449d0a41df711d72445649e952a", |  | ||||||
|                 "sha256:d78877ba8d8bf957f3bb636c4f73f4f6f30f56c461993877ac22c39c20837509" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '3.4'", |  | ||||||
|             "version": "==20201018" |  | ||||||
|         }, |  | ||||||
|         "pdftotext": { |         "pdftotext": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6" |                 "sha256:98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6" | ||||||
| @@ -381,33 +219,6 @@ | |||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==2.1.5" |             "version": "==2.1.5" | ||||||
|         }, |         }, | ||||||
|         "pikepdf": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:0dd42f791f29e7e2ab120103605b9ddd65937c773a72d21341a56873a89e76c9", |  | ||||||
|                 "sha256:12a1d243143cf972ce11def50f0bd1f6e630f5e660cdeddb2c7c49db5adad40a", |  | ||||||
|                 "sha256:2e1713af11b71e95c2d218c10d68b6f8e813be19c8596c560f3c84617f6d5437", |  | ||||||
|                 "sha256:2f90acad26d9939193946eb6ca8363fd3cf44b46b5c1409468906618bccb8113", |  | ||||||
|                 "sha256:3c482fe30fd58ff385795605a9233f37f97fb83427c3e829b1a568a2a3b59f60", |  | ||||||
|                 "sha256:3ddabfc33a8a7cecba76c1685ce5125fdf239a38d0854d7c2a703490b5783773", |  | ||||||
|                 "sha256:61dd3f13b7416111d19bf493ce4e7281f63a1dd22c532200cbbcd65813ea43e4", |  | ||||||
|                 "sha256:6ce42b7780835fb52452ccaff3a3ac1b28ae1f9d80faab59c559045d9fcb211d", |  | ||||||
|                 "sha256:6dba75782f108ebbf3947fcb29ea0ba7da0482868e53f6602643adc36245201d", |  | ||||||
|                 "sha256:716427a5c0372f3cc7dc282c4b49d49d8d5182a3e937739a4c3632151e74d6a4", |  | ||||||
|                 "sha256:730ef4013099da7ea722a9b5659260097af6f47ddfa3c2abab4d4493de2591f3", |  | ||||||
|                 "sha256:73e14bba4135adfb89ae2f2163369bd788ecf23839acc8d062d832118f07e288", |  | ||||||
|                 "sha256:84df07acc8968051da33891af55a3ab1aa55453d83df4ce9b84d821eedc34583", |  | ||||||
|                 "sha256:8f739e9c660d71cd479f11f9aa110857cf0d0d9c2472f40bbcbaf02f980355a1", |  | ||||||
|                 "sha256:a20ca7adbb9d3da416cf5f6de0ebca53855f9a3b99acdd6ec864c61482894d71", |  | ||||||
|                 "sha256:bc58d9486c0959619a2584e558a54d36468c6d1165cd9fe0bfb1ecc3e6b33c6a", |  | ||||||
|                 "sha256:c0627930a17b3a5e1a7c9109099535259afc50fe006a05af9c3634de05abd318", |  | ||||||
|                 "sha256:de5f445eaaadd7dae56e1043ab8ca5eef49ece302a4e37e1fc6d21b7dcfcfb1b", |  | ||||||
|                 "sha256:de6aae7782db33f2cc71c9ba63b7e2ec0e0529843c065eac4e71fcbe043426e2", |  | ||||||
|                 "sha256:e2efd844c09f8ce3103a93bfbd54983542a0a63c88bdc0f0cdbb2997f99a147d", |  | ||||||
|                 "sha256:fdb481ad1219e8d667625afd2f01b26f98df079e4f66e7e49816ec20c8d8c401" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version < '3.9'", |  | ||||||
|             "version": "==2.1.2" |  | ||||||
|         }, |  | ||||||
|         "pillow": { |         "pillow": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", |                 "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", | ||||||
| @@ -443,14 +254,6 @@ | |||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==8.0.1" |             "version": "==8.0.1" | ||||||
|         }, |         }, | ||||||
|         "pluggy": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", |  | ||||||
|                 "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", |  | ||||||
|             "version": "==0.13.1" |  | ||||||
|         }, |  | ||||||
|         "psycopg2-binary": { |         "psycopg2-binary": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:0deac2af1a587ae12836aa07970f5cb91964f05a7c6cdb69d8425ff4c15d4e2c", |                 "sha256:0deac2af1a587ae12836aa07970f5cb91964f05a7c6cdb69d8425ff4c15d4e2c", | ||||||
| @@ -494,14 +297,6 @@ | |||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==2.8.6" |             "version": "==2.8.6" | ||||||
|         }, |         }, | ||||||
|         "pycparser": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", |  | ||||||
|                 "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", |  | ||||||
|             "version": "==2.20" |  | ||||||
|         }, |  | ||||||
|         "pyocr": { |         "pyocr": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:fa15adc7e1cf0d345a2990495fe125a947c6e09a60ddba0256a1c14b2e603179", |                 "sha256:fa15adc7e1cf0d345a2990495fe125a947c6e09a60ddba0256a1c14b2e603179", | ||||||
| @@ -616,53 +411,6 @@ | |||||||
|             ], |             ], | ||||||
|             "version": "==2020.11.13" |             "version": "==2020.11.13" | ||||||
|         }, |         }, | ||||||
|         "reportlab": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:06be7f04a631f02cd0202f7dee0d3e61dc265223f4ff861525ed7784b5552540", |  | ||||||
|                 "sha256:0a788a537c48915eda083485b59ac40ac012fa7c43070069bde6eb5ea588313c", |  | ||||||
|                 "sha256:1a7a38810e79653d0ea8e61db4f0517ac2a0e76edd2497cf6d4969dd3be30030", |  | ||||||
|                 "sha256:22301773db730545b44d4c77d8f29baf5683ccabec9883d978e8b8eda6d2175f", |  | ||||||
|                 "sha256:2906321b3d2779faafe47e2c13f9c69e1fb4ddb907f5a49cab3f9b0ea95df1f5", |  | ||||||
|                 "sha256:2d65f9cc5c0d3f63b5d024e6cf92234f1ab1f267cc9e5a847ab5d3efe1c3cf3e", |  | ||||||
|                 "sha256:2e012f7b845ef9f1f5bd63461d5201fa624b019a65ff5a93d0002b4f915bbc89", |  | ||||||
|                 "sha256:31ccfdbf5bb5ec85f0397661085ce4c9e52537ca0d2bf4220259666a4dcc55c2", |  | ||||||
|                 "sha256:3e10bd20c8ada9f7e1113157aa73b8e0048f2624e74794b73799c3deb13d7a3f", |  | ||||||
|                 "sha256:440d5f86c2b822abdb7981d691a78bdcf56f4710174830283034235ab2af2969", |  | ||||||
|                 "sha256:4f307accda32c9f17015ed77c7424f904514e349dff063f78d2462d715963e53", |  | ||||||
|                 "sha256:59659ee8897950fd1acd41a9cc61f4afdfda52dc2bb69a1924ce68089491849d", |  | ||||||
|                 "sha256:6216b11313467989ac9d9578ea3756d0af46e97184ee4e11a6b7ef652458f70d", |  | ||||||
|                 "sha256:6268a9a3d75e714b22beeb7687270956b06b232ccfdf37b1c6462961eab04457", |  | ||||||
|                 "sha256:6b226830f80df066d5986a3fdb3eb4d1b6320048f3d9ade539a6c03a5bc8b3ec", |  | ||||||
|                 "sha256:6e10eba6a0e330096f4200b18824b3194c399329b7830e34baee1c04ea07f99f", |  | ||||||
|                 "sha256:6e224c16c3d6fafdb2fb67b33c4b84d984ec34869834b3a137809f2fe5b84778", |  | ||||||
|                 "sha256:7da162fa677b90bd14f19b20ff80fec18c24a31ac44e5342ba49e198b13c4f92", |  | ||||||
|                 "sha256:8406e960a974a65b765c9ff74b269aa64718b4af1e8c511ebdbd9a5b44b0c7e6", |  | ||||||
|                 "sha256:8999bb075102d1b8ca4aada6ca14653d52bf02e37fd064e477eb180741f75077", |  | ||||||
|                 "sha256:8ae21aa94e405bf5171718f11ebc702a0edf18c91d88b14c5c5724cabd664673", |  | ||||||
|                 "sha256:8f6163729612e815b89649aed2e237505362a78014199f819fd92f9e5c96769b", |  | ||||||
|                 "sha256:9699fa8f0911ad56b46cc60bbaebe1557fd1c9e8da98185a7a1c0c40193eba48", |  | ||||||
|                 "sha256:9a53d76eec33abda11617aad1c9f5f4a2d906dd2f92a03a3f1ea370efbb52c95", |  | ||||||
|                 "sha256:9ed4d761b726ff411565eddb10cb37a6bca0ec873d9a18a83cf078f4502a2d94", |  | ||||||
|                 "sha256:a020d308e7c2de284d5407e3c6c13e3977a62b314f7bfe19bcc69677931da589", |  | ||||||
|                 "sha256:a2e6c15aecbe631245aab639751a58671312cced7e17de1ed9c45fb37036f6c9", |  | ||||||
|                 "sha256:b10cb48606d97b70edb094576e3d493d40467395e4fc267655135a2c92defbe8", |  | ||||||
|                 "sha256:b8d6e9df5181ed07b7ae145258eb69e686133afc97930af51a3c0c9d784d834d", |  | ||||||
|                 "sha256:bbb297754f5cf25eb8fcb817752984252a7feb0ca83e383718e4eec2fb67ea32", |  | ||||||
|                 "sha256:be90599e5e78c1ddfcfee8c752108def58b4c672ebcc4d3d9aa7fe65e7d3f16b", |  | ||||||
|                 "sha256:bfdfad9b8ae00bd0752b77f954c7405327fd99b2cc6d5e4273e65be61429d56a", |  | ||||||
|                 "sha256:c1e5ef5089e16b249388f65d8c8f8b74989e72eb8332060dc580a2ecb967cfc2", |  | ||||||
|                 "sha256:c5ed342e29a5fd7eeb0f2ccf7e5b946b5f750f05633b2d6a94b1c02094a77967", |  | ||||||
|                 "sha256:c7087a26b26aa82a3ba27e13e66f507cc697f9ceb4c046c0f758876b55f040a5", |  | ||||||
|                 "sha256:cf589e980d92b0bf343fa512b9d3ae9ed0469cbffd99cb270b6c83da143cb437", |  | ||||||
|                 "sha256:e6fb762e524a4fb118be9f44dbd9456cf80e42253ee8f1bdb0ea5c1f882d4ba8", |  | ||||||
|                 "sha256:e961d3a84c65ca030963ca934a4faad2ac9fee75af36ba2f98733da7d3f7efab", |  | ||||||
|                 "sha256:f2fde5abb6f21c1eff5430f380cdbbee7fdeda6af935a83730ddce9f0c4e504e", |  | ||||||
|                 "sha256:f585b3bf7062c228306acd7f40b2ad915b32603228c19bb225952cc98fd2015a", |  | ||||||
|                 "sha256:f955a6366cf8e6729776c96e281bede468acd74f6eb49a5bbb048646adaa43d8", |  | ||||||
|                 "sha256:fe882fd348d8429debbdac4518d6a42888a7f4ad613dc596ce94788169caeb08" |  | ||||||
|             ], |  | ||||||
|             "version": "==3.5.55" |  | ||||||
|         }, |  | ||||||
|         "scikit-learn": { |         "scikit-learn": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:090bbf144fd5823c1f2efa3e1a9bf180295b24294ca8f478e75b40ed54f8036e", |                 "sha256:090bbf144fd5823c1f2efa3e1a9bf180295b24294ca8f478e75b40ed54f8036e", | ||||||
| @@ -726,13 +474,6 @@ | |||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", |             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", | ||||||
|             "version": "==1.15.0" |             "version": "==1.15.0" | ||||||
|         }, |         }, | ||||||
|         "sortedcontainers": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:37257a32add0a3ee490bb170b599e93095eed89a55da91fa9f48753ea12fd73f", |  | ||||||
|                 "sha256:59cc937650cf60d677c16775597c89a960658a09cf7c1a668f86e1e4464b10a1" |  | ||||||
|             ], |  | ||||||
|             "version": "==2.3.0" |  | ||||||
|         }, |  | ||||||
|         "sqlparse": { |         "sqlparse": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0", |                 "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0", | ||||||
| @@ -749,14 +490,6 @@ | |||||||
|             "markers": "python_version >= '3.5'", |             "markers": "python_version >= '3.5'", | ||||||
|             "version": "==2.1.0" |             "version": "==2.1.0" | ||||||
|         }, |         }, | ||||||
|         "tqdm": { |  | ||||||
|             "hashes": [ |  | ||||||
|                 "sha256:3d3f1470d26642e88bd3f73353cb6ff4c51ef7d5d7efef763238f4bc1f7e4e81", |  | ||||||
|                 "sha256:5ff3f5232b19fa4c5531641e480b7fad4598819f708a32eb815e6ea41c5fa313" |  | ||||||
|             ], |  | ||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", |  | ||||||
|             "version": "==4.53.0" |  | ||||||
|         }, |  | ||||||
|         "tzlocal": { |         "tzlocal": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44", |                 "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44", | ||||||
| @@ -848,7 +581,6 @@ | |||||||
|                 "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", |                 "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", | ||||||
|                 "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" |                 "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" | ||||||
|             ], |             ], | ||||||
|             "markers": "python_version >= '3.1'", |  | ||||||
|             "version": "==3.0.4" |             "version": "==3.0.4" | ||||||
|         }, |         }, | ||||||
|         "coverage": { |         "coverage": { | ||||||
| @@ -971,6 +703,22 @@ | |||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", |             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", | ||||||
|             "version": "==1.2.0" |             "version": "==1.2.0" | ||||||
|         }, |         }, | ||||||
|  |         "importlib-metadata": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:030f3b1bdb823ecbe4a9659e14cc861ce5af403fe99863bae173ec5fe00ab132", | ||||||
|  |                 "sha256:caeee3603f5dcf567864d1be9b839b0bcfdf1383e3e7be33ce2dead8144ff19c" | ||||||
|  |             ], | ||||||
|  |             "markers": "python_version < '3.8'", | ||||||
|  |             "version": "==2.1.0" | ||||||
|  |         }, | ||||||
|  |         "importlib-resources": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:7b51f0106c8ec564b1bef3d9c588bc694ce2b92125bbb6278f4f2f5b54ec3592", | ||||||
|  |                 "sha256:a3d34a8464ce1d5d7c92b0ea4e921e696d86f2aa212e684451cb1482c8d84ed5" | ||||||
|  |             ], | ||||||
|  |             "markers": "python_version < '3.7'", | ||||||
|  |             "version": "==3.3.0" | ||||||
|  |         }, | ||||||
|         "iniconfig": { |         "iniconfig": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", |                 "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", | ||||||
| @@ -1282,6 +1030,14 @@ | |||||||
|             ], |             ], | ||||||
|             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", |             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", | ||||||
|             "version": "==20.2.1" |             "version": "==20.2.1" | ||||||
|  |         }, | ||||||
|  |         "zipp": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108", | ||||||
|  |                 "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb" | ||||||
|  |             ], | ||||||
|  |             "markers": "python_version < '3.8'", | ||||||
|  |             "version": "==3.4.0" | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -64,15 +64,18 @@ def get_schema(): | |||||||
|  |  | ||||||
|  |  | ||||||
| def open_index(recreate=False): | def open_index(recreate=False): | ||||||
|     if exists_in(settings.INDEX_DIR) and not recreate: |     # TODO: this is not thread safe. If 2 instances try to create the index | ||||||
|         return open_dir(settings.INDEX_DIR) |     #  at the same time, this fails. This currently prevents parallel | ||||||
|     else: |     #  tests. | ||||||
|         # TODO: this is not thread safe. If 2 instances try to create the index |     try: | ||||||
|         #  at the same time, this fails. This currently prevents parallel |         if exists_in(settings.INDEX_DIR) and not recreate: | ||||||
|         #  tests. |             return open_dir(settings.INDEX_DIR) | ||||||
|         if not os.path.isdir(settings.INDEX_DIR): |     except Exception as e: | ||||||
|             os.makedirs(settings.INDEX_DIR, exist_ok=True) |         logger.error(f"Error while opening the index: {e}, recreating.") | ||||||
|         return create_in(settings.INDEX_DIR, get_schema()) |  | ||||||
|  |     if not os.path.isdir(settings.INDEX_DIR): | ||||||
|  |         os.makedirs(settings.INDEX_DIR, exist_ok=True) | ||||||
|  |     return create_in(settings.INDEX_DIR, get_schema()) | ||||||
|  |  | ||||||
|  |  | ||||||
| def update_document(writer, doc): | def update_document(writer, doc): | ||||||
|   | |||||||
| @@ -74,7 +74,7 @@ class Command(BaseCommand): | |||||||
|                     f"Abort: encrypted file {document.source_path} does not " |                     f"Abort: encrypted file {document.source_path} does not " | ||||||
|                     f"end with .gpg") |                     f"end with .gpg") | ||||||
|  |  | ||||||
|             document.filename = os.path.splitext(document.source_path)[0] |             document.filename = os.path.splitext(document.filename)[0] | ||||||
|  |  | ||||||
|             with open(document.source_path, "wb") as f: |             with open(document.source_path, "wb") as f: | ||||||
|                 f.write(raw_document) |                 f.write(raw_document) | ||||||
|   | |||||||
| @@ -95,14 +95,8 @@ class Command(BaseCommand): | |||||||
|     def handle(self, *args, **options): |     def handle(self, *args, **options): | ||||||
|         directory = options["directory"] |         directory = options["directory"] | ||||||
|  |  | ||||||
|         logging.getLogger(__name__).info( |  | ||||||
|             f"Starting document consumer at {directory}") |  | ||||||
|  |  | ||||||
|         for entry in os.scandir(directory): |         for entry in os.scandir(directory): | ||||||
|             if entry.is_file(): |             _consume(entry.path) | ||||||
|                 async_task("documents.tasks.consume_file", |  | ||||||
|                            entry.path, |  | ||||||
|                            task_name=os.path.basename(entry.path)[:100]) |  | ||||||
|  |  | ||||||
|         if options["oneshot"]: |         if options["oneshot"]: | ||||||
|             return |             return | ||||||
|   | |||||||
| @@ -22,13 +22,6 @@ class Command(Renderable, BaseCommand): | |||||||
|  |  | ||||||
|     def add_arguments(self, parser): |     def add_arguments(self, parser): | ||||||
|         parser.add_argument("target") |         parser.add_argument("target") | ||||||
|         parser.add_argument( |  | ||||||
|             "--legacy", |  | ||||||
|             action="store_true", |  | ||||||
|             help="Don't try to export all of the document data, just dump the " |  | ||||||
|                  "original document files out in a format that makes " |  | ||||||
|                  "re-consuming them easy." |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     def __init__(self, *args, **kwargs): |     def __init__(self, *args, **kwargs): | ||||||
|         BaseCommand.__init__(self, *args, **kwargs) |         BaseCommand.__init__(self, *args, **kwargs) | ||||||
| @@ -44,10 +37,7 @@ class Command(Renderable, BaseCommand): | |||||||
|         if not os.access(self.target, os.W_OK): |         if not os.access(self.target, os.W_OK): | ||||||
|             raise CommandError("That path doesn't appear to be writable") |             raise CommandError("That path doesn't appear to be writable") | ||||||
|  |  | ||||||
|         if options["legacy"]: |         self.dump() | ||||||
|             self.dump_legacy() |  | ||||||
|         else: |  | ||||||
|             self.dump() |  | ||||||
|  |  | ||||||
|     def dump(self): |     def dump(self): | ||||||
|  |  | ||||||
| @@ -102,33 +92,3 @@ class Command(Renderable, BaseCommand): | |||||||
|  |  | ||||||
|         with open(os.path.join(self.target, "manifest.json"), "w") as f: |         with open(os.path.join(self.target, "manifest.json"), "w") as f: | ||||||
|             json.dump(manifest, f, indent=2) |             json.dump(manifest, f, indent=2) | ||||||
|  |  | ||||||
|     def dump_legacy(self): |  | ||||||
|  |  | ||||||
|         for document in Document.objects.all(): |  | ||||||
|  |  | ||||||
|             target = os.path.join( |  | ||||||
|                 self.target, self._get_legacy_file_name(document)) |  | ||||||
|  |  | ||||||
|             print("Exporting: {}".format(target)) |  | ||||||
|  |  | ||||||
|             with open(target, "wb") as f: |  | ||||||
|                 f.write(GnuPG.decrypted(document.source_file)) |  | ||||||
|                 t = int(time.mktime(document.created.timetuple())) |  | ||||||
|                 os.utime(target, times=(t, t)) |  | ||||||
|  |  | ||||||
|     @staticmethod |  | ||||||
|     def _get_legacy_file_name(doc): |  | ||||||
|  |  | ||||||
|         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) |  | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/originals/0000001.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/originals/0000001.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/originals/0000002.pdf.gpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/originals/0000002.pdf.gpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/thumb/0000001.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/thumb/0000001.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/documents/tests/samples/thumb/0000002.png.gpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/documents/tests/samples/thumb/0000002.png.gpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1,41 +1,24 @@ | |||||||
| import os | import os | ||||||
| import shutil |  | ||||||
| import tempfile | import tempfile | ||||||
| from unittest import mock | from unittest import mock | ||||||
|  |  | ||||||
| from django.contrib.auth.models import User | from django.contrib.auth.models import User | ||||||
| from django.test import override_settings |  | ||||||
| from pathvalidate import ValidationError | from pathvalidate import ValidationError | ||||||
| from rest_framework.test import APITestCase | from rest_framework.test import APITestCase | ||||||
|  |  | ||||||
| from documents.models import Document, Correspondent, DocumentType, Tag | from documents.models import Document, Correspondent, DocumentType, Tag | ||||||
|  | from documents.tests.utils import setup_directories, remove_dirs | ||||||
|  |  | ||||||
|  |  | ||||||
| class DocumentApiTest(APITestCase): | class DocumentApiTest(APITestCase): | ||||||
|  |  | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|         self.scratch_dir = tempfile.mkdtemp() |         self.dirs = setup_directories() | ||||||
|         self.media_dir = tempfile.mkdtemp() |         self.addCleanup(remove_dirs, self.dirs) | ||||||
|         self.originals_dir = os.path.join(self.media_dir, "documents", "originals") |  | ||||||
|         self.thumbnail_dir = os.path.join(self.media_dir, "documents", "thumbnails") |  | ||||||
|  |  | ||||||
|         os.makedirs(self.originals_dir, exist_ok=True) |  | ||||||
|         os.makedirs(self.thumbnail_dir, exist_ok=True) |  | ||||||
|  |  | ||||||
|         override_settings( |  | ||||||
|             SCRATCH_DIR=self.scratch_dir, |  | ||||||
|             MEDIA_ROOT=self.media_dir, |  | ||||||
|             ORIGINALS_DIR=self.originals_dir, |  | ||||||
|             THUMBNAIL_DIR=self.thumbnail_dir |  | ||||||
|         ).enable() |  | ||||||
|  |  | ||||||
|         user = User.objects.create_superuser(username="temp_admin") |         user = User.objects.create_superuser(username="temp_admin") | ||||||
|         self.client.force_login(user=user) |         self.client.force_login(user=user) | ||||||
|  |  | ||||||
|     def tearDown(self): |  | ||||||
|         shutil.rmtree(self.scratch_dir, ignore_errors=True) |  | ||||||
|         shutil.rmtree(self.media_dir, ignore_errors=True) |  | ||||||
|  |  | ||||||
|     def testDocuments(self): |     def testDocuments(self): | ||||||
|  |  | ||||||
|         response = self.client.get("/api/documents/").data |         response = self.client.get("/api/documents/").data | ||||||
| @@ -88,7 +71,7 @@ class DocumentApiTest(APITestCase): | |||||||
|  |  | ||||||
|     def test_document_actions(self): |     def test_document_actions(self): | ||||||
|  |  | ||||||
|         _, filename = tempfile.mkstemp(dir=self.originals_dir) |         _, filename = tempfile.mkstemp(dir=self.dirs.originals_dir) | ||||||
|  |  | ||||||
|         content = b"This is a test" |         content = b"This is a test" | ||||||
|         content_thumbnail = b"thumbnail content" |         content_thumbnail = b"thumbnail content" | ||||||
| @@ -98,7 +81,7 @@ class DocumentApiTest(APITestCase): | |||||||
|  |  | ||||||
|         doc = Document.objects.create(title="none", filename=os.path.basename(filename), mime_type="application/pdf") |         doc = Document.objects.create(title="none", filename=os.path.basename(filename), mime_type="application/pdf") | ||||||
|  |  | ||||||
|         with open(os.path.join(self.thumbnail_dir, "{:07d}.png".format(doc.pk)), "wb") as f: |         with open(os.path.join(self.dirs.thumbnail_dir, "{:07d}.png".format(doc.pk)), "wb") as f: | ||||||
|             f.write(content_thumbnail) |             f.write(content_thumbnail) | ||||||
|  |  | ||||||
|         response = self.client.get('/api/documents/{}/download/'.format(doc.pk)) |         response = self.client.get('/api/documents/{}/download/'.format(doc.pk)) | ||||||
| @@ -227,7 +210,8 @@ class DocumentApiTest(APITestCase): | |||||||
|  |  | ||||||
|         m.assert_called_once() |         m.assert_called_once() | ||||||
|  |  | ||||||
|         self.assertEqual(m.call_args.kwargs['override_filename'], "simple.pdf") |         args, kwargs = m.call_args | ||||||
|  |         self.assertEqual(kwargs['override_filename'], "simple.pdf") | ||||||
|  |  | ||||||
|     @mock.patch("documents.forms.async_task") |     @mock.patch("documents.forms.async_task") | ||||||
|     def test_upload_invalid_form(self, m): |     def test_upload_invalid_form(self, m): | ||||||
|   | |||||||
| @@ -11,7 +11,6 @@ from documents.models import Correspondent, Document, Tag, DocumentType | |||||||
| class TestClassifier(TestCase): | class TestClassifier(TestCase): | ||||||
|  |  | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|  |  | ||||||
|         self.classifier = DocumentClassifier() |         self.classifier = DocumentClassifier() | ||||||
|  |  | ||||||
|     def generate_test_data(self): |     def generate_test_data(self): | ||||||
|   | |||||||
| @@ -1,12 +1,12 @@ | |||||||
| import os | import os | ||||||
| import re | import re | ||||||
| import shutil |  | ||||||
| import tempfile | import tempfile | ||||||
| from unittest import mock | from unittest import mock | ||||||
| from unittest.mock import MagicMock | from unittest.mock import MagicMock | ||||||
|  |  | ||||||
| from django.test import TestCase, override_settings | from django.test import TestCase, override_settings | ||||||
|  |  | ||||||
|  | from .utils import setup_directories, remove_dirs | ||||||
| from ..consumer import Consumer, ConsumerError | from ..consumer import Consumer, ConsumerError | ||||||
| from ..models import FileInfo, Tag, Correspondent, DocumentType, Document | from ..models import FileInfo, Tag, Correspondent, DocumentType, Document | ||||||
| from ..parsers import DocumentParser, ParseError | from ..parsers import DocumentParser, ParseError | ||||||
| @@ -410,24 +410,15 @@ def fake_magic_from_file(file, mime=False): | |||||||
| @mock.patch("documents.consumer.magic.from_file", fake_magic_from_file) | @mock.patch("documents.consumer.magic.from_file", fake_magic_from_file) | ||||||
| class TestConsumer(TestCase): | class TestConsumer(TestCase): | ||||||
|  |  | ||||||
|     def make_dummy_parser(self, logging_group): |     def make_dummy_parser(self, path, logging_group): | ||||||
|         return DummyParser(logging_group, self.scratch_dir) |         return DummyParser(logging_group, self.dirs.scratch_dir) | ||||||
|  |  | ||||||
|     def make_faulty_parser(self, logging_group): |     def make_faulty_parser(self, path, logging_group): | ||||||
|         return FaultyParser(logging_group, self.scratch_dir) |         return FaultyParser(logging_group, self.dirs.scratch_dir) | ||||||
|  |  | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|         self.scratch_dir = tempfile.mkdtemp() |         self.dirs = setup_directories() | ||||||
|         self.media_dir = tempfile.mkdtemp() |         self.addCleanup(remove_dirs, self.dirs) | ||||||
|         self.consumption_dir = tempfile.mkdtemp() |  | ||||||
|  |  | ||||||
|         override_settings( |  | ||||||
|             SCRATCH_DIR=self.scratch_dir, |  | ||||||
|             MEDIA_ROOT=self.media_dir, |  | ||||||
|             ORIGINALS_DIR=os.path.join(self.media_dir, "documents", "originals"), |  | ||||||
|             THUMBNAIL_DIR=os.path.join(self.media_dir, "documents", "thumbnails"), |  | ||||||
|             CONSUMPTION_DIR=self.consumption_dir |  | ||||||
|         ).enable() |  | ||||||
|  |  | ||||||
|         patcher = mock.patch("documents.parsers.document_consumer_declaration.send") |         patcher = mock.patch("documents.parsers.document_consumer_declaration.send") | ||||||
|         m = patcher.start() |         m = patcher.start() | ||||||
| @@ -441,13 +432,8 @@ class TestConsumer(TestCase): | |||||||
|  |  | ||||||
|         self.consumer = Consumer() |         self.consumer = Consumer() | ||||||
|  |  | ||||||
|     def tearDown(self): |  | ||||||
|         shutil.rmtree(self.scratch_dir, ignore_errors=True) |  | ||||||
|         shutil.rmtree(self.media_dir, ignore_errors=True) |  | ||||||
|         shutil.rmtree(self.consumption_dir, ignore_errors=True) |  | ||||||
|  |  | ||||||
|     def get_test_file(self): |     def get_test_file(self): | ||||||
|         fd, f = tempfile.mkstemp(suffix=".pdf", dir=self.scratch_dir) |         fd, f = tempfile.mkstemp(suffix=".pdf", dir=self.dirs.scratch_dir) | ||||||
|         return f |         return f | ||||||
|  |  | ||||||
|     def testNormalOperation(self): |     def testNormalOperation(self): | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								src/documents/tests/test_document_retagger.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/documents/tests/test_document_retagger.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | from django.test import TestCase | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class TestRetagger(TestCase): | ||||||
|  |  | ||||||
|  |     def test_overwrite(self): | ||||||
|  |         pass | ||||||
| @@ -1,7 +1,6 @@ | |||||||
| import filecmp | import filecmp | ||||||
| import os | import os | ||||||
| import shutil | import shutil | ||||||
| import tempfile |  | ||||||
| from threading import Thread | from threading import Thread | ||||||
| from time import sleep | from time import sleep | ||||||
| from unittest import mock | from unittest import mock | ||||||
| @@ -11,6 +10,7 @@ from django.test import TestCase, override_settings | |||||||
|  |  | ||||||
| from documents.consumer import ConsumerError | from documents.consumer import ConsumerError | ||||||
| from documents.management.commands import document_consumer | from documents.management.commands import document_consumer | ||||||
|  | from documents.tests.utils import setup_directories, remove_dirs | ||||||
|  |  | ||||||
|  |  | ||||||
| class ConsumerThread(Thread): | class ConsumerThread(Thread): | ||||||
| @@ -41,9 +41,8 @@ class TestConsumer(TestCase): | |||||||
|         self.task_mock = patcher.start() |         self.task_mock = patcher.start() | ||||||
|         self.addCleanup(patcher.stop) |         self.addCleanup(patcher.stop) | ||||||
|  |  | ||||||
|         self.consume_dir = tempfile.mkdtemp() |         self.dirs = setup_directories() | ||||||
|  |         self.addCleanup(remove_dirs, self.dirs) | ||||||
|         override_settings(CONSUMPTION_DIR=self.consume_dir).enable() |  | ||||||
|  |  | ||||||
|     def t_start(self): |     def t_start(self): | ||||||
|         self.t = ConsumerThread() |         self.t = ConsumerThread() | ||||||
| @@ -94,25 +93,29 @@ class TestConsumer(TestCase): | |||||||
|     def test_consume_file(self): |     def test_consume_file(self): | ||||||
|         self.t_start() |         self.t_start() | ||||||
|  |  | ||||||
|         f = os.path.join(self.consume_dir, "my_file.pdf") |         f = os.path.join(self.dirs.consumption_dir, "my_file.pdf") | ||||||
|         shutil.copy(self.sample_file, f) |         shutil.copy(self.sample_file, f) | ||||||
|  |  | ||||||
|         self.wait_for_task_mock_call() |         self.wait_for_task_mock_call() | ||||||
|  |  | ||||||
|         self.task_mock.assert_called_once() |         self.task_mock.assert_called_once() | ||||||
|         self.assertEqual(self.task_mock.call_args.args[1], f) |  | ||||||
|  |         args, kwargs = self.task_mock.call_args | ||||||
|  |         self.assertEqual(args[1], f) | ||||||
|  |  | ||||||
|     @override_settings(CONSUMER_POLLING=1) |     @override_settings(CONSUMER_POLLING=1) | ||||||
|     def test_consume_file_polling(self): |     def test_consume_file_polling(self): | ||||||
|         self.test_consume_file() |         self.test_consume_file() | ||||||
|  |  | ||||||
|     def test_consume_existing_file(self): |     def test_consume_existing_file(self): | ||||||
|         f = os.path.join(self.consume_dir, "my_file.pdf") |         f = os.path.join(self.dirs.consumption_dir, "my_file.pdf") | ||||||
|         shutil.copy(self.sample_file, f) |         shutil.copy(self.sample_file, f) | ||||||
|  |  | ||||||
|         self.t_start() |         self.t_start() | ||||||
|         self.task_mock.assert_called_once() |         self.task_mock.assert_called_once() | ||||||
|         self.assertEqual(self.task_mock.call_args.args[1], f) |  | ||||||
|  |         args, kwargs = self.task_mock.call_args | ||||||
|  |         self.assertEqual(args[1], f) | ||||||
|  |  | ||||||
|     @override_settings(CONSUMER_POLLING=1) |     @override_settings(CONSUMER_POLLING=1) | ||||||
|     def test_consume_existing_file_polling(self): |     def test_consume_existing_file_polling(self): | ||||||
| @@ -125,7 +128,7 @@ class TestConsumer(TestCase): | |||||||
|  |  | ||||||
|         self.t_start() |         self.t_start() | ||||||
|  |  | ||||||
|         fname = os.path.join(self.consume_dir, "my_file.pdf") |         fname = os.path.join(self.dirs.consumption_dir, "my_file.pdf") | ||||||
|  |  | ||||||
|         self.slow_write_file(fname) |         self.slow_write_file(fname) | ||||||
|  |  | ||||||
| @@ -135,7 +138,8 @@ class TestConsumer(TestCase): | |||||||
|  |  | ||||||
|         self.task_mock.assert_called_once() |         self.task_mock.assert_called_once() | ||||||
|  |  | ||||||
|         self.assertEqual(self.task_mock.call_args.args[1], fname) |         args, kwargs = self.task_mock.call_args | ||||||
|  |         self.assertEqual(args[1], fname) | ||||||
|  |  | ||||||
|     @override_settings(CONSUMER_POLLING=1) |     @override_settings(CONSUMER_POLLING=1) | ||||||
|     def test_slow_write_pdf_polling(self): |     def test_slow_write_pdf_polling(self): | ||||||
| @@ -148,8 +152,8 @@ class TestConsumer(TestCase): | |||||||
|  |  | ||||||
|         self.t_start() |         self.t_start() | ||||||
|  |  | ||||||
|         fname = os.path.join(self.consume_dir, "my_file.~df") |         fname = os.path.join(self.dirs.consumption_dir, "my_file.~df") | ||||||
|         fname2 = os.path.join(self.consume_dir, "my_file.pdf") |         fname2 = os.path.join(self.dirs.consumption_dir, "my_file.pdf") | ||||||
|  |  | ||||||
|         self.slow_write_file(fname) |         self.slow_write_file(fname) | ||||||
|         shutil.move(fname, fname2) |         shutil.move(fname, fname2) | ||||||
| @@ -157,7 +161,9 @@ class TestConsumer(TestCase): | |||||||
|         self.wait_for_task_mock_call() |         self.wait_for_task_mock_call() | ||||||
|  |  | ||||||
|         self.task_mock.assert_called_once() |         self.task_mock.assert_called_once() | ||||||
|         self.assertEqual(self.task_mock.call_args.args[1], fname2) |  | ||||||
|  |         args, kwargs = self.task_mock.call_args | ||||||
|  |         self.assertEqual(args[1], fname2) | ||||||
|  |  | ||||||
|         error_logger.assert_not_called() |         error_logger.assert_not_called() | ||||||
|  |  | ||||||
| @@ -172,13 +178,14 @@ class TestConsumer(TestCase): | |||||||
|  |  | ||||||
|         self.t_start() |         self.t_start() | ||||||
|  |  | ||||||
|         fname = os.path.join(self.consume_dir, "my_file.pdf") |         fname = os.path.join(self.dirs.consumption_dir, "my_file.pdf") | ||||||
|         self.slow_write_file(fname, incomplete=True) |         self.slow_write_file(fname, incomplete=True) | ||||||
|  |  | ||||||
|         self.wait_for_task_mock_call() |         self.wait_for_task_mock_call() | ||||||
|  |  | ||||||
|         self.task_mock.assert_called_once() |         self.task_mock.assert_called_once() | ||||||
|         self.assertEqual(self.task_mock.call_args.args[1], fname) |         args, kwargs = self.task_mock.call_args | ||||||
|  |         self.assertEqual(args[1], fname) | ||||||
|  |  | ||||||
|         # assert that we have an error logged with this invalid file. |         # assert that we have an error logged with this invalid file. | ||||||
|         error_logger.assert_called_once() |         error_logger.assert_called_once() | ||||||
|   | |||||||
							
								
								
									
										56
									
								
								src/documents/tests/test_management_decrypt.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/documents/tests/test_management_decrypt.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | import hashlib | ||||||
|  | import json | ||||||
|  | import os | ||||||
|  | import shutil | ||||||
|  | import tempfile | ||||||
|  | from unittest import mock | ||||||
|  |  | ||||||
|  | from django.core.management import call_command | ||||||
|  | from django.test import TestCase, override_settings | ||||||
|  |  | ||||||
|  | from documents.management.commands import document_exporter | ||||||
|  | from documents.models import Document, Tag, DocumentType, Correspondent | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class TestDecryptDocuments(TestCase): | ||||||
|  |  | ||||||
|  |     @override_settings( | ||||||
|  |         ORIGINALS_DIR=os.path.join(os.path.dirname(__file__), "samples", "originals"), | ||||||
|  |         THUMBNAIL_DIR=os.path.join(os.path.dirname(__file__), "samples", "thumb"), | ||||||
|  |         PASSPHRASE="test" | ||||||
|  |     ) | ||||||
|  |     @mock.patch("documents.management.commands.decrypt_documents.input") | ||||||
|  |     def test_decrypt(self, m): | ||||||
|  |  | ||||||
|  |         media_dir = tempfile.mkdtemp() | ||||||
|  |         originals_dir = os.path.join(media_dir, "documents", "originals") | ||||||
|  |         thumb_dir = os.path.join(media_dir, "documents", "thumbnails") | ||||||
|  |         os.makedirs(originals_dir, exist_ok=True) | ||||||
|  |         os.makedirs(thumb_dir, exist_ok=True) | ||||||
|  |  | ||||||
|  |         override_settings( | ||||||
|  |             ORIGINALS_DIR=originals_dir, | ||||||
|  |             THUMBNAIL_DIR=thumb_dir, | ||||||
|  |             PASSPHRASE="test" | ||||||
|  |         ).enable() | ||||||
|  |  | ||||||
|  |         shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "originals", "0000002.pdf.gpg"), os.path.join(originals_dir, "0000002.pdf.gpg")) | ||||||
|  |         shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "thumb", "0000002.png.gpg"), os.path.join(thumb_dir, "0000002.png.gpg")) | ||||||
|  |  | ||||||
|  |         Document.objects.create(checksum="9c9691e51741c1f4f41a20896af31770", title="wow", filename="0000002.pdf.gpg", id=2, mime_type="application/pdf", storage_type=Document.STORAGE_TYPE_GPG) | ||||||
|  |  | ||||||
|  |         call_command('decrypt_documents') | ||||||
|  |  | ||||||
|  |         doc = Document.objects.get(id=2) | ||||||
|  |  | ||||||
|  |         self.assertEqual(doc.storage_type, Document.STORAGE_TYPE_UNENCRYPTED) | ||||||
|  |         self.assertEqual(doc.filename, "0000002.pdf") | ||||||
|  |         self.assertTrue(os.path.isfile(os.path.join(originals_dir, "0000002.pdf"))) | ||||||
|  |         self.assertTrue(os.path.isfile(doc.source_path)) | ||||||
|  |         self.assertTrue(os.path.isfile(os.path.join(thumb_dir, "0000002.png"))) | ||||||
|  |         self.assertTrue(os.path.isfile(doc.thumbnail_path)) | ||||||
|  |  | ||||||
|  |         with doc.source_file as f: | ||||||
|  |             checksum = hashlib.md5(f.read()).hexdigest() | ||||||
|  |             self.assertEqual(checksum, doc.checksum) | ||||||
|  |  | ||||||
							
								
								
									
										53
									
								
								src/documents/tests/test_management_exporter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/documents/tests/test_management_exporter.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | import hashlib | ||||||
|  | import json | ||||||
|  | import os | ||||||
|  | import tempfile | ||||||
|  |  | ||||||
|  | from django.core.management import call_command | ||||||
|  | from django.test import TestCase, override_settings | ||||||
|  |  | ||||||
|  | from documents.management.commands import document_exporter | ||||||
|  | from documents.models import Document, Tag, DocumentType, Correspondent | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class TestExporter(TestCase): | ||||||
|  |  | ||||||
|  |     @override_settings( | ||||||
|  |         ORIGINALS_DIR=os.path.join(os.path.dirname(__file__), "samples", "originals"), | ||||||
|  |         THUMBNAIL_DIR=os.path.join(os.path.dirname(__file__), "samples", "thumb"), | ||||||
|  |         PASSPHRASE="test" | ||||||
|  |     ) | ||||||
|  |     def test_exporter(self): | ||||||
|  |         file = os.path.join(os.path.dirname(__file__), "samples", "originals", "0000001.pdf") | ||||||
|  |  | ||||||
|  |         with open(file, "rb") as f: | ||||||
|  |             checksum = hashlib.md5(f.read()).hexdigest() | ||||||
|  |  | ||||||
|  |         Document.objects.create(checksum=checksum, title="wow", filename="0000001.pdf", id=1, mime_type="application/pdf") | ||||||
|  |         Document.objects.create(checksum="9c9691e51741c1f4f41a20896af31770", title="wow", filename="0000002.pdf.gpg", id=2, mime_type="application/pdf", storage_type=Document.STORAGE_TYPE_GPG) | ||||||
|  |         Tag.objects.create(name="t") | ||||||
|  |         DocumentType.objects.create(name="dt") | ||||||
|  |         Correspondent.objects.create(name="c") | ||||||
|  |  | ||||||
|  |         target = tempfile.mkdtemp() | ||||||
|  |  | ||||||
|  |         call_command('document_exporter', target) | ||||||
|  |  | ||||||
|  |         with open(os.path.join(target, "manifest.json")) as f: | ||||||
|  |             manifest = json.load(f) | ||||||
|  |  | ||||||
|  |         self.assertEqual(len(manifest), 5) | ||||||
|  |  | ||||||
|  |         for element in manifest: | ||||||
|  |             if element['model'] == 'documents.document': | ||||||
|  |                 fname = os.path.join(target, element[document_exporter.EXPORTER_FILE_NAME]) | ||||||
|  |                 self.assertTrue(os.path.exists(fname)) | ||||||
|  |                 self.assertTrue(os.path.exists(os.path.join(target, element[document_exporter.EXPORTER_THUMBNAIL_NAME]))) | ||||||
|  |  | ||||||
|  |                 with open(fname, "rb") as f: | ||||||
|  |                     checksum = hashlib.md5(f.read()).hexdigest() | ||||||
|  |                 self.assertEqual(checksum, element['fields']['checksum']) | ||||||
|  |  | ||||||
|  |         Document.objects.create(checksum="AAAAAAAAAAAAAAAAA", title="wow", filename="0000004.pdf", id=3, mime_type="application/pdf") | ||||||
|  |  | ||||||
|  |         self.assertRaises(FileNotFoundError, call_command, 'document_exporter', target) | ||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | import shutil | ||||||
|  | import tempfile | ||||||
| from random import randint | from random import randint | ||||||
|  |  | ||||||
| from django.contrib.admin.models import LogEntry | from django.contrib.admin.models import LogEntry | ||||||
| @@ -215,6 +217,13 @@ class TestDocumentConsumptionFinishedSignal(TestCase): | |||||||
|         self.doc_contains = Document.objects.create( |         self.doc_contains = Document.objects.create( | ||||||
|             content="I contain the keyword.", mime_type="application/pdf") |             content="I contain the keyword.", mime_type="application/pdf") | ||||||
|  |  | ||||||
|  |         self.index_dir = tempfile.mkdtemp() | ||||||
|  |         # TODO: we should not need the index here. | ||||||
|  |         override_settings(INDEX_DIR=self.index_dir).enable() | ||||||
|  |  | ||||||
|  |     def tearDown(self) -> None: | ||||||
|  |         shutil.rmtree(self.index_dir, ignore_errors=True) | ||||||
|  |  | ||||||
|     def test_tag_applied_any(self): |     def test_tag_applied_any(self): | ||||||
|         t1 = Tag.objects.create( |         t1 = Tag.objects.create( | ||||||
|             name="test", match="keyword", matching_algorithm=Tag.MATCH_ANY) |             name="test", match="keyword", matching_algorithm=Tag.MATCH_ANY) | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								src/documents/tests/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/documents/tests/utils.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | import os | ||||||
|  | import shutil | ||||||
|  | import tempfile | ||||||
|  | from collections import namedtuple | ||||||
|  |  | ||||||
|  | from django.test import override_settings | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def setup_directories(): | ||||||
|  |  | ||||||
|  |     dirs = namedtuple("Dirs", ()) | ||||||
|  |  | ||||||
|  |     dirs.data_dir = tempfile.mkdtemp() | ||||||
|  |     dirs.scratch_dir = tempfile.mkdtemp() | ||||||
|  |     dirs.media_dir = tempfile.mkdtemp() | ||||||
|  |     dirs.consumption_dir = tempfile.mkdtemp() | ||||||
|  |     dirs.index_dir = os.path.join(dirs.data_dir, "documents", "originals") | ||||||
|  |     dirs.originals_dir = os.path.join(dirs.media_dir, "documents", "originals") | ||||||
|  |     dirs.thumbnail_dir = os.path.join(dirs.media_dir, "documents", "thumbnails") | ||||||
|  |     os.makedirs(dirs.index_dir) | ||||||
|  |     os.makedirs(dirs.originals_dir) | ||||||
|  |     os.makedirs(dirs.thumbnail_dir) | ||||||
|  |  | ||||||
|  |     override_settings( | ||||||
|  |         DATA_DIR=dirs.data_dir, | ||||||
|  |         SCRATCH_DIR=dirs.scratch_dir, | ||||||
|  |         MEDIA_ROOT=dirs.media_dir, | ||||||
|  |         ORIGINALS_DIR=dirs.originals_dir, | ||||||
|  |         THUMBNAIL_DIR=dirs.thumbnail_dir, | ||||||
|  |         CONSUMPTION_DIR=dirs.consumption_dir, | ||||||
|  |         INDEX_DIR=dirs.index_dir | ||||||
|  |     ).enable() | ||||||
|  |  | ||||||
|  |     return dirs | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def remove_dirs(dirs): | ||||||
|  |     shutil.rmtree(dirs.media_dir, ignore_errors=True) | ||||||
|  |     shutil.rmtree(dirs.data_dir, ignore_errors=True) | ||||||
|  |     shutil.rmtree(dirs.scratch_dir, ignore_errors=True) | ||||||
|  |     shutil.rmtree(dirs.consumption_dir, ignore_errors=True) | ||||||
| @@ -3,7 +3,7 @@ exclude = migrations, paperless/settings.py, .tox, */tests/* | |||||||
|  |  | ||||||
| [tool:pytest] | [tool:pytest] | ||||||
| DJANGO_SETTINGS_MODULE=paperless.settings | DJANGO_SETTINGS_MODULE=paperless.settings | ||||||
| addopts = --pythonwarnings=all | addopts = --pythonwarnings=all --cov --cov-report=html | ||||||
| env = | env = | ||||||
|   PAPERLESS_SECRET=paperless |   PAPERLESS_SECRET=paperless | ||||||
|   PAPERLESS_EMAIL_SECRET=paperless |   PAPERLESS_EMAIL_SECRET=paperless | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 jonaswinkler
					jonaswinkler