Compare commits
2419 Commits
developmen
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| eed753a383 | |||
| 6a67e34f10 | |||
| b1596aeb89 | |||
| 7c373df062 | |||
| 1cee2c1a55 | |||
|
|
fa899aa48d | ||
|
|
52011aca74 | ||
|
|
4f9f0ee00d | ||
|
|
a78e47e276 | ||
|
|
1a548a6df8 | ||
|
|
f335b7d773 | ||
|
|
bbcb0da836 | ||
|
|
42c6ce97ce | ||
|
|
8a803f1a5e | ||
|
|
bccd542233 | ||
|
|
9d25665043 | ||
|
|
b78089cc4f | ||
|
|
31bee80fa2 | ||
|
|
c374c15972 | ||
|
|
b8c8994f32 | ||
|
|
bf726245ff | ||
|
|
63d0144591 | ||
|
|
675c1e5a30 | ||
|
|
4f1ecebcac | ||
|
|
8b1c5eb868 | ||
|
|
52804e6095 | ||
|
|
778c48d11d | ||
|
|
ef514d5310 | ||
|
|
6c828eaf94 | ||
|
|
9a4f3f0332 | ||
|
|
5dc357c6a6 | ||
|
|
7cbc6f9b40 | ||
|
|
c99db3da08 | ||
|
|
1153661ff5 | ||
|
|
48c37661f8 | ||
|
|
3a1ca76e5b | ||
|
|
f2884607f5 | ||
|
|
2f4dc2b837 | ||
|
|
1201481ab4 | ||
|
|
53c57658e6 | ||
|
|
1136ae57a4 | ||
|
|
ac1ad7a81b | ||
|
|
a7b31fc171 | ||
|
|
826f7fddf2 | ||
|
|
a8562ef2e7 | ||
|
|
3c5811dacb | ||
|
|
16e95ffc42 | ||
|
|
8cfb457cf1 | ||
|
|
856a24e9db | ||
|
|
062b28c871 | ||
|
|
888715c3cf | ||
|
|
9d5c4c017d | ||
|
|
0b4c8242ee | ||
|
|
913e57a010 | ||
|
|
1ee449d894 | ||
|
|
2b8ac4b5fe | ||
|
|
88d29ecfc0 | ||
|
|
a7cf6b5664 | ||
|
|
9e9db800ad | ||
|
|
a96b7b98fb | ||
|
|
51b400ed30 | ||
|
|
b6bc79ec88 | ||
|
|
f895459d1f | ||
|
|
4312b38af5 | ||
|
|
e11e6f4724 | ||
|
|
9450040388 | ||
|
|
10372daede | ||
|
|
0da5fa83dd | ||
|
|
cdb9094083 | ||
|
|
7cda344f40 | ||
|
|
68342b481b | ||
|
|
3af04e8c42 | ||
|
|
2a64308185 | ||
|
|
4b980fed1e | ||
|
|
639108d6e6 | ||
|
|
4e664a6f92 | ||
|
|
4e65a436c7 | ||
|
|
d345f8e838 | ||
|
|
d6cb42147d | ||
|
|
84bad05807 | ||
|
|
15b4df54bf | ||
|
|
242a5c1d41 | ||
|
|
948445c5d0 | ||
|
|
0fa38a2833 | ||
|
|
a71db0b908 | ||
|
|
27b18c3fc6 | ||
|
|
edf7a71931 | ||
|
|
e5e2e80a8c | ||
|
|
af2d524287 | ||
|
|
7b2b189233 | ||
|
|
13788e121d | ||
|
|
af1ee3ae1a | ||
|
|
4afdac2b00 | ||
|
|
40bd1b297c | ||
|
|
c3d9208aa3 | ||
|
|
2cdcba73f9 | ||
|
|
2313c35e59 | ||
|
|
4418ad458e | ||
|
|
0e8bdec1d0 | ||
|
|
1da655129d | ||
|
|
9471b80fa5 | ||
|
|
8a4413abce | ||
|
|
6dbbef3476 | ||
|
|
34668c0786 | ||
|
|
971f99c89a | ||
|
|
d2f3601770 | ||
|
|
7a9333e44e | ||
|
|
8ff6eeec1f | ||
|
|
c21e33243c | ||
|
|
aa3495ff18 | ||
|
|
5070a4fcd6 | ||
|
|
bd2f6eb035 | ||
|
|
2bdfb67eb5 | ||
|
|
2d3b5b88df | ||
|
|
02e2c1dd01 | ||
|
|
14df823568 | ||
|
|
d240183073 | ||
|
|
3db4ad4fd0 | ||
|
|
196e2b5871 | ||
|
|
22d271bd3b | ||
|
|
4cc2522be6 | ||
|
|
2eac1b1c7d | ||
|
|
9b5a7c9936 | ||
|
|
2a80facf64 | ||
|
|
f61a90ece0 | ||
|
|
5c15398ca8 | ||
|
|
b3e45eac3a | ||
|
|
0087ad2adc | ||
|
|
6b983c66a1 | ||
|
|
063d327254 | ||
|
|
9ba003b01b | ||
|
|
bc5f5de629 | ||
|
|
266551c9f3 | ||
|
|
75d98221b4 | ||
|
|
124d46c9bb | ||
|
|
6553e68e1b | ||
|
|
c3b45c3d61 | ||
|
|
cb8e67d648 | ||
|
|
8d55e7d6e9 | ||
|
|
147318e906 | ||
|
|
22d6164781 | ||
|
|
242330ebaf | ||
|
|
e6acd6eb67 | ||
|
|
23fbc4166a | ||
|
|
6faf30244a | ||
|
|
d68f8f7349 | ||
|
|
3c8eee05c3 | ||
|
|
0262cb1324 | ||
|
|
c11fcbe9f9 | ||
|
|
c8701d58c8 | ||
|
|
29c06e3f37 | ||
|
|
1cbfb8671c | ||
|
|
28469c7adf | ||
|
|
40b040abe8 | ||
|
|
c9be1bccd2 | ||
|
|
5493c33257 | ||
|
|
88a96d0150 | ||
|
|
f54caa1ed0 | ||
|
|
6567ef2238 | ||
|
|
3b8f376e95 | ||
|
|
b87db445dd | ||
|
|
d196f36951 | ||
|
|
f4ace36522 | ||
|
|
fc3a8f13c6 | ||
|
|
85f7167fd4 | ||
|
|
e421dbf543 | ||
|
|
2d2cc4f75c | ||
|
|
2119683246 | ||
|
|
64f02aa771 | ||
|
|
620c23a92e | ||
|
|
6687b1e61e | ||
|
|
4ea1a208eb | ||
|
|
c9746b5813 | ||
|
|
5a0f54864e | ||
|
|
6d94227224 | ||
|
|
88ab66749e | ||
|
|
a9fdd3e654 | ||
|
|
9576d5ce17 | ||
|
|
6ec2fd9e01 | ||
|
|
f3d01a01b2 | ||
|
|
31321f8073 | ||
|
|
5defe44420 | ||
|
|
a83358069c | ||
|
|
ae134ae409 | ||
|
|
2d5ec1a3cc | ||
|
|
96b257a7b8 | ||
|
|
3177a7a096 | ||
|
|
fc69f41fd0 | ||
|
|
f0e04fc069 | ||
|
|
b0729ea714 | ||
|
|
b5c4c61b3f | ||
|
|
3f41d5274b | ||
|
|
86399a5ee2 | ||
|
|
a36c2a6590 | ||
|
|
1e0fa2cdb1 | ||
|
|
3c70e7d3e6 | ||
|
|
f92058d1b0 | ||
|
|
4b383b4951 | ||
|
|
45c8fefdc4 | ||
|
|
9205c40e9b | ||
|
|
9981be60da | ||
|
|
3705457526 | ||
|
|
a031e9d582 | ||
|
|
e9ab253757 | ||
|
|
3bb07d6dcf | ||
|
|
448176111b | ||
|
|
97bd91f83e | ||
|
|
3b9245c029 | ||
|
|
8c390f6ed7 | ||
|
|
af70f881eb | ||
|
|
b5b3312d39 | ||
|
|
6b2aeaf421 | ||
|
|
b6414e4e92 | ||
|
|
8ee9ac239d | ||
|
|
529c567ffb | ||
|
|
f2016a87cb | ||
|
|
17232d6001 | ||
|
|
128cf09a04 | ||
|
|
ce87a8f8d5 | ||
|
|
5f72e91935 | ||
|
|
e8da9610db | ||
|
|
b0373eaca1 | ||
|
|
507b6957c7 | ||
|
|
23211847a3 | ||
|
|
3137b5a50a | ||
|
|
67ea431cca | ||
|
|
f55bf1b52e | ||
|
|
3b756c4393 | ||
|
|
35aafc3f70 | ||
|
|
cd5da60063 | ||
|
|
91aec4e3f2 | ||
|
|
34a9ce6e42 | ||
|
|
bdc6740131 | ||
|
|
e281607ca6 | ||
|
|
cd72a3bab4 | ||
|
|
327c795cf4 | ||
|
|
fa8fddb349 | ||
|
|
c75033f676 | ||
|
|
971e5c0ae7 | ||
|
|
f1c704e3e1 | ||
|
|
820e997165 | ||
|
|
07e2ca8c11 | ||
|
|
ec86d7679a | ||
|
|
707950ad30 | ||
|
|
a8097e1869 | ||
|
|
3b0f04add5 | ||
|
|
16d9c7d074 | ||
|
|
fbcd424474 | ||
|
|
76be58dcfa | ||
|
|
abff91c9f9 | ||
|
|
04647bb09c | ||
|
|
3562494b9e | ||
|
|
31e98eec99 | ||
|
|
ccb59dd1a3 | ||
|
|
3951c6c522 | ||
|
|
3ecbec36aa | ||
|
|
e2af72dab7 | ||
|
|
302a90ff9d | ||
|
|
3b72eac8ae | ||
|
|
27d3661017 | ||
|
|
491badc877 | ||
|
|
4bc27d33e2 | ||
|
|
c14a98b78e | ||
|
|
ecb1e1b0b3 | ||
|
|
7b96ccfe10 | ||
|
|
72758735c1 | ||
|
|
bf1155abb3 | ||
|
|
9eb483a052 | ||
|
|
3e954db2f7 | ||
|
|
783e017470 | ||
|
|
34c3443cf1 | ||
|
|
3f505007fa | ||
|
|
bb26df8052 | ||
|
|
a308024992 | ||
|
|
6473412eca | ||
|
|
fe9bc35d9b | ||
|
|
c3793699c5 | ||
|
|
4a1607afad | ||
|
|
2e231dad62 | ||
|
|
fac5072c68 | ||
|
|
8d8fc76962 | ||
|
|
77cae991f4 | ||
|
|
54dc9469dd | ||
|
|
ec7c3ef41f | ||
|
|
ba7284a9ae | ||
|
|
1a9be24ada | ||
|
|
6d8cb8f537 | ||
|
|
e593dcb5d8 | ||
|
|
a60c2fa94c | ||
|
|
41214fa90e | ||
|
|
f030bae926 | ||
|
|
1c39b3c84d | ||
|
|
774d09479c | ||
|
|
f0755a4cd9 | ||
|
|
00ab715829 | ||
|
|
588ab4c728 | ||
|
|
03e4978106 | ||
|
|
05ceeca8ff | ||
|
|
8ce4d5fb30 | ||
|
|
15dc4e8489 | ||
|
|
680a4875f5 | ||
|
|
7ff9bcb707 | ||
|
|
08158838b4 | ||
|
|
466f15e154 | ||
|
|
81b1564535 | ||
|
|
5305762636 | ||
|
|
b0677a8bda | ||
|
|
6bd672a756 | ||
|
|
5af821e155 | ||
|
|
04f5952ee6 | ||
|
|
cdb1815f49 | ||
|
|
cf154c46f4 | ||
|
|
bfd4db5d35 | ||
|
|
55851d37d6 | ||
|
|
178d631a1b | ||
|
|
fa7bc455b9 | ||
|
|
1030fd67c9 | ||
|
|
e5c8512104 | ||
|
|
d2621c1b70 | ||
|
|
e8aed0e246 | ||
|
|
da45be77ec | ||
|
|
d76ec6ffba | ||
|
|
39fe18c332 | ||
|
|
49017cb3d9 | ||
|
|
8bf4c7539b | ||
|
|
60dfb71028 | ||
|
|
ef6abb0af0 | ||
|
|
f19fd582a1 | ||
|
|
dc6b37125f | ||
|
|
5e1301b092 | ||
|
|
8a212df440 | ||
|
|
c981cf05df | ||
|
|
58a8678833 | ||
|
|
8b5f0e9e82 | ||
|
|
f631114cb1 | ||
|
|
6e1bcae0fe | ||
|
|
e91232f722 | ||
|
|
1615e584ce | ||
|
|
894db8eb19 | ||
|
|
ffb7be6267 | ||
|
|
656ba26139 | ||
|
|
89bdfc5975 | ||
|
|
fe9d015d0c | ||
|
|
f73dd28c92 | ||
|
|
7d4f11b74b | ||
|
|
3d03d0cd67 | ||
|
|
0167ff24b8 | ||
|
|
d12fa430dc | ||
|
|
dca13b675a | ||
|
|
eda3a38e7b | ||
|
|
82e6887b7f | ||
|
|
e703d2df10 | ||
|
|
72b92c3924 | ||
|
|
07950fa8f3 | ||
|
|
ee426282db | ||
|
|
0fdb59b811 | ||
|
|
52e7559938 | ||
|
|
c77b677e41 | ||
|
|
f1b9ae5ec6 | ||
|
|
2f9062f31a | ||
|
|
7df930ae4c | ||
|
|
3bd1fb4e90 | ||
|
|
ac0e74572e | ||
|
|
31b1f72b95 | ||
|
|
274937feee | ||
|
|
565e60a26c | ||
|
|
308928ad82 | ||
|
|
a275fb9480 | ||
|
|
dcc19e9ffd | ||
|
|
b544dc8c83 | ||
|
|
1252263f93 | ||
|
|
0ab9c18733 | ||
|
|
aa608c6094 | ||
|
|
f650a623b5 | ||
|
|
734b7c25e1 | ||
|
|
e14685e3e7 | ||
|
|
a507bc89b7 | ||
|
|
f9fa3344d0 | ||
|
|
9d883e455e | ||
|
|
1ca91e7ec5 | ||
|
|
75d20d1b57 | ||
|
|
834697a01e | ||
|
|
1e4088c819 | ||
|
|
6dda918bb3 | ||
|
|
58c64955cc | ||
|
|
743c586e31 | ||
|
|
360b3e7c78 | ||
|
|
9496fffda6 | ||
|
|
c91bab7b1f | ||
|
|
6dff3564dc | ||
|
|
475b93a664 | ||
|
|
da7feed2ef | ||
|
|
c61acb55ca | ||
|
|
b9244ee62b | ||
|
|
ca907c63f6 | ||
|
|
5850f2a905 | ||
|
|
5dd22f9cf0 | ||
|
|
da7a3a02b5 | ||
|
|
3d0f139364 | ||
|
|
b69a5536e2 | ||
|
|
9c400a6184 | ||
|
|
2edacc9a06 | ||
|
|
3bb84fa874 | ||
|
|
8f1d9bd484 | ||
|
|
4dd5a63d87 | ||
|
|
de499ab6bd | ||
|
|
d9cb353664 | ||
|
|
6b4392a35c | ||
|
|
61f398a3b9 | ||
|
|
20a5369266 | ||
|
|
8e10607d63 | ||
|
|
d66231b341 | ||
|
|
2dc0032fc8 | ||
|
|
356f288d70 | ||
|
|
6e1236e8a0 | ||
|
|
c46b720e08 | ||
|
|
5640b2ac27 | ||
|
|
eb9f905dc8 | ||
|
|
bb426a44fc | ||
|
|
e7fec358f3 | ||
|
|
be25705db3 | ||
|
|
1bb4689aed | ||
|
|
deb363ee16 | ||
|
|
491de98356 | ||
|
|
7e5aad7714 | ||
|
|
42cfef505c | ||
|
|
b2e8a63224 | ||
|
|
8ab9bf523f | ||
|
|
115a3cca11 | ||
|
|
e35c5f6d22 | ||
|
|
2a16a18984 | ||
|
|
c79a974746 | ||
|
|
cebd43d8c7 | ||
|
|
49b04acda0 | ||
|
|
7b03b83dd0 | ||
|
|
2a501c537a | ||
|
|
83f876cde9 | ||
|
|
d79a24c6ba | ||
|
|
4dea4129db | ||
|
|
1b6468522a | ||
|
|
dc03a44513 | ||
|
|
b827155840 | ||
|
|
1074e6f645 | ||
| 06c8f68684 | |||
| f8bb22df86 | |||
| 6ea5a5bd56 | |||
| b341386101 | |||
| 7b4cd7ed12 | |||
| 7663006e3c | |||
| e7159583a8 | |||
| 6296101fe6 | |||
| 9a479ecfeb | |||
|
|
9e2ef57e00 | ||
|
|
756765ce4a | ||
|
|
53096b8bdd | ||
|
|
8aa2567a56 | ||
|
|
ce6e568001 | ||
|
|
d1f0e23c53 | ||
|
|
3f33bdd9c2 | ||
|
|
b2390843ab | ||
|
|
fc14341d40 | ||
|
|
57dd5b1bca | ||
|
|
c731ab7050 | ||
|
|
bd0d298be3 | ||
|
|
cc8147d002 | ||
|
|
1b327b99f0 | ||
|
|
7b3a83ee39 | ||
|
|
4659269349 | ||
|
|
517bb4e9a2 | ||
|
|
162cd256e7 | ||
|
|
339b7dd836 | ||
|
|
949c0ab285 | ||
|
|
cb6cb4121f | ||
|
|
042727aaa9 | ||
|
|
5b304ea742 | ||
|
|
ce4413d539 | ||
|
|
547c31d216 | ||
|
|
f4293a7c06 | ||
|
|
1779d482ac | ||
|
|
e0e4f238f6 | ||
|
|
fecfb37a84 | ||
|
|
3e2aaf391e | ||
|
|
230fde0ab2 | ||
|
|
d9865af200 | ||
|
|
72f8fcf720 | ||
|
|
30668d9d0b | ||
|
|
d5aab12b8d | ||
|
|
32313d2c31 | ||
|
|
ebc0a5f449 | ||
|
|
415d3bcd2f | ||
|
|
b985f2ef05 | ||
|
|
15c953815e | ||
|
|
390e552c1f | ||
|
|
9041f00caa | ||
|
|
b0163319eb | ||
|
|
762cdc5b89 | ||
|
|
396cbb4b22 | ||
|
|
8b0cd93526 | ||
|
|
f97ccb693b | ||
|
|
c3b539ba19 | ||
|
|
80126f2326 | ||
|
|
00e3d40231 | ||
|
|
0953127420 | ||
|
|
02505ba855 | ||
|
|
6fe41660bd | ||
|
|
7695178992 | ||
|
|
b03758ed8b | ||
|
|
d7818b64b0 | ||
|
|
fb53726888 | ||
|
|
8da1a64410 | ||
|
|
62430bf341 | ||
|
|
792aa64829 | ||
|
|
e62e684107 | ||
|
|
a3d63dce80 | ||
|
|
8adb342e24 | ||
|
|
c9567d0c6d | ||
|
|
907e2213e9 | ||
|
|
dea3bbdf09 | ||
|
|
61c6562860 | ||
|
|
8322bd3a27 | ||
|
|
11898a36fe | ||
|
|
2d97024d93 | ||
|
|
d543a71909 | ||
|
|
c652a6c7f6 | ||
|
|
1bc3b58d4e | ||
|
|
4e6e4789e3 | ||
|
|
d1ba081fb7 | ||
|
|
03c63bcf80 | ||
|
|
f7789fa6da | ||
|
|
d190dbca03 | ||
|
|
4384452423 | ||
|
|
0d263c2b76 | ||
|
|
76fef4f247 | ||
|
|
f5d0e4d560 | ||
|
|
4b3ab82ee2 | ||
|
|
f8eda67bd5 | ||
|
|
58bcf20a46 | ||
|
|
49979dede5 | ||
| 09f481f5f0 | |||
|
|
27228093c0 | ||
|
|
b329ed7618 | ||
|
|
373a712669 | ||
|
|
734ca02a95 | ||
|
|
04b19f8d2e | ||
|
|
fce0601d25 | ||
|
|
54769bf22a | ||
|
|
7dda3225b3 | ||
|
|
f303cdfe95 | ||
|
|
b5ac83767d | ||
|
|
3ad035adcb | ||
|
|
e9231bc47c | ||
|
|
533e2e344c | ||
|
|
649ef8151c | ||
|
|
69c925ffd3 | ||
|
|
8e34bc02b3 | ||
|
|
a250919acc | ||
|
|
38980e5f75 | ||
|
|
666c3324e8 | ||
|
|
5627a3d247 | ||
|
|
cb7dbaf609 | ||
|
|
7cba63f403 | ||
|
|
2f6cfcbc4f | ||
|
|
2af136356d | ||
|
|
7a8dad5a3c | ||
|
|
3a0226ac22 | ||
|
|
cb14224fde | ||
|
|
e45443fdea | ||
|
|
b19b602a53 | ||
|
|
ec2dde7483 | ||
|
|
c94ed44476 | ||
|
|
eff18b5823 | ||
|
|
30f3d11375 | ||
|
|
871a800213 | ||
|
|
e7faece342 | ||
|
|
8bcd2c247f | ||
|
|
605e6356a7 | ||
|
|
9c202f7087 | ||
|
|
c833b7a74c | ||
|
|
e002f317a4 | ||
|
|
6503d9474d | ||
|
|
e7734def58 | ||
|
|
f50d22b382 | ||
|
|
ad37228466 | ||
|
|
0917bd57b3 | ||
|
|
4dd270e75b | ||
|
|
3428c6aa20 | ||
|
|
eb1fb8511b | ||
|
|
bdbc7ef086 | ||
|
|
abea863184 | ||
|
|
d394583729 | ||
|
|
4db59c0808 | ||
|
|
12f24316a1 | ||
|
|
ef0843276b | ||
|
|
e20102333e | ||
|
|
4ecf075fd4 | ||
|
|
cc81a6905a | ||
|
|
3c9454160f | ||
|
|
2e1600c334 | ||
|
|
3e9f30cb91 | ||
|
|
a3a78f755d | ||
|
|
3988dedebf | ||
|
|
ff34c7d00a | ||
|
|
fe2de33e98 | ||
|
|
3efd1bd89d | ||
|
|
ea516cbc23 | ||
|
|
52ad3e7418 | ||
|
|
a001b4bbb3 | ||
|
|
31ed0e1ac8 | ||
|
|
9ad82695d9 | ||
|
|
69af4dd6b3 | ||
|
|
1c7ceca432 | ||
|
|
c05dcf5b05 | ||
|
|
85b05dd6ec | ||
|
|
9752584135 | ||
|
|
fd0d5728a1 | ||
|
|
88863fd6d0 | ||
|
|
3a7025d9c4 | ||
|
|
150c5d8cc2 | ||
|
|
93ba547350 | ||
|
|
f920dffc01 | ||
|
|
c2e99e6efb | ||
|
|
ff6674cc4a | ||
|
|
669dfeb30a | ||
|
|
6635bb4235 | ||
|
|
88bc29e4d7 | ||
|
|
9315776926 | ||
|
|
40a306996c | ||
|
|
033cecd946 | ||
|
|
ee63829e7f | ||
|
|
e4bc007bba | ||
|
|
84b329f661 | ||
|
|
4c73239dde | ||
|
|
2e12a6af41 | ||
|
|
3d7e6b6fbe | ||
|
|
6f907d156a | ||
|
|
fac77a2f73 | ||
|
|
0c3b6e5388 | ||
|
|
c51f8d2135 | ||
|
|
e652c7208c | ||
|
|
53928b2ab6 | ||
|
|
afc6b54520 | ||
|
|
070355033e | ||
|
|
0029d3074f | ||
|
|
4558894faf | ||
|
|
adeea6247f | ||
|
|
3563297d48 | ||
|
|
1e1b4dedf4 | ||
|
|
d65bbb718a | ||
|
|
5352c6ac6f | ||
|
|
cb7d5bf82a | ||
|
|
41a7d00e9e | ||
|
|
82d7339a64 | ||
|
|
e889021f43 | ||
|
|
d3a53fb53a | ||
|
|
b6565effb5 | ||
|
|
cf43ef2f73 | ||
|
|
6ca2845d19 | ||
|
|
ab601f9180 | ||
|
|
0b42567179 | ||
|
|
030ddd68e0 | ||
|
|
649571ebb1 | ||
|
|
b99bb88008 | ||
|
|
fd08a23339 | ||
|
|
917ec55ada | ||
|
|
ec4644b5c9 | ||
|
|
ff86c4c518 | ||
|
|
daebf2ddcc | ||
|
|
49a16acdf5 | ||
|
|
8c064c953a | ||
|
|
3c7a23a5a9 | ||
|
|
01b2ad3ddc | ||
|
|
6bcf35bef5 | ||
|
|
7ef6102876 | ||
|
|
4363bba0fe | ||
|
|
e2f2181ebb | ||
|
|
d4f7e2cd16 | ||
|
|
058e36b4a9 | ||
|
|
1ddd5f26b1 | ||
|
|
44652d49fb | ||
|
|
119c1bde76 | ||
|
|
ed227b4111 | ||
|
|
c44090aca6 | ||
|
|
8a7da6a103 | ||
|
|
3e3b1f75a0 | ||
|
|
1ab7b7b9b1 | ||
|
|
3fab5c1427 | ||
|
|
516c3aeb2c | ||
|
|
3ac1000b46 | ||
|
|
4adeefc978 | ||
|
|
8bc4b6a95e | ||
|
|
37e85590e8 | ||
|
|
e371124bca | ||
|
|
3621af7e7d | ||
|
|
1e1e930e88 | ||
|
|
d04f1eb9a5 | ||
|
|
6dde3e1ac3 | ||
|
|
efb8a35ea4 | ||
|
|
25df502cb0 | ||
|
|
5c91ab2d73 | ||
|
|
ea4f9d6c4e | ||
|
|
6d0b7b1fc0 | ||
|
|
627e9cb1f0 | ||
|
|
4fcd60194e | ||
|
|
644cd57a0f | ||
|
|
f6febdd221 | ||
|
|
78a0189e1c | ||
|
|
91b0b2d9c3 | ||
|
|
8a54deba3d | ||
|
|
22da1e0a78 | ||
|
|
c9668d62e5 | ||
|
|
7a01a77c43 | ||
|
|
9564db398f | ||
|
|
f46a32580d | ||
|
|
7faa24eb7b | ||
|
|
51f278301b | ||
|
|
2cc35c3c61 | ||
|
|
8c73fda1ae | ||
|
|
8811c8269f | ||
|
|
f36f99c5fb | ||
|
|
0e972eff06 | ||
|
|
7913b5ddcc | ||
|
|
1c86ea5b5b | ||
|
|
ec6a3bd960 | ||
|
|
080553c797 | ||
|
|
08ee07e652 | ||
|
|
d7d77fcb55 | ||
|
|
929cc7d374 | ||
|
|
bb5324ef50 | ||
|
|
4c212f6ea4 | ||
|
|
941356ed69 | ||
|
|
97804b255b | ||
|
|
06c3ef6583 | ||
|
|
6cd857e2bf | ||
|
|
fbb0f0b9bd | ||
|
|
9e068c3e83 | ||
|
|
72a3807354 | ||
|
|
109fcba795 | ||
|
|
01380e0572 | ||
|
|
5146c6d202 | ||
|
|
300bdbfc8a | ||
|
|
a0331e0236 | ||
|
|
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 | ||
|
|
5c9ff90d28 | ||
|
|
f5d2f34e30 | ||
|
|
8cbae9021b | ||
|
|
8a971400b1 | ||
|
|
fb3678bb6f | ||
|
|
7c5477b439 | ||
|
|
cc7362b269 | ||
|
|
dcb55f4aff | ||
|
|
ba6fd842d2 | ||
|
|
cf1726505b | ||
|
|
8b41a9bfc9 | ||
|
|
e109068b29 | ||
|
|
9fc7c4fc09 | ||
|
|
5a8455bfc2 | ||
|
|
033d6751e0 | ||
|
|
d9ee75cc47 | ||
|
|
6ae24493eb | ||
|
|
b4f43adc1a | ||
|
|
46d48cc5ea | ||
|
|
b74a323f2b | ||
|
|
bcd2427ab6 | ||
|
|
8fcc61bde5 | ||
|
|
b716971ba0 | ||
|
|
ad822834d4 | ||
|
|
e222a71966 | ||
|
|
1f27670921 | ||
|
|
321b7ad5ae | ||
|
|
cc79e75d35 | ||
|
|
70bb250a23 | ||
|
|
5eee810d8e | ||
|
|
37bd5862e6 | ||
|
|
8bf6c37e35 | ||
|
|
e6c43bebf5 | ||
|
|
7cd62b5a85 | ||
|
|
d5ef08b636 | ||
|
|
c9fb3814d9 | ||
|
|
5a922e2689 | ||
|
|
e55ce29c5f | ||
|
|
9634ba75a6 | ||
|
|
665dbb6766 | ||
|
|
4efc3ec182 | ||
|
|
e2e89efb47 | ||
|
|
680e6721f1 | ||
|
|
7a4302415a | ||
|
|
8c6ba747f0 | ||
|
|
88f41a570e | ||
|
|
e731cca629 | ||
|
|
eb357b18fc | ||
|
|
38c84de708 | ||
|
|
417fc8f766 | ||
|
|
e508b3a7a2 | ||
|
|
abe9fa0e47 | ||
|
|
6c9da58ec3 | ||
|
|
cc27233765 | ||
|
|
4cbe27a462 | ||
|
|
15b9c0c56f | ||
|
|
f34bead7d2 | ||
|
|
1e08653b88 | ||
|
|
838035291d | ||
|
|
4ad84195e0 | ||
|
|
7ff974382b | ||
|
|
c715d0fc8e | ||
|
|
a49e7ebd0b | ||
|
|
8c486d8459 | ||
|
|
6a3aae3348 | ||
|
|
f0453357f8 | ||
|
|
03f5fdda56 | ||
|
|
9fae8ceb64 | ||
|
|
36f21b063d | ||
|
|
efc17eb075 | ||
|
|
eeeb246ed7 | ||
|
|
55c83689d2 | ||
|
|
733216448d | ||
|
|
16dce6b3aa | ||
|
|
8d81d1df7b | ||
|
|
c6354beb92 | ||
|
|
c97ab57f51 | ||
|
|
06c783820e | ||
|
|
7fb13a5888 | ||
|
|
c6e68515ed | ||
|
|
28706f5ea5 | ||
|
|
36e4d78487 | ||
|
|
277ff7ef67 | ||
|
|
9c81c41624 | ||
|
|
a99b044555 | ||
|
|
025fafabf4 | ||
|
|
0f8825454d | ||
|
|
58fb762fac | ||
|
|
ffbdcef3b4 | ||
|
|
598312c4d3 | ||
|
|
fc82f64705 | ||
|
|
bac8c4f77c | ||
|
|
599ea0056c | ||
|
|
8e3484663b | ||
|
|
e9180f68d7 | ||
|
|
b6fbce16c0 | ||
|
|
c9d7f7757f | ||
|
|
e0b7f31111 | ||
|
|
2b2981af25 | ||
|
|
d663d0cf63 | ||
|
|
071e0db610 | ||
|
|
08a69f534e | ||
|
|
72678e31f3 | ||
|
|
e9db07bfd3 | ||
|
|
a023d893ea | ||
|
|
626e1f3451 | ||
|
|
3b369193a5 | ||
|
|
a076c751ad | ||
|
|
fb83a838fb | ||
|
|
34c2fd6177 | ||
|
|
bbfe35b8fd | ||
|
|
f6e39380af | ||
|
|
da8c9d08d8 | ||
|
|
ded7eb0bfd | ||
|
|
4228338870 | ||
|
|
4b4aac246b | ||
|
|
cdcf9096fb | ||
|
|
916c8e2cab | ||
|
|
b25ebbef95 | ||
|
|
8f56adf311 | ||
|
|
e3aeb8cfef | ||
|
|
2d69c6114b | ||
|
|
635263dc95 | ||
|
|
26ac7de70b | ||
|
|
06e013788f | ||
|
|
38485b1cf8 | ||
|
|
3c2557fb47 | ||
|
|
4716e3eb15 | ||
|
|
6159bdca45 | ||
|
|
67b97c0ed0 | ||
|
|
c67c0e3742 | ||
|
|
402039ff99 | ||
|
|
71a0510af1 | ||
|
|
9f17d7662b | ||
|
|
7bda5b1fce | ||
|
|
d3c1204626 | ||
|
|
bd359a9ad9 | ||
|
|
e46f55a2a2 | ||
|
|
8c229d4b36 | ||
|
|
1246d4360a | ||
|
|
97108fb9df | ||
|
|
98c44df9cc | ||
|
|
758a14e358 | ||
|
|
ff5a0d32d4 | ||
|
|
f600ca5a1a | ||
|
|
c8ff089707 | ||
|
|
7c4de79c8f | ||
|
|
a96e7574b2 | ||
|
|
9716e51914 | ||
|
|
022c92f775 | ||
|
|
5d24521049 | ||
|
|
9e4ad9a64f | ||
|
|
06288e3d6d | ||
|
|
ef1f011cd5 | ||
|
|
923cb3a7f2 | ||
|
|
eda8d18146 | ||
|
|
fdfa4755e9 | ||
|
|
74d45212ec | ||
|
|
ce7ae7a606 | ||
|
|
041f4e7331 | ||
|
|
618a5f0f59 | ||
|
|
55284c4681 | ||
|
|
fc9a782fb8 | ||
|
|
0112e12375 | ||
|
|
d1118e3767 | ||
|
|
5e98bedbc9 | ||
|
|
bbdab284f8 | ||
|
|
ab56758197 | ||
|
|
e9bc10a056 | ||
|
|
531ca12021 | ||
|
|
a986b58338 | ||
|
|
ecdc122b15 | ||
|
|
f2fff77aab | ||
|
|
c2bb697306 | ||
|
|
62e221ffbb | ||
|
|
58f7b1b555 | ||
|
|
206dbb9b5b | ||
|
|
804ef00d41 | ||
|
|
ac07d4a63f | ||
|
|
4d53c9aec7 | ||
|
|
a372fc5a07 | ||
|
|
03c54395cc | ||
|
|
fafdb538b3 | ||
|
|
654f2a1ad2 | ||
|
|
51cf39f4d8 | ||
|
|
e6eebe11a7 | ||
|
|
89256bfb9a | ||
|
|
4df9fae737 | ||
|
|
632f4b598b | ||
|
|
a09511d0e9 | ||
|
|
5880a650b3 | ||
|
|
0fadd84567 | ||
|
|
b8c5e2380e | ||
|
|
98f34a2f42 | ||
|
|
afc48ae331 | ||
|
|
b42161e404 | ||
|
|
ab34694d49 | ||
|
|
efdc35aaec | ||
|
|
031f5c8312 | ||
|
|
dd3013826f | ||
|
|
bc398d79cf | ||
|
|
ecc60ce540 | ||
|
|
c82125c611 | ||
|
|
732d275ec1 | ||
|
|
e51a1a93d0 | ||
|
|
f51ee02f08 | ||
|
|
a85d33fd8e | ||
|
|
1f5da1745a | ||
|
|
55930689bb | ||
|
|
9bc16aabc3 | ||
|
|
e42ea89db7 | ||
|
|
962f395831 | ||
|
|
6a251575ac | ||
|
|
29aaa8d452 | ||
|
|
bc5715254e | ||
|
|
2be29a2300 | ||
|
|
c2a1c2ca7b | ||
|
|
3f7fd9a445 | ||
|
|
5d39ec4ed3 | ||
|
|
f7a9550bb1 | ||
|
|
e0d0567f1f | ||
|
|
4ae7a32443 | ||
|
|
e41f2f73e7 | ||
|
|
d3af59ec06 | ||
|
|
91b2c99e77 | ||
|
|
4eab4670be | ||
|
|
388b61ca7a | ||
|
|
976872df35 | ||
|
|
9eb3d39558 | ||
|
|
44ac0932b3 | ||
|
|
2fe6a15f1a | ||
|
|
5b806a43e9 | ||
|
|
64ca5a623f | ||
|
|
4b2226cf04 | ||
|
|
435fa774f0 | ||
|
|
aac0852128 | ||
|
|
12143ffda7 | ||
|
|
1919e78041 | ||
|
|
e5bb00d514 | ||
|
|
61d2cc3d03 | ||
|
|
891dc2d74b | ||
|
|
f57a3b23ba | ||
|
|
7e68853e47 | ||
|
|
d2ee960d42 | ||
|
|
0cb4e687ab | ||
|
|
bf079a8945 | ||
|
|
1088248bf5 | ||
|
|
4eb3c47457 | ||
|
|
d8ade58472 | ||
|
|
fce7ee99ea | ||
|
|
6baa63a989 | ||
|
|
427aad8277 | ||
|
|
c312a2a304 | ||
|
|
607d178e94 | ||
|
|
85a5bd995f | ||
|
|
a314e59be2 | ||
|
|
c9dedde1d0 | ||
|
|
41b8d6157a | ||
|
|
6594756c5b | ||
|
|
5eba4f67e5 | ||
|
|
495ab7fd9b | ||
|
|
671b7f102e | ||
|
|
e6db0ff098 | ||
|
|
3eb68db323 | ||
|
|
abcc6539c8 | ||
|
|
10f10cadeb | ||
|
|
57eb390845 | ||
|
|
600fa16d8c | ||
|
|
69b80aff1d | ||
|
|
c3312d964f | ||
|
|
baeefe7e07 | ||
|
|
de000735ba | ||
|
|
e7279a391e | ||
|
|
c6aab372cb | ||
|
|
b5abb04c0d | ||
|
|
4a61275e80 | ||
|
|
040c99d809 | ||
|
|
9adf48821d | ||
|
|
7389369832 | ||
|
|
58cb79c95a | ||
|
|
1126837993 | ||
|
|
d6b767eb93 | ||
|
|
c6d3ffa28b | ||
|
|
9273eccbd6 | ||
|
|
2a45f52eb9 | ||
|
|
377166e491 | ||
|
|
7b6c38e85b | ||
|
|
75f6d44509 | ||
|
|
2f120d99aa | ||
|
|
ec8cbee3c8 | ||
|
|
d5b9c785fb | ||
|
|
d36faa5b7a | ||
|
|
5174f03994 | ||
|
|
12cfdafecf | ||
|
|
c760dd883d | ||
|
|
649fb544a9 | ||
|
|
4c3ca0de91 | ||
|
|
f11eef7445 | ||
|
|
26b31da443 | ||
|
|
ec44e81864 | ||
|
|
48e7b7970c | ||
|
|
d6fd1b66c6 | ||
|
|
7056f0691a | ||
|
|
5c015ccdc3 | ||
|
|
1c2c77728a | ||
|
|
103ded5145 | ||
|
|
34b3cc3286 | ||
|
|
5a2f7495c1 | ||
|
|
9a7e95f5b7 | ||
|
|
2787a1c395 | ||
|
|
3c57f7ffa7 | ||
|
|
66e7524924 | ||
|
|
a4552cf415 | ||
|
|
78bfc6501c | ||
|
|
6098bdb0b0 | ||
|
|
a33027dc39 | ||
|
|
b5215b40c3 | ||
|
|
66cf86e816 | ||
|
|
dfd2d3dc78 | ||
|
|
1890ff5bee | ||
|
|
5210fdc9d8 | ||
|
|
76895db846 | ||
|
|
79095a88a0 | ||
|
|
b3c4dd380c | ||
|
|
bf3723ae24 | ||
|
|
8e39016f12 | ||
|
|
2f48bf4fcb | ||
|
|
bf7c9fc0fd | ||
|
|
78c374dfe6 | ||
|
|
dee7dd5429 | ||
|
|
958f85eb1e | ||
|
|
04868e66bc | ||
|
|
885be348d4 | ||
|
|
89c145adde | ||
|
|
900276fe74 | ||
|
|
9965866639 | ||
|
|
3ca6595fe6 | ||
|
|
076468a922 | ||
|
|
fcb209caae | ||
|
|
b1d31b1f6b | ||
|
|
df6a3dfe28 | ||
|
|
9bb7708ffb | ||
|
|
4fe0f47a9c | ||
|
|
073bc4fde9 | ||
|
|
e400327770 | ||
|
|
1491a6d47b | ||
|
|
dca2b49624 | ||
|
|
405e46ca09 | ||
|
|
bb7fffff46 | ||
|
|
687b2e2024 | ||
|
|
a4f8cc56b8 | ||
|
|
e2a4892b1b | ||
|
|
48dfc06e49 | ||
|
|
9ebe80595a | ||
|
|
ed76278096 | ||
|
|
be7169c259 | ||
|
|
a9a66391b6 | ||
|
|
9a0f2a0084 | ||
|
|
c384b137a3 | ||
|
|
d63a133852 | ||
|
|
947568de3a | ||
|
|
737b39cdb5 | ||
|
|
a4d21c76e9 | ||
|
|
418aa14e2a | ||
|
|
1034a3056d | ||
|
|
05633ddc7e | ||
|
|
d567602d2a | ||
|
|
3c304976f7 | ||
|
|
eff9988239 | ||
|
|
d29044d034 | ||
|
|
b22174adf5 | ||
|
|
571cd172fc | ||
|
|
7f692710b3 | ||
|
|
dba94fbff3 | ||
|
|
c5c269f7ea | ||
|
|
1910547454 | ||
|
|
693948fa61 | ||
|
|
0f955937a9 | ||
|
|
35d1b31e1c | ||
|
|
8af684aa0a | ||
|
|
a015dbc4dd | ||
|
|
90cd142e76 | ||
|
|
ac5f53c538 | ||
|
|
3d1771a783 | ||
|
|
5f233ca632 | ||
|
|
930c9bdc51 | ||
|
|
301df39be4 | ||
|
|
27a27daed2 | ||
|
|
65f27b006a | ||
|
|
bdfb62d2b3 | ||
|
|
0022548e35 | ||
|
|
0a653a08bd | ||
|
|
954dd8b994 | ||
|
|
52ef2f3dae | ||
|
|
4e762d7522 | ||
|
|
4c394aec50 | ||
|
|
cd76b1fd4a | ||
|
|
b3ef018d6c | ||
|
|
5cd7ac88d6 | ||
|
|
b619444e43 | ||
|
|
57e1fe8cf0 | ||
|
|
fe9a395724 | ||
|
|
11e017b3db | ||
|
|
7124676eb5 | ||
|
|
7f14b9c5e1 | ||
|
|
65f24b4227 | ||
|
|
af66abaf57 | ||
|
|
62892105a0 | ||
|
|
526dac7a26 | ||
|
|
8fb2c78f29 | ||
|
|
709403a01f | ||
|
|
de87f83c05 | ||
|
|
ba28d08a7b | ||
|
|
87ff0696d3 | ||
|
|
565f6caa0d | ||
|
|
c9bb13f149 | ||
|
|
170a83b06f | ||
|
|
928c80cc02 | ||
|
|
418e603222 | ||
|
|
0d46b0a252 | ||
|
|
e7cb4cf6c3 | ||
|
|
648b3e9d7f | ||
|
|
1b1d549bbf | ||
|
|
0489eb8f7d | ||
|
|
0d1c9a5ac1 | ||
|
|
1594e7a792 | ||
|
|
493ba214f2 | ||
|
|
14bea94030 | ||
|
|
3937696774 | ||
|
|
7994803e8f | ||
|
|
c02a8bb3e3 | ||
|
|
9183369bdb | ||
|
|
10231363e6 | ||
|
|
4f028b1f54 | ||
|
|
7a4202b459 | ||
|
|
ffa8a4c5e2 | ||
|
|
37fc968f50 | ||
|
|
cc62988d4d | ||
|
|
42ea33d760 | ||
|
|
81f340ee16 | ||
|
|
e6fa31a4e5 | ||
|
|
3aecf817ce | ||
|
|
b14d7d6da0 | ||
|
|
0c1c38917c | ||
|
|
f756584176 | ||
|
|
cbcb8a84c5 | ||
|
|
0626529228 | ||
|
|
f42e1a96b2 | ||
|
|
4dea5911da | ||
|
|
fc304394f5 | ||
|
|
e18c043c1f | ||
|
|
1ad7d2a406 | ||
|
|
0faeb2626a | ||
|
|
c665e75871 | ||
|
|
57b60c7b2f | ||
|
|
71ada209f6 | ||
|
|
d78527ec10 | ||
|
|
6722394e34 | ||
|
|
27dcc2a7e7 | ||
|
|
39a94f8b4f | ||
|
|
2e3ae3f78b | ||
|
|
fd87e28113 | ||
|
|
306b764a5c | ||
|
|
0987bbe0fa | ||
|
|
7a2f7d81bc | ||
|
|
64ac165f03 | ||
|
|
8cea56aceb | ||
|
|
aabd5651d8 | ||
|
|
29b680ef84 | ||
|
|
89a7b9d6b5 | ||
|
|
90b7c1ffa3 | ||
|
|
be4365bbf7 | ||
|
|
f8b50ab94b | ||
|
|
bcf995b459 | ||
|
|
30957b24c4 | ||
|
|
340eabc725 | ||
|
|
d8492f99ab | ||
|
|
abe6d53c2c | ||
|
|
9a809c493a | ||
|
|
aa38b1c0e8 | ||
|
|
7dd56bbf15 | ||
|
|
061366ffec | ||
|
|
aa4e8e3507 | ||
|
|
40d8c7049c | ||
|
|
8f0ad91d96 | ||
|
|
f5e3470deb | ||
|
|
e0d812ac74 | ||
|
|
85926ae8f8 | ||
|
|
c4c73666aa | ||
|
|
fb845abf10 | ||
|
|
9dfe187202 | ||
|
|
66e53bac22 | ||
|
|
60a3e1aa42 | ||
|
|
e5e619e045 | ||
|
|
53c17ce7ab | ||
|
|
694f7675e5 | ||
|
|
74a252afcf | ||
|
|
46f593654c | ||
|
|
96f5c28059 | ||
|
|
0f6d33140a | ||
|
|
460570ed05 | ||
|
|
3e58fd4e38 | ||
|
|
4d11234ba5 | ||
|
|
76513e7b38 | ||
|
|
ac433d9651 | ||
|
|
2cc9339715 | ||
|
|
b8151f848a | ||
|
|
ca6d6f3fc7 | ||
|
|
5e98c17601 | ||
|
|
854304d0c9 | ||
|
|
bdf2bfcd12 | ||
|
|
e8798abc78 | ||
|
|
ec3fcbf5dd | ||
|
|
530a055733 | ||
|
|
acea52400a | ||
|
|
b5a4a9cf45 | ||
|
|
d1973e6e05 | ||
|
|
6008c15610 | ||
|
|
ed6a5c8ff7 | ||
|
|
d6232b4b28 | ||
|
|
ffbac43293 | ||
|
|
76208022b9 | ||
|
|
df980292cb | ||
|
|
66205c11d3 | ||
|
|
124f68125d | ||
|
|
2ee73e12b4 | ||
|
|
9896f7d52a | ||
|
|
54e9808eb9 | ||
|
|
f0bb633eee | ||
|
|
6c3f5430b7 | ||
|
|
e524c3bd79 | ||
|
|
e48b85a392 | ||
|
|
e2f95b4d48 | ||
|
|
15badf4ff9 | ||
|
|
37d2f82b6d | ||
|
|
53c0ca20a5 | ||
|
|
5d05b4ea7c | ||
|
|
2a3d4eedc8 | ||
|
|
bf51ad3c8d | ||
|
|
e7637151b9 | ||
|
|
e4af58d4b7 | ||
|
|
1ea684737a | ||
|
|
39e605df11 | ||
|
|
e7d99ff6dd | ||
|
|
9c8326fd0e | ||
|
|
30238c20b6 | ||
|
|
9a5c281a8b | ||
|
|
047962d946 | ||
|
|
7744dac423 | ||
|
|
ba7716f23d | ||
|
|
b41c932796 | ||
|
|
e0d8eff711 | ||
|
|
a734538170 | ||
|
|
f1ce12663e | ||
|
|
160d8f94a9 | ||
|
|
45702548b6 | ||
|
|
83ec4761d9 | ||
|
|
682fab24e8 | ||
|
|
199ffde283 | ||
|
|
bdd6849d83 | ||
|
|
d560ec5df7 | ||
|
|
ec82738a47 | ||
|
|
4833aaf17c | ||
|
|
b2b8549f8a | ||
|
|
3612f6dbfb | ||
|
|
6c04e7dbd6 | ||
|
|
f410ae40e7 | ||
|
|
b7b100b01a | ||
|
|
ea4886dc2b | ||
|
|
fc42849b00 | ||
|
|
188b7559d2 | ||
|
|
ae9a519263 | ||
|
|
55359c72cf | ||
|
|
9fad6c37bf | ||
|
|
1693b36b2d | ||
|
|
55879d3488 | ||
|
|
d610f8d5f6 | ||
|
|
b4d1ce33e5 | ||
|
|
9cde4d7b04 | ||
|
|
4db641372d | ||
|
|
5c83cff767 | ||
|
|
3689df4aac | ||
|
|
cbad7ee504 | ||
|
|
441127ae45 | ||
|
|
a788a99d93 | ||
|
|
430c7b8c14 | ||
|
|
83ca7a7476 | ||
|
|
2ef31d2ec3 | ||
|
|
018c641e8b | ||
|
|
78961bec49 | ||
|
|
8ee45162aa | ||
|
|
a84568574f | ||
|
|
f3c86ada45 | ||
|
|
3145cb4231 | ||
|
|
d97b080586 | ||
|
|
4f801154aa | ||
|
|
9fbedd244c | ||
|
|
8e3446c13e | ||
|
|
27d84bea5a | ||
|
|
077910bf72 | ||
|
|
455fcef114 | ||
|
|
bbc338120e | ||
|
|
d8941ea810 | ||
|
|
f1ed40adba | ||
|
|
238595e1bc | ||
|
|
222037daa9 | ||
|
|
2a3b37cbf7 | ||
|
|
2604a22772 | ||
|
|
6a65544fb7 | ||
|
|
6839f1b529 | ||
|
|
e2058f91c1 | ||
|
|
3e062a5517 | ||
|
|
b165b9a5f2 | ||
|
|
aa13953326 | ||
|
|
c482bb604c | ||
|
|
a7f4dc2f10 | ||
|
|
6a3bb455b4 | ||
|
|
ad351a1368 | ||
|
|
eb2c7c6f34 | ||
|
|
2a77078022 | ||
|
|
be73264341 | ||
|
|
59d958982f | ||
|
|
f7ca35c9b6 | ||
|
|
0641b568ee | ||
|
|
44d0198c6f | ||
|
|
c828c3acd9 | ||
|
|
b9c51792d1 | ||
|
|
b2815ad30b | ||
|
|
05aa1fc038 | ||
|
|
bce5411ea7 | ||
|
|
8ba3b71d1c | ||
|
|
8496ea7072 | ||
|
|
3484dc8f33 | ||
|
|
b5d79f42a9 | ||
|
|
74628ab04b | ||
|
|
d534dfe65b | ||
|
|
64ad07d95d | ||
|
|
3618778737 | ||
|
|
07444f0688 | ||
|
|
63a77d0235 | ||
|
|
3909481205 | ||
|
|
13f1730dda | ||
|
|
27a257f010 | ||
|
|
440f96c75b | ||
|
|
a8043e9560 | ||
|
|
668f15fab8 | ||
|
|
2a61328e7b | ||
|
|
12fce15d14 | ||
|
|
90623ed372 | ||
|
|
bbd7704e2e | ||
|
|
d9f0caeee7 | ||
|
|
29ca2f731e | ||
|
|
694b3dd629 | ||
|
|
6e59c8d749 | ||
|
|
7fe5f22770 | ||
|
|
1f059dbb5d | ||
|
|
7b38cffd85 | ||
|
|
d7ecdac6b0 | ||
|
|
e525dfffcd | ||
|
|
12a2d54f35 | ||
|
|
b77c7bba30 | ||
|
|
b0c2d6cd76 | ||
|
|
e35cde1f6c | ||
|
|
89d72da92c | ||
|
|
60fb00ff2d | ||
|
|
ebe9633665 | ||
|
|
99c4f2ccfb | ||
|
|
da5445eef9 | ||
|
|
1d55e67b00 | ||
|
|
a0b7561ed7 | ||
|
|
46b38b30d7 | ||
|
|
97d39b3336 | ||
|
|
c7c5df1190 | ||
|
|
41ed852822 | ||
|
|
c234a65a7b | ||
|
|
ae2297b0bd | ||
|
|
c46a2cd372 | ||
|
|
049342def2 | ||
|
|
a6791d41f8 | ||
|
|
096935c826 | ||
|
|
b7b1a87f23 | ||
|
|
94bdea3c69 | ||
|
|
4c1e1f0fb1 | ||
|
|
3b13713295 | ||
|
|
0207018547 | ||
|
|
b4b8d9403c | ||
|
|
2677ece123 | ||
|
|
4b23d30fa6 | ||
|
|
93a1a436a7 | ||
|
|
bad90c9848 | ||
|
|
5fa0dc8d0d | ||
|
|
fc560fe63a | ||
|
|
1248908f1f | ||
|
|
988e6227cc | ||
|
|
9ec7fa7f93 | ||
|
|
a1568be7a7 | ||
|
|
f850d0ea1b | ||
|
|
045056dc46 | ||
|
|
9e8cd4d3d7 | ||
|
|
bb7caa3c10 | ||
|
|
271838888c | ||
|
|
424d6a5af9 | ||
|
|
1076d5f1ff | ||
|
|
f9b7012389 | ||
|
|
0667519052 | ||
|
|
123acdd795 | ||
|
|
fb2ba25f23 | ||
|
|
0bc6a42192 | ||
|
|
ed5d7cd812 | ||
|
|
92bd82320b | ||
|
|
dc6eb77f43 | ||
|
|
68d96fae7e | ||
|
|
a5856da810 | ||
|
|
73ec2f0fed | ||
|
|
f86acd07a4 | ||
|
|
887bb3f718 | ||
|
|
1d3ca382aa | ||
|
|
db235a7e78 | ||
|
|
27bca4c438 | ||
|
|
7fb3828d77 | ||
|
|
cf99201b89 | ||
|
|
57e7722f59 | ||
|
|
010d56bda9 | ||
|
|
cac19ec614 | ||
|
|
7a6ac5d794 | ||
|
|
bcdc419b66 | ||
|
|
0e4c1dd75a | ||
|
|
b06918c333 | ||
|
|
7e8868ea80 | ||
|
|
c3f00069c9 | ||
|
|
cd267d0f1a | ||
|
|
a3e602a670 | ||
|
|
c64cdea754 | ||
|
|
91ee905843 | ||
|
|
53239385ae | ||
|
|
038cd30960 | ||
|
|
6dcc6dbd30 | ||
|
|
da49c64095 | ||
|
|
8cd7779b14 | ||
|
|
30fd0a397f | ||
|
|
fe242c3039 | ||
|
|
9b08cf221a | ||
|
|
0ef05ad4e3 | ||
|
|
a6ca3f211e | ||
|
|
59c8bbdf2b | ||
|
|
1b8333a7f8 | ||
|
|
0fbfb17d83 | ||
|
|
d2eef74bb8 | ||
|
|
0ecb2260e0 | ||
|
|
4c1ae55410 | ||
|
|
59d746db97 | ||
|
|
15115a51bf | ||
|
|
a3aa3fb0b5 | ||
|
|
fed7921cdf | ||
|
|
57325bc6ad | ||
|
|
a9e8076abe | ||
|
|
9abe4e8f96 | ||
|
|
cc96ae0a09 | ||
|
|
62bb9e80d9 | ||
|
|
31c9282d87 | ||
|
|
e9a365333f | ||
|
|
b200438c4e | ||
|
|
05966afe1e | ||
|
|
460d747424 | ||
|
|
a23f26f4f4 | ||
|
|
8ecd9a31c8 | ||
|
|
c7fda3447c | ||
|
|
eb5bd252db | ||
|
|
bd5fe1af10 | ||
|
|
79c1b761d4 | ||
|
|
26fe832bd9 | ||
|
|
de65d96fe2 | ||
|
|
f44fbe5687 | ||
|
|
75542ebcc3 | ||
|
|
6c4ec805dc | ||
|
|
6c738793fd | ||
|
|
5fadeadce2 | ||
|
|
942dd7f710 | ||
|
|
3159a6bf1f | ||
|
|
6ecd12d250 | ||
|
|
c69147bdc5 | ||
|
|
0c4a52558b | ||
|
|
3fc9a14015 | ||
|
|
5d2d821c6e | ||
|
|
a4f5febf38 | ||
|
|
ee3683f6ac | ||
|
|
ed8cdb9da4 | ||
|
|
ed4f97cea7 | ||
|
|
53b47455d3 | ||
|
|
af85d37307 | ||
|
|
1fc06a350b | ||
|
|
ff9e291cd7 | ||
|
|
17acb444bd | ||
|
|
d173f9f863 | ||
|
|
764a80fab2 | ||
|
|
4e908db62b | ||
|
|
b9f7326f6f | ||
|
|
28aa0b913c | ||
|
|
a172538dfc | ||
|
|
f3c5391d54 | ||
|
|
0a480066df | ||
|
|
4f5cf81212 | ||
|
|
96836065a8 | ||
|
|
77777deec5 | ||
|
|
ee58303fbb | ||
|
|
82000bfe39 | ||
|
|
cbd8ed52c7 | ||
|
|
66b873e6e5 | ||
|
|
8e7b288c00 | ||
|
|
395be18151 | ||
|
|
1fdb452c9d | ||
|
|
2802ee233c | ||
|
|
d03c6b4646 | ||
|
|
13d36ab174 | ||
|
|
ce782a37f7 | ||
|
|
7a6465303d | ||
|
|
8590bff6e4 | ||
|
|
d29d4ba110 | ||
|
|
f978eb49f4 | ||
|
|
3e13d5ae1f | ||
|
|
cffc63a29e | ||
|
|
43955d680a | ||
|
|
baa1307870 | ||
|
|
fb565aeb2a | ||
|
|
27286fce24 | ||
|
|
9b10f59162 | ||
|
|
ad3438b859 | ||
|
|
61cb9ac524 | ||
|
|
55a4798ac3 | ||
|
|
f85b30c967 | ||
|
|
abf0ecebaf | ||
|
|
49bb7c879e | ||
|
|
afd4748426 | ||
|
|
f8cb63b11a | ||
|
|
8a3f9c7e4e | ||
|
|
2abd37c131 | ||
|
|
67b940aec9 | ||
|
|
c267933fb8 | ||
|
|
ac7cef2fd9 | ||
|
|
00185ef936 | ||
|
|
9e1dd7aa26 | ||
|
|
6afd3eb869 | ||
|
|
5b8ae1be2e | ||
|
|
c7caa53b52 | ||
|
|
5f80563e49 | ||
|
|
cc7eb92550 | ||
|
|
98c61bf819 | ||
|
|
b083bd534b | ||
|
|
6aca0cd874 | ||
|
|
ee75f0e92d | ||
|
|
63f3f83fa3 | ||
|
|
c8911b901e | ||
|
|
410f8fed76 | ||
|
|
5b3285c006 | ||
|
|
5704c21d56 | ||
|
|
c2e25e6d0d | ||
|
|
05dc569a6f | ||
|
|
3d3684daeb | ||
|
|
d6c9ce071c | ||
|
|
accfee4c50 | ||
|
|
57f03b21fc | ||
|
|
fc8dc74de4 | ||
|
|
d83a50d36a | ||
|
|
53c277b420 | ||
|
|
3be28131c9 | ||
|
|
f3f4dcd84a | ||
|
|
e4f61b3ad8 | ||
|
|
9ca7ca5ce6 | ||
|
|
381dafc7b9 | ||
|
|
69adce5c02 | ||
|
|
d0c6c7e6de | ||
|
|
e2cc939260 | ||
|
|
702618b924 | ||
|
|
d93fafcf57 | ||
|
|
f93521395c | ||
|
|
9977759f85 | ||
|
|
efc470ff4c | ||
|
|
d7567f4b97 | ||
|
|
c29d7c6e5b | ||
|
|
4b36c27e33 | ||
|
|
55ba6786b3 | ||
|
|
3165912837 | ||
|
|
44320838a0 | ||
|
|
cedf5ac7d0 | ||
|
|
1946250cea | ||
|
|
4378b28777 | ||
|
|
77a3c103d1 | ||
|
|
e1956f8d80 | ||
|
|
36d19ea284 | ||
|
|
744976e8a1 | ||
|
|
d8d6dada5e | ||
|
|
58c762d9e8 | ||
|
|
3c4f9ced11 | ||
|
|
938093db6f | ||
|
|
b4bf9bfaee | ||
|
|
f3427c7470 | ||
|
|
3919e6404c | ||
|
|
775894ee0d | ||
|
|
a4a3c96228 | ||
|
|
471458fda3 | ||
|
|
b8e97164c8 | ||
|
|
974fa8e210 | ||
|
|
6525f3b854 | ||
|
|
984e8a5b2c | ||
|
|
fd9a7217e9 | ||
|
|
b1080e5fe5 | ||
|
|
2b77da369d | ||
|
|
8f3e1a3eb0 | ||
|
|
a2a58e925b | ||
|
|
9043291b8d | ||
|
|
4af9dfa36d | ||
|
|
72160bf806 | ||
|
|
bc85c3be59 | ||
|
|
e3d400c70d | ||
|
|
0edb028bbf | ||
|
|
cc7f69b908 | ||
|
|
1d5a60ef9e | ||
|
|
7000ba1630 | ||
|
|
026c7d391b | ||
|
|
a1876c065e | ||
|
|
d991c82693 | ||
|
|
1ed9f9819a | ||
|
|
7db6bd3fc4 | ||
|
|
47dfdfbffe | ||
|
|
17a75d3b2a | ||
|
|
381dd305c1 | ||
|
|
a0980b0fbd | ||
|
|
ad293a8f40 | ||
|
|
0b77c5c319 | ||
|
|
48834eb8b4 | ||
|
|
7b68e271c8 | ||
|
|
a1c8b8e5de | ||
|
|
b616ffaf1f | ||
|
|
8c37bd87d6 | ||
|
|
98f31ff491 | ||
|
|
d201f2c31c | ||
|
|
b45be228d2 | ||
|
|
99a9a87a56 | ||
|
|
c85035b58e | ||
|
|
f923904a0e | ||
|
|
eceb3ed877 | ||
|
|
0a05c87c9c | ||
|
|
ec51aecad6 | ||
|
|
c21fec9e1d | ||
|
|
6886b22360 | ||
|
|
54e93c1ed6 | ||
|
|
d64f72351d | ||
|
|
34fc5a5bcf | ||
|
|
93cba698e4 | ||
|
|
93dbf789d0 | ||
|
|
d59466123b | ||
|
|
1d0ef774e6 | ||
|
|
68c572bd6e | ||
|
|
54e8f85def | ||
|
|
80d7410c15 | ||
|
|
837d64dfdb | ||
|
|
db735bc454 | ||
|
|
2f4abb22f8 | ||
|
|
679cf70269 | ||
|
|
3b5c5666b3 | ||
|
|
bfa7950d6a | ||
|
|
89b9492f39 | ||
|
|
8bf3822e54 | ||
|
|
9f3f41f39e | ||
|
|
8d50e5ecb9 | ||
|
|
3093a82a9f | ||
|
|
eae881c35a | ||
|
|
c9f6d64b44 | ||
|
|
f542dfb07c | ||
|
|
c604ec9c6d | ||
|
|
9adddace83 | ||
|
|
f53350a699 | ||
|
|
4834b9d491 | ||
|
|
c556e095e0 | ||
|
|
57bb282dbc | ||
|
|
d3e4876511 | ||
|
|
05c5151c38 | ||
|
|
3fc9b8e62c | ||
|
|
0cd5f3c3a3 | ||
|
|
b660c8055f | ||
|
|
677f49aed5 | ||
|
|
68bb791c96 | ||
|
|
3a695618c1 | ||
|
|
db83f09b19 | ||
|
|
824c371d92 | ||
|
|
f2e84c0256 | ||
|
|
f475709b08 | ||
|
|
3628035884 | ||
|
|
2b119ddb93 | ||
|
|
08d4fbbecd | ||
|
|
f0baa16cde | ||
|
|
c4c0d4a007 | ||
|
|
72fc940cd7 | ||
|
|
2dff4c14f9 | ||
|
|
f14c67a444 | ||
|
|
6e93985fe2 | ||
|
|
816c0ee703 | ||
|
|
89a3d1d32a | ||
|
|
b44ccc3d0d | ||
|
|
a82d963998 | ||
|
|
ad3bce178c | ||
|
|
fea83c5bbc | ||
|
|
c5ed81c130 | ||
|
|
6ea647822f | ||
|
|
02f28b1ac0 | ||
|
|
da8fa6f91c | ||
|
|
51026cc55e | ||
|
|
bd4a48c42c | ||
|
|
63a7bb0b86 | ||
|
|
273f94e9b6 | ||
|
|
13bb415187 |
10
.dockerignore
Normal file
10
.dockerignore
Normal file
@@ -0,0 +1,10 @@
|
||||
.git
|
||||
.gitignore
|
||||
HISTORY.md
|
||||
mayan/media
|
||||
db.sqlite*
|
||||
docker
|
||||
!docker/rootfs
|
||||
./.*
|
||||
docs
|
||||
|
||||
31
.drone.yml
Normal file
31
.drone.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: docker
|
||||
image: plugins/docker
|
||||
settings:
|
||||
registry: registry.d1v3.de
|
||||
repo: registry.d1v3.de/mayan-edms
|
||||
username:
|
||||
from_secret: docker_username
|
||||
password:
|
||||
from_secret: docker_password
|
||||
dockerfile: docker/Dockerfile
|
||||
tags: latest
|
||||
auto_tag: true
|
||||
|
||||
|
||||
---
|
||||
kind: secret
|
||||
name: docker_username
|
||||
get:
|
||||
path: kv/data/drone/docker
|
||||
name: username
|
||||
---
|
||||
|
||||
kind: secret
|
||||
name: docker_password
|
||||
get:
|
||||
path: kv/data/drone/docker
|
||||
name: token
|
||||
3
.flake8
3
.flake8
@@ -1,2 +1,3 @@
|
||||
[flake8]
|
||||
ignore = E501
|
||||
exclude = node_modules,static,templates
|
||||
ignore = E501, N801, N802, N804, N805, N806
|
||||
|
||||
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
custom: https://www.mayan-edms.com/donation/
|
||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -7,6 +7,7 @@
|
||||
.coverage
|
||||
.coverage.tox*
|
||||
.idea/
|
||||
*.swp
|
||||
.tox/
|
||||
.vagrant
|
||||
_build/
|
||||
@@ -27,4 +28,10 @@ static_collected/
|
||||
/misc/mayan.geany
|
||||
/mayan/media/static/
|
||||
/venv/
|
||||
/venv3/
|
||||
/whoosh_index/
|
||||
google_fonts/
|
||||
node_modules/
|
||||
docs/build/
|
||||
docs/_templates/layout.html
|
||||
docs/_templates/footer.html
|
||||
|
||||
260
.gitlab-ci.yml
260
.gitlab-ci.yml
@@ -1,41 +1,233 @@
|
||||
image: ubuntu:16.10
|
||||
services:
|
||||
- mysql:latest
|
||||
- postgres
|
||||
before_script:
|
||||
- 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
|
||||
- apt-get update -qq
|
||||
- apt-get install -qq curl graphviz python-dev python-pip gcc gnupg1 tesseract-ocr tesseract-ocr-deu ghostscript libjpeg-dev libpng-dev libtiff-dev poppler-utils libreoffice
|
||||
variables:
|
||||
POSTGRES_DB: "mayan_edms"
|
||||
POSTGRES_PASSWORD: "postgres"
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
|
||||
MYSQL_DATABASE: "mayan_edms"
|
||||
test:mysql:
|
||||
stages:
|
||||
- test
|
||||
- build_python
|
||||
- build_docker
|
||||
- build_documentation
|
||||
- push_python
|
||||
- push_docker
|
||||
- push_documentation
|
||||
- deploy
|
||||
|
||||
job_docker_build:
|
||||
stage: build_docker
|
||||
image: docker:latest
|
||||
services:
|
||||
- docker:dind
|
||||
before_script:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
script:
|
||||
- apt-get install -qq libmysqlclient-dev
|
||||
- pip install -r requirements/testing.txt
|
||||
- pip install mysql-python
|
||||
- apt-get install -qq mysql-client
|
||||
- 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;"
|
||||
- coverage run manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
|
||||
- codecov
|
||||
- docker build --pull -t "$CI_REGISTRY_IMAGE" -f docker/Dockerfile .
|
||||
- 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"
|
||||
- docker push "$CI_REGISTRY_IMAGE:latest"
|
||||
- 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
|
||||
- docker logout
|
||||
only:
|
||||
- releases/all
|
||||
- releases/docker
|
||||
|
||||
job_docker_push:
|
||||
stage: push_docker
|
||||
image: docker:latest
|
||||
services:
|
||||
- docker:dind
|
||||
before_script:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
script:
|
||||
- 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
|
||||
- docker logout
|
||||
- docker login -u "$DOCKER_HUB_USERNAME" -p "$DOCKER_HUB_PASSWORD" https://registry-1.docker.io
|
||||
- docker push registry-1.docker.io/mayanedms/mayanedms:"$VERSION"
|
||||
- docker push registry-1.docker.io/mayanedms/mayanedms:latest
|
||||
only:
|
||||
- releases/all
|
||||
- releases/docker
|
||||
|
||||
job_docker_nightly:
|
||||
stage: build_docker
|
||||
image: docker:latest
|
||||
services:
|
||||
- docker:dind
|
||||
before_script:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
script:
|
||||
- docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" -f docker/Dockerfile .
|
||||
- docker run --rm "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" run_tests
|
||||
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
|
||||
only:
|
||||
- nightly
|
||||
- staging
|
||||
|
||||
job_documentation_build:
|
||||
stage: build_documentation
|
||||
image: ubuntu:18.04
|
||||
artifacts:
|
||||
expire_in: 1 hr
|
||||
paths:
|
||||
- docs
|
||||
before_script:
|
||||
- apt-get -qq update
|
||||
- apt-get install -qq locales make python-pip enchant
|
||||
- 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
|
||||
script:
|
||||
- pip install -r requirements/documentation.txt
|
||||
- cd docs
|
||||
- make html
|
||||
only:
|
||||
- releases/all
|
||||
- releases/documentation
|
||||
|
||||
job_documentation_push:
|
||||
stage: push_documentation
|
||||
image: ubuntu:18.04
|
||||
before_script:
|
||||
- mkdir -p ~/.ssh
|
||||
- chmod 700 ~/.ssh
|
||||
- echo "$DOCUMENTATION_SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client rsync -y )'
|
||||
- eval $(ssh-agent -s)
|
||||
- echo "$DOCUMENTATION_SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
|
||||
script:
|
||||
- rsync -avzP --progress -e ssh docs/_build/html/* mayandocs@docs.mayan-edms.com:/home/rosarior/webapps/mayan_docs
|
||||
only:
|
||||
- releases/all
|
||||
- releases/documentation
|
||||
|
||||
job_build_python:
|
||||
stage: build_python
|
||||
image: ubuntu:18.04
|
||||
artifacts:
|
||||
expire_in: 1 hr
|
||||
paths:
|
||||
- dist
|
||||
before_script:
|
||||
- apt-get -qq update
|
||||
- apt-get install -qq locales make python-pip
|
||||
script:
|
||||
- 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
|
||||
- pip install -r requirements/build.txt
|
||||
- make python-wheel
|
||||
only:
|
||||
- releases/all
|
||||
- releases/python
|
||||
|
||||
job_push_python:
|
||||
stage: push_python
|
||||
image: ubuntu:18.04
|
||||
before_script:
|
||||
- apt-get -qq update
|
||||
- apt-get install -qq python-pip
|
||||
script:
|
||||
- pip install -r requirements/build.txt
|
||||
- echo "$PYPIRC" > ~/.pypirc
|
||||
- twine upload dist/* -r pypi
|
||||
only:
|
||||
- releases/all
|
||||
- releases/python
|
||||
|
||||
.test_base: &test_base
|
||||
stage: test
|
||||
image: ubuntu:18.04
|
||||
cache:
|
||||
paths:
|
||||
- ~/.cache/pip/
|
||||
- /var/cache/apt/archives/
|
||||
before_script:
|
||||
- apt-get -qq update
|
||||
- apt-get install -qq locales
|
||||
- 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
|
||||
- apt-get install -qq curl exiftool firefox-geckodriver gcc ghostscript gnupg1 graphviz libfuse2 libjpeg-dev libmagic1 libpng-dev libtiff-dev poppler-utils libreoffice poppler-utils python-dev python-virtualenv python3-dev tesseract-ocr tesseract-ocr-deu
|
||||
- virtualenv venv -p /usr/bin/python3
|
||||
- . venv/bin/activate
|
||||
- pip install -r requirements.txt -r requirements/testing-base.txt
|
||||
only:
|
||||
- releases/all
|
||||
- releases/docker
|
||||
- releases/python
|
||||
- staging
|
||||
- nightly
|
||||
|
||||
test-mysql:
|
||||
<<: *test_base
|
||||
variables:
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
|
||||
MYSQL_DATABASE: "mayan_edms"
|
||||
services:
|
||||
- mysql:8.0.3
|
||||
script:
|
||||
- apt-get install -qq libmysqlclient-dev libssl-dev mysql-client
|
||||
- . venv/bin/activate
|
||||
- set -a && . ./config.env && set +a
|
||||
- pip install mysqlclient==$PYTHON_MYSQL_VERSION
|
||||
- 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:
|
||||
- mysql
|
||||
test:postgres:
|
||||
|
||||
test-postgres:
|
||||
<<: *test_base
|
||||
variables:
|
||||
POSTGRES_DB: "mayan_edms"
|
||||
POSTGRES_PASSWORD: "postgres"
|
||||
services:
|
||||
- postgres
|
||||
script:
|
||||
- apt-get install -qq libpq-dev
|
||||
- pip install -r requirements/testing.txt
|
||||
- pip install psycopg2
|
||||
- coverage run manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_postgres --nomigrations
|
||||
- codecov
|
||||
- apt-get install -qq libpq-dev
|
||||
- . venv/bin/activate
|
||||
- set -a && . ./config.env && set +a
|
||||
- pip install psycopg2==$PYTHON_PSYCOPG2_VERSION
|
||||
- python manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_postgres --nomigrations
|
||||
tags:
|
||||
- postgres
|
||||
test:sqlite:
|
||||
|
||||
test-sqlite:
|
||||
<<: *test_base
|
||||
script:
|
||||
- pip install -r requirements/testing.txt
|
||||
- coverage run manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci --nomigrations
|
||||
- codecov
|
||||
- . venv/bin/activate
|
||||
- python manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci --nomigrations
|
||||
|
||||
deploy_demo:
|
||||
environment:
|
||||
name: demo
|
||||
stage: deploy
|
||||
before_script:
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "${DEMO_SSH_KNOWN_HOST}" > ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- echo "${DEMO_PRIVATE_KEY}" > ~/.ssh/id_rsa
|
||||
- chmod 600 ~/.ssh/id_rsa
|
||||
script:
|
||||
- scp contrib/scripts/install/docker.sh root@$DEMO_IP_ADDRESS:~
|
||||
- ssh root@$DEMO_IP_ADDRESS "DELETE_VOLUMES=true ./docker.sh"
|
||||
when: manual
|
||||
|
||||
deploy_staging:
|
||||
environment:
|
||||
name: staging
|
||||
stage: deploy
|
||||
before_script:
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "${STAGING_SSH_KNOWN_HOST}" > ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- echo "${STAGING_PRIVATE_KEY}" > ~/.ssh/id_rsa
|
||||
- chmod 600 ~/.ssh/id_rsa
|
||||
script:
|
||||
- scp contrib/scripts/install/docker.sh root@$STAGING_IP_ADDRESS:~
|
||||
- ssh root@$STAGING_IP_ADDRESS "DOCKER_MAYAN_IMAGE=registry.gitlab.com/mayan-edms/mayan-edms:staging ./docker.sh"
|
||||
when: manual
|
||||
|
||||
61
.tx/config
61
.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,18 @@ source_lang = en
|
||||
source_file = mayan/apps/events/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.file_caching-3-0]
|
||||
file_filter = mayan/apps/file_caching/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/file_caching/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 +175,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
|
||||
@@ -187,8 +223,21 @@ source_lang = en
|
||||
source_file = mayan/apps/task_manager/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.templating-3-0]
|
||||
file_filter = mayan/apps/templating/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/templating/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.user_management-2-0]
|
||||
file_filter = mayan/apps/user_management/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/user_management/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.web_link-3-0]
|
||||
file_filter = mayan/apps/web_links/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/web_links/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
|
||||
@@ -4,25 +4,30 @@ Contributing to Mayan EDMS
|
||||
Issues
|
||||
------
|
||||
|
||||
- Before submitting a new issue, check for **open issues** first and join the
|
||||
discussion.
|
||||
- The issue system is for reporting problems with the program code. For
|
||||
questions use the forum at: https://forum.mayan-edms.com/
|
||||
- Do not open issues asking for **support or consulting**. For paid support
|
||||
and consultation visit: https://www.mayan-edms.com/support/
|
||||
- The issue must be related to the code only, do not open issues for problems
|
||||
with databases, deployments, webservers, cloud providers, etc.
|
||||
- Before submitting a new issue, check for **existing issues** first and
|
||||
join the discussion.
|
||||
- If your issue is not attended in a while, **be patient**, the core team is
|
||||
small and the codebase big.
|
||||
- Try to reproduce the issue using a **separate, clean installation**, sometimes
|
||||
the issue can be caused by an error in a configuration file and not with the
|
||||
code itself.
|
||||
- **Do not upload** sensitive, private or classified information or files with
|
||||
your issue. If the issue is triggered by a user file, create a dummy file with the
|
||||
same properties that can trigger the issue and upload that file instead.
|
||||
- Try to reproduce the issue using a **separate, clean installation**,
|
||||
sometimes the issue can be caused by an error in a configuration file and
|
||||
not with the code itself.
|
||||
- **Do not upload** sensitive, private or classified information or files
|
||||
with your issue. If the issue is triggered by a user file, create a dummy
|
||||
file with the same properties that can trigger the issue and upload that
|
||||
file instead.
|
||||
- Add steps that trigger the issue in a **repeatable manner**.
|
||||
- **Screenshots** go a long way in helping understand problems.
|
||||
- The issue must be related to the code only, do not open issues for problems
|
||||
with deployments, webservers, cloud providers, etc.
|
||||
- Do not open issues asking for **support or consulting**.
|
||||
|
||||
Code
|
||||
----
|
||||
|
||||
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:
|
||||
@@ -74,5 +79,5 @@ translation. Language teams that don't see activity for a while are deleted.
|
||||
|
||||
Code style
|
||||
----------
|
||||
- Refer to the [Development](http://mayan.readthedocs.io/en/latest/topics/development.html)
|
||||
- Refer to the [Development](https://docs.mayan-edms.com/topics/development.html)
|
||||
chapter for information and examples of the code style.
|
||||
|
||||
1955
HISTORY.rst
1955
HISTORY.rst
File diff suppressed because it is too large
Load Diff
60
HISTORY_1_x.rst
Normal file
60
HISTORY_1_x.rst
Normal file
@@ -0,0 +1,60 @@
|
||||
1.1.1 (2015-05-21)
|
||||
==================
|
||||
|
||||
- Update to Django 1.6.11
|
||||
- Fix make_dist.sh script
|
||||
- Add test for issue #163
|
||||
- Activate tests for the sources app
|
||||
- Removal of the registration app
|
||||
- New simplified official project description
|
||||
- Improvements to the index admin interface
|
||||
- Removal of installation statistics gathering
|
||||
- Remove unused folder tag
|
||||
- Fix usage of ugettext to ugettext_lazy
|
||||
- Increase size of the lock name field
|
||||
- New style documentation
|
||||
|
||||
|
||||
1.1 (2015-02-10)
|
||||
================
|
||||
- Uses Celery for background tasks
|
||||
- Removal of the splash screen
|
||||
- Adds a home view with common function buttons
|
||||
- Support for sending and receiving documents via email
|
||||
- Removed custom logging app in favor of django-actvity-stream
|
||||
- Adds watch folders
|
||||
- Includes Vagrant file for unified development and testing environments
|
||||
- Per user locale profile (language and timezone)
|
||||
- Includes news document workflow app
|
||||
- Optional and required metadata types
|
||||
- Improved testings. Automated tests against SQLite, MySQL, PostgreSQL
|
||||
- Many new REST API endpoints added
|
||||
- Simplified text messages
|
||||
- Improved method for custom settings
|
||||
- Addition of CORS support to the REST API
|
||||
- Per document language setting instead of per installation language setting
|
||||
- Metadata validation and parsing support
|
||||
- Start of code updates towards Python 3 support
|
||||
- Simplified UI
|
||||
- Stable PDF previews generation
|
||||
- More technical documentation
|
||||
|
||||
|
||||
1.0 (2014-08-27)
|
||||
================
|
||||
- New home @ https://github.com/mayan-edms/mayan-edms
|
||||
- Updated to use Django 1.6
|
||||
- Translation updates
|
||||
- Custom model properties removal
|
||||
- Source code improvements
|
||||
- Removal of included 3rd party modules
|
||||
- Automatic testing and code coverage check
|
||||
- Update of required modules and libraries versions
|
||||
- Database connection leaks fixes
|
||||
- Support for deletion of detached signatures
|
||||
- Removal of Fabric based installations script
|
||||
- Pluggable OCR backends
|
||||
- OCR improvements
|
||||
- License change, Mayan EDMS in now licensed under the Apache 2.0 License
|
||||
- PyPI package, Mayan EDMS in now available on PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
- New REST API
|
||||
435
HISTORY_2_x.rst
Normal file
435
HISTORY_2_x.rst
Normal file
@@ -0,0 +1,435 @@
|
||||
2.7.3 (2017-09-11)
|
||||
==================
|
||||
- Fix task manager queue list view. Thanks to LeVon Smoker for
|
||||
the report.
|
||||
- Fix resolved link class URL mangling when the keep_query argument is
|
||||
used. Thanks to Nick Douma (LordGaav) for the report and diagnostic
|
||||
information. Fixes source navigation on the document upload wizard.
|
||||
|
||||
2.7.2 (2017-09-06)
|
||||
==================
|
||||
- Fix new mailer creation view. GitLab issue #431.
|
||||
Thanks to Robert Schöftner (@robert.schoeftner) for the
|
||||
report and the solution.
|
||||
- Consolidate intial document created event and the first
|
||||
document properties edited events. Preserve the user that
|
||||
initially creates the document. GitLab issue #433. Thanks
|
||||
to Jesaja Everling (@jeverling) for the report.
|
||||
- Sort the list of root cabinets. Thanks to Thomas Plotkowiak
|
||||
for the request.
|
||||
- Sort the list of a document's cabinets.
|
||||
- Display a document's cabinet list in italics. GitLab issue #435.
|
||||
Thanks to LeVon Smoker for the request.
|
||||
- Install mock by default to allow easier testing of deployed
|
||||
instances.
|
||||
|
||||
2.7.1 (2017-09-03)
|
||||
==================
|
||||
- Support unicode in URL querystring. GitLab issue #423.
|
||||
Thanks to Gustavo Teixeira (@gsteixei) for the find.
|
||||
- Import errors during initialization are only ignored
|
||||
if they are cause by a missing local.py. Thanks to
|
||||
MacRobb Simpson for the report and solution.
|
||||
- Make sure the local.py created used unicode for strings
|
||||
by default. GitLab issue #424. Thanks to Gustavo Teixeira
|
||||
(@gsteixei) for the find.
|
||||
|
||||
2.7 (2017-08-30)
|
||||
================
|
||||
- Add workaround for PDF with IndirectObject as the
|
||||
rotation value. GitHub #261.
|
||||
- Add ACL list link with icon and use it for the document facet menu.
|
||||
- Fix mailing app permissions labels.
|
||||
- Add ACLs link and ACLs permissions to the mailer profile model.
|
||||
- Improve mailer URL regex.
|
||||
- Add ordering support to the SourceColumn class. GitLab issue #417.
|
||||
- Shows the cabinets in the document list. GitLab #417 @corneliusludmann
|
||||
- Add workaround for pycountry versions without the bibliographical key.
|
||||
GitHub issue #250.
|
||||
- Skip UUID migration on Oracle backends. GitHub issue #251.
|
||||
- Allow changing the output format, DPI of the pdftoppm command, and
|
||||
the output format of the converter via the CONVERTER_GRAPHICS_BACKEND_CONFIG
|
||||
setting. GitHub issues #256 #257 GitLab issue #416.
|
||||
- Add support for workflow triggers.
|
||||
- Add support for workflow actions.
|
||||
- Add support for rendering workflows.
|
||||
- Add support for unbinding sub menus.
|
||||
- Fix mailing profile test view.
|
||||
- Disregard the last 3 dots that mark the end of the YAML document.
|
||||
- Add support for multiple dashboards.
|
||||
- Add support for removing dashboard widgets.
|
||||
- Convert document version view to item list view.
|
||||
- Add support for browsing individual document versions.
|
||||
- Add support for dropdown menus to the item list view template.
|
||||
- Add support for preserving the file extension when downloading a document
|
||||
version. GitLab #415.
|
||||
- Split OCR app into OCR and parsing.
|
||||
- Remove Folders app.
|
||||
- Use the literal 'System' instead of the target name when
|
||||
the action user in unknown.
|
||||
- Remove the view to submit all document for OCR.
|
||||
- When changing document types, don't delete the old metadata that is
|
||||
also found in the new document type. GitLab issue #421.
|
||||
- Add tag attach and tag remove events.
|
||||
- Change the permission needed to attach and remove tags.
|
||||
- Add HTTP POST workflow state action.
|
||||
- Add access control grant workflow state action.
|
||||
- Beta Python 3 support.
|
||||
|
||||
2.6.4 (2017-07-26)
|
||||
==================
|
||||
- Add missing replacements of reverse to resolve_url.
|
||||
|
||||
2.6.3 (2017-07-25)
|
||||
==================
|
||||
- Add makefile target to launch a PostgreSQL container.
|
||||
- Use resolve_url instead of redirect to resolve the post login URL.
|
||||
- Make the intialsetup and performupgrade management tasks work
|
||||
with signals to allow customization from 3rd party apps.
|
||||
- PEP8 cleanups.
|
||||
- Add tag_ids keyword argument to the Source.handle_upload
|
||||
model method. GitLab issue #413.
|
||||
- Add overflow wrapping so wrap long titles in Firefox too.
|
||||
- Makes Roles searchable. GitLab issue #402.
|
||||
- Add line numbers to the debug and production loggers.
|
||||
Add date and time to the production logger.
|
||||
- Add support for generating setup.py from a template. GitLab
|
||||
#149 #200.
|
||||
- Add fade in animation to document images.
|
||||
|
||||
2.6.2 (2017-07-19)
|
||||
==================
|
||||
- Fix deprecation warning to prepare upgrade to Django 1.11 and 2.0.
|
||||
- Fix document page zoom.
|
||||
- Add support to run tests against a MySQL, Postgres or Oracle container.
|
||||
- Improve tag widget customization by moving the markup to its own template.
|
||||
- Fix document page widget appearance in the document page list view.
|
||||
- Make document version order deterministic.
|
||||
- Allow total page number instrospection of encrypted PDF with non ASCII user properties. GitLab issue #411.
|
||||
- Oracle database compatibility update in the cabinets app. GitHub #258.
|
||||
|
||||
2.6.1 (2017-07-18)
|
||||
==================
|
||||
- Fix issue when editing or removing metadata from multiple documents.
|
||||
|
||||
2.6 (2017-07-18)
|
||||
================
|
||||
- Fix HTML mark up in window title. GitLab #397.
|
||||
- Add support for emailing documents to a recipient list. GitLab #396.
|
||||
- Backport metadata widget changes from @Macrobb. GitLab #377.
|
||||
- Make users and group searchable.
|
||||
- Add support for logging errors during in production mode.
|
||||
Add COMMON_PRODUCTION_ERROR_LOG_PATH to control path of log file.
|
||||
Defaults to mayan/error.log.
|
||||
- Add support logging request exceptions.
|
||||
- Add document list item view.
|
||||
- Sort setting by namespace label and by global name second.
|
||||
- Sort indexes by label.
|
||||
- Fix cabinets permission and access control checking.
|
||||
- The permission to add or remove documents to cabinets now applies to documents too.
|
||||
- Equalize dashboard widgets heights.
|
||||
- Switch the order of the DEFAULT_AUTHENTICATION_CLASSES of DRF. GitLab #400.
|
||||
- Backport document's version list view permission.
|
||||
- Improve code to unbind menu entries.
|
||||
- Renamed the document type permission namespace from "Document setup" to "Document types".
|
||||
- Add support for granting the document type edit, document type delete, and document type view
|
||||
permissions to individual document type instances.
|
||||
- Improved tests by testing for accesses.
|
||||
- Increase the size of the mailing profile label field to 128 characters.
|
||||
|
||||
2.5.2 (2017-07-08)
|
||||
==================
|
||||
- Improve new document creation signal handling.
|
||||
Fixes issue with duplicate scanning at upload.
|
||||
|
||||
2.5.1 (2017-07-08)
|
||||
==================
|
||||
- Update release target due to changes in PyPI.
|
||||
|
||||
2.5 (2017-07-07)
|
||||
================
|
||||
- Add view to download a document's OCR text. GitLab #215
|
||||
- Add user configurable mailer. GitLab #286.
|
||||
- Use Toasts library for screen messages.
|
||||
- Reduce verbosity of some debug messages.
|
||||
- Add new lineart transformation.
|
||||
- Fix SANE source resolution field.
|
||||
- About and Profile menu reorganization.
|
||||
- PDF compatibility improvements.
|
||||
- Office document coversion improvements.
|
||||
- New metadata type setup UI.
|
||||
- Duplicated document scan support.
|
||||
- "Remember me" login support.
|
||||
- Forgotten password restore via email.
|
||||
- Document cache disabling.
|
||||
- Translation improvements.
|
||||
- Image loading improvements.
|
||||
- Lower JavaScript memory utilization.
|
||||
- HTML reponsive layout improvements.
|
||||
- Make document deletion a background task.
|
||||
- Unicode handling improvements.
|
||||
- Python3 compatilibyt improvements.
|
||||
- New screen messages using Toastr.
|
||||
|
||||
2.4 (2017-06-23)
|
||||
================
|
||||
- Add Django-mathfilters.
|
||||
- Improve render of documents with no pages.
|
||||
- Add SANE scanner document source.
|
||||
- Added PDF orientation detection. GitLab issue #387.
|
||||
- Fix repeated permission list API URL. GitLab issue #389.
|
||||
- Fix role creation API endpoint not returning id. GitLab issue #390.
|
||||
- Make tags, metadata types and cabinets searchable via the dynamic search API. GitLab issue #344.
|
||||
- Add support for updating configuration options from environment variables.
|
||||
- Add purgelocks management command. GitLab issue #221.
|
||||
- Fix index rebuilding for multi value first levels. GitLab issue #391.
|
||||
- Truncate views titles via the APPEARANCE_MAXIMUM_TITLE_LENGTH setting. GitLab issue #217.
|
||||
- Add background task manager app. GitLab issue #132.
|
||||
- Add link to show a document's OCR errors. GitLab issue #291.
|
||||
|
||||
2.3 (2017-06-08)
|
||||
================
|
||||
- Allow for bigger indexing expression templates.
|
||||
- Auto select checkbox when updating metadata values. GitLab issue #371.
|
||||
- Added support for passing the options allow-other and allow-root to the
|
||||
FUSE index mirror. GitLab issue #385
|
||||
- Add support for check for the latest released version of Mayan from the
|
||||
About menu.
|
||||
- Support for rebuilding specific indexes. GitLab issue #372.
|
||||
- Rewrite document indexing code to be faster and use less locking.
|
||||
- Use a predefined file path for the file lock.
|
||||
- Catch documents with not document version when displaying their thumbnails.
|
||||
- Document page navigation fix when using Mayan as a sub URL app.
|
||||
- Add support for indexing on workflow state changes.
|
||||
- Add search model list API endpoint.
|
||||
|
||||
2.2 (2017-04-26)
|
||||
================
|
||||
- Remove the installation app (GitLab #301).
|
||||
- Add support for document page search
|
||||
- Remove recent searches feature
|
||||
- Remove dependency on the django-filetransfer library
|
||||
- Fix height calculation in resize transformation
|
||||
- Improve upgrade instructions
|
||||
- New image caching pipeline
|
||||
- New drop down menus for the documents, folders and tags app as well as for
|
||||
the user links.
|
||||
- New Dashboard view
|
||||
- Moved licenses to their own module in every app
|
||||
- Update project to work with Django 1.10.4.
|
||||
- Tags are alphabetically ordered by label (GitLab #342).
|
||||
- Stop loading theme fonts from the web (GitLab #343).
|
||||
- Add support for attaching multiple tags (GitLab #307).
|
||||
- Integrate the Cabinets app.
|
||||
|
||||
2.1.11 (2017-03-14)
|
||||
===================
|
||||
- Added a quick rename serializer to the document type API serializer.
|
||||
- Added per document type, workflow list API view.
|
||||
- Mayan EDMS was adopted a version 1.1 of the Linux Foundation Developer Certificate of Origin.
|
||||
- Added the detail url of a permission in the permission serializer.
|
||||
- Added endpoints for the ACL app API.
|
||||
- Implemented document workflows transition ACLs. GitLab issue #321.
|
||||
- Add document comments API endpoints. GitHub issue #249.
|
||||
- Add support for overriding the Celery class.
|
||||
- Changed the document upload view in source app to not use the HTTP referer
|
||||
URL blindly, but instead recompose the URL using known view name. Needed
|
||||
when integrating Mayan EDMS into other app via using iframes.
|
||||
- Addes size field to the document version serializer.
|
||||
- Removed the serializer from the deleted document restore API endpoint.
|
||||
- Added support for adding or editing document types to smart links via the
|
||||
API.
|
||||
|
||||
2.1.10 (2017-02-13)
|
||||
===================
|
||||
- Update Makefile to use twine for releases.
|
||||
- Add Makefile target to make test releases.
|
||||
|
||||
2.1.9 (2017-02-13)
|
||||
==================
|
||||
- Update make file to Workaround long standing pypa wheel bug #99
|
||||
|
||||
2.1.8 (2017-02-12)
|
||||
==================
|
||||
- Fixes in the trashed document API endpoints.
|
||||
- Improved tags API PUT and PATCH endpoints.
|
||||
- Bulk document adding when creating and editing tags.
|
||||
- The version of django-mptt is preserved in case mayan-cabinets is installed.
|
||||
- Add Django GPG API endpoints for singing keys.
|
||||
- Add API endpoints for the document states (workflows) app.
|
||||
- Add API endpoints for the messsage of the day (MOTD) app.
|
||||
- Add Smart link API endpoints.
|
||||
- Add writable versions of the Document and Document Type serializers (GitLab issues #348 and #349).
|
||||
- Close GitLab issue #310 "Metadata's lookup with chinese messages when new document"
|
||||
|
||||
2.1.7 (2017-02-01)
|
||||
==================
|
||||
- Improved user management API endpoints.
|
||||
- Improved permissions API endpoints.
|
||||
- Improvements in the API tests of a few apps.
|
||||
- Addition Content type list API view to the common app.
|
||||
- Add API endpoints to the events app.
|
||||
- Enable the parser and validation fields of the metadata serializer.
|
||||
|
||||
2.1.6 (2016-11-23)
|
||||
==================
|
||||
- Fix variable name typo in the rotation transformation class.
|
||||
- Update translations
|
||||
|
||||
2.1.5 (2016-11-08)
|
||||
==================
|
||||
- Backport resize transformation math operation fix (GitLab #319).
|
||||
- Update Pillow to 3.1.2 (Security fix).
|
||||
- Backport zoom transformation performance improvement (GitLab #334).
|
||||
- Backport trash can navigation link resolution fix (GitLab #331).
|
||||
- Improve documentation regarding the use of GPG version 1 (GitLab #333).
|
||||
- Fix ACL create view HTML response type. (GitLab #335).
|
||||
- Expland staging folder and watch folder explanation.
|
||||
|
||||
2.1.4 (2016-10-28)
|
||||
==================
|
||||
- Add missing link to the 2.1.3 release notes in the index file.
|
||||
- Improve TempfileCheckMixin.
|
||||
- Fix statistics namespace list display view.
|
||||
- Fix events list display view.
|
||||
- Update required Django version to 1.8.15.
|
||||
- Update required python-gnupg version to 0.3.9.
|
||||
- Improved orphaned temporary files test mixin.
|
||||
- Re-enable and improve GitLab CI MySQL testing.
|
||||
- Improved GPG handling.
|
||||
- New GPG backend system.
|
||||
- Minor documentation updates.
|
||||
|
||||
2.1.3 (2016-06-29)
|
||||
==================
|
||||
- Add help message when initialsetup migration phase fails. Relates to GitLab issue #296.
|
||||
- Start using self.setdout instead of print as per documentation.
|
||||
- Fix GitLab issue #295, "When editing a user the top bar jumps to the name of the user".
|
||||
- Normalize handling of temporary file and directory creation.
|
||||
- Fix GitLab issue #309, "Temp files quickly filling-up my /tmp (1GB tmpfs)".
|
||||
- Explicitly check for residual temporary files in tests.
|
||||
- Add missing temporary file cleanup for office documents.
|
||||
- Fix file descriptor leak in the document signature download test.
|
||||
|
||||
2.1.2 (2016-05-20)
|
||||
==================
|
||||
- Sort document languages and user profile locale language lists. GitLab issue #292.
|
||||
- Fix metadata lookup for {{ users }} and {{ group }}. Fixes GitLab #290.
|
||||
- Add Makefile for common development tasks
|
||||
|
||||
2.1.1 (2016-05-17)
|
||||
==================
|
||||
- Fix navigation issue that make it impossible to add new sources. GitLab issue #288.
|
||||
- The Tesseract OCR backend now reports if the requested language file is missing. GitLab issue #289.
|
||||
- Ensure the automatic default index is created after the default document type.
|
||||
|
||||
2.1 (2016-05-14)
|
||||
================
|
||||
- Upgrade to use Django 1.8.13. Issue #246.
|
||||
- Upgrade requirements.
|
||||
- Remove remaining references to Django's User model. GitLab issue #225
|
||||
- Rename 'Content' search box to 'OCR'.
|
||||
- Remove included login required middleware using django-stronghold instead (http://mikegrouchy.com/django-stronghold/).
|
||||
- Improve generation of success and error messages for class based views.
|
||||
- Remove ownership concept from folders.
|
||||
- Replace strip_spaces middleware with the spaceless template tag. GitLab issue #255
|
||||
- Deselect the update checkbox for optional metadata by default.
|
||||
- Silence all Django 1.8 model import warnings.
|
||||
- Implement per document type document creation permission. Closes GitLab issue #232.
|
||||
- Add icons to the document face menu links.
|
||||
- Increase icon to text spacing to 3px.
|
||||
- Make document type delete time period optional.
|
||||
- Fixed date locale handling in document properties, checkout and user detail views.
|
||||
- Add new permission: checkout details view.
|
||||
- Add HTML5 upload widget. Issue #162.
|
||||
- Add Message of the Day app. Issue #222
|
||||
- Update Document model's uuid field to use Django's native UUIDField class.
|
||||
- Add new split view index navigation
|
||||
- Newly uploaded documents appear in the Recent document list of the user.
|
||||
- Document indexes now have ACL support.
|
||||
- Remove the document index setup permission.
|
||||
- Status messages now display the object class on which they operate not just the word "Object".
|
||||
- More tests added.
|
||||
- Handle unicode filenames in staging folders.
|
||||
- Add staging file deletion permission.
|
||||
- New document_signature_view permission.
|
||||
- Add support for signing documents.
|
||||
- Instead of multiple keyservers only one keyserver is now supported.
|
||||
- Replace document type selection widget with an opened selection list.
|
||||
- Add mailing documentation chapter.
|
||||
- Add roadmap documentation chapter.
|
||||
- API updates.
|
||||
|
||||
|
||||
2.0.2 (2016-02-09)
|
||||
==================
|
||||
- Install testing dependencies when installing development dependencies.
|
||||
- Fix GitLab issue #250 "Empty optional lookup metadata trigger validation error".
|
||||
- Fix OCR API test.
|
||||
- Move metadata form value validation to .clean() method.
|
||||
- Only extract validation error messages from ValidationError exception instances.
|
||||
- Don't store empty metadata value if the update checkbox is not checked.
|
||||
- Add 2 second delay to document version tests to workaround MySQL limitation.
|
||||
- Strip HTML tags from the browser title.
|
||||
- Remove Docker and Docker Compose files.
|
||||
|
||||
|
||||
2.0.1 (2016-01-22)
|
||||
==================
|
||||
- Fix GitLab issue #243, "System allows a user to skip entering values for a required metadata field while uploading a new document"
|
||||
- Fix GitLab issue #245, "Add multiple metadata not possible"
|
||||
- Updated Vagrantfile to provision a production box too.
|
||||
|
||||
|
||||
2.0 (2015-12-04)
|
||||
================
|
||||
- New source homepage: https://gitlab.com/mayan-edms/mayan-edms
|
||||
- Update to Django 1.7
|
||||
- New Bootstrap Frontend UI
|
||||
- Easier theming and rebranding
|
||||
- Improved page navigation interface
|
||||
- Menu reorganization
|
||||
- Removal of famfam icon set
|
||||
- Improved document preview generation
|
||||
- Document submission for OCR changed to POST
|
||||
- New YAML based settings system
|
||||
- Removal of auto admin creation as separate app
|
||||
- Removal of dependencies
|
||||
- ACL system refactor
|
||||
- Object access control inheritance
|
||||
- Removal of anonymous user support
|
||||
- Metadata validators refactor
|
||||
- Trash can support
|
||||
- Retention policies
|
||||
- Support for sharing indexes as FUSE filesystems
|
||||
- Clickable preview images titles
|
||||
- Removal of eval
|
||||
- Smarter OCR, per page parsing or OCR fallback
|
||||
- Improve failure tolerance (not all Operational Errors are critical now)
|
||||
- RGB tags
|
||||
- Default document type and default document source
|
||||
- Link unbinding
|
||||
- Statistics refactor
|
||||
- Apps merge
|
||||
- New signals
|
||||
- Test improvements
|
||||
- Indexes recalculation after document creation too
|
||||
- Upgrade command
|
||||
- OCR data moved to ocr app from documents app
|
||||
- New internal document creation workflow return a document stub
|
||||
- Auto console debug logging during development and info during production
|
||||
- New class based and menu based navigation system
|
||||
- New class based transformations
|
||||
- Usage of Font Awesome icons set
|
||||
- Management command to remove obsolete permissions: `purgepermissions`
|
||||
- Normalization of 'title' and 'name' fields to 'label'
|
||||
- Improved API, now at version 1
|
||||
- Invert page title/project name order in browser title
|
||||
- Django's class based views pagination
|
||||
- Reduction of text strings
|
||||
- Removal of the CombinedSource class
|
||||
- Removal of default class ACLs
|
||||
- Removal of the ImageMagick and GraphicsMagick converter backends
|
||||
- Remove support for applying roles to new users automatically
|
||||
- Removal of the DOCUMENT_RESTRICTIONS_OVERRIDE permission
|
||||
- Removed the page_label field
|
||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright 2011-2015 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
|
||||
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/*
|
||||
|
||||
318
Makefile
318
Makefile
@@ -1,96 +1,61 @@
|
||||
.PHONY: clean-pyc clean-build
|
||||
#!make
|
||||
include config.env
|
||||
|
||||
.PHONY: clean clean-pyc clean-build test
|
||||
|
||||
help:
|
||||
@echo
|
||||
@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 "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 "requirements_dev - Install development requirements."
|
||||
@echo "requirements_docs - Install documentation requirements."
|
||||
@echo "requirements_testing - Install testing requirements."
|
||||
|
||||
@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_test_via_docker_alpine - Package (sdist and wheel) and upload to the PyPI test server using an Alpine Docker builder."
|
||||
@echo "release_via_docker_ubuntu - Package (sdist and wheel) and upload to PyPI using an Ubuntu Docker builder."
|
||||
@echo "release_via_docker_alpine - Package (sdist and wheel) and upload to PyPI using an Alpine 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 "docker_services_on - Launch and initialize production-like services using Docker (Postgres and Redis)."
|
||||
@echo "docker_services_off - Stop and delete the Docker production-like services."
|
||||
@echo "docker_services_frontend - Launch a front end instance that uses the production-like services."
|
||||
@echo "docker_services_worker - Launch a worker instance that uses the production-like services."
|
||||
@echo "docker_service_mysql_on - Launch and initialize a MySQL Docker container."
|
||||
@echo "docker_service_mysql_off - Stop and delete the MySQL Docker container."
|
||||
@echo "docker_service_postgres_on - Launch and initialize a PostgreSQL Docker container."
|
||||
@echo "docker_service_postgres_off - Stop and delete the PostgreSQL Docker container."
|
||||
|
||||
@echo "safety_check - Run a package safety check."
|
||||
|
||||
@echo "Usage: make <target>\n"
|
||||
@awk 'BEGIN {FS = ":.*##"} /^[0-9a-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 {} +
|
||||
|
||||
find . -name '__pycache__' -exec rm -R -f {} +
|
||||
|
||||
# Testing
|
||||
|
||||
test:
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing --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 --nomigrations
|
||||
test-debug: clean-pyc
|
||||
test-debug: ## MODULE=<python module name> - Run tests for a single app, module or test class, in debug mode.
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.development --nomigrations --debug-mode $(ARGUMENTS)
|
||||
|
||||
test-all: ## Run all tests.
|
||||
test-all: clean-pyc
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.development --nomigrations $(ARGUMENTS)
|
||||
|
||||
test-all-debug: ## Run all tests in debug mode.
|
||||
test-all-debug: clean-pyc
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.development --nomigrations --debug-mode $(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
|
||||
pip install psycopg2
|
||||
while ! docker inspect --format='{{json .State.Health}}' test-postgres|grep 'Status":"healthy"'; do sleep 1; done
|
||||
docker run -d --name test-postgres -p 5432:5432 -v test-postgres:/var/lib/postgresql/data $(DOCKER_POSTGRES_IMAGE_VERSION)
|
||||
sudo apt-get install -q libpq-dev
|
||||
pip install psycopg2==$(PYTHON_PSYCOPG2_VERSION)
|
||||
while ! nc -z 127.0.0.1 5432; 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
|
||||
@@ -99,17 +64,20 @@ test-with-postgres-all: test-launch-postgres
|
||||
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
|
||||
while ! docker inspect --format='{{json .State.Health}}' test-mysql|grep 'Status":"healthy"'; do sleep 1; done
|
||||
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 $(DOCKER_MYSQL_IMAGE_VERSION)
|
||||
sudo apt-get install -q libmysqlclient-dev mysql-client
|
||||
pip install mysqlclient==$(PYTHON_MYSQL_VERSION)
|
||||
while ! nc -z 127.0.0.1 3306; 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,17 +86,19 @@ test-with-mysql-all: test-launch-mysql
|
||||
test-launch-oracle:
|
||||
@docker rm -f test-oracle || true
|
||||
@docker volume rm test-oracle || true
|
||||
docker run -d --name test-oracle -p 49160:22 -p 49161:1521 -e ORACLE_ALLOW_REMOTE=true -v test-oracle:/u01/app/oracle wnameless/oracle-xe-11g
|
||||
docker run -d --name test-oracle -p 49160:22 -p 49161:1521 -e ORACLE_ALLOW_REMOTE=true -v test-oracle:/u01/app/oracle $(DOCKER_ORACLE_IMAGE_VERSION)
|
||||
# https://gist.github.com/kimus/10012910
|
||||
pip install cx_Oracle
|
||||
pip install cx_Oracle==$(PYTHON_ORACLE_VERSION)
|
||||
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
|
||||
@@ -136,59 +106,59 @@ test-with-oracle-all: test-launch-oracle
|
||||
|
||||
# Documentation
|
||||
|
||||
docs_serve:
|
||||
docs-serve: ## Run the livehtml documentation generator.
|
||||
cd docs;make livehtml
|
||||
|
||||
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
|
||||
|
||||
|
||||
# Requirements
|
||||
|
||||
requirements_dev:
|
||||
pip install -r requirements/development.txt
|
||||
|
||||
requirements_docs:
|
||||
pip install -r requirements/documentation.txt
|
||||
|
||||
requirements_testing:
|
||||
pip install -r requirements/testing.txt
|
||||
|
||||
generate_setup:
|
||||
@./generate_setup.py
|
||||
@echo "Complete."
|
||||
translations-all: ## Execute all translations targets.
|
||||
translations-all: translations-make translations-push translations-pull translations-compile
|
||||
|
||||
# Releases
|
||||
|
||||
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/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 && \
|
||||
@@ -199,48 +169,23 @@ release_test_via_docker_ubuntu:
|
||||
apt-get install make python-pip -y && \
|
||||
pip install -r requirements/build.txt && \
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make test_release"
|
||||
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 && \
|
||||
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 && \
|
||||
cp -r /host_source/* . && \
|
||||
apt-get update && \
|
||||
apt-get install make python-pip -y && \
|
||||
pip install -r requirements/build.txt && \
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make release"
|
||||
|
||||
release_test_via_docker_alpine:
|
||||
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source alpine /bin/busybox sh -c "\
|
||||
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 && \
|
||||
cp -r /host_source/* . && \
|
||||
apk update && \
|
||||
apk add python2 py2-pip make && \
|
||||
pip install -r requirements/build.txt && \
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make test_release"
|
||||
|
||||
release_via_docker_alpine:
|
||||
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source alpine /bin/busybox sh -c "\
|
||||
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 && \
|
||||
cp -r /host_source/* . && \
|
||||
apk update && \
|
||||
apk add python2 py2-pip make && \
|
||||
pip install -r requirements/build.txt && \
|
||||
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 && \
|
||||
@@ -250,10 +195,10 @@ test_sdist_via_docker_ubuntu:
|
||||
apt-get update && \
|
||||
apt-get install make python-pip libreoffice tesseract-ocr tesseract-ocr-deu poppler-utils -y && \
|
||||
pip install -r requirements/development.txt && \
|
||||
make sdist_test_suit \
|
||||
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 && \
|
||||
@@ -263,10 +208,10 @@ test_wheel_via_docker_ubuntu:
|
||||
apt-get update && \
|
||||
apt-get install make python-pip libreoffice tesseract-ocr tesseract-ocr-deu poppler-utils -y && \
|
||||
pip install -r requirements/development.txt && \
|
||||
make wheel_test_suit \
|
||||
make wheel-test-suit \
|
||||
"
|
||||
|
||||
sdist_test_suit: sdist
|
||||
python-sdist-test-suit: sdist
|
||||
rm -f -R _virtualenv
|
||||
virtualenv _virtualenv
|
||||
sh -c '\
|
||||
@@ -277,7 +222,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 '\
|
||||
@@ -288,53 +233,126 @@ 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 documentation > requirements/documentation.txt
|
||||
@./manage.py generaterequirements production --only=pathlib2 >> requirements/documentation.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
|
||||
|
||||
gitlab-release-documentation: ## Trigger the documentation build and publication using GitLab CI
|
||||
gitlab-release-documentation:
|
||||
git push
|
||||
git push --tags
|
||||
git push origin :releases/documentation || true
|
||||
git push origin HEAD:releases/documentation
|
||||
|
||||
gitlab-release-docker: ## Trigger the Docker image build and publication using GitLab CI
|
||||
gitlab-release-docker:
|
||||
git push
|
||||
git push --tags
|
||||
git push origin :releases/docker || true
|
||||
git push origin HEAD:releases/docker
|
||||
|
||||
gitlab-release-python: ## Trigger the Python package build and publication using GitLab CI
|
||||
gitlab-release-python:
|
||||
git push
|
||||
git push --tags
|
||||
git push origin :releases/python || true
|
||||
git push origin HEAD:releases/python
|
||||
|
||||
gitlab-release-all: ## Trigger the Python package, Docker image, and documentation build and publication using GitLab CI
|
||||
gitlab-release-all:
|
||||
git push
|
||||
git push --tags
|
||||
git push origin :releases/all || true
|
||||
git push origin HEAD:releases/all
|
||||
|
||||
# Dev server
|
||||
|
||||
runserver:
|
||||
./manage.py runserver --settings=mayan.settings.development
|
||||
runserver: ## Run the development server.
|
||||
./manage.py runserver --nothreading --settings=mayan.settings.development $(ADDRPORT)
|
||||
|
||||
runserver_plus:
|
||||
./manage.py runserver_plus --settings=mayan.settings.development
|
||||
runserver_plus: ## Run the Django extension's development server.
|
||||
./manage.py runserver_plus --nothreading --settings=mayan.settings.development $(ADDRPORT)
|
||||
|
||||
shell_plus:
|
||||
shell_plus: ## Run the shell_plus command.
|
||||
./manage.py shell_plus --settings=mayan.settings.development
|
||||
|
||||
docker_services_on:
|
||||
docker run -d --name redis -p 6379:6379 redis
|
||||
docker run -d --name postgres -p 5432:5432 postgres
|
||||
test-with-docker-services-on: ## Launch and initialize production-like services using Docker (Postgres and Redis).
|
||||
docker run -d --name redis -p 6379:6379 $(DOCKER_REDIS_IMAGE_VERSION)
|
||||
docker run -d --name postgres -p 5432:5432 $(DOCKER_POSTGRES_IMAGE_VERSION)
|
||||
while ! nc -z 127.0.0.1 6379; do sleep 1; done
|
||||
while ! nc -z 127.0.0.1 5432; do sleep 1; done
|
||||
sleep 2
|
||||
sleep 4
|
||||
pip install psycopg2==$(PYTHON_PSYCOPG2_VERSION) redis==$(PYTHON_REDIS_VERSION)
|
||||
./manage.py initialsetup --settings=mayan.settings.staging.docker
|
||||
|
||||
docker_services_off:
|
||||
test-with-docker-services-off: ## Stop and delete the Docker production-like services.
|
||||
docker stop postgres redis
|
||||
docker rm postgres redis
|
||||
|
||||
docker_services_frontend:
|
||||
test-with-docker-frontend: ## Launch a front end instance that uses the production-like services.
|
||||
./manage.py runserver --settings=mayan.settings.staging.docker
|
||||
|
||||
docker_services_worker:
|
||||
./manage.py celery worker --settings=mayan.settings.staging.docker -B -l INFO -O fair
|
||||
test-with-docker-worker: ## Launch a worker instance that uses the production-like services.
|
||||
DJANGO_SETTINGS_MODULE=mayan.settings.staging.docker ./manage.py celery worker -A mayan -B -l INFO -O fair
|
||||
|
||||
docker_service_mysql_on:
|
||||
docker run -d --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan_edms mysql
|
||||
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 $(DOCKER_MYSQL_IMAGE_VERSION)
|
||||
while ! nc -z 127.0.0.1 3306; do sleep 1; done
|
||||
|
||||
docker_service_mysql_off:
|
||||
docker-mysql-off: ## Stop and delete the MySQL Docker container.
|
||||
docker stop mysql
|
||||
docker rm mysql
|
||||
|
||||
docker_service_postgres_on:
|
||||
docker run -d --name postgres -p 5432:5432 postgres
|
||||
docker-postgres-on: ## Launch and initialize a PostgreSQL Docker container.
|
||||
docker run -d --name postgres -p 5432:5432 $(DOCKER_POSTGRES_IMAGE_VERSION)
|
||||
while ! nc -z 127.0.0.1 5432; do sleep 1; done
|
||||
|
||||
docker_service_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 stray .gitignore files.
|
||||
@export FIND_GITIGNORES=`find -name '.gitignore'| wc -l`; \
|
||||
if [ $${FIND_GITIGNORES} -gt 1 ] ;then echo "More than one .gitignore found."; fi
|
||||
|
||||
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 && \
|
||||
mkdir /host_source/dist || true && \
|
||||
export LC_ALL=C.UTF-8 && \
|
||||
cp -r /host_source/* . && \
|
||||
apt-get update && \
|
||||
apt-get install -y make && \
|
||||
pip install -r requirements/build.txt && \
|
||||
make wheel && \
|
||||
cp dist/* /host_source/dist/"
|
||||
|
||||
check-readme: ## Checks validity of the README.rst file for PyPI publication.
|
||||
python setup.py check -r -s
|
||||
|
||||
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
|
||||
|
||||
35
README.md
35
README.md
@@ -1,8 +1,10 @@
|
||||
[](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/)
|
||||
|
||||
|
||||
[pypi]: http://img.shields.io/pypi/v/mayan-edms.svg
|
||||
[pypi-url]: http://badge.fury.io/py/mayan-edms
|
||||
@@ -35,20 +37,31 @@
|
||||
<p>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/overview.gif">
|
||||
<img width="400" src="https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/overview.gif">
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h2 align="center">Book</h2>
|
||||
|
||||
The final version of the book "Exploring Mayan EDMS" available now!
|
||||
|
||||
<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>
|
||||
|
||||
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
|
||||
[Docker](https://www.docker.com/) image. Make sure Docker is properly installed
|
||||
and working before attempting to install Mayan EDMS.
|
||||
|
||||
For the complete set of installation, configuration, upgrade, and backup
|
||||
instructions visit the Mayan EDMS Docker Hub page at:
|
||||
https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
For the complete set of installation instructions visit the Mayan EDMS documentation
|
||||
at: https://docs.mayan-edms.com/topics/installation.html
|
||||
|
||||
<h2 align="center">Hardware requirements</h2>
|
||||
|
||||
@@ -59,14 +72,12 @@ https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
|
||||
|
||||
- [Homepage](http://www.mayan-edms.com)
|
||||
- [Videos](https://www.youtube.com/channel/UCJOOXHP1MJ9lVA7d8ZTlHPw)
|
||||
- [Documentation](http://mayan.readthedocs.io/en/stable/)
|
||||
- [Paid support](http://www.mayan-edms.com/providers/)
|
||||
- [Roadmap](https://gitlab.com/mayan-edms/mayan-edms/wikis/roadmap)
|
||||
- [Documentation](https://docs.mayan-edms.com)
|
||||
- [Wiki](https://wiki.mayan-edms.com/)
|
||||
- [Contributing](https://gitlab.com/mayan-edms/mayan-edms/blob/master/CONTRIBUTING.md)
|
||||
- [Community forum](https://groups.google.com/forum/#!forum/mayan-edms)
|
||||
- [Community forum archive](http://mayan-edms.1003.x6.nabble.com/)
|
||||
- [Forum](https://forum.mayan-edms.com/)
|
||||
- [Source code, issues, bugs](https://gitlab.com/mayan-edms/mayan-edms)
|
||||
- [Plug-ins, other related projects](https://gitlab.com/mayan-edms/)
|
||||
- [Translations](https://www.transifex.com/rosarior/mayan-edms/)
|
||||
- [Videos](https://www.youtube.com/channel/UCJOOXHP1MJ9lVA7d8ZTlHPw)
|
||||
|
||||
|
||||
37
README.rst
37
README.rst
@@ -1,4 +1,4 @@
|
||||
|pypi| |builds| |coverage| |python| |license|
|
||||
|donation| |pypi| |coverage| |python| |license| |docker_pulls| |docker_stars| |docker_layers|
|
||||
|
||||
|
||||
.. image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/mayan_logo.png
|
||||
@@ -14,18 +14,26 @@ are its workflow system, role based access control, and REST API.
|
||||
|
||||
.. image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/overview.gif
|
||||
:align: center
|
||||
|
||||
:width: 300
|
||||
|
||||
The easiest way to use Mayan EDMS is by using the official Docker_ image.
|
||||
Make sure Docker is properly installed and working before attempting to install
|
||||
Mayan EDMS.
|
||||
|
||||
For the complete set of installation, configuration, upgrade, and backup
|
||||
instructions visit the Mayan EDMS Docker Hub page at:
|
||||
https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
For the complete set of installation instructions visit the Mayan EDMS documentation
|
||||
at: https://docs.mayan-edms.com/topics/installation.html
|
||||
|
||||
.. _Docker: https://www.docker.com/
|
||||
|
||||
The final version of the book "Exploring Mayan EDMS" available now!
|
||||
|
||||
.. image:: https://camo.githubusercontent.com/89d2fe787507c9247aa7bb406e2682b53eb7a5f9/68747470733a2f2f64313273776274773731397934732e636c6f756466726f6e742e6e65742f696d616765732f76365270785734302f615030714b4c6a6b50694175585a6859754234352f774441554c417a4679782e6a7065673f773d353438
|
||||
:align: center
|
||||
:width: 300
|
||||
:target: https://sellfy.com/p/um2fkx/
|
||||
|
||||
Click the image or visit: https://sellfy.com/p/um2fkx/
|
||||
|
||||
Hardware requirements
|
||||
|
||||
- 2 Gigabytes of RAM (1 Gigabyte if OCR is turned off).
|
||||
@@ -35,19 +43,18 @@ Hardware requirements
|
||||
Important links
|
||||
|
||||
- `Homepage <http://www.mayan-edms.com>`__
|
||||
- `Videos <https://www.youtube.com/channel/UCJOOXHP1MJ9lVA7d8ZTlHPw>`__
|
||||
- `Documentation <http://mayan.readthedocs.io/en/stable/>`__
|
||||
- `Paid support <http://www.mayan-edms.com/providers/>`__
|
||||
- `Roadmap <https://gitlab.com/mayan-edms/mayan-edms/wikis/roadmap>`__
|
||||
- `Documentation <https://docs.mayan-edms.com>`__
|
||||
- `Wiki <https://wiki.mayan-edms.com>`__
|
||||
- `Contributing <https://gitlab.com/mayan-edms/mayan-edms/blob/master/CONTRIBUTING.md>`__
|
||||
- `Community forum <https://groups.google.com/forum/#!forum/mayan-edms>`__
|
||||
- `Community forum archive <http://mayan-edms.1003.x6.nabble.com/>`__
|
||||
- `Forum <https://forum.mayan-edms.com>`__
|
||||
- `Source code, issues, bugs <https://gitlab.com/mayan-edms/mayan-edms>`__
|
||||
- `Plug-ins, other related projects <https://gitlab.com/mayan-edms/>`__
|
||||
- `Translations <https://www.transifex.com/rosarior/mayan-edms/>`__
|
||||
- `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
|
||||
@@ -56,3 +63,9 @@ Important links
|
||||
:target: https://codecov.io/gitlab/mayan-edms/mayan-edms?branch=master
|
||||
.. |python| image:: https://img.shields.io/pypi/pyversions/mayan-edms.svg
|
||||
.. |license| image:: https://img.shields.io/pypi/l/mayan-edms.svg?style=flat
|
||||
.. |docker_pulls| image:: https://img.shields.io/docker/pulls/mayanedms/mayanedms.svg?maxAge=3600
|
||||
:target: https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
.. |docker_stars| image:: https://img.shields.io/docker/stars/mayanedms/mayanedms.svg?maxAge=3600
|
||||
:target: https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
.. |docker_layers| image:: https://images.microbadger.com/badges/image/mayanedms/mayanedms.svg
|
||||
:target: https://microbadger.com/images/mayanedms/mayanedms
|
||||
|
||||
14
__init__.py.tmpl
Normal file
14
__init__.py.tmpl
Normal file
@@ -0,0 +1,14 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
__title__ = 'Mayan EDMS'
|
||||
__version__ = '{{ version }}'
|
||||
__build__ = {{ build }}
|
||||
__build_string__ = '{{ build_string }}'
|
||||
__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 Roberto Rosario'
|
||||
__copyright__ = '{} {}'.format('Copyright', __copyright_short__)
|
||||
__website__ = 'https://www.mayan-edms.com'
|
||||
16
config.env
Normal file
16
config.env
Normal file
@@ -0,0 +1,16 @@
|
||||
DOCKER_MYSQL_IMAGE_VERSION=mysql:8.0
|
||||
DOCKER_ORACLE_IMAGE_VERSION=wnameless/oracle-xe-11g
|
||||
DOCKER_POSTGRES_IMAGE_VERSION=postgres:9.6-alpine
|
||||
DOCKER_RABBITMQ_IMAGE_VERSION=rabbitmq:3-alpine
|
||||
DOCKER_REDIS_IMAGE_VERSION=redis:5.0-alpine
|
||||
PYTHON_AMQP_VERSION=2.5.2
|
||||
PYTHON_FLOWER_VERSION=0.9.3
|
||||
PYTHON_LIBRABBITMQ_VERSION=2.0.0
|
||||
PYTHON_MYSQL_VERSION=1.4.4
|
||||
PYTHON_ORACLE_VERSION=7.2.3
|
||||
PYTHON_PSYCOPG2_VERSION=2.8.3
|
||||
PYTHON_PSUTIL_VERSION=5.6.2
|
||||
PYTHON_REDIS_VERSION=3.2.1
|
||||
SOURCE_CODE_REPOSITORY=https://gitlab.com/mayan-edms/mayan-edms/
|
||||
SOURCE_CODE_GIT=https://gitlab.com/mayan-edms/mayan-edms.git
|
||||
SOURCE_CODE_ISSUES=https://gitlab.com/mayan-edms/mayan-edms/issues/
|
||||
@@ -1,25 +0,0 @@
|
||||
!/bin/bash
|
||||
Directories[0]="."
|
||||
|
||||
# Setup find correctly.
|
||||
export IFS=$'\n'
|
||||
|
||||
# Loop through our array.
|
||||
for x in ${Directories[@]}
|
||||
do
|
||||
# Find all directories & subdirectories
|
||||
for i in $(find $x -type d)
|
||||
do
|
||||
# Fix Permissions
|
||||
chmod -c 775 $i
|
||||
chown -c www-data:www-data $i
|
||||
done
|
||||
|
||||
# Find all Files
|
||||
for i in $(find $x -type f)
|
||||
do
|
||||
# Fix Permissions
|
||||
chmod -c 664 $i
|
||||
chown -c www-data:www-data $i
|
||||
done
|
||||
done
|
||||
@@ -1,72 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
INSTALLATION_DIRECTORY=/home/vagrant/mayan-edms/
|
||||
DB_NAME=mayan_edms
|
||||
DB_PASSWORD=test123
|
||||
|
||||
cat << EOF | sudo tee -a /etc/motd.tail
|
||||
**********************************sudo apt
|
||||
|
||||
Mayan EDMS Vagrant Development Box
|
||||
|
||||
**********************************
|
||||
EOF
|
||||
|
||||
# Update sources
|
||||
echo -e "\n -> Running apt-get update & upgrade \n"
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -y upgrade
|
||||
|
||||
echo -e "\n -> Installing core binaries \n"
|
||||
sudo apt-get -y install git-core python-virtualenv gcc python-dev libjpeg-dev libpng-dev libtiff-dev tesseract-ocr poppler-utils libreoffice
|
||||
|
||||
echo -e "\n -> Cloning development branch of repository \n"
|
||||
git clone /mayan-edms-repository/ $INSTALLATION_DIRECTORY
|
||||
cd $INSTALLATION_DIRECTORY
|
||||
git checkout development
|
||||
git reset HEAD --hard
|
||||
|
||||
echo -e "\n -> Setting up virtual env \n"
|
||||
virtualenv venv
|
||||
source venv/bin/activate
|
||||
|
||||
echo -e "\n -> Installing python dependencies \n"
|
||||
pip install -r requirements.txt
|
||||
|
||||
echo -e "\n -> Running Mayan EDMS initial setup \n"
|
||||
./manage.py initialsetup
|
||||
|
||||
echo -e "\n -> Installing Redis server \n"
|
||||
sudo apt-get install -y redis-server
|
||||
pip install redis
|
||||
|
||||
echo -e "\n -> Installing testing software \n"
|
||||
pip install coverage
|
||||
|
||||
echo -e "\n -> Installing MySQL \n"
|
||||
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password '$DB_PASSWORD
|
||||
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password '$DB_PASSWORD
|
||||
sudo apt-get install -y mysql-server libmysqlclient-dev
|
||||
# Create a passwordless root and travis users
|
||||
mysql -u root -p$DB_PASSWORD -e "SET PASSWORD = PASSWORD('');"
|
||||
mysql -u root -e "CREATE USER 'travis'@'localhost' IDENTIFIED BY '';GRANT ALL PRIVILEGES ON * . * TO 'travis'@'localhost';FLUSH PRIVILEGES;"
|
||||
mysql -u travis -e "CREATE DATABASE $DB_NAME;"
|
||||
pip install mysql-python
|
||||
|
||||
echo -e "\n -> Installing PostgreSQL \n"
|
||||
sudo apt-get install -y postgresql postgresql-server-dev-all
|
||||
sudo -u postgres psql -c 'create database mayan_edms;' -U postgres
|
||||
sudo cat > /etc/postgresql/9.3/main/pg_hba.conf << EOF
|
||||
local all postgres trust
|
||||
|
||||
# TYPE DATABASE USER ADDRESS METHOD
|
||||
|
||||
# "local" is for Unix domain socket connections only
|
||||
local all all peer
|
||||
# IPv4 local connections:
|
||||
host all all 127.0.0.1/32 md5
|
||||
# IPv6 local connections:
|
||||
host all all ::1/128 md5
|
||||
EOF
|
||||
|
||||
pip install -q psycopg2
|
||||
198
contrib/scripts/install/docker.sh
Executable file
198
contrib/scripts/install/docker.sh
Executable file
@@ -0,0 +1,198 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# This script is meant for quick & easy install via:
|
||||
# $ curl -fsSL get.mayan-edms.com -o get-mayan-edms.sh
|
||||
# $ sh get-mayan-edms.sh
|
||||
#
|
||||
# NOTE: Before executing, make sure to verify the contents of the script
|
||||
# you downloaded matches the contents of docker.sh
|
||||
# located at https://gitlab.com/mayan-edms/mayan-edms/blob/master/contrib/scripts/install/docker.sh
|
||||
|
||||
: ${VERBOSE:=true}
|
||||
: ${INSTALL_DOCKER:=false}
|
||||
: ${DELETE_VOLUMES:=false}
|
||||
: ${USE_DOCKER_NETWORK:=true}
|
||||
: ${DOCKER_NETWORK_NAME:=mayan}
|
||||
: ${DATABASE_USER:=mayan}
|
||||
: ${DATABASE_NAME:=mayan}
|
||||
: ${DATABASE_PASSWORD:=mayanuserpass}
|
||||
: ${DOCKER_POSTGRES_IMAGE:=postgres:9.6-alpine}
|
||||
: ${DOCKER_POSTGRES_CONTAINER:=mayan-edms-postgres}
|
||||
: ${DOCKER_POSTGRES_VOLUME:=/docker-volumes/mayan-edms/postgres}
|
||||
: ${DOCKER_POSTGRES_PORT:=5432}
|
||||
: ${DOCKER_POSTGRES_DELAY:=10}
|
||||
: ${DOCKER_REDIS_IMAGE:=redis:5.0-alpine}
|
||||
: ${DOCKER_REDIS_CONTAINER:=mayan-edms-redis}
|
||||
: ${DOCKER_REDIS_PORT:=6379}
|
||||
: ${DOCKER_MAYAN_IMAGE:=mayanedms/mayanedms:latest}
|
||||
: ${DOCKER_MAYAN_CONTAINER:=mayan-edms}
|
||||
: ${DOCKER_MAYAN_VOLUME:=/docker-volumes/mayan-edms/media}
|
||||
: ${DOCKER_MAYAN_PORT:=80}
|
||||
|
||||
cat << EOF
|
||||
|
||||
███╗ ███╗ █████╗ ██╗ ██╗ █████╗ ███╗ ██╗
|
||||
████╗ ████║██╔══██╗╚██╗ ██╔╝██╔══██╗████╗ ██║
|
||||
██╔████╔██║███████║ ╚████╔╝ ███████║██╔██╗ ██║
|
||||
██║╚██╔╝██║██╔══██║ ╚██╔╝ ██╔══██║██║╚██╗██║
|
||||
██║ ╚═╝ ██║██║ ██║ ██║ ██║ ██║██║ ╚████║
|
||||
╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝
|
||||
Docker deploy script
|
||||
|
||||
NOTE: Make sure to verify the contents of this script
|
||||
matches the contents of docker.sh located at https://gitlab.com/mayan-edms/mayan-edms/blob/master/contrib/scripts/install/docker.sh before executing.
|
||||
|
||||
EOF
|
||||
|
||||
if [ "$VERBOSE" = true ]; then
|
||||
echo "Variable values to be used:"
|
||||
echo "---------------------------"
|
||||
echo "INSTALL_DOCKER: $INSTALL_DOCKER"
|
||||
echo "DELETE_VOLUMES: $DELETE_VOLUMES"
|
||||
echo "USE_DOCKER_NETWORK: $USE_DOCKER_NETWORK"
|
||||
echo "DOCKER_NETWORK_NAME: $DOCKER_NETWORK_NAME"
|
||||
echo "DATABASE_USER: $DATABASE_USER"
|
||||
echo "DATABASE_NAME: $DATABASE_NAME"
|
||||
echo "DATABASE_PASSWORD: $DATABASE_PASSWORD"
|
||||
echo "DOCKER_POSTGRES_IMAGE: $DOCKER_POSTGRES_IMAGE"
|
||||
echo "DOCKER_POSTGRES_CONTAINER: $DOCKER_POSTGRES_CONTAINER"
|
||||
echo "DOCKER_POSTGRES_VOLUME: $DOCKER_POSTGRES_VOLUME"
|
||||
echo "DOCKER_POSTGRES_PORT: $DOCKER_POSTGRES_PORT"
|
||||
echo "DOCKER_POSTGRES_DELAY: $DOCKER_POSTGRES_DELAY"
|
||||
echo "DOCKER_REDIS_IMAGE: $DOCKER_REDIS_IMAGE"
|
||||
echo "DOCKER_REDIS_CONTAINER: $DOCKER_REDIS_CONTAINER"
|
||||
echo "DOCKER_REDIS_PORT: $DOCKER_REDIS_PORT"
|
||||
echo "DOCKER_MAYAN_IMAGE: $DOCKER_MAYAN_IMAGE"
|
||||
echo "DOCKER_MAYAN_CONTAINER: $DOCKER_MAYAN_CONTAINER"
|
||||
echo "DOCKER_MAYAN_VOLUME: $DOCKER_MAYAN_VOLUME"
|
||||
echo "DOCKER_MAYAN_PORT: $DOCKER_MAYAN_PORT"
|
||||
echo
|
||||
echo "Override any of them by setting them before the script. "
|
||||
echo "Example: INSTALL_DOCKER=true sh get-mayan-edms.sh"
|
||||
|
||||
echo "\nStarting in 10 seconds. Press CTRL+C to cancel."
|
||||
sleep 10
|
||||
fi
|
||||
|
||||
if [ "$INSTALL_DOCKER" = true ]; then
|
||||
echo -n "* Installing Docker..."
|
||||
curl -fsSL get.docker.com -o get-docker.sh >/dev/null
|
||||
sh get-docker.sh >/dev/null 2>&1
|
||||
rm get-docker.sh
|
||||
echo "Done"
|
||||
fi
|
||||
|
||||
if [ -z `which docker` ]; then
|
||||
echo "Docker is not installed. Rerun this script with the variable INSTALL_DOCKER set to true."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -n "* Removing existing Mayan EDMS and PostgreSQL containers (no data will be lost)..."
|
||||
docker rm -f $DOCKER_REDIS_CONTAINER >/dev/null 2>&1 || true
|
||||
docker rm -f $DOCKER_POSTGRES_CONTAINER >/dev/null 2>&1 || true
|
||||
docker rm -f $DOCKER_MAYAN_CONTAINER >/dev/null 2>&1 || true
|
||||
echo "Done"
|
||||
|
||||
if [ "$DELETE_VOLUMES" = true ]; then
|
||||
echo -n "* Deleting Docker volumes in 5 seconds (warning: this will delete all document data). Press CTRL+C to cancel..."
|
||||
sleep 5
|
||||
rm DOCKER_MAYAN_VOLUME -Rf || true
|
||||
rm DOCKER_POSTGRES_VOLUME -Rf || true
|
||||
echo "Done"
|
||||
fi
|
||||
|
||||
echo -n "* Pulling (downloading) the Redis Docker image..."
|
||||
docker pull $DOCKER_REDIS_IMAGE > /dev/null
|
||||
echo "Done"
|
||||
|
||||
echo -n "* Pulling (downloading) the PostgreSQL Docker image..."
|
||||
docker pull $DOCKER_POSTGRES_IMAGE > /dev/null
|
||||
echo "Done"
|
||||
|
||||
echo -n "* Pulling (downloading) the Mayan EDMS Docker image..."
|
||||
docker pull $DOCKER_MAYAN_IMAGE >/dev/null
|
||||
echo "Done"
|
||||
|
||||
if [ "$USE_DOCKER_NETWORK" = true ]; then
|
||||
echo -n "* Creating Docker network..."
|
||||
docker network create $DOCKER_NETWORK_NAME 2> /dev/null || true
|
||||
# Ignore error if the network already exists
|
||||
echo "Done"
|
||||
fi
|
||||
|
||||
if [ "$USE_DOCKER_NETWORK" = true ]; then
|
||||
NETWORK_ARGUMENT="--network=$DOCKER_NETWORK_NAME"
|
||||
POSTGRES_PORT_ARGUMENT=""
|
||||
REDIS_PORT_ARGUMENT=""
|
||||
MAYAN_DATABASE_PORT_ARGUMENT=""
|
||||
MAYAN_DATABASE_HOST_ARGUMENT="-e MAYAN_DATABASE_HOST=$DOCKER_POSTGRES_CONTAINER"
|
||||
MAYAN_CELERY_BROKER_URL_ARGUMENT="-e MAYAN_CELERY_BROKER_URL=redis://$DOCKER_REDIS_CONTAINER:6379/0"
|
||||
MAYAN_CELERY_RESULT_BACKEND_ARGUMENT="-e MAYAN_CELERY_RESULT_BACKEND=redis://$DOCKER_REDIS_CONTAINER:6379/1"
|
||||
else
|
||||
NETWORK_ARGUMENT=""
|
||||
POSTGRES_PORT_ARGUMENT="-e $DOCKER_POSTGRES_PORT:5432"
|
||||
REDIS_PORT_ARGUMENT="-e $DOCKER_REDIS_PORT:6379"
|
||||
MAYAN_DATABASE_PORT_ARGUMENT="-e MAYAN_DATABASE_PORT=$DOCKER_POSTGRES_PORT"
|
||||
MAYAN_DATABASE_HOST_ARGUMENT="-e MAYAN_DATABASE_HOST=172.17.0.1"
|
||||
MAYAN_CELERY_BROKER_URL_ARGUMENT="-e MAYAN_CELERY_BROKER_URL=redis://172.17.0.1:6379/0"
|
||||
MAYAN_CELERY_RESULT_BACKEND_ARGUMENT="-e MAYAN_CELERY_RESULT_BACKEND=redis://172.17.0.1:6379/1"
|
||||
fi
|
||||
|
||||
echo -n "* Deploying the PostgreSQL container..."
|
||||
docker run -d \
|
||||
--name $DOCKER_POSTGRES_CONTAINER \
|
||||
$NETWORK_ARGUMENT \
|
||||
--restart=always \
|
||||
$POSTGRES_PORT_ARGUMENT \
|
||||
-e POSTGRES_USER=$DATABASE_USER \
|
||||
-e POSTGRES_DB=$DATABASE_NAME \
|
||||
-e POSTGRES_PASSWORD=$DATABASE_PASSWORD \
|
||||
-v $DOCKER_POSTGRES_VOLUME:/var/lib/postgresql/data \
|
||||
$DOCKER_POSTGRES_IMAGE >/dev/null
|
||||
echo "Done"
|
||||
|
||||
echo -n "* Deploying the Redis container..."
|
||||
docker run -d \
|
||||
--name $DOCKER_REDIS_CONTAINER \
|
||||
$NETWORK_ARGUMENT \
|
||||
--restart=always \
|
||||
$REDIS_PORT_ARGUMENT \
|
||||
$DOCKER_REDIS_IMAGE \
|
||||
redis-server \
|
||||
--appendonly no \
|
||||
--databases 2 \
|
||||
--maxmemory 100mb \
|
||||
--maxmemory-policy allkeys-lru \
|
||||
--maxclients 500 \
|
||||
--save "" \
|
||||
--tcp-backlog 256 \
|
||||
>/dev/null
|
||||
echo "Done"
|
||||
|
||||
echo -n "* Waiting for the PostgreSQL container to be ready (${DOCKER_POSTGRES_DELAY} seconds)..."
|
||||
sleep $DOCKER_POSTGRES_DELAY
|
||||
echo "Done"
|
||||
|
||||
echo -n "* Deploying Mayan EDMS container..."
|
||||
docker run -d \
|
||||
--name $DOCKER_MAYAN_CONTAINER \
|
||||
$NETWORK_ARGUMENT \
|
||||
--restart=always \
|
||||
-p $DOCKER_MAYAN_PORT:8000 \
|
||||
-e MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
|
||||
$MAYAN_DATABASE_HOST_ARGUMENT \
|
||||
$MAYAN_DATABASE_PORT_ARGUMENT \
|
||||
-e MAYAN_DATABASE_NAME=$DATABASE_NAME \
|
||||
-e MAYAN_DATABASE_PASSWORD=$DATABASE_PASSWORD \
|
||||
-e MAYAN_DATABASE_USER=$DATABASE_USER \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
|
||||
$MAYAN_CELERY_BROKER_URL_ARGUMENT \
|
||||
$MAYAN_CELERY_RESULT_BACKEND_ARGUMENT \
|
||||
-v $DOCKER_MAYAN_VOLUME:/var/lib/mayan \
|
||||
$DOCKER_MAYAN_IMAGE >/dev/null
|
||||
echo "Done"
|
||||
|
||||
echo -n "* Waiting for the Mayan EDMS container to be ready (might take a few minutes)..."
|
||||
while ! curl --output /dev/null --silent --head --fail http://localhost:$DOCKER_MAYAN_PORT; do sleep 1 && echo -n .; done;
|
||||
echo "Done"
|
||||
@@ -1,171 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# ====== CONFIG ======
|
||||
INSTALLATION_DIRECTORY=/usr/share/mayan-edms/
|
||||
DB_NAME=mayan_edms
|
||||
DB_USERNAME=mayan
|
||||
DB_PASSWORD=test123
|
||||
# ==== END CONFIG ====
|
||||
|
||||
cat << EOF | tee -a /etc/motd.tail
|
||||
**********************************
|
||||
|
||||
Mayan EDMS Vagrant Production Box
|
||||
|
||||
**********************************
|
||||
EOF
|
||||
|
||||
echo -e "\n -> Running apt-get update & upgrade \n"
|
||||
apt-get -qq update
|
||||
apt-get -y upgrade
|
||||
|
||||
echo -e "\n -> Installing core binaries \n"
|
||||
apt-get install nginx supervisor redis-server postgresql libpq-dev libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
|
||||
|
||||
echo -e "\n -> Setting up virtualenv \n"
|
||||
rm -f ${INSTALLATION_DIRECTORY}
|
||||
virtualenv ${INSTALLATION_DIRECTORY}
|
||||
source ${INSTALLATION_DIRECTORY}bin/activate
|
||||
|
||||
echo -e "\n -> Installing Mayan EDMS from PyPI \n"
|
||||
pip install mayan-edms
|
||||
|
||||
echo -e "\n -> Installing Python client for PostgreSQL, Redis, and uWSGI \n"
|
||||
pip install psycopg2 redis uwsgi
|
||||
|
||||
echo -e "\n -> Creating the database for the installation \n"
|
||||
echo "CREATE USER mayan WITH PASSWORD '$DB_PASSWORD';" | sudo -u postgres psql
|
||||
sudo -u postgres createdb -O $DB_USERNAME $DB_NAME
|
||||
|
||||
echo -e "\n -> Creating the directories for the logs \n"
|
||||
mkdir /var/log/mayan
|
||||
|
||||
echo -e "\n -> Making a convenience symlink \n"
|
||||
cd ${INSTALLATION_DIRECTORY}
|
||||
ln -s lib/python2.7/site-packages/mayan .
|
||||
|
||||
echo -e "\n -> Creating an initial settings file \n"
|
||||
mayan-edms.py createsettings
|
||||
|
||||
echo -e "\n -> Updating the mayan/settings/local.py file \n"
|
||||
cat >> mayan/settings/local.py << EOF
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': '$DB_NAME',
|
||||
'USER': '$DB_USERNAME',
|
||||
'PASSWORD': '$DB_PASSWORD',
|
||||
'HOST': 'localhost',
|
||||
'PORT': '5432',
|
||||
}
|
||||
}
|
||||
|
||||
BROKER_URL = 'redis://127.0.0.1:6379/0'
|
||||
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
|
||||
EOF
|
||||
|
||||
echo -e "\n -> Migrating the database or initialize the project \n"
|
||||
mayan-edms.py initialsetup
|
||||
|
||||
echo -e "\n -> Disabling the default NGINX site \n"
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
|
||||
echo -e "\n -> Creating a uwsgi.ini file \n"
|
||||
cat > uwsgi.ini << EOF
|
||||
[uwsgi]
|
||||
chdir = ${INSTALLATION_DIRECTORY}lib/python2.7/site-packages/mayan
|
||||
chmod-socket = 664
|
||||
chown-socket = www-data:www-data
|
||||
env = DJANGO_SETTINGS_MODULE=mayan.settings.production
|
||||
gid = www-data
|
||||
logto = /var/log/uwsgi/%n.log
|
||||
pythonpath = ${INSTALLATION_DIRECTORY}lib/python2.7/site-packages
|
||||
master = True
|
||||
max-requests = 5000
|
||||
socket = ${INSTALLATION_DIRECTORY}uwsgi.sock
|
||||
uid = www-data
|
||||
vacuum = True
|
||||
wsgi-file = ${INSTALLATION_DIRECTORY}lib/python2.7/site-packages/mayan/wsgi.py
|
||||
EOF
|
||||
|
||||
echo -e "\n -> Creating the directory for the uWSGI log files \n"
|
||||
mkdir -p /var/log/uwsgi
|
||||
|
||||
echo -e "\n -> Creating the NGINX site file for Mayan EDMS, /etc/nginx/sites-available/mayan \n"
|
||||
cat > /etc/nginx/sites-available/mayan << EOF
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
include uwsgi_params;
|
||||
uwsgi_pass unix:${INSTALLATION_DIRECTORY}uwsgi.sock;
|
||||
|
||||
client_max_body_size 30M; # Increse if your plan to upload bigger documents
|
||||
proxy_read_timeout 30s; # Increase if your document uploads take more than 30 seconds
|
||||
}
|
||||
|
||||
location /static {
|
||||
alias ${INSTALLATION_DIRECTORY}mayan/media/static;
|
||||
expires 1h;
|
||||
}
|
||||
|
||||
location /favicon.ico {
|
||||
alias ${INSTALLATION_DIRECTORY}mayan/media/static/appearance/images/favicon.ico;
|
||||
expires 1h;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
echo -e "\n -> Enabling the NGINX site for Mayan EDMS \n"
|
||||
ln -s /etc/nginx/sites-available/mayan /etc/nginx/sites-enabled/
|
||||
|
||||
echo -e "\n -> Creating the supervisor file for the uWSGI process, /etc/supervisor/conf.d/mayan-uwsgi.conf \n"
|
||||
cat > /etc/supervisor/conf.d/mayan-uwsgi.conf << EOF
|
||||
[program:mayan-uwsgi]
|
||||
command = ${INSTALLATION_DIRECTORY}bin/uwsgi --ini ${INSTALLATION_DIRECTORY}uwsgi.ini
|
||||
user = root
|
||||
autostart = true
|
||||
autorestart = true
|
||||
redirect_stderr = true
|
||||
EOF
|
||||
|
||||
echo -e "\n -> Creating the supervisor file for the Celery worker, /etc/supervisor/conf.d/mayan-celery.conf \n"
|
||||
cat > /etc/supervisor/conf.d/mayan-celery.conf << EOF
|
||||
[program:mayan-worker]
|
||||
command = ${INSTALLATION_DIRECTORY}bin/python ${INSTALLATION_DIRECTORY}bin/mayan-edms.py celery --settings=mayan.settings.production worker -Ofair -l ERROR
|
||||
directory = ${INSTALLATION_DIRECTORY}
|
||||
user = www-data
|
||||
stdout_logfile = /var/log/mayan/worker-stdout.log
|
||||
stderr_logfile = /var/log/mayan/worker-stderr.log
|
||||
autostart = true
|
||||
autorestart = true
|
||||
startsecs = 10
|
||||
stopwaitsecs = 10
|
||||
killasgroup = true
|
||||
priority = 998
|
||||
|
||||
[program:mayan-beat]
|
||||
command = ${INSTALLATION_DIRECTORY}bin/python ${INSTALLATION_DIRECTORY}bin/mayan-edms.py celery --settings=mayan.settings.production beat -l ERROR
|
||||
directory = ${INSTALLATION_DIRECTORY}
|
||||
user = www-data
|
||||
numprocs = 1
|
||||
stdout_logfile = /var/log/mayan/beat-stdout.log
|
||||
stderr_logfile = /var/log/mayan/beat-stderr.log
|
||||
autostart = true
|
||||
autorestart = true
|
||||
startsecs = 10
|
||||
stopwaitsecs = 1
|
||||
killasgroup = true
|
||||
priority = 998
|
||||
EOF
|
||||
|
||||
echo -e "\n -> Collecting the static files \n"
|
||||
mayan-edms.py collectstatic --noinput
|
||||
|
||||
echo -e "\n -> Making the installation directory readable and writable by the webserver user \n"
|
||||
chown www-data:www-data ${INSTALLATION_DIRECTORY} -R
|
||||
|
||||
echo -e "\n -> Restarting the services \n"
|
||||
/etc/init.d/nginx restart
|
||||
/etc/init.d/supervisor restart
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import optparse
|
||||
|
||||
@@ -6,19 +9,22 @@ 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', 'user_management'
|
||||
'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_caching',
|
||||
'file_metadata', 'linking', 'lock_manager', 'mailer',
|
||||
'mayan_statistics', 'metadata', 'mirroring', 'motd', 'navigation',
|
||||
'ocr', 'permissions', 'platform', 'rest_api', 'smart_settings',
|
||||
'sources', 'storage', 'tags', 'task_manager', 'templating',
|
||||
'user_management', 'web_links'
|
||||
)
|
||||
|
||||
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')
|
||||
@@ -38,29 +44,29 @@ BASE_DIR = os.path.abspath(
|
||||
|
||||
def process(command, app_list, language_list):
|
||||
if command == makemessages:
|
||||
print 'Making messages'
|
||||
print('Making messages')
|
||||
elif command == compilemessages:
|
||||
print 'Compiling messages'
|
||||
print('Compiling messages')
|
||||
elif command == pull_translations:
|
||||
print 'Pulling translation files'
|
||||
print('Pulling translation files')
|
||||
elif command == push_translations:
|
||||
print 'Pushing translation files'
|
||||
print('Pushing translation files')
|
||||
|
||||
if command in [compilemessages, makemessages]:
|
||||
for app in app_list:
|
||||
print 'Processing app: %s...' % app
|
||||
print('Processing app: %s...' % app)
|
||||
app_path = os.path.join(BASE_DIR, 'apps', app)
|
||||
os.chdir(app_path)
|
||||
for lang in language_list:
|
||||
print 'Doing language: %s' % lang
|
||||
print('Doing language: %s' % lang)
|
||||
command(locale=lang)
|
||||
elif command == pull_translations:
|
||||
for lang in language_list:
|
||||
print 'Doing language: %s' % lang
|
||||
print('Doing language: %s' % lang)
|
||||
command('-f', '-l', lang)
|
||||
elif command == push_translations:
|
||||
for lang in language_list:
|
||||
print 'Doing language: %s' % lang
|
||||
print('Doing language: %s' % lang)
|
||||
command('-s', '-l', lang)
|
||||
|
||||
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
NAME="mayan-edms"
|
||||
DJANGODIR=/usr/share/mayan-edms
|
||||
SOCKFILE=/var/tmp/filesystem.sock
|
||||
USER=www-data
|
||||
GROUP=www-data
|
||||
NUM_WORKERS=3
|
||||
DJANGO_SETTINGS_MODULE=mayan.settings.production
|
||||
DJANGO_WSGI_MODULE=mayan.wsgi
|
||||
TIMEOUT=600
|
||||
|
||||
echo "Starting $NAME as `whoami`"
|
||||
|
||||
# Activate the virtual environment
|
||||
cd $DJANGODIR
|
||||
source bin/activate
|
||||
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
|
||||
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
|
||||
|
||||
# Create the run directory if it doesn't exist
|
||||
RUNDIR=$(dirname $SOCKFILE)
|
||||
test -d $RUNDIR || mkdir -p $RUNDIR
|
||||
|
||||
# Start your Django Unicorn
|
||||
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
|
||||
exec bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
|
||||
--name $NAME \
|
||||
--workers $NUM_WORKERS \
|
||||
--user=$USER --group=$GROUP \
|
||||
--log-level=debug \
|
||||
--bind=unix:$SOCKFILE \
|
||||
--timeout=$TIMEOUT
|
||||
|
||||
|
||||
105
contrib/scripts/statistics.py
Executable file
105
contrib/scripts/statistics.py
Executable file
@@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
|
||||
BASE_PATH = 'mayan/apps'
|
||||
|
||||
|
||||
def print_views_summary(module_filename):
|
||||
with open(module_filename) as file_object:
|
||||
print(' module:', module_filename)
|
||||
count_class_based_views = 0
|
||||
count_function_based_views = 0
|
||||
for line in file_object:
|
||||
if line.startswith('class') and 'View' in line:
|
||||
count_class_based_views += 1
|
||||
|
||||
if line.startswith('def') and 'request' in line:
|
||||
count_function_based_views += 1
|
||||
|
||||
print(' class based views: {}'.format(count_class_based_views))
|
||||
print(' function based views: {}'.format(count_function_based_views))
|
||||
return count_class_based_views, count_function_based_views
|
||||
|
||||
|
||||
def print_tests_summary(module_filename):
|
||||
with open(module_filename) as file_object:
|
||||
print(' module:', module_filename)
|
||||
count_tests = 0
|
||||
for line in file_object:
|
||||
if line.startswith(' def test'):
|
||||
count_tests += 1
|
||||
|
||||
print(' tests: {}'.format(count_tests))
|
||||
return count_tests
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
count_totals = {
|
||||
'Apps': 0,
|
||||
'Class based views': 0,
|
||||
'Function based views': 0,
|
||||
'Class based API views': 0,
|
||||
'Function based API views': 0,
|
||||
'Tests': 0,
|
||||
}
|
||||
|
||||
for app_name in sorted(os.listdir(BASE_PATH)):
|
||||
if app_name != '__init__.py':
|
||||
count_totals['Apps'] += 1
|
||||
print('\n\nApp name: {}'.format(app_name))
|
||||
app_path = os.path.join(BASE_PATH, app_name)
|
||||
|
||||
print('\n Views')
|
||||
try:
|
||||
module_filename = os.path.join(app_path, 'views.py')
|
||||
count_class_based_views, count_function_based_views = print_views_summary(module_filename=module_filename)
|
||||
count_totals['Class based views'] += count_class_based_views
|
||||
count_totals['Function based views'] += count_function_based_views
|
||||
|
||||
except IOError:
|
||||
# Check for multiple view files inside a view directory
|
||||
try:
|
||||
module_path = os.path.join(app_path, 'views')
|
||||
for module_name in os.listdir(module_path):
|
||||
if not module_name.startswith('__init__.py') and not module_name.endswith('.pyc'):
|
||||
module_filename = os.path.join(module_path, module_name)
|
||||
count_class_based_views, count_function_based_views = print_views_summary(module_filename=module_filename)
|
||||
count_totals['Class based views'] += count_class_based_views
|
||||
count_totals['Function based views'] += count_function_based_views
|
||||
except OSError:
|
||||
# No views directory, skip app
|
||||
print(' No views')
|
||||
|
||||
print('\n API Views')
|
||||
try:
|
||||
module_filename = os.path.join(app_path, 'api_views.py')
|
||||
count_class_based_views, count_function_based_views = print_views_summary(module_filename=module_filename)
|
||||
count_totals['Class based API views'] += count_class_based_views
|
||||
count_totals['Function based API views'] += count_function_based_views
|
||||
|
||||
except IOError:
|
||||
# No API views directory, skip app
|
||||
print(' No API views')
|
||||
|
||||
print('\n Tests')
|
||||
module_path = os.path.join(app_path, 'tests')
|
||||
try:
|
||||
for module_name in os.listdir(module_path):
|
||||
if not module_name.startswith('__init__.py') and not module_name.endswith('.pyc'):
|
||||
module_filename = os.path.join(module_path, module_name)
|
||||
if module_name.startswith('test'):
|
||||
count_tests = print_tests_summary(module_filename=module_filename)
|
||||
count_totals['Tests'] += count_tests
|
||||
|
||||
except OSError:
|
||||
# No tests directory, skip app
|
||||
print(' No tests')
|
||||
|
||||
print('-' * 10)
|
||||
|
||||
print('Totals:')
|
||||
for key, value in count_totals.items():
|
||||
print(' {}: {}'.format(key, value))
|
||||
@@ -1,63 +1,139 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
# Install Python LDAP with:
|
||||
# $ pip install python-ldap
|
||||
# or if using Docker, pass the environment variable MAYAN_PIP_INSTALLS:
|
||||
# -e MAYAN_PIP_INSTALLS=python-ldap
|
||||
import ldap
|
||||
from django_auth_ldap.config import LDAPSearch
|
||||
|
||||
from .base import *
|
||||
from django.conf import settings
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
SECRET_KEY = '<your secret key>'
|
||||
|
||||
# makes sure this works in Active Directory
|
||||
ldap.set_option(ldap.OPT_REFERRALS, 0)
|
||||
|
||||
# This is the default, but I like to be explicit.
|
||||
AUTH_LDAP_ALWAYS_UPDATE_USER = True
|
||||
|
||||
LDAP_USER_AUTO_CREATION = "False"
|
||||
LDAP_URL = "ldap://<your ldap server IP>:389/"
|
||||
LDAP_BASE_DN = "dc=paramatrix,dc=co,dc=in"
|
||||
LDAP_ADDITIONAL_USER_DN = "dc=people"
|
||||
LDAP_ADMIN_DN = ""
|
||||
LDAP_PASSWORD = ""
|
||||
|
||||
AUTH_LDAP_SERVER_URI = LDAP_URL
|
||||
AUTH_LDAP_BIND_DN = LDAP_ADMIN_DN
|
||||
AUTH_LDAP_BIND_PASSWORD = LDAP_PASSWORD
|
||||
|
||||
|
||||
AUTH_LDAP_USER_SEARCH = LDAPSearch('%s,%s'%(LDAP_ADDITIONAL_USER_DN, LDAP_BASE_DN), ldap.SCOPE_SUBTREE, "(uid=%(user)s)")
|
||||
AUTH_LDAP_USER_ATTR_MAP = {
|
||||
"first_name": "cn",
|
||||
"last_name": "sn",
|
||||
"email": "mail"
|
||||
}
|
||||
|
||||
AUTHENTICATION_BACKENDS = (
|
||||
'django_auth_ldap.backend.LDAPBackend',
|
||||
'mayan.settings.settings_local.EmailOrUsernameModelBackend',
|
||||
from django_auth_ldap.config import (
|
||||
LDAPSearch, LDAPSearchUnion, NestedActiveDirectoryGroupType
|
||||
)
|
||||
|
||||
class EmailOrUsernameModelBackend(object):
|
||||
"""
|
||||
This is a ModelBacked that allows authentication with either a username or an email address.
|
||||
from mayan.settings.production import *
|
||||
|
||||
"""
|
||||
def authenticate(self, username=None, password=None):
|
||||
if '@' in username:
|
||||
kwargs = {'email': username}
|
||||
else:
|
||||
kwargs = {'username': username}
|
||||
try:
|
||||
user = get_user_model().objects.get(**kwargs)
|
||||
if user.check_password(password):
|
||||
return user
|
||||
except User.DoesNotExist:
|
||||
return None
|
||||
# Makes sure this works in Active Directory
|
||||
ldap.set_option(ldap.OPT_REFERRALS, False)
|
||||
|
||||
def get_user(self, username):
|
||||
try:
|
||||
return get_user_model().objects.get(pk=username)
|
||||
except get_user_model().DoesNotExist:
|
||||
return None
|
||||
# Turn of debug output, turn this off when everything is working as expected
|
||||
ldap.set_option(ldap.OPT_DEBUG_LEVEL, 1)
|
||||
|
||||
# Default: True
|
||||
AUTH_LDAP_ALWAYS_UPDATE_USER = True
|
||||
|
||||
# Use TLS to talk to the LDAP server
|
||||
# Requires acquiring the server's certificate
|
||||
# $ openssl s_client -connect <LDAP server>:636
|
||||
# Part of the output of this file will be the Base-64 encoded .cer file
|
||||
# that was presented for LDAPS. Cut and paste into a file beginning at
|
||||
# "-Begin Certificate" through "-End Certificate--" and save as a .crt, for
|
||||
# example: ldapserver.crt
|
||||
# $ CERT=ldapserver.crt
|
||||
# $ cp /root/$CERT /usr/share/ca-certificates/$CERT
|
||||
# # notice the + sign which tells to activate the certificate.
|
||||
# $ echo "+$CERT" >/etc/ca-certificates/update.d/activate_my_cert
|
||||
# $ dpkg-reconfigure ca-certificates;
|
||||
AUTH_LDAP_START_TLS = False
|
||||
|
||||
LDAP_ADDITIONAL_USER_DN = 'dc=people'
|
||||
LDAP_ADMIN_DN = ''
|
||||
LDAP_BASE_DN = 'dc=<top level dc>,dc=co,dc=in'
|
||||
LDAP_PASSWORD = ''
|
||||
LDAP_USER_AUTO_CREATION = 'False'
|
||||
LDAP_URL = 'ldap://<LDAP server>:389/'
|
||||
|
||||
AUTH_LDAP_BIND_DN = LDAP_ADMIN_DN
|
||||
AUTH_LDAP_BIND_PASSWORD = LDAP_PASSWORD
|
||||
AUTH_LDAP_SERVER_URI = LDAP_URL
|
||||
|
||||
# Simple search
|
||||
AUTH_LDAP_USER_SEARCH = LDAPSearch(
|
||||
'%s,%s' % (LDAP_ADDITIONAL_USER_DN, LDAP_BASE_DN),
|
||||
ldap.SCOPE_SUBTREE, '(uid=%(user)s)'
|
||||
)
|
||||
|
||||
# If you need to search in more than one place for a user, you can use
|
||||
# LDAPSearchUnion. This takes multiple LDAPSearch objects and returns the
|
||||
# union of the results. The precedence of the underlying searches is
|
||||
# unspecified.
|
||||
# https://django-auth-ldap.readthedocs.io/en/latest/authentication.html
|
||||
# AUTH_LDAP_USER_SEARCH = LDAPSearchUnion(
|
||||
# LDAPSearch(
|
||||
# 'ou=Users,ou=Admin,dc=<top level DC>,dc=local', ldap.SCOPE_SUBTREE,
|
||||
# '(samaccountname=%(user)s)'
|
||||
# ),
|
||||
# LDAPSearch(
|
||||
# 'ou=Users,ou=<second OU>,dc=<top level DC>,dc=local',
|
||||
# ldap.SCOPE_SUBTREE, '(samaccountname=%(user)s)'
|
||||
# ),
|
||||
# LDAPSearch(
|
||||
# 'ou=Users,ou=<third OU>,dc=<top level DC>,dc=local',
|
||||
# ldap.SCOPE_SUBTREE, '(samaccountname=%(user)s)'
|
||||
# ),
|
||||
# )
|
||||
|
||||
# User attributes to map from LDAP to Mayan's user model.
|
||||
AUTH_LDAP_USER_ATTR_MAP = {
|
||||
'first_name': 'cn',
|
||||
'last_name': 'sn',
|
||||
'email': 'mail'
|
||||
}
|
||||
# Another example map
|
||||
# AUTH_LDAP_USER_ATTR_MAP = {
|
||||
# 'username': 'sAMAccountName',
|
||||
# 'first_name': 'givenName',
|
||||
# 'last_name': 'sn',
|
||||
# 'email': 'mail'
|
||||
# }
|
||||
# Only string fields can be mapped to attributes. Boolean fields can be
|
||||
# defined by group membership:
|
||||
# AUTH_LDAP_USER_FLAGS_BY_GROUP = {
|
||||
# 'is_active': 'cn=active,ou=groups,dc=example,dc=com',
|
||||
# 'is_staff': (
|
||||
# LDAPGroupQuery('cn=staff,ou=groups,dc=example,dc=com')
|
||||
# | LDAPGroupQuery('cn=admin,ou=groups,dc=example,dc=com')
|
||||
# ),
|
||||
# 'is_superuser': 'cn=superuser,ou=groups,dc=example,dc=com',
|
||||
# }
|
||||
|
||||
# Simple group search
|
||||
# AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
|
||||
# 'ou=groups,dc=example,dc=com', ldap.SCOPE_SUBTREE, '(objectClass=groupOfNames)'
|
||||
# )
|
||||
# AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
|
||||
|
||||
# Advanced group search
|
||||
# AUTH_LDAP_GROUP_SEARCH = LDAPSearchUnion(
|
||||
# LDAPSearch(
|
||||
# 'ou=Domain Global,OU=Security,OU=Groups,OU=<OU>,dc=<top level DC>,dc=local',
|
||||
# ldap.SCOPE_SUBTREE,
|
||||
# '(&(objectClass=group)(groupType:1.2.840.113556.1.4.803:=2147483648))'
|
||||
# ),
|
||||
# LDAPSearch(
|
||||
# 'ou=Domain Global,OU=Security,OU=Groups,OU=<OU>,dc=<top level DC>,dc=local',
|
||||
# ldap.SCOPE_SUBTREE,
|
||||
# '(&(objectClass=group)(groupType:1.2.840.113556.1.4.803:=2147483648))'
|
||||
# ),
|
||||
# )
|
||||
# AUTH_LDAP_CACHE_GROUPS = True
|
||||
# AUTH_LDAP_FIND_GROUP_PERMS = False
|
||||
# AUTH_LDAP_GROUP_TYPE = NestedActiveDirectoryGroupType()
|
||||
# AUTH_LDAP_MIRROR_GROUPS = True
|
||||
|
||||
# To minimize traffic to the LDAP server, LDAPBackend can make use of
|
||||
# Django’s cache framework to keep a copy of a user’s LDAP group memberships.
|
||||
# To enable this feature, set AUTH_LDAP_CACHE_TIMEOUT, which determines
|
||||
# the timeout of cache entries in seconds.
|
||||
# AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600
|
||||
|
||||
# Limiting Access
|
||||
# The simplest use of groups is to limit the users who are allowed to log in.
|
||||
# If AUTH_LDAP_REQUIRE_GROUP is set, then only users who are members of that
|
||||
# group will successfully authenticate. AUTH_LDAP_DENY_GROUP is the reverse:
|
||||
# if given, members of this group will be rejected.
|
||||
# AUTH_LDAP_REQUIRE_GROUP = 'cn=enabled,ou=groups,dc=example,dc=com'
|
||||
# AUTH_LDAP_DENY_GROUP = 'cn=disabled,ou=groups,dc=example,dc=com'
|
||||
|
||||
AUTHENTICATION_BACKENDS = (
|
||||
'django_auth_ldap.backend.LDAPBackend',
|
||||
)
|
||||
|
||||
165
docker/Dockerfile
Executable file
165
docker/Dockerfile
Executable file
@@ -0,0 +1,165 @@
|
||||
# vim:set ft=dockerfile:
|
||||
|
||||
####
|
||||
# BASE_IMAGE - Bare bones image with the base packages needed to run Mayan EDMS
|
||||
####
|
||||
|
||||
FROM debian:10.0-slim as BASE_IMAGE
|
||||
|
||||
LABEL maintainer="Roberto Rosario roberto.rosario@mayan-edms.com"
|
||||
|
||||
COPY config.env /config.env
|
||||
|
||||
ENV PYTHONUNBUFFERED=1 \
|
||||
LC_ALL=C.UTF-8 \
|
||||
PROJECT_INSTALL_DIR=/opt/mayan-edms
|
||||
|
||||
# Debian package caching
|
||||
ARG APT_PROXY
|
||||
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 \
|
||||
ca-certificates \
|
||||
exiftool \
|
||||
fonts-arphic-uming \
|
||||
fonts-arphic-ukai \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
gnupg1 \
|
||||
graphviz \
|
||||
libfuse2 \
|
||||
libmagic1 \
|
||||
libmariadb3 \
|
||||
libreoffice \
|
||||
libpq5 \
|
||||
poppler-utils \
|
||||
python3-distutils \
|
||||
sane-utils \
|
||||
sudo \
|
||||
supervisor \
|
||||
tesseract-ocr tesseract-ocr-deu \
|
||||
# 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)
|
||||
&& 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)
|
||||
&& 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
|
||||
|
||||
####
|
||||
# BUILDER_IMAGE - This image builds the Python package and is discarded afterwards
|
||||
# only the build artifact is carried over to the next image.
|
||||
####
|
||||
|
||||
# Reuse image
|
||||
FROM BASE_IMAGE as BUILDER_IMAGE
|
||||
|
||||
# Python libraries caching
|
||||
ARG PIP_INDEX_URL
|
||||
ARG PIP_TRUSTED_HOST
|
||||
|
||||
WORKDIR /src
|
||||
|
||||
# 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/
|
||||
|
||||
COPY --chown=mayan:mayan mayan /src/mayan
|
||||
|
||||
# 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 \
|
||||
python3-dev \
|
||||
python3-venv \
|
||||
&& mkdir -p "${PROJECT_INSTALL_DIR}" \
|
||||
&& chown -R mayan:mayan "${PROJECT_INSTALL_DIR}" \
|
||||
&& chown -R mayan:mayan /src
|
||||
|
||||
USER mayan
|
||||
|
||||
RUN set -a \
|
||||
&& . /config.env \
|
||||
&& set +a \
|
||||
&& python3 -m venv "${PROJECT_INSTALL_DIR}" \
|
||||
&& . "${PROJECT_INSTALL_DIR}/bin/activate" \
|
||||
&& pip install --no-cache-dir \
|
||||
amqp==$PYTHON_AMQP_VERSION \
|
||||
mysqlclient==$PYTHON_MYSQL_VERSION \
|
||||
psycopg2==$PYTHON_PSYCOPG2_VERSION \
|
||||
redis==$PYTHON_REDIS_VERSION \
|
||||
flower==$PYTHON_FLOWER_VERSION \
|
||||
# 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 \
|
||||
psutil==$PYTHON_PSUTIL_VERSION \
|
||||
; fi \
|
||||
# Install the Python packages needed to build Mayan EDMS
|
||||
&& pip install --no-cache-dir -r /src/requirements/build.txt \
|
||||
# Build Mayan EDMS
|
||||
&& python3 setup.py sdist \
|
||||
# Install the built Mayan EDMS package
|
||||
&& pip install --no-cache-dir dist/mayan* \
|
||||
# Install the static content
|
||||
&& mayan-edms.py installdependencies \
|
||||
&& MAYAN_STATIC_ROOT=${PROJECT_INSTALL_DIR}/static mayan-edms.py preparestatic --link --noinput
|
||||
|
||||
COPY --chown=mayan:mayan requirements/testing-base.txt "${PROJECT_INSTALL_DIR}"
|
||||
|
||||
####
|
||||
# Final image - BASE_IMAGE + BUILDER_IMAGE artifact (Mayan install directory)
|
||||
####
|
||||
|
||||
FROM BASE_IMAGE
|
||||
|
||||
COPY --from=BUILDER_IMAGE --chown=mayan:mayan "${PROJECT_INSTALL_DIR}/" "${PROJECT_INSTALL_DIR}/"
|
||||
|
||||
USER root
|
||||
|
||||
COPY docker/rootfs /
|
||||
|
||||
VOLUME ["/var/lib/mayan"]
|
||||
|
||||
ENTRYPOINT ["entrypoint.sh"]
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["run_all"]
|
||||
|
||||
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;
|
||||
130
docker/Makefile
Executable file
130
docker/Makefile
Executable file
@@ -0,0 +1,130 @@
|
||||
#!make
|
||||
include config.env
|
||||
|
||||
HOST_IP = `/sbin/ip route|awk '/docker0/ { print $$9 }'`
|
||||
APT_PROXY ?= $(HOST_IP):3142
|
||||
CONSOLE_COLUMNS ?= `echo $$(tput cols)`
|
||||
CONSOLE_LINES ?= `echo $$(tput lines)`
|
||||
IMAGE_VERSION ?= `cat docker/rootfs/version`
|
||||
PIP_INDEX_URL ?= http://$(HOST_IP):3141/root/pypi/+simple/
|
||||
PIP_TRUSTED_HOST ?= $(HOST_IP)
|
||||
|
||||
docker-build: ## Build a new image locally.
|
||||
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile .
|
||||
|
||||
docker-build-with-proxy: ## Build a new image locally using an APT proxy as APT_PROXY.
|
||||
docker-build-with-proxy: devpi-start
|
||||
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile --build-arg APT_PROXY=$(APT_PROXY) --build-arg PIP_INDEX_URL=$(PIP_INDEX_URL) --build-arg PIP_TRUSTED_HOST=$(PIP_TRUSTED_HOST) --build-arg HTTP_PROXY=$(HTTP_PROXY) --build-arg HTTPS_PROXY=$(HTTPS_PROXY) .
|
||||
$(MAKE) devpi-stop
|
||||
|
||||
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-runtest-container: ## Run a test container.
|
||||
docker-runtest-container: docker-test-cleanup
|
||||
docker run \
|
||||
-d \
|
||||
--name test-mayan-edms \
|
||||
-p 80:8000 \
|
||||
-v test-mayan_data:/var/lib/mayan \
|
||||
mayanedms/mayanedms:$(IMAGE_VERSION)
|
||||
|
||||
docker-runtest-cleanup: ## Delete the test container and the test volume.
|
||||
@docker rm -f test-mayan-edms || true
|
||||
@docker volume rm test-mayan_data || true
|
||||
|
||||
docker-runtest-all: ## Executed the test suite in a test container.
|
||||
docker run --rm mayanedms/mayanedms:$(IMAGE_VERSION) run_tests
|
||||
|
||||
docker-compose-build:
|
||||
docker-compose -f docker/docker-compose.yml -p mayan-edms build
|
||||
|
||||
docker-compose-build-with-proxy: devpi-start
|
||||
docker-compose -f docker/docker-compose.yml -p mayan-edms build --build-arg APT_PROXY=$(APT_PROXY) --build-arg PIP_INDEX_URL=$(PIP_INDEX_URL) --build-arg PIP_TRUSTED_HOST=$(PIP_TRUSTED_HOST) --build-arg HTTP_PROXY=$(HTTP_PROXY) --build-arg HTTPS_PROXY=$(HTTPS_PROXY)
|
||||
$(MAKE) devpi-stop
|
||||
|
||||
docker-compose-up:
|
||||
docker-compose -f docker/docker-compose.yml -p mayan-edms up
|
||||
|
||||
docker-staging-network-create:
|
||||
@docker network rm mayan-staging || true
|
||||
docker network create mayan-staging
|
||||
|
||||
docker-staging-container-postgresql-start:
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-staging-postgres \
|
||||
--network=mayan-staging \
|
||||
-e POSTGRES_USER=mayan \
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v mayan-staging-postgres:/var/lib/postgresql/data \
|
||||
$(DOCKER_POSTGRES_IMAGE_VERSION)
|
||||
|
||||
docker-staging-container-redis-start:
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-staging-redis \
|
||||
--network=mayan-staging \
|
||||
-v mayan-staging-redis:/data \
|
||||
$(DOCKER_REDIS_IMAGE_VERSION) \
|
||||
redis-server \
|
||||
--databases \
|
||||
"2" \
|
||||
--maxmemory-policy \
|
||||
allkeys-lru \
|
||||
--save \
|
||||
""
|
||||
|
||||
docker-staging-container-rabbitmq-start:
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-staging-rabbitmq \
|
||||
--network=mayan-staging \
|
||||
-v mayan-staging-rabbitmq:/var/lib/rabbitmq \
|
||||
$(DOCKER_RABBITMQ_IMAGE_VERSION) \
|
||||
|
||||
docker-staging-container-mayan-start:
|
||||
sleep 5 && docker run \
|
||||
-d \
|
||||
--name mayan-staging-app \
|
||||
--network=mayan-staging \
|
||||
-p 80:8000 \
|
||||
-e MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
|
||||
-e MAYAN_DATABASE_HOST=mayan-staging-postgres \
|
||||
-e MAYAN_DATABASE_NAME=mayan \
|
||||
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
|
||||
-e MAYAN_DATABASE_USER=mayan \
|
||||
-e MAYAN_CELERY_BROKER_URL=$(MAYAN_CELERY_BROKER_URL) \
|
||||
-e MAYAN_CELERY_RESULT_BACKEND="redis://mayan-staging-redis:6379/1" \
|
||||
-v mayan-staging-app:/var/lib/mayan \
|
||||
mayanedms/mayanedms:$(IMAGE_VERSION)
|
||||
|
||||
docker-staging-start-with-rabbitmq: MAYAN_CELERY_BROKER_URL="amqp://guest:guest@mayan-staging-rabbitmq:5672/"
|
||||
docker-staging-start-with-rabbitmq: docker-staging-start
|
||||
|
||||
docker-staging-start-with-redis: MAYAN_CELERY_BROKER_URL="redis://mayan-staging-redis:6379/0"
|
||||
docker-staging-start-with-redis: docker-staging-start
|
||||
|
||||
docker-staging-start: docker-staging-cleanup docker-staging-network-create docker-staging-container-postgresql-start docker-staging-container-rabbitmq-start docker-staging-container-redis-start docker-staging-container-mayan-start
|
||||
docker logs -f mayan-staging-app
|
||||
|
||||
docker-staging-cleanup: ## Delete the test container and the test volume.
|
||||
@docker rm -f mayan-staging-app || true
|
||||
@docker rm -f mayan-staging-redis || true
|
||||
@docker rm -f mayan-staging-rabbitmq || true
|
||||
@docker rm -f mayan-staging-postgres || true
|
||||
@docker volume rm mayan-staging-app || true
|
||||
@docker volume rm mayan-staging-postgres || true
|
||||
@docker volume rm mayan-staging-rabbitmq || true
|
||||
@docker volume rm mayan-staging-redis || true
|
||||
@docker network rm mayan-staging || true
|
||||
|
||||
devpi-init:
|
||||
devpi-server --init || true
|
||||
|
||||
devpi-start: devpi-init
|
||||
devpi-server --start --host=0.0.0.0 || true
|
||||
|
||||
devpi-stop:
|
||||
devpi-server --stop || true
|
||||
130
docker/docker-compose.yml
Executable file
130
docker/docker-compose.yml
Executable file
@@ -0,0 +1,130 @@
|
||||
version: '3.7'
|
||||
|
||||
networks:
|
||||
mayan-bridge:
|
||||
driver: bridge
|
||||
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: ./docker/Dockerfile
|
||||
depends_on:
|
||||
- postgresql
|
||||
- redis
|
||||
# Enable to use RabbitMQ
|
||||
#- rabbitmq
|
||||
environment: &mayan_env
|
||||
# Enable to use RabbitMQ
|
||||
# MAYAN_CELERY_BROKER_URL: amqp://mayan:mayanrabbitpass@broker:5672/mayan
|
||||
# Disable Redis Broker to use RabbitMQ as Broker
|
||||
MAYAN_CELERY_BROKER_URL: redis://redis:6379/0
|
||||
MAYAN_CELERY_RESULT_BACKEND: redis://redis:6379/1
|
||||
MAYAN_DATABASES: "{'default':{'ENGINE':'django.db.backends.postgresql','NAME':'mayan','PASSWORD':'mayandbpass','USER':'mayan','HOST':'postgresql'}}"
|
||||
image: mayanedms/mayanedms:3.3
|
||||
networks:
|
||||
- mayan-bridge
|
||||
ports:
|
||||
- "80:8000"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /docker-volumes/mayan-edms/media:/var/lib/mayan
|
||||
|
||||
postgresql:
|
||||
environment:
|
||||
POSTGRES_DB: mayan
|
||||
POSTGRES_PASSWORD: mayandbpass
|
||||
POSTGRES_USER: mayan
|
||||
image: postgres:9.6-alpine
|
||||
networks:
|
||||
- mayan-bridge
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data
|
||||
|
||||
redis:
|
||||
command:
|
||||
- redis-server
|
||||
- --databases
|
||||
- "2"
|
||||
- --maxmemory-policy
|
||||
- allkeys-lru
|
||||
- --save
|
||||
- ""
|
||||
image: redis:5.0-alpine
|
||||
networks:
|
||||
- mayan-bridge
|
||||
restart: unless-stopped
|
||||
|
||||
# Optional services
|
||||
|
||||
# celery_flower:
|
||||
# command:
|
||||
# - run_celery
|
||||
# - flower
|
||||
# depends_on:
|
||||
# - postgresql
|
||||
# - redis
|
||||
# # Enable to use RabbitMQ
|
||||
# # - rabbitmq
|
||||
# environment:
|
||||
# <<: *mayan_env
|
||||
# image: mayanedms/mayanedms:3.3
|
||||
# networks:
|
||||
# - mayan-bridge
|
||||
# ports:
|
||||
# - "5555:5555"
|
||||
# restart: unless-stopped
|
||||
|
||||
# Enable to use RabbitMQ
|
||||
# rabbitmq:
|
||||
# container_name: mayan-edms-rabbitmq
|
||||
# image: healthcheck/rabbitmq
|
||||
# environment:
|
||||
# RABBITMQ_DEFAULT_USER: mayan
|
||||
# RABBITMQ_DEFAULT_PASS: mayanrabbitpass
|
||||
# RABBITMQ_DEFAULT_VHOST: mayan
|
||||
# networks:
|
||||
# - mayan-bridge
|
||||
# restart: unless-stopped
|
||||
# volumes:
|
||||
# - /docker-volumes/mayan-edms/rabbitmq:/var/lib/rabbitmq
|
||||
|
||||
# Enable to run standalone workers
|
||||
# worker_fast:
|
||||
# command:
|
||||
# - run_worker
|
||||
# - fast
|
||||
# depends_on:
|
||||
# - postgresql
|
||||
# - redis
|
||||
# # Enable to use RabbitMQ
|
||||
# # - rabbitmq
|
||||
# environment:
|
||||
# <<: *mayan_env
|
||||
# image: mayanedms/mayanedms:3.3
|
||||
# networks:
|
||||
# - mayan-bridge
|
||||
# restart: unless-stopped
|
||||
# volumes:
|
||||
# - /docker-volumes/mayan-edms/media:/var/lib/mayan
|
||||
|
||||
# Enable to run frontend gunicorn
|
||||
# frontend:
|
||||
# command:
|
||||
# - run_frontend
|
||||
# depends_on:
|
||||
# - postgresql
|
||||
# - redis
|
||||
# # Enable to use RabbitMQ
|
||||
# # - rabbitmq
|
||||
# environment:
|
||||
# <<: *mayan_env
|
||||
# image: mayanedms/mayanedms:3.3
|
||||
# networks:
|
||||
# - mayan-bridge
|
||||
# ports:
|
||||
# - "81:8000"
|
||||
# restart: unless-stopped
|
||||
# volumes:
|
||||
# - /docker-volumes/mayan-edms/media:/var/lib/mayan
|
||||
169
docker/rootfs/usr/local/bin/entrypoint.sh
Executable file
169
docker/rootfs/usr/local/bin/entrypoint.sh
Executable file
@@ -0,0 +1,169 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Use bash and not sh to support argument slicing "${@:2}"
|
||||
# sh defaults to dash instead of bash.
|
||||
|
||||
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_ALLOWED_HOSTS='["*"]'
|
||||
export MAYAN_BIN=/opt/mayan-edms/bin/mayan-edms.py
|
||||
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 DJANGO_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE}
|
||||
|
||||
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:-0}
|
||||
MAYAN_WORKER_MEDIUM_CONCURRENCY=${MAYAN_WORKER_MEDIUM_CONCURRENCY:-0}
|
||||
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 -R 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
|
||||
|
||||
# Allow importing of user setting modules
|
||||
export PYTHONPATH=$PYTHONPATH:$MAYAN_MEDIA_ROOT
|
||||
|
||||
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/*
|
||||
}
|
||||
|
||||
initialsetup() {
|
||||
echo "mayan: initialsetup()"
|
||||
su mayan -c "${MAYAN_BIN} initialsetup --force --no-dependencies"
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
run_all() {
|
||||
echo "mayan: start()"
|
||||
rm -rf /var/run/supervisor.sock
|
||||
exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
|
||||
}
|
||||
|
||||
performupgrade() {
|
||||
echo "mayan: performupgrade()"
|
||||
su mayan -c "${MAYAN_BIN} performupgrade --no-dependencies"
|
||||
}
|
||||
|
||||
make_ready() {
|
||||
# Check if this is a new install, otherwise try to upgrade the existing
|
||||
# installation on subsequent starts
|
||||
if [ ! -f $INSTALL_FLAG ]; then
|
||||
initialsetup
|
||||
else
|
||||
performupgrade
|
||||
fi
|
||||
}
|
||||
|
||||
set_uid_guid() {
|
||||
echo "mayan: changing uid/guid"
|
||||
usermod mayan -u ${MAYAN_USER_UID:-${DEFAULT_USER_UID}}
|
||||
groupmod mayan -g ${MAYAN_USER_GID:-${DEFAULT_USER_GID}}
|
||||
}
|
||||
|
||||
os_package_installs || true
|
||||
pip_installs || true
|
||||
chown mayan:mayan /var/lib/mayan -R
|
||||
|
||||
case "$1" in
|
||||
|
||||
run_initialsetup)
|
||||
initialsetup
|
||||
;;
|
||||
|
||||
run_performupgrade)
|
||||
performupgrade
|
||||
;;
|
||||
|
||||
run_all)
|
||||
make_ready
|
||||
run_all
|
||||
;;
|
||||
|
||||
run_celery)
|
||||
run_celery.sh "${@:2}"
|
||||
;;
|
||||
|
||||
run_command)
|
||||
su mayan -c "${MAYAN_BIN} ${@:2}"
|
||||
;;
|
||||
|
||||
run_frontend)
|
||||
run_frontend.sh
|
||||
;;
|
||||
|
||||
run_tests)
|
||||
make_ready
|
||||
run_tests.sh "${@:2}"
|
||||
;;
|
||||
|
||||
run_worker)
|
||||
run_worker.sh "${@:2}"
|
||||
;;
|
||||
|
||||
*)
|
||||
su mayan -c "$@"
|
||||
;;
|
||||
|
||||
esac
|
||||
5
docker/rootfs/usr/local/bin/run_celery.sh
Executable file
5
docker/rootfs/usr/local/bin/run_celery.sh
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Use -A and not --app. Both are the same but behave differently
|
||||
# -A can be located before the command while --app cannot.
|
||||
su mayan -c "${MAYAN_PYTHON_BIN_DIR}celery -A mayan $@"
|
||||
7
docker/rootfs/usr/local/bin/run_frontend.sh
Executable file
7
docker/rootfs/usr/local/bin/run_frontend.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
MAYAN_GUNICORN_MAX_REQUESTS=${MAYAN_GUNICORN_MAX_REQUESTS:-500}
|
||||
MAYAN_GUNICORN_MAX_REQUESTS_JITTERS=${MAYAN_GUNICORN_MAX_REQUESTS_JITTERS:-50}
|
||||
MAYAN_GUNICORN_WORKER_CLASS=${MAYAN_GUNICORN_WORKER_CLASS:-sync}
|
||||
|
||||
su mayan -c "${MAYAN_PYTHON_BIN_DIR}gunicorn -w ${MAYAN_GUNICORN_WORKERS} mayan.wsgi --max-requests ${MAYAN_GUNICORN_MAX_REQUESTS} --max-requests-jitter ${MAYAN_GUNICORN_MAX_REQUESTS_JITTERS} --worker-class ${MAYAN_GUNICORN_WORKER_CLASS} --bind 0.0.0.0:8000 --timeout ${MAYAN_GUNICORN_TIMEOUT}"
|
||||
11
docker/rootfs/usr/local/bin/run_tests.sh
Executable file
11
docker/rootfs/usr/local/bin/run_tests.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
TEST_ARGUMENT=${@:-"--mayan-apps"}
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends gcc python3-dev tesseract-ocr-deu
|
||||
|
||||
su mayan -c "${MAYAN_PIP_BIN} install -r ${MAYAN_INSTALL_DIR}/testing-base.txt"
|
||||
|
||||
su mayan -c "${MAYAN_BIN} test ${TEST_ARGUMENT} --settings=mayan.settings.testing"
|
||||
12
docker/rootfs/usr/local/bin/run_worker.sh
Executable file
12
docker/rootfs/usr/local/bin/run_worker.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
export MAYAN_WORKER_NAME=${MAYAN_WORKER_NAME:-$1}
|
||||
|
||||
QUEUE_LIST_DEFAULT=`su mayan -c "${MAYAN_PYTHON_BIN_DIR}mayan-edms.py platformtemplate worker_queues"`
|
||||
|
||||
MAYAN_QUEUE_LIST=${MAYAN_QUEUE_LIST:-${QUEUE_LIST_DEFAULT}}
|
||||
|
||||
# Use -A and not --app. Both are the same but behave differently
|
||||
# -A can be located before the command while --app cannot.
|
||||
# Pass ${@:2} to allow overriding the defaults arguments
|
||||
su mayan -c "${MAYAN_PYTHON_BIN_DIR}celery -A mayan worker -Ofair -l ERROR -Q ${MAYAN_QUEUE_LIST} ${@:2}"
|
||||
1
docker/rootfs/version
Executable file
1
docker/rootfs/version
Executable file
@@ -0,0 +1 @@
|
||||
3.3.6
|
||||
40
docker/stack.yml
Normal file
40
docker/stack.yml
Normal file
@@ -0,0 +1,40 @@
|
||||
version: '3.1'
|
||||
|
||||
volumes:
|
||||
app:
|
||||
driver: local
|
||||
db:
|
||||
driver: local
|
||||
|
||||
services:
|
||||
|
||||
db:
|
||||
environment:
|
||||
POSTGRES_DB: mayan
|
||||
POSTGRES_PASSWORD: mayandbpass
|
||||
POSTGRES_USER: mayan
|
||||
image: postgres
|
||||
volumes:
|
||||
- db:/var/lib/postgresql/data
|
||||
|
||||
app:
|
||||
environment:
|
||||
MAYAN_CELERY_BROKER_URL: redis://redis:6379/1
|
||||
MAYAN_CELERY_RESULT_BACKEND: redis://redis:6379/0
|
||||
MAYAN_DATABASES: "{'default':{'ENGINE':'django.db.backends.postgresql','NAME':'mayan','PASSWORD':'mayandbpass','USER':'mayan','HOST':'db'}}"
|
||||
image: mayanedms/mayanedms:latest
|
||||
ports:
|
||||
- 80:8000
|
||||
volumes:
|
||||
- app:/var/lib/mayan
|
||||
|
||||
redis:
|
||||
command:
|
||||
- redis-server
|
||||
- --databases
|
||||
- "2"
|
||||
- --maxmemory-policy
|
||||
- allkeys-lru
|
||||
- --save
|
||||
- ""
|
||||
image: redis:5.0
|
||||
@@ -1,229 +0,0 @@
|
||||
"""
|
||||
Sphinx plugins for Django documentation.
|
||||
"""
|
||||
import os
|
||||
import re
|
||||
|
||||
from docutils import nodes, transforms
|
||||
try:
|
||||
import json
|
||||
except ImportError:
|
||||
try:
|
||||
import simplejson as json
|
||||
except ImportError:
|
||||
try:
|
||||
from django.utils import simplejson as json
|
||||
except ImportError:
|
||||
json = None
|
||||
|
||||
from sphinx import addnodes, roles, __version__ as sphinx_ver
|
||||
from sphinx.builders.html import StandaloneHTMLBuilder
|
||||
from sphinx.writers.html import SmartyPantsHTMLTranslator
|
||||
from sphinx.util.console import bold
|
||||
from sphinx.util.compat import Directive
|
||||
|
||||
# RE for option descriptions without a '--' prefix
|
||||
simple_option_desc_re = re.compile(
|
||||
r'([-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)')
|
||||
|
||||
def setup(app):
|
||||
app.add_crossref_type(
|
||||
directivename = "setting",
|
||||
rolename = "setting",
|
||||
indextemplate = "pair: %s; setting",
|
||||
)
|
||||
app.add_crossref_type(
|
||||
directivename = "templatetag",
|
||||
rolename = "ttag",
|
||||
indextemplate = "pair: %s; template tag"
|
||||
)
|
||||
app.add_crossref_type(
|
||||
directivename = "templatefilter",
|
||||
rolename = "tfilter",
|
||||
indextemplate = "pair: %s; template filter"
|
||||
)
|
||||
app.add_crossref_type(
|
||||
directivename = "fieldlookup",
|
||||
rolename = "lookup",
|
||||
indextemplate = "pair: %s; field lookup type",
|
||||
)
|
||||
app.add_description_unit(
|
||||
directivename = "django-admin",
|
||||
rolename = "djadmin",
|
||||
indextemplate = "pair: %s; django-admin command",
|
||||
parse_node = parse_django_admin_node,
|
||||
)
|
||||
app.add_description_unit(
|
||||
directivename = "django-admin-option",
|
||||
rolename = "djadminopt",
|
||||
indextemplate = "pair: %s; django-admin command-line option",
|
||||
parse_node = parse_django_adminopt_node,
|
||||
)
|
||||
app.add_config_value('django_next_version', '0.0', True)
|
||||
app.add_directive('versionadded', VersionDirective)
|
||||
app.add_directive('versionchanged', VersionDirective)
|
||||
app.add_builder(DjangoStandaloneHTMLBuilder)
|
||||
|
||||
|
||||
class VersionDirective(Directive):
|
||||
has_content = True
|
||||
required_arguments = 1
|
||||
optional_arguments = 1
|
||||
final_argument_whitespace = True
|
||||
option_spec = {}
|
||||
|
||||
def run(self):
|
||||
env = self.state.document.settings.env
|
||||
arg0 = self.arguments[0]
|
||||
is_nextversion = env.config.django_next_version == arg0
|
||||
ret = []
|
||||
node = addnodes.versionmodified()
|
||||
ret.append(node)
|
||||
if not is_nextversion:
|
||||
if len(self.arguments) == 1:
|
||||
linktext = 'Please see the release notes </releases/%s>' % (arg0)
|
||||
xrefs = roles.XRefRole()('doc', linktext, linktext, self.lineno, self.state)
|
||||
node.extend(xrefs[0])
|
||||
node['version'] = arg0
|
||||
else:
|
||||
node['version'] = "Development version"
|
||||
node['type'] = self.name
|
||||
if len(self.arguments) == 2:
|
||||
inodes, messages = self.state.inline_text(self.arguments[1], self.lineno+1)
|
||||
node.extend(inodes)
|
||||
if self.content:
|
||||
self.state.nested_parse(self.content, self.content_offset, node)
|
||||
ret = ret + messages
|
||||
env.note_versionchange(node['type'], node['version'], node, self.lineno)
|
||||
return ret
|
||||
|
||||
|
||||
class DjangoHTMLTranslator(SmartyPantsHTMLTranslator):
|
||||
"""
|
||||
Django-specific reST to HTML tweaks.
|
||||
"""
|
||||
|
||||
# Don't use border=1, which docutils does by default.
|
||||
def visit_table(self, node):
|
||||
self._table_row_index = 0 # Needed by Sphinx
|
||||
self.body.append(self.starttag(node, 'table', CLASS='docutils'))
|
||||
|
||||
# <big>? Really?
|
||||
def visit_desc_parameterlist(self, node):
|
||||
self.body.append('(')
|
||||
self.first_param = 1
|
||||
self.param_separator = node.child_text_separator
|
||||
|
||||
def depart_desc_parameterlist(self, node):
|
||||
self.body.append(')')
|
||||
|
||||
if sphinx_ver < '1.0.8':
|
||||
#
|
||||
# Don't apply smartypants to literal blocks
|
||||
#
|
||||
def visit_literal_block(self, node):
|
||||
self.no_smarty += 1
|
||||
SmartyPantsHTMLTranslator.visit_literal_block(self, node)
|
||||
|
||||
def depart_literal_block(self, node):
|
||||
SmartyPantsHTMLTranslator.depart_literal_block(self, node)
|
||||
self.no_smarty -= 1
|
||||
|
||||
#
|
||||
# Turn the "new in version" stuff (versionadded/versionchanged) into a
|
||||
# better callout -- the Sphinx default is just a little span,
|
||||
# which is a bit less obvious that I'd like.
|
||||
#
|
||||
# FIXME: these messages are all hardcoded in English. We need to change
|
||||
# that to accomodate other language docs, but I can't work out how to make
|
||||
# that work.
|
||||
#
|
||||
version_text = {
|
||||
'deprecated': 'Deprecated in Django %s',
|
||||
'versionchanged': 'Changed in Django %s',
|
||||
'versionadded': 'New in Django %s',
|
||||
}
|
||||
|
||||
def visit_versionmodified(self, node):
|
||||
self.body.append(
|
||||
self.starttag(node, 'div', CLASS=node['type'])
|
||||
)
|
||||
title = "%s%s" % (
|
||||
self.version_text[node['type']] % node['version'],
|
||||
len(node) and ":" or "."
|
||||
)
|
||||
self.body.append('<span class="title">%s</span> ' % title)
|
||||
|
||||
def depart_versionmodified(self, node):
|
||||
self.body.append("</div>\n")
|
||||
|
||||
# Give each section a unique ID -- nice for custom CSS hooks
|
||||
def visit_section(self, node):
|
||||
old_ids = node.get('ids', [])
|
||||
node['ids'] = ['s-' + i for i in old_ids]
|
||||
node['ids'].extend(old_ids)
|
||||
SmartyPantsHTMLTranslator.visit_section(self, node)
|
||||
node['ids'] = old_ids
|
||||
|
||||
def parse_django_admin_node(env, sig, signode):
|
||||
command = sig.split(' ')[0]
|
||||
env._django_curr_admin_command = command
|
||||
title = "django-admin.py %s" % sig
|
||||
signode += addnodes.desc_name(title, title)
|
||||
return sig
|
||||
|
||||
def parse_django_adminopt_node(env, sig, signode):
|
||||
"""A copy of sphinx.directives.CmdoptionDesc.parse_signature()"""
|
||||
from sphinx.domains.std import option_desc_re
|
||||
count = 0
|
||||
firstname = ''
|
||||
for m in option_desc_re.finditer(sig):
|
||||
optname, args = m.groups()
|
||||
if count:
|
||||
signode += addnodes.desc_addname(', ', ', ')
|
||||
signode += addnodes.desc_name(optname, optname)
|
||||
signode += addnodes.desc_addname(args, args)
|
||||
if not count:
|
||||
firstname = optname
|
||||
count += 1
|
||||
if not count:
|
||||
for m in simple_option_desc_re.finditer(sig):
|
||||
optname, args = m.groups()
|
||||
if count:
|
||||
signode += addnodes.desc_addname(', ', ', ')
|
||||
signode += addnodes.desc_name(optname, optname)
|
||||
signode += addnodes.desc_addname(args, args)
|
||||
if not count:
|
||||
firstname = optname
|
||||
count += 1
|
||||
if not firstname:
|
||||
raise ValueError
|
||||
return firstname
|
||||
|
||||
|
||||
class DjangoStandaloneHTMLBuilder(StandaloneHTMLBuilder):
|
||||
"""
|
||||
Subclass to add some extra things we need.
|
||||
"""
|
||||
|
||||
name = 'djangohtml'
|
||||
|
||||
def finish(self):
|
||||
super(DjangoStandaloneHTMLBuilder, self).finish()
|
||||
if json is None:
|
||||
self.warn("cannot create templatebuiltins.js due to missing simplejson dependency")
|
||||
return
|
||||
self.info(bold("writing templatebuiltins.js..."))
|
||||
xrefs = self.env.domaindata["std"]["objects"]
|
||||
templatebuiltins = {
|
||||
"ttags": [n for ((t, n), (l, a)) in xrefs.items()
|
||||
if t == "templatetag" and l == "ref/templates/builtins"],
|
||||
"tfilters": [n for ((t, n), (l, a)) in xrefs.items()
|
||||
if t == "templatefilter" and l == "ref/templates/builtins"],
|
||||
}
|
||||
outfilename = os.path.join(self.outdir, "templatebuiltins.js")
|
||||
f = open(outfilename, 'wb')
|
||||
f.write('var django_template_builtins = ')
|
||||
json.dump(templatebuiltins, f)
|
||||
f.write(';\n')
|
||||
f.close();
|
||||
BIN
docs/_static/book_cover.jpg
vendored
Normal file
BIN
docs/_static/book_cover.jpg
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
17
docs/_static/css/custom.css
vendored
Normal file
17
docs/_static/css/custom.css
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
.menuselection {
|
||||
color: white;
|
||||
background: #2c3e50;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.document a.internal {
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted #707070;
|
||||
}
|
||||
|
||||
.document a.internal:visited {
|
||||
color: #2980B9;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted #707070;
|
||||
}
|
||||
|
||||
BIN
docs/_static/overview.gif
vendored
BIN
docs/_static/overview.gif
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 628 KiB After Width: | Height: | Size: 6.6 MiB |
16
docs/_templates/donate.html
vendored
16
docs/_templates/donate.html
vendored
@@ -1,16 +0,0 @@
|
||||
<h3>Support</h3>
|
||||
<p>
|
||||
<a href='http://www.mayan-edms.com/providers/'>Consulting and support plans are available, click here</a>.
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
Or consider supporting Mayan EDMS by contributing to its development. (US tax payers, please note this contribution is not tax deductible).
|
||||
</p>
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<input type="hidden" name="hosted_button_id" value="3PXN336XFXQNN">
|
||||
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
|
||||
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1" style="display: none !important;">
|
||||
</form>
|
||||
|
||||
<hr />
|
||||
41
docs/_templates/message_area.html
vendored
Normal file
41
docs/_templates/message_area.html
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
<style>
|
||||
.wy-body-for-nav #message-area {
|
||||
color: #b3b3b3;
|
||||
margin: 1em 2em 1em 1em;
|
||||
}
|
||||
#message-area {
|
||||
border: 1px dotted #2980B9;
|
||||
padding: .5em;
|
||||
margin: 1em 0;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="message-area">
|
||||
<h3>Get the book!</h3>
|
||||
|
||||
<a href="https://www.mayan-edms.com/book/">
|
||||
<img src="{{ pathto('_static/book_cover.jpg', 1) }}" />
|
||||
</a>
|
||||
|
||||
<hr />
|
||||
|
||||
<p>
|
||||
On-site consulting and support plans are available, <a href='https://www.mayan-edms.com/support/'>click here</a>.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<p>
|
||||
Or consider donating to support the continued development of the project.
|
||||
</p>
|
||||
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<input type="hidden" name="hosted_button_id" value="3PXN336XFXQNN">
|
||||
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
|
||||
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1" style="display: none !important;">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
8
docs/callbacks.py
Normal file
8
docs/callbacks.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
|
||||
def get_source_read_callback(substitutions):
|
||||
def global_substitution_function(app, docname, source):
|
||||
for old, new in substitutions:
|
||||
source[0] = source[0].replace(old, new)
|
||||
return global_substitution_function
|
||||
84
docs/chapters/acls.txt
Normal file
84
docs/chapters/acls.txt
Normal file
@@ -0,0 +1,84 @@
|
||||
====================
|
||||
Access control lists
|
||||
====================
|
||||
|
||||
Besides the permissions system explained in :doc:`../chapters/permissions`,
|
||||
Mayan EDMS provides per object permission granting. This feature is used to
|
||||
grant a permission to a role, but this permission can only be executed for a
|
||||
limited number of objects (documents, folders, tags) instead of being
|
||||
effective system-wide.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document [ label = 'Document' ];
|
||||
role [ label = 'Role' ];
|
||||
permission [ label = 'Permission' ];
|
||||
|
||||
role -> permission -> document;
|
||||
}
|
||||
|
||||
Example:
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document [ label = '2015 Payroll report.txt', width=200 ];
|
||||
role [ label = 'Accountants' ];
|
||||
permission [ label = 'View document' ];
|
||||
|
||||
role -> permission -> document;
|
||||
}
|
||||
|
||||
In this scenario only users in groups belonging to the ``Accountants`` role
|
||||
would be able to view the ``2015 Payroll report.txt`` document.
|
||||
|
||||
Inherited access control
|
||||
========================
|
||||
|
||||
It is also possible to grant a permission to a role for a specific document
|
||||
type (:doc:`../chapters/document_types`). Under this scheme all users in
|
||||
groups belonging to that role will inherit that permission for all documents
|
||||
of that type.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
document_type [ label = 'Document type' ];
|
||||
role [ label = 'Role' ];
|
||||
permission [ label = 'Permission' ];
|
||||
documents [shape = "note", stacked];
|
||||
|
||||
role -> permission -> document_type ;
|
||||
document_type -> documents [folded, label = "inherit" ];
|
||||
}
|
||||
|
||||
Example:
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
document_type [ label = 'Payroll reports', width=200 ];
|
||||
role [ label = 'Accountants' ];
|
||||
permission [ label = 'View document' ];
|
||||
documents [shape = "note", stacked, label="payroll_report*.pdf" ];
|
||||
|
||||
role -> permission -> document_type ;
|
||||
document_type -> documents [folded, label = "inherit" ];
|
||||
}
|
||||
|
||||
The role ``Accountants`` is given the permission ``document view`` for the
|
||||
document type ``Payroll reports``. Now all users in groups belonging to the
|
||||
``Accountants`` role can view all documents of the type ``Payroll reports``
|
||||
without needing to have that permissions granted for each particular
|
||||
``Payroll reports`` type document.
|
||||
|
||||
If access control for the ``Payroll reports`` documents needs to be updated it
|
||||
only needs to be done for the document type and not for each document of the type
|
||||
``Payroll reports``.
|
||||
18
docs/chapters/backups.txt
Normal file
18
docs/chapters/backups.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
=======
|
||||
Backups
|
||||
=======
|
||||
|
||||
To backup your install of Mayan EDMS just copy the ``media`` folder and
|
||||
the database content.
|
||||
|
||||
If you are using the default storage backend, the ``media`` should be located
|
||||
at |MAYAN_MEDIA_ROOT|::
|
||||
|
||||
sudo tar -zcvf backup.tar.gz |MAYAN_MEDIA_ROOT|
|
||||
|
||||
To dump the content of your database manager refer to the documentation chapter
|
||||
regarding database data "dumping".
|
||||
|
||||
- PostgreSQL: https://www.postgresql.org/docs/current/backup-dump.html
|
||||
- MySQL: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
|
||||
|
||||
12
docs/chapters/cabinets.txt
Normal file
12
docs/chapters/cabinets.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
========
|
||||
Cabinets
|
||||
========
|
||||
|
||||
Cabinets are a multi-level method to organize documents. Each cabinet can
|
||||
contain documents as well as other sub level cabinets.
|
||||
|
||||
With a cabinet structure created, the next step is to add documents to them.
|
||||
|
||||
Documents can also be added in bulk to one or more cabinets from any view
|
||||
that lists documents.
|
||||
|
||||
273
docs/chapters/deploying.txt
Normal file
273
docs/chapters/deploying.txt
Normal file
@@ -0,0 +1,273 @@
|
||||
.. _deployment_basic:
|
||||
|
||||
=================
|
||||
Direct deployment
|
||||
=================
|
||||
|
||||
Mayan EDMS should be deployed like any other Django_ project and
|
||||
preferably using virtualenv_. Below are some ways to deploy and use Mayan EDMS.
|
||||
|
||||
Being a Django_ and a Python_ project, familiarity with these technologies is
|
||||
recommended to better understand why Mayan EDMS does some of the things it
|
||||
does.
|
||||
|
||||
Compilers and development libraries will be installed to compile runtime
|
||||
libraries. LibreOffice and Poppler utils will also be installed as they are
|
||||
used to convert document files. Supervisor (https://supervisord.org/), a
|
||||
Process Control System, will be used to monitor and keep all Mayan processes
|
||||
running.
|
||||
|
||||
|
||||
Basic deployment
|
||||
================
|
||||
This setup uses less memory and CPU resources at the expense of some speed.
|
||||
For another setup that offers more performance and scalability refer to the
|
||||
`Advanced deployment`_ below.
|
||||
|
||||
#. Install binary dependencies:
|
||||
|
||||
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
|
||||
requirements using:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install exiftool g++ gcc ghostscript gnupg1 graphviz \
|
||||
libfuse2 libjpeg-dev libmagic1 libpq-dev libpng-dev libreoffice \
|
||||
libtiff-dev poppler-utils postgresql python3-dev python3-virtualenv
|
||||
redis-server sane-utils supervisor tesseract-ocr zlib1g-dev -y
|
||||
|
||||
.. note::
|
||||
|
||||
Platforms with the ARM CPU might also need additional requirements:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install libffi-dev libssl-dev -y
|
||||
|
||||
|
||||
#. Create the user account for the installation:
|
||||
|
||||
This will create an unprivileged user account that is also unable to login:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo adduser mayan --disabled-password --disabled-login --gecos ""
|
||||
|
||||
|
||||
#. Create the parent directory where the project will be deployed:
|
||||
|
||||
``/opt/`` is a good choice as it is meant is for "software and add-on packages
|
||||
that are not part of the default installation". (https://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/opt.html).
|
||||
Create the ``/opt`` directory if it doesn't already exists:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo mkdir /opt
|
||||
|
||||
|
||||
#. Create the Python virtual environment:
|
||||
|
||||
This will keep all the Python packages installed here isolated from the rest
|
||||
of the Python packages in the system:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo virtualenv |MAYAN_INSTALLATION_DIRECTORY| -p /usr/bin/python3
|
||||
|
||||
|
||||
#. Make the mayan user the owner of the installation directory:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo chown mayan:mayan |MAYAN_INSTALLATION_DIRECTORY| -R
|
||||
|
||||
|
||||
#. Install Mayan EDMS from PyPI:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo -u mayan |MAYAN_PIP_BIN| install --no-use-pep517 mayan-edms
|
||||
|
||||
|
||||
#. Install the Python client for PostgreSQL and Redis:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo -u mayan |MAYAN_PIP_BIN| install --no-use-pep517 psycopg2==|PYTHON_PSYCOPG2_VERSION| redis==|PYTHON_REDIS_VERSION|
|
||||
|
||||
.. note::
|
||||
|
||||
Platforms with the ARM CPU might also need additional requirements:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo -u mayan |MAYAN_PIP_BIN| install --no-use-pep517 psutil==|PYTHON_PSUTIL_VERSION|
|
||||
|
||||
|
||||
#. Create the database for the installation:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo -u postgres psql -c "CREATE USER mayan WITH password 'mayanuserpass';"
|
||||
sudo -u postgres createdb -O mayan mayan
|
||||
|
||||
|
||||
#. Initialize the project:
|
||||
|
||||
This step will create all the database structures, download static media files
|
||||
like JavaScript libraries and HTML frameworks, and create and initial admin
|
||||
account with a random password.
|
||||
|
||||
.. note::
|
||||
|
||||
For simplicity, the ``MAYAN_MEDIA_ROOT`` folder is set to be a subfolder
|
||||
of the installation. If you want to keep your files separated from
|
||||
the installation files, change the value of the ``MAYAN_MEDIA_ROOT``
|
||||
variable in this and all subsequent steps. Be sure to first create the
|
||||
folder and give ownership of it to the ``mayan`` user with the ``chown``
|
||||
command.
|
||||
|
||||
.. warning::
|
||||
|
||||
If this step is interrupted, even if it is later resumed, will
|
||||
cause the automatic admin user to not be created in some cases. Make
|
||||
sure all environment variables and values are correct. If this
|
||||
happens, refer to the troubleshooting chapters:
|
||||
:ref:`troubleshooting-autoadmin-account` and
|
||||
:ref:`troubleshooting-admin-password`.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo -u mayan MAYAN_DATABASES="{'default':{'ENGINE':'django.db.backends.postgresql','NAME':'mayan','PASSWORD':'mayanuserpass','USER':'mayan','HOST':'127.0.0.1'}}" \
|
||||
MAYAN_MEDIA_ROOT=|MAYAN_MEDIA_ROOT| \
|
||||
|MAYAN_BIN| initialsetup
|
||||
|
||||
|
||||
#. Collect the static files:
|
||||
|
||||
This step merges and compressed static media files so they can be served more
|
||||
effectively.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo -u mayan MAYAN_MEDIA_ROOT=|MAYAN_MEDIA_ROOT| \
|
||||
|MAYAN_BIN| preparestatic --noinput
|
||||
|
||||
|
||||
#. Create the supervisor file at ``|MAYAN_SUPERVISOR_CONF|``:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo -u mayan MAYAN_DATABASES="{'default':{'ENGINE':'django.db.backends.postgresql','NAME':'mayan','PASSWORD':'mayanuserpass','USER':'mayan','HOST':'127.0.0.1'}}" \
|
||||
MAYAN_MEDIA_ROOT=|MAYAN_MEDIA_ROOT| \
|
||||
|MAYAN_BIN| platformtemplate supervisord | sudo sh -c "cat > |MAYAN_SUPERVISOR_CONF|"
|
||||
|
||||
|
||||
#. Configure Redis:
|
||||
|
||||
Configure Redis to discard data when it runs out of memory, not save its
|
||||
database and only keep 2 database:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo echo "maxmemory-policy allkeys-lru" >> /etc/redis/redis.conf
|
||||
sudo echo "save \"\"" >> /etc/redis/redis.conf
|
||||
sudo echo "databases 2" >> /etc/redis/redis.conf
|
||||
sudo systemctl restart redis
|
||||
|
||||
#. Enable and restart the services [1_]:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo systemctl enable supervisor
|
||||
sudo systemctl restart supervisor
|
||||
|
||||
|
||||
#. Cleaning up:
|
||||
|
||||
The following operating system dependencies are only needed during
|
||||
installation and can be removed.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get remove --purge libjpeg-dev libpq-dev libpng-dev libtiff-dev zlib1g-dev
|
||||
|
||||
|
||||
.. _deployment_advanced:
|
||||
|
||||
Advanced deployment
|
||||
===================
|
||||
|
||||
This variation uses RabbitMQ as the message broker. RabbitMQ consumes more
|
||||
memory but scales to thousands of messages per second. RabbitMQ messages are also
|
||||
persistent by default, this means that pending tasks are not lost in the case
|
||||
of a restart or power failure. The Gunicorn workers are increased to 3.
|
||||
|
||||
|
||||
#. Install RabbitMQ:
|
||||
|
||||
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
|
||||
requirements using:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt-get install rabbitmq-server -y
|
||||
|
||||
|
||||
#. Install the Python client for RabbitMQ:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo -u mayan |MAYAN_PIP_BIN| install --no-use-pep517 amqp==|PYTHON_AMQP_VERSION|
|
||||
|
||||
|
||||
#. Create the RabbitMQ user and vhost:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo rabbitmqctl add_user mayan mayanrabbitmqpassword
|
||||
sudo rabbitmqctl add_vhost mayan
|
||||
sudo rabbitmqctl set_permissions -p mayan mayan ".*" ".*" ".*"
|
||||
|
||||
|
||||
#. Edit the supervisor file at ``|MAYAN_SUPERVISOR_CONF|``:
|
||||
|
||||
Replace (paying attention to the comma at the end):
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
MAYAN_CELERY_BROKER_URL="redis://127.0.0.1:6379/0",
|
||||
|
||||
with:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
MAYAN_CELERY_BROKER_URL="amqp://mayan:mayanrabbitmqpassword@localhost:5672/mayan",
|
||||
|
||||
increase the number of Gunicorn workers to 3 in the line (``-w 2`` section):
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
command = |MAYAN_GUNICORN_BIN| -w 2 mayan.wsgi --max-requests 1000 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000 --timeout 120
|
||||
|
||||
remove the concurrency limit (or increase it) of the fast worker (remove ``--concurrency=1``).
|
||||
|
||||
|
||||
#. Restart the services:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo supervisorctl reread
|
||||
sudo supervisorctl restart all
|
||||
|
||||
|
||||
|
||||
[1]: https://bugs.launchpad.net/ubuntu/+source/supervisor/+bug/1594740
|
||||
|
||||
.. _Debian: https://www.debian.org/
|
||||
.. _Django: https://www.djangoproject.com/
|
||||
.. _Python: https://www.python.org/
|
||||
.. _SQLite: https://www.sqlite.org/
|
||||
.. _Ubuntu: http://www.ubuntu.com/
|
||||
.. _virtualenv: http://www.virtualenv.org/en/latest/index.html
|
||||
.. _1: https://bugs.launchpad.net/ubuntu/+source/supervisor/+bug/1594740
|
||||
247
docs/chapters/development/caa_entity.txt
Normal file
247
docs/chapters/development/caa_entity.txt
Normal file
@@ -0,0 +1,247 @@
|
||||
==================================================
|
||||
Mayan EDMS Entity Contributor Assignment Agreement
|
||||
==================================================
|
||||
|
||||
Thank you for your interest in contributing to Mayan EDMS ("We" or "Us").
|
||||
|
||||
This contributor agreement ("Agreement") documents the rights granted by
|
||||
contributors to Us. To make this document effective, please print it, sign it
|
||||
(by copyright holder or authorized party) and send it to Us by email to
|
||||
caa@mayan-edms.com. This is a legally binding document, so please read it
|
||||
carefully before agreeing to it. The Agreement may cover more than one
|
||||
software project managed by Us.
|
||||
|
||||
|
||||
1. Definitions
|
||||
==============
|
||||
|
||||
"You" means any Legal Entity on behalf of whom a Contribution has been received
|
||||
by Us. "Legal Entity" means an entity which is not a natural person.
|
||||
"Affiliates" means other Legal Entities that control, are controlled by, or
|
||||
under common control with that Legal Entity. For the purposes of this
|
||||
definition, "control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such Legal Entity, whether by contract or otherwise,
|
||||
(ii) ownership of fifty percent (50%) or more of the outstanding shares or
|
||||
securities which vote to elect the management or other persons who direct such
|
||||
Legal Entity or (iii) beneficial ownership of such entity.
|
||||
|
||||
"Contribution" means any work of authorship that is Submitted by You to Us in
|
||||
which You own or assert ownership of the Copyright. We cannot accept
|
||||
contributions for which you do not own the Copyright or for which you don't
|
||||
have the necessary legal power to transfer.
|
||||
|
||||
"Copyright" means all rights protecting works of authorship owned or controlled
|
||||
by You or Your Affiliates, including copyright, moral and neighboring rights,
|
||||
as appropriate, for the full term of their existence including any extensions
|
||||
by You.
|
||||
|
||||
"Material" means the work of authorship which is made available by Us to third
|
||||
parties. When this Agreement covers more than one software project, the
|
||||
Material means the work of authorship to which the Contribution was Submitted.
|
||||
After You Submit the Contribution, it may be included in the Material.
|
||||
|
||||
"Submit" means any form of electronic, verbal, or written communication sent
|
||||
to Us or our representatives, including but not limited to electronic mailing
|
||||
lists, source code control systems, and issue tracking systems that are managed
|
||||
by, or on behalf of, Us for the purpose of discussing and improving the
|
||||
Material, but excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by You as "Not a Contribution."
|
||||
|
||||
"Submission Date" means the date on which You Submit a Contribution to Us.
|
||||
|
||||
"Effective Date" means the date You execute this Agreement or the date You
|
||||
first Submit a Contribution to Us, whichever is earlier.
|
||||
|
||||
|
||||
2. Grant of Rights
|
||||
==================
|
||||
|
||||
|
||||
2.1 Copyright Assignment
|
||||
------------------------
|
||||
|
||||
a. At the time the Contribution is Submitted, You assign to Us all right, title,
|
||||
and interest worldwide in all Copyright covering the Contribution; provided
|
||||
that this transfer is conditioned upon compliance with Section 2.3.
|
||||
|
||||
b. To the extent that any of the rights in Section 2.1(a) cannot be assigned by
|
||||
You to Us, You grant to Us a perpetual, worldwide, exclusive, royalty-free,
|
||||
transferable, irrevocable license under such non-assigned rights, with rights
|
||||
to sublicense through multiple tiers of sublicensees, to practice such
|
||||
non-assigned rights, including, but not limited to, the right to reproduce,
|
||||
modify, display, perform and distribute the Contribution; provided that this
|
||||
license is conditioned upon compliance with Section 2.3.
|
||||
|
||||
c. To the extent that any of the rights in Section 2.1(a) can neither be
|
||||
assigned nor licensed by You to Us, You irrevocably waive and agree never to
|
||||
assert such rights against Us, any of our successors in interest, or any of
|
||||
our licensees, either direct or indirect; provided that this agreement not
|
||||
to assert is conditioned upon compliance with Section 2.3.
|
||||
|
||||
d. Upon such transfer of rights to Us, the Contribution will be licenses under
|
||||
the terms of the Material.
|
||||
|
||||
2.2 Patent License
|
||||
------------------
|
||||
|
||||
For patent claims including, without limitation, method, process, and apparatus
|
||||
claims which You or Your Affiliates own, control or have the right to grant,
|
||||
now or in the future, You grant to Us a perpetual, worldwide, non-exclusive,
|
||||
transferable, royalty-free, irrevocable patent license, with the right to
|
||||
sublicense these rights to multiple tiers of sublicensees, to make, have made,
|
||||
use, sell, offer for sale, import and otherwise transfer the Contribution and
|
||||
the Contribution in combination with the Material (and portions of such
|
||||
combination). This license is granted only to the extent that the exercise of
|
||||
the licensed rights infringes such patent claims; and provided that this license
|
||||
is conditioned upon compliance with Section 2.3.
|
||||
|
||||
2.3 Outbound License
|
||||
--------------------
|
||||
|
||||
As a condition on the grant of rights in Sections 2.1 and 2.2, We agree to
|
||||
license the Contribution only under the terms of the license or licenses which
|
||||
We are using on the Submission Date for the Material (including any rights to
|
||||
adopt any future version of a license if permitted).
|
||||
|
||||
|
||||
2.4 Moral Rights
|
||||
----------------
|
||||
|
||||
If moral rights apply to the Contribution, to the maximum extent permitted by
|
||||
law, You waive and agree not to assert such moral rights against Us or our
|
||||
successors in interest, or any of our licensees, either direct or indirect.
|
||||
|
||||
|
||||
2.5 Our Rights
|
||||
--------------
|
||||
|
||||
You acknowledge that We are not obligated to use Your Contribution as part of
|
||||
the Material and may decide to include any Contribution We consider appropriate.
|
||||
|
||||
|
||||
2.6 Reservation of Rights
|
||||
-------------------------
|
||||
|
||||
Any rights not expressly assigned or licensed under this section are expressly
|
||||
reserved by You.
|
||||
|
||||
|
||||
3. Agreement
|
||||
============
|
||||
|
||||
You confirm that:
|
||||
|
||||
a. You have the legal authority to enter into this Agreement.
|
||||
|
||||
b. You or Your Affiliates own the Copyright and patent claims covering the
|
||||
Contribution which are required to grant the rights under Section 2.
|
||||
|
||||
c. The grant of rights under Section 2 does not violate any grant of rights
|
||||
which You or Your Affiliates have made to third parties.
|
||||
|
||||
|
||||
4. Disclaimer
|
||||
=============
|
||||
|
||||
EXCEPT FOR THE EXPRESS WARRANTIES IN SECTION 3, THE CONTRIBUTION IS PROVIDED
|
||||
"AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES INCLUDING,
|
||||
WITHOUT LIMITATION, ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED BY YOU TO US
|
||||
AND BY US TO YOU. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE DISCLAIMED,
|
||||
SUCH WARRANTY IS LIMITED IN DURATION TO THE MINIMUM PERIOD PERMITTED BY LAW.
|
||||
|
||||
|
||||
5. Consequential Damage Waiver
|
||||
==============================
|
||||
|
||||
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU OR US
|
||||
BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA,
|
||||
INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING OUT
|
||||
OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY (CONTRACT, TORT
|
||||
OR OTHERWISE) UPON WHICH THE CLAIM IS BASED.
|
||||
|
||||
|
||||
6. Miscellaneous
|
||||
================
|
||||
|
||||
|
||||
6.1 Jurisdiction
|
||||
----------------
|
||||
|
||||
This Agreement will be governed by and construed in accordance with the laws of
|
||||
Puerto Rico excluding its conflicts of law provisions. Under certain circumstances,
|
||||
the governing law in this section might be superseded by the United Nations
|
||||
Convention on Contracts for the International Sale of Goods ("UN Convention")
|
||||
and the parties intend to avoid the application of the UN Convention to this
|
||||
Agreement and, thus, exclude the application of the UN Convention in its
|
||||
entirety to this Agreement.
|
||||
|
||||
|
||||
6.2 Acceptance
|
||||
--------------
|
||||
|
||||
This Agreement sets out the entire agreement between You and Us for Your
|
||||
Contributions to Us and overrides all other agreements or understandings.
|
||||
|
||||
|
||||
6.3 Third parties
|
||||
-----------------
|
||||
|
||||
If You or We assign the rights or obligations received through this Agreement
|
||||
to a third party, as a condition of the assignment, that third party must
|
||||
agree in writing to abide by all the rights and obligations in the Agreement.
|
||||
|
||||
|
||||
6.4 Unmet responsibilities
|
||||
--------------------------
|
||||
|
||||
The failure of either party to require performance by the other party of any
|
||||
provision of this Agreement in one situation shall not affect the right of a
|
||||
party to require such performance at any time in the future. A waiver of
|
||||
performance under a provision in one situation shall not be considered a
|
||||
waiver of the performance of the provision in the future or a waiver of the
|
||||
provision in its entirety.
|
||||
|
||||
|
||||
6.5 Continuation
|
||||
----------------
|
||||
|
||||
If any provision of this Agreement is found void and unenforceable, such
|
||||
provision will be replaced to the extent possible with a provision that comes
|
||||
closest to the meaning of the original provision and which is enforceable.
|
||||
The terms and conditions set forth in this Agreement shall apply
|
||||
notwithstanding any failure of essential purpose of this Agreement or any
|
||||
limited remedy to the maximum extent possible under law.
|
||||
|
||||
|
||||
::
|
||||
|
||||
|
||||
Name: _________________________________________________
|
||||
|
||||
|
||||
Email: ________________________________________________
|
||||
|
||||
|
||||
Address: ______________________________________________
|
||||
|
||||
|
||||
Address (cont): _______________________________________
|
||||
|
||||
|
||||
Country: ______________________________________________
|
||||
|
||||
|
||||
Phone number: _________________________________________
|
||||
|
||||
|
||||
Fax number: ___________________________________________
|
||||
|
||||
|
||||
|
||||
_______________________________________________________
|
||||
Signature
|
||||
|
||||
|
||||
|
||||
Mayan EDMS Entity CAA Version 1.0 April 8, 2018
|
||||
243
docs/chapters/development/caa_individual.txt
Normal file
243
docs/chapters/development/caa_individual.txt
Normal file
@@ -0,0 +1,243 @@
|
||||
======================================================
|
||||
Mayan EDMS Individual Contributor Assignment Agreement
|
||||
======================================================
|
||||
|
||||
Thank you for your interest in contributing to Mayan EDMS ("We" or "Us").
|
||||
|
||||
This contributor agreement ("Agreement") documents the rights granted by
|
||||
contributors to Us. To make this document effective, please print it, sign it
|
||||
(by copyright holder or authorized party) and send it to Us by email to
|
||||
caa@mayan-edms.com. This is a legally binding document, so please read it
|
||||
carefully before agreeing to it. The Agreement may cover more than one
|
||||
software project managed by Us.
|
||||
|
||||
|
||||
1. Definitions
|
||||
==============
|
||||
|
||||
"You" means the individual who Submits a Contribution to Us.
|
||||
|
||||
"Contribution" means any work of authorship that is Submitted by You to Us
|
||||
in which You own or assert ownership of the Copyright. We cannot accept
|
||||
contributions for which you do not own the Copyright or for which you don't
|
||||
have the necessary legal power to transfer.
|
||||
|
||||
"Copyright" means all rights protecting works of authorship owned or
|
||||
controlled by You, including copyright, moral and neighboring rights,
|
||||
as appropriate, for the full term of their existence including any extensions
|
||||
by You.
|
||||
|
||||
"Material" means the work of authorship which is made available by Us to third
|
||||
parties. When this Agreement covers more than one software project, the Material
|
||||
means the work of authorship to which the Contribution was Submitted. After
|
||||
You Submit the Contribution, it may be included in the Material.
|
||||
|
||||
"Submit" means any form of electronic, verbal, or written communication
|
||||
sent to Us or our representatives, including but not limited to
|
||||
electronic mailing lists, source code control systems, and issue tracking systems
|
||||
that are managed by, or on behalf of, Us for the purpose of discussing and
|
||||
improving the Material, but excluding communication that is conspicuously marked
|
||||
or otherwise designated in writing by You as "Not a Contribution."
|
||||
|
||||
"Submission Date" means the date on which You Submit a Contribution to Us.
|
||||
|
||||
"Effective Date" means the date You execute this Agreement or the date You first
|
||||
Submit a Contribution to Us, whichever is earlier.
|
||||
|
||||
|
||||
2. Grant of Rights
|
||||
==================
|
||||
|
||||
|
||||
2.1 Copyright Assignment
|
||||
------------------------
|
||||
|
||||
a. At the time the Contribution is Submitted, You assign to Us all right,
|
||||
title, and interest worldwide in all Copyright covering the Contribution;
|
||||
provided that this transfer is conditioned upon compliance with Section 2.3.
|
||||
|
||||
b. To the extent that any of the rights in Section 2.1(a) cannot be assigned
|
||||
by You to Us, You grant to Us a perpetual, worldwide, exclusive, royalty-free,
|
||||
transferable, irrevocable license under such non-assigned rights, with rights
|
||||
to sublicense through multiple tiers of sublicensees, to practice such
|
||||
non-assigned rights, including, but not limited to, the right to reproduce,
|
||||
modify, display, perform and distribute the Contribution; provided that
|
||||
this license is conditioned upon compliance with Section 2.3.
|
||||
|
||||
c. To the extent that any of the rights in Section 2.1(a) can neither be
|
||||
assigned nor licensed by You to Us, You irrevocably waive and agree never to
|
||||
assert such rights against Us, any of our successors in interest, or any of
|
||||
our licensees, either direct or indirect; provided that this agreement not
|
||||
to assert is conditioned upon compliance with Section 2.3.
|
||||
|
||||
d. Upon such transfer of rights to Us, the Contribution will be licenses under
|
||||
the terms of the Material.
|
||||
|
||||
|
||||
2.2 Patent License
|
||||
------------------
|
||||
|
||||
For patent claims including, without limitation, method, process, and apparatus
|
||||
claims which You own, control or have the right to grant, now or in the future,
|
||||
You grant to Us a perpetual, worldwide, non-exclusive, transferable, royalty-free,
|
||||
irrevocable patent license, with the right to sublicense these rights to multiple
|
||||
tiers of sublicensees, to make, have made, use, sell, offer for sale, import and
|
||||
otherwise transfer the Contribution and the Contribution in combination with
|
||||
the Material (and portions of such combination). This license is granted only
|
||||
to the extent that the exercise of the licensed rights infringes such patent claims;
|
||||
and provided that this license is conditioned upon compliance with Section 2.3.
|
||||
|
||||
|
||||
2.3 Outbound License
|
||||
--------------------
|
||||
|
||||
As a condition on the grant of rights in Sections 2.1 and 2.2, We agree to
|
||||
license the Contribution only under the terms of the license or licenses which
|
||||
We are using on the Submission Date for the Material (including any rights to
|
||||
adopt any future version of a license if permitted).
|
||||
|
||||
|
||||
2.4 Moral Rights
|
||||
----------------
|
||||
|
||||
If moral rights apply to the Contribution, to the maximum extent permitted by law,
|
||||
You waive and agree not to assert such moral rights against Us or our successors
|
||||
in interest, or any of our licensees, either direct or indirect.
|
||||
|
||||
|
||||
2.5 Our Rights
|
||||
--------------
|
||||
|
||||
You acknowledge that We are not obligated to use Your Contribution as part of
|
||||
the Material and may decide to include any Contribution We consider appropriate.
|
||||
|
||||
|
||||
2.6 Reservation of Rights
|
||||
-------------------------
|
||||
|
||||
Any rights not expressly assigned or licensed under this section are expressly
|
||||
reserved by You.
|
||||
|
||||
|
||||
3. Agreement
|
||||
============
|
||||
|
||||
You confirm that:
|
||||
|
||||
a. You have the legal authority to enter into this Agreement.
|
||||
|
||||
b. You own the Copyright and patent claims covering the Contribution which are
|
||||
required to grant the rights under Section 2.
|
||||
|
||||
c. The grant of rights under Section 2 does not violate any grant of rights
|
||||
which You have made to third parties, including Your employer. If You are an
|
||||
employee, You have had Your employer approve this Agreement or sign the Entity
|
||||
version of this document. If You are less than eighteen years old, please have
|
||||
Your parents or guardian sign the Agreement.
|
||||
|
||||
|
||||
4. Disclaimer
|
||||
=============
|
||||
|
||||
EXCEPT FOR THE EXPRESS WARRANTIES IN SECTION 3, THE CONTRIBUTION IS PROVIDED
|
||||
"AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES INCLUDING, WITHOUT
|
||||
LIMITATION, ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED BY YOU TO US AND BY US
|
||||
TO YOU. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE DISCLAIMED, SUCH
|
||||
WARRANTY IS LIMITED IN DURATION TO THE MINIMUM PERIOD PERMITTED BY LAW.
|
||||
|
||||
|
||||
5. Consequential Damage Waiver
|
||||
==============================
|
||||
|
||||
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU OR US
|
||||
BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA,
|
||||
INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING OUT
|
||||
OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY (CONTRACT, TORT
|
||||
OR OTHERWISE) UPON WHICH THE CLAIM IS BASED.
|
||||
|
||||
|
||||
6. Miscellaneous
|
||||
================
|
||||
|
||||
|
||||
6.1 Jurisdiction
|
||||
----------------
|
||||
|
||||
This Agreement will be governed by and construed in accordance with the laws of
|
||||
Puerto Rico excluding its conflicts of law provisions. Under certain circumstances,
|
||||
the governing law in this section might be superseded by the United Nations
|
||||
Convention on Contracts for the International Sale of Goods ("UN Convention")
|
||||
and the parties intend to avoid the application of the UN Convention to this
|
||||
Agreement and, thus, exclude the application of the UN Convention in its
|
||||
entirety to this Agreement.
|
||||
|
||||
|
||||
6.2 Acceptance
|
||||
--------------
|
||||
|
||||
This Agreement sets out the entire agreement between You and Us for Your
|
||||
Contributions to Us and overrides all other agreements or understandings.
|
||||
|
||||
|
||||
6.3 Third parties
|
||||
-----------------
|
||||
|
||||
If You or We assign the rights or obligations received through this Agreement
|
||||
to a third party, as a condition of the assignment, that third party must
|
||||
agree in writing to abide by all the rights and obligations in the Agreement.
|
||||
|
||||
|
||||
6.4 Unmet responsibilities
|
||||
--------------------------
|
||||
|
||||
The failure of either party to require performance by the other party of any
|
||||
provision of this Agreement in one situation shall not affect the right of a
|
||||
party to require such performance at any time in the future. A waiver of
|
||||
performance under a provision in one situation shall not be considered a
|
||||
waiver of the performance of the provision in the future or a waiver of the
|
||||
provision in its entirety.
|
||||
|
||||
|
||||
6.5 Continuation
|
||||
----------------
|
||||
|
||||
If any provision of this Agreement is found void and unenforceable,
|
||||
such provision will be replaced to the extent possible with a provision that
|
||||
comes closest to the meaning of the original provision and which is enforceable.
|
||||
The terms and conditions set forth in this Agreement shall apply notwithstanding
|
||||
any failure of essential purpose of this Agreement or any limited remedy to
|
||||
the maximum extent possible under law.
|
||||
|
||||
|
||||
::
|
||||
|
||||
|
||||
Name: _________________________________________________
|
||||
|
||||
|
||||
Email: ________________________________________________
|
||||
|
||||
|
||||
Address: ______________________________________________
|
||||
|
||||
|
||||
Address (cont): _______________________________________
|
||||
|
||||
|
||||
Country: ______________________________________________
|
||||
|
||||
|
||||
Phone number: _________________________________________
|
||||
|
||||
|
||||
Fax number: ___________________________________________
|
||||
|
||||
|
||||
|
||||
_______________________________________________________
|
||||
Signature
|
||||
|
||||
|
||||
|
||||
Mayan EDMS Individual CAA Version 1.0 April 8, 2018
|
||||
243
docs/chapters/development/code_structure.txt
Normal file
243
docs/chapters/development/code_structure.txt
Normal file
@@ -0,0 +1,243 @@
|
||||
==============
|
||||
Code structure
|
||||
==============
|
||||
|
||||
|
||||
Follow PEP8
|
||||
-----------
|
||||
|
||||
Whenever possible, but don't obsess over things like line length:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ flake8 --ignore=E501,E128,E122 |less
|
||||
|
||||
To perform automatic PEP8 checks, install flake8's git hook using:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ flake8 --install-hook git
|
||||
|
||||
|
||||
Imports
|
||||
-------
|
||||
|
||||
Import order should be:
|
||||
|
||||
- Standard Python modules
|
||||
- Installed Python modules
|
||||
- Core Django modules
|
||||
- Installed Django modules
|
||||
- Mayan EDMS modules
|
||||
- Local imports
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
# Standard Python library
|
||||
import base64
|
||||
|
||||
# 3rd party installed Python libraries
|
||||
import requests
|
||||
|
||||
# Django core modules
|
||||
from django.db.models import Q
|
||||
from django.template.defaultfilters import slugify
|
||||
from django.utils.translation import ugettext
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
# 3rd party installed Django libraries
|
||||
from rest_framework import APIView
|
||||
|
||||
# Mayan apps
|
||||
from metadata.classes import MetadataClass
|
||||
|
||||
# Local app imports (relative)
|
||||
from .conf.settings import (
|
||||
AVAILABLE_INDEXING_FUNCTIONS,
|
||||
MAX_SUFFIX_COUNT, SLUGIFY_PATHS
|
||||
)
|
||||
from .exceptions import MaxSuffixCountReached
|
||||
from .filesystem import (
|
||||
fs_create_index_directory, fs_create_document_link,
|
||||
fs_delete_document_link, fs_delete_index_directory,
|
||||
assemble_suffixed_filename
|
||||
)
|
||||
from .models import Index, IndexInstanceNode, DocumentRenameCount
|
||||
|
||||
All local app module imports are in relative form. Local app module name is to
|
||||
be referenced as little as possible, unless required by a specific feature,
|
||||
trick, restriction (e.g., Runtime modification of the module's attributes).
|
||||
|
||||
Incorrect:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
|
||||
# documents app views.py model
|
||||
from documents.models import Document
|
||||
|
||||
Correct:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# documents app views.py model
|
||||
from .models import Document
|
||||
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
Mayan EDMS apps follow a hierarchical model of dependency. Apps import from
|
||||
their parents or siblings, never from their children. Think plugins. A parent
|
||||
app must never assume anything about a possible existing child app. The
|
||||
documents app and the Document model are the basic entities; they must never
|
||||
import anything else. The common and main apps are the base apps.
|
||||
|
||||
|
||||
Variables
|
||||
---------
|
||||
|
||||
Naming of variables should follow a Major to Minor convention, usually
|
||||
including the purpose of the variable as the first piece of the name, using
|
||||
underscores as spaces. camelCase is not used in Mayan EDMS.
|
||||
|
||||
Examples:
|
||||
|
||||
Links:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
link_document_page_transformation_list = ...
|
||||
link_document_page_transformation_create = ...
|
||||
link_document_page_transformation_edit = ...
|
||||
link_document_page_transformation_delete = ...
|
||||
|
||||
Constants:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
PERMISSION_SMART_LINK_VIEW = ...
|
||||
PERMISSION_SMART_LINK_CREATE = ...
|
||||
PERMISSION_SMART_LINK_DELETE = ...
|
||||
PERMISSION_SMART_LINK_EDIT = ...
|
||||
|
||||
Classes:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
class Document(models.Model):
|
||||
class DocumentPage(models.Model):
|
||||
class DocumentPageTransformation(models.Model):
|
||||
class DocumentType(models.Model):
|
||||
class DocumentTypeFilename(models.Model):
|
||||
|
||||
|
||||
Strings
|
||||
-------
|
||||
|
||||
Quotation character used in Mayan EDMS for strings is the single quote.
|
||||
Double quote is used for multiple line comments or HTML markup.
|
||||
|
||||
|
||||
Migrations
|
||||
----------
|
||||
|
||||
Migrations should do only one thing (example: either create a table, move data
|
||||
to a new table or remove an old table) to aid retrying on failure.
|
||||
|
||||
|
||||
General
|
||||
-------
|
||||
|
||||
Code should appear in their modules in alphabetic order or in their order of
|
||||
importance if it makes more sense for the specific application. This makes
|
||||
visual scanning easier on modules with a large number of imports, views or
|
||||
classes. Class methods that return a value should be pretended with a
|
||||
``get_`` to differentiate from an object’s properties. When a variable refers
|
||||
to a file it should be named as follows:
|
||||
|
||||
- filename: The file’s name and extension only.
|
||||
- filepath: The entire path to the file including the filename.
|
||||
- path: A path to a directory.
|
||||
|
||||
Flash messages should end with a period as applicable for the language.
|
||||
Only exception is when the tail of the message contains an exceptions message
|
||||
as passed directly from the exception object.
|
||||
|
||||
|
||||
Steps to deploy a development version
|
||||
=====================================
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ git clone |SOURCE_CODE_GIT|
|
||||
$ cd mayan-edms
|
||||
$ git checkout <Corresponding branch>
|
||||
$ virtualenv venv
|
||||
$ source venv/bin/activate
|
||||
$ pip install -r requirements.txt
|
||||
$ ./manage.py initialsetup
|
||||
$ ./manage.py preparestatic
|
||||
$ ./manage.py runserver
|
||||
|
||||
|
||||
|
||||
Debugging
|
||||
=========
|
||||
|
||||
Mayan EDMS makes extensive use of Django's new
|
||||
:django-docs:`logging capabilities <topics/logging>`.
|
||||
|
||||
By default debug logging for all apps is turned on. If you wish to customize
|
||||
how logging is managed turn off automatic logging by setting
|
||||
`COMMON_AUTO_LOGGING` to ``False`` and add the following lines to your
|
||||
``settings/local.py`` file::
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': True,
|
||||
'formatters': {
|
||||
'verbose': {
|
||||
'format': '%(levelname)s %(asctime)s %(name)s %(process)d %(thread)d %(message)s'
|
||||
},
|
||||
'intermediate': {
|
||||
'format': '%(name)s <%(process)d> [%(levelname)s] "%(funcName)s() %(message)s"'
|
||||
},
|
||||
'simple': {
|
||||
'format': '%(levelname)s %(message)s'
|
||||
},
|
||||
},
|
||||
'handlers': {
|
||||
'console':{
|
||||
'level':'DEBUG',
|
||||
'class':'logging.StreamHandler',
|
||||
'formatter': 'intermediate'
|
||||
}
|
||||
},
|
||||
'loggers': {
|
||||
'documents': {
|
||||
'handlers':['console'],
|
||||
'propagate': True,
|
||||
'level':'DEBUG',
|
||||
},
|
||||
'common': {
|
||||
'handlers':['console'],
|
||||
'propagate': True,
|
||||
'level':'DEBUG',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Likewise, to see the debug output of the ``tags`` app, just add the following inside the ``loggers`` block::
|
||||
|
||||
|
||||
'tags': {
|
||||
'handlers':['console'],
|
||||
'propagate': True,
|
||||
'level':'DEBUG',
|
||||
},
|
||||
18
docs/chapters/development/contributing.txt
Normal file
18
docs/chapters/development/contributing.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
============
|
||||
Contributing
|
||||
============
|
||||
|
||||
Mayan EDMS is under active development, and contributions are welcome.
|
||||
|
||||
If you have a feature request, suggestion or bug report, please open a new
|
||||
issue on the `GitLab issue tracker`_. To submit patches, please send a merge
|
||||
request on GitLab_.
|
||||
|
||||
.. _GitLab: |SOURCE_CODE_REPOSITORY|
|
||||
.. _`GitLab issue tracker`: |SOURCE_CODE_ISSUES|
|
||||
|
||||
|
||||
Contributing changes
|
||||
====================
|
||||
Follow the latest contributing guidelines outlined here:
|
||||
|SOURCE_CODE_REPOSITORY|blob/master/CONTRIBUTING.md
|
||||
24
docs/chapters/development/documentation.txt
Normal file
24
docs/chapters/development/documentation.txt
Normal file
@@ -0,0 +1,24 @@
|
||||
=============
|
||||
Documentation
|
||||
=============
|
||||
|
||||
The documentation is written in `reStructured Text`_ format, processed with
|
||||
Sphinx_, and resides in the ``docs`` directory. In order to build it, you will
|
||||
first need to install the documentation editing dependencies with::
|
||||
|
||||
$ pip install -r requirements/documentation.txt
|
||||
|
||||
Then, to build an HTML version of the documentation, run the following command
|
||||
from the **docs** directory::
|
||||
|
||||
$ make docs-serve
|
||||
|
||||
The generated documentation can be viewed by browsing to http://127.0.0.1:8000
|
||||
or by browsing to the ``docs/_build/html`` directory.
|
||||
|
||||
You can also generate the documentation in formats other than HTML. Consult the
|
||||
Sphinx_ documentation for more details.
|
||||
|
||||
.. _`reStructured Text`: http://docutils.sourceforge.net/rst.html
|
||||
.. _Sphinx: http://sphinx.pocoo.org
|
||||
|
||||
29
docs/chapters/development/index.txt
Normal file
29
docs/chapters/development/index.txt
Normal file
@@ -0,0 +1,29 @@
|
||||
==============
|
||||
For developers
|
||||
==============
|
||||
|
||||
- :doc:`philosophies`
|
||||
- :doc:`code_structure`
|
||||
- :doc:`documentation`
|
||||
- :doc:`source_control`
|
||||
- :doc:`contributing`
|
||||
- :doc:`releases`
|
||||
- :doc:`translations`
|
||||
- :doc:`../../mercs/index`
|
||||
- :doc:`caa_entity`
|
||||
- :doc:`caa_individual`
|
||||
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
philosophies
|
||||
code_structure
|
||||
documentation
|
||||
source_control
|
||||
contributing
|
||||
releases
|
||||
translations
|
||||
../../mercs/index
|
||||
caa_entity
|
||||
caa_individual
|
||||
29
docs/chapters/development/philosophies.txt
Normal file
29
docs/chapters/development/philosophies.txt
Normal file
@@ -0,0 +1,29 @@
|
||||
====================
|
||||
Project philosophies
|
||||
====================
|
||||
|
||||
How to think about Mayan EDMS when doing changes or adding new features;
|
||||
why things are the way they are in Mayan EDMS:
|
||||
|
||||
- Functionality must be as market/sector independent as possible, code for the
|
||||
95% of use cases.
|
||||
- Each user must be able to configure and customize it to their needs after
|
||||
install.
|
||||
- Abstract as much as possible, each app must be an expert in just one thing,
|
||||
for other things they should use the API/classes/functions of other apps.
|
||||
- Assume as little as possible about anything outside the project
|
||||
(hardware, OS, storage).
|
||||
- Provide Python based abstraction so that a default install runs with a single
|
||||
step.
|
||||
- No hard dependencies on binaries unless there is no other choice.
|
||||
- Provide “drivers” or switchable backends to allow users to fine tune the
|
||||
installation.
|
||||
- Call to binaries only when there is no other choice or the Python choices are
|
||||
not viable/mature/efficient.
|
||||
- Each app is as independent and self contained as possible. Exceptions, the
|
||||
basic requirements: navigation, permissions, common, main.
|
||||
- If an app is meant to be used by more than one other app, it should be as
|
||||
generic as possible in regard to the project and another app will bridge the functionality.
|
||||
|
||||
- Example: since indexing (document_indexing) only applies to documents, the
|
||||
app is specialized and depends on the documents app.
|
||||
173
docs/chapters/development/releases.txt
Normal file
173
docs/chapters/development/releases.txt
Normal file
@@ -0,0 +1,173 @@
|
||||
===================
|
||||
Installable package
|
||||
===================
|
||||
|
||||
Source file package
|
||||
-------------------
|
||||
|
||||
This is the sequence of step used to produce an installable package:
|
||||
|
||||
1. Generate the packaged version (will produce dist/mayan-edms-x.y.z.tar.gz)::
|
||||
|
||||
$ make sdist
|
||||
|
||||
2. Do a test install::
|
||||
|
||||
$ cd /tmp
|
||||
$ virtualenv venv
|
||||
$ source venv/bin/activate
|
||||
$ pip install <path of the Git repository>/dist/mayan-edms-x.y.z.tar.gz
|
||||
$ mayan-edms.py initialsetup
|
||||
$ mayan-edms.py preparestatic
|
||||
$ mayan-edms.py runserver
|
||||
|
||||
|
||||
Wheel package
|
||||
-------------
|
||||
|
||||
1. Install the development requirements::
|
||||
|
||||
$ pip install -r requirements/development.txt
|
||||
|
||||
2. Create wheel package using the makefile::
|
||||
|
||||
$ make wheel
|
||||
|
||||
3. Do a test install::
|
||||
|
||||
$ cd /tmp
|
||||
$ virtualenv venv
|
||||
$ source venv/bin/activate
|
||||
$ pip install <path of the Git repository>/dist/mayan_edms-x.y.z-py2-none-any.whl
|
||||
$ mayan-edms.py initialsetup
|
||||
$ mayan-edms.py preparestatic
|
||||
$ mayan-edms.py runserver
|
||||
|
||||
|
||||
Version numbering
|
||||
=================
|
||||
|
||||
Mayan EDMS uses the Semantic Versioning (http://semver.org/) method to choose
|
||||
version numbers along with Python's PEP-0440 (https://www.python.org/dev/peps/pep-0440/)
|
||||
to format them.
|
||||
|
||||
X.YaN # Alpha release
|
||||
X.YbN # Beta release
|
||||
X.YrcN # Release Candidate
|
||||
X.Y # Final release
|
||||
|
||||
|
||||
Release checklist
|
||||
=================
|
||||
|
||||
#. Check for missing migrations::
|
||||
|
||||
make check-missing-migrations
|
||||
|
||||
#. Synchronize translations::
|
||||
|
||||
make translations-pull
|
||||
|
||||
#. Compile translations::
|
||||
|
||||
make translations-compile
|
||||
|
||||
#. Update changelog.
|
||||
#. Write release notes.
|
||||
#. Scan the code with flake8 for simple style warnings.
|
||||
#. Check README.rst format with::
|
||||
|
||||
python setup.py check -r -s
|
||||
|
||||
or with::
|
||||
|
||||
make check-readme
|
||||
|
||||
#. Bump version in ``mayan/__init__.py`` and ``docker/rootfs/version``::
|
||||
|
||||
make increase-version PART=<major, minor or micro>
|
||||
|
||||
#. Update requirements version in ``setup.py`` using:
|
||||
::
|
||||
|
||||
make generate-setup
|
||||
|
||||
#. Commit as version bump.
|
||||
#. Build source package and test:
|
||||
::
|
||||
|
||||
make test-sdist-via-docker-ubuntu
|
||||
|
||||
#. Build wheel package and test:
|
||||
::
|
||||
|
||||
make test-wheel-via-docker-ubuntu
|
||||
|
||||
#. Tag version:
|
||||
::
|
||||
|
||||
git tag -a vX.Y.Z -m "Version X.Y.Z"
|
||||
|
||||
#. Generate set ``setup.py`` again to update the build number::
|
||||
|
||||
make generate-setup
|
||||
|
||||
#. Commit the new ``setup.py`` file.
|
||||
|
||||
#. Release the version using one of the two following methods: GitLab CI or
|
||||
manual
|
||||
|
||||
|
||||
Release using GitLab CI using the makefile
|
||||
------------------------------------------
|
||||
|
||||
#. Use of the GitLab makefile targets: ``gitlab-release-all``,
|
||||
``gitlab-release-docker``, ``gitlab-release-documentation``,
|
||||
``gitlab-release-python``.
|
||||
|
||||
|
||||
Release using GitLab CI manually
|
||||
--------------------------------
|
||||
|
||||
#. Push the current brach:
|
||||
::
|
||||
|
||||
git push
|
||||
|
||||
|
||||
#. Push the new tags:
|
||||
::
|
||||
|
||||
git push --tags
|
||||
|
||||
|
||||
#. Delete the corresponding ``releases/`` branch:
|
||||
::
|
||||
|
||||
git push origin :releases/<branch>
|
||||
|
||||
#. Push the current branch to the corresponding origin ``releases/`` branch:
|
||||
::
|
||||
|
||||
git push origin <local branch>:releases/<branch>
|
||||
|
||||
|
||||
Manual release
|
||||
--------------
|
||||
|
||||
#. Build and upload a test release:
|
||||
::
|
||||
|
||||
make release-test-via-docker-ubuntu
|
||||
|
||||
#. Build and upload a final release:
|
||||
::
|
||||
|
||||
make release-via-docker-ubuntu
|
||||
|
||||
Other steps
|
||||
-----------
|
||||
|
||||
#. Update the contrib/scripts/install/docker.sh values
|
||||
|
||||
#. Upload contrib/scripts/install/docker.sh to https://get.mayan-edms.com
|
||||
99
docs/chapters/development/source_control.txt
Normal file
99
docs/chapters/development/source_control.txt
Normal file
@@ -0,0 +1,99 @@
|
||||
==============
|
||||
Source Control
|
||||
==============
|
||||
|
||||
Mayan EDMS source is controlled with Git_.
|
||||
|
||||
The project is publicly accessible, hosted and can be cloned from **GitLab** using::
|
||||
|
||||
$ git clone |SOURCE_CODE_GIT|
|
||||
|
||||
|
||||
Git branch structure
|
||||
--------------------
|
||||
|
||||
Mayan EDMS follows a simplified model layout based on Vincent Driessen's
|
||||
`Successful Git Branching Model`_ blog post.
|
||||
|
||||
``/versions/micro``
|
||||
Working branch for the next bugfix release. Micro increment (third digit).
|
||||
Only bug fixes, minor features, back-ported urgent features. This
|
||||
branch is stable and safe for production.
|
||||
``/versions/minor``
|
||||
Working branch for the next minor release (second digit). New features,
|
||||
occasional breakage. Not for production but should run in test
|
||||
environment most of the time. This is the branch you will want to
|
||||
try out if you want to check out new features.
|
||||
``/versions/major``
|
||||
Working branch for the next major release (first digit). New features,
|
||||
incompatible changes to the user facing interfaces. Broken most of the
|
||||
time, not for production and should only be cloned by developers
|
||||
with experience with Mayan's development.
|
||||
``master``
|
||||
Current production release (|version|). Points to the latest version of
|
||||
the latest series. Production quality code.
|
||||
``features/``
|
||||
Working branches for unfinished and unmerged feature. Likely unstable,
|
||||
don't use in production. Once the feature is complete, it is merged
|
||||
into one of the versions branches and deleted.
|
||||
|
||||
Special branches:
|
||||
|
||||
``releases/all``
|
||||
Pushing code to this branch will trigger the build and release
|
||||
a new Docker image, Documentation and Python package.
|
||||
``releases/docker``
|
||||
Pushing code to this branch will trigger the build and release
|
||||
of a new Docker image to Docker Hub.
|
||||
``releases/documentation``
|
||||
Pushing code to this branch will trigger the build and release
|
||||
of new documentation.
|
||||
``releases/python``
|
||||
Pushing code to this branch will trigger the build and release
|
||||
of a new Python package to PyPI.
|
||||
``nightly``
|
||||
Pushing code to this branch will trigger the build and release
|
||||
of a new Docker image based on development code to the GitLab image
|
||||
repository only. The image will not be published to Docker Hub.
|
||||
|
||||
Each release is tagged separately using annotated Git tags.
|
||||
|
||||
When submitting patches, please place your code in its own ``feature/`` branch
|
||||
prior to opening a Merge Request on |SOURCE_CODE_ISSUES|.
|
||||
|
||||
.. _Git: http://git-scm.org
|
||||
.. _`Successful Git Branching Model`: http://nvie.com/posts/a-successful-git-branching-model/
|
||||
|
||||
|
||||
Commit messages
|
||||
---------------
|
||||
|
||||
#. Use English as the language for the commit messages.
|
||||
#. Provide a subject line composed of a tag and a short explanation::
|
||||
|
||||
Indexing: Add document base property reindex
|
||||
|
||||
#. Keep the subject line to 50 or less characters.
|
||||
#. Capitalize the subject line.
|
||||
#. Don't end the subject line with a period, leave like a phrase in English.
|
||||
#. Use active voice in the. Say what the commit will do when applied not what
|
||||
you did::
|
||||
|
||||
Add new properties to the model.
|
||||
|
||||
Vs.
|
||||
::
|
||||
|
||||
Added new properties to the model.
|
||||
|
||||
#. Limit the body of the commit to 72 characters.
|
||||
#. When a commit fixes or improves an issue add the issue number in the commit
|
||||
message. Either in the subject or in the body.
|
||||
#. Sign commit messages.
|
||||
#. Use explicit language even for minor commits. Don't do::
|
||||
|
||||
Fix typo
|
||||
|
||||
Use::
|
||||
|
||||
Document: Fix typo in label description
|
||||
30
docs/chapters/docker/accessing_data.txt
Normal file
30
docs/chapters/docker/accessing_data.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
.. _docker-accessing-outside-data:
|
||||
|
||||
|
||||
======================
|
||||
Accessing outside data
|
||||
======================
|
||||
|
||||
To use Mayan EDMS's staging folders or watch folders from Docker, the data
|
||||
for these source must be made accessible to the container. This is done by
|
||||
mounting the folders in the host computer to folders inside the container.
|
||||
This is necessary because Docker containers do not have access to host data
|
||||
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:/scanned_files
|
||||
|
||||
The command line would look like this::
|
||||
|
||||
docker run ... -v /opt/scanned_files:/scanned_files mayanedms/mayanedms:latest
|
||||
|
||||
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 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
|
||||
47
docs/chapters/docker/backups.txt
Normal file
47
docs/chapters/docker/backups.txt
Normal file
@@ -0,0 +1,47 @@
|
||||
.. _docker_backups:
|
||||
|
||||
==================
|
||||
Performing backups
|
||||
==================
|
||||
|
||||
#. Document files
|
||||
|
||||
To backup the existing data, stop the image and copy the content of the volume.
|
||||
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:/scanned_files mayanedms/mayanedms:|DOCKER_MAYAN_IMAGE_VERSION|
|
||||
|
||||
That would be the ``/docker-volumes/mayan folder``::
|
||||
|
||||
sudo tar -zcvf backup.tar.gz /docker-volumes/mayan
|
||||
sudo chown `whoami` backup.tar.gz
|
||||
|
||||
#. Database
|
||||
|
||||
If using an external PostgreSQL or MySQL database or database containers, these
|
||||
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.
|
||||
|
||||
- PostgreSQL: https://www.postgresql.org/docs/current/backup-dump.html
|
||||
- MySQL: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
|
||||
|
||||
|
||||
=======================
|
||||
Restoring from a backup
|
||||
=======================
|
||||
|
||||
|
||||
#. Document files
|
||||
|
||||
Uncompress the backup archive in the original docker volume using::
|
||||
|
||||
sudo tar -xvzf backup.tar.gz -C /
|
||||
|
||||
|
||||
#. Database
|
||||
|
||||
- PostgreSQL: https://www.postgresql.org/docs/current/backup-dump.html
|
||||
- MySQL: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
|
||||
25
docs/chapters/docker/building.txt
Normal file
25
docs/chapters/docker/building.txt
Normal file
@@ -0,0 +1,25 @@
|
||||
.. _docker_building:
|
||||
|
||||
==================
|
||||
Building the image
|
||||
==================
|
||||
|
||||
Clone the repository with::
|
||||
|
||||
git clone |SOURCE_CODE_GIT|
|
||||
|
||||
Change to the directory of the cloned repository::
|
||||
|
||||
cd mayan-edms
|
||||
|
||||
Execute Docker's build command using the provided makefile::
|
||||
|
||||
make docker-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.
|
||||
|
||||
10
docs/chapters/docker/commands.txt
Normal file
10
docs/chapters/docker/commands.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
.. _docker_commands:
|
||||
|
||||
=================================
|
||||
Executing commands on a container
|
||||
=================================
|
||||
|
||||
To perform Mayan EDMS commands in a running container that will take all the
|
||||
settings from the container, use the following command::
|
||||
|
||||
docker exec -ti <container name> /usr/local/bin/entrypoint.sh "/opt/mayan-edms/bin/mayan-edms.py <command>"
|
||||
21
docs/chapters/docker/customizing.txt
Normal file
21
docs/chapters/docker/customizing.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
=====================
|
||||
Customizing the image
|
||||
=====================
|
||||
|
||||
If you just need to add a few Ubuntu or Python packages to your installation,
|
||||
you can use the following environment variables:
|
||||
|
||||
``MAYAN_APT_INSTALLS``
|
||||
|
||||
Specifies a list of Ubuntu .deb packages to be installed via APT when the
|
||||
container is first created. The installed packages are not lost when the image
|
||||
is stopped. Example: To install the Tesseract OCR language packs for German
|
||||
and Spanish add the following in your ``docker start`` command line::
|
||||
|
||||
-e MAYAN_APT_INSTALLS="tesseract-ocr-deu tesseract-ocr-spa"
|
||||
|
||||
``MAYAN_PIP_INSTALLS``
|
||||
|
||||
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.
|
||||
30
docs/chapters/docker/docker_compose.txt
Normal file
30
docs/chapters/docker/docker_compose.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
.. _docker_compose:
|
||||
|
||||
====================
|
||||
Using Docker compose
|
||||
====================
|
||||
|
||||
To deploy a complete production stack using the included Docker compose file
|
||||
execute::
|
||||
|
||||
docker-compose -f docker-compose.yml up -d
|
||||
|
||||
This Docker compose file will provision four containers:
|
||||
|
||||
- Postgres as the database
|
||||
- Redis as the Celery result storage
|
||||
- RabbitMQ as the Celery broker
|
||||
- Mayan EDMS using the above service containers
|
||||
|
||||
To stop the stack use::
|
||||
|
||||
docker-compose -f docker-compose.yml stop
|
||||
|
||||
The stack will also create four volumes to store the data of each container.
|
||||
These are:
|
||||
|
||||
- mayan_app - The Mayan EDMS data container, normally called `mayan_data` when not using Docker compose.
|
||||
- mayan_broker - The broker volume, in this case RabbitMQ.
|
||||
- mayan_db - The database volume, in this case Postgres.
|
||||
- mayan_results - The celery result backend volume, in this case Redis.
|
||||
|
||||
12
docs/chapters/docker/drivers.txt
Normal file
12
docs/chapters/docker/drivers.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
.. _docker_image_drivers:
|
||||
|
||||
================
|
||||
Included drivers
|
||||
================
|
||||
|
||||
The Docker image supports using Redis and RabbitMQ as result backends. For
|
||||
databases, the image includes support for PostgreSQL and MySQL/MariaDB.
|
||||
Support for additional brokers or databases may be added using the
|
||||
``MAYAN_APT_INSTALL`` environment variable.
|
||||
|
||||
|
||||
63
docs/chapters/docker/environment_variables.txt
Normal file
63
docs/chapters/docker/environment_variables.txt
Normal file
@@ -0,0 +1,63 @@
|
||||
.. index:: Docker environment variables
|
||||
.. _docker_environment_variables:
|
||||
|
||||
|
||||
=====================
|
||||
Environment Variables
|
||||
=====================
|
||||
|
||||
The common set of settings can also be modified via environment variables when
|
||||
using the Docker image. In addition to the common set of settings, some Docker
|
||||
image specific environment variables are available.
|
||||
|
||||
``MAYAN_SETTINGS_MODULE``
|
||||
|
||||
Optional. Allows loading an alternate settings file.
|
||||
|
||||
|
||||
``MAYAN_GUNICORN_TIMEOUT``
|
||||
|
||||
Optional. Changes the amount of time the frontend worker will wait for a
|
||||
request to finish before raising a timeout error. The default is 120
|
||||
seconds.
|
||||
|
||||
``MAYAN_GUNICORN_WORKERS``
|
||||
|
||||
Optional. This environment variable controls the number of frontend workers
|
||||
that will be executed. If not specified the default is 2. For heavier loads,
|
||||
user a higher number. A formula recommended for this setting is the number
|
||||
of CPU cores + 1.
|
||||
|
||||
``MAYAN_WORKER_FAST_CONCURRENCY``
|
||||
|
||||
Optional. Changes the concurrency (number of child processes) of the Celery
|
||||
worker consuming the queues in the fast (low latency, short tasks) 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_WORKER_MEDIUM_CONCURRENCY``
|
||||
|
||||
Optional. Changes the concurrency (number of child processes) of the Celery
|
||||
worker consuming the queues in the medium (medium latency, long running tasks)
|
||||
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_WORKER_SLOW_CONCURRENCY``
|
||||
|
||||
Optional. Changes the concurrency (number of child processes) of the Celery
|
||||
worker consuming the queues in the slow (high latency, very long running tasks)
|
||||
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.
|
||||
35
docs/chapters/docker/index.txt
Normal file
35
docs/chapters/docker/index.txt
Normal file
@@ -0,0 +1,35 @@
|
||||
.. index:: Docker
|
||||
|
||||
======
|
||||
Docker
|
||||
======
|
||||
|
||||
Docker is a container technology. Containers are a standard unit of software
|
||||
that packages up code and all its dependencies.
|
||||
|
||||
|
||||
- Installation: :doc:`install_simple` | :doc:`install_docker_network` | :doc:`docker_compose` | :doc:`start_stop`
|
||||
- Setup: :doc:`environment_variables` | :doc:`drivers`
|
||||
- Integration: :doc:`accessing_data`
|
||||
- Development: :doc:`building` | :doc:`customizing` | :doc:`nightly`
|
||||
- Administration: :doc:`backups` | :doc:`upgrading` | :doc:`commands`
|
||||
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
install_simple
|
||||
install_docker_network
|
||||
start_stop
|
||||
environment_variables
|
||||
drivers
|
||||
accessing_data
|
||||
backups
|
||||
upgrading
|
||||
building
|
||||
customizing
|
||||
docker_compose
|
||||
nightly
|
||||
commands
|
||||
|
||||
|
||||
67
docs/chapters/docker/install_docker_network.txt
Normal file
67
docs/chapters/docker/install_docker_network.txt
Normal file
@@ -0,0 +1,67 @@
|
||||
.. _docker_install_networked:
|
||||
|
||||
================================
|
||||
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.
|
||||
|
||||
#. Create the network:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker network create mayan
|
||||
|
||||
#. Launch the PostgreSQL container with the network option and remove the
|
||||
port binding (``-p 5432:5432``):
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-edms-postgres \
|
||||
--network=mayan \
|
||||
--restart=always \
|
||||
-e POSTGRES_USER=mayan \
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
|
||||
|DOCKER_POSTGRES_IMAGE_VERSION|
|
||||
|
||||
#. Launch the Redis container with the network option and remove the port
|
||||
binding (``-p 6379:6379``):
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-edms-redis \
|
||||
--network=mayan \
|
||||
|DOCKER_REDIS_IMAGE_VERSION| \
|
||||
redis-server \
|
||||
--databases \
|
||||
"2" \
|
||||
--maxmemory-policy \
|
||||
allkeys-lru \
|
||||
--save \
|
||||
""
|
||||
|
||||
#. Launch the Mayan EDMS container with the network option and change the
|
||||
database hostname to the PostgreSQL container name (``mayan-edms-postgres``)
|
||||
instead of the IP address of the Docker host (``172.17.0.1``):
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-edms \
|
||||
--network=mayan \
|
||||
--restart=always \
|
||||
-p 80:8000 \
|
||||
-e MAYAN_DATABASES="{'default':{'ENGINE':'django.db.backends.postgresql','NAME':'mayan','PASSWORD':'mayanuserpass','USER':'mayan','HOST':'mayan-edms-postgres'}}" \
|
||||
-e MAYAN_CELERY_BROKER_URL="redis://mayan-edms-redis:6379/0" \
|
||||
-e MAYAN_CELERY_RESULT_BACKEND="redis://mayan-edms-redis:6379/1" \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:|DOCKER_MAYAN_IMAGE_VERSION|
|
||||
117
docs/chapters/docker/install_simple.txt
Normal file
117
docs/chapters/docker/install_simple.txt
Normal file
@@ -0,0 +1,117 @@
|
||||
.. _docker_install:
|
||||
|
||||
|
||||
==========================
|
||||
Simple Docker installation
|
||||
==========================
|
||||
|
||||
#. Install Docker:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
wget -qO- https://get.docker.com/ | sh
|
||||
|
||||
If you don't want run an automated script, follow the instructions outlined
|
||||
in their documentation: https://docs.docker.com/install/
|
||||
|
||||
Once the Docker installation is finished, proceed to the link below to install
|
||||
the Docker image for Mayan EDMS.
|
||||
|
||||
|
||||
#. Download the Mayan EDMS Docker image:
|
||||
|
||||
With Docker properly installed, proceed to download the Mayan EDMS Docker
|
||||
image using the command:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker pull mayanedms/mayanedms:|DOCKER_MAYAN_IMAGE_VERSION|
|
||||
|
||||
|
||||
#. Download the PostgreSQL Docker image:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker pull |DOCKER_POSTGRES_IMAGE_VERSION|
|
||||
|
||||
|
||||
#. Download the Redis Docker image:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker pull |DOCKER_REDIS_IMAGE_VERSION|
|
||||
|
||||
|
||||
#. Create and run a PostgreSQL container:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-edms-postgres \
|
||||
--restart=always \
|
||||
-p 5432:5432 \
|
||||
-e POSTGRES_USER=mayan \
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
|
||||
|DOCKER_POSTGRES_IMAGE_VERSION|
|
||||
|
||||
The PostgreSQL container will have one database named ``mayan``, with an user
|
||||
named ``mayan`` too, with a password of ``mayanuserpass``. The container will
|
||||
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.
|
||||
|
||||
|
||||
#. Create and run a Redis container:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-edms-redis \
|
||||
--restart=always \
|
||||
-p 6379:6379 \
|
||||
|DOCKER_REDIS_IMAGE_VERSION| \
|
||||
redis-server \
|
||||
--databases \
|
||||
"2" \
|
||||
--maxmemory-policy \
|
||||
allkeys-lru \
|
||||
--save \
|
||||
""
|
||||
|
||||
The Redis container will have two databases, one for background task messages,
|
||||
and the other to hold the results of those background tasks. Redis is
|
||||
configure to not save its content to disk and to automatically clear up
|
||||
memory.
|
||||
|
||||
#. Create and run a Mayan EDMS container:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker run \
|
||||
-d \
|
||||
--name mayan-edms \
|
||||
--restart=always \
|
||||
-p 80:8000 \
|
||||
-e MAYAN_DATABASES="{'default':{'ENGINE':'django.db.backends.postgresql','NAME':'mayan','PASSWORD':'mayanuserpass','USER':'mayan','HOST':'172.17.0.1'}}" \
|
||||
-e MAYAN_CELERY_BROKER_URL="redis://172.17.0.1:6379/0" \
|
||||
-e MAYAN_CELERY_RESULT_BACKEND="redis://172.17.0.1:6379/1" \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:|DOCKER_MAYAN_IMAGE_VERSION|
|
||||
|
||||
The Mayan EDMS container will connect to the PostgreSQL container via the
|
||||
``172.17.0.1`` IP address (the Docker host's default IP address). It will
|
||||
connect using the ``django.db.backends.postgresql`` database driver and
|
||||
connect to the ``mayan`` database using the ``mayan`` user with the password
|
||||
``mayanuserpass``. The files of the container will be store in the
|
||||
host's ``/docker-volumes/mayan-edms/media`` folder. The container will
|
||||
expose its web service running on port 8000 on the host's port 80.
|
||||
|
||||
The container will be available by browsing to ``http://localhost`` or to
|
||||
the IP address of the computer running the container.
|
||||
|
||||
If another web server is running on port 80 use a different port in the
|
||||
``-p`` option. For example: ``-p 81:8000``.
|
||||
12
docs/chapters/docker/nightly.txt
Normal file
12
docs/chapters/docker/nightly.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
==============
|
||||
Nightly images
|
||||
==============
|
||||
|
||||
The continuous integration pipeline used for testing development builds also
|
||||
produces a resulting Docker image. These are build automatically and their
|
||||
stability is not guaranteed. They should never be used in production.
|
||||
If you want to try out the Docker images the development uses or want a sneak
|
||||
peek at the new features being worked on checkout the container registry at:
|
||||
|SOURCE_CODE_REPOSITORY|container_registry
|
||||
|
||||
|
||||
13
docs/chapters/docker/start_stop.txt
Normal file
13
docs/chapters/docker/start_stop.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
===================================
|
||||
Stopping and starting the container
|
||||
===================================
|
||||
|
||||
To stop the container use::
|
||||
|
||||
docker stop mayan-edms
|
||||
|
||||
|
||||
To start the container again::
|
||||
|
||||
docker start mayan-edms
|
||||
|
||||
30
docs/chapters/docker/upgrading.txt
Normal file
30
docs/chapters/docker/upgrading.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
=========
|
||||
Upgrading
|
||||
=========
|
||||
|
||||
Upgrading a Mayan EDMS Docker container is actually a matter of stopping and
|
||||
deleting the container, downloading the most recent version of the image and
|
||||
starting a container again. The container will take care of updating the
|
||||
database structure to the newest version if necessary.
|
||||
|
||||
**IMPORTANT!** Do not delete the volume storing the data, only the container.
|
||||
|
||||
Stop the container to be upgraded::
|
||||
|
||||
docker stop mayan-edms
|
||||
|
||||
|
||||
Remove the container::
|
||||
|
||||
docker rm mayan-edms
|
||||
|
||||
|
||||
Pull the new image version::
|
||||
|
||||
docker pull mayanedms/mayanedms:latest
|
||||
|
||||
|
||||
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
|
||||
|
||||
70
docs/chapters/document_types.txt
Normal file
70
docs/chapters/document_types.txt
Normal file
@@ -0,0 +1,70 @@
|
||||
==============
|
||||
Document types
|
||||
==============
|
||||
|
||||
The basic unit of data in Mayan EDMS is the **document type**. A document
|
||||
type can be interpreted also as a document category, a document class, or a
|
||||
document template. Every other aspect of the system will rely or be tied to
|
||||
one or more document type. Create one document type for each type or class of
|
||||
document you intend to upload into Mayan EDMS.
|
||||
|
||||
Document types need to be created before documents can be
|
||||
uploaded. It is not possible to upload documents without assigning them a
|
||||
document type.
|
||||
|
||||
Document types usually mirror the type of physical, paper document they
|
||||
represent.
|
||||
|
||||
Example document types:
|
||||
|
||||
* Letter
|
||||
* Invoice
|
||||
* Timesheet
|
||||
* Blueprint
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document_type [ label = 'each document type' ];
|
||||
documents [ label = 'many documents' ];
|
||||
|
||||
document_type -> documents;
|
||||
}
|
||||
|
||||
|
||||
Examples:
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document_type [ label = 'Invoice' ];
|
||||
documents_1 [ label = 'invoice_001.pdf', width=200 ];
|
||||
documents_2 [ label = 'invoice_032.pdf', width=200 ];
|
||||
|
||||
document_type -> documents_1, documents_2;
|
||||
}
|
||||
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document_type [ label = 'Receipts' ];
|
||||
documents_1 [ label = 'groceries_18-01-11.pdf', width=200 ];
|
||||
documents_2 [ label = 'car_payment-17-01-02.png', width=200 ];
|
||||
|
||||
document_type -> documents_1, documents_2;
|
||||
}
|
||||
|
||||
|
||||
Settings and attributes are applied to document types and documents will
|
||||
inherit those settings and attributes based on the document type they were
|
||||
assigned when uploaded into Mayan EDMS. A document can only be of one
|
||||
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.
|
||||
36
docs/chapters/file_storage.txt
Normal file
36
docs/chapters/file_storage.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
============
|
||||
File storage
|
||||
============
|
||||
|
||||
The files are stored and placed under Mayan EDMS "control" to avoid
|
||||
filename clashes each file gets renamed to its ``UUID`` (Universally Unique ID),
|
||||
without extension, and stored in a simple flat arrangement in a directory.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
file [ label = 'mayan_1-1.pdf', width=120];
|
||||
document [ label = 'mayan/media/document_storage/ab6c1cfe-8a8f-4a30-96c9-f54f606b9248', width=450];
|
||||
file -> document [label = "upload"];
|
||||
|
||||
file -> document;
|
||||
}
|
||||
|
||||
This doesn't stop access to the files but renaming, moving or updating
|
||||
directly them is not recommended because it would throw the database out
|
||||
of sync.
|
||||
|
||||
Because Mayan EDMS components are as decoupled from each other as possible,
|
||||
storage in this case is decoupled and its behavior is controlled
|
||||
not by the project but by the ``Storage`` module class. All the other
|
||||
modules don't make any assumptions about how the actual document files are
|
||||
stored. This way files can be saved locally, over the network or even across
|
||||
the Internet and everything will still operate exactly the same.
|
||||
|
||||
The default file storage backend: ``storage.backends.filebasedstorage.FileBasedStorage``
|
||||
is a simple backend that only supports paths and not IP addresses. In case you
|
||||
are interested in using remote volumes to store documents (NFS, SAMBA), first
|
||||
mount these volumes so that they appear as a directories to Mayan EDMS. For
|
||||
direct support for remote volumes a custom backend would be needed such as those
|
||||
provided by the Django Storages project (https://django-storages.readthedocs.org/en/latest/).
|
||||
125
docs/chapters/indexes/examples.txt
Normal file
125
docs/chapters/indexes/examples.txt
Normal file
@@ -0,0 +1,125 @@
|
||||
==============
|
||||
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 :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 :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.
|
||||
#. 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
|
||||
made to the index templates. Otherwise they update automatically whenever
|
||||
a new document is uploaded or existing documents properties are modified.
|
||||
#. A new index should appear under :menuselection:`Indexes` menu.
|
||||
|
||||
You can also program different behavior based on the different document types,
|
||||
by use a comparison and a conditional statement. As the document_type itself
|
||||
is not a string you cannot directly use that for that comparison. You will have
|
||||
to use the label of the document type.
|
||||
|
||||
For example::
|
||||
|
||||
{% if document.document_type.label == "Invoice" or document.document_type.label == "Letter" %}
|
||||
Correspondence
|
||||
{% else %}
|
||||
{{ document.document_type }}
|
||||
{% endif %}
|
||||
|
||||
This will create and index level for each document type. Except for documents
|
||||
of types "Invoice" and "Letter", these will now go into the level "Correspondence".
|
||||
|
||||
|
||||
Index document by department, taken from the first character of the invoice number metadata
|
||||
===========================================================================================
|
||||
|
||||
Requires one index node with the template::
|
||||
|
||||
{% if document.metadata_value_of.invoice_number.0 == "A" %}Accounting
|
||||
{% if document.metadata_value_of.invoice_number.0 == "H" %}Human Resources
|
||||
{% endif %}
|
||||
|
||||
|
||||
Nested date index from a date contained in a metadata
|
||||
=====================================================
|
||||
|
||||
Assuming the metadata type is named **date_issued** with a date format
|
||||
of YYYY-MM-DD. The target is to have two levels: one for years and another
|
||||
sub level for months.
|
||||
|
||||
**First level: Year**
|
||||
::
|
||||
|
||||
{{ document.metadata_value_of.date_issued|slice:"0:4" }}
|
||||
|
||||
|
||||
**Second level: Months**
|
||||
::
|
||||
|
||||
{{ document.metadata_value_of.date_issued|slice:"5:7" }}
|
||||
|
||||
|
||||
**Optional: Third level: Day**
|
||||
::
|
||||
|
||||
{{ document.metadata_value_of.date_issued|slice:"8:10" }}
|
||||
|
||||
|
||||
Index by OCR content
|
||||
====================
|
||||
|
||||
This example indexes documents in a "quarterly report" level if they have the
|
||||
fragment “quarterly report” in the OCR text::
|
||||
|
||||
{% if "quarterly report" in document.latest_version.ocr_content|join:" "|lower %}Quarterly reports{% endif %}
|
||||
|
||||
The same applies to text content extracted for the document::
|
||||
|
||||
{% if "quarterly report" in document.latest_version.content|join:" "|lower %}Quarterly reports{% endif %}
|
||||
|
||||
|
||||
|
||||
Index documents not found in any cabinet
|
||||
========================================
|
||||
::
|
||||
|
||||
{% if document.cabinets.count == 0 %}No Cabinets{% endif %}
|
||||
|
||||
|
||||
Index documents not tagged
|
||||
==========================
|
||||
::
|
||||
|
||||
{% if document.tags.count == 0 %}No Tags{% endif %}
|
||||
|
||||
|
||||
Index documents specifically, by the year of a metadata field otherwise by their uploaded year
|
||||
==============================================================================================
|
||||
::
|
||||
|
||||
{% for tag in document.tags.all %}{% if tag.label == "Taxes" %}{% if document.metadata_value_of.tax_year|length_is:"4" %}{{ document.metadata_value_of.tax_year }}{% else %}{{ document.date_added|date:"Y" }}{% endif %}{% endif %}{% endfor %}
|
||||
23
docs/chapters/indexes/index.txt
Normal file
23
docs/chapters/indexes/index.txt
Normal file
@@ -0,0 +1,23 @@
|
||||
.. index:: Indexes
|
||||
|
||||
================
|
||||
Document indexes
|
||||
================
|
||||
|
||||
Document indexes are a multi level structure similar to folder in a filesystem,
|
||||
however the hierarchy of the levels is automatically created, updated, or deleted
|
||||
based on rules set by the administrator.
|
||||
|
||||
- :doc:`indexes`
|
||||
- :doc:`examples`
|
||||
- :doc:`mirroring`
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
indexes
|
||||
mirroring
|
||||
examples
|
||||
|
||||
|
||||
|
||||
78
docs/chapters/indexes/indexes.txt
Normal file
78
docs/chapters/indexes/indexes.txt
Normal file
@@ -0,0 +1,78 @@
|
||||
===============
|
||||
Index structure
|
||||
===============
|
||||
|
||||
Indexes are an automatic method to hierarchically organize documents in
|
||||
relation to their properties (:doc:`../metadata`, label, MIME type,
|
||||
etc). To use indexes you need to first create an index template. Once created,
|
||||
associate the index to one or more :doc:`../document_types`.
|
||||
|
||||
Index are hierarchical models so a tree template needs to be specified for them.
|
||||
This tree template will contain references to document metadata or properties
|
||||
that will be replaced with the actual value for those metadata or properties.
|
||||
|
||||
Example:
|
||||
|
||||
- Document type: ``Product sheet``
|
||||
- Metadata type: ``Product year``, associated as a required metadata for the document type ``Product sheet``.
|
||||
|
||||
- Index: ``Product sheets per year``, and associated to the document type ``Product sheet``.
|
||||
- Index slug: ``product-sheets-per-year``. Slugs are internal unique identifiers that can be used by other Mayan EDMS modules to reference each index.
|
||||
- Index tree template as follows:
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
span_width = 30;
|
||||
|
||||
index [ label = 'Product sheets per year', width=180 ];
|
||||
root [ label = 'Root (Has document links? No)', width=450];
|
||||
level_2 [ label = '{{ document.metadata_value_of.product_year }} (Has document links? Yes)', width=450];
|
||||
|
||||
group {
|
||||
label = "Tree template";
|
||||
color = "#dddddd";
|
||||
style = dashed;
|
||||
root; level_2;
|
||||
}
|
||||
|
||||
index -> root
|
||||
root -> level_2 [folded];
|
||||
}
|
||||
|
||||
Now every time a new ``Product sheet`` is uploaded a hierarchical unit with the value
|
||||
of the metadata type ``Product year`` is created and a link to the uploaded ``Product sheet`` added to it.
|
||||
|
||||
Example:
|
||||
|
||||
Suppose three ``Product sheets`` are uploaded with the following values as their
|
||||
``Product year`` metadata: 2001, 2002, 2001 respectively. The result index
|
||||
that will be generate based on the tree template would be as follows:
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
index [ label = 'Product sheets per year', width=180 ];
|
||||
year_1 [ label = '2001', width = 60 ];
|
||||
year_2 [ label = '2002', width = 60 ];
|
||||
document_1 [ label = 'Product A data sheet (2001)', width = 200 ];
|
||||
document_2 [ label = 'Product B data sheet (2002)', width = 200 ];
|
||||
document_3 [ label = 'Product C data sheet (2001)', width = 200 ];
|
||||
|
||||
group {
|
||||
label = "Index content";
|
||||
color = "#dddddd";
|
||||
style = dashed;
|
||||
year_1, year_2, document_1, document_2, document_3;
|
||||
}
|
||||
|
||||
index -> year_1;
|
||||
index -> year_2;
|
||||
year_1 -> document_1;
|
||||
year_2 -> document_2;
|
||||
year_1 -> document_3;
|
||||
|
||||
}
|
||||
35
docs/chapters/indexes/mirroring.txt
Normal file
35
docs/chapters/indexes/mirroring.txt
Normal file
@@ -0,0 +1,35 @@
|
||||
=========
|
||||
Mirroring
|
||||
=========
|
||||
|
||||
Indexes can be exported as `FUSE <https://en.wikipedia.org/wiki/Filesystem_in_Userspace>`_
|
||||
filesystems. Using the management command ``mountindex`` we could export the
|
||||
previous example index as follows::
|
||||
|
||||
mkdir -p ~/indexes/products
|
||||
mayan-edms.py mountindex product-sheets-per-year ~/indexes/products
|
||||
|
||||
The ``~/indexes/products`` directory will now have a directory and files structure
|
||||
identical to that of the index. Once indexes are mounted with this command, they
|
||||
behave like any other filesystem directory and can even be further shared
|
||||
via the network with network file system software like
|
||||
`Samba <https://www.samba.org/>`_ or
|
||||
`NFS <https://en.wikipedia.org/wiki/Network_File_System>`_.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
orientation = portrait
|
||||
span_width = 200;
|
||||
|
||||
index [ label = 'Product sheets per year', width=180 ];
|
||||
block_device [ height = 100, label = "Block device\n(Hard drive)", shape = flowchart.database ];
|
||||
network [ label = "Network", shape = cloud ];
|
||||
user [ label = "Users", shape = actor ];
|
||||
|
||||
index -> block_device [ label = "mirroring", fontsize = 8 ];
|
||||
block_device -> network -> user;
|
||||
}
|
||||
|
||||
Indexes and mirrored indexes are Read Only as they are generated as a result of
|
||||
prior activities like document uploads, metadata changes.
|
||||
36
docs/chapters/languages.txt
Normal file
36
docs/chapters/languages.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
=========
|
||||
Languages
|
||||
=========
|
||||
|
||||
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.
|
||||
|
||||
For example, to reduce the list to just English and Spanish use
|
||||
::
|
||||
|
||||
DOCUMENTS_LANGUAGE_CODES = ('eng', 'spa')
|
||||
|
||||
|
||||
The default language to appear on the dropdown can also be configured using::
|
||||
|
||||
DOCUMENTS_LANGUAGE = 'spa'
|
||||
|
||||
Use the correct ISO 639-3 language abbreviation (https://en.wikipedia.org/wiki/ISO_639)
|
||||
as this code is used in several subsystems in Mayan EDMS such as the OCR app
|
||||
to determine how to interpret the document.
|
||||
|
||||
If using the Docker image, these settings can also be passed to the container
|
||||
as environment variables by prepending the ``MAYAN_`` suffix.
|
||||
|
||||
Example::
|
||||
|
||||
-e MAYAN_DOCUMENTS_LANGUAGE_CODES='["eng", "spa"]'
|
||||
|
||||
For more information check out the
|
||||
:ref:`environment variables <environment_variables>` chapter of the
|
||||
:doc:`../parts/settings` topic.
|
||||
|
||||
|
||||
21
docs/chapters/mailing.txt
Normal file
21
docs/chapters/mailing.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
=================
|
||||
Mailing documents
|
||||
=================
|
||||
|
||||
Sending emails in Mayan EDMS is controlled by two different system depending on
|
||||
the type of email being sent. These are administrative emails like password
|
||||
reset emails and user emails sent from the application. To configure
|
||||
administrative email for things like password reset check the topic:
|
||||
:doc:`../parts/administration`
|
||||
|
||||
Application emails
|
||||
==================
|
||||
|
||||
To allow users to send emails or documents from within the web interface,
|
||||
Mayan EDMS provides its our own email system called Mailing Profiles.
|
||||
Mailing Profiles support access control per user role and can use different
|
||||
email backends.
|
||||
|
||||
Once created mailing profiles allow users to send email messages from
|
||||
within the user interface containing either an URL link to the document or
|
||||
the actual document as an attachment.
|
||||
26
docs/chapters/ocr_backend.txt
Normal file
26
docs/chapters/ocr_backend.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
===========
|
||||
OCR backend
|
||||
===========
|
||||
|
||||
Mayan EDMS ships an OCR backend that uses the FLOSS engine Tesseract
|
||||
(https://github.com/tesseract-ocr/tesseract/), but it can
|
||||
use other engines. To support other engines create a wrapper that subclasses the
|
||||
``OCRBackendBase`` class defined in mayan/apps/ocr/classes. This subclass should
|
||||
expose the ``execute`` method. For an example of how the Tesseract backend
|
||||
is implemented take a look at the file ``mayan/apps/ocr/backends/tesseract.py``
|
||||
|
||||
Once you create you own backend, in your local.py settings add the option
|
||||
OCR_BACKEND and point it to your new OCR backend class path.
|
||||
|
||||
The default value of OCR_BACKEND is ``"ocr.backends.tesseract.Tesseract"``
|
||||
|
||||
To add support to OCR more languages when using Tesseract, install the
|
||||
corresponding language file. If using a Debian based OS, this command will
|
||||
display the available language files:
|
||||
|
||||
apt-cache search tesseract-ocr
|
||||
|
||||
If using the Docker image, pass the environment variable MAYAN_APT_INSTALLS
|
||||
with the corresponding Tesseract language option. Example::
|
||||
|
||||
-e MAYAN_APT_INSTALLS='tesseract-ocr-deu'
|
||||
38
docs/chapters/password_reset.txt
Normal file
38
docs/chapters/password_reset.txt
Normal file
@@ -0,0 +1,38 @@
|
||||
==============
|
||||
Password reset
|
||||
==============
|
||||
|
||||
To use the password reset feature, administrative emails need to be configured.
|
||||
These are sent by the system itself and not by the users. Their usage and
|
||||
configuration is different than the
|
||||
:doc:`email system used to share documents via email<../chapters/mailing>`.
|
||||
|
||||
Sending administrative emails
|
||||
=============================
|
||||
|
||||
To be able to send password reset emails configure the Django email settings
|
||||
via the :ref:`configuration file <configuration_file>`.
|
||||
|
||||
Example::
|
||||
|
||||
EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend
|
||||
EMAIL_HOST: '<your smtp ip address or hostname>'
|
||||
EMAIL_HOST_PASSWORD: '<your smtp password>'
|
||||
EMAIL_HOST_USER: '<your smtp username>'
|
||||
EMAIL_PORT: 25 # or 587 or your server's SMTP port
|
||||
EMAIL_TIMEOUT:
|
||||
EMAIL_USE_SSL: true
|
||||
EMAIL_USE_TLS: false
|
||||
|
||||
To change the reference URL in the password reset emails on in the
|
||||
default document mailing template modify the ``COMMON_PROJECT_URL`` setting.
|
||||
For information on the different ways to change a setting check the
|
||||
:doc:`../parts/settings` topic.
|
||||
|
||||
To test the email settings use the management command ``sendtestemail``.
|
||||
Example::
|
||||
|
||||
mayan-edms.py sendtestemail myself@example.com
|
||||
|
||||
|
||||
|
||||
30
docs/chapters/permissions.txt
Normal file
30
docs/chapters/permissions.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
===========
|
||||
Permissions
|
||||
===========
|
||||
|
||||
Mayan EDMS provides very fine control over which actions users can
|
||||
perform. Action control works by allowing ``roles``, that are composed of
|
||||
``groups`` of ``users`` to be granted a ``permission`` such that the holder of
|
||||
that permission can exercise it throughout the entire system.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
orientation = portrait
|
||||
default_shape = roundedbox
|
||||
span_width = 240;
|
||||
span_height = 100;
|
||||
|
||||
user [ label = 'Users' ];
|
||||
group [ label = 'Groups' ];
|
||||
role [ label = 'Roles' ];
|
||||
permission [ label = 'Permissions' ];
|
||||
|
||||
|
||||
user -> group -> role <- permission;
|
||||
}
|
||||
|
||||
In other words, users themselves can't hold a permission, permissions are
|
||||
granted only to roles. Users can't directly belong to a role, they can only
|
||||
belong to a group. Groups can be members of roles. Roles are system permission
|
||||
units and groups are business organizational units.
|
||||
18
docs/chapters/quick_labels.txt
Normal file
18
docs/chapters/quick_labels.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
============
|
||||
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".
|
||||
102
docs/chapters/rest_api.txt
Normal file
102
docs/chapters/rest_api.txt
Normal file
@@ -0,0 +1,102 @@
|
||||
========
|
||||
REST API
|
||||
========
|
||||
|
||||
Mayan EDMS provides an HTTP REST Application Program Interface (or API). This
|
||||
API allows integration with 3rd party software using simple HTTP requests.
|
||||
|
||||
Several API authentication methods are provides: **Session**, **Token**,
|
||||
and **HTTP Basic**.
|
||||
|
||||
The URL for the API can be found via the :menuselection:`Tools --> REST API`
|
||||
menu. The API is also self-documenting. The live API documentation can be
|
||||
found in the :menuselection:`Tools --> API Documentation (Swagger)` menu for
|
||||
the Swagger version and in the
|
||||
:menuselection:`Tools --> API Documentation (ReDoc)` menu for the ReDoc version.
|
||||
|
||||
The are a few ways to structure REST APIs. In the case of Mayan EDMS, API
|
||||
endpoints are structured by resource type. Examples:
|
||||
|
||||
* /cabinets - To view or create new cabinets
|
||||
* /cabinets/<id> - To view the details, edit, or delete an existing cabinet.
|
||||
* /cabinets/<id>/documents - To view, add, or remove documents from an existing
|
||||
cabinet.
|
||||
* /cabinets/<id>/documents/<id> - To view, add, or remove one document from an
|
||||
existing cabinet.
|
||||
|
||||
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 file_object:
|
||||
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'}
|
||||
126
docs/chapters/settings.txt
Normal file
126
docs/chapters/settings.txt
Normal file
@@ -0,0 +1,126 @@
|
||||
========
|
||||
Settings
|
||||
========
|
||||
|
||||
Mayan EDMS can be configure via environment variables or by setting files.
|
||||
|
||||
|
||||
.. _environment_variables:
|
||||
|
||||
Via environment variables
|
||||
=========================
|
||||
|
||||
To use environment variables, lookup the name of the setting you want to
|
||||
override in the "Settings" menu. The "Settings" menu is located inside the
|
||||
"Setup" main menu. To pass a value via an environment variable append
|
||||
``"MAYAN_"`` to the name of the settings option. For example, to change
|
||||
the number of documents displayed per page (``COMMON_PAGINATE_BY``, by default 40),
|
||||
use::
|
||||
|
||||
export MAYAN_COMMON_PAGINATE_BY=10
|
||||
|
||||
Restart Mayan EDMS and the new value will take effect. The "Settings" menu
|
||||
can be used to verify if the overridden setting value is being interpreted
|
||||
correctly.
|
||||
|
||||
|
||||
.. _configuration_file:
|
||||
|
||||
Via YAML configuration file
|
||||
===========================
|
||||
|
||||
.. versionadded:: 3.1
|
||||
|
||||
It is possible to modify the different settings by creating or editing the
|
||||
``media/config.yml`` file. This file is formatted in the YAML markup language
|
||||
(http://yaml.org/). Here is an example of what the looks like::
|
||||
|
||||
DOCUMENT_PARSING_AUTO_PARSING: true
|
||||
DOCUMENT_PARSING_PDFTOTEXT_PATH: /usr/bin/pdftotext
|
||||
EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend
|
||||
EMAIL_HOST: localhost
|
||||
EMAIL_HOST_PASSWORD: ''
|
||||
EMAIL_HOST_USER: ''
|
||||
EMAIL_PORT: 25
|
||||
EMAIL_TIMEOUT: null
|
||||
EMAIL_USE_SSL: false
|
||||
EMAIL_USE_TLS: false
|
||||
FILE_UPLOAD_MAX_MEMORY_SIZE: 2621440
|
||||
HOME_VIEW: common:home
|
||||
|
||||
Every time Mayan EDMS is able to start correctly it will copy the ``config.yml``
|
||||
and create a backup copy in the same directory named ``config_backup.yml``.
|
||||
This file is used to revert to the last know configuration file known
|
||||
to be valid. You can revert manually by copy the file or by using the
|
||||
``revertsettings`` management command from the command line.
|
||||
|
||||
|
||||
Via Python settings files
|
||||
=========================
|
||||
|
||||
Another way to configure Mayan EDMS and the one required when more extensive
|
||||
setup is required, such as when using external Python libraries, is via
|
||||
Python-style, settings files.
|
||||
If Mayan EDMS was installed using the Python package a ``mayan_settings``
|
||||
folder will created for this purpose. If you installed Mayan EDMS
|
||||
according to the :doc:`../chapters/deploying` instructions provided in this
|
||||
documentation your ``mayan_settings`` folder should be located in the directory:
|
||||
``|MAYAN_MEDIA_ROOT|/mayan_settings/``.
|
||||
|
||||
If Mayan EDMS was installed using Docker, the ``mayan_settings`` folder
|
||||
will be found inside the install Docker volume. If you installed Mayan EDMS
|
||||
according to the :doc:`../chapters/docker/index` instructions provided in this
|
||||
documentation your ``mayan_settings`` folder should be located in the directory:
|
||||
``/docker-volumes/mayan/mayan_settings``.
|
||||
|
||||
Create a file with any valid name and a ``.py`` extension in the
|
||||
``mayan_settings`` folder. The file must starts with a global import of
|
||||
``mayan.settings.production``. In the form::
|
||||
|
||||
from mayan.settings.production import *
|
||||
|
||||
Now add the corresponding lines to override the default settings.
|
||||
In the settings file, it is not necessary to prepend the string ``MAYAN_`` to
|
||||
the setting option. For example, to change the number of documents displayed
|
||||
per page (``COMMON_PAGINATE_BY``, by default 40),
|
||||
use::
|
||||
|
||||
COMMON_PAGINATE_BY=10
|
||||
|
||||
versus::
|
||||
|
||||
export MAYAN_COMMON_PAGINATE_BY=10
|
||||
|
||||
when using the environment variable method.
|
||||
|
||||
For this example let's assume the file was saved with the name ``mysettings.py``.
|
||||
|
||||
The way used to tell Mayan EDMS to import this file will vary based on the
|
||||
installation method.
|
||||
|
||||
For the :doc:`../chapters/deploying` method, the full import path will be
|
||||
``mayan.media.mayan_settings.mysettings`` and can be passed via the
|
||||
``--settings`` command line argument like this::
|
||||
|
||||
|MAYAN_BIN| runserver --settings=mayan.media.mayan_settings.mysettings
|
||||
|
||||
or via the ``DJANGO_SETTINGS_MODULE`` environment variable like this::
|
||||
|
||||
export DJANGO_SETTINGS_MODULE=mayan.media.mayan_settings.mysettings
|
||||
|
||||
To make the use of the custom Python setting file permanent, update the ``|MAYAN_SUPERVISOR_CONF|``
|
||||
file. In the ``[supervisord]`` section, update the ``environment=`` value of
|
||||
``DJANGO_SETTINGS_MODULE`` from the default ``mayan.settings.production`` to
|
||||
``mayan.media.mayan_settings.mysettings``. Pay attention to the indentation of
|
||||
the ``environment=`` entries.
|
||||
|
||||
Force supervisor to read the changes and restart using::
|
||||
|
||||
sudo supervisorctl reread
|
||||
sudo supervisorctl restart all
|
||||
|
||||
For the :doc:`../chapters/docker/index` installation method, the full import path will be
|
||||
``mayan_settings.mysettings`` and can only be passed via the
|
||||
``MAYAN_SETTINGS_MODULE`` environment variable like this::
|
||||
|
||||
docker run <...> -e MAYAN_SETTINGS_MODULE=mayan_settings.mysettings
|
||||
46
docs/chapters/signatures.txt
Normal file
46
docs/chapters/signatures.txt
Normal file
@@ -0,0 +1,46 @@
|
||||
===================
|
||||
Document signatures
|
||||
===================
|
||||
|
||||
Mayan EDMS supports two types of document signatures: embedded and
|
||||
detached signatures. When a document with an embedded signature is
|
||||
uploaded, this signature is readily detected as part of the document
|
||||
inspection step. The status of the signature can be verified by accessing the
|
||||
signatures sections of a document.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
|
||||
orientation = portrait
|
||||
span_width = 240;
|
||||
|
||||
user [ shape = "actor" ];
|
||||
key [ shape = flowchart.database, label = "Key" ];
|
||||
document [ shape = "note", label = "Document" ];
|
||||
document_signed [ label = "Signed\nDocument" ];
|
||||
|
||||
|
||||
key -> user -> document -> document_signed;
|
||||
}
|
||||
|
||||
Signed documents are tamper-proof. That means that if any part of the document's
|
||||
file is edited (even just one character or one pixel), the document's
|
||||
signature becomes invalid alerting that an unauthorized change has occurred.
|
||||
|
||||
Existing non signed documents can be signed in one of two ways:
|
||||
by downloading the document, signing it, and uploading the signed document
|
||||
as a new version of the existing one or by creating a detached signature for
|
||||
the non signed document and uploading such detached signature file.
|
||||
|
||||
Maintenance of the public keyring can be done using the ``Key management``
|
||||
functionality in the ``Setup menu``.
|
||||
|
||||
From this menu, key servers can be queried and the results imported. Public
|
||||
keys no longer needed can also be deleted from this menu.
|
||||
|
||||
Only `GNU Privacy Guard`_ signatures are support at the moment.
|
||||
|
||||
Only version 1 of `GNU Privacy Guard`_ is supported at the moment.
|
||||
|
||||
.. _`GNU Privacy Guard`: www.gnupg.org/
|
||||
32
docs/chapters/smart_links.txt
Normal file
32
docs/chapters/smart_links.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
===========
|
||||
Smart links
|
||||
===========
|
||||
|
||||
Smart links are a way to link documents without changing how they are organized
|
||||
in their respective indexes. Smart links are useful when two documents are
|
||||
related somehow but are of different type or different hierarchical units.
|
||||
|
||||
Example: A patient record can be related to a prescription drug information
|
||||
document, but they each belong to their own :doc:`../chapters/indexes/index`.
|
||||
|
||||
Smart links are rule based, but don't create any organizational structure.
|
||||
Smart links just show the documents that match the rules as evaluated against
|
||||
the metadata or properties of the currently displayed document.
|
||||
|
||||
Indexes are automatic hierarchical units used to group documents, smart links
|
||||
are automatic references between documents.
|
||||
|
||||
Example:
|
||||
|
||||
- Document type: ``Patient records``
|
||||
- Metadata type: ``Prescription``, associated as an optional metadata for the document type ``Patient records``.
|
||||
|
||||
- Document type: ``Prescription information sheets``
|
||||
|
||||
A smart link with the following condition, will automatically links patient
|
||||
records to the prescription information sheets based on the value of the
|
||||
metadata type of the patient record.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
foreign label is equal to {{ document.metadata_value_of.prescription }}
|
||||
65
docs/chapters/sources.txt
Normal file
65
docs/chapters/sources.txt
Normal file
@@ -0,0 +1,65 @@
|
||||
=======
|
||||
Sources
|
||||
=======
|
||||
|
||||
Document sources define places from which documents can be uploaded or gathered.
|
||||
|
||||
The current document sources supported are:
|
||||
|
||||
- Web - ``HTML`` forms with a ``Browse`` button that will open the file dialog
|
||||
when clicked to allow selection of files in the user's computer to be
|
||||
uploaded as documents.
|
||||
- POP3 email - Provide the email, server and credential of a ``POP3`` based
|
||||
email to be scanned periodically for email. The body of the email is uploaded
|
||||
as a document and the attachments of the email are uploaded as separate
|
||||
documents.
|
||||
- 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. 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
|
||||
work in a similar way with the main difference being that Staging folders are
|
||||
interactive while Watch folders are automatic; documents in a Watch folder
|
||||
are uploaded periodically and documents in a Staging folder remain indefinitely
|
||||
there until an user uploads them. A preview for files in a Staging folder is
|
||||
also provided. An example of Staging folder use is when multiple people
|
||||
are scanning documents but only one person must be allowed to upload those
|
||||
documents. This one person examines the scans quality and decides what to
|
||||
upload and what to reject and have re-scanned. Watch folders can be used
|
||||
when the quality of the scans is irrelevant or when they will be known
|
||||
to be of good quality, such as when receiving e-faxes as PDFs.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
mayan [shape = "roundedbox", label = "Mayan EDMS" ];
|
||||
email_pop3 [shape = "mail", label = "e-mail (POP3)"];
|
||||
email_imap [shape = "mail", label = "e-mail (IMAP)"];
|
||||
staging [shape = "flowchart.database", label = "Staging folder" ];
|
||||
watch [shape = "flowchart.database", label = "Watch folder" ];
|
||||
automatic [shape = "box", label = "Automatic\n(via schedule)" ];
|
||||
manual [shape = "actor", height=60, label = "Manual\n(user interaction)" ];
|
||||
web [shape = "note", label = "Webform upload" ];
|
||||
|
||||
automatic -> mayan;
|
||||
email_pop3 -> automatic;
|
||||
email_imap -> automatic;
|
||||
watch -> automatic;
|
||||
manual -> mayan;
|
||||
staging -> manual;
|
||||
web -> manual;
|
||||
}
|
||||
|
||||
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`.
|
||||
11
docs/chapters/tags.txt
Normal file
11
docs/chapters/tags.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
====
|
||||
Tags
|
||||
====
|
||||
|
||||
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.
|
||||
|
||||
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
docs/chapters/transformations.txt
Normal file
21
docs/chapters/transformations.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
===============
|
||||
Transformations
|
||||
===============
|
||||
|
||||
Transformations are persistent manipulations to the previews of the stored
|
||||
documents. For example: a scanning equipment may only produce landscape PDFs.
|
||||
In this case a useful transformation for that document source would be to rotate
|
||||
all scanned documents by 270 degrees after being uploaded. By adding this
|
||||
transformation to the Mayan EDMS source that is connected to the scanner, all
|
||||
pages scanned via that source will inherit the transformation as they are
|
||||
created. The result is that whenever a document is uploaded from that scanner,
|
||||
it will appear in portrait orientation, instead of landscape orientation.
|
||||
|
||||
Transformations can also be added to existing documents by clicking on a
|
||||
document's page and then clicking on "transformations". In this view the Actions
|
||||
menu will have a new option that reads "Create new transformation". Currently,
|
||||
the available transformations are: rotation, zoom, crop, and resize. Once the
|
||||
document image has been corrected, resubmit it for OCR for improved results.
|
||||
|
||||
Transformations are non destructive and do not physically modify the document
|
||||
file, they just modify the document's graphical representation.
|
||||
48
docs/chapters/versioning.txt
Normal file
48
docs/chapters/versioning.txt
Normal file
@@ -0,0 +1,48 @@
|
||||
===================
|
||||
Document versioning
|
||||
===================
|
||||
|
||||
Mayan EDMS has the ability to store different versions of the same
|
||||
document. A comment field is provided to allow users to summarize the new
|
||||
version changes in comparison with the previous one. If a new version was
|
||||
uploaded by mistake or such new version is no longer necessary the option to
|
||||
revert to a previous version of the document is provided.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
orientation = portrait
|
||||
node_width = 200;
|
||||
version_1 [ label = "Version 1" ];
|
||||
version_2 [ label = "Version 2" ];
|
||||
document_1 [ label = "payroll_report.pdf" ];
|
||||
document_2 [ label = "payroll_report_fixed.pdf" ];
|
||||
upload_1 [ label = "payroll_report.pdf" ];
|
||||
upload_2 [ label = "payroll_report_fixed.pdf" ];
|
||||
|
||||
upload_1 -> version_1 -> document_1;
|
||||
upload_2 -> version_2 -> document_2;
|
||||
document_1 -> document_2;
|
||||
}
|
||||
|
||||
Only the interactive document sources (:doc:`../chapters/sources`)
|
||||
(``Web`` and ``Staging folders``) are available to upload new document versions.
|
||||
|
||||
There is no limit to the number of versions a document can have.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
orientation = portrait
|
||||
node_width = 200;
|
||||
|
||||
document [ label = "payroll_report.pdf" ];
|
||||
versions [ label = "Versions", stacked ];
|
||||
|
||||
document -> versions;
|
||||
}
|
||||
|
||||
By default, the last version will be showed when working with the document
|
||||
but any of the versions can be inspected and viewed.
|
||||
113
docs/chapters/workflows.txt
Normal file
113
docs/chapters/workflows.txt
Normal file
@@ -0,0 +1,113 @@
|
||||
=========
|
||||
Workflows
|
||||
=========
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
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.
|
||||
|
||||
Workflows work by storing a series of states to help you know the "status"
|
||||
of a document. To move a workflow from one state to another, transitions are
|
||||
used.
|
||||
|
||||
Transitions connect two different states and help provide context to know
|
||||
which state is possible to transition to, from a previous state. Transitions
|
||||
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
|
||||
==========
|
||||
|
||||
Besides being able to be executed manually by users, transitions can also be
|
||||
programmed execute automatically based on system events. This is called in
|
||||
Mayan EDMS transition triggering and is one of the tools available to
|
||||
automate business processes.
|
||||
|
||||
For example:
|
||||
|
||||
* Move a document from a "scanned" state to a "billed" state
|
||||
when a tag is attached to the document.
|
||||
* Move a document from a "uploaded" state to a "OCR ready" state
|
||||
when the OCR engine finishes processing the document.
|
||||
|
||||
The other tool provided for process automation is being able to execute an
|
||||
action when a workflow state is reached or leaved. These are called state
|
||||
events.
|
||||
|
||||
Some examples of state actions currently provided are:
|
||||
|
||||
* Attach a tag to a document
|
||||
* Remove a tag from a document
|
||||
* Do an HTTP POST request to an external IP address
|
||||
* Edit the label or the description of a document.
|
||||
|
||||
Other time more state actions are being added. Some state actions like the one
|
||||
that creates an HTTP POST request allow Mayan EDMS to trigger processes in
|
||||
external systems based on the state of a document. One example of this is
|
||||
triggering the billing process of an accounting system when an invoice is
|
||||
scanned in Mayan EDMS.
|
||||
|
||||
Workflow state actions and transitions triggers are new features and are still
|
||||
evolving.
|
||||
|
||||
Workflows allow translating business logic into a series of states. With the
|
||||
addition of state actions and transition triggers, the workflows in Mayan EDMS
|
||||
are no longer just informative but can be part of your actual business
|
||||
automation process.
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Internally, workflows are implemented as a finite state machines
|
||||
(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 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.
|
||||
190
docs/conf.py
190
docs/conf.py
@@ -13,37 +13,49 @@ from __future__ import unicode_literals
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
import sys, os
|
||||
import os
|
||||
import sys
|
||||
|
||||
from docutils.parsers.rst import directives
|
||||
|
||||
sys.path.insert(0, os.path.abspath('..'))
|
||||
sys.path.insert(1, os.path.abspath('.'))
|
||||
|
||||
import mayan
|
||||
|
||||
import callbacks
|
||||
import patches
|
||||
import utils
|
||||
|
||||
# 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 -----------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#needs_sphinx = '1.0'
|
||||
# needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
#extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode']
|
||||
#extensions = ["djangodocs", "sphinx.ext.intersphinx"]
|
||||
extensions = ['djangodocs', 'sphinxcontrib.blockdiag']
|
||||
# extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.intersphinx']
|
||||
extensions = [
|
||||
'sphinx_sitemap', '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']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = '.rst'
|
||||
source_suffix = '.txt'
|
||||
|
||||
# The encoding of source files.
|
||||
# source_encoding = 'utf-8-sig'
|
||||
@@ -53,7 +65,7 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = mayan.__title__
|
||||
copyright = mayan.__copyright__
|
||||
copyright = mayan.__copyright_short__
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
@@ -67,20 +79,20 @@ release = version
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#language = None
|
||||
# language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
#today_fmt = '%B %d, %Y'
|
||||
# today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
exclude_patterns = ['_build']
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||
#default_role = None
|
||||
# default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
add_function_parentheses = True
|
||||
@@ -97,38 +109,40 @@ show_authors = False
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
#modindex_common_prefix = []
|
||||
# modindex_common_prefix = []
|
||||
|
||||
|
||||
# -- Options for HTML output ---------------------------------------------------
|
||||
|
||||
# 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 = []
|
||||
# html_theme_path = []
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
#html_title = None
|
||||
# html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
# html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#html_logo = None
|
||||
# html_logo = None
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#html_favicon = None
|
||||
# html_favicon = None
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
@@ -137,86 +151,89 @@ 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.
|
||||
#html_use_smartypants = True
|
||||
# html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
# html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
# html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_domain_indices = True
|
||||
# html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
#html_use_index = True
|
||||
# html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
#html_split_index = False
|
||||
# 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
|
||||
# html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
#html_show_copyright = True
|
||||
# html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
# html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
#html_file_suffix = None
|
||||
# html_file_suffix = None
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'MayanEDMSdoc'
|
||||
|
||||
html_show_sphinx = False
|
||||
|
||||
# -- Options for LaTeX output --------------------------------------------------
|
||||
|
||||
# The paper size ('letter' or 'a4').
|
||||
#latex_paper_size = 'letter'
|
||||
# latex_paper_size = 'letter'
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#latex_font_size = '10pt'
|
||||
# latex_font_size = '10pt'
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||
latex_documents = [
|
||||
('index', 'MayanEDMS.tex', 'Mayan EDMS Documentation',
|
||||
mayan.__author__, 'manual'),
|
||||
(
|
||||
'index', 'MayanEDMS.tex', 'Mayan EDMS Documentation',
|
||||
mayan.__author__, 'manual'
|
||||
),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
# latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
# latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
#latex_show_pagerefs = False
|
||||
# latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#latex_show_urls = False
|
||||
# latex_show_urls = False
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#latex_preamble = ''
|
||||
# latex_preamble = ''
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
# latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_domain_indices = True
|
||||
# latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output --------------------------------------------
|
||||
@@ -224,28 +241,71 @@ latex_documents = [
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
('index', 'mayanedms', 'Mayan EDMS Documentation',
|
||||
('index', 'mayanedms', '{} Documentation'.format(mayan.__title__),
|
||||
[mayan.__author__], 1)
|
||||
]
|
||||
|
||||
|
||||
# -- Custom options
|
||||
import alabaster
|
||||
|
||||
html_theme_path = [alabaster.get_path()]
|
||||
extensions.append('alabaster')
|
||||
html_theme = 'alabaster'
|
||||
html_sidebars = {
|
||||
'**': [
|
||||
'about.html', 'donate.html', 'navigation.html', 'searchbox.html',
|
||||
]
|
||||
}
|
||||
html_theme_options = {
|
||||
'description': mayan.__description__,
|
||||
'github_button': False,
|
||||
'travis_button': False,
|
||||
'gratipay_user': 'rosarior',
|
||||
'github_banner': False,
|
||||
# -- External links --
|
||||
extlinks = {
|
||||
'django-docs': (
|
||||
'https://docs.djangoproject.com/en/{}/%s'.format(
|
||||
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 #'
|
||||
),
|
||||
'gitlab-issue': (
|
||||
'https://gitlab.com/mayan-edms/mayan-edms/issues/%s', 'GitLab issue #'
|
||||
),
|
||||
'gitlab-merge': (
|
||||
'https://gitlab.com/mayan-edms/mayan-edms/merge_requests/%s',
|
||||
'GitLab merge request #'
|
||||
)
|
||||
}
|
||||
|
||||
html_logo = '_static/logo_pyramid_only.png'
|
||||
# -- Options for sitemap extension ---------------------------------------------
|
||||
|
||||
html_baseurl = 'https://docs.mayan-edms.com/'
|
||||
|
||||
|
||||
def setup(app):
|
||||
BASE_DIRECTORY = '/opt/'
|
||||
MAYAN_INSTALLATION_DIRECTORY = os.path.join(BASE_DIRECTORY, 'mayan-edms')
|
||||
MAYAN_MEDIA_ROOT = os.path.join(MAYAN_INSTALLATION_DIRECTORY, 'media')
|
||||
MAYAN_PYTHON_BIN_DIR = os.path.join(MAYAN_INSTALLATION_DIRECTORY, 'bin')
|
||||
MAYAN_GUNICORN_BIN = os.path.join(MAYAN_PYTHON_BIN_DIR, 'gunicorn')
|
||||
MAYAN_PIP_BIN = os.path.join(MAYAN_PYTHON_BIN_DIR, 'pip')
|
||||
MAYAN_BIN = os.path.join(MAYAN_PYTHON_BIN_DIR, 'mayan-edms.py')
|
||||
SUPERVISOR_ETC_PATH = '/etc/supervisor/conf.d/'
|
||||
MAYAN_SUPERVISOR_CONF = os.path.join(SUPERVISOR_ETC_PATH, 'mayan.conf')
|
||||
|
||||
environment_variables = utils.load_env_file()
|
||||
environment_variables['DOCKER_MAYAN_IMAGE_VERSION'] = mayan.__version__
|
||||
environment_variables['MAYAN_INSTALLATION_DIRECTORY'] = MAYAN_INSTALLATION_DIRECTORY
|
||||
environment_variables['MAYAN_MEDIA_ROOT'] = MAYAN_MEDIA_ROOT
|
||||
environment_variables['MAYAN_PYTHON_BIN_DIR'] = MAYAN_PYTHON_BIN_DIR
|
||||
environment_variables['MAYAN_GUNICORN_BIN'] = MAYAN_GUNICORN_BIN
|
||||
environment_variables['MAYAN_BIN'] = MAYAN_BIN
|
||||
environment_variables['MAYAN_PIP_BIN'] = MAYAN_PIP_BIN
|
||||
environment_variables['SUPERVISOR_ETC_PATH'] = SUPERVISOR_ETC_PATH
|
||||
environment_variables['MAYAN_SUPERVISOR_CONF'] = MAYAN_SUPERVISOR_CONF
|
||||
substitutions = utils.generate_substitutions(
|
||||
dictionary=environment_variables
|
||||
)
|
||||
|
||||
app.add_stylesheet(filename='css/custom.css')
|
||||
app.connect(
|
||||
event='source-read', callback=callbacks.get_source_read_callback(
|
||||
substitutions=substitutions
|
||||
)
|
||||
)
|
||||
directives.register_directive(
|
||||
name='include', directive=patches.monkey_patch_include(
|
||||
substitutions=substitutions
|
||||
)
|
||||
)
|
||||
utils.patch_theme_template(app, templates_path=templates_path[0])
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
Welcome to Mayan EDMS!
|
||||
======================
|
||||
|
||||
Mayan EDMS is a `Free Open Source`_ `Electronic Document Management System`_,
|
||||
coded in the Python language using the Django_ web application framework and
|
||||
released under the `Apache 2.0 License`_. It provides an electronic vault or
|
||||
repository for electronic documents.
|
||||
|
||||
.. image:: /_static/overview.gif
|
||||
:alt: Overview
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
Installation <topics/installation>
|
||||
Features <topics/features>
|
||||
Advanced deployment <topics/deploying>
|
||||
Release notes and upgrading <releases/index>
|
||||
Concepts <topics/index>
|
||||
Development <topics/development>
|
||||
App creation <topics/app_creation>
|
||||
Roadmap <topics/roadmap>
|
||||
Translations <topics/translations>
|
||||
Contributors <topics/contributors>
|
||||
Licensing <topics/license>
|
||||
FAQ <topics/faq>
|
||||
Contact <topics/contact>
|
||||
|
||||
.. _Docker: https://www.docker.com/
|
||||
.. _Django: http://www.djangoproject.com/
|
||||
.. _Free Open Source: http://en.wikipedia.org/wiki/Open_source
|
||||
.. _Electronic Document Management System: https://en.wikipedia.org/wiki/Document_management_system
|
||||
.. _Apache 2.0 License: https://www.apache.org/licenses/LICENSE-2.0.txt
|
||||
48
docs/index.txt
Normal file
48
docs/index.txt
Normal file
@@ -0,0 +1,48 @@
|
||||
Welcome to Mayan EDMS!
|
||||
======================
|
||||
|
||||
.. image:: /_static/mayan_logo.png
|
||||
:alt: Logo is a trademark of Roberto Rosario
|
||||
:align: center
|
||||
|
||||
|
||||
Mayan EDMS is a `Free Open Source`_ `Electronic Document Management System`_,
|
||||
coded in the Python language using the Django_ web application framework and
|
||||
released under the `Apache 2.0 License`_. It provides an electronic vault or
|
||||
repository for electronic documents.
|
||||
|
||||
.. image:: /_static/overview.gif
|
||||
:alt: Overview
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
parts/features
|
||||
parts/installation
|
||||
releases/index
|
||||
parts/getting_started
|
||||
parts/access_control
|
||||
parts/categorization
|
||||
parts/collaboration
|
||||
parts/settings
|
||||
parts/storage
|
||||
chapters/rest_api
|
||||
chapters/docker/index
|
||||
parts/advanced
|
||||
parts/administration
|
||||
parts/troubleshooting
|
||||
chapters/development/index
|
||||
parts/faq
|
||||
parts/license
|
||||
parts/contact
|
||||
|
||||
|
||||
.. _Docker: https://www.docker.com/
|
||||
.. _Django: http://www.djangoproject.com/
|
||||
.. _Free Open Source: http://en.wikipedia.org/wiki/Open_source
|
||||
.. _Electronic Document Management System: https://en.wikipedia.org/wiki/Document_management_system
|
||||
.. _Apache 2.0 License: https://www.apache.org/licenses/LICENSE-2.0.txt
|
||||
|
||||
|
||||
..
|
||||
parts/adding_documents
|
||||
210
docs/mercs/0001-merc-process.txt
Normal file
210
docs/mercs/0001-merc-process.txt
Normal file
@@ -0,0 +1,210 @@
|
||||
MERC 1: Purpose and Guidelines
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
:MERC: 1
|
||||
:Author: Michael Price
|
||||
:Status: Accepted
|
||||
:Type: Process
|
||||
:Created: 2018-02-17
|
||||
:Last-Modified: 2018-02-17
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
What is a MERC?
|
||||
===============
|
||||
|
||||
A Mayan EDMS Request For Comment document or MERC document is a design
|
||||
document providing information to the Mayan EDMS community, or
|
||||
describing a new feature or process for Mayan EDMS. MERCs provide
|
||||
concise technical specifications of features, along with rationales.
|
||||
|
||||
MERC Types
|
||||
==========
|
||||
|
||||
There are three kinds of MERCs:
|
||||
|
||||
1. A **Feature** MERC describes a new feature or implementation
|
||||
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.
|
||||
|
||||
3. A **Process** MERC describes a process surrounding Mayan EDMS, or
|
||||
proposes a change to (or an event in) a process. Process MERCs are
|
||||
like Feature MERCs but apply to areas other than the Mayan EDMS
|
||||
framework itself. They may propose an implementation, but not to
|
||||
Mayan EDMS's codebase; they often require community consensus; unlike
|
||||
Informational MERCs, they are more than recommendations, and users
|
||||
are typically not free to ignore them. Examples include
|
||||
procedures, guidelines, changes to the decision-making process, and
|
||||
changes to the tools or environment used in Mayan EDMS development.
|
||||
Any meta-MERC is also considered a Process MERC. (So this document
|
||||
is a Process MERC).
|
||||
|
||||
MERC submission workflow
|
||||
========================
|
||||
|
||||
Pre-proposal
|
||||
------------
|
||||
|
||||
The MERC process begins with a new idea for Mayan EDMS. It is highly recommended
|
||||
that a single MERC contain a single key proposal or new idea. Small enhancements
|
||||
or patches usually don't need a MERC and follow Mayan EDMS's normal contribution
|
||||
process.
|
||||
|
||||
MERCs should be focused on a single topic. If in doubt, split your MERC
|
||||
into several well-focused ones.
|
||||
|
||||
Once the idea's been vetted, a draft MERC should be presented to the
|
||||
Mayan EDMS mailing list. This gives the author a chance to flesh out the
|
||||
draft MERC to make sure it's properly formatted, of high quality, and to address
|
||||
initial concerns about the proposal.
|
||||
|
||||
The Core Developers will be responsible for accepting or rejecting the MERC proposal.
|
||||
|
||||
|
||||
Submitting the draft
|
||||
--------------------
|
||||
|
||||
Following the discussion on Mayan EDMS mailing list, the proposal
|
||||
should be sent as a merge request to the Mayan EDMS repository. The draft must
|
||||
be written in MERC style; if it isn't the merge request may be rejected until proper
|
||||
formatting rules are followed.
|
||||
|
||||
|
||||
Implementation
|
||||
--------------
|
||||
|
||||
Finally, once a MERC has been accepted, the implementation must be completed. In
|
||||
many cases some (or all) implementation will actually happen during the MERC
|
||||
process: Feature MERCs will often have fairly complete implementations before
|
||||
being reviewed. When the implementation is complete and incorporated
|
||||
into the main source code repository, the status will be changed to
|
||||
"Final".
|
||||
|
||||
MERC format
|
||||
===========
|
||||
|
||||
MERCs need to follow a common format and outline; this section describes
|
||||
that format.
|
||||
|
||||
MERCs must be written in `reStructuredText <http://docutils.sourceforge.net/rst.html>`_
|
||||
(the same format as Mayan EDMS's documentation).
|
||||
|
||||
Each MERC should have the following parts:
|
||||
|
||||
#. A short descriptive title (e.g. "User document filters"), which is also reflected
|
||||
in the MERC's filename (e.g. ``0002-user-document-filters.rst``).
|
||||
|
||||
#. A preamble -- a rST `field list <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#field-lists>`_
|
||||
containing metadata about the MERC, including the MERC number and so forth. See
|
||||
`MERC Metadata`_ below for specific details.
|
||||
|
||||
#. Abstract -- a short (~200 word) description of the technical issue
|
||||
being addressed.
|
||||
|
||||
#. Specification -- The technical specification should describe the syntax and
|
||||
semantics of any new feature. The specification should be detailed enough to
|
||||
allow implementation -- that is, developers other than the author should
|
||||
(given the right experience) be able to independently implement the feature,
|
||||
given only the MERC.
|
||||
|
||||
#. Motivation -- The motivation is critical for MERCs that want to add
|
||||
substantial new features or materially refactor existing ones. It should
|
||||
clearly explain why the existing solutions are inadequate to address the
|
||||
problem that the MERC solves. MERC submissions without sufficient motivation
|
||||
may be rejected outright.
|
||||
|
||||
#. Rationale -- The rationale fleshes out the specification by describing what
|
||||
motivated the design and why particular design decisions were made. It
|
||||
should describe alternate designs that were considered and related work.
|
||||
|
||||
The rationale should provide evidence of consensus within the community and
|
||||
discuss important objections or concerns raised during discussion.
|
||||
|
||||
#. Backwards Compatibility -- All MERCs that introduce backwards
|
||||
incompatibilities must include a section describing these incompatibilities
|
||||
and their severity. The MERC must explain how the author proposes to deal
|
||||
with these incompatibilities. MERC submissions without a sufficient backwards
|
||||
compatibility treatise may be rejected outright.
|
||||
|
||||
#. Reference Implementation -- The reference implementation must be completed
|
||||
before any MERC is given status "Final", but it need not be completed before
|
||||
the MERC is accepted. While there is merit to the approach of reaching
|
||||
consensus on the specification and rationale before writing code, the
|
||||
principle of "rough consensus and running code" is still useful when it comes
|
||||
to resolving many discussions of API details.
|
||||
|
||||
The final implementation must include tests and documentation, per Mayan EDMS
|
||||
development guide.
|
||||
|
||||
|
||||
MERC Metadata
|
||||
-------------
|
||||
|
||||
Each MERC must begin with some metadata given as an rST
|
||||
`field list <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#field-lists>`_.
|
||||
The headers must contain the following fields:
|
||||
|
||||
``MERC``
|
||||
The MERC number. In an initial merge request, this can be left out or given
|
||||
as ``XXXX``; the reviewer who merges the pull request will assign the MERC
|
||||
number.
|
||||
``Type``
|
||||
``Feature``, ``Informational``, or ``Process``
|
||||
``Status``
|
||||
``Draft``, ``Accepted``, ``Rejected``, ``Withdrawn``, ``Final``, or ``Superseded``
|
||||
``Created``
|
||||
Original creation date of the MERC (in ``yyyy-mm-dd`` format)
|
||||
``Last-Modified``
|
||||
Date the MERC was last modified (in ``yyyy-mm-dd`` format)
|
||||
``Author``
|
||||
The MERC's author(s).
|
||||
``Implementation-Team``
|
||||
The person/people who have committed to implementing this MERC
|
||||
``Requires``
|
||||
If this MERC depends on another MERC being implemented first,
|
||||
this should be a link to the required MERC.
|
||||
``Mayan EDMS-Version`` (optional)
|
||||
For Feature MERCs, the version of Mayan EDMS (e.g. ``2.7.3``) that this
|
||||
feature will be released in.
|
||||
``Replaces`` and ``Superseded-By`` (optional)
|
||||
These fields indicate that a MERC has been rendered obsolete. The newer MERC
|
||||
must have a ``Replaces`` header containing the number of the MERC that it
|
||||
rendered obsolete; the older MERC has a ``Superseded-By`` header pointing to
|
||||
the newer MERC.
|
||||
``Resolution`` (optional)
|
||||
For MERCs that have been decided upon, this can be a link to the final
|
||||
rationale for acceptance/rejection. It's also reasonable to simply update
|
||||
the MERC with a "Resolution" section, in which case this header can be left
|
||||
out.
|
||||
|
||||
Auxiliary Files
|
||||
---------------
|
||||
|
||||
MERCs may include auxiliary files such as diagrams. Such files must be named
|
||||
``XXXX-descriptive-title.ext``, where "XXXX" is the MERC number,
|
||||
"descriptive-title" is a short slug indicating what the file contains, and
|
||||
"ext" is replaced by the actual file extension (e.g. "png").
|
||||
|
||||
Reporting MERC Bugs, or Submitting MERC Updates
|
||||
===============================================
|
||||
|
||||
How you report a bug, or submit a MERC update depends on several factors, such as
|
||||
the maturity of the MERC, the preferences of the MERC author, and the nature of
|
||||
your comments. For the early draft stages of the MERC, it's probably best to
|
||||
send your comments and changes directly to the MERC author. For more mature, or
|
||||
finished MERCs you can submit corrections as repository issues or merge requests
|
||||
against the git repository.
|
||||
|
||||
When in doubt about where to send your changes, please check first with the MERC
|
||||
author and/or a core developer.
|
||||
|
||||
MERC authors with git push privileges for the MERC repository can update the MERCs
|
||||
themselves.
|
||||
82
docs/mercs/0002-test-writing.txt
Normal file
82
docs/mercs/0002-test-writing.txt
Normal file
@@ -0,0 +1,82 @@
|
||||
====================
|
||||
MERC 2: Test writing
|
||||
====================
|
||||
|
||||
:MERC: 2
|
||||
:Author: Michael Price
|
||||
:Status: Accepted
|
||||
:Type: Feature
|
||||
:Created: 2018-02-22
|
||||
:Last-Modified: 2018-04-01
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes a standard methodology for writing tests for Mayan EDMS.
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
Having a standard methodology for writing tests has the following advantages:
|
||||
|
||||
1. Scaffolding can be reduced by providing the most frequently used
|
||||
paradigms as methods or helper functions.
|
||||
2. Reduce the probabilities of errors slipping through poorly written tests.
|
||||
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
1. Tests must test each view in at least two ways:
|
||||
|
||||
A. Object creations views must be tested with and without permissions.
|
||||
B. Object detail, list and delete views must be tested with and without
|
||||
object access.
|
||||
|
||||
2. Tests must assert the status code of the response even
|
||||
when the expected status is HTTP 200.
|
||||
3. The actual request performed must be enclosed in a private methods
|
||||
so that the fail and pass tests use the same HTTP request.
|
||||
4. Test must verify that changes happened and didn't happened in the
|
||||
database regardless of the return code. Even is an edit view returns
|
||||
and error 4XX (404-Not found, 403-Forbidden, etc), the test must
|
||||
ensure that the data was not indeed modified.
|
||||
5. All tests must use the test user created by the BaseAPITestCase and not
|
||||
an super user unless absolutely required by the test.
|
||||
6. Each test must test just one thing.
|
||||
7. If a test object needs to be created before the execution of a request
|
||||
this object must be created by a private method.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def _request_tag_create(self):
|
||||
return self.post(
|
||||
viewname='rest_api:tag-list', data={
|
||||
'label': TEST_TAG_LABEL, 'color': TEST_TAG_COLOR
|
||||
}
|
||||
)
|
||||
|
||||
def test_tag_create_view_no_permission(self):
|
||||
response = self._request_tag_create()
|
||||
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
||||
self.assertEqual(Tag.objects.count(), 0)
|
||||
|
||||
def test_tag_create_view_with_permission(self):
|
||||
self.grant_permission(permission=permission_tag_create)
|
||||
response = self._request_tag_create()
|
||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||
|
||||
tag = Tag.objects.first()
|
||||
self.assertEqual(response.data['id'], tag.pk)
|
||||
self.assertEqual(response.data['label'], TEST_TAG_LABEL)
|
||||
self.assertEqual(response.data['color'], TEST_TAG_COLOR)
|
||||
|
||||
self.assertEqual(Tag.objects.count(), 1)
|
||||
self.assertEqual(tag.label, TEST_TAG_LABEL)
|
||||
self.assertEqual(tag.color, TEST_TAG_COLOR)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user