Compare commits
722 Commits
versions/n
...
releases/d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7789fa6da | ||
|
|
0d263c2b76 | ||
|
|
b329ed7618 | ||
|
|
373a712669 | ||
|
|
734ca02a95 | ||
|
|
04b19f8d2e | ||
|
|
fce0601d25 | ||
|
|
54769bf22a | ||
|
|
f303cdfe95 | ||
|
|
3ad035adcb | ||
|
|
533e2e344c | ||
|
|
649ef8151c | ||
|
|
69c925ffd3 | ||
|
|
8e34bc02b3 | ||
|
|
666c3324e8 | ||
|
|
5627a3d247 | ||
|
|
cb7dbaf609 | ||
|
|
7cba63f403 | ||
|
|
2f6cfcbc4f | ||
|
|
2af136356d | ||
|
|
7a8dad5a3c | ||
|
|
3a0226ac22 | ||
|
|
cb14224fde | ||
|
|
e45443fdea | ||
|
|
b19b602a53 | ||
|
|
ec2dde7483 | ||
|
|
c94ed44476 | ||
|
|
eff18b5823 | ||
|
|
30f3d11375 | ||
|
|
871a800213 | ||
|
|
e7faece342 | ||
|
|
8bcd2c247f | ||
|
|
605e6356a7 | ||
|
|
9c202f7087 | ||
|
|
c833b7a74c | ||
|
|
e002f317a4 | ||
|
|
c51f8d2135 | ||
|
|
01b2ad3ddc | ||
|
|
e371124bca | ||
|
|
3621af7e7d | ||
|
|
1e1e930e88 | ||
|
|
d04f1eb9a5 | ||
|
|
6dde3e1ac3 | ||
|
|
efb8a35ea4 | ||
|
|
25df502cb0 | ||
|
|
5c91ab2d73 | ||
|
|
ea4f9d6c4e | ||
|
|
6d0b7b1fc0 | ||
|
|
627e9cb1f0 | ||
|
|
4fcd60194e | ||
|
|
644cd57a0f | ||
|
|
f6febdd221 | ||
|
|
f46a32580d | ||
|
|
929cc7d374 | ||
|
|
b405896a44 | ||
|
|
fbe043b4eb | ||
|
|
3a8fade8f8 | ||
|
|
3fb1e079b9 | ||
|
|
40b44cba35 | ||
|
|
d5b1c02310 | ||
|
|
38c33b6703 | ||
|
|
557a20d6cc | ||
|
|
68a3483470 | ||
|
|
4de13f23b7 | ||
|
|
fba6d3b101 | ||
|
|
7902074390 | ||
|
|
3ce08cc9c0 | ||
|
|
1ae5b8c420 | ||
|
|
2af03eeca8 | ||
|
|
b8345797d6 | ||
|
|
1377ff0504 | ||
|
|
5aa3886867 | ||
|
|
1fe45e2613 | ||
|
|
68966e4ad0 | ||
|
|
a8fcc862f1 | ||
|
|
f9e539f25c | ||
|
|
96d631a395 | ||
|
|
f5bbd484cd | ||
|
|
8b2690c785 | ||
|
|
4cf28af5cf | ||
|
|
d48f2628a3 | ||
|
|
e3d2fef687 | ||
|
|
6eb105be94 | ||
|
|
24dcdfd328 | ||
|
|
305f4d1afd | ||
|
|
ff03186a2c | ||
|
|
8141748677 | ||
|
|
26fdaf867f | ||
|
|
bf4e499c9d | ||
|
|
daef777173 | ||
|
|
0e8dbea244 | ||
|
|
46eda1a20b | ||
|
|
d2c89caece | ||
|
|
b03ea61fdb | ||
|
|
80065279cb | ||
|
|
d636174c85 | ||
|
|
22aa14282b | ||
|
|
bdde894765 | ||
|
|
4d7c0552bd | ||
|
|
575e42357a | ||
|
|
487c250f3e | ||
|
|
0ae214f2fd | ||
|
|
037b942c4a | ||
|
|
dcbf777429 | ||
|
|
0c5a0b54c1 | ||
|
|
0f5f8c0dd1 | ||
|
|
2d875ff044 | ||
|
|
a77708ebe6 | ||
|
|
440822896a | ||
|
|
6f4802ac6a | ||
|
|
c21a9afcfa | ||
|
|
0494fa9e6a | ||
|
|
e09bd48d65 | ||
|
|
97887c4e9c | ||
|
|
90e884e502 | ||
|
|
ea7b4e46ac | ||
|
|
e0d74d54b1 | ||
|
|
fbd2b43b5e | ||
|
|
03e59ed964 | ||
|
|
c3b1c4e173 | ||
|
|
43260b87c5 | ||
|
|
5b78a7c60c | ||
|
|
2e5ee2740a | ||
|
|
85b8d281cc | ||
|
|
69d33bef7c | ||
|
|
3f86dfc902 | ||
|
|
111250fd99 | ||
|
|
f17d13d68f | ||
|
|
1f5c81eaf5 | ||
|
|
b4dafb20ad | ||
|
|
70dab1fd30 | ||
|
|
bb3e010a93 | ||
|
|
4b9043b882 | ||
|
|
727fe78d8b | ||
|
|
7650ef17c0 | ||
|
|
9558c5e6dc | ||
|
|
cb1e90e19b | ||
|
|
b5823358cb | ||
|
|
dcc8b8b174 | ||
|
|
891861eaf5 | ||
|
|
8d0f14a40c | ||
|
|
f53a3f7959 | ||
|
|
1d5972da3b | ||
|
|
8fe90ea7f1 | ||
|
|
037c2b6118 | ||
|
|
06307ff29c | ||
|
|
0c37685302 | ||
|
|
4d52dbde39 | ||
|
|
9836ca3ef3 | ||
|
|
538e0c6f3b | ||
|
|
0ced976b0c | ||
|
|
7f43a8d5a3 | ||
|
|
0ae960d96c | ||
|
|
2e80c6a00b | ||
|
|
590c76bf64 | ||
|
|
41f86b35f2 | ||
|
|
d70a1ef079 | ||
|
|
fa678b09bc | ||
|
|
fe3d2e85c2 | ||
|
|
2ce0528712 | ||
|
|
e091c07ed6 | ||
|
|
f66328139e | ||
|
|
505e0bd68b | ||
|
|
80ebe4ecce | ||
|
|
0f9c226a1e | ||
|
|
6789ecf1bb | ||
|
|
a008607d40 | ||
|
|
eb32820864 | ||
|
|
3e48a422b7 | ||
|
|
f6c5a4f9cf | ||
|
|
f160de4381 | ||
|
|
0d6462831a | ||
|
|
749208b5f8 | ||
|
|
72ade29f77 | ||
|
|
325fe3225a | ||
|
|
30f3a0563c | ||
|
|
62fdec575f | ||
|
|
7407c67347 | ||
|
|
cbfab25c94 | ||
|
|
2ae2dfd687 | ||
|
|
e5c92487de | ||
|
|
8c96567094 | ||
|
|
d3041eb2d5 | ||
|
|
047f48d39f | ||
|
|
34d7ff6e01 | ||
|
|
c7474cae1b | ||
|
|
74f333d16c | ||
|
|
6f6ddfbc82 | ||
|
|
2fcb36c568 | ||
|
|
db5511127d | ||
|
|
807dd849c5 | ||
|
|
602774a390 | ||
|
|
0b044f1e21 | ||
|
|
0440e1a838 | ||
|
|
eac9940207 | ||
|
|
65aa6a8f38 | ||
|
|
39af4f9f8a | ||
|
|
33929576fc | ||
|
|
18b42a03c8 | ||
|
|
d1f6a6b059 | ||
|
|
4252e37748 | ||
|
|
6a2e039a83 | ||
|
|
d4a7592467 | ||
|
|
9edb9fff0a | ||
|
|
07e7b55686 | ||
|
|
268fce138d | ||
|
|
916ba688b1 | ||
|
|
4baeb6ce7e | ||
|
|
fbe0e14b82 | ||
|
|
410e6a4a55 | ||
|
|
38a34cc98c | ||
|
|
90393e043e | ||
|
|
9e3e0d9e64 | ||
|
|
818cf97d5b | ||
|
|
f649a77b2f | ||
|
|
2ee2b2f5e0 | ||
|
|
5619a6014e | ||
|
|
4851c9f6d7 | ||
|
|
f002d8b38e | ||
|
|
484f09db75 | ||
|
|
5b45769423 | ||
|
|
54c007b149 | ||
|
|
3b518998c9 | ||
|
|
0a21748b0c | ||
|
|
edd6f4eb76 | ||
|
|
f8258c078a | ||
|
|
b2cefa79a5 | ||
|
|
ab5028887c | ||
|
|
4a03e2a47f | ||
|
|
c9809becba | ||
|
|
a1fa6aadfb | ||
|
|
c3991c3798 | ||
|
|
66ac9eebee | ||
|
|
4f9c2314fa | ||
|
|
b2ddf0c6bb | ||
|
|
ebc7886c81 | ||
|
|
fbbc6bace9 | ||
|
|
811c8075ca | ||
|
|
de7a7448ae | ||
|
|
7d725f8170 | ||
|
|
8e32c5adae | ||
|
|
7339eb2a09 | ||
|
|
e5daea674f | ||
|
|
170434e71b | ||
|
|
54acf0f254 | ||
|
|
76f320faf5 | ||
|
|
21e1a3c4ad | ||
|
|
0a9c01cb0f | ||
|
|
a5ab9f3ea6 | ||
|
|
8586bd1909 | ||
|
|
62f49e390a | ||
|
|
dfb368e6dc | ||
|
|
7971b081a9 | ||
|
|
290dc847c4 | ||
|
|
1982c9920f | ||
|
|
1ae1804f5d | ||
|
|
e68928901e | ||
|
|
febc7cf4f7 | ||
|
|
ab97c95bab | ||
|
|
b28bdf5475 | ||
|
|
f041ae9966 | ||
|
|
2e632f658d | ||
|
|
6ef9b04d57 | ||
|
|
b687a7f519 | ||
|
|
ebf8cbdd62 | ||
|
|
d338da5491 | ||
|
|
2e2797bba5 | ||
|
|
2b43aa8d40 | ||
|
|
c59f35225c | ||
|
|
3a623ee416 | ||
|
|
4e5c513529 | ||
|
|
8b073c3151 | ||
|
|
60c0c131ae | ||
|
|
f561eb2f57 | ||
|
|
a0b4d38d19 | ||
|
|
a69e74ac90 | ||
|
|
d41fe1b701 | ||
|
|
2f998ab4ce | ||
|
|
92e12f3ec5 | ||
|
|
78b0abf50c | ||
|
|
d003818cae | ||
|
|
98157b7083 | ||
|
|
d4130cd393 | ||
|
|
f3a849c031 | ||
|
|
a38426d823 | ||
|
|
501acbfb0f | ||
|
|
082981e25f | ||
|
|
03f128ff23 | ||
|
|
f76b9e4f3f | ||
|
|
1acc352801 | ||
|
|
17030472f1 | ||
|
|
c7e9a4dc99 | ||
|
|
0d53e74238 | ||
|
|
4617afafb2 | ||
|
|
2d819e64c9 | ||
|
|
545366a477 | ||
|
|
74ec939779 | ||
|
|
aa94247c3d | ||
|
|
c3594651d2 | ||
|
|
578c1b2f07 | ||
|
|
7cf8cd2f28 | ||
|
|
f6696771f9 | ||
|
|
eb79ebf6bb | ||
|
|
e89367f827 | ||
|
|
40035ea39a | ||
|
|
8aa97c7fd7 | ||
|
|
45ca7ea480 | ||
|
|
bbf3ede2e6 | ||
|
|
c1612c8182 | ||
|
|
76b75af1c2 | ||
|
|
680a7b6ae1 | ||
|
|
f73179a600 | ||
|
|
cbd51c5f26 | ||
|
|
fffcf4d3da | ||
|
|
72cdfe58c5 | ||
|
|
f55979b1a6 | ||
|
|
f5aaff9ab1 | ||
|
|
e6ccfb4b59 | ||
|
|
f6afec031d | ||
|
|
33a2ca97ec | ||
|
|
7b69c2f76e | ||
|
|
6cc23fbfd0 | ||
|
|
648fcc32a9 | ||
|
|
de581cde5f | ||
|
|
1beb44d85d | ||
|
|
e5c1aa5606 | ||
|
|
0b68463ed5 | ||
|
|
d533e48f46 | ||
|
|
8e5b60e1c0 | ||
|
|
28114264c1 | ||
|
|
6330e40036 | ||
|
|
f69fcbcc82 | ||
|
|
5e4518211f | ||
|
|
ddbb0d496a | ||
|
|
e1e2454e2a | ||
|
|
264e90a7d7 | ||
|
|
4507f75711 | ||
|
|
a0d2000419 | ||
|
|
ebc68d3c36 | ||
|
|
7a4a4818fe | ||
|
|
b6e7a462b0 | ||
|
|
0d6409512a | ||
|
|
988b4dcb37 | ||
|
|
9e2891216b | ||
|
|
0e6f34d0ee | ||
|
|
00d4406b1f | ||
|
|
4a7540f8b2 | ||
|
|
95a1df8072 | ||
|
|
7181852c2d | ||
|
|
547ffe0e0d | ||
|
|
5e2a1e997b | ||
|
|
ca3a48f92d | ||
|
|
251b4bac40 | ||
|
|
ce70701b7e | ||
|
|
3c0316dae6 | ||
|
|
030b7d5d91 | ||
|
|
99b180f269 | ||
|
|
c9b5d2794e | ||
|
|
d7db8468ac | ||
|
|
3d240a7f42 | ||
|
|
9c92b9a59e | ||
|
|
b67bfa8ec4 | ||
|
|
8e731d6280 | ||
|
|
d271f1503d | ||
|
|
5f89d228dc | ||
|
|
73546bd99f | ||
|
|
8320ca814c | ||
|
|
48a7a25212 | ||
|
|
a3ea854e73 | ||
|
|
bd9c75cdaa | ||
|
|
ea3b513ae3 | ||
|
|
11e13cea1d | ||
|
|
3faefd653c | ||
|
|
80a9b9ef9d | ||
|
|
8084b59e6e | ||
|
|
8b2f5eaf69 | ||
|
|
98e51079a3 | ||
|
|
a2e718361e | ||
|
|
e042c5275b | ||
|
|
b4227a608b | ||
|
|
fda0dd4eaf | ||
|
|
66d5016407 | ||
|
|
77d897ab1f | ||
|
|
68a4b72c37 | ||
|
|
8b447a7050 | ||
|
|
e36eb5421d | ||
|
|
d0a452d838 | ||
|
|
825af3152f | ||
|
|
efff750f06 | ||
|
|
ae595dd359 | ||
|
|
136434c973 | ||
|
|
b1e464f52f | ||
|
|
6a8b062be7 | ||
|
|
2e670254e5 | ||
|
|
d2ab2ec91f | ||
|
|
cfe623e093 | ||
|
|
aee3645c7a | ||
|
|
bd1e8d9e31 | ||
|
|
713e644599 | ||
|
|
a544924c08 | ||
|
|
ae8a444e42 | ||
|
|
e01017ffe5 | ||
|
|
85deaf3327 | ||
|
|
f057d7f81f | ||
|
|
e916e73ead | ||
|
|
5c07c61b69 | ||
|
|
395c360784 | ||
|
|
959cdc56e5 | ||
|
|
7a4c9f3ad2 | ||
|
|
5a736d83bc | ||
|
|
33056dec04 | ||
|
|
dda0f0d2af | ||
|
|
8374a66011 | ||
|
|
873055c4d5 | ||
|
|
4963a9689f | ||
|
|
1a91640047 | ||
|
|
2e9b5454a7 | ||
|
|
6069c67342 | ||
|
|
95123e0078 | ||
|
|
8bbd83ea76 | ||
|
|
4f92bde7d7 | ||
|
|
041464fc1c | ||
|
|
086a1e5168 | ||
|
|
32cf0a0595 | ||
|
|
e5aa4553be | ||
|
|
dcde4b1968 | ||
|
|
84c88f9173 | ||
|
|
799d47054e | ||
|
|
3fa08debe9 | ||
|
|
cd5bc8ba4b | ||
|
|
89bc78bd55 | ||
|
|
ebaa18f552 | ||
|
|
e80f602974 | ||
|
|
cd24eef107 | ||
|
|
e6ad202ee9 | ||
|
|
dd81d8e237 | ||
|
|
6e91ebe5f4 | ||
|
|
f9866e846a | ||
|
|
fba0c40bef | ||
|
|
74c97314d7 | ||
|
|
20acc24c7f | ||
|
|
1c5681c79d | ||
|
|
4b4629ce2b | ||
|
|
fb1f5dbfe3 | ||
|
|
510cdf894c | ||
|
|
2f8cd26d0f | ||
|
|
1a71e02aab | ||
|
|
b3b92e8cda | ||
|
|
5574aaec9e | ||
|
|
3f9421fc75 | ||
|
|
2aadb203eb | ||
|
|
f5ec2e9b22 | ||
|
|
46d0e5562b | ||
|
|
52f734ee9f | ||
|
|
a556f2a1ba | ||
|
|
fa076df89e | ||
|
|
2330bb9da2 | ||
|
|
c2d287c262 | ||
|
|
fcfadb0caa | ||
|
|
575b2bc61c | ||
|
|
21c1dc36d8 | ||
|
|
5cde7de29b | ||
|
|
4d99590dad | ||
|
|
296c580a5e | ||
|
|
2619777d41 | ||
|
|
a5f3937228 | ||
|
|
2e8e4588c0 | ||
|
|
120896001f | ||
|
|
9a706ac09f | ||
|
|
a97c2ec662 | ||
|
|
6ad306b3cf | ||
|
|
b766f85995 | ||
|
|
25ad5c1420 | ||
|
|
a1c733807a | ||
|
|
720115e122 | ||
|
|
e75b5ea2ff | ||
|
|
2300ab52de | ||
|
|
d790efdef5 | ||
|
|
47a8355c79 | ||
|
|
d297d734d2 | ||
|
|
3789d5cfcf | ||
|
|
87b0be65d4 | ||
|
|
ff5d35832a | ||
|
|
4ffd25c570 | ||
|
|
cd00c6abf0 | ||
|
|
c1d2c8baf3 | ||
|
|
0dbb6cc6ea | ||
|
|
6f57d3c650 | ||
|
|
d48665c595 | ||
|
|
b44e4141a4 | ||
|
|
41c1326498 | ||
|
|
3d8cf3e235 | ||
|
|
ddf96120de | ||
|
|
a6d474eaa5 | ||
|
|
9f723c95ac | ||
|
|
4b3d94017a | ||
|
|
48249b977d | ||
|
|
26792d3c5a | ||
|
|
042745e0ca | ||
|
|
1a79b4192e | ||
|
|
fddd8a56c2 | ||
|
|
4fed1111f4 | ||
|
|
e609e89e0e | ||
|
|
3043f22de8 | ||
|
|
1265c16161 | ||
|
|
0865975f2e | ||
|
|
18dbb0cfe6 | ||
|
|
ef26296dc6 | ||
|
|
0a39eac419 | ||
|
|
9aa9840231 | ||
|
|
1acf67a91c | ||
|
|
d66cf089ee | ||
|
|
fb04d75376 | ||
|
|
966641c447 | ||
|
|
e12098abe4 | ||
|
|
724f15c006 | ||
|
|
fb6d7b5668 | ||
|
|
eccc2d74a3 | ||
|
|
3437d8b471 | ||
|
|
7f0377a8c5 | ||
|
|
ce0a6368f2 | ||
|
|
66e0d9f357 | ||
|
|
bc08ada938 | ||
|
|
eadcf7382b | ||
|
|
75ed93c35b | ||
|
|
1e37ca8315 | ||
|
|
d410e1ef6c | ||
|
|
a3e8b53f01 | ||
|
|
9ebace4014 | ||
|
|
c04063838b | ||
|
|
8c5c324a09 | ||
|
|
655e2b3469 | ||
|
|
02187ab5a5 | ||
|
|
c9bd2ab9a5 | ||
|
|
90b3d01171 | ||
|
|
5cfc5dda92 | ||
|
|
64cd0c232d | ||
|
|
d7a5db711b | ||
|
|
102e3ccde3 | ||
|
|
6b76d62fda | ||
|
|
caad463e8a | ||
|
|
fa441149e4 | ||
|
|
ba73a9b55e | ||
|
|
0267c79b07 | ||
|
|
bfcad278aa | ||
|
|
33d073e7a0 | ||
|
|
54020a8813 | ||
|
|
97a9d21ac4 | ||
|
|
f176f6ae4f | ||
|
|
313311d008 | ||
|
|
0e1fe3968d | ||
|
|
4c0b3e9134 | ||
|
|
0d1daeaedf | ||
|
|
6bd8206236 | ||
|
|
156c008eee | ||
|
|
b829f0a20a | ||
|
|
4b625025ee | ||
|
|
b3da28e915 | ||
|
|
2f5a0d071f | ||
|
|
0cdba79738 | ||
|
|
030ee8efe3 | ||
|
|
7be25df7d0 | ||
|
|
847bfb721b | ||
|
|
50be0ad889 | ||
|
|
58813310b7 | ||
|
|
811a752efb | ||
|
|
29f81b2087 | ||
|
|
5071eb6fda | ||
|
|
29b41a7638 | ||
|
|
b6976210a5 | ||
|
|
0d2a827413 | ||
|
|
cdb55ab5dd | ||
|
|
0d69274bb4 | ||
|
|
cb102ed115 | ||
|
|
78517971ed | ||
|
|
5ef73d992c | ||
|
|
0d05589206 | ||
|
|
afc65eed32 | ||
|
|
acffe8a721 | ||
|
|
6411433b24 | ||
|
|
5127712711 | ||
|
|
33f84ec327 | ||
|
|
3bcadd047b | ||
|
|
c34ec5ddab | ||
|
|
4f772bbecf | ||
|
|
18faaa69bd | ||
|
|
24304636d9 | ||
|
|
9b2633e6c7 | ||
|
|
7752ca0f03 | ||
|
|
421d91bb0f | ||
|
|
9e262220e5 | ||
|
|
2a780cb4b0 | ||
|
|
94b9db7f27 | ||
|
|
c0f51103d2 | ||
|
|
334f0cd03f | ||
|
|
655c1fd09f | ||
|
|
663eb1b360 | ||
|
|
0015ad4abe | ||
|
|
e2b5817d18 | ||
|
|
f6089e689e | ||
|
|
f3413b4283 | ||
|
|
0d4ab4f2cf | ||
|
|
d42b9bbdf4 | ||
|
|
72311c73b5 | ||
|
|
93c4814a89 | ||
|
|
7823c80710 | ||
|
|
2d9cdbe8b0 | ||
|
|
fdacbb94c3 | ||
|
|
3f1caf8da0 | ||
|
|
f8d5332786 | ||
|
|
1ccc631bd4 | ||
|
|
86183b873e | ||
|
|
56adf598ae | ||
|
|
fe1337fa8d | ||
|
|
16915b6480 | ||
|
|
15c8459a15 | ||
|
|
feb9d9e714 | ||
|
|
a8fd2a1136 | ||
|
|
9c571b222e | ||
|
|
37840f3b6c | ||
|
|
927d77cfd7 | ||
|
|
265bcd7b65 | ||
|
|
c69127f37c | ||
|
|
45ae821f5c | ||
|
|
1f8879df92 | ||
|
|
7093ac54a3 | ||
|
|
5118cad9a2 | ||
|
|
2b0b9675fd | ||
|
|
40c9436071 | ||
|
|
b976f8d0ed | ||
|
|
a54e17caeb | ||
|
|
0416ac4064 | ||
|
|
1fa91f0ef7 | ||
|
|
fab94319bb | ||
|
|
5ff15895b6 | ||
|
|
0188afcd54 | ||
|
|
ae814a18c5 | ||
|
|
1f5dffa0e5 | ||
|
|
4d91d82515 | ||
|
|
4c8e647415 | ||
|
|
14e71ce42f | ||
|
|
f6f9287e33 | ||
|
|
456c322c19 | ||
|
|
a12c90268f | ||
|
|
a10f2330fd | ||
|
|
03ba13e5cb | ||
|
|
335c21488e | ||
|
|
d26279275d | ||
|
|
4f66129a7c | ||
|
|
7d756de3de | ||
|
|
69bd6c116e | ||
|
|
0065edfae9 | ||
|
|
9ec021241c | ||
|
|
3a60155bfa | ||
|
|
f6a0a421a5 | ||
|
|
7ed26f4d4c | ||
|
|
daca9dd539 | ||
|
|
8c1a9c8798 | ||
|
|
966d8498bc | ||
|
|
36a51eeb73 | ||
|
|
382173351a | ||
|
|
d35323aa65 | ||
|
|
9b21275b7e | ||
|
|
d493ec34b2 | ||
|
|
51ea493a26 | ||
|
|
49403978b1 | ||
|
|
8c770d5ba3 | ||
|
|
b01e8707a3 | ||
|
|
8896f58d6f | ||
|
|
3afb74224d | ||
|
|
3a4f97c5c2 | ||
|
|
8419facb8a | ||
|
|
3cbc6435a2 | ||
|
|
e7627a723e | ||
|
|
e77afeee37 | ||
|
|
6a5a2350bb | ||
|
|
912675bf99 | ||
|
|
a56e3ca111 | ||
|
|
5f877cdc22 | ||
|
|
d5efd53b5b | ||
|
|
c156c02376 | ||
|
|
a196205593 | ||
|
|
26cf7fb97c | ||
|
|
863892f909 | ||
|
|
5a64a3e833 | ||
|
|
45786005ab | ||
|
|
f45384e399 | ||
|
|
33a542b9d5 | ||
|
|
00d07214b1 | ||
|
|
1e8030a722 | ||
|
|
f6404fbd4b | ||
|
|
b59c39261f | ||
|
|
a5b513f986 | ||
|
|
45a688749c | ||
|
|
15473620c4 | ||
|
|
7cd0e16cc2 | ||
|
|
caab7b3b59 | ||
|
|
47d850e164 | ||
|
|
b27e160d15 | ||
|
|
3eb4a70fbf | ||
|
|
d4df7e69d7 | ||
|
|
0055429703 | ||
|
|
eafdfd8177 | ||
|
|
a8e52126f5 | ||
|
|
70facb96f0 | ||
|
|
f583e24c47 | ||
|
|
7db27aa9fe | ||
|
|
f5bc055a11 | ||
|
|
965160b7a2 | ||
|
|
85b3164592 | ||
|
|
7634d9e5da | ||
|
|
48253f3f85 | ||
|
|
dd2c64d453 | ||
|
|
517c05a9c2 | ||
|
|
99bbe7d47c | ||
|
|
586d41eeff | ||
|
|
7fb18b14eb | ||
|
|
68398e2ce6 | ||
|
|
d23f5eb540 | ||
|
|
4bbd5dab70 | ||
|
|
c4b9ae596e | ||
|
|
f5d2f34e30 |
@@ -4,8 +4,7 @@ HISTORY.md
|
||||
mayan/media
|
||||
db.sqlite*
|
||||
docker
|
||||
!docker/etc
|
||||
!docker/entrypoint.sh
|
||||
!docker/version
|
||||
!docker/rootfs
|
||||
./.*
|
||||
docs
|
||||
|
||||
|
||||
3
.flake8
3
.flake8
@@ -1,2 +1,3 @@
|
||||
[flake8]
|
||||
ignore = E501
|
||||
exclude = node_modules,static,templates
|
||||
ignore = E501, N801, N802, N804, N805, N806
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -7,6 +7,7 @@
|
||||
.coverage
|
||||
.coverage.tox*
|
||||
.idea/
|
||||
*.swp
|
||||
.tox/
|
||||
.vagrant
|
||||
_build/
|
||||
@@ -29,4 +30,6 @@ static_collected/
|
||||
/venv/
|
||||
/venv3/
|
||||
/whoosh_index/
|
||||
google_fonts/
|
||||
node_modules/
|
||||
docs/build/
|
||||
|
||||
@@ -17,7 +17,7 @@ job_docker_build:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
script:
|
||||
- docker build --pull -t "$CI_REGISTRY_IMAGE" -f docker/Dockerfile .
|
||||
- VERSION=`cat docker/version`
|
||||
- VERSION=`cat docker/rootfs/version`
|
||||
- docker tag "$CI_REGISTRY_IMAGE" "$CI_REGISTRY_IMAGE:$VERSION"
|
||||
- docker run --rm "$CI_REGISTRY_IMAGE:$VERSION" run-tests
|
||||
- docker push "$CI_REGISTRY_IMAGE:$VERSION"
|
||||
@@ -37,7 +37,7 @@ job_docker_push:
|
||||
before_script:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
script:
|
||||
- VERSION=`cat docker/version`
|
||||
- VERSION=`cat docker/rootfs/version`
|
||||
- docker pull "$CI_REGISTRY_IMAGE:$VERSION"
|
||||
- docker tag "$CI_REGISTRY_IMAGE:$VERSION" registry-1.docker.io/mayanedms/mayanedms:"$VERSION"
|
||||
- docker tag "$CI_REGISTRY_IMAGE:$VERSION" registry-1.docker.io/mayanedms/mayanedms:latest
|
||||
@@ -119,7 +119,7 @@ job_build_python:
|
||||
- update-locale LANG=en_US.UTF-8
|
||||
- export LC_ALL=en_US.UTF-8
|
||||
- pip install -r requirements/build.txt
|
||||
- make wheel
|
||||
- make python-wheel
|
||||
only:
|
||||
- releases/all
|
||||
- releases/python
|
||||
@@ -140,7 +140,7 @@ job_push_python:
|
||||
|
||||
.test_base: &test_base
|
||||
stage: test
|
||||
image: ubuntu:16.04
|
||||
image: ubuntu:18.04
|
||||
cache:
|
||||
paths:
|
||||
- ~/.cache/pip/
|
||||
@@ -152,13 +152,12 @@ job_push_python:
|
||||
- locale-gen en_US.UTF-8
|
||||
- update-locale LANG=en_US.UTF-8
|
||||
- export LC_ALL=en_US.UTF-8
|
||||
- apt-get install -qq curl gcc ghostscript gpgv gnupg graphviz libfuse2 libjpeg-dev libmagic1 libpng-dev libtiff-dev poppler-utils libreoffice poppler-utils python-dev python-pip tesseract-ocr tesseract-ocr-deu
|
||||
- pip install -r requirements/testing.txt
|
||||
- apt-get install -qq curl exiftool gcc ghostscript gnupg1 graphviz libfuse2 libjpeg-dev libmagic1 libpng-dev libtiff-dev poppler-utils libreoffice poppler-utils python-dev python-pip tesseract-ocr tesseract-ocr-deu
|
||||
- pip install -r requirements.txt -r requirements/testing-base.txt
|
||||
only:
|
||||
- releases/all
|
||||
- releases/docker
|
||||
- releases/python
|
||||
- master
|
||||
- staging
|
||||
- nightly
|
||||
|
||||
@@ -171,7 +170,7 @@ test-mysql:
|
||||
- mysql:8.0.3
|
||||
script:
|
||||
- apt-get install -qq libmysqlclient-dev mysql-client
|
||||
- pip install mysql-python
|
||||
- pip install mysqlclient
|
||||
- mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "set global character_set_server=utf8mb4;"
|
||||
- python manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
|
||||
tags:
|
||||
|
||||
42
.tx/config
42
.tx/config
@@ -19,6 +19,12 @@ source_lang = en
|
||||
source_file = mayan/apps/authentication/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.autoadmin-2-0]
|
||||
file_filter = mayan/apps/autoadmin/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/autoadmin/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.cabinets-2-0]
|
||||
file_filter = mayan/apps/cabinets/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
@@ -43,18 +49,24 @@ source_lang = en
|
||||
source_file = mayan/apps/converter/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.dashboards-2-0]
|
||||
file_filter = mayan/apps/dashboards/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/dashboards/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.dependencies-3-0]
|
||||
file_filter = mayan/apps/dependencies/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/dependencies/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.django_gpg-2-0]
|
||||
file_filter = mayan/apps/django_gpg/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/django_gpg/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.documents-2-0]
|
||||
file_filter = mayan/apps/documents/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/documents/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.document_comments-2-0]
|
||||
file_filter = mayan/apps/document_comments/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
@@ -85,6 +97,12 @@ source_lang = en
|
||||
source_file = mayan/apps/document_states/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.documents-2-0]
|
||||
file_filter = mayan/apps/documents/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/documents/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.dynamic_search-2-0]
|
||||
file_filter = mayan/apps/dynamic_search/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
@@ -97,6 +115,12 @@ source_lang = en
|
||||
source_file = mayan/apps/events/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.file_metadata-3-0]
|
||||
file_filter = mayan/apps/file_metadata/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/file_metadata/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.linking-2-0]
|
||||
file_filter = mayan/apps/linking/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
@@ -145,6 +169,12 @@ source_lang = en
|
||||
source_file = mayan/apps/permissions/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.platform-2-0]
|
||||
file_filter = mayan/apps/platform/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/platform/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.rest_api-2-0]
|
||||
file_filter = mayan/apps/rest_api/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
|
||||
@@ -23,7 +23,7 @@ with deployments, webservers, cloud providers, etc.
|
||||
Code
|
||||
----
|
||||
|
||||
1. Complete and mail, or scan and email the corresponding Contributor Assignment Agreement: [Mayan EDMS Individual Contributor Assignment Agreement](https://docs.mayan-edms.com/topics/caa_individual.rst) or [Mayan EDMS Entity Contributor Assignment Agreement](https://docs.mayan-edms.com/topics/topics/caa_entity.rst).
|
||||
1. Complete and mail, or scan and email the corresponding Contributor Assignment Agreement: [Mayan EDMS Individual Contributor Assignment Agreement](https://gitlab.com/mayan-edms/mayan-edms/blob/master/docs/chapters/caa_individual.rst) or [Mayan EDMS Entity Contributor Assignment Agreement](https://gitlab.com/mayan-edms/mayan-edms/blob/master/docs/chapters/caa_entity.rst).
|
||||
1. Fork [the repository](http://gitlab.com/mayan-edms/mayan-edms).
|
||||
1. Choose the version for which you want to develop. The code is divided in the
|
||||
following branches:
|
||||
|
||||
487
HISTORY.rst
487
HISTORY.rst
@@ -1,3 +1,486 @@
|
||||
3.2.7 (2019-08-28)
|
||||
==================
|
||||
* Fix checkout form bug. Thanks to Lucius Schaerer
|
||||
(@lschaer1) for the report.
|
||||
* Disable pagination current page button
|
||||
Current page button was clickable and would cause the
|
||||
single page navigation to jump to the home view.
|
||||
* Remove redundant Celery queue declarations from the
|
||||
file_metadata app.
|
||||
* Add internal_name field to workflow serializer.
|
||||
Fixes workflow API creation view.
|
||||
* Fix document cabinet list API view. Thanks for forum user
|
||||
"jere" for the report. Forum topic 1039.
|
||||
* Fix document template column field. GitLab issue #655.
|
||||
Thanks to Christian Wiegand (@christianwgd) for the
|
||||
report.
|
||||
* Increase mailing profile password field max length
|
||||
from 48 to 128 characters. GitLab issue #657.
|
||||
Thanks to sigsec (@sigsec) for the report.
|
||||
* Update the Docker entrypoint to update the ownership
|
||||
of files when the UID of GUID are changed.
|
||||
GitLab issue #650. Thanks to Fabian (@ruffy91)
|
||||
for the report.
|
||||
* Update the Docker entrypoint to allow changing
|
||||
the GID of the mayan user to existing values.
|
||||
GitLab issue #652. Thanks to Fabian (@ruffy91)
|
||||
for the report.
|
||||
* Rename the MAYAN_USER_GUID environment variable
|
||||
to MAYAN_USER_GID.
|
||||
* Add automatic adjustment of HTML body on navigation
|
||||
bar changes. Closes GitLab issue #643. Thanks to
|
||||
Light Templar (@LightTemplar) for the report.
|
||||
* Unify all line endings to be Linux style.
|
||||
* Make sure system alerts don't appear under
|
||||
floating elements.
|
||||
|
||||
3.2.6 (2019-07-10)
|
||||
==================
|
||||
* Remove the smart settings app * import.
|
||||
* Encode settings YAML before hashing.
|
||||
* Fix document icon used in the workflow runtime links.
|
||||
* Add trashed date time label.
|
||||
* Fix thumbnail generation issue. GitLab issue #637.
|
||||
Thanks to Giacomo Cariello (@giacomocariello) for the report
|
||||
and the merge request fixing the issue.
|
||||
|
||||
3.2.5 (2019-07-05)
|
||||
==================
|
||||
* Don't error out if the EXTRA_APPS or the DISABLED_APPS settings
|
||||
are set to blank.
|
||||
* Update troubleshooting documentation topic.
|
||||
* Add data migration to the file metadata app. Synchronizes the
|
||||
document type settings model of existing document types.
|
||||
* Fix cabinet and tags upload wizard steps missing some entries.
|
||||
GitLab issue #632. Thanks to Matthias Urhahn (@d4rken) for the
|
||||
report.
|
||||
* Add alert when settings are changed and util the installation
|
||||
is restarted. GitLab issue #605. Thanks to
|
||||
Vikas Kedia (@vikaskedia) to the report.
|
||||
* Update Django to version 1.11.22, PyYAML to version 5.1.1,
|
||||
django-widget-tweaks to version 1.4.5, pathlib2 to version 2.3.4,
|
||||
Werkzeug to version 0.15.4, django-extensions to version 2.1.9,
|
||||
django-rosetta to version 0.9.3, psutil to version 5.6.3.
|
||||
|
||||
3.2.4 (2019-06-29)
|
||||
==================
|
||||
* Support configurable GUnicorn timeouts. Defaults to
|
||||
current value of 120 seconds.
|
||||
* Fix help text of the platformtemplate command.
|
||||
* Fix IMAP4 mailbox.store flags argument. Python's documentation
|
||||
incorrectly state it is named flag_list. Closes GitLab issue
|
||||
#606.
|
||||
* Improve the workflow preview generation. Use polylines
|
||||
instead of splines. Add state actions to the preview.
|
||||
Highlight the initial state.
|
||||
* Add help text to the workflow transition form comment field.
|
||||
* Fix direct deployment instructions.
|
||||
* Add user, group, and role dashboard widgets.
|
||||
* Add test mixin detect database connection leaks.
|
||||
* Remove tag create event registration from the tag
|
||||
instances. The tag create event is not applicable to
|
||||
existing tags.
|
||||
* Add proper redirection after moving a document to the
|
||||
trash.
|
||||
* Remove the INSTALLED_APPS setting. Replace it with
|
||||
the new COMMON_EXTRA_APPS and COMMON_DISABLED_APPS.
|
||||
* Improve email metadata support. Can now work on
|
||||
email with nested parts. Also the metadata.yaml
|
||||
attachment no longer needs to be the first attachment.
|
||||
|
||||
3.2.3 (2019-06-21)
|
||||
==================
|
||||
* Add support for disabling the random primary key
|
||||
test mixin.
|
||||
* Fix mailing profile log columns mappings.
|
||||
GitLab issue #626. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report.
|
||||
* Fix the Django SMTP backend username field name.
|
||||
GitLab issue #625. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report and the research.
|
||||
* Increase the Django STMP username.
|
||||
GitLab issue #625. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report and the research.
|
||||
|
||||
3.2.2 (2019-06-19)
|
||||
==================
|
||||
* Fix document type change view. Closes GitLab issue #614
|
||||
Thanks to Christoph Roeder (@brightdroid) for the report.
|
||||
* Fix document parsing tool view typo. Closes GitLab issue #615.
|
||||
Thanks to Tyler Page (@iamtpage) for the report.
|
||||
* Update the task_check_interval_source reference
|
||||
GitLab issue #617. Thanks to Lukas Gill (@lukkigi) for
|
||||
the report and debug information.
|
||||
|
||||
3.2.1 (2019-06-14)
|
||||
==================
|
||||
* Fix sub cabinet creation view. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report.
|
||||
* Add PostgreSQL troubleshooting entry. Closes GitLab
|
||||
issues #523 and #602
|
||||
* Use YAML SafeDumper to avoid adding YAML datatype tags.
|
||||
Closes GitLab issue #599. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report and debug information.
|
||||
* Add check for app references and point users to release notes for details.
|
||||
GitLab issue #603. Thanks to Vikas Kedia (@vikaskedia) for the report.
|
||||
* Remove sidebar floar right.
|
||||
Fixed GitLab issue #600. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report and debug information.
|
||||
* Collapse sidebar on small screen
|
||||
Display sidebar at the bottom of the screen on small displays.
|
||||
|
||||
3.2 (2019-06-13)
|
||||
================
|
||||
* Split sources models into separate modules.
|
||||
* Add support for subfolder scanning to watchfolders. Closes
|
||||
GitLab issue #498 and #563.
|
||||
* Updated the source check behavior to allow checking a source
|
||||
even when the source is disabled and to not deleted processed files
|
||||
during a check.
|
||||
* Switch to full app paths.
|
||||
* Split document app models into separate modules.
|
||||
* Split workflow views into separate modules.
|
||||
* Add custom DatabaseWarning to tag the SQLite usage warning.
|
||||
* Add keyword arguments to add_to_class instances.
|
||||
* Move add_to_class function to their own module called methods.py
|
||||
* Remove catch all exception handling for the check in and
|
||||
check out views.
|
||||
* Improve checkouts tests code reducing redundant code.
|
||||
* Change how the HOME_VIEW setting is defined.
|
||||
* Remove the role permission grant and revoke permission.
|
||||
* Split trashed document views into their own module.
|
||||
* Show entire sys trace when an App import exception is raised.
|
||||
* Remove Django suit from requirements.
|
||||
* Remove development URLs from main URL file.
|
||||
* Move API documentation generation from the root URLs module
|
||||
to the REST API app's URLs module.
|
||||
* Update Pillow to version 6.0.0
|
||||
* Update PyYAML to version 5.1. Update use of safe_load and
|
||||
safe_dump to load and dump using the SafeLoader.
|
||||
* Add SilenceLoggerTestCaseMixin to lower level of loggers
|
||||
during tests.
|
||||
* New default value for setting DOCUMENTS_HASH_BLOCK_SIZE is
|
||||
65535.
|
||||
* New default value for setting MIMETYPE_FILE_READ_SIZE is
|
||||
1024.
|
||||
* Add workaround for Tesseract bug 1670
|
||||
https://github.com/tesseract-ocr/tesseract/issues/1670
|
||||
https://github.com/tesseract-ocr/tesseract/commit/3292484f67af8bdda23aa5e510918d0115785291
|
||||
https://gitlab.gnome.org/World/OpenPaperwork/pyocr/issues/104
|
||||
* Move setting COMMON_TEMPORARY_DIRECTORY to the storage app.
|
||||
The setting is now STORAGE_TEMPORARY_DIRECTORY.
|
||||
* Move file related utilities to the storage app.
|
||||
* Backport and remove unused code from the permission app.
|
||||
* Move the navigation and authentication templates to their
|
||||
respective apps.
|
||||
* Add dashboard app.
|
||||
* Remove queryset slicing hack from the Document list view.
|
||||
And slice the Recently Added Document queryset itself.
|
||||
* Move stub filtering to the Document model manager.
|
||||
* Increase the default number of recently added documents and
|
||||
recently accessed documents from 40 to 400.
|
||||
* Integrate django-autoadmin into the core apps.
|
||||
* Update middleware to new style classes.
|
||||
* Add server side invalid document template.
|
||||
* Move tag specific JavaScript to the tags app.
|
||||
* Reduce form boilerplate code with new FormOptions class.
|
||||
* Use FormOptions for the DetailForm class.
|
||||
* DetailForm now support help text on extra fields.
|
||||
* Add FilteredSelectionForm class.
|
||||
* Use FilteredSelectionForm for TagMultipleSelectionForm.
|
||||
* Use FilteredSelectionForm for the class CabinetListForm.
|
||||
* Add keyword arguments to URL definitions.
|
||||
* Use FilteredSelectionForm to add a new ACLCreateForm.
|
||||
* Rename IndexListForm to IndexTemplateFilteredForm.
|
||||
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
|
||||
* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm.
|
||||
* Improve document signatures tests.
|
||||
* Add docstrings to most models.
|
||||
* Add support to the mailing profiles for specifying a from
|
||||
address. Closes GitLab issue #522.
|
||||
* Expose new Django settings: AUTH_PASSWORD_VALIDATORS, DEFAULT_FROM_EMAIL,
|
||||
EMAIL_TIMEOUT, INTERNAL_IPS, LANGUAGES, LANGUAGE_CODE, STATIC_URL,
|
||||
STATICFILES_STORAGE, TIME_ZONE, WSGI_APPLICATION.
|
||||
* Convert language choices into a function.
|
||||
* Move language choices generation to documents.utils.
|
||||
* Remove support for generating documents images in base 64
|
||||
format.
|
||||
* Move Pillow initialization from the module to the backend
|
||||
class initialization.
|
||||
* Remove star import from the ACL and Common apps.
|
||||
* Add dependencies app
|
||||
* Convert the document tags widget to use HTML templates.
|
||||
* Move Tag app HTML widgets to their own module.
|
||||
* Move the document index app widgets to the html_widget.py
|
||||
module.
|
||||
* Update group members view permission. The group edit and
|
||||
user edit permission are now required.
|
||||
* Add keyword arguments to messages uses.
|
||||
* Add keyword arguments to the reverse use in views.
|
||||
* Add MERCs 5 and 6.
|
||||
* Update authentication function views to use Django's new class
|
||||
based authentication views.
|
||||
* Expose Django's LOGOUT_REDIRECT_URL setting.
|
||||
* Move current user views from the common app to the user
|
||||
management app.
|
||||
* Move the purge permission logic to the StorePermission
|
||||
manager.
|
||||
* Remove the MIMETYPE_FILE_READ_SIZE setting.
|
||||
* Use copyfileobj in the document parsers.
|
||||
* Backport list facet menu code.
|
||||
* Backport sidebar code.
|
||||
* CSS updates to maximize usable width.
|
||||
* Improve partial navigation error messages and display.
|
||||
* Add user created and user edited events.
|
||||
* Add group created and group edited events.
|
||||
* Add support for SourceColumn widgets.
|
||||
* Improve styling of the template debug view.
|
||||
* Add support for showing the current user's events.
|
||||
* Add support kwargs to the SourceColumn class.
|
||||
* Improve the event widgets, views and tests.
|
||||
* Add mailer use event.
|
||||
* Remove the include fontawesome and download it from
|
||||
the NPMregistry.
|
||||
* Fix issue installing scoped NPM packages.
|
||||
* Add new icons classes and templates.
|
||||
* Add support for icon composition.
|
||||
* Add support for link icon path imports.
|
||||
* Remove support for link icon strings.
|
||||
* Split document app form into separate modules.
|
||||
* Move the favorite document views to their own module.
|
||||
* Replace DocumentTypeSelectioForm with an improved
|
||||
version that does filtering.
|
||||
* Update OCR links activation.
|
||||
* Update document parsing link activation.
|
||||
* Add favorite document views tests.
|
||||
* Add document state action view test.
|
||||
* Remove sidebar menu instance. The secondary menu and the
|
||||
previour sidebar menu now perform the same function.
|
||||
* Backport source column identifiable and sortable
|
||||
improvements.
|
||||
* Update the way the no-result template is shown.
|
||||
* Improve TwoStateWidget to use a template. Make
|
||||
it compatible with the SourceColumn.
|
||||
* Update SourceColumn to support related attributes.
|
||||
* Add support for display for empty values for
|
||||
source columns.
|
||||
* Add support for source column object or attribute
|
||||
absolute URLs.
|
||||
* Add sortable columns to all apps.
|
||||
* Remove permission list display from the ACL list view.
|
||||
Reduces clutter and unpredictable column size.
|
||||
* Remove the full name from the user list.
|
||||
* Add the first name and last name to the user list.
|
||||
* Add file metadata app.
|
||||
* Add support for submitting forms by pressing the
|
||||
Enter key or by double clicking.
|
||||
* Rename form template 'form_class' to 'form_css_classes'.
|
||||
* Add support for adding form button aside from the
|
||||
default submit and cancel.
|
||||
* Update ChoiceForm to be full height.
|
||||
* Add AddRemoveView to replace AssignRemoveView
|
||||
* Update the group roles view to use the new AddRemoveView.
|
||||
* Add role create and edit events.
|
||||
* Sort users by lastname, firstname.
|
||||
* Switch user groups and group users views to AddRemoveView.
|
||||
* Commit user edit event when an user is added or removed
|
||||
from a group.
|
||||
* Commit the group edit event when a group is added or remove
|
||||
from an user.
|
||||
* Require dual permissions when add or removing users to and
|
||||
from group. Same with group to users.
|
||||
* Backport search improvements.
|
||||
* Remove search elapsed time calculation.
|
||||
* Remove SEARCH_LIMIT setting.
|
||||
* Use the 'handler' prefix for all the signal handler functions.
|
||||
* Remove custom email widget and use Django's.
|
||||
* Increase default maximum number of favorite documents to 400.
|
||||
* Update the role group list view to use the new AddRemoveView.
|
||||
* Commit the group event in conjunction with the role event
|
||||
when a group is added or remove from role.
|
||||
* Update the role permission view to use the new AddRemoveView.
|
||||
* Rename transformation manager method add_for_model to
|
||||
add_to_object.
|
||||
* Rename transformation manager method get_for_model to
|
||||
get_for_object.
|
||||
* Load the converter class on demand.
|
||||
* Remove app top level star imports.
|
||||
* Monkeypatch group and user models to make their fields
|
||||
translatable.
|
||||
* Add new and default Tesseract OCR backend to avoid
|
||||
Tesseract bug 1670
|
||||
(https://github.com/tesseract-ocr/tesseract/issues/1670)
|
||||
* Load only one language in the document properties form.
|
||||
* Convert title calculation form to a template tag.
|
||||
* Show the full title as a hover title even when truncated.
|
||||
* Increase default title truncation length to 120 characters.
|
||||
* Improve inherited permission computation.
|
||||
* Add test case mixin that produces ephimeral models.
|
||||
* Update ACL permissions view to use the new AddRemoveView class.
|
||||
* Add ACL created and edited events.
|
||||
* Update index document types view to use the new AddRemoveView
|
||||
class.
|
||||
* Add index create and edit events.
|
||||
* Allow overloading the action_add and action_remove methods
|
||||
from the AddRemoveView.
|
||||
* Add view to link document type and indexes from the document
|
||||
type side.
|
||||
* Update smart link document type selection view to use
|
||||
AddRemoveView class.
|
||||
* Add smart link created and edited events.
|
||||
* Fix smart link ACL support.
|
||||
* Update JavaScript downloader to work with Python 3.
|
||||
* Improve speed of the NPM package hash verification.
|
||||
* Add view to enable smart links for documents types
|
||||
from the document type side.
|
||||
* Enable list link icons.
|
||||
* Add outline links CSS for facets.
|
||||
* Add a bottom margin to list links.
|
||||
* Use copyfileobj to save documents to files
|
||||
* Add user logged in and logged out events.
|
||||
* Add transaction handling in more places.
|
||||
* Update ACLs tests to use ephimeral models.
|
||||
* Add new app to handle all dependencies.
|
||||
* Remove the licenses.py module and replace
|
||||
it with a dependencies.py module.
|
||||
* Backport ACL computation improvements.
|
||||
* Remove model permission proxy models.
|
||||
* Remove related access control argument. This is
|
||||
now handled by the related field registration.
|
||||
* Allow nested access control checking.
|
||||
* check_access's permissions argument must now be
|
||||
an interable.
|
||||
* Remove permissions_related from links.
|
||||
* Remove mayan_permission_attribute_check from
|
||||
API permission.
|
||||
* Update Bootstrap and Bootswatch to version 3.4.1.
|
||||
* Convert the workflow document types view to use
|
||||
the new AddRemove view.
|
||||
* Add the workflow created and edited events.
|
||||
* Remove AssignRemove View.
|
||||
* Add view to setup workflows per document type
|
||||
from the document type side.
|
||||
* Make workflows, workflows states, workflow
|
||||
transitions column sortable.
|
||||
* Show completion and intial state in the
|
||||
workflow proxy instance menu list.
|
||||
* Fix translation of the source upload forms
|
||||
using dropzone.js
|
||||
* Rename get_object_list to get_source_queryset.
|
||||
* Add uniqueness validation to SingleObjectCreateView.
|
||||
* Remove MultipleInstanceActionMixin.
|
||||
* Backport MultipleObjectMixin improvements.
|
||||
* Remove ObjectListPermissionFilterMixin.
|
||||
* Add deprecation warning to convertdb
|
||||
* Add the preparestatic command.
|
||||
* Remove the related attribute of check_access.
|
||||
* Remove filter_by_access. Replaced by restrict_queryset.
|
||||
* Move the user set password views to the authentication app.
|
||||
* All views redirect to common's home view instead of the
|
||||
REDIRECT_URL setting.
|
||||
* Update tag document list and the document tag list
|
||||
views to require the view permissions for both objects.
|
||||
* Install and server static content to and from the image.
|
||||
* Add support for editing document comments.
|
||||
* Remove Internet Explorer specific markup.
|
||||
* Fix optional metadata remove when mixed with required
|
||||
metadata.
|
||||
* Create intermedia file cache folder. Fixes preview errors
|
||||
when the first document uploaded is an office file.
|
||||
* Move queue and task registration to the CeleryQueue class.
|
||||
The .queues.py module is now loaded automatically.
|
||||
* Allow setting the Docker user UID and GUID.
|
||||
* Add task path validation.
|
||||
* Increase dropzone upload file size limit to 2GB.
|
||||
* Add cabinet created and edited events.
|
||||
* Show a null mailer backend if there is backend with an
|
||||
invalid path. Due to the app full path change, existing
|
||||
mailer setups need to be recreated.
|
||||
* The document link URL when mailed is now composed of the
|
||||
COMMON_PROJECT_URL + document URL instead of the Site
|
||||
domain.
|
||||
* Add the checkdependencies command.
|
||||
* Add comment and make file target to generate all requirement
|
||||
files.
|
||||
* Place deletion policies units before periods for clarity.
|
||||
* Remove repeated EMAIL_TIMEOUT setting.
|
||||
* Invert order to the Action Object and Target columns for
|
||||
clarity.
|
||||
* Add note about the new preparestatic command.
|
||||
* Add no-result template for workflow instance detail view.
|
||||
* Update HTTP workflow action to new requests API.
|
||||
* Remove the included Lato font. The font is now downloaded
|
||||
at install time.
|
||||
* Add support for Google Fonts dependencies.
|
||||
* Add support for patchin dependency files using rewriting rules.
|
||||
* Allow searching documents by UUID.
|
||||
* Improve search negation logic.
|
||||
* Add support for search field transformations.
|
||||
* Disable hiding page navigation on idle.
|
||||
* Display namespace in the transition trigger view.
|
||||
* Sort events list in the transition trigger view.
|
||||
* Add support for form media to DynamicFormMixin.
|
||||
* Fix tag attach and remove action form media.
|
||||
* Sort content type list of the access grant and remove action.
|
||||
* Use select2 for the content type filed of the access
|
||||
grant and remove action.
|
||||
* Add Latvian translation.
|
||||
* Support search model selection.
|
||||
* Support passing a queryset factory to the search model.
|
||||
* Add workflow actions to grant or remove permissions to
|
||||
a document.
|
||||
* Add support for locked files for watchfolder.
|
||||
|
||||
3.1.11 (2019-04-XX)
|
||||
===================
|
||||
* Fix multiple tag selection wizard step.
|
||||
* Change the required permission for the checkout info link from
|
||||
document check in to document checkout details view.
|
||||
* Lower the log severity when links don't resolve.
|
||||
* Add DOCUMENTS_HASH_BLOCK_SIZE to control the size of the file
|
||||
block when calculating a document's checksum.
|
||||
|
||||
3.1.10 (2019-04-04)
|
||||
===================
|
||||
* Backport test case improvements from the development branch. Add random
|
||||
primary key mixin. Split test case code into mixins. Make the view test
|
||||
case and the API test cases part of the same class hierarchy. Update tests
|
||||
that failed due to the new import locations.
|
||||
* Add support for disabling the content type checking test case mixin.
|
||||
* Update document indexing tests to be order agnostic. GitLab issue #559.
|
||||
* Add test for the advanced search API.
|
||||
* Apply merge !36 by Simeon Walker (@simeon-walker) to fix the advanced search
|
||||
API.
|
||||
* Apply merge !35 by Manoel Brunnen (@mbru) to fix building the Docker image
|
||||
on the armv7l platform (RasperryPi, Odroid XU4, Odroid HC2). Also fixes
|
||||
assertion errors from pip (https://github.com/pypa/pip/issues/6197).
|
||||
* Apply merge !37 by Roger Hunwicks (@roger.hunwicks) to allow
|
||||
TestViewTestCaseMixin to work with a custom ROOT_URLCONF. GitLab issue #566.
|
||||
* Apply merge !40 by Roger Hunwicks (@/roger.hunwicks) to pin the Tornado
|
||||
version used to 6.0 and continue supporting Python 2.7. GitLab issue #568.
|
||||
* Apply merge !41 by Jorge E. Gomez (@jorgeegomez) to fix the compressed class
|
||||
method name. GitLab issue #572.
|
||||
* Remove notification badge AJAX setup. Individual link AJAX workers are
|
||||
obsolete now that the menu is being rendered by its own AJAX renderer.
|
||||
GitLab issue #562.
|
||||
* Add support for server side link badges.
|
||||
* Add API to list all templates.
|
||||
* Remove newlines from the rendered templates.
|
||||
* Reject emails attachments of size 0. Thanks to Robert Schoeftner
|
||||
(@robert.schoeftner)for the report and solution. GitLab issue #574.
|
||||
* Add missing document index API view create permission.
|
||||
* Fix index list API view. Add index create, delete, detail API tests.
|
||||
GitLab issue #564. Thanks to the Stéphane (@shoyu) for the report and debug
|
||||
information.
|
||||
* Validate the state completion value before saving. Thanks to Manoel Brunnen
|
||||
(@mbru) for the report and debug information. GitLab issue #557.
|
||||
* Add the MIMETYPE_FILE_READ_SIZE setting to limit the number of bytes read
|
||||
to determine the MIME type of a new document.
|
||||
* Force object to text when raising PermissionDenied to avoid
|
||||
UnicodeDecodeError. Thanks to Mathias Behrle (@mbehrle) for the report
|
||||
and the debug information. GitLab issue #576.
|
||||
* Add support for skipping a default set of tests.
|
||||
|
||||
3.1.9 (2018-11-01)
|
||||
==================
|
||||
* Convert the furl instance to text to allow serializing it into
|
||||
@@ -330,6 +813,10 @@
|
||||
model.
|
||||
- Make icon classes file template based.
|
||||
- Add the current step and total steps of a wizard in the template context.
|
||||
- Chart updates: Show last update date and time in list view and details view.
|
||||
Change color scheme to match rest of project. Increase size of data points.
|
||||
Improve responsive settings. Redirect to the current view after queueing.
|
||||
- Split document type retention policies into it own view.
|
||||
|
||||
3.0.3 (2018-08-17)
|
||||
==================
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright 2011-2018 Roberto Rosario
|
||||
Copyright 2011 Roberto Rosario
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
include README.md LICENSE HISTORY.rst mayan/LICENSE
|
||||
recursive-include mayan/apps *.txt *.html *.css *.ico *.png *.jpg *.js *.po *.mo *.ttf *.woff *.woff2 *.gif *.eot *.svg *.doc *.pdf *.tiff *.sig *.asc *.gpg *.zip *.tar *.gz *.bz2 package.json
|
||||
global-exclude mayan/settings/local.py mayan/settings/travis/* mayan/media/*
|
||||
recursive-include mayan/apps *.txt *.html *.css *.ico *.png *.jpg *.js *.mo *.ttf *.woff *.woff2 *.gif *.eot *.svg *.doc *.pdf *.tiff *.sig *.asc *.gpg *.zip *.tar *.gz *.bz2 *.tmpl
|
||||
global-exclude mayan/settings/local.py *.po
|
||||
prune mayan/apps/*/static/*/node_modules/*
|
||||
prune mayan/settings/travis/*
|
||||
prune mayan/media/*
|
||||
|
||||
173
Makefile
173
Makefile
@@ -1,64 +1,20 @@
|
||||
.PHONY: clean-pyc clean-build
|
||||
|
||||
help: docker-help
|
||||
@echo
|
||||
@echo "**** Main makefile ****"
|
||||
@echo "clean-build - Remove build artifacts."
|
||||
@echo "clean-pyc - Remove Python artifacts."
|
||||
@echo "clean - Remove Python and build artifacts."
|
||||
@echo "generate-setup - Create and updated setup.py"
|
||||
@echo "check-readme - Checks validity of the README.rst file for PyPI publication."
|
||||
@echo "check-missing_migrations - Make sure all models have proper migrations."
|
||||
|
||||
@echo "test-all - Run all tests."
|
||||
@echo "test MODULE=<python module name> - Run tests for a single app, module or test class."
|
||||
@echo "test-with-postgres-all - Run all tests against a Postgres database container."
|
||||
@echo "test-postgres MODULE=<python module name> - Run tests for a single app, module or test class against a Postgres database container."
|
||||
@echo "test-with-mysql-all - Run all tests against a MySQL database container."
|
||||
@echo "test-mysql MODULE=<python module name> - Run tests for a single app, module or test class against a MySQL database container."
|
||||
@echo "test-with-oracle-all - Run all tests against a Oracle database container."
|
||||
@echo "test-oracle MODULE=<python module name> - Run tests for a single app, module or test class against a Oracle database container."
|
||||
|
||||
@echo "docs-serve - Run the livehtml documentation generator."
|
||||
|
||||
@echo "translations-make - Refresh all translation files."
|
||||
@echo "translations-compile - Compile all translation files."
|
||||
@echo "translations-push - Upload all translation files to Transifex."
|
||||
@echo "translations-pull - Download all translation files from Transifex."
|
||||
|
||||
@echo "sdist - Build the source distribution package."
|
||||
@echo "wheel - Build the wheel distribution package."
|
||||
@echo "release - Package (sdist and wheel) and upload a release."
|
||||
@echo "test-release - Package (sdist and wheel) and upload to the PyPI test server."
|
||||
@echo "release-test-via-docker-ubuntu - Package (sdist and wheel) and upload to the PyPI test server using an Ubuntu Docker builder."
|
||||
@echo "release-via-docker-ubuntu - Package (sdist and wheel) and upload to PyPI using an Ubuntu Docker builder."
|
||||
@echo "test-sdist-via-docker-ubuntu - Make an sdist packange and test it using an Ubuntu Docker container."
|
||||
@echo "test-wheel-via-docker-ubuntu - Make a wheel package and test it using an Ubuntu Docker container."
|
||||
@echo "runserver - Run the development server."
|
||||
@echo "runserver_plus - Run the Django extension's development server."
|
||||
@echo "shell_plus - Run the shell_plus command."
|
||||
|
||||
@echo "test-with-docker-services-on - Launch and initialize production-like services using Docker (Postgres and Redis)."
|
||||
@echo "test-with-docker-services-off - Stop and delete the Docker production-like services."
|
||||
@echo "test-with-docker-frontend - Launch a front end instance that uses the production-like services."
|
||||
@echo "test-with-docker-worker - Launch a worker instance that uses the production-like services."
|
||||
@echo "docker-mysql-on - Launch and initialize a MySQL Docker container."
|
||||
@echo "docker-mysql-off - Stop and delete the MySQL Docker container."
|
||||
@echo "docker-postgres-on - Launch and initialize a PostgreSQL Docker container."
|
||||
@echo "docker-postgres-off - Stop and delete the PostgreSQL Docker container."
|
||||
|
||||
@echo "safety-check - Run a package safety check."
|
||||
help:
|
||||
@echo "Usage: make <target>\n"
|
||||
@awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_-]+:.*?## / { printf " * %-40s -%s\n", $$1, $$2 }' $(MAKEFILE_LIST)|sort
|
||||
|
||||
# Cleaning
|
||||
|
||||
clean: ## Remove Python and build artifacts.
|
||||
clean: clean-build clean-pyc
|
||||
|
||||
clean-build:
|
||||
clean-build: ## Remove build artifacts.
|
||||
rm -fr build/
|
||||
rm -fr dist/
|
||||
rm -fr *.egg-info
|
||||
|
||||
clean-pyc:
|
||||
clean-pyc: ## Remove Python artifacts.
|
||||
find . -name '*.pyc' -exec rm -f {} +
|
||||
find . -name '*.pyo' -exec rm -f {} +
|
||||
find . -name '*~' -exec rm -f {} +
|
||||
@@ -66,25 +22,29 @@ clean-pyc:
|
||||
|
||||
# Testing
|
||||
|
||||
test:
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.development --nomigrations
|
||||
test: clean-pyc
|
||||
test: ## MODULE=<python module name> - Run tests for a single app, module or test class.
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.development --nomigrations $(ARGUMENTS)
|
||||
|
||||
test-all:
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.development --nomigrations
|
||||
test-all: ## Run all tests.
|
||||
test-all: clean-pyc
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.development --nomigrations $(ARGUMENTS)
|
||||
|
||||
test-launch-postgres:
|
||||
@docker rm -f test-postgres || true
|
||||
@docker volume rm test-postgres || true
|
||||
docker run -d --name test-postgres -p 5432:5432 -v test-postgres:/var/lib/postgresql/data healthcheck/postgres
|
||||
sudo apt-get install -qq libpq-dev
|
||||
sudo apt-get install -q libpq-dev
|
||||
pip install psycopg2
|
||||
while ! docker inspect --format='{{json .State.Health}}' test-postgres|grep 'Status":"healthy"'; do sleep 1; done
|
||||
|
||||
test-with-postgres: ## MODULE=<python module name> - Run tests for a single app, module or test class against a Postgres database container.
|
||||
test-with-postgres: test-launch-postgres
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_postgres --nomigrations
|
||||
@docker rm -f test-postgres || true
|
||||
@docker volume rm test-postgres || true
|
||||
|
||||
test-with-postgres-all: ## Run all tests against a Postgres database container.
|
||||
test-with-postgres-all: test-launch-postgres
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_postgres --nomigrations
|
||||
@docker rm -f test-postgres || true
|
||||
@@ -94,16 +54,19 @@ test-launch-mysql:
|
||||
@docker rm -f test-mysql || true
|
||||
@docker volume rm test-mysql || true
|
||||
docker run -d --name test-mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan -v test-mysql:/var/lib/mysql healthcheck/mysql
|
||||
sudo apt-get install -qq libmysqlclient-dev mysql-client
|
||||
pip install mysql-python
|
||||
sudo apt-get install -q libmysqlclient-dev mysql-client
|
||||
pip install mysqlclient
|
||||
while ! docker inspect --format='{{json .State.Health}}' test-mysql|grep 'Status":"healthy"'; do sleep 1; done
|
||||
mysql -h 127.0.0.1 -P 3306 -uroot -e "set global character_set_server=utf8mb4;"
|
||||
|
||||
test-with-mysql: ## MODULE=<python module name> - Run tests for a single app, module or test class against a MySQL database container.
|
||||
test-with-mysql: test-launch-mysql
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_mysql --nomigrations
|
||||
@docker rm -f test-mysql || true
|
||||
@docker volume rm test-mysql || true
|
||||
|
||||
|
||||
test-with-mysql-all: ## Run all tests against a MySQL database container.
|
||||
test-with-mysql-all: test-launch-mysql
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_mysql --nomigrations
|
||||
@docker rm -f test-mysql || true
|
||||
@@ -118,11 +81,13 @@ test-launch-oracle:
|
||||
while ! nc -z 127.0.0.1 49161; do sleep 1; done
|
||||
sleep 10
|
||||
|
||||
test-with-oracle: ## MODULE=<python module name> - Run tests for a single app, module or test class against a Oracle database container.
|
||||
test-with-oracle: test-launch-oracle
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_oracle --nomigrations
|
||||
@docker rm -f test-oracle || true
|
||||
@docker volume rm test-oracle || true
|
||||
|
||||
test-with-oracle-all: ## Run all tests against a Oracle database container.
|
||||
test-with-oracle-all: test-launch-oracle
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_oracle --nomigrations
|
||||
@docker rm -f test-oracle || true
|
||||
@@ -130,58 +95,56 @@ test-with-oracle-all: test-launch-oracle
|
||||
|
||||
# Documentation
|
||||
|
||||
docs-serve:
|
||||
docs-serve: ## Run the livehtml documentation generator.
|
||||
cd docs;make livehtml
|
||||
|
||||
docs-spellcheck:
|
||||
|
||||
docs-spellcheck: ## Spellcheck the documentation.
|
||||
sphinx-build -b spelling -d docs/_build/ docs docs/_build/spelling
|
||||
|
||||
# Translations
|
||||
|
||||
translations-make:
|
||||
translations-make: ## Refresh all translation files.
|
||||
contrib/scripts/process_messages.py -m
|
||||
|
||||
translations-compile:
|
||||
translations-compile: ## Compile all translation files.
|
||||
contrib/scripts/process_messages.py -c
|
||||
|
||||
translations-push:
|
||||
translations-push: ## Upload all translation files to Transifex.
|
||||
tx push -s
|
||||
|
||||
translations-pull:
|
||||
translations-pull: ## Download all translation files from Transifex.
|
||||
tx pull -f
|
||||
|
||||
|
||||
generate-setup:
|
||||
@./generate_setup.py
|
||||
@echo "Complete."
|
||||
|
||||
# Releases
|
||||
|
||||
increase-version:
|
||||
increase-version: ## Increase the version number of the entire project's files.
|
||||
@VERSION=`grep "__version__ =" mayan/__init__.py| cut -d\' -f 2|./increase_version.py - $(PART)`; \
|
||||
BUILD=`echo $$VERSION|awk '{split($$VERSION,a,"."); printf("0x%02d%02d%02d\n", a[1],a[2], a[3])}'`; \
|
||||
sed -i -e "s/__build__ = 0x[0-9]*/__build__ = $${BUILD}/g" mayan/__init__.py; \
|
||||
sed -i -e "s/__version__ = '[0-9\.]*'/__version__ = '$${VERSION}'/g" mayan/__init__.py; \
|
||||
echo $$VERSION > docker/version
|
||||
echo $$VERSION > docker/rootfs/version
|
||||
make generate-setup
|
||||
|
||||
test-release: clean wheel
|
||||
python-test-release: ## Package (sdist and wheel) and upload to the PyPI test server.
|
||||
python-test-release: clean wheel
|
||||
twine upload dist/* -r testpypi
|
||||
@echo "Test with: pip install -i https://testpypi.python.org/pypi mayan-edms"
|
||||
|
||||
release: clean wheel
|
||||
python-release: ## Package (sdist and wheel) and upload a release.
|
||||
python-release: clean python-wheel
|
||||
twine upload dist/* -r pypi
|
||||
|
||||
sdist: clean
|
||||
python-sdist: ## Build the source distribution package.
|
||||
python-sdist: clean
|
||||
python setup.py sdist
|
||||
ls -l dist
|
||||
|
||||
wheel: clean sdist
|
||||
python-wheel: ## Build the wheel distribution package.
|
||||
python-wheel: clean python-sdist
|
||||
pip wheel --no-index --no-deps --wheel-dir dist dist/*.tar.gz
|
||||
ls -l dist
|
||||
|
||||
release-test-via-docker-ubuntu:
|
||||
python-release-test-via-docker-ubuntu: ## Package (sdist and wheel) and upload to the PyPI test server using an Ubuntu Docker builder.
|
||||
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
|
||||
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
locale-gen en_US.UTF-8 && \
|
||||
@@ -194,7 +157,7 @@ release-test-via-docker-ubuntu:
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make test-release"
|
||||
|
||||
release-via-docker-ubuntu:
|
||||
python-release-via-docker-ubuntu: ## Package (sdist and wheel) and upload to PyPI using an Ubuntu Docker builder.
|
||||
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
|
||||
apt-get update && \
|
||||
apt-get -y install locales && \
|
||||
@@ -208,7 +171,7 @@ release-via-docker-ubuntu:
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make release"
|
||||
|
||||
test-sdist-via-docker-ubuntu:
|
||||
test-sdist-via-docker-ubuntu: ## Make an sdist package and test it using an Ubuntu Docker container.
|
||||
docker run --rm --name mayan_sdist_test -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
|
||||
cp -r /host_source/* . && \
|
||||
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
@@ -221,7 +184,7 @@ test-sdist-via-docker-ubuntu:
|
||||
make sdist-test-suit \
|
||||
"
|
||||
|
||||
test-wheel-via-docker-ubuntu:
|
||||
test-wheel-via-docker-ubuntu: ## Make a wheel package and test it using an Ubuntu Docker container.
|
||||
docker run --rm --name mayan_wheel_test -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
|
||||
cp -r /host_source/* . && \
|
||||
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
@@ -234,7 +197,7 @@ test-wheel-via-docker-ubuntu:
|
||||
make wheel-test-suit \
|
||||
"
|
||||
|
||||
sdist-test-suit: sdist
|
||||
python-sdist-test-suit: sdist
|
||||
rm -f -R _virtualenv
|
||||
virtualenv _virtualenv
|
||||
sh -c '\
|
||||
@@ -245,7 +208,7 @@ sdist-test-suit: sdist
|
||||
_virtualenv/bin/mayan-edms.py test --mayan-apps \
|
||||
'
|
||||
|
||||
wheel-test-suit: wheel
|
||||
python-wheel-test-suit: wheel
|
||||
rm -f -R _virtualenv
|
||||
virtualenv _virtualenv
|
||||
sh -c '\
|
||||
@@ -256,18 +219,30 @@ wheel-test-suit: wheel
|
||||
_virtualenv/bin/mayan-edms.py test --mayan-apps \
|
||||
'
|
||||
|
||||
generate-setup: ## Create and update the setup.py file.
|
||||
generate-setup: generate-requirements
|
||||
@./generate_setup.py
|
||||
@echo "Complete."
|
||||
|
||||
generate-requirements: ## Generate all requirements files from the project depedency declarations.
|
||||
@./manage.py generaterequirements build > requirements/build.txt
|
||||
@./manage.py generaterequirements development > requirements/development.txt
|
||||
@./manage.py generaterequirements testing > requirements/testing-base.txt
|
||||
@./manage.py generaterequirements production --exclude=django > requirements/base.txt
|
||||
@./manage.py generaterequirements production --only=django > requirements/common.txt
|
||||
|
||||
# Dev server
|
||||
|
||||
runserver:
|
||||
runserver: ## Run the development server.
|
||||
./manage.py runserver --settings=mayan.settings.development $(ADDRPORT)
|
||||
|
||||
runserver_plus:
|
||||
runserver_plus: ## Run the Django extension's development server.
|
||||
./manage.py runserver_plus --settings=mayan.settings.development $(ADDRPORT)
|
||||
|
||||
shell_plus:
|
||||
shell_plus: ## Run the shell_plus command.
|
||||
./manage.py shell_plus --settings=mayan.settings.development
|
||||
|
||||
test-with-docker-services-on:
|
||||
test-with-docker-services-on: ## Launch and initialize production-like services using Docker (Postgres and Redis).
|
||||
docker run -d --name redis -p 6379:6379 redis
|
||||
docker run -d --name postgres -p 5432:5432 postgres
|
||||
while ! nc -z 127.0.0.1 6379; do sleep 1; done
|
||||
@@ -275,45 +250,45 @@ test-with-docker-services-on:
|
||||
sleep 4
|
||||
./manage.py initialsetup --settings=mayan.settings.staging.docker
|
||||
|
||||
test-with-docker-services-off:
|
||||
test-with-docker-services-off: ## Stop and delete the Docker production-like services.
|
||||
docker stop postgres redis
|
||||
docker rm postgres redis
|
||||
|
||||
test-with-docker-frontend:
|
||||
test-with-docker-frontend: ## Launch a front end instance that uses the production-like services.
|
||||
./manage.py runserver --settings=mayan.settings.staging.docker
|
||||
|
||||
test-with-docker-worker:
|
||||
test-with-docker-worker: ## Launch a worker instance that uses the production-like services.
|
||||
./manage.py celery worker --settings=mayan.settings.staging.docker -B -l INFO -O fair
|
||||
|
||||
docker-mysql-on:
|
||||
docker-mysql-on: ## Launch and initialize a MySQL Docker container.
|
||||
docker run -d --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan_edms mysql
|
||||
while ! nc -z 127.0.0.1 3306; do sleep 1; done
|
||||
|
||||
docker-mysql-off:
|
||||
docker-mysql-off: ## Stop and delete the MySQL Docker container.
|
||||
docker stop mysql
|
||||
docker rm mysql
|
||||
|
||||
docker-postgres-on:
|
||||
docker-postgres-on: ## Launch and initialize a PostgreSQL Docker container.
|
||||
docker run -d --name postgres -p 5432:5432 postgres
|
||||
while ! nc -z 127.0.0.1 5432; do sleep 1; done
|
||||
|
||||
docker-postgres-off:
|
||||
docker-postgres-off: ## Stop and delete the PostgreSQL Docker container.
|
||||
docker stop postgres
|
||||
docker rm postgres
|
||||
|
||||
|
||||
# Security
|
||||
|
||||
safety-check:
|
||||
safety-check: ## Run a package safety check.
|
||||
safety check
|
||||
|
||||
|
||||
# Other
|
||||
find-gitignores:
|
||||
find-gitignores: ## Find stray .gitignore files.
|
||||
@export FIND_GITIGNORES=`find -name '.gitignore'| wc -l`; \
|
||||
if [ $${FIND_GITIGNORES} -gt 1 ] ;then echo "More than one .gitignore found."; fi
|
||||
|
||||
build:
|
||||
python-build:
|
||||
docker rm -f mayan-edms-build || true && \
|
||||
docker run --rm --name mayan-edms-build -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source python:2-slim sh -c "\
|
||||
rm /host_source/dist -R || true && \
|
||||
@@ -326,11 +301,13 @@ build:
|
||||
make wheel && \
|
||||
cp dist/* /host_source/dist/"
|
||||
|
||||
check-readme:
|
||||
check-readme: ## Checks validity of the README.rst file for PyPI publication.
|
||||
python setup.py check -r -s
|
||||
|
||||
check-missing-migrations:
|
||||
check-missing-migrations: ## Make sure all models have proper migrations.
|
||||
./manage.py makemigrations --dry-run --noinput --check
|
||||
|
||||
setup-dev-environment: ## Bootstrap a virtualenv by install all dependencies to start developing.
|
||||
pip install -r requirements.txt -r requirements/development.txt -r requirements/testing-base.txt -r requirements/documentation.txt -r requirements/build.txt
|
||||
|
||||
include docker/Makefile
|
||||
-include docker/Makefile
|
||||
|
||||
18
README.md
18
README.md
@@ -1,11 +1,11 @@
|
||||
[](https://paypal.me/MayanEDMS)
|
||||
[![pypi][pypi]][pypi-url]
|
||||
[![builds][builds]][builds-url]
|
||||
[![coverage][cover]][cover-url]
|
||||
![python][python]
|
||||
![license][license]
|
||||
[](https://hub.docker.com/r/mayanedms/mayanedms/)
|
||||
[](https://hub.docker.com/r/mayanedms/mayanedms/)
|
||||
[](https://microbadger.com/images/mayanedms/mayanedms)
|
||||
|
||||
|
||||
[pypi]: http://img.shields.io/pypi/v/mayan-edms.svg
|
||||
[pypi-url]: http://badge.fury.io/py/mayan-edms
|
||||
@@ -43,6 +43,20 @@
|
||||
|
||||
</div>
|
||||
|
||||
<h2 align="center">Book</h2>
|
||||
|
||||
The pre-release version of the book "Exploring Mayan EDMS" available now at a discounted price!
|
||||
|
||||
<p align="center">
|
||||
<a href="https://sellfy.com/p/um2fkx/">
|
||||
<img width="400" src="https://d12swbtw719y4s.cloudfront.net/images/v6RpxW40/aP0qKLjkPiAuXZhYuB45/wDAULAzFyx.jpeg?w=548">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
Limited quantities. Buyers of the pre-release will get the full version for free when it is ready.
|
||||
|
||||
The link is https://sellfy.com/p/um2fkx/
|
||||
|
||||
<h2 align="center">Installation</h2>
|
||||
|
||||
The easiest way to use Mayan EDMS is by using the official
|
||||
|
||||
14
README.rst
14
README.rst
@@ -1,4 +1,4 @@
|
||||
|pypi| |builds| |coverage| |python| |license| |docker_pulls| |docker_stars| |docker_layers|
|
||||
|donation| |pypi| |builds| |coverage| |python| |license| |docker_pulls| |docker_stars| |docker_layers|
|
||||
|
||||
|
||||
.. image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/mayan_logo.png
|
||||
@@ -25,6 +25,16 @@ at: https://docs.mayan-edms.com/topics/installation.html
|
||||
|
||||
.. _Docker: https://www.docker.com/
|
||||
|
||||
The pre-release version of the book "Exploring Mayan EDMS" available now at a discounted price!
|
||||
|
||||
.. image:: https://camo.githubusercontent.com/89d2fe787507c9247aa7bb406e2682b53eb7a5f9/68747470733a2f2f64313273776274773731397934732e636c6f756466726f6e742e6e65742f696d616765732f76365270785734302f615030714b4c6a6b50694175585a6859754234352f774441554c417a4679782e6a7065673f773d353438
|
||||
:align: center
|
||||
:width: 300
|
||||
:target: https://sellfy.com/p/um2fkx/
|
||||
|
||||
Limited quantities. Buyers of the pre-release will get the full version for free when it is ready.
|
||||
Click the image or visit: https://sellfy.com/p/um2fkx/
|
||||
|
||||
Hardware requirements
|
||||
|
||||
- 2 Gigabytes of RAM (1 Gigabyte if OCR is turned off).
|
||||
@@ -44,6 +54,8 @@ Important links
|
||||
- `Videos <https://www.youtube.com/channel/UCJOOXHP1MJ9lVA7d8ZTlHPw>`__
|
||||
|
||||
|
||||
.. |donation| image:: https://img.shields.io/badge/donation-PayPal-brightgreen
|
||||
:target: https://paypal.me/MayanEDMS
|
||||
.. |pypi| image:: http://img.shields.io/pypi/v/mayan-edms.svg
|
||||
:target: http://badge.fury.io/py/mayan-edms
|
||||
.. |builds| image:: https://gitlab.com/mayan-edms/mayan-edms/badges/master/build.svg
|
||||
|
||||
@@ -9,6 +9,6 @@ __author__ = 'Roberto Rosario'
|
||||
__author_email__ = 'roberto.rosario@mayan-edms.com'
|
||||
__description__ = 'Free Open Source Electronic Document Management System'
|
||||
__license__ = 'Apache 2.0'
|
||||
__copyright_short__ = '2011-2018 Roberto Rosario'
|
||||
__copyright_short__ = '2011 Roberto Rosario'
|
||||
__copyright__ = '{} {}'.format('Copyright', __copyright_short__)
|
||||
__website__ = 'https://www.mayan-edms.com'
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends tesseract-ocr-deu
|
||||
|
||||
$MAYAN_PIP_BIN install -r $DOCKER_ROOT/requirements-testing.txt
|
||||
$MAYAN_PIP_BIN install -r ${MAYAN_INSTALL_DIR}/requirements-testing.txt
|
||||
|
||||
$MAYAN_BIN test --mayan-apps --settings=mayan.settings.testing
|
||||
|
||||
@@ -1445,7 +1445,7 @@ sudo -u mayan \
|
||||
dialog --infobox "Preparing static files" 3 70
|
||||
sudo -u mayan \
|
||||
MAYAN_MEDIA_ROOT=$MAYAN_MEDIA_ROOT \
|
||||
$MAYAN_BIN collectstatic --noinput > /dev/null
|
||||
$MAYAN_BIN preparestatic --noinput > /dev/null
|
||||
|
||||
# Create supervisor file for gunicorn (frontend), 3 background workers, and the scheduler for periodic tasks
|
||||
cat > /etc/supervisor/conf.d/mayan.conf <<EOF
|
||||
|
||||
@@ -16,7 +16,7 @@ set -e
|
||||
: ${DATABASE_USER:=mayan}
|
||||
: ${DATABASE_NAME:=mayan}
|
||||
: ${DATABASE_PASSWORD:=mayanuserpass}
|
||||
: ${DOCKER_POSTGRES_IMAGE:=postgres:9.5}
|
||||
: ${DOCKER_POSTGRES_IMAGE:=postgres:9.6}
|
||||
: ${DOCKER_POSTGRES_CONTAINER:=mayan-edms-postgres}
|
||||
: ${DOCKER_POSTGRES_VOLUME:=/docker-volumes/mayan-edms/postgres}
|
||||
: ${DOCKER_POSTGRES_PORT:=5432}
|
||||
@@ -121,7 +121,7 @@ docker run -d \
|
||||
-e MAYAN_DATABASE_PASSWORD=$DATABASE_PASSWORD \
|
||||
-e MAYAN_DATABASE_USER=$DATABASE_USER \
|
||||
-e MAYAN_DATABASE_PORT=$DOCKER_POSTGRES_PORT \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
|
||||
-v $DOCKER_MAYAN_VOLUME:/var/lib/mayan \
|
||||
$DOCKER_MAYAN_IMAGE >/dev/null
|
||||
echo "Done"
|
||||
|
||||
@@ -161,7 +161,7 @@ priority = 998
|
||||
EOF
|
||||
|
||||
echo -e "\n -> Collecting the static files \n"
|
||||
mayan-edms.py collectstatic --noinput
|
||||
mayan-edms.py preparestatic --noinput
|
||||
|
||||
echo -e "\n -> Making the installation directory readable and writable by the webserver user \n"
|
||||
chown www-data:www-data ${INSTALLATION_DIRECTORY} -R
|
||||
|
||||
@@ -9,19 +9,21 @@ import sh
|
||||
|
||||
|
||||
APP_LIST = (
|
||||
'acls', 'appearance', 'authentication', 'cabinets', 'checkouts', 'common',
|
||||
'converter', 'django_gpg', 'document_comments', 'document_indexing',
|
||||
'document_parsing', 'document_signatures', 'document_states', 'documents',
|
||||
'dynamic_search', 'events', 'linking', 'lock_manager', 'mayan_statistics',
|
||||
'mailer', 'metadata', 'mirroring', 'motd', 'navigation', 'ocr', 'permissions',
|
||||
'rest_api', 'smart_settings', 'sources', 'storage', 'tags', 'task_manager',
|
||||
'acls', 'appearance', 'authentication', 'autoadmin', 'cabinets',
|
||||
'checkouts', 'common', 'converter', 'dashboards', 'dependencies',
|
||||
'django_gpg', 'document_comments', 'document_indexing',
|
||||
'document_parsing', 'document_signatures', 'document_states',
|
||||
'documents', 'dynamic_search', 'events', 'file_metadata', 'linking',
|
||||
'lock_manager', 'mayan_statistics', 'mailer', 'metadata', 'mirroring',
|
||||
'motd', 'navigation', 'ocr', 'permissions', 'platform', 'rest_api',
|
||||
'smart_settings', 'sources', 'storage', 'tags', 'task_manager',
|
||||
'user_management'
|
||||
)
|
||||
|
||||
LANGUAGE_LIST = (
|
||||
'ar', 'bg', 'bs_BA', 'da', 'de_DE', 'en', 'es', 'fa', 'fr', 'hu', 'id',
|
||||
'it', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI', 'tr_TR',
|
||||
'vi_VN', 'zh_CN',
|
||||
'ar', 'bg', 'bs_BA', 'cs', 'da_DK', 'de_DE', 'en', 'es', 'el', 'fa', 'fr',
|
||||
'hu', 'id', 'it', 'lv', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI',
|
||||
'tr_TR', 'vi_VN', 'zh',
|
||||
)
|
||||
|
||||
makemessages = sh.Command('django-admin.py')
|
||||
|
||||
@@ -1,164 +1,157 @@
|
||||
# vim:set ft=dockerfile:
|
||||
|
||||
####################
|
||||
# Base image start #
|
||||
####################
|
||||
####
|
||||
# BASE_IMAGE - Bare bones image with the base packages needed to run Mayan EDMS
|
||||
####
|
||||
|
||||
FROM debian:9.4-slim as BASE_IMAGE
|
||||
FROM debian:9.8-slim as BASE_IMAGE
|
||||
|
||||
MAINTAINER Roberto Rosario "roberto.rosario@mayan-edms.com"
|
||||
LABEL maintainer="Roberto Rosario roberto.rosario@mayan-edms.com"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
ENV LC_ALL C.UTF-8
|
||||
ENV PROJECT_INSTALL_DIR=/opt/mayan-edms
|
||||
ENV PYTHON_PIP=${PROJECT_INSTALL_DIR}/bin/pip
|
||||
ENV PYTHONUNBUFFERED=1 \
|
||||
LC_ALL=C.UTF-8 \
|
||||
PROJECT_INSTALL_DIR=/opt/mayan-edms
|
||||
|
||||
# Debian package caching
|
||||
ARG APT_PROXY
|
||||
# Package caching
|
||||
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
|
||||
|
||||
# Install base Ubuntu libraries
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
g++ \
|
||||
gcc \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
gnupg1 \
|
||||
graphviz \
|
||||
libffi-dev \
|
||||
libfuse2 \
|
||||
libjpeg-dev \
|
||||
libmagic1 \
|
||||
default-libmysqlclient-dev \
|
||||
libpng-dev \
|
||||
libpq-dev \
|
||||
libreoffice \
|
||||
libtiff-dev \
|
||||
poppler-utils \
|
||||
python-dev \
|
||||
python-setuptools \
|
||||
python-virtualenv \
|
||||
python-wheel \
|
||||
redis-server \
|
||||
sane-utils \
|
||||
sudo \
|
||||
supervisor \
|
||||
tesseract-ocr \
|
||||
zlib1g-dev \
|
||||
libssl-dev \
|
||||
&& \
|
||||
apt-get clean autoclean && \
|
||||
apt-get autoremove --purge -y && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
rm -f /var/cache/apt/archives/*.deb
|
||||
|
||||
# Install apt-get-install
|
||||
ADD https://raw.githubusercontent.com/guilhem/apt-get-install/master/apt-get-install /usr/bin/
|
||||
RUN chmod +x /usr/bin/apt-get-install
|
||||
|
||||
RUN adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
|
||||
|
||||
RUN set -x \
|
||||
&& if [ "${APT_PROXY}" ]; \
|
||||
then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy \
|
||||
; fi \
|
||||
# Install base OS packages to run Mayan EDMS
|
||||
&& DEBIAN_FRONTEND=noninteractive \
|
||||
apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
exiftool \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
gnupg1 \
|
||||
graphviz \
|
||||
libfuse2 \
|
||||
libmagic1 \
|
||||
libmariadbclient18 \
|
||||
libreoffice \
|
||||
libpq5 \
|
||||
poppler-utils \
|
||||
redis-server \
|
||||
sane-utils \
|
||||
sudo \
|
||||
supervisor \
|
||||
tesseract-ocr \
|
||||
# Remove make and build dependencies
|
||||
&& apt-get remove make libproxy-tools libreoffice-avmedia-backend-vlc libvlc-bin libvlc5 libvlccore9 adwaita-icon-theme gsettings-desktop-schemas libgstreamer-plugins-base1.0-0 -y \
|
||||
&& apt-get autoremove -y --purge \
|
||||
# Add mayan user
|
||||
&& adduser mayan --disabled-password --disabled-login --no-create-home --gecos "" \
|
||||
# Pillow can't find zlib or libjpeg on aarch64 (ODROID C2)
|
||||
RUN if [ "$(uname -m)" = "aarch64" ]; then \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ && \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
|
||||
; fi
|
||||
|
||||
&& if [ "$(uname -m)" = "aarch64" ]; then \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ \
|
||||
&& ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
|
||||
; fi \
|
||||
# Pillow can't find zlib or libjpeg on armv7l (ODROID HC1)
|
||||
RUN if [ "$(uname -m)" = "armv7l" ]; then \
|
||||
ln -s /usr/lib/arm-linux-gnueabihf/libz.so /usr/lib/ && \
|
||||
ln -s /usr/lib/arm-linux-gnueabihf/libjpeg.so /usr/lib/ \
|
||||
; fi
|
||||
|
||||
&& if [ "$(uname -m)" = "armv7l" ]; then \
|
||||
ln -s /usr/lib/arm-linux-gnueabihf/libz.so /usr/lib/ \
|
||||
&& ln -s /usr/lib/arm-linux-gnueabihf/libjpeg.so /usr/lib/ \
|
||||
; fi \
|
||||
# Discard data when Redis runs out of memory
|
||||
RUN echo "maxmemory-policy allkeys-lru" >> /etc/redis/redis.conf
|
||||
|
||||
&& echo "maxmemory-policy allkeys-lru" >> /etc/redis/redis.conf \
|
||||
# Disable saving the Redis database
|
||||
RUN echo "save \"\"" >> /etc/redis/redis.conf
|
||||
|
||||
echo "save \"\"" >> /etc/redis/redis.conf \
|
||||
# Only provision 1 database
|
||||
RUN echo "databases 1" >> /etc/redis/redis.conf
|
||||
&& echo "databases 1" >> /etc/redis/redis.conf
|
||||
|
||||
#####################
|
||||
# Build image start #
|
||||
#####################
|
||||
|
||||
FROM debian:9.4-slim as BUILDER_IMAGE
|
||||
####
|
||||
# BUILDER_IMAGE - This image buildS the Python package and is discarded afterwards
|
||||
####
|
||||
|
||||
ARG APT_PROXY
|
||||
# Package caching
|
||||
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
|
||||
# Reuse image
|
||||
FROM BASE_IMAGE as BUILDER_IMAGE
|
||||
|
||||
WORKDIR /code
|
||||
WORKDIR /src
|
||||
|
||||
COPY . /code
|
||||
# Copy the source files needed to build the Python package
|
||||
COPY --chown=mayan:mayan requirements /src/requirements
|
||||
COPY --chown=mayan:mayan \
|
||||
HISTORY.rst \
|
||||
LICENSE \
|
||||
MANIFEST.in \
|
||||
README.md \
|
||||
README.rst \
|
||||
setup.py \
|
||||
/src/
|
||||
|
||||
RUN apt-get update && apt-get install make python-dev python-pip -y
|
||||
COPY --chown=mayan:mayan mayan /src/mayan
|
||||
|
||||
RUN pip install -r requirements/build.txt
|
||||
# Install development packages needed to build the Python packages
|
||||
RUN DEBIAN_FRONTEND=noninteractive \
|
||||
apt-get install -y --no-install-recommends \
|
||||
default-libmysqlclient-dev \
|
||||
libffi-dev \
|
||||
libjpeg-dev \
|
||||
libpng-dev \
|
||||
libpq-dev \
|
||||
libtiff-dev \
|
||||
zlib1g-dev \
|
||||
libssl-dev \
|
||||
g++ \
|
||||
gcc \
|
||||
python-dev \
|
||||
python-virtualenv \
|
||||
&& mkdir -p "${PROJECT_INSTALL_DIR}" \
|
||||
&& chown -R mayan:mayan "${PROJECT_INSTALL_DIR}" \
|
||||
&& chown -R mayan:mayan /src
|
||||
|
||||
ENV LC_ALL C.UTF-8
|
||||
USER mayan
|
||||
RUN python -m virtualenv "${PROJECT_INSTALL_DIR}" \
|
||||
&& . "${PROJECT_INSTALL_DIR}/bin/activate" \
|
||||
&& pip install --no-cache-dir --no-use-pep517 \
|
||||
librabbitmq==1.6.1 \
|
||||
mysql-python==1.2.5 \
|
||||
psycopg2==2.7.3.2 \
|
||||
redis==2.10.6 \
|
||||
# psutil is needed by ARM builds otherwise gevent and gunicorn fail to start
|
||||
&& UNAME=`uname -m` && if [ "${UNAME#*arm}" != $UNAME ]; then \
|
||||
pip install --no-cache-dir --no-use-pep517 \
|
||||
psutil==5.6.2 \
|
||||
; fi \
|
||||
# Install the Python packages needed to build Mayan EDMS
|
||||
&& pip install --no-cache-dir --no-use-pep517 -r /src/requirements/build.txt \
|
||||
# Build Mayan EDMS
|
||||
&& python setup.py sdist \
|
||||
# Install the built Mayan EDMS package
|
||||
&& pip install --no-cache-dir --no-use-pep517 dist/mayan* \
|
||||
# Install the static content
|
||||
&& mayan-edms.py installjavascript \
|
||||
&& MAYAN_STATIC_ROOT=${PROJECT_INSTALL_DIR}/static mayan-edms.py preparestatic --link --noinput
|
||||
|
||||
RUN touch docker/Makefile
|
||||
COPY --chown=mayan:mayan requirements/testing-base.txt "${PROJECT_INSTALL_DIR}"
|
||||
|
||||
RUN make wheel
|
||||
|
||||
RUN chmod 777 dist -R
|
||||
|
||||
#####################
|
||||
# Final image start #
|
||||
#####################
|
||||
####
|
||||
# Final image - BASE_IMAGE + Mayan install directory from the builder image
|
||||
####
|
||||
|
||||
FROM BASE_IMAGE
|
||||
|
||||
RUN mkdir -p /opt
|
||||
COPY --from=BUILDER_IMAGE --chown=mayan:mayan "${PROJECT_INSTALL_DIR}/" "${PROJECT_INSTALL_DIR}/"
|
||||
|
||||
RUN python /usr/lib/python2.7/dist-packages/virtualenv.py $PROJECT_INSTALL_DIR
|
||||
USER root
|
||||
|
||||
WORKDIR $PROJECT_INSTALL_DIR
|
||||
COPY docker/rootfs /
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/dist/*.whl .
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/contrib/scripts/docker/run-tests.sh .
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/requirements/testing-base.txt requirements-testing.txt
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/docker/version .
|
||||
|
||||
# Fix ownership
|
||||
RUN chown -R mayan:mayan $PROJECT_INSTALL_DIR
|
||||
|
||||
# Install build Mayan EDMS
|
||||
RUN sudo -u mayan $PYTHON_PIP install --no-cache-dir *.whl && \
|
||||
rm *.whl
|
||||
|
||||
# Install Python clients for librabbitmq, MySQL, PostgreSQL, REDIS
|
||||
RUN sudo -u mayan $PYTHON_PIP install --no-cache-dir librabbitmq==1.6.1 mysql-python==1.2.5 psycopg2==2.7.3.2 redis==2.10.6
|
||||
|
||||
# Setup supervisor
|
||||
COPY docker/etc/supervisor/mayan.conf /etc/supervisor/conf.d
|
||||
|
||||
RUN mkdir /var/lib/mayan
|
||||
VOLUME ["/var/lib/mayan"]
|
||||
|
||||
COPY docker/entrypoint.sh /usr/local/bin/
|
||||
RUN ln -s usr/local/bin/entrypoint.sh / # backwards compat
|
||||
ENTRYPOINT ["entrypoint.sh"]
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["mayan"]
|
||||
|
||||
RUN rm /root/.cache -R
|
||||
RUN rm -rf /tmp/*
|
||||
|
||||
RUN apt-get -y autoremove --purge && apt-get -y autoclean && apt-get -y clean
|
||||
|
||||
RUN rm -rf /usr/share/man/*
|
||||
RUN rm -rf /usr/share/doc/*
|
||||
|
||||
RUN find /var/lib/apt -type f | xargs rm -f
|
||||
RUN find /var/cache -type f -exec rm -rf {} \;
|
||||
|
||||
RUN find /var/log -type f | while read f; do echo -ne '' > $f; done;
|
||||
RUN ${PROJECT_INSTALL_DIR}/bin/mayan-edms.py platformtemplate supervisord_docker > /etc/supervisor/conf.d/mayan.conf \
|
||||
&& apt-get clean autoclean \
|
||||
&& apt-get autoremove --purge -y \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -f /var/cache/apt/archives/*.deb \
|
||||
# Remove temporary files owned by root from the platformtemplate step
|
||||
&& rm /tmp/* \
|
||||
# Keep displaying log messages to stdout
|
||||
&& find /var/log -type f | while read f; do echo -ne '' > $f; done;
|
||||
|
||||
@@ -1,150 +0,0 @@
|
||||
# vim:set ft=dockerfile:
|
||||
|
||||
####################
|
||||
# Base image start #
|
||||
####################
|
||||
|
||||
FROM ubuntu:16.04 as BASE_IMAGE
|
||||
|
||||
MAINTAINER Roberto Rosario "roberto.rosario@mayan-edms.com"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
ENV LANG en_US.UTF-8
|
||||
ENV PROJECT_INSTALL_DIR=/usr/local/lib/python2.7/dist-packages/mayan
|
||||
|
||||
ARG APT_PROXY
|
||||
# Package caching
|
||||
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
|
||||
|
||||
# Install base Ubuntu libraries
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
g++ \
|
||||
gcc \
|
||||
gettext-base \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
graphviz \
|
||||
libffi-dev \
|
||||
libjpeg-dev \
|
||||
libmagic1 \
|
||||
libmysqlclient-dev \
|
||||
libpng-dev \
|
||||
libpq-dev \
|
||||
libreoffice \
|
||||
libtiff-dev \
|
||||
locales \
|
||||
netcat-openbsd \
|
||||
poppler-utils \
|
||||
python-dev \
|
||||
python-pip \
|
||||
python-setuptools \
|
||||
python-wheel \
|
||||
redis-server \
|
||||
supervisor \
|
||||
tesseract-ocr \
|
||||
zlib1g-dev \
|
||||
&& \
|
||||
apt-get clean autoclean && \
|
||||
apt-get autoremove --purge -y && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
rm -f /var/cache/apt/archives/*.deb
|
||||
|
||||
# Switch to UTF locale
|
||||
RUN echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
locale-gen en_US.UTF-8 && \
|
||||
update-locale LANG=en_US.UTF-8 && \
|
||||
export LC_ALL=en_US.UTF-8
|
||||
|
||||
# Install apt-get-install
|
||||
ADD https://raw.githubusercontent.com/guilhem/apt-get-install/master/apt-get-install /usr/bin/
|
||||
RUN chmod +x /usr/bin/apt-get-install
|
||||
|
||||
# Install Python clients for PostgreSQL, REDIS, librabbitmq
|
||||
RUN pip install psycopg2==2.7.3.2 redis==2.10.6 mysql-python==1.2.5 librabbitmq==1.6.1
|
||||
|
||||
RUN adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
|
||||
|
||||
# Pillow can't find zlib or libjpeg on aarch64
|
||||
RUN if [ "$(uname -m)" = "aarch64" ]; then \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ && \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
|
||||
; fi
|
||||
|
||||
#####################
|
||||
# Build image start #
|
||||
#####################
|
||||
|
||||
FROM python:2-alpine3.7 as BUILDER_IMAGE
|
||||
|
||||
WORKDIR /code
|
||||
|
||||
COPY . /code
|
||||
|
||||
RUN apk update && \
|
||||
apk add make
|
||||
|
||||
RUN pip install -r requirements/build.txt
|
||||
|
||||
RUN make wheel
|
||||
|
||||
RUN chmod 777 dist -R
|
||||
|
||||
#####################
|
||||
# Final image start #
|
||||
#####################
|
||||
|
||||
FROM BASE_IMAGE
|
||||
|
||||
WORKDIR /root/
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/dist/*.whl .
|
||||
|
||||
# Install build Mayan EDMS
|
||||
RUN pip install *.whl && \
|
||||
rm *.whl
|
||||
|
||||
# Setup supervisor
|
||||
#RUN mkdir /etc/supervisor.d/
|
||||
COPY docker/etc/supervisor/beat.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/gunicorn.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/redis.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/workers.conf /etc/supervisor/conf.d
|
||||
|
||||
# Create the directory for the logs
|
||||
RUN mkdir /var/log/mayan
|
||||
|
||||
# Fix ownership
|
||||
RUN chown -R mayan:mayan $PROJECT_INSTALL_DIR
|
||||
|
||||
# Allow flanker to autogenerate its PLY files
|
||||
RUN chown -R mayan:mayan /usr/local/lib/python2.7/dist-packages/flanker/
|
||||
|
||||
RUN mkdir /var/lib/mayan
|
||||
VOLUME ["/var/lib/mayan"]
|
||||
|
||||
COPY docker/entrypoint.sh /usr/local/bin/
|
||||
RUN ln -s usr/local/bin/entrypoint.sh / # backwards compat
|
||||
ENTRYPOINT ["entrypoint.sh"]
|
||||
|
||||
# Healthcheck setup
|
||||
HEALTHCHECK --interval=15s --timeout=1s --retries=20 \
|
||||
CMD curl -s -f http://localhost/authentication/login/ | grep 'form' > /dev/null || exit 1
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["mayan"]
|
||||
|
||||
RUN rm /root/.cache -R
|
||||
RUN rm -rf /tmp/*
|
||||
|
||||
RUN apt-get -y autoremove --purge && apt-get -y autoclean && apt-get -y clean
|
||||
|
||||
RUN rm -rf /usr/share/man/*
|
||||
RUN rm -rf /usr/share/doc/*
|
||||
|
||||
RUN find /var/lib/apt -type f | xargs rm -f
|
||||
RUN find /var/cache -type f -exec rm -rf {} \;
|
||||
|
||||
RUN find /var/log -type f | while read f; do echo -ne '' > $f; done;
|
||||
@@ -1,33 +1,25 @@
|
||||
APT_PROXY ?= `/sbin/ip route|awk '/docker0/ { print $$9 }'`:3142
|
||||
IMAGE_VERSION ?= `cat docker/version`
|
||||
IMAGE_VERSION ?= `cat docker/rootfs/version`
|
||||
CONSOLE_COLUMNS ?= `echo $$(tput cols)`
|
||||
CONSOLE_LINES ?= `echo $$(tput lines)`
|
||||
|
||||
docker-help:
|
||||
@echo
|
||||
@echo "**** Docker makefile ****"
|
||||
@echo "docker-build - Build a new image locally."
|
||||
@echo "docker-build-with-proxy - Build a new image locally using an APT proxy."
|
||||
@echo "docker-test-container - Build and run a test container."
|
||||
@echo "docker-test-cleanup - Delete the test container and the test volume."
|
||||
@echo "docker-test-all - Build and executed the test suite in a test container."
|
||||
@echo "docker-shell - Launch a bash instance inside a running container. Pass the container name via DOCKER_CONTAINER."
|
||||
|
||||
docker-build:
|
||||
docker-build: ## Build a new image locally.
|
||||
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile .
|
||||
|
||||
docker-build-with-proxy:
|
||||
docker-build-with-proxy: ## Build a new image locally using an APT proxy as APT_PROXY.
|
||||
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile --build-arg APT_PROXY=$(APT_PROXY) .
|
||||
|
||||
docker-shell:
|
||||
docker-shell: ## Launch a bash instance inside a running container. Pass the container name via DOCKER_CONTAINER.
|
||||
docker exec -e TERM=$(TERM) -e "COLUMNS=$(CONSOLE_COLUMNS)" -e "LINES=$(CONSOLE_LINES)" -it $(DOCKER_CONTAINER) /bin/bash
|
||||
|
||||
docker-test-container: ## Build and run a test container.
|
||||
docker-test-container: docker-build-with-proxy docker-test-cleanup
|
||||
docker run -d --name test-mayan-edms -p 80:8000 -v test-mayan_data:/var/lib/mayan mayanedms/mayanedms:$(DOCKER_VERSION)
|
||||
|
||||
docker-test-cleanup:
|
||||
docker-test-cleanup: ## Delete the test container and the test volume.
|
||||
@docker rm -f test-mayan-edms || true
|
||||
@docker volume rm test-mayan_data || true
|
||||
|
||||
docker-test-all: ## Build and executed the test suite in a test container.
|
||||
docker-test-all: docker-build-with-proxy
|
||||
docker run --rm run-tests
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Mayan EDMS is a free open source electronic document management system.
|
||||
554
docker/README.md
554
docker/README.md
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,115 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
echo "mayan: starting entrypoint.sh"
|
||||
INSTALL_FLAG=/var/lib/mayan/system/SECRET_KEY
|
||||
CONCURRENCY_ARGUMENT=--concurrency=
|
||||
export DOCKER_ROOT=/opt/mayan-edms
|
||||
|
||||
export MAYAN_DEFAULT_BROKER_URL=redis://127.0.0.1:6379/0
|
||||
export MAYAN_DEFAULT_CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
|
||||
|
||||
export MAYAN_ALLOWED_HOSTS='["*"]'
|
||||
export MAYAN_BIN=/opt/mayan-edms/bin/mayan-edms.py
|
||||
export MAYAN_BROKER_URL=${MAYAN_BROKER_URL:-${MAYAN_DEFAULT_BROKER_URL}}
|
||||
export MAYAN_CELERY_RESULT_BACKEND=${MAYAN_CELERY_RESULT_BACKEND:-${MAYAN_DEFAULT_CELERY_RESULT_BACKEND}}
|
||||
export MAYAN_INSTALL_DIR=/opt/mayan-edms
|
||||
export MAYAN_PYTHON_BIN_DIR=/opt/mayan-edms/bin/
|
||||
export MAYAN_MEDIA_ROOT=/var/lib/mayan
|
||||
export MAYAN_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE:-mayan.settings.production}
|
||||
|
||||
export MAYAN_GUNICORN_BIN=${MAYAN_PYTHON_BIN_DIR}gunicorn
|
||||
export MAYAN_GUNICORN_WORKERS=${MAYAN_GUNICORN_WORKERS:-2}
|
||||
export MAYAN_PIP_BIN=${MAYAN_PYTHON_BIN_DIR}pip
|
||||
|
||||
MAYAN_WORKER_FAST_CONCURRENCY=${MAYAN_WORKER_FAST_CONCURRENCY:-1}
|
||||
MAYAN_WORKER_MEDIUM_CONCURRENCY=${MAYAN_WORKER_MEDIUM_CONCURRENCY:-1}
|
||||
MAYAN_WORKER_SLOW_CONCURRENCY=${MAYAN_WORKER_SLOW_CONCURRENCY:-1}
|
||||
|
||||
if [ "$MAYAN_WORKER_FAST_CONCURRENCY" -eq 0 ]; then
|
||||
MAYAN_WORKER_FAST_CONCURRENCY=
|
||||
else
|
||||
MAYAN_WORKER_FAST_CONCURRENCY="${CONCURRENCY_ARGUMENT}${MAYAN_WORKER_FAST_CONCURRENCY}"
|
||||
fi
|
||||
export MAYAN_WORKER_FAST_CONCURRENCY
|
||||
|
||||
if [ "$MAYAN_WORKER_MEDIUM_CONCURRENCY" -eq 0 ]; then
|
||||
MAYAN_WORKER_MEDIUM_CONCURRENCY=
|
||||
else
|
||||
MAYAN_WORKER_MEDIUM_CONCURRENCY="${CONCURRENCY_ARGUMENT}${MAYAN_WORKER_MEDIUM_CONCURRENCY}"
|
||||
fi
|
||||
export MAYAN_WORKER_MEDIUM_CONCURRENCY
|
||||
|
||||
if [ "$MAYAN_WORKER_SLOW_CONCURRENCY" -eq 0 ]; then
|
||||
MAYAN_WORKER_SLOW_CONCURRENCY=
|
||||
else
|
||||
MAYAN_WORKER_SLOW_CONCURRENCY="${CONCURRENCY_ARGUMENT}${MAYAN_WORKER_SLOW_CONCURRENCY}"
|
||||
fi
|
||||
export MAYAN_WORKER_SLOW_CONCURRENCY
|
||||
|
||||
export CELERY_ALWAYS_EAGER=False
|
||||
export PYTHONPATH=$PYTHONPATH:$MAYAN_MEDIA_ROOT
|
||||
|
||||
chown mayan:mayan /var/lib/mayan -R
|
||||
|
||||
initialize() {
|
||||
echo "mayan: initialize()"
|
||||
su mayan -c "${MAYAN_BIN} initialsetup --force"
|
||||
su mayan -c "${MAYAN_BIN} collectstatic --noinput --clear"
|
||||
}
|
||||
|
||||
upgrade() {
|
||||
echo "mayan: upgrade()"
|
||||
su mayan -c "${MAYAN_BIN} performupgrade"
|
||||
su mayan -c "${MAYAN_BIN} collectstatic --noinput --clear"
|
||||
}
|
||||
|
||||
start() {
|
||||
echo "mayan: start()"
|
||||
rm -rf /var/run/supervisor.sock
|
||||
exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
|
||||
}
|
||||
|
||||
os_package_installs() {
|
||||
echo "mayan: os_package_installs()"
|
||||
if [ "${MAYAN_APT_INSTALLS}" ]; then
|
||||
apt-get-install $MAYAN_APT_INSTALLS
|
||||
fi
|
||||
}
|
||||
|
||||
pip_installs() {
|
||||
echo "mayan: pip_installs()"
|
||||
if [ "${MAYAN_PIP_INSTALLS}" ]; then
|
||||
$MAYAN_PIP_BIN install $MAYAN_PIP_INSTALLS
|
||||
fi
|
||||
}
|
||||
|
||||
os_package_installs || true
|
||||
pip_installs || true
|
||||
|
||||
case "$1" in
|
||||
|
||||
mayan) # Check if this is a new install, otherwise try to upgrade the existing
|
||||
# installation on subsequent starts
|
||||
if [ ! -f $INSTALL_FLAG ]; then
|
||||
initialize
|
||||
else
|
||||
upgrade
|
||||
fi
|
||||
start
|
||||
;;
|
||||
|
||||
run-tests) # Check if this is a new install, otherwise try to upgrade the existing
|
||||
# installation on subsequent starts
|
||||
if [ ! -f $INSTALL_FLAG ]; then
|
||||
initialize
|
||||
else
|
||||
upgrade
|
||||
fi
|
||||
$DOCKER_ROOT/run-tests.sh
|
||||
;;
|
||||
|
||||
*) su mayan -c "$@";
|
||||
;;
|
||||
|
||||
esac
|
||||
@@ -1,80 +0,0 @@
|
||||
[program:mayan-gunicorn]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = /bin/bash -c "${MAYAN_GUNICORN_BIN} -w ${MAYAN_GUNICORN_WORKERS} mayan.wsgi --max-requests 500 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000 --env DJANGO_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE}" --timeout 120
|
||||
redirect_stderr = true
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
user = mayan
|
||||
|
||||
[program:redis]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = /bin/bash -c "if [ ${MAYAN_BROKER_URL} == ${MAYAN_DEFAULT_BROKER_URL} ] && [ ${MAYAN_CELERY_RESULT_BACKEND} == ${MAYAN_DEFAULT_CELERY_RESULT_BACKEND} ];then /usr/bin/redis-server /etc/redis/;fi"
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
user = root
|
||||
|
||||
[program:mayan-worker-fast]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = nice -n 1 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q converter,sources_fast -n mayan-worker-fast.%%h ${MAYAN_WORKER_FAST_CONCURRENCY}"
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-worker-medium]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = nice -n 18 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h ${MAYAN_WORKER_MEDIUM_CONCURRENCY}"
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-worker-slow]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = nice -n 19 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h ${MAYAN_WORKER_SLOW_CONCURRENCY}"
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-celery-beat]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = nice -n 1 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} beat --pidfile= -l ERROR"
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
startsecs = 10
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
140
docker/rootfs/usr/local/bin/entrypoint.sh
Executable file
140
docker/rootfs/usr/local/bin/entrypoint.sh
Executable file
@@ -0,0 +1,140 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
echo "mayan: starting entrypoint.sh"
|
||||
INSTALL_FLAG=/var/lib/mayan/system/SECRET_KEY
|
||||
CONCURRENCY_ARGUMENT=--concurrency=
|
||||
|
||||
DEFAULT_USER_UID=1000
|
||||
DEFAULT_USER_GID=1000
|
||||
|
||||
MAYAN_USER_UID=${MAYAN_USER_UID:-${DEFAULT_USER_UID}}
|
||||
MAYAN_USER_GID=${MAYAN_USER_GID:-${DEFAULT_USER_GID}}
|
||||
|
||||
export MAYAN_DEFAULT_BROKER_URL=redis://127.0.0.1:6379/0
|
||||
export MAYAN_DEFAULT_CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
|
||||
|
||||
export MAYAN_ALLOWED_HOSTS='["*"]'
|
||||
export MAYAN_BIN=/opt/mayan-edms/bin/mayan-edms.py
|
||||
export MAYAN_BROKER_URL=${MAYAN_BROKER_URL:-${MAYAN_DEFAULT_BROKER_URL}}
|
||||
export MAYAN_CELERY_RESULT_BACKEND=${MAYAN_CELERY_RESULT_BACKEND:-${MAYAN_DEFAULT_CELERY_RESULT_BACKEND}}
|
||||
export MAYAN_INSTALL_DIR=/opt/mayan-edms
|
||||
export MAYAN_PYTHON_BIN_DIR=/opt/mayan-edms/bin/
|
||||
export MAYAN_MEDIA_ROOT=/var/lib/mayan
|
||||
export MAYAN_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE:-mayan.settings.production}
|
||||
|
||||
export MAYAN_GUNICORN_BIN=${MAYAN_PYTHON_BIN_DIR}gunicorn
|
||||
export MAYAN_GUNICORN_WORKERS=${MAYAN_GUNICORN_WORKERS:-2}
|
||||
export MAYAN_GUNICORN_TIMEOUT=${MAYAN_GUNICORN_TIMEOUT:-120}
|
||||
export MAYAN_PIP_BIN=${MAYAN_PYTHON_BIN_DIR}pip
|
||||
export MAYAN_STATIC_ROOT=${MAYAN_INSTALL_DIR}/static
|
||||
|
||||
MAYAN_WORKER_FAST_CONCURRENCY=${MAYAN_WORKER_FAST_CONCURRENCY:-1}
|
||||
MAYAN_WORKER_MEDIUM_CONCURRENCY=${MAYAN_WORKER_MEDIUM_CONCURRENCY:-1}
|
||||
MAYAN_WORKER_SLOW_CONCURRENCY=${MAYAN_WORKER_SLOW_CONCURRENCY:-1}
|
||||
|
||||
update_uid_gid() {
|
||||
echo "mayan: update_uid_gid()"
|
||||
groupmod mayan -g ${MAYAN_USER_GID} 2>/dev/null || true
|
||||
usermod mayan -u ${MAYAN_USER_UID} -g ${MAYAN_USER_GID} 2>/dev/null
|
||||
|
||||
if [ ${MAYAN_USER_UID} -ne ${DEFAULT_USER_UID} ] || [ ${MAYAN_USER_GID} -ne ${DEFAULT_USER_GID} ]; then
|
||||
echo "mayan: Updating file ownership. This might take a while if there are many documents."
|
||||
chown mayan:mayan ${MAYAN_INSTALL_DIR} ${MAYAN_STATIC_ROOT} ${MAYAN_MEDIA_ROOT}
|
||||
fi
|
||||
}
|
||||
|
||||
update_uid_gid
|
||||
|
||||
if [ "$MAYAN_WORKER_FAST_CONCURRENCY" -eq 0 ]; then
|
||||
MAYAN_WORKER_FAST_CONCURRENCY=
|
||||
else
|
||||
MAYAN_WORKER_FAST_CONCURRENCY="${CONCURRENCY_ARGUMENT}${MAYAN_WORKER_FAST_CONCURRENCY}"
|
||||
fi
|
||||
export MAYAN_WORKER_FAST_CONCURRENCY
|
||||
|
||||
if [ "$MAYAN_WORKER_MEDIUM_CONCURRENCY" -eq 0 ]; then
|
||||
MAYAN_WORKER_MEDIUM_CONCURRENCY=
|
||||
else
|
||||
MAYAN_WORKER_MEDIUM_CONCURRENCY="${CONCURRENCY_ARGUMENT}${MAYAN_WORKER_MEDIUM_CONCURRENCY}"
|
||||
fi
|
||||
export MAYAN_WORKER_MEDIUM_CONCURRENCY
|
||||
|
||||
if [ "$MAYAN_WORKER_SLOW_CONCURRENCY" -eq 0 ]; then
|
||||
MAYAN_WORKER_SLOW_CONCURRENCY=
|
||||
else
|
||||
MAYAN_WORKER_SLOW_CONCURRENCY="${CONCURRENCY_ARGUMENT}${MAYAN_WORKER_SLOW_CONCURRENCY}"
|
||||
fi
|
||||
export MAYAN_WORKER_SLOW_CONCURRENCY
|
||||
|
||||
export CELERY_ALWAYS_EAGER=False
|
||||
export PYTHONPATH=$PYTHONPATH:$MAYAN_MEDIA_ROOT
|
||||
|
||||
chown mayan:mayan /var/lib/mayan -R
|
||||
|
||||
apt_get_install() {
|
||||
apt-get -q update
|
||||
apt-get install -y --force-yes --no-install-recommends --auto-remove "$@"
|
||||
apt-get -q clean
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
}
|
||||
|
||||
initialize() {
|
||||
echo "mayan: initialize()"
|
||||
su mayan -c "${MAYAN_BIN} initialsetup --force --no-javascript"
|
||||
}
|
||||
|
||||
os_package_installs() {
|
||||
echo "mayan: os_package_installs()"
|
||||
if [ "${MAYAN_APT_INSTALLS}" ]; then
|
||||
DEBIAN_FRONTEND=noninteractive apt_get_install $MAYAN_APT_INSTALLS
|
||||
fi
|
||||
}
|
||||
|
||||
pip_installs() {
|
||||
echo "mayan: pip_installs()"
|
||||
if [ "${MAYAN_PIP_INSTALLS}" ]; then
|
||||
su mayan -c "${MAYAN_PIP_BIN} install $MAYAN_PIP_INSTALLS"
|
||||
fi
|
||||
}
|
||||
|
||||
start() {
|
||||
echo "mayan: start()"
|
||||
rm -rf /var/run/supervisor.sock
|
||||
exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
|
||||
}
|
||||
|
||||
upgrade() {
|
||||
echo "mayan: upgrade()"
|
||||
su mayan -c "${MAYAN_BIN} performupgrade --no-javascript"
|
||||
}
|
||||
|
||||
os_package_installs || true
|
||||
pip_installs || true
|
||||
|
||||
case "$1" in
|
||||
|
||||
mayan) # Check if this is a new install, otherwise try to upgrade the existing
|
||||
# installation on subsequent starts
|
||||
if [ ! -f $INSTALL_FLAG ]; then
|
||||
initialize
|
||||
else
|
||||
upgrade
|
||||
fi
|
||||
start
|
||||
;;
|
||||
|
||||
run-tests) # Check if this is a new install, otherwise try to upgrade the existing
|
||||
# installation on subsequent starts
|
||||
if [ ! -f $INSTALL_FLAG ]; then
|
||||
initialize
|
||||
else
|
||||
upgrade
|
||||
fi
|
||||
run-tests.sh
|
||||
;;
|
||||
|
||||
*) su mayan -c "$@";
|
||||
;;
|
||||
|
||||
esac
|
||||
10
docker/rootfs/usr/local/bin/run-tests.sh
Executable file
10
docker/rootfs/usr/local/bin/run-tests.sh
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends gcc python-dev tesseract-ocr-deu
|
||||
|
||||
su mayan -c "$MAYAN_PIP_BIN install -r ${MAYAN_INSTALL_DIR}/testing-base.txt"
|
||||
|
||||
su mayan -c "$MAYAN_BIN test --mayan-apps --settings=mayan.settings.testing"
|
||||
1
docker/rootfs/version
Executable file
1
docker/rootfs/version
Executable file
@@ -0,0 +1 @@
|
||||
3.2.7
|
||||
@@ -27,6 +27,6 @@ services:
|
||||
MAYAN_DATABASE_NAME: mayan
|
||||
MAYAN_DATABASE_PASSWORD: mayan-password
|
||||
MAYAN_DATABASE_USER: mayan
|
||||
MAYAN_DATABASE_CONN_MAX_AGE: 60
|
||||
MAYAN_DATABASE_CONN_MAX_AGE: 0
|
||||
volumes:
|
||||
- app:/var/lib/mayan
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
3.1.9
|
||||
5
docs/_static/css/custom.css
vendored
Normal file
5
docs/_static/css/custom.css
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
.menuselection {
|
||||
color: white;
|
||||
background: #2c3e50;
|
||||
padding: 3px;
|
||||
}
|
||||
@@ -26,3 +26,77 @@ endpoints are structured by resource type. Examples:
|
||||
|
||||
The API supports the HTTP verbs: **GET**, **POST**, **PUT**, **PATCH**,
|
||||
and **DELETE**.
|
||||
|
||||
|
||||
Example use
|
||||
===========
|
||||
|
||||
Install Python Requests (http://docs.python-requests.org/en/master/)::
|
||||
|
||||
pip install requests
|
||||
|
||||
Get a list of document types::
|
||||
|
||||
import requests
|
||||
|
||||
requests.get('http://127.0.0.1:8000/api/document_types/', auth=('username', 'password')).json()
|
||||
|
||||
{u'count': 1,
|
||||
u'next': None,
|
||||
u'previous': None,
|
||||
u'results': [{u'delete_time_period': 30,
|
||||
u'delete_time_unit': u'days',
|
||||
u'documents_count': 12,
|
||||
u'documents_url': u'http://127.0.0.1:8000/api/document_types/1/documents/',
|
||||
u'filenames': [],
|
||||
u'id': 1,
|
||||
u'label': u'Default',
|
||||
u'trash_time_period': None,
|
||||
u'trash_time_unit': None,
|
||||
u'url': u'http://127.0.0.1:8000/api/document_types/1/'}]}
|
||||
|
||||
Upload a new document::
|
||||
|
||||
with open('test_document.pdf', mode='rb') as
|
||||
requests.post('http://127.0.0.1:8000/api/documents/', auth=('username', 'password'), files={'file': file_object}, data={'document_type': 1}).json()
|
||||
|
||||
{u'description': u'',
|
||||
u'document_type': 1,
|
||||
u'id': 19,
|
||||
u'label': u'test_document.pdf',
|
||||
u'language': u'eng'}
|
||||
|
||||
Use API tokens to avoid sending the username and password on every request. Obtain a token by making a POST request to ``/api/auth/token/obtain/?format=json``::
|
||||
|
||||
requests.post('http://127.0.0.1:8000/api/auth/token/obtain/?format=json', data={'username': 'username', 'password': 'password'}).json()
|
||||
|
||||
{u'token': u'4ccbc35b5eb327aa82dc3b7c9747b578900f02bb'}
|
||||
|
||||
Add the API token to the request header::
|
||||
|
||||
headers = {'Authorization': 'Token 4ccbc35b5eb327aa82dc3b7c9747b578900f02bb'}
|
||||
|
||||
requests.get('http://127.0.0.1:8000/api/document_types/', headers=headers).json()
|
||||
|
||||
{u'description': u'',
|
||||
u'document_type': 1,
|
||||
u'id': 19,
|
||||
u'label': u'test_document.pdf',
|
||||
u'language': u'eng'}
|
||||
|
||||
|
||||
Use sessions to avoid having to add the headers on each request::
|
||||
|
||||
session = requests.Session()
|
||||
|
||||
headers = {'Authorization': 'Token 4ccbc35b5eb327aa82dc3b7c9747b578900f02bb'}
|
||||
|
||||
session.headers.update(headers)
|
||||
|
||||
session.get('http://127.0.0.1:8000/api/document_types/')
|
||||
|
||||
{u'description': u'',
|
||||
u'document_type': 1,
|
||||
u'id': 19,
|
||||
u'label': u'test_document.pdf',
|
||||
u'language': u'eng'}
|
||||
|
||||
@@ -59,6 +59,17 @@ App modules
|
||||
corresponding signal in the ready() method of the MayanAppConfig subclass in
|
||||
apps.py
|
||||
|
||||
- html_widgets.py
|
||||
|
||||
Classes to render an HTML widget. HTML widget are not the same as Django's
|
||||
native form widgets. Form widgets only work as part of a form field.
|
||||
HTML widgets are for use outside of forms, such as in a table cell.
|
||||
|
||||
- licenses.py
|
||||
|
||||
This module outlines the license text of the third party content used in
|
||||
the app. It could be other Python libraries, JavaScript libraries, etc.
|
||||
|
||||
- links.py
|
||||
|
||||
Defines the links to be used by the app. Import only from the navigation app
|
||||
@@ -92,6 +103,11 @@ App modules
|
||||
This module acts as a shared memory space for the other modules of the app or
|
||||
other apps.
|
||||
|
||||
- search.py
|
||||
|
||||
Search model definitions. Define which field of the app's models are
|
||||
searchable.
|
||||
|
||||
- serializers.py
|
||||
|
||||
Hold Django REST Framework serializers used by the api_views.py module.
|
||||
@@ -127,7 +143,7 @@ App modules
|
||||
|
||||
- widgets.py
|
||||
|
||||
HTML widgets go here. This should be the only place with presentation
|
||||
Custom form widgets go here. This should be the only place with presentation
|
||||
directives in the app (aside the templates).
|
||||
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ Example::
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres-new:/var/lib/postgresql/data \
|
||||
-d postgres:9.5
|
||||
-d postgres:9.6
|
||||
|
||||
docker exec -i mayan-edms-pg-new pg_restore -U mayan -d mayan < 2018-06-07_17-09-34.dump
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ Direct install
|
||||
|
||||
* Install the Python client for PostgreSQL::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir psycopg2==2.7.3.2
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 psycopg2==2.7.3.2
|
||||
|
||||
* Copy the newly created fallback config file::
|
||||
|
||||
@@ -99,5 +99,5 @@ Direct install
|
||||
MAYAN_DATABASE_NAME=mayan,
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass,
|
||||
MAYAN_DATABASE_USER=mayan,
|
||||
MAYAN_DATABASE_CONN_MAX_AGE=360,
|
||||
MAYAN_DATABASE_CONN_MAX_AGE=0,
|
||||
<...>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -248,9 +248,6 @@ Special branches:
|
||||
``releases/python``
|
||||
Used by the continuous delivery system to trigger the build and release
|
||||
of a new Python package to PyPI.
|
||||
``releases/python``
|
||||
Used by the continuous delivery system to trigger the build and release
|
||||
of a new Python package to PyPI.
|
||||
``nightly``
|
||||
Used by the continuous delivery system to trigger the build and release
|
||||
of a new Docker image based on development code to the GitLab image
|
||||
@@ -482,7 +479,7 @@ Release checklist
|
||||
|
||||
make check-readme
|
||||
|
||||
#. Bump version in ``mayan/__init__.py`` and ``docker/version``::
|
||||
#. Bump version in ``mayan/__init__.py`` and ``docker/rootfs/version``::
|
||||
|
||||
make increase-version PART=<major, minor or micro>
|
||||
|
||||
|
||||
@@ -7,16 +7,23 @@ How to use this image
|
||||
|
||||
.. _docker_install:
|
||||
|
||||
Start a Mayan EDMS image
|
||||
------------------------
|
||||
Start a Mayan EDMS Docker image
|
||||
-------------------------------
|
||||
|
||||
With Docker properly installed, proceed to download the Mayan EDMS image using the command::
|
||||
With Docker properly installed, proceed to download the Mayan EDMS image using
|
||||
the command::
|
||||
|
||||
docker pull mayanedms/mayanedms:<version>
|
||||
|
||||
Then download version 9.5 of the Docker PostgreSQL image::
|
||||
Instead of a specific version tag you may use then generic ``:latest`` tag
|
||||
to the get latest version available automatically. If you use the ``:latest``
|
||||
tag here, remember to do so in the next steps also.::
|
||||
|
||||
docker pull postgres:9.5
|
||||
docker pull mayanedms/mayanedms:latest
|
||||
|
||||
Then download version 9.6 of the Docker PostgreSQL image::
|
||||
|
||||
docker pull postgres:9.6
|
||||
|
||||
Create and run a PostgreSQL container::
|
||||
|
||||
@@ -28,7 +35,7 @@ Create and run a PostgreSQL container::
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
|
||||
-d postgres:9.5
|
||||
-d postgres:9.6
|
||||
|
||||
The PostgreSQL container will have one database named ``mayan``, with an user
|
||||
named ``mayan`` too, with a password of ``mayanuserpass``. The container will
|
||||
@@ -36,9 +43,7 @@ expose its internal 5432 port (PostgreSQL's default port) via the host's
|
||||
5432 port. The data of this container will reside on the host's
|
||||
``/docker-volumes/mayan-edms/postgres`` folder.
|
||||
|
||||
Finally create and run a Mayan EDMS container. Change <version> with the
|
||||
latest version in numeric form (example: 2.7.3) or use the ``latest``
|
||||
identifier::
|
||||
Finally create and run a Mayan EDMS container::
|
||||
|
||||
docker run -d \
|
||||
--name mayan-edms \
|
||||
@@ -49,7 +54,7 @@ identifier::
|
||||
-e MAYAN_DATABASE_NAME=mayan \
|
||||
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
|
||||
-e MAYAN_DATABASE_USER=mayan \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:<version>
|
||||
|
||||
@@ -72,6 +77,7 @@ If another web server is running on port 80 use a different port in the
|
||||
|
||||
Using a dedicated Docker network
|
||||
--------------------------------
|
||||
|
||||
Use this method to avoid having to expose PostreSQL port to the host's network
|
||||
or if you have other PostgreSQL instances but still want to use the default
|
||||
port of 5432 for this installation.
|
||||
@@ -91,7 +97,7 @@ binding (``-p 5432:5432``)::
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
|
||||
-d postgres:9.5
|
||||
-d postgres:9.6
|
||||
|
||||
Launch the Mayan EDMS container with the network option and change the
|
||||
database hostname to the PostgreSQL container name (``mayan-edms-postgres``)
|
||||
@@ -107,10 +113,11 @@ instead of the IP address of the Docker host (``172.17.0.1``)::
|
||||
-e MAYAN_DATABASE_NAME=mayan \
|
||||
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
|
||||
-e MAYAN_DATABASE_USER=mayan \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:<version>
|
||||
|
||||
|
||||
Stopping and starting the container
|
||||
-----------------------------------
|
||||
|
||||
@@ -126,6 +133,7 @@ To start the container again::
|
||||
|
||||
.. _docker_environment_variables:
|
||||
|
||||
|
||||
Environment Variables
|
||||
---------------------
|
||||
|
||||
@@ -220,6 +228,10 @@ Optional. Allows loading an alternate settings file.
|
||||
Amount in seconds to keep a database connection alive. Allow reuse of database
|
||||
connections. For more information read the pertinent Django documentation
|
||||
page: :django-docs:`Settings, CONN_MAX_AGE <ref/settings/#conn-max-age>`
|
||||
According to new information Gunicorn's microthreads don't share connections
|
||||
and will exhaust the available Postgres connections available if a number
|
||||
other than 0 is used. Reference: https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq
|
||||
and https://github.com/benoitc/gunicorn/issues/996
|
||||
|
||||
``MAYAN_GUNICORN_WORKERS``
|
||||
|
||||
@@ -252,6 +264,19 @@ category. Default is 1. Use 0 to disable hardcoded concurrency and allow the
|
||||
Celery worker to launch its default number of child processes (equal to the
|
||||
number of CPUs detected).
|
||||
|
||||
``MAYAN_USER_UID``
|
||||
|
||||
Optional. Changes the UID of the ``mayan`` user internal to the Docker
|
||||
container. Defaults to 1000.
|
||||
|
||||
``MAYAN_USER_GID``
|
||||
|
||||
Optional. Changes the GID of the ``mayan`` user internal to the Docker
|
||||
container. Defaults to 1000.
|
||||
|
||||
|
||||
.. _docker-accessing-outside-data:
|
||||
|
||||
Accessing outside data
|
||||
======================
|
||||
|
||||
@@ -263,18 +288,21 @@ on purpose. For example, to make a folder in the host accessible as a watch
|
||||
folder, add the following to the Docker command line when starting the
|
||||
container::
|
||||
|
||||
-v /opt/scanned_files:/srv/watch_folder
|
||||
-v /opt/scanned_files:/scanned_files
|
||||
|
||||
The command line would look like this::
|
||||
|
||||
docker run ... -v /opt/scanned_files:/srv/watch_folder mayanedms/mayanedms:latest
|
||||
docker run ... -v /opt/scanned_files:/scanned_files mayanedms/mayanedms:latest
|
||||
|
||||
Now create a watch folder in Mayan EDMS using the path ``/srv/watch_folder``
|
||||
Now create a watch folder in Mayan EDMS using the path ``/scanned_files``
|
||||
and the documents from the host folder ``/opt/scanned_files`` will be
|
||||
automatically available. Use the same procedure to mount host folders to be
|
||||
used as staging folderes. In this example ``/srv/watch_folder`` was as the
|
||||
container directory, but any path can be used as long as it is not an
|
||||
already existing path or a path used by any other program.
|
||||
used as staging folders. In this example ``/scanned_files`` was used as the
|
||||
container directory, but any path can be used as long as:
|
||||
|
||||
- the path not an already existing path
|
||||
- the path is not used by any other program
|
||||
- the path is a single level path
|
||||
|
||||
|
||||
Performing backups
|
||||
@@ -285,7 +313,7 @@ For the example::
|
||||
|
||||
docker run -d --name mayan-edms --restart=always -p 80:8000 \
|
||||
-v /docker-volumes/mayan:/var/lib/mayan \
|
||||
-v /opt/scanned_files:/srv/watch_folder mayanedms/mayanedms:latest
|
||||
-v /opt/scanned_files:/scanned_files mayanedms/mayanedms:latest
|
||||
|
||||
That would be the ``/docker-volumes/mayan folder``::
|
||||
|
||||
@@ -297,6 +325,7 @@ too need to be backed up using their respective procedures. A simple solution
|
||||
is to copy the entire database container volume after the container has
|
||||
been stopped.
|
||||
|
||||
|
||||
Restoring from a backup
|
||||
=======================
|
||||
|
||||
@@ -304,6 +333,7 @@ Uncompress the backup archive in the original docker volume using::
|
||||
|
||||
sudo tar -xvzf backup.tar.gz -C /
|
||||
|
||||
|
||||
Upgrading
|
||||
=========
|
||||
|
||||
@@ -333,6 +363,7 @@ Start the container again with the new image version::
|
||||
|
||||
docker run -d --name mayan-edms --restart=always -p 80:8000 -v /docker-volumes/mayan:/var/lib/mayan mayanedms/mayanedms:latest
|
||||
|
||||
|
||||
Building the image
|
||||
==================
|
||||
|
||||
@@ -348,13 +379,14 @@ Execute Docker's build command using the provided makefile::
|
||||
|
||||
make docker-build
|
||||
|
||||
Or using an apt cacher to speed up the build::
|
||||
Or using an APT cache to speed up the build::
|
||||
|
||||
make docker-build-with-proxy APT_PROXY=172.17.0.1:3142
|
||||
|
||||
Replace the IP address `172.17.0.1` with the IP address of the computer
|
||||
running the APT proxy and caching service.
|
||||
|
||||
|
||||
Customizing the image
|
||||
=====================
|
||||
|
||||
@@ -379,6 +411,7 @@ Specifies a list of Python packages to be installed via ``pip``. Packages will
|
||||
be downloaded from the Python Package Index (https://pypi.python.org) by
|
||||
default.
|
||||
|
||||
|
||||
Using Docker compose
|
||||
====================
|
||||
|
||||
|
||||
@@ -68,5 +68,21 @@ type at a given moment, but if needed, the type of a document can be changed.
|
||||
Upon changing its type, the document will lose its previous settings and
|
||||
attributes, and will inherit the settings and attributes of its new type.
|
||||
|
||||
Document types are create in the
|
||||
:menuselection:`System --> Setup --> Document types` menu.
|
||||
|
||||
Creating document types
|
||||
=======================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create document types" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Create document type`.
|
||||
#. Enter a label to be shown to users when using this document type.
|
||||
#. Optional: Enter a period of time after which documents of this type will be moved to the trash.
|
||||
#. Optional: Select the unit of time for the period after which the document will be moved to the trash.
|
||||
#. Optional: Enter a period of time after which documents moved to the trash will be permanently deleted.
|
||||
#. Optional: Select the unit of time for the period of time after which the documents moved to the trash will be permanently deleted
|
||||
#. Press :guilabel:`Submit`.
|
||||
|
||||
@@ -5,22 +5,32 @@ Index examples
|
||||
Index of document types
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
- The "Create new document indexes" permission is required for this action.
|
||||
- The "Edit document indexes" permission is required for this action, globally
|
||||
of via an ACL for a document index.
|
||||
- The "Edit document types" permission is required for this action, globally
|
||||
of via an ACL for a document type.
|
||||
|
||||
|
||||
This index will create one level for each document type in the system and place
|
||||
links to the document of each respective type.
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Indexes` menu.
|
||||
#. Create a new index using :menuselection:`Actions --> Create new`.
|
||||
#. Create a new index using :guilabel:`Actions` > :guilabel:`Create new`.
|
||||
#. Give it a label to describe it, and an internal name. The internal name is
|
||||
used when referencing this index in other parts of the system.
|
||||
#. Press the :menuselection:`Template` link of the newly created index.
|
||||
#. Select :menuselection:`New child node` to create a new level in which the
|
||||
#. Press the :guilabel:`Template` link of the newly created index.
|
||||
#. Select :guilabel:`New child node` to create a new level in which the
|
||||
following template code will be entered.
|
||||
::
|
||||
|
||||
{{ document.document_type }}
|
||||
|
||||
#. Save the template.
|
||||
#. Go to :menuselection:`Document types` and associate this index with
|
||||
#. Click on :guilabel:`Document types` and associate this index with
|
||||
existing document types in the system.
|
||||
#. Finally go to :menuselection:`Tools --> Rebuild indexes` to execute the
|
||||
index template. The rebuild process is only necessary when changes are
|
||||
@@ -101,8 +111,8 @@ Index documents not found in any cabinet
|
||||
{% if document.cabinets.count == 0 %}No Cabinets{% endif %}
|
||||
|
||||
|
||||
Index untagged documents
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Index documents not tagged
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
::
|
||||
|
||||
{% if document.tags.count == 0 %}No Tags{% endif %}
|
||||
|
||||
@@ -6,7 +6,7 @@ The list of languages choices in the language dropdown used for documents is
|
||||
based on the current ISO 639 list. This list can be quite extensive. To reduce
|
||||
the number of languages available use the setting ``DOCUMENTS_LANGUAGE_CODES``,
|
||||
and set it to a nested list of abbreviations. This setting can be found in the
|
||||
:menuselection:`System --> Setup -> Settings -> Common` menu.
|
||||
:menuselection:`System --> Setup --> Settings --> Common` menu.
|
||||
|
||||
For example, to reduce the list to just English and Spanish use
|
||||
::
|
||||
|
||||
@@ -26,3 +26,74 @@ interpret and modify the value provided by the user to a conform to a specific
|
||||
format. An example of a provided parser is the date parser which will interpret
|
||||
and correct dates provided by users regardless of the format in which they are
|
||||
entered.
|
||||
|
||||
|
||||
Creating metadata types
|
||||
=======================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new metadata types" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Metadata types` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Create new`.
|
||||
#. Provide a name to reference this metadata type in other parts of the system.
|
||||
#. Enter a label to be shown to users when using this metadata type.
|
||||
#. Optional: Enter a default value for the metadata type.
|
||||
#. Optional: Provide a comma separated list of options to restrict the data entry
|
||||
when using this metadata type.
|
||||
#. Optional: Select a validator and a parser to validate and cleanup the data
|
||||
entry when not using a predetermined list of values.
|
||||
#. Press :guilabel:`Submit`.
|
||||
|
||||
|
||||
Assigning a metadata type to a document type
|
||||
============================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
- The "Edit metadata types" permission is required for this action, globally or
|
||||
via an ACL for a metadata type.
|
||||
- Also the "Edit document type" permission
|
||||
is required, globally or via an ACL for a document type.
|
||||
|
||||
|
||||
This action can be performed in two ways.
|
||||
|
||||
Option 1: Via the metadata type view
|
||||
------------------------------------
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Metadata types` menu.
|
||||
#. Click on the button :guilabel:`Document types` of the metadata type you which
|
||||
to associate.
|
||||
#. From the list of existing document types press either:
|
||||
|
||||
- :guilabel:`None` if this metadata type will not be available for documents
|
||||
of the type.
|
||||
- :guilabel:`Optional` if this metadata type will be available and is
|
||||
optional to provide a value for documents of the type.
|
||||
- :guilabel:`Required` if this metadata type will be available and is
|
||||
required to provide a value for documents of the type.
|
||||
|
||||
#. Press :guilabel:`Save`.
|
||||
|
||||
|
||||
Option 2: Via the document type view
|
||||
------------------------------------
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. Click on the button :guilabel:`Metadata types` of the metadata type you which
|
||||
to associate.
|
||||
#. From the list of existing metadata types press either:
|
||||
|
||||
- :guilabel:`None` if this metadata type will not be available for documents
|
||||
of the type.
|
||||
- :guilabel:`Optional` if this metadata type will be available and is
|
||||
optional to provide a value for documents of the type.
|
||||
- :guilabel:`Required` if this metadata type will be available and is
|
||||
required to provide a value for documents of the type.
|
||||
|
||||
#. Press :guilabel:`Save`.
|
||||
|
||||
@@ -29,32 +29,3 @@ to use a S3 style storage for documents.
|
||||
'{access_key: <your S3 access key>, secret_key: <your S3 secret key>, bucket_name: <S3 bucket name>}'
|
||||
|
||||
5. Save and restart your Mayan EDMS installation for the setting to take effect.
|
||||
|
||||
|
||||
Storage
|
||||
=======
|
||||
Mayan EDMS stores documents in their original file format only changing the
|
||||
filename to avoid collision. For best input and output speed use a block
|
||||
based local filesystem for the ``/media`` sub folder of the path specified by
|
||||
the MEDIA_ROOT setting. For increased storage capacity use an object storage
|
||||
filesystem like S3.
|
||||
|
||||
To use a S3 compatible object storage do the following:
|
||||
|
||||
* Install the Python packages ``django-storages`` and ``boto3``:
|
||||
|
||||
* Using Python::
|
||||
|
||||
pip install django-storages boto3
|
||||
|
||||
* Using Docker::
|
||||
|
||||
-e MAYAN_PIP_INSTALLS='django-storages boto3'
|
||||
|
||||
On the Mayan EDMS user interface, go to ``System``, ``Setup``, ``Settings``,
|
||||
``Documents`` and change the following setting:
|
||||
|
||||
* ``DOCUMENTS_STORAGE_BACKEND`` to ``storages.backends.s3boto3.S3Boto3Storage``
|
||||
* ``DOCUMENTS_STORAGE_BACKEND_ARGUMENTS`` to ``'{access_key: <your access key>, secret_key: <your secret key>, bucket_name: <bucket name>}'``.
|
||||
|
||||
Restart Mayan EDMS for the changes to take effect.
|
||||
|
||||
70
docs/chapters/quick_labels.rst
Normal file
70
docs/chapters/quick_labels.rst
Normal file
@@ -0,0 +1,70 @@
|
||||
************
|
||||
Quick labels
|
||||
************
|
||||
|
||||
Quick labels are predetermined filenames that allow the quick renaming of
|
||||
documents as they are uploaded or after they have been uploaded.
|
||||
|
||||
Quick labels are added and associated to a document type.
|
||||
|
||||
Example of quick label: Invoice, Receipt from X store, Purchase order.
|
||||
|
||||
It is possible to preserve the file extension when using quick labels.
|
||||
Extensions are required for some operating system to be able to detect the
|
||||
correct file type to access the content.
|
||||
|
||||
For example if a document file is named "file0001.pdf" and the quick label
|
||||
"Receipt from X store" is applied, the resulting document label will be
|
||||
"Receipt from X store.pdf".
|
||||
|
||||
|
||||
Creating quick labels
|
||||
=====================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Edit document types" permission is required for this action, either
|
||||
globally or via an ACL for a document type.
|
||||
|
||||
|
||||
Since quick labels are associated with document types, creating quick labels
|
||||
must be done from the document type view.
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. In the document type list, click on the :guilabel:`Quick labels` button of
|
||||
the document type for which you wish to create a quick label.
|
||||
#. In the view titled "Quick labels for document type: <your document type>",
|
||||
from the :guilabel:`Actions` dropdown select :guilabel:`Add quick label to document type`.
|
||||
#. At the quick label creation form enter the desired label and press :guilabel:`Save`.
|
||||
|
||||
|
||||
Using quick labels during upload
|
||||
================================
|
||||
|
||||
#. Use the new document upload wizard from :menuselection:`Documents --> New document`.
|
||||
#. Select a document type and navigate to the penultimate step, where you have
|
||||
the option to drag and drop files to upload.
|
||||
#. Select a an option from the :guilabel:`Quick document rename` dropdown.
|
||||
#. Optionally select the :guilabel:`Preserve extension` checkbox to keep the file
|
||||
extension.
|
||||
#. Upload your documents.
|
||||
|
||||
|
||||
Using quick labels for existing documents
|
||||
=========================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Edit document properties" permission is required for this action, either
|
||||
globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the document preview view of the document to rename. Make sure
|
||||
quick labels for the document type of the document select have been created.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Edit Properties`.
|
||||
#. Select a an option from the :guilabel:`Quick document rename` dropdown.
|
||||
#. Optionally select the :guilabel:`Preserve extension` checkbox to keep the file
|
||||
extension.
|
||||
#. Press :guilabel:`Save` to rename the document.
|
||||
@@ -6,15 +6,19 @@ The default installation method fits most use cases. If you use case requires
|
||||
more speed or capacity here are some suggestion that can help you improve the
|
||||
performance of your installation.
|
||||
|
||||
|
||||
Change the database manager
|
||||
===========================
|
||||
|
||||
Use PostgreSQL or MySQL as the database manager.
|
||||
Tweak the memory setting of the database manager to increase memory allocation.
|
||||
More PostgreSQL specific examples are available in their wiki page:
|
||||
https://wiki.postgresql.org/wiki/Performance_Optimization
|
||||
|
||||
|
||||
Increase the number of Gunicorn workers
|
||||
=======================================
|
||||
|
||||
The Gunicorn workers process HTTP requests and affect the speed at which the
|
||||
website responds.
|
||||
|
||||
@@ -33,6 +37,7 @@ And increase the value of the ``-w 2`` argument. This line is found in the
|
||||
|
||||
Background task processing
|
||||
==========================
|
||||
|
||||
The Celery workers are system processes that take care of the background
|
||||
tasks requested by the frontend interactions like document image rendering
|
||||
and periodic tasks like OCR. There are several dozen tasks defined in the code.
|
||||
@@ -45,37 +50,9 @@ low volume, medium duration tasks. It is not advisable to have the same
|
||||
worker processing OCR to process image rendering too. If the worker is
|
||||
processing several OCR tasks it will not be able to provide fast images
|
||||
when an user is browsing the user interface. This is why by default the
|
||||
queues are split into 3 workers: fast, medium, and slow.
|
||||
queues are split into 3 workers: fast, medium, and slow. Each worker will handle
|
||||
queues based on the latency required by each queue group.
|
||||
|
||||
The fast worker handles the queues:
|
||||
|
||||
* converter: Handles document page rendering
|
||||
* sources_fast: Does staging file image rendering
|
||||
|
||||
The medium worker handles the queues:
|
||||
|
||||
* checkouts_periodic: Scheduled tasks that check if a document's checkout
|
||||
period has expired
|
||||
* documents_periodic:
|
||||
* indexing: Does reindexing of documents in the background when their
|
||||
properties change
|
||||
* metadata:
|
||||
* sources:
|
||||
* sources_periodic: Checking email accounts and watch folders for new
|
||||
documents.
|
||||
* uploads: Processes files to turn the into Mayan documents. Processing
|
||||
encompasses MIME type detection, page count detection.
|
||||
* documents:
|
||||
|
||||
The slow worker handles the queues:
|
||||
|
||||
* mailing: Does the actual sending of documents via email as requested by
|
||||
users via the mailing profiles
|
||||
* tools: Executes in the background maintenance requests from the options
|
||||
in the tools menu
|
||||
* statistics: Recalculates statistics and charts
|
||||
* parsing: Parses documents to extract actual text content
|
||||
* ocr: Performs OCR to transcribe page images to text
|
||||
|
||||
Optimizations
|
||||
-------------
|
||||
@@ -88,15 +65,16 @@ Optimizations
|
||||
* By default each worker process uses 1 thread. You can increase the thread
|
||||
count of each worker process with the Docker environment options:
|
||||
|
||||
* MAYAN_WORKER_FAST_CONCURRENCY
|
||||
* MAYAN_WORKER_MEDIUM_CONCURRENCY
|
||||
* MAYAN_WORKER_SLOW_CONCURRENCY
|
||||
* ``MAYAN_WORKER_FAST_CONCURRENCY``
|
||||
* ``MAYAN_WORKER_MEDIUM_CONCURRENCY``
|
||||
* ``MAYAN_WORKER_SLOW_CONCURRENCY``
|
||||
|
||||
* If using direct deployment, increase the value of the --concurrency=1
|
||||
* If using direct deployment, increase the value of the ``--concurrency=1``
|
||||
argument of each worker in the supervisor file. You can also remove this
|
||||
argument and let the Celery algorithm choose the number of threads to
|
||||
launch. Usually this defaults to the number of CPU cores + 1.
|
||||
|
||||
|
||||
Change the message broker
|
||||
=========================
|
||||
Messages are the method of communication between front end interactive code
|
||||
@@ -127,11 +105,13 @@ calculation, these are stored for a while so that whoever requested the
|
||||
background task, is able retrieve the result. These results are stored in the
|
||||
result storage. By default a Redis server is launched inside the Mayan EDMS
|
||||
container. You can launch a separate Docker Redis container and tell the Mayan
|
||||
EDMS container to use this via the MAYAN_CELERY_RESULT_BACKEND environment
|
||||
EDMS container to use this via the ``MAYAN_CELERY_RESULT_BACKEND`` environment
|
||||
variable. The format of this variable is explained here: http://docs.celeryproject.org/en/3.1/configuration.html#celery-result-backend
|
||||
|
||||
|
||||
Deployment type
|
||||
===============
|
||||
|
||||
Docker provides a faster deployment and the overhead is not high on modern
|
||||
systems. It is however memory and CPU limited by default and you need to
|
||||
increase this limits. The settings to change the container resource limits
|
||||
@@ -140,8 +120,10 @@ are here: https://docs.docker.com/config/containers/resource_constraints/#limit-
|
||||
For the best performance possible use the advanced deployment method on a
|
||||
host dedicated to serving only Mayan EDMS.
|
||||
|
||||
|
||||
Storage
|
||||
=======
|
||||
|
||||
For best input and output speed use a block based local filesystem on an
|
||||
SSD drive for the ``/media`` sub folder. The location of the ``/media`` folder
|
||||
will be specified by the ``MEDIA_ROOT`` setting.
|
||||
@@ -149,8 +131,10 @@ will be specified by the ``MEDIA_ROOT`` setting.
|
||||
If capacity is your bottom line, switch to an
|
||||
:doc:`object storage <../chapters/object_storage>` system.
|
||||
|
||||
|
||||
Use additional hosts
|
||||
====================
|
||||
|
||||
When one host is not enough you can use multiple hosts and share the load.
|
||||
Make sure that all hosts share the ``/media`` folder as specified by the
|
||||
``MEDIA_ROOT`` setting, also the database, the broker, and the result storage.
|
||||
|
||||
@@ -11,6 +11,7 @@ signatures sections of a document.
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
|
||||
orientation = portrait
|
||||
span_width = 240;
|
||||
|
||||
|
||||
@@ -15,7 +15,8 @@ The current document sources supported are:
|
||||
- IMAP email - Same as the ``POP3`` email source but for email accounts using
|
||||
the ``IMAP`` protocol.
|
||||
- Watch folder - A filesystem folder that is scanned periodically for files.
|
||||
Any file in the watch folder is automatically uploaded.
|
||||
Any file in the watch folder is automatically uploaded. When the upload for a
|
||||
file is completed, the file is removed from source folder.
|
||||
- Staging folder - Folder where networked attached scanned can save image
|
||||
files. The files in these staging folders are scanned and a preview is
|
||||
generated to help the process of upload. Staging folders and Watch folders
|
||||
@@ -51,7 +52,29 @@ The current document sources supported are:
|
||||
web -> manual;
|
||||
}
|
||||
|
||||
Document source can be configure to allow document bundles to uploaded as
|
||||
Document sources can be configure to allow document bundles to uploaded as
|
||||
compressed files which are decompressed and their content uploaded as separate
|
||||
documents. This feature is useful when migrating from another document
|
||||
manager system.
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
If you deployed a Mayan EDMS Docker container and want to use watched folders
|
||||
or staging folder, refer to the Docker chapter :ref:`docker-accessing-outside-data`.
|
||||
|
||||
|
||||
Creating new sources
|
||||
====================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new document sources" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Sources` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select the new type of source to create.
|
||||
#. Each source type will have different fields to customize its behavior. Enter
|
||||
the required information in each field based on the help text provided.
|
||||
#. Press :guilabel:`Save`.
|
||||
|
||||
@@ -5,10 +5,6 @@ Tags are color coded properties that can be attached or removed from documents.
|
||||
Tags allow giving documents a binary property. Documents can also be tagged
|
||||
with more than one tag.
|
||||
|
||||
Tags are created from the :menuselection:`Tags --> Create` menu.
|
||||
|
||||
To view all created tags use the :menuselection:`Tags --> All` menu.
|
||||
|
||||
Once tagged, documents can be searched by their tags. It is also possible to
|
||||
show all the documents tagged with a particular
|
||||
tag via the **Documents** link of each tag.
|
||||
@@ -21,3 +17,30 @@ more tags to the document and another to remove tags from the document.
|
||||
It is also possible to tag documents in bulk by selecting several documents
|
||||
from any view that displays a list documents and selecting the **Attach tag**
|
||||
or **Remove tags** from the dropdown menu.
|
||||
|
||||
|
||||
Creating tags
|
||||
=============
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new tags" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`Tags --> Create` menu.
|
||||
#. Enter a label to identify the tag.
|
||||
#. Select a color for the tag.
|
||||
#. Press :guilabel:`Submit`.
|
||||
|
||||
|
||||
View all tags
|
||||
=============
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "View tags" permission is required for this action, globally or via an
|
||||
ACL for a tag.
|
||||
|
||||
#. Go to the :menuselection:`Tags --> All` menu.
|
||||
|
||||
@@ -46,3 +46,35 @@ There is no limit to the number of versions a document can have.
|
||||
|
||||
By default, the last version will be showed when working with the document
|
||||
but any of the versions can be inspected and viewed.
|
||||
|
||||
|
||||
View a document version list
|
||||
============================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "View documents' versions list" permission is required for this action,
|
||||
either globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the select document's preview view.
|
||||
#. Click on the sibebar's :guilabel:`Versions` button.
|
||||
|
||||
|
||||
Uploading a new document version
|
||||
================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new document versions" permission is required for this action,
|
||||
either globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the select document's versions list view.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Upload new version`.
|
||||
#. Optionally type a comment explaining the changes in the new version.
|
||||
#. Press the :guilabel:`Browse` button and select a new file.
|
||||
#. Press :guilabel:`Save` upload the new version.
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Workflows
|
||||
Introduction
|
||||
============
|
||||
|
||||
Workflows provide a structure method for storing a sequence of states over
|
||||
Workflows provide a structured method for storing a sequence of states over
|
||||
which the a document will progress. Workflows keep track how a document has
|
||||
been processed so far.
|
||||
|
||||
@@ -20,6 +20,36 @@ provide and order for the sequence of possible states changes.
|
||||
Transitions can be executed manually by users if they have the required access
|
||||
level as configure by the system administrator.
|
||||
|
||||
.. blockdiag::
|
||||
:caption: Example workflow. Circles represent states, rectangles represent transitions.
|
||||
|
||||
span_width = 30;
|
||||
|
||||
submitted [shape = circle, width = 60, height = 60];
|
||||
approved [shape = circle, width = 60, height = 60];
|
||||
rejected [shape = circle, width = 60, height = 60];
|
||||
archived [shape = circle, width = 60, height = 60];
|
||||
|
||||
approve [label = approve];
|
||||
reject [label = reject];
|
||||
reopen [label = "re-open"];
|
||||
|
||||
|
||||
submitted -> approve -> approved;
|
||||
approved -> archived;
|
||||
submitted -> reject -> rejected;
|
||||
rejected -> archived;
|
||||
archived -> reopen -> submitted;
|
||||
|
||||
|
||||
|
||||
Workflows in Mayan EDMS are implemented as finite state machines
|
||||
(https://en.wikipedia.org/wiki/Finite-state_machine).
|
||||
|
||||
Workflows are mainly used to represent business processes. But they can also be
|
||||
used an automation system to customized Mayan EDMS and have it perform some
|
||||
tasks automatically.
|
||||
|
||||
|
||||
Automation
|
||||
==========
|
||||
@@ -66,26 +96,18 @@ Implementation
|
||||
==============
|
||||
|
||||
Internally, workflows are implemented as a finite state machines
|
||||
(https://en.wikipedia.org/wiki/Finite-state_machine). And have the limitation
|
||||
that only one state can be the current active state for a workflow being
|
||||
executed. The other limitation of the current implementation is that every
|
||||
workflow needs at least one state marked as the initial state. These limitations
|
||||
are the result of a compromised in the design between flexibility and ease of
|
||||
use.
|
||||
(https://en.wikipedia.org/wiki/Finite-state_machine). To make them simpler to
|
||||
use, workflow have been designed so that only one state can be the current
|
||||
active state for a workflow being executed. Another design decision is that
|
||||
every workflow needs at least one state marked as the initial state.
|
||||
|
||||
|
||||
Visualizations
|
||||
==============
|
||||
|
||||
The graphical representation of a workflow (or a finite state machine style
|
||||
in Mayan EDMS's case) is similar to a flowchart. The states are represented
|
||||
with circles. The transitions are represented with arrows. Circle with a
|
||||
double border represent the initial state of the workflow.
|
||||
The graphical representation of a workflow is similar to a flowchart. The
|
||||
states are represented with circles. The transitions are represented with
|
||||
arrows. Circle with a double border represent the initial state of the workflow.
|
||||
|
||||
To view the graphical representations of workflow use **Preview** button of
|
||||
the workflow in the setup view.
|
||||
|
||||
|
||||
|
||||
We are working now on workflow transition trigger filters to have
|
||||
the trigger move the state of the workflow on certain conditions. For example: Attach a tag if there is a specific word found in the OCR text.
|
||||
|
||||
32
docs/conf.py
32
docs/conf.py
@@ -22,7 +22,9 @@ import mayan
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext")))
|
||||
sys.path.append(
|
||||
os.path.abspath(os.path.join(os.path.dirname(__file__), '_ext'))
|
||||
)
|
||||
|
||||
# -- General configuration -----------------------------------------------------
|
||||
|
||||
@@ -34,12 +36,13 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext"))
|
||||
#extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode']
|
||||
#extensions = ["djangodocs", "sphinx.ext.intersphinx"]
|
||||
extensions = [
|
||||
'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag', 'sphinxcontrib.spelling'
|
||||
'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag',
|
||||
'sphinxcontrib.spelling'
|
||||
]
|
||||
|
||||
blockdiag_antialias = True
|
||||
blockdiag_html_image_format = "SVG"
|
||||
blockdiag_latex_image_format = "PDF"
|
||||
blockdiag_html_image_format = 'SVG'
|
||||
blockdiag_latex_image_format = 'PDF'
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
@@ -106,12 +109,14 @@ pygments_style = 'sphinx'
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = 'classic'
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#html_theme_options = {}
|
||||
html_theme_options = {
|
||||
'analytics_id': 'UA-52965619-6',
|
||||
}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
#html_theme_path = []
|
||||
@@ -139,7 +144,7 @@ html_static_path = ['_static']
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
#html_last_updated_fmt = '%b %d, %Y'
|
||||
html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
@@ -162,7 +167,7 @@ html_static_path = ['_static']
|
||||
#html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#html_show_sourcelink = True
|
||||
html_show_sourcelink = False
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#html_show_sphinx = True
|
||||
@@ -181,8 +186,6 @@ html_static_path = ['_static']
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'MayanEDMSdoc'
|
||||
|
||||
html_show_sourcelink = False
|
||||
|
||||
html_show_sphinx = False
|
||||
|
||||
# -- Options for LaTeX output --------------------------------------------------
|
||||
@@ -233,8 +236,6 @@ man_pages = [
|
||||
[mayan.__author__], 1)
|
||||
]
|
||||
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
|
||||
# -- External links --
|
||||
extlinks = {
|
||||
'django-docs': (
|
||||
@@ -242,6 +243,9 @@ extlinks = {
|
||||
mayan.__django_version__
|
||||
), 'Django documentation section: '
|
||||
),
|
||||
'forum-topic': (
|
||||
'https://forum.mayan-edms.com/viewtopic.php?t=%s', 'Forum topic #'
|
||||
),
|
||||
'github-issue': (
|
||||
'https://github.com/mayan-edms/mayan-edms/issues/%s', 'GitHub issue #'
|
||||
),
|
||||
@@ -249,3 +253,7 @@ extlinks = {
|
||||
'https://gitlab.com/mayan-edms/mayan-edms/issues/%s', 'GitLab issue #'
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_stylesheet('css/custom.css')
|
||||
|
||||
@@ -21,14 +21,17 @@ repository for electronic documents.
|
||||
topics/installation
|
||||
releases/index
|
||||
topics/getting_started
|
||||
topics/adding_documents
|
||||
topics/access_control
|
||||
topics/categorization
|
||||
topics/collaboration
|
||||
topics/settings
|
||||
topics/storage
|
||||
topics/integration
|
||||
topics/docker
|
||||
topics/advanced
|
||||
topics/administration
|
||||
topics/troubleshooting
|
||||
topics/development
|
||||
topics/faq
|
||||
topics/license
|
||||
|
||||
@@ -31,9 +31,9 @@ for Mayan EDMS. Most MERCs will be Feature MERCs.
|
||||
2. An **Informational** MERC describes a Mayan EDMS design issue, or
|
||||
provides general guidelines or information to the Mayan EDMS community,
|
||||
but does not propose a new feature. Informational MERCs do not
|
||||
necessarily represent a community consensus or
|
||||
recommendation, so users and implementers are free to ignore
|
||||
Informational MERCs or follow their advice.
|
||||
necessarily represent a community consensus or recommendation, so users
|
||||
and implementers are free to ignore Informational MERCs or follow their
|
||||
advice.
|
||||
|
||||
3. A **Process** MERC describes a process surrounding Mayan EDMS, or
|
||||
proposes a change to (or an event in) a process. Process MERCs are
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=====================
|
||||
====================
|
||||
MERC 2: Test writing
|
||||
=====================
|
||||
====================
|
||||
|
||||
:MERC: 2
|
||||
:Author: Michael Price
|
||||
|
||||
149
docs/mercs/0005-explicit-arguments.rst
Normal file
149
docs/mercs/0005-explicit-arguments.rst
Normal file
@@ -0,0 +1,149 @@
|
||||
==========================
|
||||
MERC 5: Explicit arguments
|
||||
==========================
|
||||
|
||||
:MERC: 5
|
||||
:Author: Roberto Rosario
|
||||
:Status: Accepted
|
||||
:Type: Feature
|
||||
:Created: 2018-12-30
|
||||
:Last-Modified: 2018-12-31
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes the adoption of a new methodology when performing calls.
|
||||
It seeks to reduce the use of positional arguments in favor of keyword
|
||||
arguments in as many places as possible.
|
||||
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
As the project grows, legibility of code becomes more important. Keyword
|
||||
argument help document the use of services, classes and functions. Refactors
|
||||
that affect the interface of services are also easier to find and update and
|
||||
fix. Positional argument can cause a call to continue working as long as the
|
||||
datatype of the argument remains the same. Usage of keyword arguments will
|
||||
automatically raise and error that will prevent such situations. Keyword
|
||||
argument further eliminate the relevance of position or the arguments, and
|
||||
the arguments can be sorted alphabetically for easier visual scanning or by
|
||||
semantic significance improving code readability.
|
||||
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
Adoption of this MERC will require an audit of existing calls and the use
|
||||
of the method proposed for new calls. Every call regardless of the type or
|
||||
origin of the source callable will name each argument used. By type it is
|
||||
meant: classes, functions, methods. Origin means: local from the project,
|
||||
from the framework, third party libraries or the standard library.
|
||||
|
||||
|
||||
Backwards Compatibility
|
||||
=======================
|
||||
|
||||
No backwards compatibility issues are expected. New errors arising from the use
|
||||
if keyword arguments could be interpreted as existing latent issues that
|
||||
have not been uncovered.
|
||||
|
||||
|
||||
Reference Implementation
|
||||
========================
|
||||
|
||||
Example:
|
||||
|
||||
Before:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from mayan.apps.common.classes import Template
|
||||
|
||||
Template(
|
||||
'menu_main', 'appearance/menu_main.html'
|
||||
)
|
||||
|
||||
|
||||
After:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from mayan.apps.common.classes import Template
|
||||
|
||||
Template(
|
||||
name='menu_main', template_name='appearance/menu_main.html'
|
||||
)
|
||||
|
||||
|
||||
When calls use a mixture or positional and keyword arguments, the keywords
|
||||
arguments can only be found after the positional arguments. Complete use
|
||||
of keyword arguments allow the reposition of arguments for semantic
|
||||
purposes.
|
||||
|
||||
Example:
|
||||
|
||||
Before:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from django.conf.urls import url
|
||||
|
||||
from .views import AboutView, HomeView, RootView
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', RootView.as_view(), name='root'),
|
||||
url(r'^home/$', HomeView.as_view(), name='home'),
|
||||
url(r'^about/$', AboutView.as_view(), name='about_view'),
|
||||
]
|
||||
|
||||
|
||||
After:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from django.conf.urls import url
|
||||
|
||||
from .views import AboutView, HomeView, RootView
|
||||
|
||||
urlpatterns = [
|
||||
url(regex=r'^$', name='root', view=RootView.as_view()),
|
||||
url(regex=r'^home/$', name='home', view=HomeView.as_view()),
|
||||
url(regex=r'^about/$', name='about_view', view=AboutView.as_view()),
|
||||
]
|
||||
|
||||
|
||||
Keyword arguments should also be used for callables that pass those to others
|
||||
down the line like Django's ``reverse`` function. Any change to the name of
|
||||
the ``pk`` URL parameter will raise an exception in this code alerting to
|
||||
any possible incompatible use.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse(
|
||||
viewname='documents:document_preview', kwargs={'pk': self.pk}
|
||||
)
|
||||
|
||||
|
||||
This becomes even more important when multiple URL parameters are used. Since
|
||||
the API documentation is auto generated from the code itself, it would make
|
||||
sense to rename the first URL parameter from ``pk`` to ``document_pk``. Such
|
||||
change will cause all address to view resolutions to break forcing their
|
||||
update and allowing all consumers' interface usage to remain synchronized to the
|
||||
callable's interface.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
url(
|
||||
regex=r'^documents/(?P<pk>[0-9]+)/versions/(?P<document_version_pk>[0-9]+)/pages/(?P<document_page_pk>[0-9]+)/image/$',
|
||||
name='documentpage-image', view=APIDocumentPageImageView.as_view()
|
||||
),
|
||||
81
docs/mercs/0006-lower-information-disclose.rst
Normal file
81
docs/mercs/0006-lower-information-disclose.rst
Normal file
@@ -0,0 +1,81 @@
|
||||
==================================
|
||||
MERC 6: Lower information disclose
|
||||
==================================
|
||||
|
||||
:MERC: 6
|
||||
:Author: Michael Price
|
||||
:Status: Accepted
|
||||
:Type: Feature
|
||||
:Created: 2018-12-30
|
||||
:Last-Modified: 2018-12-31
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes the use of errors that don't disclose the existence of a
|
||||
resource in the event that the requester doesn't have the required credentials.
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
When an user tries to perform an action like opening a view to a document for
|
||||
which the required permission is missing, a permission required or access
|
||||
denied error is presented. This is semantically correct, but from the stand
|
||||
point of security it is still failing because it is letting the user know
|
||||
that such document exists in the first place. This MERC proposes changing the
|
||||
error message for existing resource to one that doesn't divulge any information
|
||||
to unauthorized parties, like "Not Found".
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
Out of the 4 basic CRUD operations, Read, Update and Delete should return an
|
||||
HTTP 404 error instead of an HTTP 403 error. Only the Create operation will
|
||||
continue returning the current HTTP 403 error, unless it is creating a
|
||||
new resource that is related to an existing resource.
|
||||
|
||||
Since most view use the internal custom CRUD classes making a change to the
|
||||
``ObjectPermissionCheckMixin`` class to raise an HTTP 404 on object access
|
||||
failure will fulfill the proposal of this MERC.
|
||||
|
||||
Adding the ``object_permission_raise_404`` class attribute and setting it
|
||||
to default to False will allow fulfilling the goal of this MERC while
|
||||
keeping the existing functionality intact.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class ObjectPermissionCheckMixin(object):
|
||||
"""
|
||||
If object_permission_raise_404 is True an HTTP 404 error will be raised
|
||||
instead of the normal 403.
|
||||
"""
|
||||
object_permission = None
|
||||
object_permission_raise_404 = False
|
||||
|
||||
def get_permission_object(self):
|
||||
return self.get_object()
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if self.object_permission:
|
||||
try:
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=self.object_permission, user=request.user,
|
||||
obj=self.get_permission_object(),
|
||||
related=getattr(self, 'object_permission_related', None)
|
||||
)
|
||||
except PermissionDenied:
|
||||
if self.object_permission_raise_404:
|
||||
raise Http404
|
||||
else:
|
||||
raise
|
||||
|
||||
return super(
|
||||
ObjectPermissionCheckMixin, self
|
||||
).dispatch(request, *args, **kwargs)
|
||||
@@ -20,6 +20,8 @@ Accepted
|
||||
../mercs/0001-merc-process
|
||||
../mercs/0002-test-writing
|
||||
../mercs/0003-using-javascript-libraries
|
||||
../mercs/0005-explicit-arguments
|
||||
../mercs/0006-lower-information-disclose
|
||||
|
||||
Draft
|
||||
-----
|
||||
@@ -49,3 +51,5 @@ Feature
|
||||
|
||||
../mercs/0002-test-writing
|
||||
../mercs/0003-using-javascript-libraries
|
||||
../mercs/0005-explicit-arguments
|
||||
../mercs/0006-lower-information-disclose
|
||||
|
||||
@@ -63,5 +63,5 @@ Changes needed:
|
||||
the Role model's permissions many to many field.
|
||||
4. Update the ``AccessControlList`` models roles field to point to the group
|
||||
models.
|
||||
5. Update the role checks in the ``check_access`` and ``filter_by_access``
|
||||
5. Update the role checks in the ``check_access`` and ``restrict_queryset``
|
||||
``AccessControlList`` model manager methods.
|
||||
|
||||
@@ -17,11 +17,11 @@ Version 0.11
|
||||
* Added a view to delete the document image cache, useful when switching
|
||||
converter backends or doing diagnostics.
|
||||
* Added South to the requirements.
|
||||
* Merged documents' filename and extension database fiels into a single
|
||||
* Merged documents' filename and extension database fields into a single
|
||||
filename field, filename are store as uploaded not manipulation is done
|
||||
Users with existing data must install South and run the appropiate
|
||||
Users with existing data must install South and run the appropriate
|
||||
migrate commands::
|
||||
|
||||
|
||||
$ pip install -r requirements/production.txt
|
||||
$ ./manager syncdb
|
||||
$ ./manage.py migrate documents 0001 --fake
|
||||
@@ -30,5 +30,5 @@ Version 0.11
|
||||
* Added new office document mimetype
|
||||
* application/vnd.ms-office
|
||||
* Fixed documents not saving the file encoding
|
||||
* Removed extra slash in ajax-loader.gif URL fixes #15, thanks to
|
||||
* Removed extra slash in ajax-loader.gif URL fixes #15, thanks to
|
||||
IHLeanne for finding this one
|
||||
|
||||
188
docs/releases/3.1.10.rst
Normal file
188
docs/releases/3.1.10.rst
Normal file
@@ -0,0 +1,188 @@
|
||||
Version 3.1.10
|
||||
==============
|
||||
|
||||
Released: April 04, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
Test improvements
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
A number of test improvements were backported from the development branch. These
|
||||
include a mixin to assign random primary keys to the test objects. Normally
|
||||
primary keys are sequential and their predictability can hide edge cases that
|
||||
would normally only manifest in production. The tests case code was also split
|
||||
into smaller mixin units separating them by purpose. All code to perform HTTP
|
||||
requests now resides in the ``ClientMethodsTestCaseMixin``. Changes in the
|
||||
``ContentTypeCheckTestCaseMixin`` were added to enable this mixin for the API views
|
||||
in a future minor version. The test view code was moved into its own mixin
|
||||
called ``TestViewTestCaseMixin``. This mixin allows creating dynamic views to test
|
||||
object and link resolution among other things. The API base test case class is
|
||||
now part of the same class hierarchy, this means that the API test code will
|
||||
now behave the same and will benefit from all improvements in the base test case
|
||||
classes. Some indexing tests were failing randomly. This was caused by the way
|
||||
the test were built and not because of faulty code. The tests were updated and
|
||||
now operate as expected. While there is no official support for installing
|
||||
Mayan EDMS as a sub URL updates to the ``TestViewTestCaseMixin`` will allow it to
|
||||
execute with custom ``ROOT_URLCONF`` configurations. Further work and feedback is
|
||||
needed to officially support this installation method.
|
||||
|
||||
|
||||
Fixes
|
||||
^^^^^
|
||||
|
||||
The advanced search API endpoint was fixed and is now usable. Tests for all
|
||||
the issues fixed were added to avoid future regressions. A fix was applied
|
||||
to the compressed class that caused compressed files uploads to fail from the
|
||||
web form.
|
||||
|
||||
Docker
|
||||
^^^^^^
|
||||
|
||||
Updates were added to the Docker image that allow it to build on armv7l
|
||||
platforms like the RasperryPi, Odroid XU4, and Odroid HC2. This doesn't imply
|
||||
official support for these platforms. Further experimentation and optimization
|
||||
is needed and this changed will now allow users to build the image and provide
|
||||
feedback in an easier manner.
|
||||
|
||||
|
||||
Installation
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The installation process has been updated to work around the Python pip
|
||||
issue #6197 (https://github.com/pypa/pip/issues/6197).
|
||||
|
||||
|
||||
User interface
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Improvements in the AJAX menu rendering were conflicting with an old method
|
||||
of refreshing the unread notification counter badge. This conflict would cause
|
||||
the unread notification counter badge to blink and/or disappear. The older
|
||||
badge refresh method was removed and improvements to the menu rendering from
|
||||
the development branch were backported to support displaying link badges from
|
||||
the templates completing fixing the issue. An API entrypoint was also backported
|
||||
showing a list of all the server side AJAX templates. This change doesn't affect
|
||||
the API layout and it remains compatible with the previous version. Newlines
|
||||
are now explicitly removed from the rendered AJAX templates avoiding rendering
|
||||
issues on some browsers.
|
||||
|
||||
|
||||
Emails
|
||||
^^^^^^
|
||||
|
||||
An update was added to will now cause Mayan EDMS to reject all email attachments
|
||||
with a size 0 even if the attachment is valid. Documents of size 0 are not
|
||||
consideref valid in Mayan EDMS since they can't be introspected for MIME type,
|
||||
don't contain at least one version, and don't contain a single page. All these
|
||||
are requirements for a valid document in Mayan EDMS.
|
||||
|
||||
|
||||
Memory usage
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The ``MIMETYPE_FILE_READ_SIZE`` setting was added to limit the number of bytes that
|
||||
will be read into memory to determine the MIME type of a new document. For
|
||||
compatibility with the current bevahor this setting defaults to 0 which means
|
||||
that it is disabled. Disabling the setting will cause the entire document's
|
||||
file to be loaded into memory. If documents are not processing due to out of
|
||||
memory errors (large documents or devices with limited memory), set
|
||||
``MIMETYPE_FILE_READ_SIZE`` to a value other than 0. Limited tests suggest 1024
|
||||
to be a good alternative as most "magic numbers" used for MIME type detection
|
||||
are located at the start of the file and just reading the first 1024 bytes will
|
||||
result in a positive identification with little memory usage.
|
||||
|
||||
|
||||
Other changes
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
* Add missing document index API view create permission.
|
||||
* Fix index list API view. Add index create, delete, detail API tests.
|
||||
* Add support for skipping a default set of tests. Tests to be excluded
|
||||
by default should be tagged as 'exclude'.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
* None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.1.10
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
* None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
* :gitlab-issue:`557` Break workflows with invalid input
|
||||
* :gitlab-issue:`559` IndexTestCase.test_dual_level_dual_document_index failure
|
||||
* :gitlab-issue:`562` events.links.link_user_notifications_list should use
|
||||
reverse
|
||||
* :gitlab-issue:`564` API REST /api/indexes/ generates an "Internal Server Error"
|
||||
* :gitlab-issue:`566` apps.common.tests.base.GenericViewTestCase doesn't work
|
||||
with a custom ROOT_URLCONF
|
||||
* :gitlab-issue:`568` Tornado 6.0 doesn't support Python 2.7
|
||||
* :gitlab-issue:`572` Error when sending compressed files: ziparchive object
|
||||
has no attribute children
|
||||
* :gitlab-issue:`574` import of E-Mails with empty attachment fails
|
||||
* :gitlab-issue:`576` Exception with access check for cabinets containing
|
||||
NON-ASCII chars
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
148
docs/releases/3.1.11.rst
Normal file
148
docs/releases/3.1.11.rst
Normal file
@@ -0,0 +1,148 @@
|
||||
Version 3.1.11
|
||||
==============
|
||||
|
||||
Released: April XX, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
Memory usage
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The ``DOCUMENTS_HASH_BLOCK_SIZE`` setting was added to limit the number of
|
||||
bytes that will be read into memory when calculating the checksum of a new
|
||||
document. For compatibility with the current bevahor this setting defaults to
|
||||
0 which means that it is disabled. Disabling the setting will cause the
|
||||
entire document's file to be loaded into memory. If documents are not
|
||||
processing due to out of memory errors (large documents or devices with
|
||||
limited memory), set ``DOCUMENTS_HASH_BLOCK_SIZE`` to a value other than 0.
|
||||
Limited tests suggest 65535 to be a good alternative.
|
||||
|
||||
|
||||
Tag wizard step
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The tag wizard step was fixed and will now allow attaching multple tags to a
|
||||
new document.
|
||||
|
||||
|
||||
Permissions
|
||||
^^^^^^^^^^^
|
||||
|
||||
Previously the document checkout information link required one of the following
|
||||
permissions: document check in, document check in override, or document
|
||||
checkout. Meanwhile the document checkout information view would require the
|
||||
document checkout detail view permission. This difference in permissions
|
||||
has been eliminated and the link will now required the document checkout
|
||||
detail view permission, same as the view. Update your user role permissions
|
||||
accordingly.
|
||||
|
||||
|
||||
Other changes
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
* Lower the log severity when links don't resolve.
|
||||
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
* None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.1.11
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
If installed using a direct deployment
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | sudo -u mayan /opt/mayan-edms/bin/pip uninstall -r /dev/stdin
|
||||
|
||||
Download and install the new version::
|
||||
|
||||
$ sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 mayan-edms==3.1.11
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
Run the upgrade command::
|
||||
|
||||
$ sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
|
||||
MAYAN_DATABASE_NAME=mayan MAYAN_DATABASE_PASSWORD=mayanuserpass \
|
||||
MAYAN_DATABASE_USER=mayan MAYAN_DATABASE_HOST=127.0.0.1 \
|
||||
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py performupgrade
|
||||
|
||||
Add any new static files::
|
||||
|
||||
$ sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
* None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
* None
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
119
docs/releases/3.2.1.rst
Normal file
119
docs/releases/3.2.1.rst
Normal file
@@ -0,0 +1,119 @@
|
||||
Version 3.2.1
|
||||
=============
|
||||
|
||||
Released: June 14, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Fix sub cabinet creation view. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report.
|
||||
- Add PostgreSQL troubleshooting entry. Closes GitLab
|
||||
issues #523 and #602
|
||||
- Use YAML SafeDumper to avoid adding YAML datatype tags.
|
||||
Closes GitLab issue #599. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report and debug information.
|
||||
- Add check for app references and point users to release notes for details.
|
||||
GitLab issue #603. Thanks to Vikas Kedia (@vikaskedia) for the report.
|
||||
- Remove sidebar floar right.
|
||||
Fixed GitLab issue #600. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report and debug information.
|
||||
- Collapse sidebar on small screen
|
||||
Display sidebar at the bottom of the screen on small displays.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.1
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`523` PostgreSQL error about insufficient connections
|
||||
- :gitlab-issue:`599` Settings display !!python/unicode with values since 3.2
|
||||
- :gitlab-issue:`600` Layout broken if we change locale, since 3.2
|
||||
- :gitlab-issue:`601` Error when creating new cabinet level
|
||||
- :gitlab-issue:`602` System stops responding for a minute every 10 minutes or so
|
||||
- :gitlab-issue:`603` ImportError: No module named appearance
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
109
docs/releases/3.2.2.rst
Normal file
109
docs/releases/3.2.2.rst
Normal file
@@ -0,0 +1,109 @@
|
||||
Version 3.2.2
|
||||
=============
|
||||
|
||||
Released: June 19, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Fix document type change view. Closes GitLab issue #614.
|
||||
Thanks to Christoph Roeder (@brightdroid) for the report.
|
||||
- Fix document parsing tool view typo. Closes GitLab issue #615.
|
||||
Thanks to Tyler Page (@iamtpage) for the report.
|
||||
- Update the task_check_interval_source reference
|
||||
GitLab issue #617. Thanks to Lukas Gill (@lukkigi) for
|
||||
the report and debug information.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.2
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`614` change type exception
|
||||
- :gitlab-issue:`615` TypeError: success() got an unexpected keyword argument 'requrest'
|
||||
- :gitlab-issue:`617` Watcher Task not running
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
114
docs/releases/3.2.3.rst
Normal file
114
docs/releases/3.2.3.rst
Normal file
@@ -0,0 +1,114 @@
|
||||
Version 3.2.3
|
||||
=============
|
||||
|
||||
Released: June 21, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Add support for disabling the random primary key
|
||||
test mixin.
|
||||
- Fix mailing profile log columns mappings.
|
||||
GitLab issue #626. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report.
|
||||
- Fix the Django SMTP backend username field name.
|
||||
GitLab issue #625. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report and the research.
|
||||
- Increase the Django STMP username.
|
||||
GitLab issue #625. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report and the research.
|
||||
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.1
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`619` poplib.POP3_SSL and poplib.POP3 initialized with wrong kwarg
|
||||
- :gitlab-issue:`625` mayan.apps.mailer.mailers.DjangoSMTP uses "user", but django.core.mail.backends.smtp.EmailBackend expects "username"
|
||||
- :gitlab-issue:`626` Mailing profile error log is empty, despite errors
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
131
docs/releases/3.2.4.rst
Normal file
131
docs/releases/3.2.4.rst
Normal file
@@ -0,0 +1,131 @@
|
||||
Version 3.2.4
|
||||
=============
|
||||
|
||||
Released: June 29, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Support configurable GUnicorn timeouts. Defaults to
|
||||
current value of 120 seconds.
|
||||
- Fix help text of the platformtemplate command.
|
||||
- Fix IMAP4 mailbox.store flags argument. Python's documentation
|
||||
incorrectly state it is named flag_list. Closes GitLab issue
|
||||
#606. Thanks to Samuel Aebi (@samuelaebi) for the report and
|
||||
debug information.
|
||||
- Support configurable GUnicorn timeouts. Defaults to
|
||||
current value of 120 seconds.
|
||||
- Fix help text of the platformtemplate command.
|
||||
- Fix IMAP4 mailbox.store flags argument. Python's documentation
|
||||
incorrectly state it is named flag_list. Closes GitLab issue
|
||||
#606.
|
||||
- Improve the workflow preview generation. Use polylines
|
||||
instead of splines. Add state actions to the preview.
|
||||
Highlight the initial state.
|
||||
- Add help text to the workflow transition form comment field.
|
||||
- Fix direct deployment instructions.
|
||||
- Add user, group, and role dashboard widgets.
|
||||
- Add test mixin detect database connection leaks.
|
||||
- Remove tag create event registration from the tag
|
||||
instances. The tag create event is not applicable to
|
||||
existing tags.
|
||||
- Add proper redirection after moving a document to the
|
||||
trash.
|
||||
- Remove the INSTALLED_APPS setting. Replace it with
|
||||
the new COMMON_EXTRA_APPS and COMMON_DISABLED_APPS.
|
||||
- Improve email metadata support. Can now work on
|
||||
email with nested parts. Also the metadata.yaml
|
||||
attachment no longer needs to be the first attachment.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.4
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
sudo MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
sudo vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`606` Delete after IMAP Processing
|
||||
- :gitlab-issue:`628` mailbox.user in POP3Email gets passed keyword argument, but only accepts "user" or positional argument
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
117
docs/releases/3.2.5.rst
Normal file
117
docs/releases/3.2.5.rst
Normal file
@@ -0,0 +1,117 @@
|
||||
Version 3.2.5
|
||||
=============
|
||||
|
||||
Released: July 05, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Don't error out if the EXTRA_APPS or the DISABLED_APPS settings
|
||||
are set to blank.
|
||||
- Update troubleshooting documentation topic.
|
||||
- Add data migration to the file metadata app. Synchronizes the
|
||||
document type settings model of existing document types.
|
||||
- Fix cabinet and tags upload wizard steps missing some entries.
|
||||
GitLab issue #632. Thanks to Matthias Urhahn (@d4rken) for the
|
||||
report.
|
||||
- Add alert when settings are changed and util the installation
|
||||
is restarted. GitLab issue #605. Thanks to
|
||||
Vikas Kedia (@vikaskedia) to the report.
|
||||
- Update Django to version 1.11.22, PyYAML to version 5.1.1,
|
||||
django-widget-tweaks to version 1.4.5, pathlib2 to version 2.3.4,
|
||||
Werkzeug to version 0.15.4, django-extensions to version 2.1.9,
|
||||
django-rosetta to version 0.9.3, psutil to version 5.6.3.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.5
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
sudo MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
sudo vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`605` Project title fluctuates between default value and new value [Video]
|
||||
- :gitlab-issue:`629` Cannot Upgrade to 3.2.X Docker Image
|
||||
- :gitlab-issue:`632` Tags get lost when uploading through the webui
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
111
docs/releases/3.2.6.rst
Normal file
111
docs/releases/3.2.6.rst
Normal file
@@ -0,0 +1,111 @@
|
||||
Version 3.2.6
|
||||
=============
|
||||
|
||||
Released: July 10, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Remove the smart settings app * import. Following MERC 0005.
|
||||
- Encode settings YAML before hashing. Avoids unicode issues with Python 3.
|
||||
- Fix document icon used in the workflow runtime links.
|
||||
- Add trashed date time label.
|
||||
- Fix thumbnail generation issue. GitLab issue #637.
|
||||
Thanks to Giacomo Cariello (@giacomocariello) for the report
|
||||
and the merge request fixing the issue.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
sudo -u mayan curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt -o /tmp/removals.txt && sudo -u mayan /opt/mayan-edms/bin/pip uninstall -y -r /tmp/removals.txt
|
||||
|
||||
Type in the console::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install mayan-edms==3.2.6
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
sudo MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
sudo vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`637` Thumbnail generation bug
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
145
docs/releases/3.2.7.rst
Normal file
145
docs/releases/3.2.7.rst
Normal file
@@ -0,0 +1,145 @@
|
||||
Version 3.2.7
|
||||
=============
|
||||
|
||||
Released: August 28, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Fix checkouts form bug. Fixes GitLab issue #654
|
||||
Thanks to Lucius Schaerer (@lschaer1) for the report.
|
||||
- Disable pagination current page button
|
||||
Current page button was clickable and would cause the
|
||||
single page navigation to jump to the home view.
|
||||
- Remove redundant Celery queue declarations from the
|
||||
file_metadata app.
|
||||
- Add internal_name field to workflow serializer.
|
||||
Fixes workflow API creation view.
|
||||
- Fix document cabinet list API view. Thanks for forum user
|
||||
"jere" for the report. Forum topic 1039.
|
||||
- Fix document template column field. GitLab issue #655.
|
||||
Thanks to Christian Wiegand (@christianwgd) for the
|
||||
report.
|
||||
- Increase mailing profile password field max length
|
||||
from 48 to 128 characters. GitLab issue #657.
|
||||
Thanks to sigsec (@sigsec) for the report.
|
||||
- Update the Docker entrypoint to update the ownership
|
||||
of files when the UID of GUID are changed.
|
||||
GitLab issue #650. Thanks to Fabian (@ruffy91)
|
||||
for the report.
|
||||
- Update the Docker entrypoint to allow changing
|
||||
the GID of the mayan user to existing values.
|
||||
GitLab issue #652. Thanks to Fabian (@ruffy91)
|
||||
for the report.
|
||||
- Rename the MAYAN_USER_GUID environment variable
|
||||
to MAYAN_USER_GID.
|
||||
- Backport individual index rebuild support.
|
||||
- Add automatic adjustment of HTML body on navigation
|
||||
bar changes. Closes GitLab issue #643. Thanks to
|
||||
Light Templar (@LightTemplar) for the report.
|
||||
- Unify all line endings to be Linux style.
|
||||
- Make sure system alerts don't appear under
|
||||
floating elements.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
sudo -u mayan curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt -o /tmp/removals.txt && sudo -u mayan /opt/mayan-edms/bin/pip uninstall -y -r /tmp/removals.txt
|
||||
|
||||
Type in the console::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install mayan-edms==3.2.7
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
sudo MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
sudo vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`643` The "Actions" button won't show up, if window size between 992 and 1248 px
|
||||
- :gitlab-issue:`650` Permission denied when MAYAN_USER_UID and MAYAN_USER_GUID are set
|
||||
- :gitlab-issue:`652` MAYAN_USER_GUID cannot be set to specific values
|
||||
- :gitlab-issue:`654` Internal Server Error, Document Checkout
|
||||
- :gitlab-issue:`655` Index setup tree view shows two times the "enabled" field instead of "Link documents"
|
||||
- :gitlab-issue:`657` Mailer password length restriction is too short
|
||||
- :forum-topic:`1039` Re: /api/documents/{id}/cabinets returns 500
|
||||
- :forum-topic:`1050` edit/delete sub-cabinet
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
877
docs/releases/3.2.rst
Normal file
877
docs/releases/3.2.rst
Normal file
File diff suppressed because it is too large
Load Diff
@@ -20,6 +20,16 @@ versions of the documentation contain the release notes for any later releases.
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
3.2.7
|
||||
3.2.6
|
||||
3.2.5
|
||||
3.2.4
|
||||
3.2.3
|
||||
3.2.2
|
||||
3.2.1
|
||||
3.2
|
||||
3.1.11
|
||||
3.1.10
|
||||
3.1.9
|
||||
3.1.8
|
||||
3.1.7
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
Archlinux
|
||||
archlinux
|
||||
adf
|
||||
ajax
|
||||
ajaxForm
|
||||
@@ -141,6 +143,7 @@ storages
|
||||
Storages
|
||||
subclasses
|
||||
subclassing
|
||||
subfolder
|
||||
sublicense
|
||||
sublicensees
|
||||
swedish
|
||||
@@ -173,3 +176,15 @@ YaN
|
||||
yasg
|
||||
YbN
|
||||
YrcN
|
||||
metacopy
|
||||
overlayfs
|
||||
sys
|
||||
supervisord
|
||||
Monkeypatch
|
||||
Bootswatch
|
||||
sortable
|
||||
Odroid
|
||||
callables
|
||||
ModelPermission
|
||||
mixins
|
||||
kwargs
|
||||
|
||||
5
docs/topics/adding_documents.rst
Normal file
5
docs/topics/adding_documents.rst
Normal file
@@ -0,0 +1,5 @@
|
||||
################
|
||||
Adding documents
|
||||
################
|
||||
|
||||
.. include:: ../chapters/sources.rst
|
||||
@@ -8,3 +8,4 @@ Advanced topics
|
||||
.. include:: ../chapters/metadata.rst
|
||||
.. include:: ../chapters/transformations.rst
|
||||
.. include:: ../chapters/versioning.rst
|
||||
.. include:: ../chapters/quick_labels.rst
|
||||
|
||||
@@ -7,10 +7,12 @@ allows showing users different views of document groups. These are divided
|
||||
into ones requiring manual maintenance and others that are updated
|
||||
automatically.
|
||||
|
||||
|
||||
**************
|
||||
Manual methods
|
||||
**************
|
||||
|
||||
.. include:: ../chapters/document_types.rst
|
||||
.. include:: ../chapters/cabinets.rst
|
||||
.. include:: ../chapters/tags.rst
|
||||
|
||||
|
||||
8
docs/topics/docker.rst
Normal file
8
docs/topics/docker.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
######
|
||||
Docker
|
||||
######
|
||||
|
||||
Docker is a container technology. Containers are a standard unit of software
|
||||
that packages up code and all its dependencies.
|
||||
|
||||
.. include:: ../chapters/docker.rst
|
||||
@@ -6,6 +6,88 @@ FAQ
|
||||
Non technical
|
||||
*************
|
||||
|
||||
Contact
|
||||
=======
|
||||
|
||||
Can I contact members of the development team?
|
||||
----------------------------------------------
|
||||
|
||||
Direct access to members of the development team is reserved for clients
|
||||
of a support or consultation contract.
|
||||
|
||||
|
||||
I can't pay for support/consultation
|
||||
------------------------------------
|
||||
|
||||
A community forum is available at https://forum.mayan-edms.com. Members of
|
||||
the development team visit the forum on occasions and might answer some
|
||||
questions on a voluntary basis.
|
||||
|
||||
|
||||
I found a bug
|
||||
-------------
|
||||
|
||||
For bugs, open an issue at https://gitlab.com/mayan-edms/mayan-edms/issues.
|
||||
|
||||
|
||||
I found a security issue
|
||||
------------------------
|
||||
|
||||
Open an issue at https://gitlab.com/mayan-edms/mayan-edms/issues and mark it as
|
||||
Confidential. Allow us at least 48 hours to find and release a fix
|
||||
for the issue before submitting it to the CVE database.
|
||||
|
||||
|
||||
I want to join the development team
|
||||
-----------------------------------
|
||||
|
||||
Perfect! We need all the help we can get. Tell us where we can see what you've
|
||||
done using Mayan EDMS. It could be a fork, a new UI, an API client, a custom app,
|
||||
or anything else that you think will be able to evidence your dominion over the
|
||||
codebase.
|
||||
|
||||
|
||||
I submitted an issue and it has not been fixed
|
||||
----------------------------------------------
|
||||
|
||||
There are many reason an issue might not get resolved and remain open for an
|
||||
extended period of time. We document on the issue itself the progress and when
|
||||
resolved will reference what commit fixed it and the version or approximate time
|
||||
for the code to make it into a production release. Some reason why issues remain
|
||||
open with no resolution are:
|
||||
|
||||
- It was not an issue with the code. It happens that sometimes the problem lies
|
||||
with the operating system, the filesystem being used, the platform or packaging
|
||||
method.
|
||||
- It was not an issue but a question or a comment. The issue system is for reporting
|
||||
problems with the code. That said, we sometimes answer questions submitted as
|
||||
issues. For questions or discussions use the community forum.
|
||||
- We are not able to reproduce the issue. We need to be able to recreate the
|
||||
conditions that trigger the issue so that we can pinpoint the cause. After that
|
||||
we create a test to make sure the issue is really fixed. Some issues can
|
||||
be triggered manually easily but are hard to trigger programatically.
|
||||
- The issue is not clearly explained. Issue descriptions like: "It doesn't work",
|
||||
or "It showed an error but I forgot to write it down" are almost impossible to
|
||||
resolve.
|
||||
- We understand the cause of the problem but don't yet a solution to implement.
|
||||
We have studied the issue and have been able to reproduce it, but have not
|
||||
reached a consensus on how it should be fixed. Could be that the solution is
|
||||
beyond the collective expertise of the development team or that a design
|
||||
decision of big impact is needed before code changes can be implemented.
|
||||
- The issue is no real. The issue might be for an obsolete version. It could be
|
||||
for a fork or a program that is not developed by us. Sometimes they are just
|
||||
fake issues.
|
||||
|
||||
|
||||
I submitted a merge request and has not been merged
|
||||
---------------------------------------------------
|
||||
|
||||
Merge requests must follow the development standards of the code as close a
|
||||
possible. They must also be atomic and as small as possible. The code must also
|
||||
not change the behavior of the project. We can't accept merge request that
|
||||
customize it in some way based on your own preferences or needs.
|
||||
|
||||
|
||||
Distribution
|
||||
============
|
||||
|
||||
@@ -44,6 +126,7 @@ Restricting distribution or sale would conflict with the license terms. This
|
||||
would possible for a commercial version of Mayan EDMS with separate licensing
|
||||
terms.
|
||||
|
||||
|
||||
Is there a commercial partnership program?
|
||||
------------------------------------------
|
||||
|
||||
@@ -83,54 +166,6 @@ moment this could cause problems is when running South migrations during
|
||||
upgrades, if a migration fails the database structure is left in a transitory
|
||||
state and has to be reverted manually before trying again.
|
||||
|
||||
_mysql_exceptions. OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci, IMPLICIT) and (utf8_general_ci, COERCIBLE) for operation ‘='”)
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
::
|
||||
|
||||
$ mayan-edms.py shell
|
||||
>>> from django.db import connection
|
||||
>>> cursor = connection.cursor()
|
||||
>>> cursor.execute('SHOW TABLES')
|
||||
>>> results=[]
|
||||
>>> for row in cursor.fetchall(): results.append(row)
|
||||
>>> for row in results: cursor.execute('ALTER TABLE %s CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' % (row[0]))
|
||||
|
||||
References:
|
||||
|
||||
* http://stackoverflow.com/questions/1073295/django-character-set-with-mysql-weirdness
|
||||
|
||||
|
||||
Incorrect string value: ``'xE2x80x95rs6…'`` for column ``'content'`` at row 1
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
When using MySQL and doing OCR on languages other than English
|
||||
|
||||
Use utf-8 collation on MySQL server, or at least in table
|
||||
‘documents_documentpage', ‘content' field
|
||||
|
||||
References:
|
||||
|
||||
* http://groups.google.com/group/django-users/browse_thread/thread/429447086fca6412
|
||||
* http://markmail.org/message/bqajx2utvmtriixi
|
||||
|
||||
Error "django.db.utils.IntegrityError IntegrityError: (1452, ‘Cannot add or update a child row: a foreign key constraint fails (`…`.`…`, CONSTRAINT `…_refs_id_b0252274` FOREIGN KEY (`…`) REFERENCES `…` (`…`))')
|
||||
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Solution:
|
||||
Convert all MySQL tables to the same type, either all MyISAM or InnoDB
|
||||
|
||||
|
||||
Document versions
|
||||
=================
|
||||
|
||||
How do you upload a new version of an existing file?
|
||||
----------------------------------------------------
|
||||
|
||||
Choose a document, and go to the versions tab, on the right menu at the bottom
|
||||
under Other available action there is Upload new version. Clicking it will
|
||||
take you to a very similar view as the Upload new document but you will be
|
||||
able to specify version number and comments for the new version being uploaded.
|
||||
|
||||
LDAP
|
||||
====
|
||||
@@ -142,6 +177,7 @@ A sample settings file called ldap_connection_settings.py is included in the
|
||||
contrib/settings/ folder of the repository showing how to setup LDAP
|
||||
authentication.
|
||||
|
||||
|
||||
Operating systems
|
||||
=================
|
||||
|
||||
@@ -185,20 +221,24 @@ Django's development server doesn't serve static files unless the DEBUG option
|
||||
is set to True, this mode of operation should only be used for development or
|
||||
testing. For production deployments the management command::
|
||||
|
||||
$ mayan-edms.py collectstatic
|
||||
$ mayan-edms.py preparestatic
|
||||
|
||||
should be used and the resulting static folder served from a webserver.
|
||||
For more information check the
|
||||
:django-docs:`howto/static-files/`
|
||||
|
||||
Watchfolders
|
||||
============
|
||||
|
||||
Watch folders
|
||||
=============
|
||||
|
||||
The watched folder feature is not working
|
||||
-----------------------------------------
|
||||
|
||||
Make sure that the Celery BEAT scheduler is running correctly as it is the
|
||||
element that triggers the periodics tasks.
|
||||
element that triggers the periodic tasks. Check that the user running the Mayan
|
||||
EDMS services has read and write permissions for the watch folder.
|
||||
|
||||
|
||||
|
||||
Other
|
||||
=====
|
||||
@@ -225,8 +265,3 @@ Example::
|
||||
|
||||
Reference:
|
||||
* http://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html
|
||||
|
||||
Can you change the display order of documents…i.e can they be in alphabetical order?
|
||||
------------------------------------------------------------------------------------
|
||||
|
||||
A the moment no, but it is something being worked on.
|
||||
|
||||
@@ -92,7 +92,7 @@ Features
|
||||
* It is very easy to use 3rd party plugins such as the ones available for
|
||||
Amazon EC2.
|
||||
|
||||
* Color coded <../chapters/tags>`.
|
||||
* :doc:`Color coded tags <../chapters/tags>`.
|
||||
|
||||
* Labeled and color coded tags can be assigned for intuitive recognition.
|
||||
|
||||
|
||||
@@ -4,6 +4,19 @@ Getting started
|
||||
|
||||
These are the basic concepts you need to understand to start using Mayan EDMS.
|
||||
|
||||
The absolute minimum setup to start using Mayan EDMS is:
|
||||
|
||||
#. A document type
|
||||
#. A document source to add new documents
|
||||
|
||||
that's it!
|
||||
|
||||
To make things even easier, a default document type (named "Default") and a
|
||||
default document source (also named "Default") were created for you during the
|
||||
installation. So you don't need to do anything more to start adding documents
|
||||
right now, however take your time reading the information below to get a deeper
|
||||
understanding about how these concepts work.
|
||||
|
||||
.. include:: ../chapters/document_types.rst
|
||||
.. include:: ../chapters/sources.rst
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ Minimum hardware requirements
|
||||
|
||||
- 2 Gigabytes of RAM (1 Gigabyte if OCR is turned off).
|
||||
- Multiple core CPU (64 bit, faster than 1 GHz recommended).
|
||||
- Unix-like operating system like Linux and OpenBSD. For other operating systems
|
||||
- Unix-like operating system like GNU/Linux. For other operating systems
|
||||
user container technologies like Docker or virtual machines.
|
||||
|
||||
****************
|
||||
|
||||
183
docs/topics/troubleshooting.rst
Normal file
183
docs/topics/troubleshooting.rst
Normal file
@@ -0,0 +1,183 @@
|
||||
###############
|
||||
Troubleshooting
|
||||
###############
|
||||
|
||||
|
||||
********
|
||||
Database
|
||||
********
|
||||
|
||||
MySQL error: ``OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci, IMPLICIT) and (utf8_general_ci, COERCIBLE) for operation '='”)``
|
||||
=======================================================================================================================================================
|
||||
|
||||
::
|
||||
|
||||
$ mayan-edms.py shell
|
||||
>>> from django.db import connection
|
||||
>>> cursor = connection.cursor()
|
||||
>>> cursor.execute('SHOW TABLES')
|
||||
>>> results=[]
|
||||
>>> for row in cursor.fetchall(): results.append(row)
|
||||
>>> for row in results: cursor.execute('ALTER TABLE %s CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' % (row[0]))
|
||||
|
||||
References:
|
||||
|
||||
* http://stackoverflow.com/questions/1073295/django-character-set-with-mysql-weirdness
|
||||
|
||||
|
||||
MySQL error: ``Incorrect string value: `'xE2x80x95rs6…'` for column `'content'` at row 1``
|
||||
==========================================================================================
|
||||
|
||||
When using MySQL and doing OCR on languages other than English
|
||||
|
||||
Use utf-8 collation on MySQL server, or at least in table
|
||||
‘documents_documentpage', ‘content' field
|
||||
|
||||
References:
|
||||
|
||||
* http://groups.google.com/group/django-users/browse_thread/thread/429447086fca6412
|
||||
* http://markmail.org/message/bqajx2utvmtriixi
|
||||
|
||||
|
||||
MySQL error: ``Error "django.db.utils.IntegrityError IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`…`.`…`, CONSTRAINT `…_refs_id_b0252274` FOREIGN KEY (`…`) REFERENCES `…` (`…`))')``
|
||||
===================================================================================================================================================================================================================================
|
||||
|
||||
Solution:
|
||||
Convert all MySQL tables to the same type, either all MyISAM or InnoDB
|
||||
|
||||
|
||||
PostgreSQL error: ``OperationalError: FATAL: sorry, too many clients already``
|
||||
===============================================================================
|
||||
|
||||
Set ``MAYAN_DATABASE_CONN_MAX_AGE`` to 0
|
||||
|
||||
This setting keeps a database connection alive. It allows reuse of database
|
||||
connections. When Mayan EDMS is deployed with Gunicorn a microthreads backend,
|
||||
the database connections are not shared and this setting has the reverse effect
|
||||
of exhausting the available PostgreSQL connections available. To avoid this,
|
||||
Setting ``MAYAN_DATABASE_CONN_MAX_AGE`` to 0 will cause all microthreads to
|
||||
release their connections, by closing them when finished.
|
||||
|
||||
References:
|
||||
|
||||
- https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq
|
||||
- https://github.com/benoitc/gunicorn/issues/996
|
||||
|
||||
|
||||
******
|
||||
Docker
|
||||
******
|
||||
|
||||
MAYAN_APT_INSTALLS does not work for Archlinux with kernels > 4.14
|
||||
==================================================================
|
||||
|
||||
This is caused by a change from kernel 4.18 - 4.19. Metacopy on these kernels
|
||||
is set to yes in archlinux kernels (/sys/module/overlay/parameters/metacopy)
|
||||
and overlayfs should override this which it does not at the moment.
|
||||
|
||||
The workaround is to disable metacopy::
|
||||
|
||||
echo N | sudo tee /sys/module/overlay/parameters/metacopy
|
||||
|
||||
References:
|
||||
|
||||
* https://bbs.archlinux.org/viewtopic.php?id=241866
|
||||
* https://www.spinics.net/lists/linux-unionfs/msg06316.html
|
||||
|
||||
|
||||
|
||||
*********
|
||||
Passwords
|
||||
*********
|
||||
|
||||
.. _troubleshooting-admin-password:
|
||||
|
||||
Admin password reset
|
||||
====================
|
||||
|
||||
To reset the password of the admin account use the following command::
|
||||
|
||||
MAYAN_MEDIA_ROOT=<your Mayan media root setting> <installation directory>/bin/mayan-edms.py changepassword admin
|
||||
|
||||
If you followed the deploying instructions from the documentation your
|
||||
``MAYAN_MEDIA_ROOT`` will be ``/opt/mayan-edms/media``.
|
||||
|
||||
If using a Docker image, execute the command inside the container. First you
|
||||
need to know the name of the Docker container running Mayan EDMS on your setup
|
||||
with::
|
||||
|
||||
docker ps
|
||||
|
||||
Then execute the password reset command inside the Docker container::
|
||||
|
||||
docker exec -ti <your docker container name> /opt/mayan-edms/bin/mayan-edms.py changepassword admin
|
||||
|
||||
Another way to do this is to execute a shell inside the container to get a
|
||||
command prompt::
|
||||
|
||||
docker exec -ti <your docker container name> /bin/bash
|
||||
|
||||
And then execute the command::
|
||||
|
||||
/opt/mayan-edms/bin/mayan-edms.py changepassword admin
|
||||
|
||||
|
||||
.. _troubleshooting-autoadmin-account:
|
||||
|
||||
Missing automatic admin account after installation
|
||||
==================================================
|
||||
|
||||
This is caused when the ``initialsetup`` command is interrupted as the admin
|
||||
user is created outside of the database migrations.
|
||||
|
||||
To create an admin super user account manually use the command::
|
||||
|
||||
MAYAN_MEDIA_ROOT=<your Mayan media root setting> <installation directory>/bin/mayan-edms.py createsuperuser
|
||||
|
||||
If you followed the deploying instructions from the documentation your
|
||||
``MAYAN_MEDIA_ROOT`` will be ``/opt/mayan-edms/media``.
|
||||
|
||||
If using a Docker image, execute the command inside the container. First
|
||||
find you container name with::
|
||||
|
||||
docker ps
|
||||
|
||||
Then execute the command inside the container::
|
||||
|
||||
docker exec -ti <your docker container name> /opt/mayan-edms/bin/mayan-edms.py createsuperuser
|
||||
|
||||
Another way to do this is to execute a shell inside the container to get a
|
||||
command prompt::
|
||||
|
||||
docker exec -ti <your docker container name> /bin/bash
|
||||
|
||||
And then execute the command::
|
||||
|
||||
/opt/mayan-edms/bin/mayan-edms.py createsuperuser
|
||||
|
||||
|
||||
************
|
||||
Watchfolders
|
||||
************
|
||||
|
||||
Incomplete files uploaded
|
||||
=========================
|
||||
|
||||
To avoid uploading files are they are being copied to the watchfolder, copy the
|
||||
files to a temporary directory on the same partition as the watchfolder first.
|
||||
Then move the files to the watchfolder. The move will be executed as an atomic
|
||||
operation and will prevent the files to be uploaded in the middle of the
|
||||
copying process.
|
||||
|
||||
************
|
||||
Dependencies
|
||||
************
|
||||
|
||||
Error: ``unable to execute 'x86_64-linux-gnu-gcc': No such file or directory``
|
||||
==============================================================================
|
||||
|
||||
This happens when using the ``MAYAN_APT_INSTALLS`` feature. It means that the
|
||||
``GCC`` package is required to compile the packages specified with
|
||||
``MAYAN_APT_INSTALLS``.
|
||||
|
||||
Solution: Include ``gcc`` in the list of packages specified with ``MAYAN_APT_INSTALLS``.
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright 2011-2018 Roberto Rosario
|
||||
Copyright 2011 Roberto Rosario
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
__title__ = 'Mayan EDMS'
|
||||
__version__ = '3.1.9'
|
||||
__build__ = 0x030109
|
||||
__build_string__ = 'v3.1.9_Thu Nov 1 03:55:06 2018 -0400'
|
||||
__version__ = '3.2.7'
|
||||
__build__ = 0x030207
|
||||
__build_string__ = 'v3.2.7_Wed Aug 28 17:31:08 2019 -0400'
|
||||
__django_version__ = '1.11'
|
||||
__author__ = 'Roberto Rosario'
|
||||
__author_email__ = 'roberto.rosario@mayan-edms.com'
|
||||
__description__ = 'Free Open Source Electronic Document Management System'
|
||||
__license__ = 'Apache 2.0'
|
||||
__copyright_short__ = '2011-2018 Roberto Rosario'
|
||||
__copyright_short__ = '2011 Roberto Rosario'
|
||||
__copyright__ = '{} {}'.format('Copyright', __copyright_short__)
|
||||
__website__ = 'https://www.mayan-edms.com'
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .classes import ModelPermission # NOQA
|
||||
|
||||
default_app_config = 'acls.apps.ACLsApp'
|
||||
default_app_config = 'mayan.apps.acls.apps.ACLsApp'
|
||||
|
||||
@@ -21,12 +21,12 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
"""
|
||||
def get_content_object(self):
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
klass=ContentType, app_label=self.kwargs['app_label'],
|
||||
model=self.kwargs['model']
|
||||
)
|
||||
|
||||
content_object = get_object_or_404(
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
klass=content_type.model_class(), pk=self.kwargs['object_id']
|
||||
)
|
||||
|
||||
if self.request.method == 'GET':
|
||||
@@ -35,8 +35,8 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
permission_required = permission_acl_edit
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_required, user=self.request.user,
|
||||
obj=content_object
|
||||
obj=content_object, permissions=(permission_required,),
|
||||
user=self.request.user
|
||||
)
|
||||
|
||||
return content_object
|
||||
@@ -62,7 +62,9 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
if not self.request:
|
||||
return None
|
||||
|
||||
return super(APIObjectACLListView, self).get_serializer(*args, **kwargs)
|
||||
return super(APIObjectACLListView, self).get_serializer(
|
||||
*args, **kwargs
|
||||
)
|
||||
|
||||
def get_serializer_class(self):
|
||||
if self.request.method == 'GET':
|
||||
@@ -85,17 +87,17 @@ class APIObjectACLView(generics.RetrieveDestroyAPIView):
|
||||
permission_required = permission_acl_edit
|
||||
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
klass=ContentType, app_label=self.kwargs['app_label'],
|
||||
model=self.kwargs['model']
|
||||
)
|
||||
|
||||
content_object = get_object_or_404(
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
klass=content_type.model_class(), pk=self.kwargs['object_id']
|
||||
)
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_required, user=self.request.user,
|
||||
obj=content_object
|
||||
obj=content_object, permissions=(permission_required,),
|
||||
user=self.request.user
|
||||
)
|
||||
|
||||
return content_object
|
||||
@@ -111,22 +113,27 @@ class APIObjectACLPermissionListView(generics.ListCreateAPIView):
|
||||
"""
|
||||
def get_acl(self):
|
||||
return get_object_or_404(
|
||||
self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
klass=self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
)
|
||||
|
||||
def get_content_object(self):
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
klass=ContentType, app_label=self.kwargs['app_label'],
|
||||
model=self.kwargs['model']
|
||||
)
|
||||
|
||||
content_object = get_object_or_404(
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
klass=content_type.model_class(), pk=self.kwargs['object_id']
|
||||
)
|
||||
|
||||
if self.request.method == 'GET':
|
||||
permission = permission_acl_view
|
||||
else:
|
||||
permission = permission_acl_edit
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_acl_view, user=self.request.user,
|
||||
obj=content_object
|
||||
obj=content_object, permissions=(permission,),
|
||||
user=self.request.user
|
||||
)
|
||||
|
||||
return content_object
|
||||
@@ -147,7 +154,9 @@ class APIObjectACLPermissionListView(generics.ListCreateAPIView):
|
||||
return WritableAccessControlListPermissionSerializer
|
||||
|
||||
def get_serializer_context(self):
|
||||
context = super(APIObjectACLPermissionListView, self).get_serializer_context()
|
||||
context = super(
|
||||
APIObjectACLPermissionListView, self
|
||||
).get_serializer_context()
|
||||
if self.kwargs:
|
||||
context.update(
|
||||
{
|
||||
@@ -168,22 +177,27 @@ class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
|
||||
|
||||
def get_acl(self):
|
||||
return get_object_or_404(
|
||||
self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
klass=self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
)
|
||||
|
||||
def get_content_object(self):
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
klass=ContentType, app_label=self.kwargs['app_label'],
|
||||
model=self.kwargs['model']
|
||||
)
|
||||
|
||||
content_object = get_object_or_404(
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
klass=content_type.model_class(), pk=self.kwargs['object_id']
|
||||
)
|
||||
|
||||
if self.request.method == 'GET':
|
||||
permission = permission_acl_view
|
||||
else:
|
||||
permission = permission_acl_edit
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_acl_view, user=self.request.user,
|
||||
obj=content_object
|
||||
obj=content_object, permissions=(permission,),
|
||||
user=self.request.user
|
||||
)
|
||||
|
||||
return content_object
|
||||
@@ -192,7 +206,9 @@ class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
|
||||
return self.get_acl().permissions.all()
|
||||
|
||||
def get_serializer_context(self):
|
||||
context = super(APIObjectACLPermissionView, self).get_serializer_context()
|
||||
context = super(
|
||||
APIObjectACLPermissionView, self
|
||||
).get_serializer_context()
|
||||
if self.kwargs:
|
||||
context.update(
|
||||
{
|
||||
|
||||
@@ -2,35 +2,56 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common import MayanAppConfig, menu_object, menu_sidebar
|
||||
from navigation import SourceColumn
|
||||
from mayan.apps.common.apps import MayanAppConfig
|
||||
from mayan.apps.common.menus import menu_object, menu_secondary
|
||||
from mayan.apps.events.classes import ModelEventType
|
||||
from mayan.apps.events.links import (
|
||||
link_events_for_object, link_object_event_types_user_subcriptions_list
|
||||
)
|
||||
from mayan.apps.navigation.classes import SourceColumn
|
||||
|
||||
from .classes import ModelPermission
|
||||
from .events import event_acl_created, event_acl_edited
|
||||
from .links import link_acl_create, link_acl_delete, link_acl_permissions
|
||||
|
||||
|
||||
class ACLsApp(MayanAppConfig):
|
||||
app_namespace = 'acls'
|
||||
app_url = 'acls'
|
||||
has_rest_api = True
|
||||
has_tests = True
|
||||
name = 'acls'
|
||||
name = 'mayan.apps.acls'
|
||||
verbose_name = _('ACLs')
|
||||
|
||||
def ready(self):
|
||||
super(ACLsApp, self).ready()
|
||||
from actstream import registry
|
||||
|
||||
AccessControlList = self.get_model('AccessControlList')
|
||||
AccessControlList = self.get_model(model_name='AccessControlList')
|
||||
|
||||
SourceColumn(
|
||||
source=AccessControlList, label=_('Role'), attribute='role'
|
||||
ModelEventType.register(
|
||||
event_types=(event_acl_created, event_acl_edited),
|
||||
model=AccessControlList
|
||||
)
|
||||
|
||||
ModelPermission.register_inheritance(
|
||||
model=AccessControlList, related='content_object',
|
||||
)
|
||||
|
||||
SourceColumn(
|
||||
source=AccessControlList, label=_('Permissions'),
|
||||
attribute='get_permission_titles'
|
||||
attribute='role', is_sortable=True, source=AccessControlList,
|
||||
)
|
||||
|
||||
menu_object.bind_links(
|
||||
links=(link_acl_permissions, link_acl_delete),
|
||||
links=(
|
||||
link_acl_permissions, link_acl_delete,
|
||||
link_events_for_object,
|
||||
link_object_event_types_user_subcriptions_list
|
||||
),
|
||||
sources=(AccessControlList,)
|
||||
)
|
||||
menu_sidebar.bind_links(
|
||||
menu_secondary.bind_links(
|
||||
links=(link_acl_create,), sources=('acls:acl_list',)
|
||||
)
|
||||
|
||||
registry.register(AccessControlList)
|
||||
|
||||
@@ -1,16 +1,24 @@
|
||||
from __future__ import unicode_literals, absolute_import
|
||||
|
||||
import itertools
|
||||
import logging
|
||||
|
||||
from django.apps import apps
|
||||
from django.utils.encoding import force_text
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ModelPermission(object):
|
||||
_registry = {}
|
||||
_proxies = {}
|
||||
_functions = {}
|
||||
_inheritances = {}
|
||||
_registry = {}
|
||||
|
||||
@classmethod
|
||||
def deregister(cls, model):
|
||||
cls._registry.pop(model, None)
|
||||
# TODO: Find method to revert the add_to_class('acls'...)
|
||||
# delattr doesn't work.
|
||||
|
||||
@classmethod
|
||||
def register(cls, model, permissions):
|
||||
@@ -24,7 +32,9 @@ class ModelPermission(object):
|
||||
app_label='acls', model_name='AccessControlList'
|
||||
)
|
||||
|
||||
model.add_to_class('acls', GenericRelation(AccessControlList))
|
||||
model.add_to_class(
|
||||
name='acls', value=GenericRelation(AccessControlList)
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def get_classes(cls, as_content_type=False):
|
||||
@@ -45,8 +55,21 @@ class ModelPermission(object):
|
||||
return cls._registry.keys()
|
||||
|
||||
@classmethod
|
||||
def get_for_class(cls, klass):
|
||||
return cls._registry.get(klass, ())
|
||||
def get_for_class(cls, klass, as_choices=False):
|
||||
if as_choices:
|
||||
results = []
|
||||
|
||||
for namespace, permissions in itertools.groupby(cls.get_for_class(klass=klass, as_choices=False), lambda entry: entry.namespace):
|
||||
permission_options = [
|
||||
(force_text(permission.pk), permission) for permission in permissions
|
||||
]
|
||||
results.append(
|
||||
(namespace, permission_options)
|
||||
)
|
||||
|
||||
return results
|
||||
else:
|
||||
return cls._registry.get(klass, ())
|
||||
|
||||
@classmethod
|
||||
def get_for_instance(cls, instance):
|
||||
@@ -61,24 +84,23 @@ class ModelPermission(object):
|
||||
if class_permissions:
|
||||
permissions.extend(class_permissions)
|
||||
|
||||
proxy = cls._proxies.get(type(instance))
|
||||
|
||||
if proxy:
|
||||
permissions.extend(cls._registry.get(proxy))
|
||||
|
||||
pks = [
|
||||
permission.stored_permission.pk for permission in set(permissions)
|
||||
]
|
||||
return StoredPermission.objects.filter(pk__in=pks)
|
||||
|
||||
@classmethod
|
||||
def register_proxy(cls, source, model):
|
||||
cls._proxies[model] = source
|
||||
|
||||
@classmethod
|
||||
def register_inheritance(cls, model, related):
|
||||
cls._inheritances[model] = related
|
||||
def get_function(cls, model):
|
||||
return cls._functions[model]
|
||||
|
||||
@classmethod
|
||||
def get_inheritance(cls, model):
|
||||
return cls._inheritances[model]
|
||||
|
||||
@classmethod
|
||||
def register_function(cls, model, function):
|
||||
cls._functions[model] = function
|
||||
|
||||
@classmethod
|
||||
def register_inheritance(cls, model, related):
|
||||
cls._inheritances[model] = related
|
||||
|
||||
16
mayan/apps/acls/events.py
Normal file
16
mayan/apps/acls/events.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from mayan.apps.events.classes import EventTypeNamespace
|
||||
|
||||
namespace = EventTypeNamespace(
|
||||
label=_('Access control lists'), name='acls'
|
||||
)
|
||||
|
||||
event_acl_created = namespace.add_event_type(
|
||||
label=_('ACL created'), name='acl_created'
|
||||
)
|
||||
event_acl_edited = namespace.add_event_type(
|
||||
label=_('ACL edited'), name='acl_edited'
|
||||
)
|
||||
17
mayan/apps/acls/forms.py
Normal file
17
mayan/apps/acls/forms.py
Normal file
@@ -0,0 +1,17 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from mayan.apps.common.forms import FilteredSelectionForm
|
||||
|
||||
from .models import AccessControlList
|
||||
|
||||
|
||||
class ACLCreateForm(FilteredSelectionForm, forms.ModelForm):
|
||||
class Meta:
|
||||
field_name = 'role'
|
||||
fields = ('role',)
|
||||
label = _('Role')
|
||||
model = AccessControlList
|
||||
widget_attributes = {'class': 'select2'}
|
||||
@@ -1,6 +1,12 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from appearance.classes import Icon
|
||||
from mayan.apps.appearance.classes import Icon
|
||||
from mayan.apps.permissions.icons import icon_permission
|
||||
|
||||
icon_acl_delete = Icon(driver_name='fontawesome', symbol='times')
|
||||
icon_acl_list = Icon(driver_name='fontawesome', symbol='lock')
|
||||
icon_acl_new = Icon(driver_name='fontawesome', symbol='plus')
|
||||
icon_acl_new = Icon(
|
||||
driver_name='fontawesome-dual', primary_symbol='lock',
|
||||
secondary_symbol='plus'
|
||||
)
|
||||
icon_acl_permissions = icon_permission
|
||||
|
||||
@@ -3,9 +3,11 @@ from __future__ import unicode_literals
|
||||
from django.apps import apps
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from navigation import Link
|
||||
from mayan.apps.navigation.classes import Link
|
||||
|
||||
from .icons import icon_acl_list, icon_acl_new
|
||||
from .icons import (
|
||||
icon_acl_delete, icon_acl_list, icon_acl_new, icon_acl_permissions
|
||||
)
|
||||
from .permissions import permission_acl_view, permission_acl_edit
|
||||
|
||||
|
||||
@@ -27,22 +29,22 @@ def get_kwargs_factory(variable_name):
|
||||
return get_kwargs
|
||||
|
||||
|
||||
link_acl_delete = Link(
|
||||
args='resolved_object.pk', permissions=(permission_acl_edit,),
|
||||
permissions_related='content_object', tags='dangerous', text=_('Delete'),
|
||||
view='acls:acl_delete',
|
||||
)
|
||||
link_acl_list = Link(
|
||||
icon_class=icon_acl_list, kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list'
|
||||
)
|
||||
link_acl_create = Link(
|
||||
icon_class=icon_acl_new, kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_edit,), text=_('New ACL'),
|
||||
view='acls:acl_create'
|
||||
)
|
||||
link_acl_permissions = Link(
|
||||
args='resolved_object.pk', permissions=(permission_acl_edit,),
|
||||
permissions_related='content_object', text=_('Permissions'),
|
||||
view='acls:acl_permissions',
|
||||
link_acl_delete = Link(
|
||||
args='resolved_object.pk', icon_class=icon_acl_delete,
|
||||
permissions=(permission_acl_edit,), tags='dangerous', text=_('Delete'),
|
||||
view='acls:acl_delete'
|
||||
)
|
||||
link_acl_list = Link(
|
||||
icon_class=icon_acl_list, kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list'
|
||||
)
|
||||
link_acl_permissions = Link(
|
||||
args='resolved_object.pk', icon_class=icon_acl_permissions,
|
||||
permissions=(permission_acl_edit,),
|
||||
text=_('Permissions'), view='acls:acl_permissions'
|
||||
)
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
|
||||
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
|
||||
"POT-Creation-Date: 2019-09-03 23:14-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/ar/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,52 +17,61 @@ msgstr ""
|
||||
"Language: ar\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Access control lists"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "الصلاحيات"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "حذف"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "الصلاحيات"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "لا شيء"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Access control lists"
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
msgstr "Edit ACLs"
|
||||
@@ -71,112 +80,124 @@ msgstr "Edit ACLs"
|
||||
msgid "View ACLs"
|
||||
msgstr "View ACLs"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Roles"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
|
||||
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
|
||||
"POT-Creation-Date: 2019-09-03 23:14-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/language/bg/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,52 +17,61 @@ msgstr ""
|
||||
"Language: bg\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Контролни списъци за достъп"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Разрешения"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Разрешения"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr "достъп вписване"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr "достъп вписвания"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "Няма"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Контролни списъци за достъп"
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
msgstr "Редактиране на контролни списъци за достъп"
|
||||
@@ -71,112 +80,124 @@ msgstr "Редактиране на контролни списъци за до
|
||||
msgid "View ACLs"
|
||||
msgstr "Преглед на контролни списъци за достъп"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Роли"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
|
||||
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
|
||||
"POT-Creation-Date: 2019-09-03 23:14-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/rosarior/mayan-edms/language/bs_BA/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,51 +18,60 @@ msgstr ""
|
||||
"Language: bs_BA\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Liste kontrole pristupa (ACLs)"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr "Uloga"
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Dozvole"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "Obriši"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr "Novi ACL"
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "Obriši"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Dozvole"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Nedovoljan pristup za:%s"
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr "Pristupni unos"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr "Pristupni unosi"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Pristup \"%(permissions)s\" za ulogu \"%(role)s\" za \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "Nijedno"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Liste kontrole pristupa (ACLs)"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Uloga \"%(role)s\" dozvole za \"%(object)s\""
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
@@ -72,112 +81,124 @@ msgstr "Izmjeniti ACLs"
|
||||
msgid "View ACLs"
|
||||
msgstr "Pregledati ACLs"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr "API URL ukazujući na listu dozvola za ovu listu kontrole pristupa."
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr "URL API koji ukazuje na dozvolu u vezi sa listom kontrole pristupa kojoj je priložena. Ova URL adresa se razlikuje od kanonskog URL-a za radni tok."
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr "Primarni ključ za novu dozvolu za dodjelu listi kontrole pristupa."
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr "Nema takve dozvole: %s"
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr "Lista odvojenih primarnih ključeva za razdvajanje sa komandom dodeljuje se ovoj listi kontrola pristupa."
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr "Primarni ključevi uloge na koje se ova lista kontrole pristupa vezuje."
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr "Nove kontrole pristupa za:%s"
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "Obriši ACL:%s"
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr "Liste kontrole pristupa (ACL) za: %s"
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr "Dostupne dozvole"
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr "Dodjeljene dozvole"
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr "Dostupne dozvole"
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Uloga \"%(role)s\" dozvole za \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Dozvole za onesposobljavanje su nasledjene od roditeljskog objekta."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr "Tip objekta"
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "Tip objekta za koji će se pristup mijenjati."
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr "ID objekta"
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr "Numerički identifikator objekta za koji će se pristup mijenjati."
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Role"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "Uloge čiji će pristup biti modifikovan."
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr "Dozvole za dodeljivanje / poništavanje / od uloge za gore izabrani objekat."
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr "Dodjeljen pristup"
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr "Opozvati pristup"
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
BIN
mayan/apps/acls/locale/cs/LC_MESSAGES/django.mo
Normal file
BIN
mayan/apps/acls/locale/cs/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
204
mayan/apps/acls/locale/cs/LC_MESSAGES/django.po
Normal file
204
mayan/apps/acls/locale/cs/LC_MESSAGES/django.po
Normal file
@@ -0,0 +1,204 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# Jiri Fait <fait@orkasolutions.cz>, 2019
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-03 23:14-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Czech (http://www.transifex.com/rosarior/mayan-edms/language/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: cs\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
|
||||
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "Odstranit"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Práva"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: permissions.py:13
|
||||
msgid "View ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user