Compare commits
590 Commits
features/r
...
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 | ||
|
|
c51f8d2135 | ||
|
|
01b2ad3ddc | ||
|
|
e371124bca | ||
|
|
25df502cb0 | ||
|
|
ea4f9d6c4e | ||
|
|
f46a32580d |
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
|
||||
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
custom: https://www.mayan-edms.com/donation/
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -33,3 +33,5 @@ static_collected/
|
||||
google_fonts/
|
||||
node_modules/
|
||||
docs/build/
|
||||
docs/_templates/layout.html
|
||||
docs/_templates/footer.html
|
||||
|
||||
@@ -19,7 +19,7 @@ job_docker_build:
|
||||
- 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 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"
|
||||
@@ -58,7 +58,7 @@ job_docker_nightly:
|
||||
- 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 run --rm "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" run_tests
|
||||
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
|
||||
only:
|
||||
- nightly
|
||||
@@ -152,7 +152,9 @@ job_push_python:
|
||||
- locale-gen en_US.UTF-8
|
||||
- update-locale LANG=en_US.UTF-8
|
||||
- export LC_ALL=en_US.UTF-8
|
||||
- apt-get install -qq curl exiftool gcc ghostscript gnupg1 graphviz libfuse2 libjpeg-dev libmagic1 libpng-dev libtiff-dev poppler-utils libreoffice poppler-utils python-dev python-pip tesseract-ocr tesseract-ocr-deu
|
||||
- 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
|
||||
@@ -169,8 +171,10 @@ test-mysql:
|
||||
services:
|
||||
- mysql:8.0.3
|
||||
script:
|
||||
- apt-get install -qq libmysqlclient-dev mysql-client
|
||||
- pip install mysqlclient
|
||||
- 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:
|
||||
@@ -185,7 +189,9 @@ test-postgres:
|
||||
- postgres
|
||||
script:
|
||||
- apt-get install -qq libpq-dev
|
||||
- pip install psycopg2
|
||||
- . 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
|
||||
@@ -193,6 +199,7 @@ test-postgres:
|
||||
test-sqlite:
|
||||
<<: *test_base
|
||||
script:
|
||||
- . venv/bin/activate
|
||||
- python manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci --nomigrations
|
||||
|
||||
deploy_demo:
|
||||
|
||||
12
.tx/config
12
.tx/config
@@ -223,15 +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.weblink-3-0]
|
||||
file_filter = mayan/apps/weblinks/locale/<lang>/LC_MESSAGES/django.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/weblinks/locale/en/LC_MESSAGES/django.po
|
||||
source_file = mayan/apps/web_links/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
|
||||
@@ -4,21 +4,25 @@ 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
|
||||
----
|
||||
|
||||
606
HISTORY.rst
606
HISTORY.rst
File diff suppressed because it is too large
Load Diff
75
Makefile
75
Makefile
@@ -1,8 +1,11 @@
|
||||
.PHONY: clean-pyc clean-build
|
||||
#!make
|
||||
include config.env
|
||||
|
||||
.PHONY: clean clean-pyc clean-build test
|
||||
|
||||
help:
|
||||
@echo "Usage: make <target>\n"
|
||||
@awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_-]+:.*?## / { printf " * %-40s -%s\n", $$1, $$2 }' $(MAKEFILE_LIST)|sort
|
||||
@awk 'BEGIN {FS = ":.*##"} /^[0-9a-zA-Z_-]+:.*?## / { printf " * %-40s -%s\n", $$1, $$2 }' $(MAKEFILE_LIST)|sort
|
||||
|
||||
# Cleaning
|
||||
|
||||
@@ -18,7 +21,7 @@ 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 {} +
|
||||
find . -name '__pycache__' -exec rm -R -f {} +
|
||||
|
||||
# Testing
|
||||
|
||||
@@ -26,17 +29,25 @@ 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-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
|
||||
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
|
||||
while ! docker inspect --format='{{json .State.Health}}' test-postgres|grep 'Status":"healthy"'; do sleep 1; done
|
||||
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
|
||||
@@ -53,10 +64,10 @@ 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
|
||||
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
|
||||
while ! docker inspect --format='{{json .State.Health}}' test-mysql|grep 'Status":"healthy"'; do sleep 1; done
|
||||
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.
|
||||
@@ -75,9 +86,9 @@ 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
|
||||
|
||||
@@ -115,6 +126,9 @@ translations-push: ## Upload all translation files to Transifex.
|
||||
translations-pull: ## Download all translation files from Transifex.
|
||||
tx pull -f
|
||||
|
||||
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.
|
||||
@@ -227,10 +241,40 @@ generate-setup: generate-requirements
|
||||
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: ## Run the development server.
|
||||
@@ -243,11 +287,12 @@ shell_plus: ## Run the shell_plus command.
|
||||
./manage.py shell_plus --settings=mayan.settings.development
|
||||
|
||||
test-with-docker-services-on: ## Launch and initialize production-like services using Docker (Postgres and Redis).
|
||||
docker run -d --name redis -p 6379:6379 redis
|
||||
docker run -d --name postgres -p 5432:5432 postgres
|
||||
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 4
|
||||
pip install psycopg2==$(PYTHON_PSYCOPG2_VERSION) redis==$(PYTHON_REDIS_VERSION)
|
||||
./manage.py initialsetup --settings=mayan.settings.staging.docker
|
||||
|
||||
test-with-docker-services-off: ## Stop and delete the Docker production-like services.
|
||||
@@ -261,7 +306,7 @@ test-with-docker-worker: ## Launch a worker instance that uses the production-li
|
||||
DJANGO_SETTINGS_MODULE=mayan.settings.staging.docker ./manage.py celery worker -A mayan -B -l INFO -O fair
|
||||
|
||||
docker-mysql-on: ## Launch and initialize a MySQL Docker container.
|
||||
docker run -d --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan_edms mysql
|
||||
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-mysql-off: ## Stop and delete the MySQL Docker container.
|
||||
@@ -269,7 +314,7 @@ docker-mysql-off: ## Stop and delete the MySQL Docker container.
|
||||
docker rm mysql
|
||||
|
||||
docker-postgres-on: ## Launch and initialize a PostgreSQL Docker container.
|
||||
docker run -d --name postgres -p 5432:5432 postgres
|
||||
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-postgres-off: ## Stop and delete the PostgreSQL Docker container.
|
||||
|
||||
17
README.md
17
README.md
@@ -1,11 +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/)
|
||||
[](https://microbadger.com/images/mayanedms/mayanedms)
|
||||
|
||||
|
||||
[pypi]: http://img.shields.io/pypi/v/mayan-edms.svg
|
||||
[pypi-url]: http://badge.fury.io/py/mayan-edms
|
||||
@@ -43,6 +42,18 @@
|
||||
|
||||
</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
|
||||
|
||||
13
README.rst
13
README.rst
@@ -1,4 +1,4 @@
|
||||
|pypi| |builds| |coverage| |python| |license| |docker_pulls| |docker_stars| |docker_layers|
|
||||
|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
|
||||
@@ -25,6 +25,15 @@ 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).
|
||||
@@ -44,6 +53,8 @@ Important links
|
||||
- `Videos <https://www.youtube.com/channel/UCJOOXHP1MJ9lVA7d8ZTlHPw>`__
|
||||
|
||||
|
||||
.. |donation| image:: https://img.shields.io/badge/donation-PayPal-brightgreen
|
||||
:target: https://paypal.me/MayanEDMS
|
||||
.. |pypi| image:: http://img.shields.io/pypi/v/mayan-edms.svg
|
||||
:target: http://badge.fury.io/py/mayan-edms
|
||||
.. |builds| image:: https://gitlab.com/mayan-edms/mayan-edms/badges/master/build.svg
|
||||
|
||||
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,10 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends tesseract-ocr-deu
|
||||
|
||||
$MAYAN_PIP_BIN install -r ${MAYAN_INSTALL_DIR}/requirements-testing.txt
|
||||
|
||||
$MAYAN_BIN test --mayan-apps --settings=mayan.settings.testing
|
||||
@@ -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
|
||||
@@ -5,24 +5,30 @@ set -e
|
||||
# $ curl -fsSL get.mayan-edms.com -o get-mayan-edms.sh
|
||||
# $ sh get-mayan-edms.sh
|
||||
#
|
||||
# NOTE: Make sure to verify the contents of the script
|
||||
# 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
|
||||
# before executing.
|
||||
|
||||
: ${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}
|
||||
: ${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
|
||||
|
||||
@@ -44,6 +50,8 @@ 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"
|
||||
@@ -51,10 +59,19 @@ 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 "\nStarting in 10 seconds."
|
||||
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
|
||||
|
||||
@@ -72,33 +89,62 @@ if [ -z `which docker` ]; then
|
||||
fi
|
||||
|
||||
echo -n "* Removing existing Mayan EDMS and PostgreSQL containers (no data will be lost)..."
|
||||
true || docker stop $DOCKER_MAYAN_CONTAINER >/dev/null 2>&1
|
||||
true || docker rm $DOCKER_MAYAN_CONTAINER >/dev/null 2>&1
|
||||
true || docker stop $DOCKER_POSTGRES_CONTAINER >/dev/null 2>&1
|
||||
true || docker rm $DOCKER_POSTGRES_CONTAINER >/dev/null 2>&1
|
||||
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 delete all document data)..."
|
||||
echo -n "* Deleting Docker volumes in 5 seconds (warning: this will delete all document data). Press CTRL+C to cancel..."
|
||||
sleep 5
|
||||
true || rm DOCKER_MAYAN_VOLUME -Rf
|
||||
true || rm DOCKER_POSTGRES_VOLUME -Rf
|
||||
rm DOCKER_MAYAN_VOLUME -Rf || true
|
||||
rm DOCKER_POSTGRES_VOLUME -Rf || true
|
||||
echo "Done"
|
||||
fi
|
||||
|
||||
echo -n "* Pulling (downloading) the Mayan EDMS Docker image..."
|
||||
docker pull $DOCKER_MAYAN_IMAGE >/dev/null
|
||||
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 \
|
||||
-p $DOCKER_POSTGRES_PORT:5432 \
|
||||
$POSTGRES_PORT_ARGUMENT \
|
||||
-e POSTGRES_USER=$DATABASE_USER \
|
||||
-e POSTGRES_DB=$DATABASE_NAME \
|
||||
-e POSTGRES_PASSWORD=$DATABASE_PASSWORD \
|
||||
@@ -106,26 +152,47 @@ docker run -d \
|
||||
$DOCKER_POSTGRES_IMAGE >/dev/null
|
||||
echo "Done"
|
||||
|
||||
echo -n "* Waiting for the PostgreSQL container to be ready (10 seconds)..."
|
||||
sleep 10
|
||||
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 80:8000 \
|
||||
-p $DOCKER_MAYAN_PORT:8000 \
|
||||
-e MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
|
||||
-e MAYAN_DATABASE_HOST=172.17.0.1 \
|
||||
$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_PORT=$DOCKER_POSTGRES_PORT \
|
||||
-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:80; do sleep 1 && echo -n .; done;
|
||||
while ! curl --output /dev/null --silent --head --fail http://localhost:$DOCKER_MAYAN_PORT; do sleep 1 && echo -n .; done;
|
||||
echo "Done"
|
||||
|
||||
@@ -17,8 +17,8 @@ APP_LIST = (
|
||||
'file_metadata', 'linking', 'lock_manager', 'mailer',
|
||||
'mayan_statistics', 'metadata', 'mirroring', 'motd', 'navigation',
|
||||
'ocr', 'permissions', 'platform', 'rest_api', 'smart_settings',
|
||||
'sources', 'storage', 'tags', 'task_manager', 'user_management',
|
||||
'weblinks'
|
||||
'sources', 'storage', 'tags', 'task_manager', 'templating',
|
||||
'user_management', 'web_links'
|
||||
)
|
||||
|
||||
LANGUAGE_LIST = (
|
||||
|
||||
@@ -1,64 +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 * # NOQA
|
||||
from django.contrib.auth import get_user_model
|
||||
from django_auth_ldap.config import (
|
||||
LDAPSearch, LDAPSearchUnion, NestedActiveDirectoryGroupType
|
||||
)
|
||||
|
||||
SECRET_KEY = '<your secret key>'
|
||||
from mayan.settings.production import *
|
||||
|
||||
# makes sure this works in Active Directory
|
||||
ldap.set_option(ldap.OPT_REFERRALS, 0)
|
||||
# Makes sure this works in Active Directory
|
||||
ldap.set_option(ldap.OPT_REFERRALS, False)
|
||||
|
||||
# This is the default, but I like to be explicit.
|
||||
# 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
|
||||
|
||||
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 = ""
|
||||
# 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_SERVER_URI = LDAP_URL
|
||||
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',
|
||||
'mayan.settings.settings_local.EmailOrUsernameModelBackend',
|
||||
)
|
||||
|
||||
|
||||
class EmailOrUsernameModelBackend(object):
|
||||
"""
|
||||
This is a ModelBacked that allows authentication with either a username or an email address.
|
||||
"""
|
||||
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 get_user_model().DoesNotExist:
|
||||
return None
|
||||
|
||||
def get_user(self, username):
|
||||
try:
|
||||
return get_user_model().objects.get(pk=username)
|
||||
except get_user_model().DoesNotExist:
|
||||
return None
|
||||
|
||||
@@ -8,6 +8,8 @@ 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
|
||||
@@ -24,6 +26,8 @@ apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
exiftool \
|
||||
fonts-arphic-uming \
|
||||
fonts-arphic-ukai \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
gnupg1 \
|
||||
@@ -38,7 +42,7 @@ apt-get update \
|
||||
sane-utils \
|
||||
sudo \
|
||||
supervisor \
|
||||
tesseract-ocr \
|
||||
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 \
|
||||
@@ -102,18 +106,22 @@ apt-get install -y --no-install-recommends \
|
||||
&& chown -R mayan:mayan /src
|
||||
|
||||
USER mayan
|
||||
RUN python3 -m venv "${PROJECT_INSTALL_DIR}" \
|
||||
|
||||
RUN set -a \
|
||||
&& . /config.env \
|
||||
&& set +a \
|
||||
&& python3 -m venv "${PROJECT_INSTALL_DIR}" \
|
||||
&& . "${PROJECT_INSTALL_DIR}/bin/activate" \
|
||||
&& pip install --no-cache-dir \
|
||||
librabbitmq==2.0.0 \
|
||||
mysqlclient==1.4.2.post1 \
|
||||
psycopg2==2.8.3 \
|
||||
redis==3.2.1 \
|
||||
flower==0.9.3 \
|
||||
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==5.6.2 \
|
||||
psutil==$PYTHON_PSUTIL_VERSION \
|
||||
; fi \
|
||||
# Install the Python packages needed to build Mayan EDMS
|
||||
&& pip install --no-cache-dir -r /src/requirements/build.txt \
|
||||
|
||||
116
docker/Makefile
116
docker/Makefile
@@ -1,40 +1,130 @@
|
||||
#!make
|
||||
include config.env
|
||||
|
||||
HOST_IP = `/sbin/ip route|awk '/docker0/ { print $$9 }'`
|
||||
|
||||
APT_PROXY ?= $(HOST_IP):3142
|
||||
PIP_INDEX_URL ?= http://$(HOST_IP):3141/root/pypi/+simple/
|
||||
PIP_TRUSTED_HOST ?= $(HOST_IP)
|
||||
|
||||
IMAGE_VERSION ?= `cat docker/rootfs/version`
|
||||
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-test-container: ## Build and run a test container.
|
||||
docker-test-container: docker-build-with-proxy docker-test-cleanup
|
||||
docker run -d --name test-mayan-edms -p 80:8000 -v test-mayan_data:/var/lib/mayan mayanedms/mayanedms:$(DOCKER_VERSION)
|
||||
docker-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-test-cleanup: ## Delete the test container and the test volume.
|
||||
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-test-all: ## Build and executed the test suite in a test container.
|
||||
docker-test-all: docker-build-with-proxy
|
||||
docker run --rm run-tests
|
||||
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:
|
||||
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
|
||||
|
||||
@@ -18,10 +18,10 @@ services:
|
||||
# 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/1
|
||||
MAYAN_CELERY_RESULT_BACKEND: redis://redis:6379/0
|
||||
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.2.6
|
||||
image: mayanedms/mayanedms:3.3
|
||||
networks:
|
||||
- mayan-bridge
|
||||
ports:
|
||||
@@ -35,7 +35,7 @@ services:
|
||||
POSTGRES_DB: mayan
|
||||
POSTGRES_PASSWORD: mayandbpass
|
||||
POSTGRES_USER: mayan
|
||||
image: postgres:9.6
|
||||
image: postgres:9.6-alpine
|
||||
networks:
|
||||
- mayan-bridge
|
||||
restart: unless-stopped
|
||||
@@ -51,7 +51,7 @@ services:
|
||||
- allkeys-lru
|
||||
- --save
|
||||
- ""
|
||||
image: redis:5.0
|
||||
image: redis:5.0-alpine
|
||||
networks:
|
||||
- mayan-bridge
|
||||
restart: unless-stopped
|
||||
@@ -69,7 +69,7 @@ services:
|
||||
# # - rabbitmq
|
||||
# environment:
|
||||
# <<: *mayan_env
|
||||
# image: mayanedms/mayanedms:3.2.6
|
||||
# image: mayanedms/mayanedms:3.3
|
||||
# networks:
|
||||
# - mayan-bridge
|
||||
# ports:
|
||||
@@ -90,7 +90,7 @@ services:
|
||||
# volumes:
|
||||
# - /docker-volumes/mayan-edms/rabbitmq:/var/lib/rabbitmq
|
||||
|
||||
# Enable to run stand alone workers
|
||||
# Enable to run standalone workers
|
||||
# worker_fast:
|
||||
# command:
|
||||
# - run_worker
|
||||
@@ -102,14 +102,14 @@ services:
|
||||
# # - rabbitmq
|
||||
# environment:
|
||||
# <<: *mayan_env
|
||||
# image: mayanedms/mayanedms:3.2.6
|
||||
# image: mayanedms/mayanedms:3.3
|
||||
# networks:
|
||||
# - mayan-bridge
|
||||
# restart: unless-stopped
|
||||
# volumes:
|
||||
# - /docker-volumes/mayan-edms/media:/var/lib/mayan
|
||||
|
||||
# Enable to run stand frontend gunicorn
|
||||
# Enable to run frontend gunicorn
|
||||
# frontend:
|
||||
# command:
|
||||
# - run_frontend
|
||||
@@ -120,7 +120,7 @@ services:
|
||||
# # - rabbitmq
|
||||
# environment:
|
||||
# <<: *mayan_env
|
||||
# image: mayanedms/mayanedms:3.2.6
|
||||
# image: mayanedms/mayanedms:3.3
|
||||
# networks:
|
||||
# - mayan-bridge
|
||||
# ports:
|
||||
|
||||
@@ -11,6 +11,9 @@ 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
|
||||
@@ -27,7 +30,20 @@ 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:-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=
|
||||
@@ -129,13 +145,17 @@ 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
|
||||
run_tests.sh "${@:2}"
|
||||
;;
|
||||
|
||||
run_worker)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
TEST_ARGUMENT=${@:-"--mayan-apps"}
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends gcc python-dev tesseract-ocr-deu
|
||||
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_PIP_BIN} install -r ${MAYAN_INSTALL_DIR}/testing-base.txt"
|
||||
|
||||
su mayan -c "$MAYAN_BIN test --mayan-apps --settings=mayan.settings.testing"
|
||||
su mayan -c "${MAYAN_BIN} test ${TEST_ARGUMENT} --settings=mayan.settings.testing"
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
QUEUE_LIST=`MAYAN_WORKER_NAME=$1 su mayan -c "${MAYAN_PYTHON_BIN_DIR}mayan-edms.py platformtemplate worker_queues"`
|
||||
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 $QUEUE_LIST ${@:2}"
|
||||
su mayan -c "${MAYAN_PYTHON_BIN_DIR}celery -A mayan worker -Ofair -l ERROR -Q ${MAYAN_QUEUE_LIST} ${@:2}"
|
||||
|
||||
@@ -1 +1 @@
|
||||
3.2.6
|
||||
3.3.6
|
||||
|
||||
0
docs/__init__.py
Normal file
0
docs/__init__.py
Normal file
@@ -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 |
12
docs/_static/css/custom.css
vendored
12
docs/_static/css/custom.css
vendored
@@ -3,3 +3,15 @@
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
@@ -1,6 +1,6 @@
|
||||
********************
|
||||
====================
|
||||
Access control lists
|
||||
********************
|
||||
====================
|
||||
|
||||
Besides the permissions system explained in :doc:`../chapters/permissions`,
|
||||
Mayan EDMS provides per object permission granting. This feature is used to
|
||||
@@ -1,159 +0,0 @@
|
||||
************
|
||||
App creation
|
||||
************
|
||||
|
||||
Mayan EDMS apps are essentially Django app with some extra code to register
|
||||
navigation, permissions and other relationships.
|
||||
|
||||
|
||||
App modules
|
||||
===========
|
||||
|
||||
- __init__.py
|
||||
|
||||
Should be empty if possible. No initialization code should be here, use the
|
||||
ready() method of the MayanAppConfig class in the apps.py module.
|
||||
|
||||
- admin.py
|
||||
|
||||
Standard Django app module to define how models are to be presented in the
|
||||
admin interface.
|
||||
|
||||
- api_views.py
|
||||
|
||||
REST API views go here. Mayan EDMS uses Django REST Framework API view
|
||||
classes.
|
||||
|
||||
- apps.py
|
||||
|
||||
Contains the MayanAppConfig subclass as required by Django 1.7 and up. This
|
||||
is a place to define the app name and translatable verbose name as well as
|
||||
code to be execute when the modules of the app are ready.
|
||||
|
||||
- classes.py
|
||||
|
||||
Hold python classes to be used internally or externally. Any class defined by
|
||||
the app that is not a model.
|
||||
|
||||
- events.py
|
||||
|
||||
Define event class instances that are later committed to a log by custom
|
||||
code.
|
||||
|
||||
- exceptions.py
|
||||
|
||||
Custom exceptions defined by the app.
|
||||
|
||||
- fields.py
|
||||
|
||||
Place any custom form field classed you define here.
|
||||
|
||||
- forms.py
|
||||
|
||||
Standard Django app module that hold custom form classes.
|
||||
|
||||
- handlers.py
|
||||
|
||||
Contains the signal handlers, functions that will process a given signal
|
||||
emitted from this or other apps. Connect the handler functions to the
|
||||
corresponding signal in the ready() method of the MayanAppConfig subclass in
|
||||
apps.py
|
||||
|
||||
- html_widgets.py
|
||||
|
||||
Classes to render an HTML widget. HTML widget are not the same as Django's
|
||||
native form widgets. Form widgets only work as part of a form field.
|
||||
HTML widgets are for use outside of forms, such as in a table cell.
|
||||
|
||||
- licenses.py
|
||||
|
||||
This module outlines the license text of the third party content used in
|
||||
the app. It could be other Python libraries, JavaScript libraries, etc.
|
||||
|
||||
- links.py
|
||||
|
||||
Defines the links to be used by the app. Import only from the navigation app
|
||||
and the local permissions.py file.
|
||||
|
||||
- literals.py
|
||||
|
||||
Stores magic numbers, module choices (if static), settings defaults, and
|
||||
constants. Should contain all capital case variables. Must not import from
|
||||
any other module.
|
||||
|
||||
- managers.py
|
||||
|
||||
Standard Django app module that hold custom model managers. These act as
|
||||
model class method to performs actions in a series of model instances or
|
||||
utilitarian actions on external models instances.
|
||||
|
||||
- models.py
|
||||
|
||||
Standard Django app module that defines ORM persistent data schema.
|
||||
|
||||
- permissions.py
|
||||
|
||||
Defines the permissions to be used to validate user access by links and views.
|
||||
Imports only from the permissions app. Link or view conditions such as
|
||||
testing for is_staff or is_super_user flag are defined in this same module.
|
||||
|
||||
- runtime.py
|
||||
|
||||
Use this module when you need the same instance of a class for the entire app.
|
||||
This module acts as a shared memory space for the other modules of the app or
|
||||
other apps.
|
||||
|
||||
- search.py
|
||||
|
||||
Search model definitions. Define which field of the app's models are
|
||||
searchable.
|
||||
|
||||
- serializers.py
|
||||
|
||||
Hold Django REST Framework serializers used by the api_views.py module.
|
||||
|
||||
- settings.py
|
||||
|
||||
Define the configuration settings instances that the app will use.
|
||||
|
||||
- signals.py
|
||||
|
||||
Any custom defined signal goes here.
|
||||
|
||||
- statistics.py
|
||||
|
||||
Provides functions that will compute any sort of statistical information on
|
||||
the app’s data.
|
||||
|
||||
- tasks.py
|
||||
|
||||
Code to be execute in the background or as an out-of-process action.
|
||||
|
||||
- tests/ directory
|
||||
|
||||
Hold test modules. There should be one test_*.py module for each aspect being
|
||||
tested, examples: test_api.py, test_views.py, test_parsers.py, test_permissions.py
|
||||
Any shared constant data used by the tests should be added to tests/literals.py
|
||||
|
||||
- utils.py
|
||||
|
||||
Holds utilitarian code that doesn't fit on any other app module or that is
|
||||
used by several modules in the app. Anything used internally by the app that
|
||||
is not a class or a literal (should be as little as possible)
|
||||
|
||||
- widgets.py
|
||||
|
||||
Custom form widgets go here. This should be the only place with presentation
|
||||
directives in the app (aside the templates).
|
||||
|
||||
|
||||
Views
|
||||
=====
|
||||
|
||||
The module common.generics provides custom generic class based views to be used.
|
||||
The basic views used to create, edit, view and delete objects in Mayan EDMS
|
||||
are: SingleObjectCreateView, SingleObjectDetailView, SingleObjectEditView,
|
||||
and SingleObjectListView
|
||||
|
||||
These views handle aspects relating to view permissions, object permissions,
|
||||
post action redirection and template context generation.
|
||||
@@ -1,70 +0,0 @@
|
||||
*******
|
||||
Backups
|
||||
*******
|
||||
|
||||
To backup your install of Mayan EDMS just copy the actual document files and
|
||||
the database content. If you are using the default storage backend, the
|
||||
document files should be found in the ``media`` folder of your installation.
|
||||
|
||||
To dump the content of your database manager refer to the documentation chapter
|
||||
regarding database data "dumping".
|
||||
|
||||
Here is an example of how to perform a backup and a restore of a PostgreSQL
|
||||
database.
|
||||
|
||||
To dump the database into an SQL text file::
|
||||
|
||||
pg_dump -h <host> -U <database user> -c <database name> -W > `date +%Y-%m-%d"_"%H-%M-%S`.sql
|
||||
|
||||
Example::
|
||||
|
||||
pg_dump -h 127.0.0.1 -U mayan -c mayan -W > `date +%Y-%m-%d"_"%H-%M-%S`.sql
|
||||
|
||||
To restore the database from the SQL text file::
|
||||
|
||||
psql -h <host> -U <database user> -d <database name> -W -f <sql dump file>
|
||||
|
||||
Example::
|
||||
|
||||
psql -h 127.0.0.1 -U mayan -d mayan -W -f 2018-06-07_18-10-56.sql
|
||||
|
||||
Here is an example of how to perform a backup and a restore of a PostgreSQL
|
||||
Docker container using a compressed dump file. A dump file is not compatible or
|
||||
can be used interchangeable with an SQL text file.
|
||||
|
||||
To backup a PostgreSQL Docker container::
|
||||
|
||||
docker exec <container name> pg_dump -U <database user> -Fc -c <database name> > `date +%Y-%m-%d"_"%H-%M-%S`.dump
|
||||
|
||||
Example::
|
||||
|
||||
docker exec mayan-edms-db pg_dump -U mayan -Fc -c mayan > `date +%Y-%m-%d"_"%H-%M-%S`.dump
|
||||
|
||||
This will produce a compressed dump file with the current date and time as the filename.
|
||||
|
||||
To restore a PostgreSQL Docker container::
|
||||
|
||||
docker exec -i <container name> pg_restore -U <database user> -d <database name> < <dump file>
|
||||
|
||||
Since it is not possible to drop a currently open PostgreSQL database, this
|
||||
command must be used on a new and empty PostsgreSQL container.
|
||||
|
||||
Example::
|
||||
|
||||
docker run -d \
|
||||
--name mayan-edms-pg-new \
|
||||
--restart=always \
|
||||
-p 5432:5432 \
|
||||
-e POSTGRES_USER=mayan \
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres-new:/var/lib/postgresql/data \
|
||||
-d postgres:9.6
|
||||
|
||||
docker exec -i mayan-edms-pg-new pg_restore -U mayan -d mayan < 2018-06-07_17-09-34.dump
|
||||
|
||||
More information at:
|
||||
|
||||
- PostgreSQL: https://www.postgresql.org/docs/current/static/backup.html
|
||||
- MySQL: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
|
||||
- SQLite: Just copy the file ``mayan/media/db.sqlite3``
|
||||
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
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
========
|
||||
Cabinets
|
||||
========
|
||||
|
||||
Cabinets are a multi-level method to organize documents. Each cabinet can
|
||||
contain documents as well as other sub level cabinets. Cabinets can
|
||||
be added from the :menuselection:`Cabinets --> Add new` menu.
|
||||
contain documents as well as other sub level cabinets.
|
||||
|
||||
With a cabinet structure created, the next step is to add documents to them.
|
||||
To add documents to a cabinet, select the cabinet tab of a document, and
|
||||
select :menuselection:`Actions --> Add to cabinets` link.
|
||||
|
||||
Documents can also be added in bulk to one or more cabinets from any view
|
||||
that lists documents.
|
||||
@@ -1,6 +1,6 @@
|
||||
*********
|
||||
=========
|
||||
Checkouts
|
||||
*********
|
||||
=========
|
||||
|
||||
Checkouts are a way to block certain accesses or actions of a document for a
|
||||
period of time.
|
||||
@@ -1,103 +0,0 @@
|
||||
*******************
|
||||
Database conversion
|
||||
*******************
|
||||
|
||||
Version 3.1.x added a new management command to help convert data residing in
|
||||
an SQLite database to other database managers like PostgreSQL. Here is the
|
||||
conversion procedure.
|
||||
|
||||
Direct install
|
||||
==============
|
||||
|
||||
* Make a backup of your existing SQLite database and documents by copying the
|
||||
``/opt/mayan-edms/media`` folder.
|
||||
* :doc:`Upgrade to at least version 3.1.3. <../releases/3.1.3>`
|
||||
* Migrate the existing SQLite database with the command ``performupgrade``::
|
||||
|
||||
sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py performupgrade
|
||||
|
||||
* Install PostgreSQL::
|
||||
|
||||
sudo apt-get install postgresql libpq-dev
|
||||
|
||||
* Provision a PostgreSQL database::
|
||||
|
||||
sudo -u postgres psql -c "CREATE USER mayan WITH password 'mayanuserpass';"
|
||||
sudo -u postgres createdb -O mayan mayan
|
||||
|
||||
* Install the Python client for PostgreSQL::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 psycopg2==2.7.3.2
|
||||
|
||||
* Copy the newly created fallback config file::
|
||||
|
||||
cp /opt/mayan-edms/media/config_backup.yml /opt/mayan-edms/media/config.yml
|
||||
|
||||
* Edit the configuration file to add the entry for the PostgreSQL database and
|
||||
rename the SQLite database to 'old'::
|
||||
|
||||
# Before
|
||||
DATABASES:
|
||||
default:
|
||||
ATOMIC_REQUESTS: false
|
||||
AUTOCOMMIT: true
|
||||
CONN_MAX_AGE: 0
|
||||
ENGINE: django.db.backends.sqlite3
|
||||
HOST: ''
|
||||
NAME: /opt/mayan-edms/media/db.sqlite3
|
||||
OPTIONS: {}
|
||||
PASSWORD: ''
|
||||
PORT: ''
|
||||
TEST: {CHARSET: null, COLLATION: null, MIRROR: null, NAME: null}
|
||||
TIME_ZONE: null
|
||||
USER: ''
|
||||
|
||||
# After
|
||||
DATABASES:
|
||||
old:
|
||||
ATOMIC_REQUESTS: false
|
||||
AUTOCOMMIT: true
|
||||
CONN_MAX_AGE: 0
|
||||
ENGINE: django.db.backends.sqlite3
|
||||
HOST: ''
|
||||
NAME: /opt/mayan-edms/media/db.sqlite3
|
||||
OPTIONS: {}
|
||||
PASSWORD: ''
|
||||
PORT: ''
|
||||
TEST: {CHARSET: null, COLLATION: null, MIRROR: null, NAME: null}
|
||||
TIME_ZONE: null
|
||||
USER: ''
|
||||
default:
|
||||
ATOMIC_REQUESTS: false
|
||||
AUTOCOMMIT: true
|
||||
CONN_MAX_AGE: 0
|
||||
ENGINE: django.db.backends.postgresql
|
||||
HOST: '127.0.0.1'
|
||||
NAME: /opt/mayan-edms/media/db.sqlite3
|
||||
OPTIONS: {}
|
||||
PASSWORD: 'mayanuserpass'
|
||||
PORT: ''
|
||||
TEST: {CHARSET: null, COLLATION: null, MIRROR: null, NAME: null}
|
||||
TIME_ZONE: null
|
||||
USER: 'mayan'
|
||||
|
||||
* Migrate the new database to create the empty tables::
|
||||
|
||||
sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py migrate
|
||||
|
||||
* Convert the data in the SQLite and store it in the PostgreSQL database::
|
||||
|
||||
sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py convertdb --from=old --to=default --force
|
||||
|
||||
* Update the supervisor config file to have Mayan EDMS run from the PostgreSQL database::
|
||||
|
||||
[supervisord]
|
||||
environment=
|
||||
<...>
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql,
|
||||
MAYAN_DATABASE_HOST=127.0.0.1,
|
||||
MAYAN_DATABASE_NAME=mayan,
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass,
|
||||
MAYAN_DATABASE_USER=mayan,
|
||||
MAYAN_DATABASE_CONN_MAX_AGE=0,
|
||||
<...>
|
||||
@@ -1,253 +0,0 @@
|
||||
******************
|
||||
Direct deployments
|
||||
******************
|
||||
|
||||
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.
|
||||
|
||||
1. Install binary dependencies:
|
||||
-------------------------------
|
||||
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
|
||||
requirements using::
|
||||
|
||||
sudo apt-get install g++ gcc ghostscript gnupg1 graphviz libfuse2 \
|
||||
libjpeg-dev libmagic1 libpq-dev libpng-dev libreoffice libtiff-dev \
|
||||
poppler-utils postgresql python-dev python-virtualenv redis-server \
|
||||
sane-utils supervisor tesseract-ocr zlib1g-dev -y
|
||||
|
||||
.. note::
|
||||
|
||||
Platforms with the ARM CPU might also need additional requirements.
|
||||
::
|
||||
|
||||
sudo apt-get install libffi-dev libssl-dev -y
|
||||
|
||||
|
||||
2. Create the user account for the installation:
|
||||
------------------------------------------------
|
||||
This will create an unprivileged user account that is also unable to login.
|
||||
::
|
||||
|
||||
sudo adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
|
||||
|
||||
|
||||
3. 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)
|
||||
::
|
||||
|
||||
sudo mkdir /opt
|
||||
|
||||
|
||||
4. 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.
|
||||
::
|
||||
|
||||
sudo virtualenv /opt/mayan-edms
|
||||
|
||||
|
||||
5. Make the mayan user the owner of the installation directory:
|
||||
---------------------------------------------------------------
|
||||
::
|
||||
|
||||
sudo chown mayan:mayan /opt/mayan-edms -R
|
||||
|
||||
|
||||
6. Install Mayan EDMS from PyPI:
|
||||
--------------------------------
|
||||
::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 mayan-edms
|
||||
|
||||
|
||||
7. Install the Python client for PostgreSQL and Redis:
|
||||
------------------------------------------------------
|
||||
::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 psycopg2==2.7.3.2 redis==2.10.6
|
||||
|
||||
.. note::
|
||||
|
||||
Platforms with the ARM CPU might also need additional requirements.
|
||||
::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 psutil==5.6.2
|
||||
|
||||
|
||||
8. Create the database for the installation:
|
||||
--------------------------------------------
|
||||
::
|
||||
|
||||
sudo -u postgres psql -c "CREATE USER mayan WITH password 'mayanuserpass';"
|
||||
sudo -u postgres createdb -O mayan mayan
|
||||
|
||||
|
||||
9. 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 no be created in some cases. Make sure all
|
||||
environment variable and values are correct. If this happens, refer to the
|
||||
troubleshooting chapters: :ref:`troubleshooting-autoadmin-account` and
|
||||
:ref:`troubleshooting-admin-password`.
|
||||
|
||||
::
|
||||
|
||||
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=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py initialsetup
|
||||
|
||||
|
||||
10. Collect the static files:
|
||||
-----------------------------
|
||||
This step merges and compressed static media files so they can be served more
|
||||
effectively.
|
||||
|
||||
::
|
||||
|
||||
sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py preparestatic --noinput
|
||||
|
||||
|
||||
11. Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
|
||||
------------------------------------------------------------------------
|
||||
::
|
||||
|
||||
sudo mayan MAYAN_DATABASES="{'default':{'ENGINE':'django.db.backends.postgresql','NAME':'mayan','PASSWORD':'mayanuserpass','USER':'mayan','HOST':'127.0.0.1'}}" \
|
||||
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
|
||||
12. Configure Redis:
|
||||
--------------------
|
||||
Configure Redis to discard data when it runs out of memory, not save its
|
||||
database and only keep 1 database:
|
||||
::
|
||||
|
||||
sudo echo "maxmemory-policy allkeys-lru" >> /etc/redis/redis.conf
|
||||
sudo echo "save \"\"" >> /etc/redis/redis.conf
|
||||
sudo echo "databases 1" >> /etc/redis/redis.conf
|
||||
sudo systemctl restart redis
|
||||
|
||||
13. Enable and restart the services [1_]:
|
||||
-----------------------------------------
|
||||
::
|
||||
|
||||
sudo systemctl enable supervisor
|
||||
sudo systemctl restart supervisor
|
||||
|
||||
|
||||
14. Cleaning up:
|
||||
----------------
|
||||
The following operating system dependencies are only needed during
|
||||
installation and can be removed.
|
||||
::
|
||||
|
||||
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.
|
||||
|
||||
|
||||
1. Install RabbitMQ:
|
||||
--------------------
|
||||
|
||||
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
|
||||
requirements using::
|
||||
|
||||
sudo apt-get install rabbitmq-server -y
|
||||
|
||||
|
||||
2. Install the Python client for RabbitMQ:
|
||||
------------------------------------------
|
||||
::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 librabbitmq==2.0.0
|
||||
|
||||
|
||||
3. Create the RabbitMQ user and vhost:
|
||||
--------------------------------------
|
||||
::
|
||||
|
||||
sudo rabbitmqctl add_user mayan mayanrabbitmqpassword
|
||||
sudo rabbitmqctl add_vhost mayan
|
||||
sudo rabbitmqctl set_permissions -p mayan mayan ".*" ".*" ".*"
|
||||
|
||||
|
||||
4. Edit the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
|
||||
---------------------------------------------------------------------
|
||||
Replace (paying attention to the comma at the end)::
|
||||
|
||||
MAYAN_CELERY_BROKER_URL="redis://127.0.0.1:6379/0",
|
||||
|
||||
with::
|
||||
|
||||
MAYAN_CELERY_BROKER_URL="amqp://mayan:mayanrabbitmqpassword@localhost:5672/mayan",
|
||||
|
||||
increase the number of Gunicorn workers to 3 in the line (``-w 2`` section)::
|
||||
|
||||
command = /opt/mayan-edms/bin/gunicorn -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``).
|
||||
|
||||
|
||||
5. Restart the services:
|
||||
------------------------
|
||||
::
|
||||
|
||||
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
|
||||
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
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
**************************************************
|
||||
==================================================
|
||||
Mayan EDMS Entity Contributor Assignment Agreement
|
||||
**************************************************
|
||||
==================================================
|
||||
|
||||
Thank you for your interest in contributing to Mayan EDMS ("We" or "Us").
|
||||
|
||||
@@ -14,6 +14,7 @@ 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
|
||||
@@ -55,6 +56,7 @@ first Submit a Contribution to Us, whichever is earlier.
|
||||
2. Grant of Rights
|
||||
==================
|
||||
|
||||
|
||||
2.1 Copyright Assignment
|
||||
------------------------
|
||||
|
||||
@@ -101,6 +103,7 @@ 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
|
||||
----------------
|
||||
|
||||
@@ -108,12 +111,14 @@ 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
|
||||
-------------------------
|
||||
|
||||
@@ -159,6 +164,7 @@ OR OTHERWISE) UPON WHICH THE CLAIM IS BASED.
|
||||
6. Miscellaneous
|
||||
================
|
||||
|
||||
|
||||
6.1 Jurisdiction
|
||||
----------------
|
||||
|
||||
@@ -170,19 +176,25 @@ 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
|
||||
@@ -190,8 +202,10 @@ 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.
|
||||
@@ -1,6 +1,6 @@
|
||||
******************************************************
|
||||
======================================================
|
||||
Mayan EDMS Individual Contributor Assignment Agreement
|
||||
******************************************************
|
||||
======================================================
|
||||
|
||||
Thank you for your interest in contributing to Mayan EDMS ("We" or "Us").
|
||||
|
||||
@@ -11,6 +11,7 @@ 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
|
||||
==============
|
||||
|
||||
@@ -43,9 +44,11 @@ or otherwise designated in writing by You as "Not a Contribution."
|
||||
"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
|
||||
------------------------
|
||||
|
||||
@@ -87,6 +90,7 @@ 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
|
||||
@@ -156,6 +160,7 @@ OR OTHERWISE) UPON WHICH THE CLAIM IS BASED.
|
||||
6. Miscellaneous
|
||||
================
|
||||
|
||||
|
||||
6.1 Jurisdiction
|
||||
----------------
|
||||
|
||||
@@ -167,12 +172,14 @@ 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
|
||||
-----------------
|
||||
|
||||
@@ -180,6 +187,7 @@ 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
|
||||
--------------------------
|
||||
|
||||
@@ -190,6 +198,7 @@ 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
|
||||
----------------
|
||||
|
||||
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
|
||||
@@ -1,6 +1,6 @@
|
||||
************
|
||||
============
|
||||
Translations
|
||||
************
|
||||
============
|
||||
|
||||
Translations are handled online via the **Transifex** website:
|
||||
https://www.transifex.com/projects/p/mayan-edms/. To create a translation team
|
||||
@@ -1,362 +0,0 @@
|
||||
============
|
||||
Docker image
|
||||
============
|
||||
|
||||
How to use this image
|
||||
=====================
|
||||
|
||||
.. _docker_install:
|
||||
|
||||
Start a Mayan EDMS Docker image
|
||||
-------------------------------
|
||||
|
||||
With Docker properly installed, proceed to download the Mayan EDMS image using
|
||||
the command::
|
||||
|
||||
docker pull mayanedms/mayanedms:<version>
|
||||
|
||||
Instead of a specific version tag you may use then generic ``:latest`` tag
|
||||
to the get latest version available automatically. If you use the ``:latest``
|
||||
tag here, remember to do so in the next steps also.::
|
||||
|
||||
docker pull mayanedms/mayanedms:latest
|
||||
|
||||
Then download version 9.6 of the Docker PostgreSQL image::
|
||||
|
||||
docker pull postgres:9.6
|
||||
|
||||
Create and run a PostgreSQL container::
|
||||
|
||||
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 \
|
||||
-d postgres:9.6
|
||||
|
||||
The PostgreSQL container will have one database named ``mayan``, with an user
|
||||
named ``mayan`` too, with a password of ``mayanuserpass``. The container will
|
||||
expose its internal 5432 port (PostgreSQL's default port) via the host's
|
||||
5432 port. The data of this container will reside on the host's
|
||||
``/docker-volumes/mayan-edms/postgres`` folder.
|
||||
|
||||
Finally create and run a Mayan EDMS container::
|
||||
|
||||
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'}}" \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:<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 container will keep connections to the database
|
||||
for up to 60 seconds in an attempt to reuse them increasing response time
|
||||
and reducing memory usage. 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``.
|
||||
|
||||
|
||||
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::
|
||||
|
||||
docker network create mayan
|
||||
|
||||
Launch the PostgreSQL container with the network option and remove the port
|
||||
binding (``-p 5432:5432``)::
|
||||
|
||||
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 \
|
||||
-d postgres:9.6
|
||||
|
||||
Launch the Mayan EDMS container with the network option and change the
|
||||
database hostname to the PostgreSQL container name (``mayan-edms-postgres``)
|
||||
instead of the IP address of the Docker host (``172.17.0.1``)::
|
||||
|
||||
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'}}" \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:<version>
|
||||
|
||||
|
||||
Stopping and starting the container
|
||||
-----------------------------------
|
||||
|
||||
To stop the container use::
|
||||
|
||||
docker stop mayan-edms
|
||||
|
||||
|
||||
To start the container again::
|
||||
|
||||
docker start mayan-edms
|
||||
|
||||
|
||||
.. _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_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.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
.. _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
|
||||
|
||||
|
||||
Performing backups
|
||||
==================
|
||||
|
||||
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:latest
|
||||
|
||||
That would be the ``/docker-volumes/mayan folder``::
|
||||
|
||||
sudo tar -zcvf backup.tar.gz /docker-volumes/mayan
|
||||
sudo chown `whoami` backup.tar.gz
|
||||
|
||||
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.
|
||||
|
||||
|
||||
Restoring from a backup
|
||||
=======================
|
||||
|
||||
Uncompress the backup archive in the original docker volume using::
|
||||
|
||||
sudo tar -xvzf backup.tar.gz -C /
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
Building the image
|
||||
==================
|
||||
|
||||
Clone the repository with::
|
||||
|
||||
git clone https://gitlab.com/mayan-edms/mayan-edms.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.
|
||||
|
||||
|
||||
Customizing the image
|
||||
=====================
|
||||
|
||||
Simple method
|
||||
-------------
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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:
|
||||
https://gitlab.com/mayan-edms/mayan-edms/container_registry
|
||||
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
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
==============
|
||||
Document types
|
||||
==============
|
||||
|
||||
@@ -67,22 +68,3 @@ 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.
|
||||
|
||||
|
||||
Creating document types
|
||||
=======================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create document types" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Create document type`.
|
||||
#. Enter a label to be shown to users when using this document type.
|
||||
#. Optional: Enter a period of time after which documents of this type will be moved to the trash.
|
||||
#. Optional: Select the unit of time for the period after which the document will be moved to the trash.
|
||||
#. Optional: Enter a period of time after which documents moved to the trash will be permanently deleted.
|
||||
#. Optional: Select the unit of time for the period of time after which the documents moved to the trash will be permanently deleted
|
||||
#. Press :guilabel:`Submit`.
|
||||
@@ -1,6 +1,6 @@
|
||||
************
|
||||
============
|
||||
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),
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
==============
|
||||
Index examples
|
||||
--------------
|
||||
==============
|
||||
|
||||
Index of document types
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
=======================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
@@ -56,7 +56,7 @@ of types "Invoice" and "Letter", these will now go into the level "Correspondenc
|
||||
|
||||
|
||||
Index document by department, taken from the first character of the invoice number metadata
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
===========================================================================================
|
||||
|
||||
Requires one index node with the template::
|
||||
|
||||
@@ -66,7 +66,7 @@ Requires one index node with the template::
|
||||
|
||||
|
||||
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
|
||||
@@ -91,7 +91,7 @@ sub level for months.
|
||||
|
||||
|
||||
Index by OCR content
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
====================
|
||||
|
||||
This example indexes documents in a "quarterly report" level if they have the
|
||||
fragment “quarterly report” in the OCR text::
|
||||
@@ -105,21 +105,21 @@ The same applies to text content extracted for the document::
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
Indexes
|
||||
=======
|
||||
===============
|
||||
Index structure
|
||||
===============
|
||||
|
||||
Indexes are an automatic method to hierarchically organize documents in
|
||||
relation to their properties (:doc:`../chapters/metadata`, label, MIME type,
|
||||
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:`../chapters/document_types`.
|
||||
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
|
||||
@@ -75,41 +76,3 @@ that will be generate based on the tree template would be as follows:
|
||||
year_1 -> document_3;
|
||||
|
||||
}
|
||||
|
||||
.. include:: ../chapters/index_examples.rst
|
||||
|
||||
|
||||
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.
|
||||
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.
|
||||
@@ -1,6 +1,6 @@
|
||||
*********
|
||||
=========
|
||||
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
|
||||
@@ -31,6 +31,6 @@ Example::
|
||||
|
||||
For more information check out the
|
||||
:ref:`environment variables <environment_variables>` chapter of the
|
||||
:doc:`../topics/settings` topic.
|
||||
:doc:`../parts/settings` topic.
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
*****************
|
||||
=================
|
||||
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:`../topics/administration`
|
||||
:doc:`../parts/administration`
|
||||
|
||||
Application emails
|
||||
==================
|
||||
@@ -14,8 +14,7 @@ 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. Mailing Profiles are created from the
|
||||
:menuselection:`System --> Setup` menu.
|
||||
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
|
||||
@@ -1,99 +0,0 @@
|
||||
********
|
||||
Metadata
|
||||
********
|
||||
|
||||
Metadata is the name of the attribute of a document. The concept of metadata is
|
||||
divided in two: **metadata types** (size, color, distance) and **metadata values** for
|
||||
those types. Metadata types are defined in the setup menu and associated with
|
||||
document types. Then when a document is uploaded, a value for that metadata
|
||||
can be entered. There are two kinds of metadata type to document type relations:
|
||||
optional and required. When a metadata type is optional for a document type,
|
||||
it can be left blank for a document being uploaded and the upload will still
|
||||
be successful. On the other hand required metadata type must be given a value
|
||||
or it will not be possible to upload the document at hand.
|
||||
|
||||
Examples of metadata type: Invoice number, color, employee id.
|
||||
|
||||
The data entry of metadata types can be set to allow any value to be provided
|
||||
(the default) or a list of possible values can be entered in the ``Lookup``
|
||||
configuration option and users will be presented with a drop down list of options
|
||||
instead of the default text entry box.
|
||||
|
||||
If metadata types are setup to allow any value to be entered a ``validation``
|
||||
option can be chosen to block the entry of invalid data. Metadata types also
|
||||
provide ``parsers`` which will not block the entry of data but are able to
|
||||
interpret and modify the value provided by the user to a conform to a specific
|
||||
format. An example of a provided parser is the date parser which will interpret
|
||||
and correct dates provided by users regardless of the format in which they are
|
||||
entered.
|
||||
|
||||
|
||||
Creating metadata types
|
||||
=======================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new metadata types" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Metadata types` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Create new`.
|
||||
#. Provide a name to reference this metadata type in other parts of the system.
|
||||
#. Enter a label to be shown to users when using this metadata type.
|
||||
#. Optional: Enter a default value for the metadata type.
|
||||
#. Optional: Provide a comma separated list of options to restrict the data entry
|
||||
when using this metadata type.
|
||||
#. Optional: Select a validator and a parser to validate and cleanup the data
|
||||
entry when not using a predetermined list of values.
|
||||
#. Press :guilabel:`Submit`.
|
||||
|
||||
|
||||
Assigning a metadata type to a document type
|
||||
============================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
- The "Edit metadata types" permission is required for this action, globally or
|
||||
via an ACL for a metadata type.
|
||||
- Also the "Edit document type" permission
|
||||
is required, globally or via an ACL for a document type.
|
||||
|
||||
|
||||
This action can be performed in two ways.
|
||||
|
||||
Option 1: Via the metadata type view
|
||||
------------------------------------
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Metadata types` menu.
|
||||
#. Click on the button :guilabel:`Document types` of the metadata type you which
|
||||
to associate.
|
||||
#. From the list of existing document types press either:
|
||||
|
||||
- :guilabel:`None` if this metadata type will not be available for documents
|
||||
of the type.
|
||||
- :guilabel:`Optional` if this metadata type will be available and is
|
||||
optional to provide a value for documents of the type.
|
||||
- :guilabel:`Required` if this metadata type will be available and is
|
||||
required to provide a value for documents of the type.
|
||||
|
||||
#. Press :guilabel:`Save`.
|
||||
|
||||
|
||||
Option 2: Via the document type view
|
||||
------------------------------------
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. Click on the button :guilabel:`Metadata types` of the metadata type you which
|
||||
to associate.
|
||||
#. From the list of existing metadata types press either:
|
||||
|
||||
- :guilabel:`None` if this metadata type will not be available for documents
|
||||
of the type.
|
||||
- :guilabel:`Optional` if this metadata type will be available and is
|
||||
optional to provide a value for documents of the type.
|
||||
- :guilabel:`Required` if this metadata type will be available and is
|
||||
required to provide a value for documents of the type.
|
||||
|
||||
#. Press :guilabel:`Save`.
|
||||
28
docs/chapters/metadata.txt
Normal file
28
docs/chapters/metadata.txt
Normal file
@@ -0,0 +1,28 @@
|
||||
========
|
||||
Metadata
|
||||
========
|
||||
|
||||
Metadata is the name of the attribute of a document. The concept of metadata is
|
||||
divided in two: **metadata types** (size, color, distance) and **metadata values** for
|
||||
those types. Metadata types are defined in the setup menu and associated with
|
||||
document types. Then when a document is uploaded, a value for that metadata
|
||||
can be entered. There are two kinds of metadata type to document type relations:
|
||||
optional and required. When a metadata type is optional for a document type,
|
||||
it can be left blank for a document being uploaded and the upload will still
|
||||
be successful. On the other hand required metadata type must be given a value
|
||||
or it will not be possible to upload the document at hand.
|
||||
|
||||
Examples of metadata type: Invoice number, color, employee id.
|
||||
|
||||
The data entry of metadata types can be set to allow any value to be provided
|
||||
(the default) or a list of possible values can be entered in the ``Lookup``
|
||||
configuration option and users will be presented with a drop down list of options
|
||||
instead of the default text entry box.
|
||||
|
||||
If metadata types are setup to allow any value to be entered a ``validation``
|
||||
option can be chosen to block the entry of invalid data. Metadata types also
|
||||
provide ``parsers`` which will not block the entry of data but are able to
|
||||
interpret and modify the value provided by the user to a conform to a specific
|
||||
format. An example of a provided parser is the date parser which will interpret
|
||||
and correct dates provided by users regardless of the format in which they are
|
||||
entered.
|
||||
@@ -1,31 +0,0 @@
|
||||
**************
|
||||
Object storage
|
||||
**************
|
||||
|
||||
It is possible to use object storage instead of the default filesystem based
|
||||
storage. One such object storage system is Amazon S3 (Simple Storage Service)
|
||||
API compatible object storage. The following steps will configure Mayan EDMS
|
||||
to use a S3 style storage for documents.
|
||||
|
||||
1. Install the django-storages and boto3 Python libraries.
|
||||
|
||||
* For the direct deployment method of installation use::
|
||||
|
||||
pip install django-storages boto3
|
||||
|
||||
|
||||
* or if using the Docker image, add the following the command line that runs the container::
|
||||
|
||||
-e MAYAN_PIP_INSTALLS='django-storages boto3'
|
||||
|
||||
|
||||
2. From the web interface navigate to the :menuselection:`System --> Setup --> Setting --> Documents` menu.
|
||||
3. Locate the **DOCUMENTS_STORAGE_BACKEND** setting, press **Edit** and enter::
|
||||
|
||||
storages.backends.s3boto3.S3Boto3Storage
|
||||
|
||||
4. Save and locate the setting **DOCUMENTS_STORAGE_BACKEND_ARGUMENTS**, press **Edit** and enter::
|
||||
|
||||
'{access_key: <your S3 access key>, secret_key: <your S3 secret key>, bucket_name: <S3 bucket name>}'
|
||||
|
||||
5. Save and restart your Mayan EDMS installation for the setting to take effect.
|
||||
@@ -1,10 +1,10 @@
|
||||
***********
|
||||
===========
|
||||
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 crate a wrapper that subclasses the
|
||||
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``
|
||||
@@ -1,6 +1,6 @@
|
||||
**************
|
||||
==============
|
||||
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
|
||||
@@ -27,7 +27,7 @@ Example::
|
||||
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:`../topics/settings` topic.
|
||||
:doc:`../parts/settings` topic.
|
||||
|
||||
To test the email settings use the management command ``sendtestemail``.
|
||||
Example::
|
||||
@@ -1,6 +1,6 @@
|
||||
***********
|
||||
===========
|
||||
Permissions
|
||||
***********
|
||||
===========
|
||||
|
||||
Mayan EDMS provides very fine control over which actions users can
|
||||
perform. Action control works by allowing ``roles``, that are composed of
|
||||
@@ -1,70 +0,0 @@
|
||||
************
|
||||
Quick labels
|
||||
************
|
||||
|
||||
Quick labels are predetermined filenames that allow the quick renaming of
|
||||
documents as they are uploaded or after they have been uploaded.
|
||||
|
||||
Quick labels are added and associated to a document type.
|
||||
|
||||
Example of quick label: Invoice, Receipt from X store, Purchase order.
|
||||
|
||||
It is possible to preserve the file extension when using quick labels.
|
||||
Extensions are required for some operating system to be able to detect the
|
||||
correct file type to access the content.
|
||||
|
||||
For example if a document file is named "file0001.pdf" and the quick label
|
||||
"Receipt from X store" is applied, the resulting document label will be
|
||||
"Receipt from X store.pdf".
|
||||
|
||||
|
||||
Creating quick labels
|
||||
=====================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Edit document types" permission is required for this action, either
|
||||
globally or via an ACL for a document type.
|
||||
|
||||
|
||||
Since quick labels are associated with document types, creating quick labels
|
||||
must be done from the document type view.
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. In the document type list, click on the :guilabel:`Quick labels` button of
|
||||
the document type for which you wish to create a quick label.
|
||||
#. In the view titled "Quick labels for document type: <your document type>",
|
||||
from the :guilabel:`Actions` dropdown select :guilabel:`Add quick label to document type`.
|
||||
#. At the quick label creation form enter the desired label and press :guilabel:`Save`.
|
||||
|
||||
|
||||
Using quick labels during upload
|
||||
================================
|
||||
|
||||
#. Use the new document upload wizard from :menuselection:`Documents --> New document`.
|
||||
#. Select a document type and navigate to the penultimate step, where you have
|
||||
the option to drag and drop files to upload.
|
||||
#. Select a an option from the :guilabel:`Quick document rename` dropdown.
|
||||
#. Optionally select the :guilabel:`Preserve extension` checkbox to keep the file
|
||||
extension.
|
||||
#. Upload your documents.
|
||||
|
||||
|
||||
Using quick labels for existing documents
|
||||
=========================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Edit document properties" permission is required for this action, either
|
||||
globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the document preview view of the document to rename. Make sure
|
||||
quick labels for the document type of the document select have been created.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Edit Properties`.
|
||||
#. Select a an option from the :guilabel:`Quick document rename` dropdown.
|
||||
#. Optionally select the :guilabel:`Preserve extension` checkbox to keep the file
|
||||
extension.
|
||||
#. Press :guilabel:`Save` to rename the document.
|
||||
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".
|
||||
@@ -1,6 +1,6 @@
|
||||
***
|
||||
API
|
||||
***
|
||||
========
|
||||
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.
|
||||
@@ -8,7 +8,7 @@ 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
|
||||
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
|
||||
@@ -57,7 +57,7 @@ Get a list of document types::
|
||||
|
||||
Upload a new document::
|
||||
|
||||
with open('test_document.pdf', mode='rb') as
|
||||
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'',
|
||||
@@ -1,155 +0,0 @@
|
||||
**********
|
||||
Scaling up
|
||||
**********
|
||||
|
||||
The default installation method fits most use cases. If you use case requires
|
||||
more speed or capacity here are some suggestion that can help you improve the
|
||||
performance of your installation.
|
||||
|
||||
|
||||
Change the database manager
|
||||
===========================
|
||||
|
||||
Use PostgreSQL or MySQL as the database manager.
|
||||
Tweak the memory setting of the database manager to increase memory allocation.
|
||||
More PostgreSQL specific examples are available in their wiki page:
|
||||
https://wiki.postgresql.org/wiki/Performance_Optimization
|
||||
|
||||
|
||||
Increase the number of Gunicorn workers
|
||||
=======================================
|
||||
|
||||
The Gunicorn workers process HTTP requests and affect the speed at which the
|
||||
website responds.
|
||||
|
||||
If you are using the Docker image, change the value of the
|
||||
``MAYAN_GUNICORN_WORKERS`` environment variable (check the Docker image chapter:
|
||||
:ref:`docker_environment_variables`). Normally this variable defaults to 2.
|
||||
Increase this number to match the number of CPU cores + 1.
|
||||
|
||||
If you are using the direct deployment methods, change the line that reads::
|
||||
|
||||
command = /opt/mayan-edms/bin/gunicorn -w 2 mayan.wsgi --max-requests 500 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000 --timeout 120
|
||||
|
||||
And increase the value of the ``-w 2`` argument. This line is found in the
|
||||
``[program:mayan-gunicorn]`` section of the supervisor configuration file.
|
||||
|
||||
|
||||
Background task processing
|
||||
==========================
|
||||
|
||||
The Celery workers are system processes that take care of the background
|
||||
tasks requested by the frontend interactions like document image rendering
|
||||
and periodic tasks like OCR. There are several dozen tasks defined in the code.
|
||||
These tasks are divided into queues based on the app of the relationship
|
||||
between the tasks. The queues by default are divided into three groups
|
||||
based on the speed at which they need to be processed. The document page
|
||||
image rendering for example is categorized as a high volume, short duration
|
||||
task. The OCR is a high volume, long duration task. Email checking is a
|
||||
low volume, medium duration tasks. It is not advisable to have the same
|
||||
worker processing OCR to process image rendering too. If the worker is
|
||||
processing several OCR tasks it will not be able to provide fast images
|
||||
when an user is browsing the user interface. This is why by default the
|
||||
queues are split into 3 workers: fast, medium, and slow. Each worker will handle
|
||||
queues based on the latency required by each queue group.
|
||||
|
||||
|
||||
Optimizations
|
||||
-------------
|
||||
|
||||
* Increase the number of workers and redistribute the queues among them
|
||||
(only possible with direct deployments).
|
||||
* Launch more workers to service a queue. For example for faster document
|
||||
image generation launch 2 workers to process the converter queue only
|
||||
possible with direct deployments).
|
||||
* By default each worker process uses 1 thread. You can increase the thread
|
||||
count of each worker process with the Docker environment options:
|
||||
|
||||
* ``MAYAN_WORKER_FAST_CONCURRENCY``
|
||||
* ``MAYAN_WORKER_MEDIUM_CONCURRENCY``
|
||||
* ``MAYAN_WORKER_SLOW_CONCURRENCY``
|
||||
|
||||
* If using direct deployment, increase the value of the ``--concurrency=1``
|
||||
argument of each worker in the supervisor file. You can also remove this
|
||||
argument and let the Celery algorithm choose the number of threads to
|
||||
launch. Usually this defaults to the number of CPU cores + 1.
|
||||
|
||||
|
||||
Change the message broker
|
||||
=========================
|
||||
Messages are the method of communication between front end interactive code
|
||||
and background tasks. In this regard messages can be thought as homologous
|
||||
to tasks requests. Improving how many messages can be sent, stored and
|
||||
sorted will impact the number of tasks the system can handle. To save on
|
||||
memory, the basic deployment method and the Docker image default to using
|
||||
Redis as a message broker. To increase capacity and reduce volatility of
|
||||
messages (pending tasks are not lost during shutdown) use RabbitMQ to
|
||||
shuffle messages.
|
||||
|
||||
For direct installs refer to the :ref:`deployment_advanced` documentation
|
||||
section for the required changes.
|
||||
|
||||
For the Docker image, launch a separate RabbitMQ container
|
||||
(https://hub.docker.com/_/rabbitmq/)::
|
||||
|
||||
docker run -d --name mayan-edms-rabbitmq -e RABBITMQ_DEFAULT_USER=mayan -e RABBITMQ_DEFAULT_PASS=mayanrabbitmqpassword -e RABBITMQ_DEFAULT_VHOST=mayan rabbitmq:3
|
||||
|
||||
Pass the MAYAN_CELERY_BROKER_URL environment variable (https://kombu.readthedocs.io/en/latest/userguide/connections.html#connection-urls)
|
||||
to the Mayan EDMS container so that it uses the RabbitMQ container the
|
||||
message broker::
|
||||
|
||||
-e MAYAN_CELERY_BROKER_URL="amqp://mayan:mayanrabbitmqpassword@localhost:5672/mayan",
|
||||
|
||||
When tasks finish, they leave behind a return status or the result of a
|
||||
calculation, these are stored for a while so that whoever requested the
|
||||
background task, is able retrieve the result. These results are stored in the
|
||||
result storage. By default a Redis server is launched inside the Mayan EDMS
|
||||
container. You can launch a separate Docker Redis container and tell the Mayan
|
||||
EDMS container to use this via the ``MAYAN_CELERY_RESULT_BACKEND`` environment
|
||||
variable. The format of this variable is explained here: http://docs.celeryproject.org/en/3.1/configuration.html#celery-result-backend
|
||||
|
||||
|
||||
Deployment type
|
||||
===============
|
||||
|
||||
Docker provides a faster deployment and the overhead is not high on modern
|
||||
systems. It is however memory and CPU limited by default and you need to
|
||||
increase this limits. The settings to change the container resource limits
|
||||
are here: https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory
|
||||
|
||||
For the best performance possible use the advanced deployment method on a
|
||||
host dedicated to serving only Mayan EDMS.
|
||||
|
||||
|
||||
Storage
|
||||
=======
|
||||
|
||||
For best input and output speed use a block based local filesystem on an
|
||||
SSD drive for the ``/media`` sub folder. The location of the ``/media`` folder
|
||||
will be specified by the ``MEDIA_ROOT`` setting.
|
||||
|
||||
If capacity is your bottom line, switch to an
|
||||
:doc:`object storage <../chapters/object_storage>` system.
|
||||
|
||||
|
||||
Use additional hosts
|
||||
====================
|
||||
|
||||
When one host is not enough you can use multiple hosts and share the load.
|
||||
Make sure that all hosts share the ``/media`` folder as specified by the
|
||||
``MEDIA_ROOT`` setting, also the database, the broker, and the result storage.
|
||||
One setting that needs to be changed in this configuration is the lock
|
||||
manager backend.
|
||||
|
||||
Resource locking is a technique to avoid two processes or tasks to modify
|
||||
the same resource at the same time causing a race condition. Mayan EDMS uses
|
||||
its own lock manager. By default the lock manager with use a simple file
|
||||
based lock backend ideal for single host installations. For multiple hosts
|
||||
installation the database backend must be used in other to coordinate the
|
||||
resource locks between the different hosts over a share data medium. This is
|
||||
accomplished by modifying the environment variable ``LOCK_MANAGER_BACKEND`` in
|
||||
both the direct deployment or the Docker image. Use the value
|
||||
``lock_manager.backends.model_lock.ModelLock`` to switch to the database
|
||||
resource lock backend. If you can also write your own lock manager backend
|
||||
for other data sharing mediums with better performance than a relational
|
||||
database like Redis, Memcached, Zoo Keeper.
|
||||
@@ -1,6 +1,6 @@
|
||||
********
|
||||
========
|
||||
Settings
|
||||
********
|
||||
========
|
||||
|
||||
Mayan EDMS can be configure via environment variables or by setting files.
|
||||
|
||||
@@ -14,7 +14,7 @@ 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),
|
||||
the number of documents displayed per page (``COMMON_PAGINATE_BY``, by default 40),
|
||||
use::
|
||||
|
||||
export MAYAN_COMMON_PAGINATE_BY=10
|
||||
@@ -32,8 +32,8 @@ 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::
|
||||
``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
|
||||
@@ -58,16 +58,18 @@ to be valid. You can revert manually by copy the file or by using the
|
||||
Via Python settings files
|
||||
=========================
|
||||
|
||||
Another way to configure Mayan EDMS is via Python-style, 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:
|
||||
``/usr/share/mayan-edms/mayan/media/mayan_settings``.
|
||||
``|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` instructions provided in this
|
||||
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``.
|
||||
|
||||
@@ -80,7 +82,7 @@ Create a file with any valid name and a ``.py`` extension in the
|
||||
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),
|
||||
per page (``COMMON_PAGINATE_BY``, by default 40),
|
||||
use::
|
||||
|
||||
COMMON_PAGINATE_BY=10
|
||||
@@ -100,13 +102,24 @@ 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::
|
||||
|
||||
python manage.py runserver --settings=mayan.media.mayan_settings.mysettings
|
||||
|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
|
||||
|
||||
For the :doc:`../chapters/docker` installation method, the full import path will be
|
||||
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::
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
*******************
|
||||
===================
|
||||
Document signatures
|
||||
*******************
|
||||
===================
|
||||
|
||||
Mayan EDMS supports two types of document signatures: embedded and
|
||||
detached signatures. When a document with an embedded signature is
|
||||
@@ -1,3 +1,4 @@
|
||||
===========
|
||||
Smart links
|
||||
===========
|
||||
|
||||
@@ -6,7 +7,7 @@ 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`.
|
||||
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
|
||||
@@ -1,3 +1,4 @@
|
||||
=======
|
||||
Sources
|
||||
=======
|
||||
|
||||
@@ -62,19 +63,3 @@ manager system.
|
||||
|
||||
If you deployed a Mayan EDMS Docker container and want to use watched folders
|
||||
or staging folder, refer to the Docker chapter :ref:`docker-accessing-outside-data`.
|
||||
|
||||
|
||||
Creating new sources
|
||||
====================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new document sources" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Sources` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select the new type of source to create.
|
||||
#. Each source type will have different fields to customize its behavior. Enter
|
||||
the required information in each field based on the help text provided.
|
||||
#. Press :guilabel:`Save`.
|
||||
@@ -1,46 +0,0 @@
|
||||
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.
|
||||
|
||||
To view, add, or remove tags from a specific document, go to the document view
|
||||
and click on the **Tags** tab. This view will show the current tags of a
|
||||
document. The **Actions** menu will now show two new options: one to attach
|
||||
more tags to the document and another to remove tags from the document.
|
||||
|
||||
It is also possible to tag documents in bulk by selecting several documents
|
||||
from any view that displays a list documents and selecting the **Attach tag**
|
||||
or **Remove tags** from the dropdown menu.
|
||||
|
||||
|
||||
Creating tags
|
||||
=============
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new tags" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`Tags --> Create` menu.
|
||||
#. Enter a label to identify the tag.
|
||||
#. Select a color for the tag.
|
||||
#. Press :guilabel:`Submit`.
|
||||
|
||||
|
||||
View all tags
|
||||
=============
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "View tags" permission is required for this action, globally or via an
|
||||
ACL for a tag.
|
||||
|
||||
#. Go to the :menuselection:`Tags --> All` menu.
|
||||
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.
|
||||
@@ -1,6 +1,6 @@
|
||||
***************
|
||||
===============
|
||||
Transformations
|
||||
***************
|
||||
===============
|
||||
|
||||
Transformations are persistent manipulations to the previews of the stored
|
||||
documents. For example: a scanning equipment may only produce landscape PDFs.
|
||||
@@ -17,5 +17,5 @@ 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 not destructive and do not physically modify the document
|
||||
Transformations are non destructive and do not physically modify the document
|
||||
file, they just modify the document's graphical representation.
|
||||
@@ -1,84 +0,0 @@
|
||||
*************
|
||||
Upload wizard
|
||||
*************
|
||||
|
||||
The steps needed to upgrade a document using form-tools' ``SessionWizard``
|
||||
were hardcoded in the ``source`` app. This made it very difficult to add or remove
|
||||
wizard steps.
|
||||
|
||||
The steps of the wizard are now defined by a new class called
|
||||
``sources.wizard.WizardStep``. The existing steps to select a document type,
|
||||
enter metadata and tag the document, have been converted to function as
|
||||
``WizardSteps`` subclasses. The converted steps now live in
|
||||
|
||||
``sources.wizards.WizardStepDocumentType``, ``tag.wizard_steps.WizardStepTags``,
|
||||
and ``metadata.wizard_steps.WizardStepMetadata``.
|
||||
|
||||
The steps need to define the following methods:
|
||||
|
||||
- ``done``: This method is execute when the wizard finished the last step
|
||||
an enter the step where the actual file are uploaded. This steps is used
|
||||
to encode form data into the URL query string that will be passed to the
|
||||
document upload view for each file uploaded.
|
||||
|
||||
- ``condition``: This method is used to display the step conditionally.
|
||||
If this method return True it will be displayed during the upload wizard
|
||||
execution. To skip the step, return False or None.
|
||||
|
||||
- ``get_form_initial``: This method is used to return the initial data
|
||||
for the step form. Use this method to set up initial values for the step's
|
||||
form fields.
|
||||
|
||||
- ``step_post_upload_process``: This method will be executed once the
|
||||
document finishes uploading. Use this method to process the information
|
||||
encoded in the URL querystring by the step's `done`` method.
|
||||
|
||||
Once the ``WizardStep`` subclass is defined, it needs to be registered. This
|
||||
is done by calling the ``.register`` method of the ``WizardStep`` class with
|
||||
the subclass as the argument. Example::
|
||||
|
||||
WizardStep.register(WizardStepMetadata)
|
||||
|
||||
This statement must be located after the subclass definition. Finally,
|
||||
the module defining the wizard step must be imported so that it is loaded
|
||||
with the rest of the code and enabled. The best place to do this is in the
|
||||
``.ready`` method of the apps' ``apps.py`` module. Example::
|
||||
|
||||
class TagsApp(MayanAppConfig):
|
||||
has_rest_api = True
|
||||
has_tests = True
|
||||
name = 'tags'
|
||||
verbose_name = _('Tags')
|
||||
|
||||
def ready(self):
|
||||
super(TagsApp, self).ready()
|
||||
from actstream import registry
|
||||
|
||||
from .wizard_steps import WizardStepTags # NOQA
|
||||
|
||||
The ``WizardStep`` class also allows for unregistering existing steps. This
|
||||
is accomplished by calling the ``.deregister`` method of the ``WizardStep``
|
||||
class and passing the subclass as the argument. This method should
|
||||
also be called inside the ``.ready`` method of an apps' ``apps.py``
|
||||
module. Example::
|
||||
|
||||
|
||||
class TagsApp(MayanAppConfig):
|
||||
has_rest_api = True
|
||||
has_tests = True
|
||||
name = 'tags'
|
||||
verbose_name = _('Tags')
|
||||
|
||||
def ready(self):
|
||||
super(TagsApp, self).ready()
|
||||
from actstream import registry
|
||||
|
||||
from metadata.wizard_steps import WizardStepMetadata # NOQA
|
||||
from sources.wizards import WizardStep # NOQA
|
||||
from .wizard_steps import WizardStepTags # NOQA
|
||||
|
||||
WizardStep.deregister(WizardStepTags)
|
||||
|
||||
|
||||
This will cause the tags assignment step to not be assigned to the upload
|
||||
wizard anymore.
|
||||
@@ -1,6 +1,6 @@
|
||||
*******************
|
||||
===================
|
||||
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
|
||||
@@ -46,35 +46,3 @@ There is no limit to the number of versions a document can have.
|
||||
|
||||
By default, the last version will be showed when working with the document
|
||||
but any of the versions can be inspected and viewed.
|
||||
|
||||
|
||||
View a document version list
|
||||
============================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "View documents' versions list" permission is required for this action,
|
||||
either globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the select document's preview view.
|
||||
#. Click on the sibebar's :guilabel:`Versions` button.
|
||||
|
||||
|
||||
Uploading a new document version
|
||||
================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new document versions" permission is required for this action,
|
||||
either globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the select document's versions list view.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Upload new version`.
|
||||
#. Optionally type a comment explaining the changes in the new version.
|
||||
#. Press the :guilabel:`Browse` button and select a new file.
|
||||
#. Press :guilabel:`Save` upload the new version.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
*********
|
||||
=========
|
||||
Workflows
|
||||
*********
|
||||
=========
|
||||
|
||||
Introduction
|
||||
============
|
||||
155
docs/conf.py
155
docs/conf.py
@@ -13,39 +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 = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.intersphinx']
|
||||
extensions = [
|
||||
'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag', 'sphinxcontrib.spelling'
|
||||
'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'
|
||||
@@ -69,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
|
||||
@@ -99,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,
|
||||
@@ -139,89 +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_sourcelink = False
|
||||
|
||||
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 --------------------------------------------
|
||||
@@ -233,8 +245,6 @@ man_pages = [
|
||||
[mayan.__author__], 1)
|
||||
]
|
||||
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
|
||||
# -- External links --
|
||||
extlinks = {
|
||||
'django-docs': (
|
||||
@@ -242,13 +252,60 @@ extlinks = {
|
||||
mayan.__django_version__
|
||||
), 'Django documentation section: '
|
||||
),
|
||||
'forum-topic': (
|
||||
'https://forum.mayan-edms.com/viewtopic.php?t=%s', 'Forum topic #'
|
||||
),
|
||||
'github-issue': (
|
||||
'https://github.com/mayan-edms/mayan-edms/issues/%s', 'GitHub issue #'
|
||||
),
|
||||
'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 #'
|
||||
)
|
||||
}
|
||||
|
||||
# -- Options for sitemap extension ---------------------------------------------
|
||||
|
||||
html_baseurl = 'https://docs.mayan-edms.com/'
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_stylesheet('css/custom.css')
|
||||
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])
|
||||
|
||||
@@ -17,28 +17,32 @@ repository for electronic documents.
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
topics/features
|
||||
topics/installation
|
||||
parts/features
|
||||
parts/installation
|
||||
releases/index
|
||||
topics/getting_started
|
||||
topics/adding_documents
|
||||
topics/access_control
|
||||
topics/categorization
|
||||
topics/collaboration
|
||||
topics/settings
|
||||
topics/storage
|
||||
topics/integration
|
||||
topics/docker
|
||||
topics/advanced
|
||||
topics/administration
|
||||
topics/troubleshooting
|
||||
topics/development
|
||||
topics/faq
|
||||
topics/license
|
||||
topics/contact
|
||||
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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user