Compare commits
558 Commits
hotfix
...
features/t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
adf47646bf | ||
|
|
4d7c0552bd | ||
|
|
575e42357a | ||
|
|
487c250f3e | ||
|
|
0ae214f2fd | ||
|
|
037b942c4a | ||
|
|
dcbf777429 | ||
|
|
0c5a0b54c1 | ||
|
|
0f5f8c0dd1 | ||
|
|
2d875ff044 | ||
|
|
a77708ebe6 | ||
|
|
440822896a | ||
|
|
6f4802ac6a | ||
|
|
c21a9afcfa | ||
|
|
0494fa9e6a | ||
|
|
e09bd48d65 | ||
|
|
97887c4e9c | ||
|
|
90e884e502 | ||
|
|
ea7b4e46ac | ||
|
|
e0d74d54b1 | ||
|
|
fbd2b43b5e | ||
|
|
03e59ed964 | ||
|
|
c3b1c4e173 | ||
|
|
43260b87c5 | ||
|
|
5b78a7c60c | ||
|
|
2e5ee2740a | ||
|
|
85b8d281cc | ||
|
|
69d33bef7c | ||
|
|
3f86dfc902 | ||
|
|
111250fd99 | ||
|
|
f17d13d68f | ||
|
|
1f5c81eaf5 | ||
|
|
b4dafb20ad | ||
|
|
70dab1fd30 | ||
|
|
bb3e010a93 | ||
|
|
4b9043b882 | ||
|
|
727fe78d8b | ||
|
|
7650ef17c0 | ||
|
|
9558c5e6dc | ||
|
|
cb1e90e19b | ||
|
|
b5823358cb | ||
|
|
dcc8b8b174 | ||
|
|
891861eaf5 | ||
|
|
8d0f14a40c | ||
|
|
f53a3f7959 | ||
|
|
1d5972da3b | ||
|
|
8fe90ea7f1 | ||
|
|
037c2b6118 | ||
|
|
06307ff29c | ||
|
|
0c37685302 | ||
|
|
4d52dbde39 | ||
|
|
9836ca3ef3 | ||
|
|
538e0c6f3b | ||
|
|
0ced976b0c | ||
|
|
7f43a8d5a3 | ||
|
|
0ae960d96c | ||
|
|
2e80c6a00b | ||
|
|
590c76bf64 | ||
|
|
41f86b35f2 | ||
|
|
d70a1ef079 | ||
|
|
fa678b09bc | ||
|
|
fe3d2e85c2 | ||
|
|
2ce0528712 | ||
|
|
e091c07ed6 | ||
|
|
f66328139e | ||
|
|
505e0bd68b | ||
|
|
80ebe4ecce | ||
|
|
0f9c226a1e | ||
|
|
6789ecf1bb | ||
|
|
a008607d40 | ||
|
|
eb32820864 | ||
|
|
3e48a422b7 | ||
|
|
f6c5a4f9cf | ||
|
|
f160de4381 | ||
|
|
0d6462831a | ||
|
|
749208b5f8 | ||
|
|
72ade29f77 | ||
|
|
325fe3225a | ||
|
|
30f3a0563c | ||
|
|
62fdec575f | ||
|
|
7407c67347 | ||
|
|
cbfab25c94 | ||
|
|
2ae2dfd687 | ||
|
|
e5c92487de | ||
|
|
8c96567094 | ||
|
|
d3041eb2d5 | ||
|
|
047f48d39f | ||
|
|
34d7ff6e01 | ||
|
|
c7474cae1b | ||
|
|
74f333d16c | ||
|
|
6f6ddfbc82 | ||
|
|
2fcb36c568 | ||
|
|
db5511127d | ||
|
|
807dd849c5 | ||
|
|
602774a390 | ||
|
|
0b044f1e21 | ||
|
|
0440e1a838 | ||
|
|
eac9940207 | ||
|
|
65aa6a8f38 | ||
|
|
39af4f9f8a | ||
|
|
33929576fc | ||
|
|
18b42a03c8 | ||
|
|
d1f6a6b059 | ||
|
|
4252e37748 | ||
|
|
6a2e039a83 | ||
|
|
d4a7592467 | ||
|
|
9edb9fff0a | ||
|
|
07e7b55686 | ||
|
|
268fce138d | ||
|
|
916ba688b1 | ||
|
|
4baeb6ce7e | ||
|
|
fbe0e14b82 | ||
|
|
410e6a4a55 | ||
|
|
38a34cc98c | ||
|
|
90393e043e | ||
|
|
9e3e0d9e64 | ||
|
|
818cf97d5b | ||
|
|
f649a77b2f | ||
|
|
2ee2b2f5e0 | ||
|
|
5619a6014e | ||
|
|
4851c9f6d7 | ||
|
|
f002d8b38e | ||
|
|
484f09db75 | ||
|
|
5b45769423 | ||
|
|
54c007b149 | ||
|
|
3b518998c9 | ||
|
|
0a21748b0c | ||
|
|
edd6f4eb76 | ||
|
|
f8258c078a | ||
|
|
b2cefa79a5 | ||
|
|
ab5028887c | ||
|
|
4a03e2a47f | ||
|
|
c9809becba | ||
|
|
a1fa6aadfb | ||
|
|
c3991c3798 | ||
|
|
66ac9eebee | ||
|
|
4f9c2314fa | ||
|
|
b2ddf0c6bb | ||
|
|
ebc7886c81 | ||
|
|
fbbc6bace9 | ||
|
|
811c8075ca | ||
|
|
de7a7448ae | ||
|
|
7d725f8170 | ||
|
|
8e32c5adae | ||
|
|
7339eb2a09 | ||
|
|
e5daea674f | ||
|
|
170434e71b | ||
|
|
54acf0f254 | ||
|
|
76f320faf5 | ||
|
|
21e1a3c4ad | ||
|
|
0a9c01cb0f | ||
|
|
a5ab9f3ea6 | ||
|
|
8586bd1909 | ||
|
|
62f49e390a | ||
|
|
dfb368e6dc | ||
|
|
7971b081a9 | ||
|
|
290dc847c4 | ||
|
|
1982c9920f | ||
|
|
1ae1804f5d | ||
|
|
e68928901e | ||
|
|
febc7cf4f7 | ||
|
|
ab97c95bab | ||
|
|
b28bdf5475 | ||
|
|
f041ae9966 | ||
|
|
2e632f658d | ||
|
|
6ef9b04d57 | ||
|
|
b687a7f519 | ||
|
|
ebf8cbdd62 | ||
|
|
d338da5491 | ||
|
|
2e2797bba5 | ||
|
|
2b43aa8d40 | ||
|
|
c59f35225c | ||
|
|
3a623ee416 | ||
|
|
4e5c513529 | ||
|
|
8b073c3151 | ||
|
|
60c0c131ae | ||
|
|
f561eb2f57 | ||
|
|
a0b4d38d19 | ||
|
|
a69e74ac90 | ||
|
|
d41fe1b701 | ||
|
|
2f998ab4ce | ||
|
|
92e12f3ec5 | ||
|
|
78b0abf50c | ||
|
|
d003818cae | ||
|
|
98157b7083 | ||
|
|
d4130cd393 | ||
|
|
f3a849c031 | ||
|
|
a38426d823 | ||
|
|
501acbfb0f | ||
|
|
082981e25f | ||
|
|
03f128ff23 | ||
|
|
f76b9e4f3f | ||
|
|
1acc352801 | ||
|
|
17030472f1 | ||
|
|
c7e9a4dc99 | ||
|
|
0d53e74238 | ||
|
|
4617afafb2 | ||
|
|
2d819e64c9 | ||
|
|
545366a477 | ||
|
|
74ec939779 | ||
|
|
aa94247c3d | ||
|
|
c3594651d2 | ||
|
|
578c1b2f07 | ||
|
|
7cf8cd2f28 | ||
|
|
f6696771f9 | ||
|
|
eb79ebf6bb | ||
|
|
e89367f827 | ||
|
|
40035ea39a | ||
|
|
8aa97c7fd7 | ||
|
|
45ca7ea480 | ||
|
|
bbf3ede2e6 | ||
|
|
c1612c8182 | ||
|
|
76b75af1c2 | ||
|
|
680a7b6ae1 | ||
|
|
f73179a600 | ||
|
|
cbd51c5f26 | ||
|
|
fffcf4d3da | ||
|
|
72cdfe58c5 | ||
|
|
f55979b1a6 | ||
|
|
f5aaff9ab1 | ||
|
|
e6ccfb4b59 | ||
|
|
f6afec031d | ||
|
|
33a2ca97ec | ||
|
|
7b69c2f76e | ||
|
|
6cc23fbfd0 | ||
|
|
648fcc32a9 | ||
|
|
de581cde5f | ||
|
|
1beb44d85d | ||
|
|
e5c1aa5606 | ||
|
|
0b68463ed5 | ||
|
|
d533e48f46 | ||
|
|
8e5b60e1c0 | ||
|
|
28114264c1 | ||
|
|
6330e40036 | ||
|
|
f69fcbcc82 | ||
|
|
5e4518211f | ||
|
|
ddbb0d496a | ||
|
|
e1e2454e2a | ||
|
|
264e90a7d7 | ||
|
|
4507f75711 | ||
|
|
a0d2000419 | ||
|
|
ebc68d3c36 | ||
|
|
7a4a4818fe | ||
|
|
b6e7a462b0 | ||
|
|
0d6409512a | ||
|
|
988b4dcb37 | ||
|
|
9e2891216b | ||
|
|
0e6f34d0ee | ||
|
|
00d4406b1f | ||
|
|
4a7540f8b2 | ||
|
|
95a1df8072 | ||
|
|
7181852c2d | ||
|
|
547ffe0e0d | ||
|
|
5e2a1e997b | ||
|
|
ca3a48f92d | ||
|
|
251b4bac40 | ||
|
|
ce70701b7e | ||
|
|
3c0316dae6 | ||
|
|
030b7d5d91 | ||
|
|
99b180f269 | ||
|
|
c9b5d2794e | ||
|
|
d7db8468ac | ||
|
|
3d240a7f42 | ||
|
|
9c92b9a59e | ||
|
|
b67bfa8ec4 | ||
|
|
8e731d6280 | ||
|
|
d271f1503d | ||
|
|
5f89d228dc | ||
|
|
73546bd99f | ||
|
|
8320ca814c | ||
|
|
48a7a25212 | ||
|
|
a3ea854e73 | ||
|
|
bd9c75cdaa | ||
|
|
ea3b513ae3 | ||
|
|
11e13cea1d | ||
|
|
3faefd653c | ||
|
|
80a9b9ef9d | ||
|
|
8084b59e6e | ||
|
|
8b2f5eaf69 | ||
|
|
98e51079a3 | ||
|
|
a2e718361e | ||
|
|
e042c5275b | ||
|
|
b4227a608b | ||
|
|
fda0dd4eaf | ||
|
|
66d5016407 | ||
|
|
77d897ab1f | ||
|
|
68a4b72c37 | ||
|
|
8b447a7050 | ||
|
|
e36eb5421d | ||
|
|
d0a452d838 | ||
|
|
825af3152f | ||
|
|
efff750f06 | ||
|
|
ae595dd359 | ||
|
|
136434c973 | ||
|
|
b1e464f52f | ||
|
|
6a8b062be7 | ||
|
|
2e670254e5 | ||
|
|
d2ab2ec91f | ||
|
|
cfe623e093 | ||
|
|
aee3645c7a | ||
|
|
bd1e8d9e31 | ||
|
|
713e644599 | ||
|
|
a544924c08 | ||
|
|
ae8a444e42 | ||
|
|
e01017ffe5 | ||
|
|
85deaf3327 | ||
|
|
f057d7f81f | ||
|
|
e916e73ead | ||
|
|
5c07c61b69 | ||
|
|
395c360784 | ||
|
|
959cdc56e5 | ||
|
|
7a4c9f3ad2 | ||
|
|
5a736d83bc | ||
|
|
33056dec04 | ||
|
|
dda0f0d2af | ||
|
|
8374a66011 | ||
|
|
873055c4d5 | ||
|
|
4963a9689f | ||
|
|
1a91640047 | ||
|
|
2e9b5454a7 | ||
|
|
6069c67342 | ||
|
|
95123e0078 | ||
|
|
8bbd83ea76 | ||
|
|
4f92bde7d7 | ||
|
|
041464fc1c | ||
|
|
086a1e5168 | ||
|
|
32cf0a0595 | ||
|
|
e5aa4553be | ||
|
|
dcde4b1968 | ||
|
|
84c88f9173 | ||
|
|
799d47054e | ||
|
|
3fa08debe9 | ||
|
|
cd5bc8ba4b | ||
|
|
89bc78bd55 | ||
|
|
ebaa18f552 | ||
|
|
e80f602974 | ||
|
|
cd24eef107 | ||
|
|
e6ad202ee9 | ||
|
|
dd81d8e237 | ||
|
|
6e91ebe5f4 | ||
|
|
f9866e846a | ||
|
|
fba0c40bef | ||
|
|
74c97314d7 | ||
|
|
20acc24c7f | ||
|
|
1c5681c79d | ||
|
|
4b4629ce2b | ||
|
|
fb1f5dbfe3 | ||
|
|
510cdf894c | ||
|
|
2f8cd26d0f | ||
|
|
1a71e02aab | ||
|
|
b3b92e8cda | ||
|
|
5574aaec9e | ||
|
|
3f9421fc75 | ||
|
|
2aadb203eb | ||
|
|
f5ec2e9b22 | ||
|
|
46d0e5562b | ||
|
|
52f734ee9f | ||
|
|
a556f2a1ba | ||
|
|
fa076df89e | ||
|
|
2330bb9da2 | ||
|
|
c2d287c262 | ||
|
|
fcfadb0caa | ||
|
|
575b2bc61c | ||
|
|
21c1dc36d8 | ||
|
|
5cde7de29b | ||
|
|
4d99590dad | ||
|
|
296c580a5e | ||
|
|
2619777d41 | ||
|
|
a5f3937228 | ||
|
|
2e8e4588c0 | ||
|
|
120896001f | ||
|
|
9a706ac09f | ||
|
|
a97c2ec662 | ||
|
|
6ad306b3cf | ||
|
|
b766f85995 | ||
|
|
25ad5c1420 | ||
|
|
a1c733807a | ||
|
|
720115e122 | ||
|
|
e75b5ea2ff | ||
|
|
2300ab52de | ||
|
|
d790efdef5 | ||
|
|
47a8355c79 | ||
|
|
d297d734d2 | ||
|
|
3789d5cfcf | ||
|
|
87b0be65d4 | ||
|
|
ff5d35832a | ||
|
|
4ffd25c570 | ||
|
|
cd00c6abf0 | ||
|
|
c1d2c8baf3 | ||
|
|
0dbb6cc6ea | ||
|
|
6f57d3c650 | ||
|
|
d48665c595 | ||
|
|
b44e4141a4 | ||
|
|
41c1326498 | ||
|
|
3d8cf3e235 | ||
|
|
ddf96120de | ||
|
|
a6d474eaa5 | ||
|
|
9f723c95ac | ||
|
|
4b3d94017a | ||
|
|
48249b977d | ||
|
|
26792d3c5a | ||
|
|
042745e0ca | ||
|
|
1a79b4192e | ||
|
|
fddd8a56c2 | ||
|
|
4fed1111f4 | ||
|
|
e609e89e0e | ||
|
|
3043f22de8 | ||
|
|
1265c16161 | ||
|
|
0865975f2e | ||
|
|
18dbb0cfe6 | ||
|
|
ef26296dc6 | ||
|
|
0a39eac419 | ||
|
|
9aa9840231 | ||
|
|
1acf67a91c | ||
|
|
d66cf089ee | ||
|
|
fb04d75376 | ||
|
|
966641c447 | ||
|
|
e12098abe4 | ||
|
|
724f15c006 | ||
|
|
fb6d7b5668 | ||
|
|
eccc2d74a3 | ||
|
|
3437d8b471 | ||
|
|
7f0377a8c5 | ||
|
|
ce0a6368f2 | ||
|
|
66e0d9f357 | ||
|
|
bc08ada938 | ||
|
|
eadcf7382b | ||
|
|
75ed93c35b | ||
|
|
1e37ca8315 | ||
|
|
d410e1ef6c | ||
|
|
a3e8b53f01 | ||
|
|
9ebace4014 | ||
|
|
c04063838b | ||
|
|
8c5c324a09 | ||
|
|
655e2b3469 | ||
|
|
02187ab5a5 | ||
|
|
c9bd2ab9a5 | ||
|
|
90b3d01171 | ||
|
|
5cfc5dda92 | ||
|
|
64cd0c232d | ||
|
|
d7a5db711b | ||
|
|
102e3ccde3 | ||
|
|
6b76d62fda | ||
|
|
caad463e8a | ||
|
|
fa441149e4 | ||
|
|
ba73a9b55e | ||
|
|
0267c79b07 | ||
|
|
bfcad278aa | ||
|
|
33d073e7a0 | ||
|
|
54020a8813 | ||
|
|
97a9d21ac4 | ||
|
|
f176f6ae4f | ||
|
|
313311d008 | ||
|
|
0e1fe3968d | ||
|
|
4c0b3e9134 | ||
|
|
0d1daeaedf | ||
|
|
6bd8206236 | ||
|
|
156c008eee | ||
|
|
b829f0a20a | ||
|
|
4b625025ee | ||
|
|
b3da28e915 | ||
|
|
2f5a0d071f | ||
|
|
0cdba79738 | ||
|
|
030ee8efe3 | ||
|
|
7be25df7d0 | ||
|
|
847bfb721b | ||
|
|
50be0ad889 | ||
|
|
58813310b7 | ||
|
|
811a752efb | ||
|
|
29f81b2087 | ||
|
|
5071eb6fda | ||
|
|
29b41a7638 | ||
|
|
b6976210a5 | ||
|
|
0d2a827413 | ||
|
|
cdb55ab5dd | ||
|
|
0d69274bb4 | ||
|
|
cb102ed115 | ||
|
|
78517971ed | ||
|
|
5ef73d992c | ||
|
|
0d05589206 | ||
|
|
afc65eed32 | ||
|
|
acffe8a721 | ||
|
|
6411433b24 | ||
|
|
5127712711 | ||
|
|
33f84ec327 | ||
|
|
3bcadd047b | ||
|
|
c34ec5ddab | ||
|
|
4f772bbecf | ||
|
|
18faaa69bd | ||
|
|
24304636d9 | ||
|
|
9b2633e6c7 | ||
|
|
7752ca0f03 | ||
|
|
421d91bb0f | ||
|
|
9e262220e5 | ||
|
|
2a780cb4b0 | ||
|
|
94b9db7f27 | ||
|
|
c0f51103d2 | ||
|
|
334f0cd03f | ||
|
|
655c1fd09f | ||
|
|
663eb1b360 | ||
|
|
0015ad4abe | ||
|
|
e2b5817d18 | ||
|
|
f6089e689e | ||
|
|
f3413b4283 | ||
|
|
0d4ab4f2cf | ||
|
|
d42b9bbdf4 | ||
|
|
72311c73b5 | ||
|
|
93c4814a89 | ||
|
|
7823c80710 | ||
|
|
2d9cdbe8b0 | ||
|
|
fdacbb94c3 | ||
|
|
3f1caf8da0 | ||
|
|
f8d5332786 | ||
|
|
1ccc631bd4 | ||
|
|
86183b873e | ||
|
|
56adf598ae | ||
|
|
fe1337fa8d | ||
|
|
16915b6480 | ||
|
|
15c8459a15 | ||
|
|
feb9d9e714 | ||
|
|
a8fd2a1136 | ||
|
|
9c571b222e | ||
|
|
37840f3b6c | ||
|
|
927d77cfd7 | ||
|
|
265bcd7b65 | ||
|
|
c69127f37c | ||
|
|
45ae821f5c | ||
|
|
1f8879df92 | ||
|
|
7093ac54a3 | ||
|
|
5118cad9a2 | ||
|
|
2b0b9675fd | ||
|
|
40c9436071 | ||
|
|
b976f8d0ed | ||
|
|
a54e17caeb | ||
|
|
0416ac4064 | ||
|
|
1fa91f0ef7 | ||
|
|
fab94319bb | ||
|
|
5ff15895b6 | ||
|
|
0188afcd54 | ||
|
|
ae814a18c5 | ||
|
|
1f5dffa0e5 | ||
|
|
4d91d82515 | ||
|
|
4c8e647415 | ||
|
|
14e71ce42f | ||
|
|
f6f9287e33 | ||
|
|
456c322c19 | ||
|
|
a12c90268f | ||
|
|
a10f2330fd | ||
|
|
03ba13e5cb | ||
|
|
335c21488e | ||
|
|
d26279275d | ||
|
|
4f66129a7c | ||
|
|
8c1a9c8798 | ||
|
|
966d8498bc | ||
|
|
36a51eeb73 | ||
|
|
382173351a | ||
|
|
d35323aa65 | ||
|
|
9b21275b7e |
@@ -4,8 +4,7 @@ HISTORY.md
|
||||
mayan/media
|
||||
db.sqlite*
|
||||
docker
|
||||
!docker/etc
|
||||
!docker/entrypoint.sh
|
||||
!docker/version
|
||||
!docker/rootfs
|
||||
./.*
|
||||
docs
|
||||
|
||||
|
||||
3
.flake8
3
.flake8
@@ -1,2 +1,3 @@
|
||||
[flake8]
|
||||
ignore = E501
|
||||
exclude = node_modules,static,templates
|
||||
ignore = E501, N801, N802, N804, N805, N806
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -7,6 +7,7 @@
|
||||
.coverage
|
||||
.coverage.tox*
|
||||
.idea/
|
||||
*.swp
|
||||
.tox/
|
||||
.vagrant
|
||||
_build/
|
||||
@@ -29,4 +30,6 @@ static_collected/
|
||||
/venv/
|
||||
/venv3/
|
||||
/whoosh_index/
|
||||
google_fonts/
|
||||
node_modules/
|
||||
docs/build/
|
||||
|
||||
@@ -17,7 +17,7 @@ job_docker_build:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
script:
|
||||
- docker build --pull -t "$CI_REGISTRY_IMAGE" -f docker/Dockerfile .
|
||||
- VERSION=`cat docker/version`
|
||||
- VERSION=`cat docker/rootfs/version`
|
||||
- docker tag "$CI_REGISTRY_IMAGE" "$CI_REGISTRY_IMAGE:$VERSION"
|
||||
- docker run --rm "$CI_REGISTRY_IMAGE:$VERSION" run-tests
|
||||
- docker push "$CI_REGISTRY_IMAGE:$VERSION"
|
||||
@@ -37,7 +37,7 @@ job_docker_push:
|
||||
before_script:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
script:
|
||||
- VERSION=`cat docker/version`
|
||||
- VERSION=`cat docker/rootfs/version`
|
||||
- docker pull "$CI_REGISTRY_IMAGE:$VERSION"
|
||||
- docker tag "$CI_REGISTRY_IMAGE:$VERSION" registry-1.docker.io/mayanedms/mayanedms:"$VERSION"
|
||||
- docker tag "$CI_REGISTRY_IMAGE:$VERSION" registry-1.docker.io/mayanedms/mayanedms:latest
|
||||
@@ -119,7 +119,7 @@ job_build_python:
|
||||
- update-locale LANG=en_US.UTF-8
|
||||
- export LC_ALL=en_US.UTF-8
|
||||
- pip install -r requirements/build.txt
|
||||
- make wheel
|
||||
- make python-wheel
|
||||
only:
|
||||
- releases/all
|
||||
- releases/python
|
||||
@@ -140,7 +140,7 @@ job_push_python:
|
||||
|
||||
.test_base: &test_base
|
||||
stage: test
|
||||
image: ubuntu:16.04
|
||||
image: ubuntu:18.04
|
||||
cache:
|
||||
paths:
|
||||
- ~/.cache/pip/
|
||||
@@ -152,8 +152,8 @@ job_push_python:
|
||||
- locale-gen en_US.UTF-8
|
||||
- update-locale LANG=en_US.UTF-8
|
||||
- export LC_ALL=en_US.UTF-8
|
||||
- apt-get install -qq curl gcc ghostscript gpgv gnupg graphviz libfuse2 libjpeg-dev libmagic1 libpng-dev libtiff-dev poppler-utils libreoffice poppler-utils python-dev python-pip tesseract-ocr tesseract-ocr-deu
|
||||
- pip install -r requirements/testing.txt
|
||||
- apt-get install -qq curl exiftool gcc ghostscript gnupg1 graphviz libfuse2 libjpeg-dev libmagic1 libpng-dev libtiff-dev poppler-utils libreoffice poppler-utils python-dev python-pip tesseract-ocr tesseract-ocr-deu
|
||||
- pip install -r requirements.txt -r requirements/testing-base.txt
|
||||
only:
|
||||
- releases/all
|
||||
- releases/docker
|
||||
@@ -171,7 +171,7 @@ test-mysql:
|
||||
- mysql:8.0.3
|
||||
script:
|
||||
- apt-get install -qq libmysqlclient-dev mysql-client
|
||||
- pip install mysql-python
|
||||
- pip install mysqlclient
|
||||
- mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "set global character_set_server=utf8mb4;"
|
||||
- python manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
|
||||
tags:
|
||||
|
||||
42
.tx/config
42
.tx/config
@@ -19,6 +19,12 @@ source_lang = en
|
||||
source_file = mayan/apps/authentication/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.autoadmin-2-0]
|
||||
file_filter = mayan/apps/autoadmin/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/autoadmin/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.cabinets-2-0]
|
||||
file_filter = mayan/apps/cabinets/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
@@ -43,18 +49,24 @@ source_lang = en
|
||||
source_file = mayan/apps/converter/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.dashboards-2-0]
|
||||
file_filter = mayan/apps/dashboards/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/dashboards/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.dependencies-3-0]
|
||||
file_filter = mayan/apps/dependencies/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/dependencies/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.django_gpg-2-0]
|
||||
file_filter = mayan/apps/django_gpg/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/django_gpg/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.documents-2-0]
|
||||
file_filter = mayan/apps/documents/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/documents/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.document_comments-2-0]
|
||||
file_filter = mayan/apps/document_comments/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
@@ -85,6 +97,12 @@ source_lang = en
|
||||
source_file = mayan/apps/document_states/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.documents-2-0]
|
||||
file_filter = mayan/apps/documents/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/documents/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.dynamic_search-2-0]
|
||||
file_filter = mayan/apps/dynamic_search/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
@@ -97,6 +115,12 @@ source_lang = en
|
||||
source_file = mayan/apps/events/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.file_metadata-3-0]
|
||||
file_filter = mayan/apps/file_metadata/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/file_metadata/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.linking-2-0]
|
||||
file_filter = mayan/apps/linking/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
@@ -145,6 +169,12 @@ source_lang = en
|
||||
source_file = mayan/apps/permissions/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.platform-2-0]
|
||||
file_filter = mayan/apps/platform/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
source_file = mayan/apps/platform/locale/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
||||
[mayan-edms.rest_api-2-0]
|
||||
file_filter = mayan/apps/rest_api/locale/<lang>/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
|
||||
@@ -23,7 +23,7 @@ with deployments, webservers, cloud providers, etc.
|
||||
Code
|
||||
----
|
||||
|
||||
1. Complete and mail, or scan and email the corresponding Contributor Assignment Agreement: [Mayan EDMS Individual Contributor Assignment Agreement](https://docs.mayan-edms.com/topics/caa_individual.rst) or [Mayan EDMS Entity Contributor Assignment Agreement](https://docs.mayan-edms.com/topics/topics/caa_entity.rst).
|
||||
1. Complete and mail, or scan and email the corresponding Contributor Assignment Agreement: [Mayan EDMS Individual Contributor Assignment Agreement](https://gitlab.com/mayan-edms/mayan-edms/blob/master/docs/chapters/caa_individual.rst) or [Mayan EDMS Entity Contributor Assignment Agreement](https://gitlab.com/mayan-edms/mayan-edms/blob/master/docs/chapters/caa_entity.rst).
|
||||
1. Fork [the repository](http://gitlab.com/mayan-edms/mayan-edms).
|
||||
1. Choose the version for which you want to develop. The code is divided in the
|
||||
following branches:
|
||||
|
||||
353
HISTORY.rst
353
HISTORY.rst
@@ -1,3 +1,352 @@
|
||||
3.2.4 (2019-06-XX)
|
||||
==================
|
||||
* Support configurable GUnicorn timeouts. Defaults to
|
||||
current value of 120 seconds.
|
||||
* Fix help text of the platformtemplate command.
|
||||
|
||||
3.2.3 (2019-06-21)
|
||||
==================
|
||||
* Add support for disabling the random primary key
|
||||
test mixin.
|
||||
* Fix mailing profile log columns mappings.
|
||||
GitLab issue #626. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report.
|
||||
* Fix the Django SMTP backend username field name.
|
||||
GitLab issue #625. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report and the research.
|
||||
* Increase the Django STMP username.
|
||||
GitLab issue #625. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report and the research.
|
||||
|
||||
3.2.2 (2019-06-19)
|
||||
==================
|
||||
* Fix document type change view. Closes GitLab issue #614
|
||||
Thanks to Christoph Roeder (@brightdroid) for the report.
|
||||
* Fix document parsing tool view typo. Closes GitLab issue #615.
|
||||
Thanks to Tyler Page (@iamtpage) for the report.
|
||||
* Update the task_check_interval_source reference
|
||||
GitLab issue #617. Thanks to Lukas Gill (@lukkigi) for
|
||||
the report and debug information.
|
||||
|
||||
3.2.1 (2019-06-14)
|
||||
==================
|
||||
* Fix sub cabinet creation view. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report.
|
||||
* Add PostgreSQL troubleshooting entry. Closes GitLab
|
||||
issues #523 and #602
|
||||
* Use YAML SafeDumper to avoid adding YAML datatype tags.
|
||||
Closes GitLab issue #599. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report and debug information.
|
||||
* Add check for app references and point users to release notes for details.
|
||||
GitLab issue #603. Thanks to Vikas Kedia (@vikaskedia) for the report.
|
||||
* Remove sidebar floar right.
|
||||
Fixed GitLab issue #600. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report and debug information.
|
||||
* Collapse sidebar on small screen
|
||||
Display sidebar at the bottom of the screen on small displays.
|
||||
|
||||
3.2 (2019-06-13)
|
||||
================
|
||||
* Split sources models into separate modules.
|
||||
* Add support for subfolder scanning to watchfolders. Closes
|
||||
GitLab issue #498 and #563.
|
||||
* Updated the source check behavior to allow checking a source
|
||||
even when the source is disabled and to not deleted processed files
|
||||
during a check.
|
||||
* Switch to full app paths.
|
||||
* Split document app models into separate modules.
|
||||
* Split workflow views into separate modules.
|
||||
* Add custom DatabaseWarning to tag the SQLite usage warning.
|
||||
* Add keyword arguments to add_to_class instances.
|
||||
* Move add_to_class function to their own module called methods.py
|
||||
* Remove catch all exception handling for the check in and
|
||||
check out views.
|
||||
* Improve checkouts tests code reducing redundant code.
|
||||
* Change how the HOME_VIEW setting is defined.
|
||||
* Remove the role permission grant and revoke permission.
|
||||
* Split trashed document views into their own module.
|
||||
* Show entire sys trace when an App import exception is raised.
|
||||
* Remove Django suit from requirements.
|
||||
* Remove development URLs from main URL file.
|
||||
* Move API documentation generation from the root URLs module
|
||||
to the REST API app's URLs module.
|
||||
* Update Pillow to version 6.0.0
|
||||
* Update PyYAML to version 5.1. Update use of safe_load and
|
||||
safe_dump to load and dump using the SafeLoader.
|
||||
* Add SilenceLoggerTestCaseMixin to lower level of loggers
|
||||
during tests.
|
||||
* New default value for setting DOCUMENTS_HASH_BLOCK_SIZE is
|
||||
65535.
|
||||
* New default value for setting MIMETYPE_FILE_READ_SIZE is
|
||||
1024.
|
||||
* Add workaround for Tesseract bug 1670
|
||||
https://github.com/tesseract-ocr/tesseract/issues/1670
|
||||
https://github.com/tesseract-ocr/tesseract/commit/3292484f67af8bdda23aa5e510918d0115785291
|
||||
https://gitlab.gnome.org/World/OpenPaperwork/pyocr/issues/104
|
||||
* Move setting COMMON_TEMPORARY_DIRECTORY to the storage app.
|
||||
The setting is now STORAGE_TEMPORARY_DIRECTORY.
|
||||
* Move file related utilities to the storage app.
|
||||
* Backport and remove unused code from the permission app.
|
||||
* Move the navigation and authentication templates to their
|
||||
respective apps.
|
||||
* Add dashboard app.
|
||||
* Remove queryset slicing hack from the Document list view.
|
||||
And slice the Recently Added Document queryset itself.
|
||||
* Move stub filtering to the Document model manager.
|
||||
* Increase the default number of recently added documents and
|
||||
recently accessed documents from 40 to 400.
|
||||
* Integrate django-autoadmin into the core apps.
|
||||
* Update middleware to new style classes.
|
||||
* Add server side invalid document template.
|
||||
* Move tag specific JavaScript to the tags app.
|
||||
* Reduce form boilerplate code with new FormOptions class.
|
||||
* Use FormOptions for the DetailForm class.
|
||||
* DetailForm now support help text on extra fields.
|
||||
* Add FilteredSelectionForm class.
|
||||
* Use FilteredSelectionForm for TagMultipleSelectionForm.
|
||||
* Use FilteredSelectionForm for the class CabinetListForm.
|
||||
* Add keyword arguments to URL definitions.
|
||||
* Use FilteredSelectionForm to add a new ACLCreateForm.
|
||||
* Rename IndexListForm to IndexTemplateFilteredForm.
|
||||
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
|
||||
* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm.
|
||||
* Improve document signatures tests.
|
||||
* Add docstrings to most models.
|
||||
* Add support to the mailing profiles for specifying a from
|
||||
address. Closes GitLab issue #522.
|
||||
* Expose new Django settings: AUTH_PASSWORD_VALIDATORS, DEFAULT_FROM_EMAIL,
|
||||
EMAIL_TIMEOUT, INTERNAL_IPS, LANGUAGES, LANGUAGE_CODE, STATIC_URL,
|
||||
STATICFILES_STORAGE, TIME_ZONE, WSGI_APPLICATION.
|
||||
* Convert language choices into a function.
|
||||
* Move language choices generation to documents.utils.
|
||||
* Remove support for generating documents images in base 64
|
||||
format.
|
||||
* Move Pillow initialization from the module to the backend
|
||||
class initialization.
|
||||
* Remove star import from the ACL and Common apps.
|
||||
* Add dependencies app
|
||||
* Convert the document tags widget to use HTML templates.
|
||||
* Move Tag app HTML widgets to their own module.
|
||||
* Move the document index app widgets to the html_widget.py
|
||||
module.
|
||||
* Update group members view permission. The group edit and
|
||||
user edit permission are now required.
|
||||
* Add keyword arguments to messages uses.
|
||||
* Add keyword arguments to the reverse use in views.
|
||||
* Add MERCs 5 and 6.
|
||||
* Update authentication function views to use Django's new class
|
||||
based authentication views.
|
||||
* Expose Django's LOGOUT_REDIRECT_URL setting.
|
||||
* Move current user views from the common app to the user
|
||||
management app.
|
||||
* Move the purge permission logic to the StorePermission
|
||||
manager.
|
||||
* Remove the MIMETYPE_FILE_READ_SIZE setting.
|
||||
* Use copyfileobj in the document parsers.
|
||||
* Backport list facet menu code.
|
||||
* Backport sidebar code.
|
||||
* CSS updates to maximize usable width.
|
||||
* Improve partial navigation error messages and display.
|
||||
* Add user created and user edited events.
|
||||
* Add group created and group edited events.
|
||||
* Add support for SourceColumn widgets.
|
||||
* Improve styling of the template debug view.
|
||||
* Add support for showing the current user's events.
|
||||
* Add support kwargs to the SourceColumn class.
|
||||
* Improve the event widgets, views and tests.
|
||||
* Add mailer use event.
|
||||
* Remove the include fontawesome and download it from
|
||||
the NPMregistry.
|
||||
* Fix issue installing scoped NPM packages.
|
||||
* Add new icons classes and templates.
|
||||
* Add support for icon composition.
|
||||
* Add support for link icon path imports.
|
||||
* Remove support for link icon strings.
|
||||
* Split document app form into separate modules.
|
||||
* Move the favorite document views to their own module.
|
||||
* Replace DocumentTypeSelectioForm with an improved
|
||||
version that does filtering.
|
||||
* Update OCR links activation.
|
||||
* Update document parsing link activation.
|
||||
* Add favorite document views tests.
|
||||
* Add document state action view test.
|
||||
* Remove sidebar menu instance. The secondary menu and the
|
||||
previour sidebar menu now perform the same function.
|
||||
* Backport source column identifiable and sortable
|
||||
improvements.
|
||||
* Update the way the no-result template is shown.
|
||||
* Improve TwoStateWidget to use a template. Make
|
||||
it compatible with the SourceColumn.
|
||||
* Update SourceColumn to support related attributes.
|
||||
* Add support for display for empty values for
|
||||
source columns.
|
||||
* Add support for source column object or attribute
|
||||
absolute URLs.
|
||||
* Add sortable columns to all apps.
|
||||
* Remove permission list display from the ACL list view.
|
||||
Reduces clutter and unpredictable column size.
|
||||
* Remove the full name from the user list.
|
||||
* Add the first name and last name to the user list.
|
||||
* Add file metadata app.
|
||||
* Add support for submitting forms by pressing the
|
||||
Enter key or by double clicking.
|
||||
* Rename form template 'form_class' to 'form_css_classes'.
|
||||
* Add support for adding form button aside from the
|
||||
default submit and cancel.
|
||||
* Update ChoiceForm to be full height.
|
||||
* Add AddRemoveView to replace AssignRemoveView
|
||||
* Update the group roles view to use the new AddRemoveView.
|
||||
* Add role create and edit events.
|
||||
* Sort users by lastname, firstname.
|
||||
* Switch user groups and group users views to AddRemoveView.
|
||||
* Commit user edit event when an user is added or removed
|
||||
from a group.
|
||||
* Commit the group edit event when a group is added or remove
|
||||
from an user.
|
||||
* Require dual permissions when add or removing users to and
|
||||
from group. Same with group to users.
|
||||
* Backport search improvements.
|
||||
* Remove search elapsed time calculation.
|
||||
* Remove SEARCH_LIMIT setting.
|
||||
* Use the 'handler' prefix for all the signal handler functions.
|
||||
* Remove custom email widget and use Django's.
|
||||
* Increase default maximum number of favorite documents to 400.
|
||||
* Update the role group list view to use the new AddRemoveView.
|
||||
* Commit the group event in conjunction with the role event
|
||||
when a group is added or remove from role.
|
||||
* Update the role permission view to use the new AddRemoveView.
|
||||
* Rename transformation manager method add_for_model to
|
||||
add_to_object.
|
||||
* Rename transformation manager method get_for_model to
|
||||
get_for_object.
|
||||
* Load the converter class on demand.
|
||||
* Remove app top level star imports.
|
||||
* Monkeypatch group and user models to make their fields
|
||||
translatable.
|
||||
* Add new and default Tesseract OCR backend to avoid
|
||||
Tesseract bug 1670
|
||||
(https://github.com/tesseract-ocr/tesseract/issues/1670)
|
||||
* Load only one language in the document properties form.
|
||||
* Convert title calculation form to a template tag.
|
||||
* Show the full title as a hover title even when truncated.
|
||||
* Increase default title truncation length to 120 characters.
|
||||
* Improve inherited permission computation.
|
||||
* Add test case mixin that produces ephimeral models.
|
||||
* Update ACL permissions view to use the new AddRemoveView class.
|
||||
* Add ACL created and edited events.
|
||||
* Update index document types view to use the new AddRemoveView
|
||||
class.
|
||||
* Add index create and edit events.
|
||||
* Allow overloading the action_add and action_remove methods
|
||||
from the AddRemoveView.
|
||||
* Add view to link document type and indexes from the document
|
||||
type side.
|
||||
* Update smart link document type selection view to use
|
||||
AddRemoveView class.
|
||||
* Add smart link created and edited events.
|
||||
* Fix smart link ACL support.
|
||||
* Update JavaScript downloader to work with Python 3.
|
||||
* Improve speed of the NPM package hash verification.
|
||||
* Add view to enable smart links for documents types
|
||||
from the document type side.
|
||||
* Enable list link icons.
|
||||
* Add outline links CSS for facets.
|
||||
* Add a bottom margin to list links.
|
||||
* Use copyfileobj to save documents to files
|
||||
* Add user logged in and logged out events.
|
||||
* Add transaction handling in more places.
|
||||
* Update ACLs tests to use ephimeral models.
|
||||
* Add new app to handle all dependencies.
|
||||
* Remove the licenses.py module and replace
|
||||
it with a dependencies.py module.
|
||||
* Backport ACL computation improvements.
|
||||
* Remove model permission proxy models.
|
||||
* Remove related access control argument. This is
|
||||
now handled by the related field registration.
|
||||
* Allow nested access control checking.
|
||||
* check_access's permissions argument must now be
|
||||
an interable.
|
||||
* Remove permissions_related from links.
|
||||
* Remove mayan_permission_attribute_check from
|
||||
API permission.
|
||||
* Update Bootstrap and Bootswatch to version 3.4.1.
|
||||
* Convert the workflow document types view to use
|
||||
the new AddRemove view.
|
||||
* Add the workflow created and edited events.
|
||||
* Remove AssignRemove View.
|
||||
* Add view to setup workflows per document type
|
||||
from the document type side.
|
||||
* Make workflows, workflows states, workflow
|
||||
transitions column sortable.
|
||||
* Show completion and intial state in the
|
||||
workflow proxy instance menu list.
|
||||
* Fix translation of the source upload forms
|
||||
using dropzone.js
|
||||
* Rename get_object_list to get_source_queryset.
|
||||
* Add uniqueness validation to SingleObjectCreateView.
|
||||
* Remove MultipleInstanceActionMixin.
|
||||
* Backport MultipleObjectMixin improvements.
|
||||
* Remove ObjectListPermissionFilterMixin.
|
||||
* Add deprecation warning to convertdb
|
||||
* Add the preparestatic command.
|
||||
* Remove the related attribute of check_access.
|
||||
* Remove filter_by_access. Replaced by restrict_queryset.
|
||||
* Move the user set password views to the authentication app.
|
||||
* All views redirect to common's home view instead of the
|
||||
REDIRECT_URL setting.
|
||||
* Update tag document list and the document tag list
|
||||
views to require the view permissions for both objects.
|
||||
* Install and server static content to and from the image.
|
||||
* Add support for editing document comments.
|
||||
* Remove Internet Explorer specific markup.
|
||||
* Fix optional metadata remove when mixed with required
|
||||
metadata.
|
||||
* Create intermedia file cache folder. Fixes preview errors
|
||||
when the first document uploaded is an office file.
|
||||
* Move queue and task registration to the CeleryQueue class.
|
||||
The .queues.py module is now loaded automatically.
|
||||
* Allow setting the Docker user UID and GUID.
|
||||
* Add task path validation.
|
||||
* Increase dropzone upload file size limit to 2GB.
|
||||
* Add cabinet created and edited events.
|
||||
* Show a null mailer backend if there is backend with an
|
||||
invalid path. Due to the app full path change, existing
|
||||
mailer setups need to be recreated.
|
||||
* The document link URL when mailed is now composed of the
|
||||
COMMON_PROJECT_URL + document URL instead of the Site
|
||||
domain.
|
||||
* Add the checkdependencies command.
|
||||
* Add comment and make file target to generate all requirement
|
||||
files.
|
||||
* Place deletion policies units before periods for clarity.
|
||||
* Remove repeated EMAIL_TIMEOUT setting.
|
||||
* Invert order to the Action Object and Target columns for
|
||||
clarity.
|
||||
* Add note about the new preparestatic command.
|
||||
* Add no-result template for workflow instance detail view.
|
||||
* Update HTTP workflow action to new requests API.
|
||||
* Remove the included Lato font. The font is now downloaded
|
||||
at install time.
|
||||
* Add support for Google Fonts dependencies.
|
||||
* Add support for patchin dependency files using rewriting rules.
|
||||
* Allow searching documents by UUID.
|
||||
* Improve search negation logic.
|
||||
* Add support for search field transformations.
|
||||
* Disable hiding page navigation on idle.
|
||||
* Display namespace in the transition trigger view.
|
||||
* Sort events list in the transition trigger view.
|
||||
* Add support for form media to DynamicFormMixin.
|
||||
* Fix tag attach and remove action form media.
|
||||
* Sort content type list of the access grant and remove action.
|
||||
* Use select2 for the content type filed of the access
|
||||
grant and remove action.
|
||||
* Add Latvian translation.
|
||||
* Support search model selection.
|
||||
* Support passing a queryset factory to the search model.
|
||||
* Add workflow actions to grant or remove permissions to
|
||||
a document.
|
||||
* Add support for locked files for watchfolder.
|
||||
|
||||
3.1.11 (2019-04-XX)
|
||||
===================
|
||||
* Fix multiple tag selection wizard step.
|
||||
@@ -380,6 +729,10 @@
|
||||
model.
|
||||
- Make icon classes file template based.
|
||||
- Add the current step and total steps of a wizard in the template context.
|
||||
- Chart updates: Show last update date and time in list view and details view.
|
||||
Change color scheme to match rest of project. Increase size of data points.
|
||||
Improve responsive settings. Redirect to the current view after queueing.
|
||||
- Split document type retention policies into it own view.
|
||||
|
||||
3.0.3 (2018-08-17)
|
||||
==================
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright 2011-2018 Roberto Rosario
|
||||
Copyright 2011 Roberto Rosario
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
include README.md LICENSE HISTORY.rst mayan/LICENSE
|
||||
recursive-include mayan/apps *.txt *.html *.css *.ico *.png *.jpg *.js *.po *.mo *.ttf *.woff *.woff2 *.gif *.eot *.svg *.doc *.pdf *.tiff *.sig *.asc *.gpg *.zip *.tar *.gz *.bz2 package.json
|
||||
global-exclude mayan/settings/local.py mayan/settings/travis/* mayan/media/*
|
||||
recursive-include mayan/apps *.txt *.html *.css *.ico *.png *.jpg *.js *.mo *.ttf *.woff *.woff2 *.gif *.eot *.svg *.doc *.pdf *.tiff *.sig *.asc *.gpg *.zip *.tar *.gz *.bz2 *.tmpl
|
||||
global-exclude mayan/settings/local.py *.po
|
||||
prune mayan/apps/*/static/*/node_modules/*
|
||||
prune mayan/settings/travis/*
|
||||
prune mayan/media/*
|
||||
|
||||
169
Makefile
169
Makefile
@@ -1,64 +1,20 @@
|
||||
.PHONY: clean-pyc clean-build
|
||||
|
||||
help: docker-help
|
||||
@echo
|
||||
@echo "**** Main makefile ****"
|
||||
@echo "clean-build - Remove build artifacts."
|
||||
@echo "clean-pyc - Remove Python artifacts."
|
||||
@echo "clean - Remove Python and build artifacts."
|
||||
@echo "generate-setup - Create and updated setup.py"
|
||||
@echo "check-readme - Checks validity of the README.rst file for PyPI publication."
|
||||
@echo "check-missing_migrations - Make sure all models have proper migrations."
|
||||
|
||||
@echo "test-all - Run all tests."
|
||||
@echo "test MODULE=<python module name> - Run tests for a single app, module or test class."
|
||||
@echo "test-with-postgres-all - Run all tests against a Postgres database container."
|
||||
@echo "test-postgres MODULE=<python module name> - Run tests for a single app, module or test class against a Postgres database container."
|
||||
@echo "test-with-mysql-all - Run all tests against a MySQL database container."
|
||||
@echo "test-mysql MODULE=<python module name> - Run tests for a single app, module or test class against a MySQL database container."
|
||||
@echo "test-with-oracle-all - Run all tests against a Oracle database container."
|
||||
@echo "test-oracle MODULE=<python module name> - Run tests for a single app, module or test class against a Oracle database container."
|
||||
|
||||
@echo "docs-serve - Run the livehtml documentation generator."
|
||||
|
||||
@echo "translations-make - Refresh all translation files."
|
||||
@echo "translations-compile - Compile all translation files."
|
||||
@echo "translations-push - Upload all translation files to Transifex."
|
||||
@echo "translations-pull - Download all translation files from Transifex."
|
||||
|
||||
@echo "sdist - Build the source distribution package."
|
||||
@echo "wheel - Build the wheel distribution package."
|
||||
@echo "release - Package (sdist and wheel) and upload a release."
|
||||
@echo "test-release - Package (sdist and wheel) and upload to the PyPI test server."
|
||||
@echo "release-test-via-docker-ubuntu - Package (sdist and wheel) and upload to the PyPI test server using an Ubuntu Docker builder."
|
||||
@echo "release-via-docker-ubuntu - Package (sdist and wheel) and upload to PyPI using an Ubuntu Docker builder."
|
||||
@echo "test-sdist-via-docker-ubuntu - Make an sdist packange and test it using an Ubuntu Docker container."
|
||||
@echo "test-wheel-via-docker-ubuntu - Make a wheel package and test it using an Ubuntu Docker container."
|
||||
@echo "runserver - Run the development server."
|
||||
@echo "runserver_plus - Run the Django extension's development server."
|
||||
@echo "shell_plus - Run the shell_plus command."
|
||||
|
||||
@echo "test-with-docker-services-on - Launch and initialize production-like services using Docker (Postgres and Redis)."
|
||||
@echo "test-with-docker-services-off - Stop and delete the Docker production-like services."
|
||||
@echo "test-with-docker-frontend - Launch a front end instance that uses the production-like services."
|
||||
@echo "test-with-docker-worker - Launch a worker instance that uses the production-like services."
|
||||
@echo "docker-mysql-on - Launch and initialize a MySQL Docker container."
|
||||
@echo "docker-mysql-off - Stop and delete the MySQL Docker container."
|
||||
@echo "docker-postgres-on - Launch and initialize a PostgreSQL Docker container."
|
||||
@echo "docker-postgres-off - Stop and delete the PostgreSQL Docker container."
|
||||
|
||||
@echo "safety-check - Run a package safety check."
|
||||
help:
|
||||
@echo "Usage: make <target>\n"
|
||||
@awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_-]+:.*?## / { printf " * %-40s -%s\n", $$1, $$2 }' $(MAKEFILE_LIST)|sort
|
||||
|
||||
# Cleaning
|
||||
|
||||
clean: ## Remove Python and build artifacts.
|
||||
clean: clean-build clean-pyc
|
||||
|
||||
clean-build:
|
||||
clean-build: ## Remove build artifacts.
|
||||
rm -fr build/
|
||||
rm -fr dist/
|
||||
rm -fr *.egg-info
|
||||
|
||||
clean-pyc:
|
||||
clean-pyc: ## Remove Python artifacts.
|
||||
find . -name '*.pyc' -exec rm -f {} +
|
||||
find . -name '*.pyo' -exec rm -f {} +
|
||||
find . -name '*~' -exec rm -f {} +
|
||||
@@ -66,25 +22,29 @@ clean-pyc:
|
||||
|
||||
# Testing
|
||||
|
||||
test:
|
||||
test: clean-pyc
|
||||
test: ## MODULE=<python module name> - Run tests for a single app, module or test class.
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.development --nomigrations $(ARGUMENTS)
|
||||
|
||||
test-all:
|
||||
test-all: ## Run all tests.
|
||||
test-all: clean-pyc
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.development --nomigrations $(ARGUMENTS)
|
||||
|
||||
test-launch-postgres:
|
||||
@docker rm -f test-postgres || true
|
||||
@docker volume rm test-postgres || true
|
||||
docker run -d --name test-postgres -p 5432:5432 -v test-postgres:/var/lib/postgresql/data healthcheck/postgres
|
||||
sudo apt-get install -qq libpq-dev
|
||||
sudo apt-get install -q libpq-dev
|
||||
pip install psycopg2
|
||||
while ! docker inspect --format='{{json .State.Health}}' test-postgres|grep 'Status":"healthy"'; do sleep 1; done
|
||||
|
||||
test-with-postgres: ## MODULE=<python module name> - Run tests for a single app, module or test class against a Postgres database container.
|
||||
test-with-postgres: test-launch-postgres
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_postgres --nomigrations
|
||||
@docker rm -f test-postgres || true
|
||||
@docker volume rm test-postgres || true
|
||||
|
||||
test-with-postgres-all: ## Run all tests against a Postgres database container.
|
||||
test-with-postgres-all: test-launch-postgres
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_postgres --nomigrations
|
||||
@docker rm -f test-postgres || true
|
||||
@@ -94,16 +54,19 @@ test-launch-mysql:
|
||||
@docker rm -f test-mysql || true
|
||||
@docker volume rm test-mysql || true
|
||||
docker run -d --name test-mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan -v test-mysql:/var/lib/mysql healthcheck/mysql
|
||||
sudo apt-get install -qq libmysqlclient-dev mysql-client
|
||||
pip install mysql-python
|
||||
sudo apt-get install -q libmysqlclient-dev mysql-client
|
||||
pip install mysqlclient
|
||||
while ! docker inspect --format='{{json .State.Health}}' test-mysql|grep 'Status":"healthy"'; do sleep 1; done
|
||||
mysql -h 127.0.0.1 -P 3306 -uroot -e "set global character_set_server=utf8mb4;"
|
||||
|
||||
test-with-mysql: ## MODULE=<python module name> - Run tests for a single app, module or test class against a MySQL database container.
|
||||
test-with-mysql: test-launch-mysql
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_mysql --nomigrations
|
||||
@docker rm -f test-mysql || true
|
||||
@docker volume rm test-mysql || true
|
||||
|
||||
|
||||
test-with-mysql-all: ## Run all tests against a MySQL database container.
|
||||
test-with-mysql-all: test-launch-mysql
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_mysql --nomigrations
|
||||
@docker rm -f test-mysql || true
|
||||
@@ -118,11 +81,13 @@ test-launch-oracle:
|
||||
while ! nc -z 127.0.0.1 49161; do sleep 1; done
|
||||
sleep 10
|
||||
|
||||
test-with-oracle: ## MODULE=<python module name> - Run tests for a single app, module or test class against a Oracle database container.
|
||||
test-with-oracle: test-launch-oracle
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_oracle --nomigrations
|
||||
@docker rm -f test-oracle || true
|
||||
@docker volume rm test-oracle || true
|
||||
|
||||
test-with-oracle-all: ## Run all tests against a Oracle database container.
|
||||
test-with-oracle-all: test-launch-oracle
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_oracle --nomigrations
|
||||
@docker rm -f test-oracle || true
|
||||
@@ -130,58 +95,56 @@ test-with-oracle-all: test-launch-oracle
|
||||
|
||||
# Documentation
|
||||
|
||||
docs-serve:
|
||||
docs-serve: ## Run the livehtml documentation generator.
|
||||
cd docs;make livehtml
|
||||
|
||||
docs-spellcheck:
|
||||
|
||||
docs-spellcheck: ## Spellcheck the documentation.
|
||||
sphinx-build -b spelling -d docs/_build/ docs docs/_build/spelling
|
||||
|
||||
# Translations
|
||||
|
||||
translations-make:
|
||||
translations-make: ## Refresh all translation files.
|
||||
contrib/scripts/process_messages.py -m
|
||||
|
||||
translations-compile:
|
||||
translations-compile: ## Compile all translation files.
|
||||
contrib/scripts/process_messages.py -c
|
||||
|
||||
translations-push:
|
||||
translations-push: ## Upload all translation files to Transifex.
|
||||
tx push -s
|
||||
|
||||
translations-pull:
|
||||
translations-pull: ## Download all translation files from Transifex.
|
||||
tx pull -f
|
||||
|
||||
|
||||
generate-setup:
|
||||
@./generate_setup.py
|
||||
@echo "Complete."
|
||||
|
||||
# Releases
|
||||
|
||||
increase-version:
|
||||
increase-version: ## Increase the version number of the entire project's files.
|
||||
@VERSION=`grep "__version__ =" mayan/__init__.py| cut -d\' -f 2|./increase_version.py - $(PART)`; \
|
||||
BUILD=`echo $$VERSION|awk '{split($$VERSION,a,"."); printf("0x%02d%02d%02d\n", a[1],a[2], a[3])}'`; \
|
||||
sed -i -e "s/__build__ = 0x[0-9]*/__build__ = $${BUILD}/g" mayan/__init__.py; \
|
||||
sed -i -e "s/__version__ = '[0-9\.]*'/__version__ = '$${VERSION}'/g" mayan/__init__.py; \
|
||||
echo $$VERSION > docker/version
|
||||
echo $$VERSION > docker/rootfs/version
|
||||
make generate-setup
|
||||
|
||||
test-release: clean wheel
|
||||
python-test-release: ## Package (sdist and wheel) and upload to the PyPI test server.
|
||||
python-test-release: clean wheel
|
||||
twine upload dist/* -r testpypi
|
||||
@echo "Test with: pip install -i https://testpypi.python.org/pypi mayan-edms"
|
||||
|
||||
release: clean wheel
|
||||
python-release: ## Package (sdist and wheel) and upload a release.
|
||||
python-release: clean python-wheel
|
||||
twine upload dist/* -r pypi
|
||||
|
||||
sdist: clean
|
||||
python-sdist: ## Build the source distribution package.
|
||||
python-sdist: clean
|
||||
python setup.py sdist
|
||||
ls -l dist
|
||||
|
||||
wheel: clean sdist
|
||||
python-wheel: ## Build the wheel distribution package.
|
||||
python-wheel: clean python-sdist
|
||||
pip wheel --no-index --no-deps --wheel-dir dist dist/*.tar.gz
|
||||
ls -l dist
|
||||
|
||||
release-test-via-docker-ubuntu:
|
||||
python-release-test-via-docker-ubuntu: ## Package (sdist and wheel) and upload to the PyPI test server using an Ubuntu Docker builder.
|
||||
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
|
||||
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
locale-gen en_US.UTF-8 && \
|
||||
@@ -194,7 +157,7 @@ release-test-via-docker-ubuntu:
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make test-release"
|
||||
|
||||
release-via-docker-ubuntu:
|
||||
python-release-via-docker-ubuntu: ## Package (sdist and wheel) and upload to PyPI using an Ubuntu Docker builder.
|
||||
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
|
||||
apt-get update && \
|
||||
apt-get -y install locales && \
|
||||
@@ -208,7 +171,7 @@ release-via-docker-ubuntu:
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make release"
|
||||
|
||||
test-sdist-via-docker-ubuntu:
|
||||
test-sdist-via-docker-ubuntu: ## Make an sdist package and test it using an Ubuntu Docker container.
|
||||
docker run --rm --name mayan_sdist_test -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
|
||||
cp -r /host_source/* . && \
|
||||
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
@@ -221,7 +184,7 @@ test-sdist-via-docker-ubuntu:
|
||||
make sdist-test-suit \
|
||||
"
|
||||
|
||||
test-wheel-via-docker-ubuntu:
|
||||
test-wheel-via-docker-ubuntu: ## Make a wheel package and test it using an Ubuntu Docker container.
|
||||
docker run --rm --name mayan_wheel_test -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
|
||||
cp -r /host_source/* . && \
|
||||
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
@@ -234,7 +197,7 @@ test-wheel-via-docker-ubuntu:
|
||||
make wheel-test-suit \
|
||||
"
|
||||
|
||||
sdist-test-suit: sdist
|
||||
python-sdist-test-suit: sdist
|
||||
rm -f -R _virtualenv
|
||||
virtualenv _virtualenv
|
||||
sh -c '\
|
||||
@@ -245,7 +208,7 @@ sdist-test-suit: sdist
|
||||
_virtualenv/bin/mayan-edms.py test --mayan-apps \
|
||||
'
|
||||
|
||||
wheel-test-suit: wheel
|
||||
python-wheel-test-suit: wheel
|
||||
rm -f -R _virtualenv
|
||||
virtualenv _virtualenv
|
||||
sh -c '\
|
||||
@@ -256,18 +219,30 @@ wheel-test-suit: wheel
|
||||
_virtualenv/bin/mayan-edms.py test --mayan-apps \
|
||||
'
|
||||
|
||||
generate-setup: ## Create and update the setup.py file.
|
||||
generate-setup: generate-requirements
|
||||
@./generate_setup.py
|
||||
@echo "Complete."
|
||||
|
||||
generate-requirements: ## Generate all requirements files from the project depedency declarations.
|
||||
@./manage.py generaterequirements build > requirements/build.txt
|
||||
@./manage.py generaterequirements development > requirements/development.txt
|
||||
@./manage.py generaterequirements testing > requirements/testing-base.txt
|
||||
@./manage.py generaterequirements production --exclude=django > requirements/base.txt
|
||||
@./manage.py generaterequirements production --only=django > requirements/common.txt
|
||||
|
||||
# Dev server
|
||||
|
||||
runserver:
|
||||
runserver: ## Run the development server.
|
||||
./manage.py runserver --settings=mayan.settings.development $(ADDRPORT)
|
||||
|
||||
runserver_plus:
|
||||
runserver_plus: ## Run the Django extension's development server.
|
||||
./manage.py runserver_plus --settings=mayan.settings.development $(ADDRPORT)
|
||||
|
||||
shell_plus:
|
||||
shell_plus: ## Run the shell_plus command.
|
||||
./manage.py shell_plus --settings=mayan.settings.development
|
||||
|
||||
test-with-docker-services-on:
|
||||
test-with-docker-services-on: ## Launch and initialize production-like services using Docker (Postgres and Redis).
|
||||
docker run -d --name redis -p 6379:6379 redis
|
||||
docker run -d --name postgres -p 5432:5432 postgres
|
||||
while ! nc -z 127.0.0.1 6379; do sleep 1; done
|
||||
@@ -275,45 +250,45 @@ test-with-docker-services-on:
|
||||
sleep 4
|
||||
./manage.py initialsetup --settings=mayan.settings.staging.docker
|
||||
|
||||
test-with-docker-services-off:
|
||||
test-with-docker-services-off: ## Stop and delete the Docker production-like services.
|
||||
docker stop postgres redis
|
||||
docker rm postgres redis
|
||||
|
||||
test-with-docker-frontend:
|
||||
test-with-docker-frontend: ## Launch a front end instance that uses the production-like services.
|
||||
./manage.py runserver --settings=mayan.settings.staging.docker
|
||||
|
||||
test-with-docker-worker:
|
||||
test-with-docker-worker: ## Launch a worker instance that uses the production-like services.
|
||||
./manage.py celery worker --settings=mayan.settings.staging.docker -B -l INFO -O fair
|
||||
|
||||
docker-mysql-on:
|
||||
docker-mysql-on: ## Launch and initialize a MySQL Docker container.
|
||||
docker run -d --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan_edms mysql
|
||||
while ! nc -z 127.0.0.1 3306; do sleep 1; done
|
||||
|
||||
docker-mysql-off:
|
||||
docker-mysql-off: ## Stop and delete the MySQL Docker container.
|
||||
docker stop mysql
|
||||
docker rm mysql
|
||||
|
||||
docker-postgres-on:
|
||||
docker-postgres-on: ## Launch and initialize a PostgreSQL Docker container.
|
||||
docker run -d --name postgres -p 5432:5432 postgres
|
||||
while ! nc -z 127.0.0.1 5432; do sleep 1; done
|
||||
|
||||
docker-postgres-off:
|
||||
docker-postgres-off: ## Stop and delete the PostgreSQL Docker container.
|
||||
docker stop postgres
|
||||
docker rm postgres
|
||||
|
||||
|
||||
# Security
|
||||
|
||||
safety-check:
|
||||
safety-check: ## Run a package safety check.
|
||||
safety check
|
||||
|
||||
|
||||
# Other
|
||||
find-gitignores:
|
||||
find-gitignores: ## Find stray .gitignore files.
|
||||
@export FIND_GITIGNORES=`find -name '.gitignore'| wc -l`; \
|
||||
if [ $${FIND_GITIGNORES} -gt 1 ] ;then echo "More than one .gitignore found."; fi
|
||||
|
||||
build:
|
||||
python-build:
|
||||
docker rm -f mayan-edms-build || true && \
|
||||
docker run --rm --name mayan-edms-build -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source python:2-slim sh -c "\
|
||||
rm /host_source/dist -R || true && \
|
||||
@@ -326,11 +301,13 @@ build:
|
||||
make wheel && \
|
||||
cp dist/* /host_source/dist/"
|
||||
|
||||
check-readme:
|
||||
check-readme: ## Checks validity of the README.rst file for PyPI publication.
|
||||
python setup.py check -r -s
|
||||
|
||||
check-missing-migrations:
|
||||
check-missing-migrations: ## Make sure all models have proper migrations.
|
||||
./manage.py makemigrations --dry-run --noinput --check
|
||||
|
||||
setup-dev-environment: ## Bootstrap a virtualenv by install all dependencies to start developing.
|
||||
pip install -r requirements.txt -r requirements/development.txt -r requirements/testing-base.txt -r requirements/documentation.txt -r requirements/build.txt
|
||||
|
||||
include docker/Makefile
|
||||
-include docker/Makefile
|
||||
|
||||
@@ -9,6 +9,6 @@ __author__ = 'Roberto Rosario'
|
||||
__author_email__ = 'roberto.rosario@mayan-edms.com'
|
||||
__description__ = 'Free Open Source Electronic Document Management System'
|
||||
__license__ = 'Apache 2.0'
|
||||
__copyright_short__ = '2011-2018 Roberto Rosario'
|
||||
__copyright_short__ = '2011 Roberto Rosario'
|
||||
__copyright__ = '{} {}'.format('Copyright', __copyright_short__)
|
||||
__website__ = 'https://www.mayan-edms.com'
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends tesseract-ocr-deu
|
||||
|
||||
$MAYAN_PIP_BIN install -r $DOCKER_ROOT/requirements-testing.txt
|
||||
$MAYAN_PIP_BIN install -r ${MAYAN_INSTALL_DIR}/requirements-testing.txt
|
||||
|
||||
$MAYAN_BIN test --mayan-apps --settings=mayan.settings.testing
|
||||
|
||||
@@ -1445,7 +1445,7 @@ sudo -u mayan \
|
||||
dialog --infobox "Preparing static files" 3 70
|
||||
sudo -u mayan \
|
||||
MAYAN_MEDIA_ROOT=$MAYAN_MEDIA_ROOT \
|
||||
$MAYAN_BIN collectstatic --noinput > /dev/null
|
||||
$MAYAN_BIN preparestatic --noinput > /dev/null
|
||||
|
||||
# Create supervisor file for gunicorn (frontend), 3 background workers, and the scheduler for periodic tasks
|
||||
cat > /etc/supervisor/conf.d/mayan.conf <<EOF
|
||||
|
||||
@@ -16,7 +16,7 @@ set -e
|
||||
: ${DATABASE_USER:=mayan}
|
||||
: ${DATABASE_NAME:=mayan}
|
||||
: ${DATABASE_PASSWORD:=mayanuserpass}
|
||||
: ${DOCKER_POSTGRES_IMAGE:=postgres:9.5}
|
||||
: ${DOCKER_POSTGRES_IMAGE:=postgres:9.6}
|
||||
: ${DOCKER_POSTGRES_CONTAINER:=mayan-edms-postgres}
|
||||
: ${DOCKER_POSTGRES_VOLUME:=/docker-volumes/mayan-edms/postgres}
|
||||
: ${DOCKER_POSTGRES_PORT:=5432}
|
||||
@@ -121,7 +121,7 @@ docker run -d \
|
||||
-e MAYAN_DATABASE_PASSWORD=$DATABASE_PASSWORD \
|
||||
-e MAYAN_DATABASE_USER=$DATABASE_USER \
|
||||
-e MAYAN_DATABASE_PORT=$DOCKER_POSTGRES_PORT \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
|
||||
-v $DOCKER_MAYAN_VOLUME:/var/lib/mayan \
|
||||
$DOCKER_MAYAN_IMAGE >/dev/null
|
||||
echo "Done"
|
||||
|
||||
@@ -161,7 +161,7 @@ priority = 998
|
||||
EOF
|
||||
|
||||
echo -e "\n -> Collecting the static files \n"
|
||||
mayan-edms.py collectstatic --noinput
|
||||
mayan-edms.py preparestatic --noinput
|
||||
|
||||
echo -e "\n -> Making the installation directory readable and writable by the webserver user \n"
|
||||
chown www-data:www-data ${INSTALLATION_DIRECTORY} -R
|
||||
|
||||
@@ -9,18 +9,20 @@ import sh
|
||||
|
||||
|
||||
APP_LIST = (
|
||||
'acls', 'appearance', 'authentication', 'cabinets', 'checkouts', 'common',
|
||||
'converter', 'django_gpg', 'document_comments', 'document_indexing',
|
||||
'document_parsing', 'document_signatures', 'document_states', 'documents',
|
||||
'dynamic_search', 'events', 'linking', 'lock_manager', 'mayan_statistics',
|
||||
'mailer', 'metadata', 'mirroring', 'motd', 'navigation', 'ocr', 'permissions',
|
||||
'rest_api', 'smart_settings', 'sources', 'storage', 'tags', 'task_manager',
|
||||
'acls', 'appearance', 'authentication', 'autoadmin', 'cabinets',
|
||||
'checkouts', 'common', 'converter', 'dashboards', 'dependencies',
|
||||
'django_gpg', 'document_comments', 'document_indexing',
|
||||
'document_parsing', 'document_signatures', 'document_states',
|
||||
'documents', 'dynamic_search', 'events', 'file_metadata', 'linking',
|
||||
'lock_manager', 'mayan_statistics', 'mailer', 'metadata', 'mirroring',
|
||||
'motd', 'navigation', 'ocr', 'permissions', 'platform', 'rest_api',
|
||||
'smart_settings', 'sources', 'storage', 'tags', 'task_manager',
|
||||
'user_management'
|
||||
)
|
||||
|
||||
LANGUAGE_LIST = (
|
||||
'ar', 'bg', 'bs_BA', 'cs', 'da_DK', 'de_DE', 'en', 'es', 'el', 'fa', 'fr',
|
||||
'hu', 'id', 'it', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI',
|
||||
'hu', 'id', 'it', 'lv', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI',
|
||||
'tr_TR', 'vi_VN', 'zh',
|
||||
)
|
||||
|
||||
|
||||
@@ -1,164 +1,157 @@
|
||||
# vim:set ft=dockerfile:
|
||||
|
||||
####################
|
||||
# Base image start #
|
||||
####################
|
||||
####
|
||||
# BASE_IMAGE - Bare bones image with the base packages needed to run Mayan EDMS
|
||||
####
|
||||
|
||||
FROM debian:9.4-slim as BASE_IMAGE
|
||||
FROM debian:9.8-slim as BASE_IMAGE
|
||||
|
||||
MAINTAINER Roberto Rosario "roberto.rosario@mayan-edms.com"
|
||||
LABEL maintainer="Roberto Rosario roberto.rosario@mayan-edms.com"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
ENV LC_ALL C.UTF-8
|
||||
ENV PROJECT_INSTALL_DIR=/opt/mayan-edms
|
||||
ENV PYTHON_PIP=${PROJECT_INSTALL_DIR}/bin/pip
|
||||
ENV PYTHONUNBUFFERED=1 \
|
||||
LC_ALL=C.UTF-8 \
|
||||
PROJECT_INSTALL_DIR=/opt/mayan-edms
|
||||
|
||||
# Debian package caching
|
||||
ARG APT_PROXY
|
||||
# Package caching
|
||||
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
|
||||
|
||||
# Install base Ubuntu libraries
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
g++ \
|
||||
gcc \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
gnupg1 \
|
||||
graphviz \
|
||||
libffi-dev \
|
||||
libfuse2 \
|
||||
libjpeg-dev \
|
||||
libmagic1 \
|
||||
default-libmysqlclient-dev \
|
||||
libpng-dev \
|
||||
libpq-dev \
|
||||
libreoffice \
|
||||
libtiff-dev \
|
||||
poppler-utils \
|
||||
python-dev \
|
||||
python-setuptools \
|
||||
python-virtualenv \
|
||||
python-wheel \
|
||||
redis-server \
|
||||
sane-utils \
|
||||
sudo \
|
||||
supervisor \
|
||||
tesseract-ocr \
|
||||
zlib1g-dev \
|
||||
libssl-dev \
|
||||
&& \
|
||||
apt-get clean autoclean && \
|
||||
apt-get autoremove --purge -y && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
rm -f /var/cache/apt/archives/*.deb
|
||||
|
||||
# Install apt-get-install
|
||||
ADD https://raw.githubusercontent.com/guilhem/apt-get-install/master/apt-get-install /usr/bin/
|
||||
RUN chmod +x /usr/bin/apt-get-install
|
||||
|
||||
RUN adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
|
||||
|
||||
RUN set -x \
|
||||
&& if [ "${APT_PROXY}" ]; \
|
||||
then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy \
|
||||
; fi \
|
||||
# Install base OS packages to run Mayan EDMS
|
||||
&& DEBIAN_FRONTEND=noninteractive \
|
||||
apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
exiftool \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
gnupg1 \
|
||||
graphviz \
|
||||
libfuse2 \
|
||||
libmagic1 \
|
||||
libmariadbclient18 \
|
||||
libreoffice \
|
||||
libpq5 \
|
||||
poppler-utils \
|
||||
redis-server \
|
||||
sane-utils \
|
||||
sudo \
|
||||
supervisor \
|
||||
tesseract-ocr \
|
||||
# Remove make and build dependencies
|
||||
&& apt-get remove make libproxy-tools libreoffice-avmedia-backend-vlc libvlc-bin libvlc5 libvlccore9 adwaita-icon-theme gsettings-desktop-schemas libgstreamer-plugins-base1.0-0 -y \
|
||||
&& apt-get autoremove -y --purge \
|
||||
# Add mayan user
|
||||
&& adduser mayan --disabled-password --disabled-login --no-create-home --gecos "" \
|
||||
# Pillow can't find zlib or libjpeg on aarch64 (ODROID C2)
|
||||
RUN if [ "$(uname -m)" = "aarch64" ]; then \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ && \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
|
||||
; fi
|
||||
|
||||
&& if [ "$(uname -m)" = "aarch64" ]; then \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ \
|
||||
&& ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
|
||||
; fi \
|
||||
# Pillow can't find zlib or libjpeg on armv7l (ODROID HC1)
|
||||
RUN if [ "$(uname -m)" = "armv7l" ]; then \
|
||||
ln -s /usr/lib/arm-linux-gnueabihf/libz.so /usr/lib/ && \
|
||||
ln -s /usr/lib/arm-linux-gnueabihf/libjpeg.so /usr/lib/ \
|
||||
; fi
|
||||
|
||||
&& if [ "$(uname -m)" = "armv7l" ]; then \
|
||||
ln -s /usr/lib/arm-linux-gnueabihf/libz.so /usr/lib/ \
|
||||
&& ln -s /usr/lib/arm-linux-gnueabihf/libjpeg.so /usr/lib/ \
|
||||
; fi \
|
||||
# Discard data when Redis runs out of memory
|
||||
RUN echo "maxmemory-policy allkeys-lru" >> /etc/redis/redis.conf
|
||||
|
||||
&& echo "maxmemory-policy allkeys-lru" >> /etc/redis/redis.conf \
|
||||
# Disable saving the Redis database
|
||||
RUN echo "save \"\"" >> /etc/redis/redis.conf
|
||||
|
||||
echo "save \"\"" >> /etc/redis/redis.conf \
|
||||
# Only provision 1 database
|
||||
RUN echo "databases 1" >> /etc/redis/redis.conf
|
||||
&& echo "databases 1" >> /etc/redis/redis.conf
|
||||
|
||||
#####################
|
||||
# Build image start #
|
||||
#####################
|
||||
|
||||
FROM debian:9.4-slim as BUILDER_IMAGE
|
||||
####
|
||||
# BUILDER_IMAGE - This image buildS the Python package and is discarded afterwards
|
||||
####
|
||||
|
||||
ARG APT_PROXY
|
||||
# Package caching
|
||||
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
|
||||
# Reuse image
|
||||
FROM BASE_IMAGE as BUILDER_IMAGE
|
||||
|
||||
WORKDIR /code
|
||||
WORKDIR /src
|
||||
|
||||
COPY . /code
|
||||
# Copy the source files needed to build the Python package
|
||||
COPY --chown=mayan:mayan requirements /src/requirements
|
||||
COPY --chown=mayan:mayan \
|
||||
HISTORY.rst \
|
||||
LICENSE \
|
||||
MANIFEST.in \
|
||||
README.md \
|
||||
README.rst \
|
||||
setup.py \
|
||||
/src/
|
||||
|
||||
RUN apt-get update && apt-get install make python-dev python-pip -y
|
||||
COPY --chown=mayan:mayan mayan /src/mayan
|
||||
|
||||
RUN pip install -r requirements/build.txt
|
||||
# Install development packages needed to build the Python packages
|
||||
RUN DEBIAN_FRONTEND=noninteractive \
|
||||
apt-get install -y --no-install-recommends \
|
||||
default-libmysqlclient-dev \
|
||||
libffi-dev \
|
||||
libjpeg-dev \
|
||||
libpng-dev \
|
||||
libpq-dev \
|
||||
libtiff-dev \
|
||||
zlib1g-dev \
|
||||
libssl-dev \
|
||||
g++ \
|
||||
gcc \
|
||||
python-dev \
|
||||
python-virtualenv \
|
||||
&& mkdir -p "${PROJECT_INSTALL_DIR}" \
|
||||
&& chown -R mayan:mayan "${PROJECT_INSTALL_DIR}" \
|
||||
&& chown -R mayan:mayan /src
|
||||
|
||||
ENV LC_ALL C.UTF-8
|
||||
USER mayan
|
||||
RUN python -m virtualenv "${PROJECT_INSTALL_DIR}" \
|
||||
&& . "${PROJECT_INSTALL_DIR}/bin/activate" \
|
||||
&& pip install --no-cache-dir --no-use-pep517 \
|
||||
librabbitmq==1.6.1 \
|
||||
mysql-python==1.2.5 \
|
||||
psycopg2==2.7.3.2 \
|
||||
redis==2.10.6 \
|
||||
# psutil is needed by ARM builds otherwise gevent and gunicorn fail to start
|
||||
&& UNAME=`uname -m` && if [ "${UNAME#*arm}" != $UNAME ]; then \
|
||||
pip install --no-cache-dir --no-use-pep517 \
|
||||
psutil==5.6.2 \
|
||||
; fi \
|
||||
# Install the Python packages needed to build Mayan EDMS
|
||||
&& pip install --no-cache-dir --no-use-pep517 -r /src/requirements/build.txt \
|
||||
# Build Mayan EDMS
|
||||
&& python setup.py sdist \
|
||||
# Install the built Mayan EDMS package
|
||||
&& pip install --no-cache-dir --no-use-pep517 dist/mayan* \
|
||||
# Install the static content
|
||||
&& mayan-edms.py installjavascript \
|
||||
&& MAYAN_STATIC_ROOT=${PROJECT_INSTALL_DIR}/static mayan-edms.py preparestatic --link --noinput
|
||||
|
||||
RUN touch docker/Makefile
|
||||
COPY --chown=mayan:mayan requirements/testing-base.txt "${PROJECT_INSTALL_DIR}"
|
||||
|
||||
RUN make wheel
|
||||
|
||||
RUN chmod 777 dist -R
|
||||
|
||||
#####################
|
||||
# Final image start #
|
||||
#####################
|
||||
####
|
||||
# Final image - BASE_IMAGE + Mayan install directory from the builder image
|
||||
####
|
||||
|
||||
FROM BASE_IMAGE
|
||||
|
||||
RUN mkdir -p /opt
|
||||
COPY --from=BUILDER_IMAGE --chown=mayan:mayan "${PROJECT_INSTALL_DIR}/" "${PROJECT_INSTALL_DIR}/"
|
||||
|
||||
RUN python /usr/lib/python2.7/dist-packages/virtualenv.py $PROJECT_INSTALL_DIR
|
||||
USER root
|
||||
|
||||
WORKDIR $PROJECT_INSTALL_DIR
|
||||
COPY docker/rootfs /
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/dist/*.whl .
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/contrib/scripts/docker/run-tests.sh .
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/requirements/testing-base.txt requirements-testing.txt
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/docker/version .
|
||||
|
||||
# Fix ownership
|
||||
RUN chown -R mayan:mayan $PROJECT_INSTALL_DIR
|
||||
|
||||
# Install build Mayan EDMS
|
||||
RUN sudo -u mayan $PYTHON_PIP install --no-cache-dir --no-use-pep517 *.whl && \
|
||||
rm *.whl
|
||||
|
||||
# Install Python clients for librabbitmq, MySQL, PostgreSQL, REDIS
|
||||
RUN sudo -u mayan $PYTHON_PIP install --no-cache-dir --no-use-pep517 librabbitmq==1.6.1 mysql-python==1.2.5 psycopg2==2.7.3.2 redis==2.10.6
|
||||
|
||||
# Setup supervisor
|
||||
COPY docker/etc/supervisor/mayan.conf /etc/supervisor/conf.d
|
||||
|
||||
RUN mkdir /var/lib/mayan
|
||||
VOLUME ["/var/lib/mayan"]
|
||||
|
||||
COPY docker/entrypoint.sh /usr/local/bin/
|
||||
RUN ln -s usr/local/bin/entrypoint.sh / # backwards compat
|
||||
ENTRYPOINT ["entrypoint.sh"]
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["mayan"]
|
||||
|
||||
RUN rm /root/.cache -R
|
||||
RUN rm -rf /tmp/*
|
||||
|
||||
RUN apt-get -y autoremove --purge && apt-get -y autoclean && apt-get -y clean
|
||||
|
||||
RUN rm -rf /usr/share/man/*
|
||||
RUN rm -rf /usr/share/doc/*
|
||||
|
||||
RUN find /var/lib/apt -type f | xargs rm -f
|
||||
RUN find /var/cache -type f -exec rm -rf {} \;
|
||||
|
||||
RUN find /var/log -type f | while read f; do echo -ne '' > $f; done;
|
||||
RUN ${PROJECT_INSTALL_DIR}/bin/mayan-edms.py platformtemplate supervisord_docker > /etc/supervisor/conf.d/mayan.conf \
|
||||
&& apt-get clean autoclean \
|
||||
&& apt-get autoremove --purge -y \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -f /var/cache/apt/archives/*.deb \
|
||||
# Remove temporary files owned by root from the platformtemplate step
|
||||
&& rm /tmp/* \
|
||||
# Keep displaying log messages to stdout
|
||||
&& find /var/log -type f | while read f; do echo -ne '' > $f; done;
|
||||
|
||||
@@ -1,150 +0,0 @@
|
||||
# vim:set ft=dockerfile:
|
||||
|
||||
####################
|
||||
# Base image start #
|
||||
####################
|
||||
|
||||
FROM ubuntu:16.04 as BASE_IMAGE
|
||||
|
||||
MAINTAINER Roberto Rosario "roberto.rosario@mayan-edms.com"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
ENV LANG en_US.UTF-8
|
||||
ENV PROJECT_INSTALL_DIR=/usr/local/lib/python2.7/dist-packages/mayan
|
||||
|
||||
ARG APT_PROXY
|
||||
# Package caching
|
||||
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
|
||||
|
||||
# Install base Ubuntu libraries
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
g++ \
|
||||
gcc \
|
||||
gettext-base \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
graphviz \
|
||||
libffi-dev \
|
||||
libjpeg-dev \
|
||||
libmagic1 \
|
||||
libmysqlclient-dev \
|
||||
libpng-dev \
|
||||
libpq-dev \
|
||||
libreoffice \
|
||||
libtiff-dev \
|
||||
locales \
|
||||
netcat-openbsd \
|
||||
poppler-utils \
|
||||
python-dev \
|
||||
python-pip \
|
||||
python-setuptools \
|
||||
python-wheel \
|
||||
redis-server \
|
||||
supervisor \
|
||||
tesseract-ocr \
|
||||
zlib1g-dev \
|
||||
&& \
|
||||
apt-get clean autoclean && \
|
||||
apt-get autoremove --purge -y && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
rm -f /var/cache/apt/archives/*.deb
|
||||
|
||||
# Switch to UTF locale
|
||||
RUN echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
locale-gen en_US.UTF-8 && \
|
||||
update-locale LANG=en_US.UTF-8 && \
|
||||
export LC_ALL=en_US.UTF-8
|
||||
|
||||
# Install apt-get-install
|
||||
ADD https://raw.githubusercontent.com/guilhem/apt-get-install/master/apt-get-install /usr/bin/
|
||||
RUN chmod +x /usr/bin/apt-get-install
|
||||
|
||||
# Install Python clients for PostgreSQL, REDIS, librabbitmq
|
||||
RUN pip install psycopg2==2.7.3.2 redis==2.10.6 mysql-python==1.2.5 librabbitmq==1.6.1
|
||||
|
||||
RUN adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
|
||||
|
||||
# Pillow can't find zlib or libjpeg on aarch64
|
||||
RUN if [ "$(uname -m)" = "aarch64" ]; then \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ && \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
|
||||
; fi
|
||||
|
||||
#####################
|
||||
# Build image start #
|
||||
#####################
|
||||
|
||||
FROM python:2-alpine3.7 as BUILDER_IMAGE
|
||||
|
||||
WORKDIR /code
|
||||
|
||||
COPY . /code
|
||||
|
||||
RUN apk update && \
|
||||
apk add make
|
||||
|
||||
RUN pip install -r requirements/build.txt
|
||||
|
||||
RUN make wheel
|
||||
|
||||
RUN chmod 777 dist -R
|
||||
|
||||
#####################
|
||||
# Final image start #
|
||||
#####################
|
||||
|
||||
FROM BASE_IMAGE
|
||||
|
||||
WORKDIR /root/
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/dist/*.whl .
|
||||
|
||||
# Install build Mayan EDMS
|
||||
RUN pip install *.whl && \
|
||||
rm *.whl
|
||||
|
||||
# Setup supervisor
|
||||
#RUN mkdir /etc/supervisor.d/
|
||||
COPY docker/etc/supervisor/beat.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/gunicorn.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/redis.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/workers.conf /etc/supervisor/conf.d
|
||||
|
||||
# Create the directory for the logs
|
||||
RUN mkdir /var/log/mayan
|
||||
|
||||
# Fix ownership
|
||||
RUN chown -R mayan:mayan $PROJECT_INSTALL_DIR
|
||||
|
||||
# Allow flanker to autogenerate its PLY files
|
||||
RUN chown -R mayan:mayan /usr/local/lib/python2.7/dist-packages/flanker/
|
||||
|
||||
RUN mkdir /var/lib/mayan
|
||||
VOLUME ["/var/lib/mayan"]
|
||||
|
||||
COPY docker/entrypoint.sh /usr/local/bin/
|
||||
RUN ln -s usr/local/bin/entrypoint.sh / # backwards compat
|
||||
ENTRYPOINT ["entrypoint.sh"]
|
||||
|
||||
# Healthcheck setup
|
||||
HEALTHCHECK --interval=15s --timeout=1s --retries=20 \
|
||||
CMD curl -s -f http://localhost/authentication/login/ | grep 'form' > /dev/null || exit 1
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["mayan"]
|
||||
|
||||
RUN rm /root/.cache -R
|
||||
RUN rm -rf /tmp/*
|
||||
|
||||
RUN apt-get -y autoremove --purge && apt-get -y autoclean && apt-get -y clean
|
||||
|
||||
RUN rm -rf /usr/share/man/*
|
||||
RUN rm -rf /usr/share/doc/*
|
||||
|
||||
RUN find /var/lib/apt -type f | xargs rm -f
|
||||
RUN find /var/cache -type f -exec rm -rf {} \;
|
||||
|
||||
RUN find /var/log -type f | while read f; do echo -ne '' > $f; done;
|
||||
@@ -1,33 +1,25 @@
|
||||
APT_PROXY ?= `/sbin/ip route|awk '/docker0/ { print $$9 }'`:3142
|
||||
IMAGE_VERSION ?= `cat docker/version`
|
||||
IMAGE_VERSION ?= `cat docker/rootfs/version`
|
||||
CONSOLE_COLUMNS ?= `echo $$(tput cols)`
|
||||
CONSOLE_LINES ?= `echo $$(tput lines)`
|
||||
|
||||
docker-help:
|
||||
@echo
|
||||
@echo "**** Docker makefile ****"
|
||||
@echo "docker-build - Build a new image locally."
|
||||
@echo "docker-build-with-proxy - Build a new image locally using an APT proxy."
|
||||
@echo "docker-test-container - Build and run a test container."
|
||||
@echo "docker-test-cleanup - Delete the test container and the test volume."
|
||||
@echo "docker-test-all - Build and executed the test suite in a test container."
|
||||
@echo "docker-shell - Launch a bash instance inside a running container. Pass the container name via DOCKER_CONTAINER."
|
||||
|
||||
docker-build:
|
||||
docker-build: ## Build a new image locally.
|
||||
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile .
|
||||
|
||||
docker-build-with-proxy:
|
||||
docker-build-with-proxy: ## Build a new image locally using an APT proxy as APT_PROXY.
|
||||
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile --build-arg APT_PROXY=$(APT_PROXY) .
|
||||
|
||||
docker-shell:
|
||||
docker-shell: ## Launch a bash instance inside a running container. Pass the container name via DOCKER_CONTAINER.
|
||||
docker exec -e TERM=$(TERM) -e "COLUMNS=$(CONSOLE_COLUMNS)" -e "LINES=$(CONSOLE_LINES)" -it $(DOCKER_CONTAINER) /bin/bash
|
||||
|
||||
docker-test-container: ## Build and run a test container.
|
||||
docker-test-container: docker-build-with-proxy docker-test-cleanup
|
||||
docker run -d --name test-mayan-edms -p 80:8000 -v test-mayan_data:/var/lib/mayan mayanedms/mayanedms:$(DOCKER_VERSION)
|
||||
|
||||
docker-test-cleanup:
|
||||
docker-test-cleanup: ## Delete the test container and the test volume.
|
||||
@docker rm -f test-mayan-edms || true
|
||||
@docker volume rm test-mayan_data || true
|
||||
|
||||
docker-test-all: ## Build and executed the test suite in a test container.
|
||||
docker-test-all: docker-build-with-proxy
|
||||
docker run --rm run-tests
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Mayan EDMS is a free open source electronic document management system.
|
||||
554
docker/README.md
554
docker/README.md
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,80 +0,0 @@
|
||||
[program:mayan-gunicorn]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = /bin/bash -c "${MAYAN_GUNICORN_BIN} -w ${MAYAN_GUNICORN_WORKERS} mayan.wsgi --max-requests 500 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000 --env DJANGO_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE}" --timeout 120
|
||||
redirect_stderr = true
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
user = mayan
|
||||
|
||||
[program:redis]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = /bin/bash -c "if [ ${MAYAN_BROKER_URL} == ${MAYAN_DEFAULT_BROKER_URL} ] && [ ${MAYAN_CELERY_RESULT_BACKEND} == ${MAYAN_DEFAULT_CELERY_RESULT_BACKEND} ];then /usr/bin/redis-server /etc/redis/;fi"
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
user = root
|
||||
|
||||
[program:mayan-worker-fast]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = nice -n 1 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q converter,sources_fast -n mayan-worker-fast.%%h ${MAYAN_WORKER_FAST_CONCURRENCY}"
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-worker-medium]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = nice -n 18 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h ${MAYAN_WORKER_MEDIUM_CONCURRENCY}"
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-worker-slow]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = nice -n 19 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h ${MAYAN_WORKER_SLOW_CONCURRENCY}"
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-celery-beat]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = nice -n 1 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} beat --pidfile= -l ERROR"
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
stderr_logfile = /dev/fd/2
|
||||
stderr_logfile_maxbytes = 0
|
||||
stdout_logfile = /dev/fd/1
|
||||
stdout_logfile_maxbytes = 0
|
||||
startsecs = 10
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
@@ -4,7 +4,9 @@ set -e
|
||||
echo "mayan: starting entrypoint.sh"
|
||||
INSTALL_FLAG=/var/lib/mayan/system/SECRET_KEY
|
||||
CONCURRENCY_ARGUMENT=--concurrency=
|
||||
export DOCKER_ROOT=/opt/mayan-edms
|
||||
|
||||
DEFAULT_USER_UID=1000
|
||||
DEFAULT_USER_GUID=1000
|
||||
|
||||
export MAYAN_DEFAULT_BROKER_URL=redis://127.0.0.1:6379/0
|
||||
export MAYAN_DEFAULT_CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
|
||||
@@ -20,12 +22,18 @@ export MAYAN_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE:-mayan.settings.production}
|
||||
|
||||
export MAYAN_GUNICORN_BIN=${MAYAN_PYTHON_BIN_DIR}gunicorn
|
||||
export MAYAN_GUNICORN_WORKERS=${MAYAN_GUNICORN_WORKERS:-2}
|
||||
export MAYAN_GUNICORN_TIMEOUT=${MAYAN_GUNICORN_TIMEOUT:-120}
|
||||
export MAYAN_PIP_BIN=${MAYAN_PYTHON_BIN_DIR}pip
|
||||
export MAYAN_STATIC_ROOT=${MAYAN_INSTALL_DIR}/static
|
||||
|
||||
MAYAN_WORKER_FAST_CONCURRENCY=${MAYAN_WORKER_FAST_CONCURRENCY:-1}
|
||||
MAYAN_WORKER_MEDIUM_CONCURRENCY=${MAYAN_WORKER_MEDIUM_CONCURRENCY:-1}
|
||||
MAYAN_WORKER_SLOW_CONCURRENCY=${MAYAN_WORKER_SLOW_CONCURRENCY:-1}
|
||||
|
||||
echo "mayan: changing uid/guid"
|
||||
usermod mayan -u ${MAYAN_USER_UID:-${DEFAULT_USER_UID}}
|
||||
groupmod mayan -g ${MAYAN_USER_GUID:-${DEFAULT_USER_GUID}}
|
||||
|
||||
if [ "$MAYAN_WORKER_FAST_CONCURRENCY" -eq 0 ]; then
|
||||
MAYAN_WORKER_FAST_CONCURRENCY=
|
||||
else
|
||||
@@ -52,16 +60,30 @@ export PYTHONPATH=$PYTHONPATH:$MAYAN_MEDIA_ROOT
|
||||
|
||||
chown mayan:mayan /var/lib/mayan -R
|
||||
|
||||
initialize() {
|
||||
echo "mayan: initialize()"
|
||||
su mayan -c "${MAYAN_BIN} initialsetup --force"
|
||||
su mayan -c "${MAYAN_BIN} collectstatic --noinput --clear"
|
||||
apt_get_install() {
|
||||
apt-get -q update
|
||||
apt-get install -y --force-yes --no-install-recommends --auto-remove "$@"
|
||||
apt-get -q clean
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
}
|
||||
|
||||
upgrade() {
|
||||
echo "mayan: upgrade()"
|
||||
su mayan -c "${MAYAN_BIN} performupgrade"
|
||||
su mayan -c "${MAYAN_BIN} collectstatic --noinput --clear"
|
||||
initialize() {
|
||||
echo "mayan: initialize()"
|
||||
su mayan -c "${MAYAN_BIN} initialsetup --force --no-javascript"
|
||||
}
|
||||
|
||||
os_package_installs() {
|
||||
echo "mayan: os_package_installs()"
|
||||
if [ "${MAYAN_APT_INSTALLS}" ]; then
|
||||
DEBIAN_FRONTEND=noninteractive apt_get_install $MAYAN_APT_INSTALLS
|
||||
fi
|
||||
}
|
||||
|
||||
pip_installs() {
|
||||
echo "mayan: pip_installs()"
|
||||
if [ "${MAYAN_PIP_INSTALLS}" ]; then
|
||||
su mayan -c "${MAYAN_PIP_BIN} install $MAYAN_PIP_INSTALLS"
|
||||
fi
|
||||
}
|
||||
|
||||
start() {
|
||||
@@ -70,18 +92,9 @@ start() {
|
||||
exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
|
||||
}
|
||||
|
||||
os_package_installs() {
|
||||
echo "mayan: os_package_installs()"
|
||||
if [ "${MAYAN_APT_INSTALLS}" ]; then
|
||||
apt-get-install $MAYAN_APT_INSTALLS
|
||||
fi
|
||||
}
|
||||
|
||||
pip_installs() {
|
||||
echo "mayan: pip_installs()"
|
||||
if [ "${MAYAN_PIP_INSTALLS}" ]; then
|
||||
$MAYAN_PIP_BIN install $MAYAN_PIP_INSTALLS
|
||||
fi
|
||||
upgrade() {
|
||||
echo "mayan: upgrade()"
|
||||
su mayan -c "${MAYAN_BIN} performupgrade --no-javascript"
|
||||
}
|
||||
|
||||
os_package_installs || true
|
||||
@@ -106,7 +119,7 @@ run-tests) # Check if this is a new install, otherwise try to upgrade the existi
|
||||
else
|
||||
upgrade
|
||||
fi
|
||||
$DOCKER_ROOT/run-tests.sh
|
||||
run-tests.sh
|
||||
;;
|
||||
|
||||
*) su mayan -c "$@";
|
||||
10
docker/rootfs/usr/local/bin/run-tests.sh
Executable file
10
docker/rootfs/usr/local/bin/run-tests.sh
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends gcc python-dev tesseract-ocr-deu
|
||||
|
||||
su mayan -c "$MAYAN_PIP_BIN install -r ${MAYAN_INSTALL_DIR}/testing-base.txt"
|
||||
|
||||
su mayan -c "$MAYAN_BIN test --mayan-apps --settings=mayan.settings.testing"
|
||||
1
docker/rootfs/version
Executable file
1
docker/rootfs/version
Executable file
@@ -0,0 +1 @@
|
||||
3.2.3
|
||||
@@ -27,6 +27,6 @@ services:
|
||||
MAYAN_DATABASE_NAME: mayan
|
||||
MAYAN_DATABASE_PASSWORD: mayan-password
|
||||
MAYAN_DATABASE_USER: mayan
|
||||
MAYAN_DATABASE_CONN_MAX_AGE: 60
|
||||
MAYAN_DATABASE_CONN_MAX_AGE: 0
|
||||
volumes:
|
||||
- app:/var/lib/mayan
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
3.1.10
|
||||
5
docs/_static/css/custom.css
vendored
Normal file
5
docs/_static/css/custom.css
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
.menuselection {
|
||||
color: white;
|
||||
background: #2c3e50;
|
||||
padding: 3px;
|
||||
}
|
||||
@@ -59,6 +59,17 @@ App modules
|
||||
corresponding signal in the ready() method of the MayanAppConfig subclass in
|
||||
apps.py
|
||||
|
||||
- html_widgets.py
|
||||
|
||||
Classes to render an HTML widget. HTML widget are not the same as Django's
|
||||
native form widgets. Form widgets only work as part of a form field.
|
||||
HTML widgets are for use outside of forms, such as in a table cell.
|
||||
|
||||
- licenses.py
|
||||
|
||||
This module outlines the license text of the third party content used in
|
||||
the app. It could be other Python libraries, JavaScript libraries, etc.
|
||||
|
||||
- links.py
|
||||
|
||||
Defines the links to be used by the app. Import only from the navigation app
|
||||
@@ -92,6 +103,11 @@ App modules
|
||||
This module acts as a shared memory space for the other modules of the app or
|
||||
other apps.
|
||||
|
||||
- search.py
|
||||
|
||||
Search model definitions. Define which field of the app's models are
|
||||
searchable.
|
||||
|
||||
- serializers.py
|
||||
|
||||
Hold Django REST Framework serializers used by the api_views.py module.
|
||||
@@ -127,7 +143,7 @@ App modules
|
||||
|
||||
- widgets.py
|
||||
|
||||
HTML widgets go here. This should be the only place with presentation
|
||||
Custom form widgets go here. This should be the only place with presentation
|
||||
directives in the app (aside the templates).
|
||||
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ Example::
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres-new:/var/lib/postgresql/data \
|
||||
-d postgres:9.5
|
||||
-d postgres:9.6
|
||||
|
||||
docker exec -i mayan-edms-pg-new pg_restore -U mayan -d mayan < 2018-06-07_17-09-34.dump
|
||||
|
||||
|
||||
@@ -99,5 +99,5 @@ Direct install
|
||||
MAYAN_DATABASE_NAME=mayan,
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass,
|
||||
MAYAN_DATABASE_USER=mayan,
|
||||
MAYAN_DATABASE_CONN_MAX_AGE=360,
|
||||
MAYAN_DATABASE_CONN_MAX_AGE=0,
|
||||
<...>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -248,9 +248,6 @@ Special branches:
|
||||
``releases/python``
|
||||
Used by the continuous delivery system to trigger the build and release
|
||||
of a new Python package to PyPI.
|
||||
``releases/python``
|
||||
Used by the continuous delivery system to trigger the build and release
|
||||
of a new Python package to PyPI.
|
||||
``nightly``
|
||||
Used by the continuous delivery system to trigger the build and release
|
||||
of a new Docker image based on development code to the GitLab image
|
||||
@@ -482,7 +479,7 @@ Release checklist
|
||||
|
||||
make check-readme
|
||||
|
||||
#. Bump version in ``mayan/__init__.py`` and ``docker/version``::
|
||||
#. Bump version in ``mayan/__init__.py`` and ``docker/rootfs/version``::
|
||||
|
||||
make increase-version PART=<major, minor or micro>
|
||||
|
||||
|
||||
@@ -7,16 +7,23 @@ How to use this image
|
||||
|
||||
.. _docker_install:
|
||||
|
||||
Start a Mayan EDMS image
|
||||
------------------------
|
||||
Start a Mayan EDMS Docker image
|
||||
-------------------------------
|
||||
|
||||
With Docker properly installed, proceed to download the Mayan EDMS image using the command::
|
||||
With Docker properly installed, proceed to download the Mayan EDMS image using
|
||||
the command::
|
||||
|
||||
docker pull mayanedms/mayanedms:<version>
|
||||
|
||||
Then download version 9.5 of the Docker PostgreSQL image::
|
||||
Instead of a specific version tag you may use then generic ``:latest`` tag
|
||||
to the get latest version available automatically. If you use the ``:latest``
|
||||
tag here, remember to do so in the next steps also.::
|
||||
|
||||
docker pull postgres:9.5
|
||||
docker pull mayanedms/mayanedms:latest
|
||||
|
||||
Then download version 9.6 of the Docker PostgreSQL image::
|
||||
|
||||
docker pull postgres:9.6
|
||||
|
||||
Create and run a PostgreSQL container::
|
||||
|
||||
@@ -28,7 +35,7 @@ Create and run a PostgreSQL container::
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
|
||||
-d postgres:9.5
|
||||
-d postgres:9.6
|
||||
|
||||
The PostgreSQL container will have one database named ``mayan``, with an user
|
||||
named ``mayan`` too, with a password of ``mayanuserpass``. The container will
|
||||
@@ -36,9 +43,7 @@ expose its internal 5432 port (PostgreSQL's default port) via the host's
|
||||
5432 port. The data of this container will reside on the host's
|
||||
``/docker-volumes/mayan-edms/postgres`` folder.
|
||||
|
||||
Finally create and run a Mayan EDMS container. Change <version> with the
|
||||
latest version in numeric form (example: 2.7.3) or use the ``latest``
|
||||
identifier::
|
||||
Finally create and run a Mayan EDMS container::
|
||||
|
||||
docker run -d \
|
||||
--name mayan-edms \
|
||||
@@ -49,7 +54,7 @@ identifier::
|
||||
-e MAYAN_DATABASE_NAME=mayan \
|
||||
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
|
||||
-e MAYAN_DATABASE_USER=mayan \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:<version>
|
||||
|
||||
@@ -72,6 +77,7 @@ If another web server is running on port 80 use a different port in the
|
||||
|
||||
Using a dedicated Docker network
|
||||
--------------------------------
|
||||
|
||||
Use this method to avoid having to expose PostreSQL port to the host's network
|
||||
or if you have other PostgreSQL instances but still want to use the default
|
||||
port of 5432 for this installation.
|
||||
@@ -91,7 +97,7 @@ binding (``-p 5432:5432``)::
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
|
||||
-d postgres:9.5
|
||||
-d postgres:9.6
|
||||
|
||||
Launch the Mayan EDMS container with the network option and change the
|
||||
database hostname to the PostgreSQL container name (``mayan-edms-postgres``)
|
||||
@@ -107,10 +113,11 @@ instead of the IP address of the Docker host (``172.17.0.1``)::
|
||||
-e MAYAN_DATABASE_NAME=mayan \
|
||||
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
|
||||
-e MAYAN_DATABASE_USER=mayan \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:<version>
|
||||
|
||||
|
||||
Stopping and starting the container
|
||||
-----------------------------------
|
||||
|
||||
@@ -126,6 +133,7 @@ To start the container again::
|
||||
|
||||
.. _docker_environment_variables:
|
||||
|
||||
|
||||
Environment Variables
|
||||
---------------------
|
||||
|
||||
@@ -220,6 +228,10 @@ Optional. Allows loading an alternate settings file.
|
||||
Amount in seconds to keep a database connection alive. Allow reuse of database
|
||||
connections. For more information read the pertinent Django documentation
|
||||
page: :django-docs:`Settings, CONN_MAX_AGE <ref/settings/#conn-max-age>`
|
||||
According to new information Gunicorn's microthreads don't share connections
|
||||
and will exhaust the available Postgres connections available if a number
|
||||
other than 0 is used. Reference: https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq
|
||||
and https://github.com/benoitc/gunicorn/issues/996
|
||||
|
||||
``MAYAN_GUNICORN_WORKERS``
|
||||
|
||||
@@ -252,6 +264,19 @@ category. Default is 1. Use 0 to disable hardcoded concurrency and allow the
|
||||
Celery worker to launch its default number of child processes (equal to the
|
||||
number of CPUs detected).
|
||||
|
||||
``MAYAN_USER_UID``
|
||||
|
||||
Optional. Changes the UID of the ``mayan`` user internal to the Docker
|
||||
container. Defaults to 1000.
|
||||
|
||||
``MAYAN_USER_GUID``
|
||||
|
||||
Optional. Changes the GUID of the ``mayan`` user internal to the Docker
|
||||
container. Defaults to 1000.
|
||||
|
||||
|
||||
.. _docker-accessing-outside-data:
|
||||
|
||||
Accessing outside data
|
||||
======================
|
||||
|
||||
@@ -263,18 +288,21 @@ on purpose. For example, to make a folder in the host accessible as a watch
|
||||
folder, add the following to the Docker command line when starting the
|
||||
container::
|
||||
|
||||
-v /opt/scanned_files:/srv/watch_folder
|
||||
-v /opt/scanned_files:/scanned_files
|
||||
|
||||
The command line would look like this::
|
||||
|
||||
docker run ... -v /opt/scanned_files:/srv/watch_folder mayanedms/mayanedms:latest
|
||||
docker run ... -v /opt/scanned_files:/scanned_files mayanedms/mayanedms:latest
|
||||
|
||||
Now create a watch folder in Mayan EDMS using the path ``/srv/watch_folder``
|
||||
Now create a watch folder in Mayan EDMS using the path ``/scanned_files``
|
||||
and the documents from the host folder ``/opt/scanned_files`` will be
|
||||
automatically available. Use the same procedure to mount host folders to be
|
||||
used as staging folderes. In this example ``/srv/watch_folder`` was as the
|
||||
container directory, but any path can be used as long as it is not an
|
||||
already existing path or a path used by any other program.
|
||||
used as staging folders. In this example ``/scanned_files`` was used as the
|
||||
container directory, but any path can be used as long as:
|
||||
|
||||
- the path not an already existing path
|
||||
- the path is not used by any other program
|
||||
- the path is a single level path
|
||||
|
||||
|
||||
Performing backups
|
||||
@@ -285,7 +313,7 @@ For the example::
|
||||
|
||||
docker run -d --name mayan-edms --restart=always -p 80:8000 \
|
||||
-v /docker-volumes/mayan:/var/lib/mayan \
|
||||
-v /opt/scanned_files:/srv/watch_folder mayanedms/mayanedms:latest
|
||||
-v /opt/scanned_files:/scanned_files mayanedms/mayanedms:latest
|
||||
|
||||
That would be the ``/docker-volumes/mayan folder``::
|
||||
|
||||
@@ -297,6 +325,7 @@ too need to be backed up using their respective procedures. A simple solution
|
||||
is to copy the entire database container volume after the container has
|
||||
been stopped.
|
||||
|
||||
|
||||
Restoring from a backup
|
||||
=======================
|
||||
|
||||
@@ -304,6 +333,7 @@ Uncompress the backup archive in the original docker volume using::
|
||||
|
||||
sudo tar -xvzf backup.tar.gz -C /
|
||||
|
||||
|
||||
Upgrading
|
||||
=========
|
||||
|
||||
@@ -333,6 +363,7 @@ Start the container again with the new image version::
|
||||
|
||||
docker run -d --name mayan-edms --restart=always -p 80:8000 -v /docker-volumes/mayan:/var/lib/mayan mayanedms/mayanedms:latest
|
||||
|
||||
|
||||
Building the image
|
||||
==================
|
||||
|
||||
@@ -348,13 +379,14 @@ Execute Docker's build command using the provided makefile::
|
||||
|
||||
make docker-build
|
||||
|
||||
Or using an apt cacher to speed up the build::
|
||||
Or using an APT cache to speed up the build::
|
||||
|
||||
make docker-build-with-proxy APT_PROXY=172.17.0.1:3142
|
||||
|
||||
Replace the IP address `172.17.0.1` with the IP address of the computer
|
||||
running the APT proxy and caching service.
|
||||
|
||||
|
||||
Customizing the image
|
||||
=====================
|
||||
|
||||
@@ -379,6 +411,7 @@ Specifies a list of Python packages to be installed via ``pip``. Packages will
|
||||
be downloaded from the Python Package Index (https://pypi.python.org) by
|
||||
default.
|
||||
|
||||
|
||||
Using Docker compose
|
||||
====================
|
||||
|
||||
|
||||
@@ -68,5 +68,21 @@ type at a given moment, but if needed, the type of a document can be changed.
|
||||
Upon changing its type, the document will lose its previous settings and
|
||||
attributes, and will inherit the settings and attributes of its new type.
|
||||
|
||||
Document types are create in the
|
||||
:menuselection:`System --> Setup --> Document types` menu.
|
||||
|
||||
Creating document types
|
||||
=======================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create document types" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Create document type`.
|
||||
#. Enter a label to be shown to users when using this document type.
|
||||
#. Optional: Enter a period of time after which documents of this type will be moved to the trash.
|
||||
#. Optional: Select the unit of time for the period after which the document will be moved to the trash.
|
||||
#. Optional: Enter a period of time after which documents moved to the trash will be permanently deleted.
|
||||
#. Optional: Select the unit of time for the period of time after which the documents moved to the trash will be permanently deleted
|
||||
#. Press :guilabel:`Submit`.
|
||||
|
||||
@@ -5,22 +5,32 @@ Index examples
|
||||
Index of document types
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
- The "Create new document indexes" permission is required for this action.
|
||||
- The "Edit document indexes" permission is required for this action, globally
|
||||
of via an ACL for a document index.
|
||||
- The "Edit document types" permission is required for this action, globally
|
||||
of via an ACL for a document type.
|
||||
|
||||
|
||||
This index will create one level for each document type in the system and place
|
||||
links to the document of each respective type.
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Indexes` menu.
|
||||
#. Create a new index using :menuselection:`Actions --> Create new`.
|
||||
#. Create a new index using :guilabel:`Actions` > :guilabel:`Create new`.
|
||||
#. Give it a label to describe it, and an internal name. The internal name is
|
||||
used when referencing this index in other parts of the system.
|
||||
#. Press the :menuselection:`Template` link of the newly created index.
|
||||
#. Select :menuselection:`New child node` to create a new level in which the
|
||||
#. Press the :guilabel:`Template` link of the newly created index.
|
||||
#. Select :guilabel:`New child node` to create a new level in which the
|
||||
following template code will be entered.
|
||||
::
|
||||
|
||||
{{ document.document_type }}
|
||||
|
||||
#. Save the template.
|
||||
#. Go to :menuselection:`Document types` and associate this index with
|
||||
#. Click on :guilabel:`Document types` and associate this index with
|
||||
existing document types in the system.
|
||||
#. Finally go to :menuselection:`Tools --> Rebuild indexes` to execute the
|
||||
index template. The rebuild process is only necessary when changes are
|
||||
@@ -101,8 +111,8 @@ Index documents not found in any cabinet
|
||||
{% if document.cabinets.count == 0 %}No Cabinets{% endif %}
|
||||
|
||||
|
||||
Index untagged documents
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Index documents not tagged
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
::
|
||||
|
||||
{% if document.tags.count == 0 %}No Tags{% endif %}
|
||||
|
||||
@@ -6,7 +6,7 @@ The list of languages choices in the language dropdown used for documents is
|
||||
based on the current ISO 639 list. This list can be quite extensive. To reduce
|
||||
the number of languages available use the setting ``DOCUMENTS_LANGUAGE_CODES``,
|
||||
and set it to a nested list of abbreviations. This setting can be found in the
|
||||
:menuselection:`System --> Setup -> Settings -> Common` menu.
|
||||
:menuselection:`System --> Setup --> Settings --> Common` menu.
|
||||
|
||||
For example, to reduce the list to just English and Spanish use
|
||||
::
|
||||
|
||||
@@ -26,3 +26,74 @@ interpret and modify the value provided by the user to a conform to a specific
|
||||
format. An example of a provided parser is the date parser which will interpret
|
||||
and correct dates provided by users regardless of the format in which they are
|
||||
entered.
|
||||
|
||||
|
||||
Creating metadata types
|
||||
=======================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new metadata types" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Metadata types` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Create new`.
|
||||
#. Provide a name to reference this metadata type in other parts of the system.
|
||||
#. Enter a label to be shown to users when using this metadata type.
|
||||
#. Optional: Enter a default value for the metadata type.
|
||||
#. Optional: Provide a comma separated list of options to restrict the data entry
|
||||
when using this metadata type.
|
||||
#. Optional: Select a validator and a parser to validate and cleanup the data
|
||||
entry when not using a predetermined list of values.
|
||||
#. Press :guilabel:`Submit`.
|
||||
|
||||
|
||||
Assigning a metadata type to a document type
|
||||
============================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
- The "Edit metadata types" permission is required for this action, globally or
|
||||
via an ACL for a metadata type.
|
||||
- Also the "Edit document type" permission
|
||||
is required, globally or via an ACL for a document type.
|
||||
|
||||
|
||||
This action can be performed in two ways.
|
||||
|
||||
Option 1: Via the metadata type view
|
||||
------------------------------------
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Metadata types` menu.
|
||||
#. Click on the button :guilabel:`Document types` of the metadata type you which
|
||||
to associate.
|
||||
#. From the list of existing document types press either:
|
||||
|
||||
- :guilabel:`None` if this metadata type will not be available for documents
|
||||
of the type.
|
||||
- :guilabel:`Optional` if this metadata type will be available and is
|
||||
optional to provide a value for documents of the type.
|
||||
- :guilabel:`Required` if this metadata type will be available and is
|
||||
required to provide a value for documents of the type.
|
||||
|
||||
#. Press :guilabel:`Save`.
|
||||
|
||||
|
||||
Option 2: Via the document type view
|
||||
------------------------------------
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. Click on the button :guilabel:`Metadata types` of the metadata type you which
|
||||
to associate.
|
||||
#. From the list of existing metadata types press either:
|
||||
|
||||
- :guilabel:`None` if this metadata type will not be available for documents
|
||||
of the type.
|
||||
- :guilabel:`Optional` if this metadata type will be available and is
|
||||
optional to provide a value for documents of the type.
|
||||
- :guilabel:`Required` if this metadata type will be available and is
|
||||
required to provide a value for documents of the type.
|
||||
|
||||
#. Press :guilabel:`Save`.
|
||||
|
||||
70
docs/chapters/quick_labels.rst
Normal file
70
docs/chapters/quick_labels.rst
Normal file
@@ -0,0 +1,70 @@
|
||||
************
|
||||
Quick labels
|
||||
************
|
||||
|
||||
Quick labels are predetermined filenames that allow the quick renaming of
|
||||
documents as they are uploaded or after they have been uploaded.
|
||||
|
||||
Quick labels are added and associated to a document type.
|
||||
|
||||
Example of quick label: Invoice, Receipt from X store, Purchase order.
|
||||
|
||||
It is possible to preserve the file extension when using quick labels.
|
||||
Extensions are required for some operating system to be able to detect the
|
||||
correct file type to access the content.
|
||||
|
||||
For example if a document file is named "file0001.pdf" and the quick label
|
||||
"Receipt from X store" is applied, the resulting document label will be
|
||||
"Receipt from X store.pdf".
|
||||
|
||||
|
||||
Creating quick labels
|
||||
=====================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Edit document types" permission is required for this action, either
|
||||
globally or via an ACL for a document type.
|
||||
|
||||
|
||||
Since quick labels are associated with document types, creating quick labels
|
||||
must be done from the document type view.
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
|
||||
#. In the document type list, click on the :guilabel:`Quick labels` button of
|
||||
the document type for which you wish to create a quick label.
|
||||
#. In the view titled "Quick labels for document type: <your document type>",
|
||||
from the :guilabel:`Actions` dropdown select :guilabel:`Add quick label to document type`.
|
||||
#. At the quick label creation form enter the desired label and press :guilabel:`Save`.
|
||||
|
||||
|
||||
Using quick labels during upload
|
||||
================================
|
||||
|
||||
#. Use the new document upload wizard from :menuselection:`Documents --> New document`.
|
||||
#. Select a document type and navigate to the penultimate step, where you have
|
||||
the option to drag and drop files to upload.
|
||||
#. Select a an option from the :guilabel:`Quick document rename` dropdown.
|
||||
#. Optionally select the :guilabel:`Preserve extension` checkbox to keep the file
|
||||
extension.
|
||||
#. Upload your documents.
|
||||
|
||||
|
||||
Using quick labels for existing documents
|
||||
=========================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Edit document properties" permission is required for this action, either
|
||||
globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the document preview view of the document to rename. Make sure
|
||||
quick labels for the document type of the document select have been created.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Edit Properties`.
|
||||
#. Select a an option from the :guilabel:`Quick document rename` dropdown.
|
||||
#. Optionally select the :guilabel:`Preserve extension` checkbox to keep the file
|
||||
extension.
|
||||
#. Press :guilabel:`Save` to rename the document.
|
||||
@@ -6,15 +6,19 @@ The default installation method fits most use cases. If you use case requires
|
||||
more speed or capacity here are some suggestion that can help you improve the
|
||||
performance of your installation.
|
||||
|
||||
|
||||
Change the database manager
|
||||
===========================
|
||||
|
||||
Use PostgreSQL or MySQL as the database manager.
|
||||
Tweak the memory setting of the database manager to increase memory allocation.
|
||||
More PostgreSQL specific examples are available in their wiki page:
|
||||
https://wiki.postgresql.org/wiki/Performance_Optimization
|
||||
|
||||
|
||||
Increase the number of Gunicorn workers
|
||||
=======================================
|
||||
|
||||
The Gunicorn workers process HTTP requests and affect the speed at which the
|
||||
website responds.
|
||||
|
||||
@@ -33,6 +37,7 @@ And increase the value of the ``-w 2`` argument. This line is found in the
|
||||
|
||||
Background task processing
|
||||
==========================
|
||||
|
||||
The Celery workers are system processes that take care of the background
|
||||
tasks requested by the frontend interactions like document image rendering
|
||||
and periodic tasks like OCR. There are several dozen tasks defined in the code.
|
||||
@@ -45,37 +50,9 @@ low volume, medium duration tasks. It is not advisable to have the same
|
||||
worker processing OCR to process image rendering too. If the worker is
|
||||
processing several OCR tasks it will not be able to provide fast images
|
||||
when an user is browsing the user interface. This is why by default the
|
||||
queues are split into 3 workers: fast, medium, and slow.
|
||||
queues are split into 3 workers: fast, medium, and slow. Each worker will handle
|
||||
queues based on the latency required by each queue group.
|
||||
|
||||
The fast worker handles the queues:
|
||||
|
||||
* converter: Handles document page rendering
|
||||
* sources_fast: Does staging file image rendering
|
||||
|
||||
The medium worker handles the queues:
|
||||
|
||||
* checkouts_periodic: Scheduled tasks that check if a document's checkout
|
||||
period has expired
|
||||
* documents_periodic:
|
||||
* indexing: Does reindexing of documents in the background when their
|
||||
properties change
|
||||
* metadata:
|
||||
* sources:
|
||||
* sources_periodic: Checking email accounts and watch folders for new
|
||||
documents.
|
||||
* uploads: Processes files to turn the into Mayan documents. Processing
|
||||
encompasses MIME type detection, page count detection.
|
||||
* documents:
|
||||
|
||||
The slow worker handles the queues:
|
||||
|
||||
* mailing: Does the actual sending of documents via email as requested by
|
||||
users via the mailing profiles
|
||||
* tools: Executes in the background maintenance requests from the options
|
||||
in the tools menu
|
||||
* statistics: Recalculates statistics and charts
|
||||
* parsing: Parses documents to extract actual text content
|
||||
* ocr: Performs OCR to transcribe page images to text
|
||||
|
||||
Optimizations
|
||||
-------------
|
||||
@@ -88,15 +65,16 @@ Optimizations
|
||||
* By default each worker process uses 1 thread. You can increase the thread
|
||||
count of each worker process with the Docker environment options:
|
||||
|
||||
* MAYAN_WORKER_FAST_CONCURRENCY
|
||||
* MAYAN_WORKER_MEDIUM_CONCURRENCY
|
||||
* MAYAN_WORKER_SLOW_CONCURRENCY
|
||||
* ``MAYAN_WORKER_FAST_CONCURRENCY``
|
||||
* ``MAYAN_WORKER_MEDIUM_CONCURRENCY``
|
||||
* ``MAYAN_WORKER_SLOW_CONCURRENCY``
|
||||
|
||||
* If using direct deployment, increase the value of the --concurrency=1
|
||||
* If using direct deployment, increase the value of the ``--concurrency=1``
|
||||
argument of each worker in the supervisor file. You can also remove this
|
||||
argument and let the Celery algorithm choose the number of threads to
|
||||
launch. Usually this defaults to the number of CPU cores + 1.
|
||||
|
||||
|
||||
Change the message broker
|
||||
=========================
|
||||
Messages are the method of communication between front end interactive code
|
||||
@@ -127,11 +105,13 @@ calculation, these are stored for a while so that whoever requested the
|
||||
background task, is able retrieve the result. These results are stored in the
|
||||
result storage. By default a Redis server is launched inside the Mayan EDMS
|
||||
container. You can launch a separate Docker Redis container and tell the Mayan
|
||||
EDMS container to use this via the MAYAN_CELERY_RESULT_BACKEND environment
|
||||
EDMS container to use this via the ``MAYAN_CELERY_RESULT_BACKEND`` environment
|
||||
variable. The format of this variable is explained here: http://docs.celeryproject.org/en/3.1/configuration.html#celery-result-backend
|
||||
|
||||
|
||||
Deployment type
|
||||
===============
|
||||
|
||||
Docker provides a faster deployment and the overhead is not high on modern
|
||||
systems. It is however memory and CPU limited by default and you need to
|
||||
increase this limits. The settings to change the container resource limits
|
||||
@@ -140,8 +120,10 @@ are here: https://docs.docker.com/config/containers/resource_constraints/#limit-
|
||||
For the best performance possible use the advanced deployment method on a
|
||||
host dedicated to serving only Mayan EDMS.
|
||||
|
||||
|
||||
Storage
|
||||
=======
|
||||
|
||||
For best input and output speed use a block based local filesystem on an
|
||||
SSD drive for the ``/media`` sub folder. The location of the ``/media`` folder
|
||||
will be specified by the ``MEDIA_ROOT`` setting.
|
||||
@@ -149,8 +131,10 @@ will be specified by the ``MEDIA_ROOT`` setting.
|
||||
If capacity is your bottom line, switch to an
|
||||
:doc:`object storage <../chapters/object_storage>` system.
|
||||
|
||||
|
||||
Use additional hosts
|
||||
====================
|
||||
|
||||
When one host is not enough you can use multiple hosts and share the load.
|
||||
Make sure that all hosts share the ``/media`` folder as specified by the
|
||||
``MEDIA_ROOT`` setting, also the database, the broker, and the result storage.
|
||||
|
||||
@@ -11,6 +11,7 @@ signatures sections of a document.
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
|
||||
orientation = portrait
|
||||
span_width = 240;
|
||||
|
||||
|
||||
@@ -51,7 +51,29 @@ The current document sources supported are:
|
||||
web -> manual;
|
||||
}
|
||||
|
||||
Document source can be configure to allow document bundles to uploaded as
|
||||
Document sources can be configure to allow document bundles to uploaded as
|
||||
compressed files which are decompressed and their content uploaded as separate
|
||||
documents. This feature is useful when migrating from another document
|
||||
manager system.
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
If you deployed a Mayan EDMS Docker container and want to use watched folders
|
||||
or staging folder, refer to the Docker chapter :ref:`docker-accessing-outside-data`.
|
||||
|
||||
|
||||
Creating new sources
|
||||
====================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new document sources" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`System --> Setup --> Sources` menu.
|
||||
#. From the :guilabel:`Actions` dropdown select the new type of source to create.
|
||||
#. Each source type will have different fields to customize its behavior. Enter
|
||||
the required information in each field based on the help text provided.
|
||||
#. Press :guilabel:`Save`.
|
||||
|
||||
@@ -5,10 +5,6 @@ Tags are color coded properties that can be attached or removed from documents.
|
||||
Tags allow giving documents a binary property. Documents can also be tagged
|
||||
with more than one tag.
|
||||
|
||||
Tags are created from the :menuselection:`Tags --> Create` menu.
|
||||
|
||||
To view all created tags use the :menuselection:`Tags --> All` menu.
|
||||
|
||||
Once tagged, documents can be searched by their tags. It is also possible to
|
||||
show all the documents tagged with a particular
|
||||
tag via the **Documents** link of each tag.
|
||||
@@ -21,3 +17,30 @@ more tags to the document and another to remove tags from the document.
|
||||
It is also possible to tag documents in bulk by selecting several documents
|
||||
from any view that displays a list documents and selecting the **Attach tag**
|
||||
or **Remove tags** from the dropdown menu.
|
||||
|
||||
|
||||
Creating tags
|
||||
=============
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new tags" permission is required for this action.
|
||||
|
||||
|
||||
#. Go to the :menuselection:`Tags --> Create` menu.
|
||||
#. Enter a label to identify the tag.
|
||||
#. Select a color for the tag.
|
||||
#. Press :guilabel:`Submit`.
|
||||
|
||||
|
||||
View all tags
|
||||
=============
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "View tags" permission is required for this action, globally or via an
|
||||
ACL for a tag.
|
||||
|
||||
#. Go to the :menuselection:`Tags --> All` menu.
|
||||
|
||||
@@ -46,3 +46,35 @@ There is no limit to the number of versions a document can have.
|
||||
|
||||
By default, the last version will be showed when working with the document
|
||||
but any of the versions can be inspected and viewed.
|
||||
|
||||
|
||||
View a document version list
|
||||
============================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "View documents' versions list" permission is required for this action,
|
||||
either globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the select document's preview view.
|
||||
#. Click on the sibebar's :guilabel:`Versions` button.
|
||||
|
||||
|
||||
Uploading a new document version
|
||||
================================
|
||||
|
||||
.. admonition:: Permissions required
|
||||
:class: warning
|
||||
|
||||
The "Create new document versions" permission is required for this action,
|
||||
either globally or via an ACL for a document or document type.
|
||||
|
||||
|
||||
#. Navigate to the select document's versions list view.
|
||||
#. From the :guilabel:`Actions` dropdown select :guilabel:`Upload new version`.
|
||||
#. Optionally type a comment explaining the changes in the new version.
|
||||
#. Press the :guilabel:`Browse` button and select a new file.
|
||||
#. Press :guilabel:`Save` upload the new version.
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Workflows
|
||||
Introduction
|
||||
============
|
||||
|
||||
Workflows provide a structure method for storing a sequence of states over
|
||||
Workflows provide a structured method for storing a sequence of states over
|
||||
which the a document will progress. Workflows keep track how a document has
|
||||
been processed so far.
|
||||
|
||||
@@ -20,6 +20,36 @@ provide and order for the sequence of possible states changes.
|
||||
Transitions can be executed manually by users if they have the required access
|
||||
level as configure by the system administrator.
|
||||
|
||||
.. blockdiag::
|
||||
:caption: Example workflow. Circles represent states, rectangles represent transitions.
|
||||
|
||||
span_width = 30;
|
||||
|
||||
submitted [shape = circle, width = 60, height = 60];
|
||||
approved [shape = circle, width = 60, height = 60];
|
||||
rejected [shape = circle, width = 60, height = 60];
|
||||
archived [shape = circle, width = 60, height = 60];
|
||||
|
||||
approve [label = approve];
|
||||
reject [label = reject];
|
||||
reopen [label = "re-open"];
|
||||
|
||||
|
||||
submitted -> approve -> approved;
|
||||
approved -> archived;
|
||||
submitted -> reject -> rejected;
|
||||
rejected -> archived;
|
||||
archived -> reopen -> submitted;
|
||||
|
||||
|
||||
|
||||
Workflows in Mayan EDMS are implemented as finite state machines
|
||||
(https://en.wikipedia.org/wiki/Finite-state_machine).
|
||||
|
||||
Workflows are mainly used to represent business processes. But they can also be
|
||||
used an automation system to customized Mayan EDMS and have it perform some
|
||||
tasks automatically.
|
||||
|
||||
|
||||
Automation
|
||||
==========
|
||||
@@ -66,26 +96,18 @@ Implementation
|
||||
==============
|
||||
|
||||
Internally, workflows are implemented as a finite state machines
|
||||
(https://en.wikipedia.org/wiki/Finite-state_machine). And have the limitation
|
||||
that only one state can be the current active state for a workflow being
|
||||
executed. The other limitation of the current implementation is that every
|
||||
workflow needs at least one state marked as the initial state. These limitations
|
||||
are the result of a compromised in the design between flexibility and ease of
|
||||
use.
|
||||
(https://en.wikipedia.org/wiki/Finite-state_machine). To make them simpler to
|
||||
use, workflow have been designed so that only one state can be the current
|
||||
active state for a workflow being executed. Another design decision is that
|
||||
every workflow needs at least one state marked as the initial state.
|
||||
|
||||
|
||||
Visualizations
|
||||
==============
|
||||
|
||||
The graphical representation of a workflow (or a finite state machine style
|
||||
in Mayan EDMS's case) is similar to a flowchart. The states are represented
|
||||
with circles. The transitions are represented with arrows. Circle with a
|
||||
double border represent the initial state of the workflow.
|
||||
The graphical representation of a workflow is similar to a flowchart. The
|
||||
states are represented with circles. The transitions are represented with
|
||||
arrows. Circle with a double border represent the initial state of the workflow.
|
||||
|
||||
To view the graphical representations of workflow use **Preview** button of
|
||||
the workflow in the setup view.
|
||||
|
||||
|
||||
|
||||
We are working now on workflow transition trigger filters to have
|
||||
the trigger move the state of the workflow on certain conditions. For example: Attach a tag if there is a specific word found in the OCR text.
|
||||
|
||||
@@ -249,3 +249,6 @@ extlinks = {
|
||||
'https://gitlab.com/mayan-edms/mayan-edms/issues/%s', 'GitLab issue #'
|
||||
)
|
||||
}
|
||||
|
||||
def setup(app):
|
||||
app.add_stylesheet('css/custom.css')
|
||||
|
||||
@@ -21,12 +21,14 @@ repository for electronic documents.
|
||||
topics/installation
|
||||
releases/index
|
||||
topics/getting_started
|
||||
topics/adding_documents
|
||||
topics/access_control
|
||||
topics/categorization
|
||||
topics/collaboration
|
||||
topics/settings
|
||||
topics/storage
|
||||
topics/integration
|
||||
topics/docker
|
||||
topics/advanced
|
||||
topics/administration
|
||||
topics/troubleshooting
|
||||
|
||||
@@ -31,9 +31,9 @@ for Mayan EDMS. Most MERCs will be Feature MERCs.
|
||||
2. An **Informational** MERC describes a Mayan EDMS design issue, or
|
||||
provides general guidelines or information to the Mayan EDMS community,
|
||||
but does not propose a new feature. Informational MERCs do not
|
||||
necessarily represent a community consensus or
|
||||
recommendation, so users and implementers are free to ignore
|
||||
Informational MERCs or follow their advice.
|
||||
necessarily represent a community consensus or recommendation, so users
|
||||
and implementers are free to ignore Informational MERCs or follow their
|
||||
advice.
|
||||
|
||||
3. A **Process** MERC describes a process surrounding Mayan EDMS, or
|
||||
proposes a change to (or an event in) a process. Process MERCs are
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=====================
|
||||
====================
|
||||
MERC 2: Test writing
|
||||
=====================
|
||||
====================
|
||||
|
||||
:MERC: 2
|
||||
:Author: Michael Price
|
||||
|
||||
149
docs/mercs/0005-explicit-arguments.rst
Normal file
149
docs/mercs/0005-explicit-arguments.rst
Normal file
@@ -0,0 +1,149 @@
|
||||
==========================
|
||||
MERC 5: Explicit arguments
|
||||
==========================
|
||||
|
||||
:MERC: 5
|
||||
:Author: Roberto Rosario
|
||||
:Status: Accepted
|
||||
:Type: Feature
|
||||
:Created: 2018-12-30
|
||||
:Last-Modified: 2018-12-31
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes the adoption of a new methodology when performing calls.
|
||||
It seeks to reduce the use of positional arguments in favor of keyword
|
||||
arguments in as many places as possible.
|
||||
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
As the project grows, legibility of code becomes more important. Keyword
|
||||
argument help document the use of services, classes and functions. Refactors
|
||||
that affect the interface of services are also easier to find and update and
|
||||
fix. Positional argument can cause a call to continue working as long as the
|
||||
datatype of the argument remains the same. Usage of keyword arguments will
|
||||
automatically raise and error that will prevent such situations. Keyword
|
||||
argument further eliminate the relevance of position or the arguments, and
|
||||
the arguments can be sorted alphabetically for easier visual scanning or by
|
||||
semantic significance improving code readability.
|
||||
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
Adoption of this MERC will require an audit of existing calls and the use
|
||||
of the method proposed for new calls. Every call regardless of the type or
|
||||
origin of the source callable will name each argument used. By type it is
|
||||
meant: classes, functions, methods. Origin means: local from the project,
|
||||
from the framework, third party libraries or the standard library.
|
||||
|
||||
|
||||
Backwards Compatibility
|
||||
=======================
|
||||
|
||||
No backwards compatibility issues are expected. New errors arising from the use
|
||||
if keyword arguments could be interpreted as existing latent issues that
|
||||
have not been uncovered.
|
||||
|
||||
|
||||
Reference Implementation
|
||||
========================
|
||||
|
||||
Example:
|
||||
|
||||
Before:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from mayan.apps.common.classes import Template
|
||||
|
||||
Template(
|
||||
'menu_main', 'appearance/menu_main.html'
|
||||
)
|
||||
|
||||
|
||||
After:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from mayan.apps.common.classes import Template
|
||||
|
||||
Template(
|
||||
name='menu_main', template_name='appearance/menu_main.html'
|
||||
)
|
||||
|
||||
|
||||
When calls use a mixture or positional and keyword arguments, the keywords
|
||||
arguments can only be found after the positional arguments. Complete use
|
||||
of keyword arguments allow the reposition of arguments for semantic
|
||||
purposes.
|
||||
|
||||
Example:
|
||||
|
||||
Before:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from django.conf.urls import url
|
||||
|
||||
from .views import AboutView, HomeView, RootView
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', RootView.as_view(), name='root'),
|
||||
url(r'^home/$', HomeView.as_view(), name='home'),
|
||||
url(r'^about/$', AboutView.as_view(), name='about_view'),
|
||||
]
|
||||
|
||||
|
||||
After:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from django.conf.urls import url
|
||||
|
||||
from .views import AboutView, HomeView, RootView
|
||||
|
||||
urlpatterns = [
|
||||
url(regex=r'^$', name='root', view=RootView.as_view()),
|
||||
url(regex=r'^home/$', name='home', view=HomeView.as_view()),
|
||||
url(regex=r'^about/$', name='about_view', view=AboutView.as_view()),
|
||||
]
|
||||
|
||||
|
||||
Keyword arguments should also be used for callables that pass those to others
|
||||
down the line like Django's ``reverse`` function. Any change to the name of
|
||||
the ``pk`` URL parameter will raise an exception in this code alerting to
|
||||
any possible incompatible use.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse(
|
||||
viewname='documents:document_preview', kwargs={'pk': self.pk}
|
||||
)
|
||||
|
||||
|
||||
This becomes even more important when multiple URL parameters are used. Since
|
||||
the API documentation is auto generated from the code itself, it would make
|
||||
sense to rename the first URL parameter from ``pk`` to ``document_pk``. Such
|
||||
change will cause all address to view resolutions to break forcing their
|
||||
update and allowing all consumers' interface usage to remain synchronized to the
|
||||
callable's interface.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
url(
|
||||
regex=r'^documents/(?P<pk>[0-9]+)/versions/(?P<document_version_pk>[0-9]+)/pages/(?P<document_page_pk>[0-9]+)/image/$',
|
||||
name='documentpage-image', view=APIDocumentPageImageView.as_view()
|
||||
),
|
||||
81
docs/mercs/0006-lower-information-disclose.rst
Normal file
81
docs/mercs/0006-lower-information-disclose.rst
Normal file
@@ -0,0 +1,81 @@
|
||||
==================================
|
||||
MERC 6: Lower information disclose
|
||||
==================================
|
||||
|
||||
:MERC: 6
|
||||
:Author: Michael Price
|
||||
:Status: Accepted
|
||||
:Type: Feature
|
||||
:Created: 2018-12-30
|
||||
:Last-Modified: 2018-12-31
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes the use of errors that don't disclose the existence of a
|
||||
resource in the event that the requester doesn't have the required credentials.
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
When an user tries to perform an action like opening a view to a document for
|
||||
which the required permission is missing, a permission required or access
|
||||
denied error is presented. This is semantically correct, but from the stand
|
||||
point of security it is still failing because it is letting the user know
|
||||
that such document exists in the first place. This MERC proposes changing the
|
||||
error message for existing resource to one that doesn't divulge any information
|
||||
to unauthorized parties, like "Not Found".
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
Out of the 4 basic CRUD operations, Read, Update and Delete should return an
|
||||
HTTP 404 error instead of an HTTP 403 error. Only the Create operation will
|
||||
continue returning the current HTTP 403 error, unless it is creating a
|
||||
new resource that is related to an existing resource.
|
||||
|
||||
Since most view use the internal custom CRUD classes making a change to the
|
||||
``ObjectPermissionCheckMixin`` class to raise an HTTP 404 on object access
|
||||
failure will fulfill the proposal of this MERC.
|
||||
|
||||
Adding the ``object_permission_raise_404`` class attribute and setting it
|
||||
to default to False will allow fulfilling the goal of this MERC while
|
||||
keeping the existing functionality intact.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class ObjectPermissionCheckMixin(object):
|
||||
"""
|
||||
If object_permission_raise_404 is True an HTTP 404 error will be raised
|
||||
instead of the normal 403.
|
||||
"""
|
||||
object_permission = None
|
||||
object_permission_raise_404 = False
|
||||
|
||||
def get_permission_object(self):
|
||||
return self.get_object()
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if self.object_permission:
|
||||
try:
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=self.object_permission, user=request.user,
|
||||
obj=self.get_permission_object(),
|
||||
related=getattr(self, 'object_permission_related', None)
|
||||
)
|
||||
except PermissionDenied:
|
||||
if self.object_permission_raise_404:
|
||||
raise Http404
|
||||
else:
|
||||
raise
|
||||
|
||||
return super(
|
||||
ObjectPermissionCheckMixin, self
|
||||
).dispatch(request, *args, **kwargs)
|
||||
@@ -20,6 +20,8 @@ Accepted
|
||||
../mercs/0001-merc-process
|
||||
../mercs/0002-test-writing
|
||||
../mercs/0003-using-javascript-libraries
|
||||
../mercs/0005-explicit-arguments
|
||||
../mercs/0006-lower-information-disclose
|
||||
|
||||
Draft
|
||||
-----
|
||||
@@ -49,3 +51,5 @@ Feature
|
||||
|
||||
../mercs/0002-test-writing
|
||||
../mercs/0003-using-javascript-libraries
|
||||
../mercs/0005-explicit-arguments
|
||||
../mercs/0006-lower-information-disclose
|
||||
|
||||
@@ -63,5 +63,5 @@ Changes needed:
|
||||
the Role model's permissions many to many field.
|
||||
4. Update the ``AccessControlList`` models roles field to point to the group
|
||||
models.
|
||||
5. Update the role checks in the ``check_access`` and ``filter_by_access``
|
||||
5. Update the role checks in the ``check_access`` and ``restrict_queryset``
|
||||
``AccessControlList`` model manager methods.
|
||||
|
||||
@@ -17,11 +17,11 @@ Version 0.11
|
||||
* Added a view to delete the document image cache, useful when switching
|
||||
converter backends or doing diagnostics.
|
||||
* Added South to the requirements.
|
||||
* Merged documents' filename and extension database fiels into a single
|
||||
* Merged documents' filename and extension database fields into a single
|
||||
filename field, filename are store as uploaded not manipulation is done
|
||||
Users with existing data must install South and run the appropiate
|
||||
Users with existing data must install South and run the appropriate
|
||||
migrate commands::
|
||||
|
||||
|
||||
$ pip install -r requirements/production.txt
|
||||
$ ./manager syncdb
|
||||
$ ./manage.py migrate documents 0001 --fake
|
||||
@@ -30,5 +30,5 @@ Version 0.11
|
||||
* Added new office document mimetype
|
||||
* application/vnd.ms-office
|
||||
* Fixed documents not saving the file encoding
|
||||
* Removed extra slash in ajax-loader.gif URL fixes #15, thanks to
|
||||
* Removed extra slash in ajax-loader.gif URL fixes #15, thanks to
|
||||
IHLeanne for finding this one
|
||||
|
||||
119
docs/releases/3.2.1.rst
Normal file
119
docs/releases/3.2.1.rst
Normal file
@@ -0,0 +1,119 @@
|
||||
Version 3.2.1
|
||||
=============
|
||||
|
||||
Released: June 14, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Fix sub cabinet creation view. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report.
|
||||
- Add PostgreSQL troubleshooting entry. Closes GitLab
|
||||
issues #523 and #602
|
||||
- Use YAML SafeDumper to avoid adding YAML datatype tags.
|
||||
Closes GitLab issue #599. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report and debug information.
|
||||
- Add check for app references and point users to release notes for details.
|
||||
GitLab issue #603. Thanks to Vikas Kedia (@vikaskedia) for the report.
|
||||
- Remove sidebar floar right.
|
||||
Fixed GitLab issue #600. Thanks to Frédéric Sheedy
|
||||
(@fsheedy) for the report and debug information.
|
||||
- Collapse sidebar on small screen
|
||||
Display sidebar at the bottom of the screen on small displays.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.1
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`523` PostgreSQL error about insufficient connections
|
||||
- :gitlab-issue:`599` Settings display !!python/unicode with values since 3.2
|
||||
- :gitlab-issue:`600` Layout broken if we change locale, since 3.2
|
||||
- :gitlab-issue:`601` Error when creating new cabinet level
|
||||
- :gitlab-issue:`602` System stops responding for a minute every 10 minutes or so
|
||||
- :gitlab-issue:`603` ImportError: No module named appearance
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
109
docs/releases/3.2.2.rst
Normal file
109
docs/releases/3.2.2.rst
Normal file
@@ -0,0 +1,109 @@
|
||||
Version 3.2.2
|
||||
=============
|
||||
|
||||
Released: June 19, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Fix document type change view. Closes GitLab issue #614.
|
||||
Thanks to Christoph Roeder (@brightdroid) for the report.
|
||||
- Fix document parsing tool view typo. Closes GitLab issue #615.
|
||||
Thanks to Tyler Page (@iamtpage) for the report.
|
||||
- Update the task_check_interval_source reference
|
||||
GitLab issue #617. Thanks to Lukas Gill (@lukkigi) for
|
||||
the report and debug information.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.2
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`614` change type exception
|
||||
- :gitlab-issue:`615` TypeError: success() got an unexpected keyword argument 'requrest'
|
||||
- :gitlab-issue:`617` Watcher Task not running
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
114
docs/releases/3.2.3.rst
Normal file
114
docs/releases/3.2.3.rst
Normal file
@@ -0,0 +1,114 @@
|
||||
Version 3.2.3
|
||||
=============
|
||||
|
||||
Released: June 21, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Add support for disabling the random primary key
|
||||
test mixin.
|
||||
- Fix mailing profile log columns mappings.
|
||||
GitLab issue #626. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report.
|
||||
- Fix the Django SMTP backend username field name.
|
||||
GitLab issue #625. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report and the research.
|
||||
- Increase the Django STMP username.
|
||||
GitLab issue #625. Thanks to Jesaja Everling (@jeverling)
|
||||
for the report and the research.
|
||||
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.1
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`619` poplib.POP3_SSL and poplib.POP3 initialized with wrong kwarg
|
||||
- :gitlab-issue:`625` mayan.apps.mailer.mailers.DjangoSMTP uses "user", but django.core.mail.backends.smtp.EmailBackend expects "username"
|
||||
- :gitlab-issue:`626` Mailing profile error log is empty, despite errors
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
103
docs/releases/3.2.4.rst
Normal file
103
docs/releases/3.2.4.rst
Normal file
@@ -0,0 +1,103 @@
|
||||
Version 3.2.4
|
||||
=============
|
||||
|
||||
Released: June XX, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
- Support configurable GUnicorn timeouts. Defaults to
|
||||
current value of 120 seconds.
|
||||
- Fix help text of the platformtemplate command.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.2.3
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Make a backup of your supervisord file::
|
||||
|
||||
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
|
||||
|
||||
Update the supervisord configuration file. Replace the environment
|
||||
variables values show here with your respective settings. This step will refresh
|
||||
the supervisord configuration file with the new queues and the latest
|
||||
recommended layout::
|
||||
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Edit the supervisord configuration file and update any setting the template
|
||||
generator missed::
|
||||
|
||||
vi /etc/supervisor/conf.d/mayan.conf
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py preparestatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
- None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
- :gitlab-issue:`628` mailbox.user in POP3Email gets passed keyword argument, but only accepts "user" or positional argument
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
877
docs/releases/3.2.rst
Normal file
877
docs/releases/3.2.rst
Normal file
File diff suppressed because it is too large
Load Diff
@@ -20,6 +20,11 @@ versions of the documentation contain the release notes for any later releases.
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
3.2.4
|
||||
3.2.3
|
||||
3.2.2
|
||||
3.2.1
|
||||
3.2
|
||||
3.1.11
|
||||
3.1.10
|
||||
3.1.9
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
Archlinux
|
||||
archlinux
|
||||
adf
|
||||
ajax
|
||||
ajaxForm
|
||||
@@ -141,6 +143,7 @@ storages
|
||||
Storages
|
||||
subclasses
|
||||
subclassing
|
||||
subfolder
|
||||
sublicense
|
||||
sublicensees
|
||||
swedish
|
||||
@@ -173,3 +176,15 @@ YaN
|
||||
yasg
|
||||
YbN
|
||||
YrcN
|
||||
metacopy
|
||||
overlayfs
|
||||
sys
|
||||
supervisord
|
||||
Monkeypatch
|
||||
Bootswatch
|
||||
sortable
|
||||
Odroid
|
||||
callables
|
||||
ModelPermission
|
||||
mixins
|
||||
kwargs
|
||||
|
||||
5
docs/topics/adding_documents.rst
Normal file
5
docs/topics/adding_documents.rst
Normal file
@@ -0,0 +1,5 @@
|
||||
################
|
||||
Adding documents
|
||||
################
|
||||
|
||||
.. include:: ../chapters/sources.rst
|
||||
@@ -8,3 +8,4 @@ Advanced topics
|
||||
.. include:: ../chapters/metadata.rst
|
||||
.. include:: ../chapters/transformations.rst
|
||||
.. include:: ../chapters/versioning.rst
|
||||
.. include:: ../chapters/quick_labels.rst
|
||||
|
||||
@@ -7,10 +7,12 @@ allows showing users different views of document groups. These are divided
|
||||
into ones requiring manual maintenance and others that are updated
|
||||
automatically.
|
||||
|
||||
|
||||
**************
|
||||
Manual methods
|
||||
**************
|
||||
|
||||
.. include:: ../chapters/document_types.rst
|
||||
.. include:: ../chapters/cabinets.rst
|
||||
.. include:: ../chapters/tags.rst
|
||||
|
||||
|
||||
8
docs/topics/docker.rst
Normal file
8
docs/topics/docker.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
######
|
||||
Docker
|
||||
######
|
||||
|
||||
Docker is a container technology. Containers are a standard unit of software
|
||||
that packages up code and all its dependencies.
|
||||
|
||||
.. include:: ../chapters/docker.rst
|
||||
@@ -6,6 +6,88 @@ FAQ
|
||||
Non technical
|
||||
*************
|
||||
|
||||
Contact
|
||||
=======
|
||||
|
||||
Can I contact members of the development team?
|
||||
----------------------------------------------
|
||||
|
||||
Direct access to members of the development team is reserved for clients
|
||||
of a support or consultation contract.
|
||||
|
||||
|
||||
I can't pay for support/consultation
|
||||
------------------------------------
|
||||
|
||||
A community forum is available at https://forum.mayan-edms.com. Members of
|
||||
the development team visit the forum on occasions and might answer some
|
||||
questions on a voluntary basis.
|
||||
|
||||
|
||||
I found a bug
|
||||
-------------
|
||||
|
||||
For bugs, open an issue at https://gitlab.com/mayan-edms/mayan-edms/issues.
|
||||
|
||||
|
||||
I found a security issue
|
||||
------------------------
|
||||
|
||||
Open an issue at https://gitlab.com/mayan-edms/mayan-edms/issues and mark it as
|
||||
Confidential. Allow us at least 48 hours to find and release a fix
|
||||
for the issue before submitting it to the CVE database.
|
||||
|
||||
|
||||
I want to join the development team
|
||||
-----------------------------------
|
||||
|
||||
Perfect! We need all the help we can get. Tell us where we can see what you've
|
||||
done using Mayan EDMS. It could be a fork, a new UI, an API client, a custom app,
|
||||
or anything else that you think will be able to evidence your dominion over the
|
||||
codebase.
|
||||
|
||||
|
||||
I submitted an issue and it has not been fixed
|
||||
----------------------------------------------
|
||||
|
||||
There are many reason an issue might not get resolved and remain open for an
|
||||
extended period of time. We document on the issue itself the progress and when
|
||||
resolved will reference what commit fixed it and the version or approximate time
|
||||
for the code to make it into a production release. Some reason why issues remain
|
||||
open with no resolution are:
|
||||
|
||||
- It was not an issue with the code. It happens that sometimes the problem lies
|
||||
with the operating system, the filesystem being used, the platform or packaging
|
||||
method.
|
||||
- It was not an issue but a question or a comment. The issue system is for reporting
|
||||
problems with the code. That said, we sometimes answer questions submitted as
|
||||
issues. For questions or discussions use the community forum.
|
||||
- We are not able to reproduce the issue. We need to be able to recreate the
|
||||
conditions that trigger the issue so that we can pinpoint the cause. After that
|
||||
we create a test to make sure the issue is really fixed. Some issues can
|
||||
be triggered manually easily but are hard to trigger programatically.
|
||||
- The issue is not clearly explained. Issue descriptions like: "It doesn't work",
|
||||
or "It showed an error but I forgot to write it down" are almost impossible to
|
||||
resolve.
|
||||
- We understand the cause of the problem but don't yet a solution to implement.
|
||||
We have studied the issue and have been able to reproduce it, but have not
|
||||
reached a consensus on how it should be fixed. Could be that the solution is
|
||||
beyond the collective expertise of the development team or that a design
|
||||
decision of big impact is needed before code changes can be implemented.
|
||||
- The issue is no real. The issue might be for an obsolete version. It could be
|
||||
for a fork or a program that is not developed by us. Sometimes they are just
|
||||
fake issues.
|
||||
|
||||
|
||||
I submitted a merge request and has not been merged
|
||||
---------------------------------------------------
|
||||
|
||||
Merge requests must follow the development standards of the code as close a
|
||||
possible. They must also be atomic and as small as possible. The code must also
|
||||
not change the behavior of the project. We can't accept merge request that
|
||||
customize it in some way based on your own preferences or needs.
|
||||
|
||||
|
||||
Distribution
|
||||
============
|
||||
|
||||
@@ -44,6 +126,7 @@ Restricting distribution or sale would conflict with the license terms. This
|
||||
would possible for a commercial version of Mayan EDMS with separate licensing
|
||||
terms.
|
||||
|
||||
|
||||
Is there a commercial partnership program?
|
||||
------------------------------------------
|
||||
|
||||
@@ -84,17 +167,6 @@ upgrades, if a migration fails the database structure is left in a transitory
|
||||
state and has to be reverted manually before trying again.
|
||||
|
||||
|
||||
Document versions
|
||||
=================
|
||||
|
||||
How do you upload a new version of an existing file?
|
||||
----------------------------------------------------
|
||||
|
||||
Choose a document, and go to the versions tab, on the right menu at the bottom
|
||||
under Other available action there is Upload new version. Clicking it will
|
||||
take you to a very similar view as the Upload new document but you will be
|
||||
able to specify version number and comments for the new version being uploaded.
|
||||
|
||||
LDAP
|
||||
====
|
||||
|
||||
@@ -105,6 +177,7 @@ A sample settings file called ldap_connection_settings.py is included in the
|
||||
contrib/settings/ folder of the repository showing how to setup LDAP
|
||||
authentication.
|
||||
|
||||
|
||||
Operating systems
|
||||
=================
|
||||
|
||||
@@ -148,20 +221,24 @@ Django's development server doesn't serve static files unless the DEBUG option
|
||||
is set to True, this mode of operation should only be used for development or
|
||||
testing. For production deployments the management command::
|
||||
|
||||
$ mayan-edms.py collectstatic
|
||||
$ mayan-edms.py preparestatic
|
||||
|
||||
should be used and the resulting static folder served from a webserver.
|
||||
For more information check the
|
||||
:django-docs:`howto/static-files/`
|
||||
|
||||
Watchfolders
|
||||
============
|
||||
|
||||
Watch folders
|
||||
=============
|
||||
|
||||
The watched folder feature is not working
|
||||
-----------------------------------------
|
||||
|
||||
Make sure that the Celery BEAT scheduler is running correctly as it is the
|
||||
element that triggers the periodics tasks.
|
||||
element that triggers the periodic tasks. Check that the user running the Mayan
|
||||
EDMS services has read and write permissions for the watch folder.
|
||||
|
||||
|
||||
|
||||
Other
|
||||
=====
|
||||
@@ -188,8 +265,3 @@ Example::
|
||||
|
||||
Reference:
|
||||
* http://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html
|
||||
|
||||
Can you change the display order of documents…i.e can they be in alphabetical order?
|
||||
------------------------------------------------------------------------------------
|
||||
|
||||
A the moment no, but it is something being worked on.
|
||||
|
||||
@@ -4,6 +4,19 @@ Getting started
|
||||
|
||||
These are the basic concepts you need to understand to start using Mayan EDMS.
|
||||
|
||||
The absolute minimum setup to start using Mayan EDMS is:
|
||||
|
||||
#. A document type
|
||||
#. A document source to add new documents
|
||||
|
||||
that's it!
|
||||
|
||||
To make things even easier, a default document type (named "Default") and a
|
||||
default document source (also named "Default") were created for you during the
|
||||
installation. So you don't need to do anything more to start adding documents
|
||||
right now, however take your time reading the information below to get a deeper
|
||||
understanding about how these concepts work.
|
||||
|
||||
.. include:: ../chapters/document_types.rst
|
||||
.. include:: ../chapters/sources.rst
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ Minimum hardware requirements
|
||||
|
||||
- 2 Gigabytes of RAM (1 Gigabyte if OCR is turned off).
|
||||
- Multiple core CPU (64 bit, faster than 1 GHz recommended).
|
||||
- Unix-like operating system like Linux and OpenBSD. For other operating systems
|
||||
- Unix-like operating system like GNU/Linux. For other operating systems
|
||||
user container technologies like Docker or virtual machines.
|
||||
|
||||
****************
|
||||
|
||||
@@ -7,8 +7,8 @@ Troubleshooting
|
||||
Database
|
||||
********
|
||||
|
||||
_mysql_exceptions. OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci, IMPLICIT) and (utf8_general_ci, COERCIBLE) for operation ‘='”)
|
||||
=========================================================================================================================================================
|
||||
MySQL error: ``OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci, IMPLICIT) and (utf8_general_ci, COERCIBLE) for operation '='”)``
|
||||
=======================================================================================================================================================
|
||||
|
||||
::
|
||||
|
||||
@@ -25,8 +25,8 @@ References:
|
||||
* http://stackoverflow.com/questions/1073295/django-character-set-with-mysql-weirdness
|
||||
|
||||
|
||||
Incorrect string value: ``'xE2x80x95rs6…'`` for column ``'content'`` at row 1
|
||||
=============================================================================
|
||||
MySQL error: ``Incorrect string value: `'xE2x80x95rs6…'` for column `'content'` at row 1``
|
||||
==========================================================================================
|
||||
|
||||
When using MySQL and doing OCR on languages other than English
|
||||
|
||||
@@ -39,13 +39,31 @@ References:
|
||||
* http://markmail.org/message/bqajx2utvmtriixi
|
||||
|
||||
|
||||
Error "django.db.utils.IntegrityError IntegrityError: (1452, ‘Cannot add or update a child row: a foreign key constraint fails (`…`.`…`, CONSTRAINT `…_refs_id_b0252274` FOREIGN KEY (`…`) REFERENCES `…` (`…`))')
|
||||
==================================================================================================================================================================================================================
|
||||
MySQL error: ``Error "django.db.utils.IntegrityError IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`…`.`…`, CONSTRAINT `…_refs_id_b0252274` FOREIGN KEY (`…`) REFERENCES `…` (`…`))')``
|
||||
===================================================================================================================================================================================================================================
|
||||
|
||||
Solution:
|
||||
Convert all MySQL tables to the same type, either all MyISAM or InnoDB
|
||||
|
||||
|
||||
PostgreSQL error: ``OperationalError: FATAL: sorry, too many clients already``
|
||||
===============================================================================
|
||||
|
||||
Set ``MAYAN_DATABASE_CONN_MAX_AGE`` to 0
|
||||
|
||||
This setting keeps a database connection alive. It allows reuse of database
|
||||
connections. When Mayan EDMS is deployed with Gunicorn a microthreads backend,
|
||||
the database connections are not shared and this setting has the reverse effect
|
||||
of exhausting the available PostgreSQL connections available. To avoid this,
|
||||
Setting ``MAYAN_DATABASE_CONN_MAX_AGE`` to 0 will cause all microthreads to
|
||||
release their connections, by closing them when finished.
|
||||
|
||||
References:
|
||||
|
||||
- https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq
|
||||
- https://github.com/benoitc/gunicorn/issues/996
|
||||
|
||||
|
||||
******
|
||||
Docker
|
||||
******
|
||||
@@ -72,15 +90,81 @@ References:
|
||||
Passwords
|
||||
*********
|
||||
|
||||
Missing initial credentials or admin password reset
|
||||
===================================================
|
||||
.. _troubleshooting-admin-password:
|
||||
|
||||
First you need to know the name of the Docker container running Mayan EDMS
|
||||
on your setup with::
|
||||
Admin password reset
|
||||
====================
|
||||
|
||||
To reset the password of the admin account use the following command::
|
||||
|
||||
MAYAN_MEDIA_ROOT=<your Mayan media root setting> <installation directory>/bin/mayan-edms.py changepassword admin
|
||||
|
||||
If you followed the deploying instructions from the documentation your
|
||||
``MAYAN_MEDIA_ROOT`` will be ``/opt/mayan-edms/media``.
|
||||
|
||||
If using a Docker image, execute the command inside the container. First you
|
||||
need to know the name of the Docker container running Mayan EDMS on your setup
|
||||
with::
|
||||
|
||||
docker ps
|
||||
|
||||
Then execute the password reset command inside the Docker container::
|
||||
|
||||
docker exec -ti <your docker container name> /opt/mayan-edms/bin/mayan-edms.py changepassword admin
|
||||
|
||||
Another way to do this is to execute a shell inside the container to get a
|
||||
command prompt::
|
||||
|
||||
docker exec -ti <your docker container name> /bin/bash
|
||||
|
||||
And then execute the command::
|
||||
|
||||
/opt/mayan-edms/bin/mayan-edms.py changepassword admin
|
||||
|
||||
|
||||
.. _troubleshooting-autoadmin-account:
|
||||
|
||||
Missing automatic admin account after installation
|
||||
==================================================
|
||||
|
||||
This is caused when the ``initialsetup`` command is interrupted as the admin
|
||||
user is created outside of the database migrations.
|
||||
|
||||
To create an admin super user account manually use the command::
|
||||
|
||||
MAYAN_MEDIA_ROOT=<your Mayan media root setting> <installation directory>/bin/mayan-edms.py createsuperuser
|
||||
|
||||
If you followed the deploying instructions from the documentation your
|
||||
``MAYAN_MEDIA_ROOT`` will be ``/opt/mayan-edms/media``.
|
||||
|
||||
If using a Docker image, execute the command inside the container. First
|
||||
find you container name with::
|
||||
|
||||
docker ps
|
||||
|
||||
Then execute the command inside the container::
|
||||
|
||||
docker exec -ti <your docker container name> /opt/mayan-edms/bin/mayan-edms.py createsuperuser
|
||||
|
||||
Another way to do this is to execute a shell inside the container to get a
|
||||
command prompt::
|
||||
|
||||
docker exec -ti <your docker container name> /bin/bash
|
||||
|
||||
And then execute the command::
|
||||
|
||||
/opt/mayan-edms/bin/mayan-edms.py createsuperuser
|
||||
|
||||
|
||||
************
|
||||
Watchfolders
|
||||
************
|
||||
|
||||
Incomplete files uploaded
|
||||
=========================
|
||||
|
||||
To avoid uploading files are they are being copied to the watchfolder, copy the
|
||||
files to a temporary directory on the same partition as the watchfolder first.
|
||||
Then move the files to the watchfolder. The move will be executed as an atomic
|
||||
operation and will prevent the files to be uploaded in the middle of the
|
||||
copying process.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright 2011-2018 Roberto Rosario
|
||||
Copyright 2011 Roberto Rosario
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
__title__ = 'Mayan EDMS'
|
||||
__version__ = '3.1.10'
|
||||
__build__ = 0x030110
|
||||
__build_string__ = 'v3.1.10-1-g51ea493a26_Thu Apr 4 22:03:19 2019 -0400'
|
||||
__version__ = '3.2.3'
|
||||
__build__ = 0x030203
|
||||
__build_string__ = 'v3.2.3_Fri Jun 21 00:01:37 2019 -0400'
|
||||
__django_version__ = '1.11'
|
||||
__author__ = 'Roberto Rosario'
|
||||
__author_email__ = 'roberto.rosario@mayan-edms.com'
|
||||
__description__ = 'Free Open Source Electronic Document Management System'
|
||||
__license__ = 'Apache 2.0'
|
||||
__copyright_short__ = '2011-2018 Roberto Rosario'
|
||||
__copyright_short__ = '2011 Roberto Rosario'
|
||||
__copyright__ = '{} {}'.format('Copyright', __copyright_short__)
|
||||
__website__ = 'https://www.mayan-edms.com'
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .classes import ModelPermission # NOQA
|
||||
|
||||
default_app_config = 'acls.apps.ACLsApp'
|
||||
default_app_config = 'mayan.apps.acls.apps.ACLsApp'
|
||||
|
||||
@@ -21,12 +21,12 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
"""
|
||||
def get_content_object(self):
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
klass=ContentType, app_label=self.kwargs['app_label'],
|
||||
model=self.kwargs['model']
|
||||
)
|
||||
|
||||
content_object = get_object_or_404(
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
klass=content_type.model_class(), pk=self.kwargs['object_id']
|
||||
)
|
||||
|
||||
if self.request.method == 'GET':
|
||||
@@ -35,8 +35,8 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
permission_required = permission_acl_edit
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_required, user=self.request.user,
|
||||
obj=content_object
|
||||
obj=content_object, permissions=(permission_required,),
|
||||
user=self.request.user
|
||||
)
|
||||
|
||||
return content_object
|
||||
@@ -62,7 +62,9 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
if not self.request:
|
||||
return None
|
||||
|
||||
return super(APIObjectACLListView, self).get_serializer(*args, **kwargs)
|
||||
return super(APIObjectACLListView, self).get_serializer(
|
||||
*args, **kwargs
|
||||
)
|
||||
|
||||
def get_serializer_class(self):
|
||||
if self.request.method == 'GET':
|
||||
@@ -85,17 +87,17 @@ class APIObjectACLView(generics.RetrieveDestroyAPIView):
|
||||
permission_required = permission_acl_edit
|
||||
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
klass=ContentType, app_label=self.kwargs['app_label'],
|
||||
model=self.kwargs['model']
|
||||
)
|
||||
|
||||
content_object = get_object_or_404(
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
klass=content_type.model_class(), pk=self.kwargs['object_id']
|
||||
)
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_required, user=self.request.user,
|
||||
obj=content_object
|
||||
obj=content_object, permissions=(permission_required,),
|
||||
user=self.request.user
|
||||
)
|
||||
|
||||
return content_object
|
||||
@@ -111,22 +113,27 @@ class APIObjectACLPermissionListView(generics.ListCreateAPIView):
|
||||
"""
|
||||
def get_acl(self):
|
||||
return get_object_or_404(
|
||||
self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
klass=self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
)
|
||||
|
||||
def get_content_object(self):
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
klass=ContentType, app_label=self.kwargs['app_label'],
|
||||
model=self.kwargs['model']
|
||||
)
|
||||
|
||||
content_object = get_object_or_404(
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
klass=content_type.model_class(), pk=self.kwargs['object_id']
|
||||
)
|
||||
|
||||
if self.request.method == 'GET':
|
||||
permission = permission_acl_view
|
||||
else:
|
||||
permission = permission_acl_edit
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_acl_view, user=self.request.user,
|
||||
obj=content_object
|
||||
obj=content_object, permissions=(permission,),
|
||||
user=self.request.user
|
||||
)
|
||||
|
||||
return content_object
|
||||
@@ -147,7 +154,9 @@ class APIObjectACLPermissionListView(generics.ListCreateAPIView):
|
||||
return WritableAccessControlListPermissionSerializer
|
||||
|
||||
def get_serializer_context(self):
|
||||
context = super(APIObjectACLPermissionListView, self).get_serializer_context()
|
||||
context = super(
|
||||
APIObjectACLPermissionListView, self
|
||||
).get_serializer_context()
|
||||
if self.kwargs:
|
||||
context.update(
|
||||
{
|
||||
@@ -168,22 +177,27 @@ class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
|
||||
|
||||
def get_acl(self):
|
||||
return get_object_or_404(
|
||||
self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
klass=self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
)
|
||||
|
||||
def get_content_object(self):
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
klass=ContentType, app_label=self.kwargs['app_label'],
|
||||
model=self.kwargs['model']
|
||||
)
|
||||
|
||||
content_object = get_object_or_404(
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
klass=content_type.model_class(), pk=self.kwargs['object_id']
|
||||
)
|
||||
|
||||
if self.request.method == 'GET':
|
||||
permission = permission_acl_view
|
||||
else:
|
||||
permission = permission_acl_edit
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_acl_view, user=self.request.user,
|
||||
obj=content_object
|
||||
obj=content_object, permissions=(permission,),
|
||||
user=self.request.user
|
||||
)
|
||||
|
||||
return content_object
|
||||
@@ -192,7 +206,9 @@ class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
|
||||
return self.get_acl().permissions.all()
|
||||
|
||||
def get_serializer_context(self):
|
||||
context = super(APIObjectACLPermissionView, self).get_serializer_context()
|
||||
context = super(
|
||||
APIObjectACLPermissionView, self
|
||||
).get_serializer_context()
|
||||
if self.kwargs:
|
||||
context.update(
|
||||
{
|
||||
|
||||
@@ -2,35 +2,56 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common import MayanAppConfig, menu_object, menu_sidebar
|
||||
from navigation import SourceColumn
|
||||
from mayan.apps.common.apps import MayanAppConfig
|
||||
from mayan.apps.common.menus import menu_object, menu_secondary
|
||||
from mayan.apps.events.classes import ModelEventType
|
||||
from mayan.apps.events.links import (
|
||||
link_events_for_object, link_object_event_types_user_subcriptions_list
|
||||
)
|
||||
from mayan.apps.navigation.classes import SourceColumn
|
||||
|
||||
from .classes import ModelPermission
|
||||
from .events import event_acl_created, event_acl_edited
|
||||
from .links import link_acl_create, link_acl_delete, link_acl_permissions
|
||||
|
||||
|
||||
class ACLsApp(MayanAppConfig):
|
||||
app_namespace = 'acls'
|
||||
app_url = 'acls'
|
||||
has_rest_api = True
|
||||
has_tests = True
|
||||
name = 'acls'
|
||||
name = 'mayan.apps.acls'
|
||||
verbose_name = _('ACLs')
|
||||
|
||||
def ready(self):
|
||||
super(ACLsApp, self).ready()
|
||||
from actstream import registry
|
||||
|
||||
AccessControlList = self.get_model('AccessControlList')
|
||||
AccessControlList = self.get_model(model_name='AccessControlList')
|
||||
|
||||
SourceColumn(
|
||||
source=AccessControlList, label=_('Role'), attribute='role'
|
||||
ModelEventType.register(
|
||||
event_types=(event_acl_created, event_acl_edited),
|
||||
model=AccessControlList
|
||||
)
|
||||
|
||||
ModelPermission.register_inheritance(
|
||||
model=AccessControlList, related='content_object',
|
||||
)
|
||||
|
||||
SourceColumn(
|
||||
source=AccessControlList, label=_('Permissions'),
|
||||
attribute='get_permission_titles'
|
||||
attribute='role', is_sortable=True, source=AccessControlList,
|
||||
)
|
||||
|
||||
menu_object.bind_links(
|
||||
links=(link_acl_permissions, link_acl_delete),
|
||||
links=(
|
||||
link_acl_permissions, link_acl_delete,
|
||||
link_events_for_object,
|
||||
link_object_event_types_user_subcriptions_list
|
||||
),
|
||||
sources=(AccessControlList,)
|
||||
)
|
||||
menu_sidebar.bind_links(
|
||||
menu_secondary.bind_links(
|
||||
links=(link_acl_create,), sources=('acls:acl_list',)
|
||||
)
|
||||
|
||||
registry.register(AccessControlList)
|
||||
|
||||
@@ -1,16 +1,24 @@
|
||||
from __future__ import unicode_literals, absolute_import
|
||||
|
||||
import itertools
|
||||
import logging
|
||||
|
||||
from django.apps import apps
|
||||
from django.utils.encoding import force_text
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ModelPermission(object):
|
||||
_registry = {}
|
||||
_proxies = {}
|
||||
_functions = {}
|
||||
_inheritances = {}
|
||||
_registry = {}
|
||||
|
||||
@classmethod
|
||||
def deregister(cls, model):
|
||||
cls._registry.pop(model, None)
|
||||
# TODO: Find method to revert the add_to_class('acls'...)
|
||||
# delattr doesn't work.
|
||||
|
||||
@classmethod
|
||||
def register(cls, model, permissions):
|
||||
@@ -24,7 +32,9 @@ class ModelPermission(object):
|
||||
app_label='acls', model_name='AccessControlList'
|
||||
)
|
||||
|
||||
model.add_to_class('acls', GenericRelation(AccessControlList))
|
||||
model.add_to_class(
|
||||
name='acls', value=GenericRelation(AccessControlList)
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def get_classes(cls, as_content_type=False):
|
||||
@@ -45,8 +55,21 @@ class ModelPermission(object):
|
||||
return cls._registry.keys()
|
||||
|
||||
@classmethod
|
||||
def get_for_class(cls, klass):
|
||||
return cls._registry.get(klass, ())
|
||||
def get_for_class(cls, klass, as_choices=False):
|
||||
if as_choices:
|
||||
results = []
|
||||
|
||||
for namespace, permissions in itertools.groupby(cls.get_for_class(klass=klass, as_choices=False), lambda entry: entry.namespace):
|
||||
permission_options = [
|
||||
(force_text(permission.pk), permission) for permission in permissions
|
||||
]
|
||||
results.append(
|
||||
(namespace, permission_options)
|
||||
)
|
||||
|
||||
return results
|
||||
else:
|
||||
return cls._registry.get(klass, ())
|
||||
|
||||
@classmethod
|
||||
def get_for_instance(cls, instance):
|
||||
@@ -61,24 +84,23 @@ class ModelPermission(object):
|
||||
if class_permissions:
|
||||
permissions.extend(class_permissions)
|
||||
|
||||
proxy = cls._proxies.get(type(instance))
|
||||
|
||||
if proxy:
|
||||
permissions.extend(cls._registry.get(proxy))
|
||||
|
||||
pks = [
|
||||
permission.stored_permission.pk for permission in set(permissions)
|
||||
]
|
||||
return StoredPermission.objects.filter(pk__in=pks)
|
||||
|
||||
@classmethod
|
||||
def register_proxy(cls, source, model):
|
||||
cls._proxies[model] = source
|
||||
|
||||
@classmethod
|
||||
def register_inheritance(cls, model, related):
|
||||
cls._inheritances[model] = related
|
||||
def get_function(cls, model):
|
||||
return cls._functions[model]
|
||||
|
||||
@classmethod
|
||||
def get_inheritance(cls, model):
|
||||
return cls._inheritances[model]
|
||||
|
||||
@classmethod
|
||||
def register_function(cls, model, function):
|
||||
cls._functions[model] = function
|
||||
|
||||
@classmethod
|
||||
def register_inheritance(cls, model, related):
|
||||
cls._inheritances[model] = related
|
||||
|
||||
16
mayan/apps/acls/events.py
Normal file
16
mayan/apps/acls/events.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from mayan.apps.events.classes import EventTypeNamespace
|
||||
|
||||
namespace = EventTypeNamespace(
|
||||
label=_('Access control lists'), name='acls'
|
||||
)
|
||||
|
||||
event_acl_created = namespace.add_event_type(
|
||||
label=_('ACL created'), name='acl_created'
|
||||
)
|
||||
event_acl_edited = namespace.add_event_type(
|
||||
label=_('ACL edited'), name='acl_edited'
|
||||
)
|
||||
17
mayan/apps/acls/forms.py
Normal file
17
mayan/apps/acls/forms.py
Normal file
@@ -0,0 +1,17 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from mayan.apps.common.forms import FilteredSelectionForm
|
||||
|
||||
from .models import AccessControlList
|
||||
|
||||
|
||||
class ACLCreateForm(FilteredSelectionForm, forms.ModelForm):
|
||||
class Meta:
|
||||
field_name = 'role'
|
||||
fields = ('role',)
|
||||
label = _('Role')
|
||||
model = AccessControlList
|
||||
widget_attributes = {'class': 'select2'}
|
||||
@@ -1,6 +1,12 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from appearance.classes import Icon
|
||||
from mayan.apps.appearance.classes import Icon
|
||||
from mayan.apps.permissions.icons import icon_permission
|
||||
|
||||
icon_acl_delete = Icon(driver_name='fontawesome', symbol='times')
|
||||
icon_acl_list = Icon(driver_name='fontawesome', symbol='lock')
|
||||
icon_acl_new = Icon(driver_name='fontawesome', symbol='plus')
|
||||
icon_acl_new = Icon(
|
||||
driver_name='fontawesome-dual', primary_symbol='lock',
|
||||
secondary_symbol='plus'
|
||||
)
|
||||
icon_acl_permissions = icon_permission
|
||||
|
||||
@@ -3,9 +3,11 @@ from __future__ import unicode_literals
|
||||
from django.apps import apps
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from navigation import Link
|
||||
from mayan.apps.navigation.classes import Link
|
||||
|
||||
from .icons import icon_acl_list, icon_acl_new
|
||||
from .icons import (
|
||||
icon_acl_delete, icon_acl_list, icon_acl_new, icon_acl_permissions
|
||||
)
|
||||
from .permissions import permission_acl_view, permission_acl_edit
|
||||
|
||||
|
||||
@@ -27,22 +29,22 @@ def get_kwargs_factory(variable_name):
|
||||
return get_kwargs
|
||||
|
||||
|
||||
link_acl_delete = Link(
|
||||
args='resolved_object.pk', permissions=(permission_acl_edit,),
|
||||
permissions_related='content_object', tags='dangerous', text=_('Delete'),
|
||||
view='acls:acl_delete',
|
||||
)
|
||||
link_acl_list = Link(
|
||||
icon_class=icon_acl_list, kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list'
|
||||
)
|
||||
link_acl_create = Link(
|
||||
icon_class=icon_acl_new, kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_edit,), text=_('New ACL'),
|
||||
view='acls:acl_create'
|
||||
)
|
||||
link_acl_permissions = Link(
|
||||
args='resolved_object.pk', permissions=(permission_acl_edit,),
|
||||
permissions_related='content_object', text=_('Permissions'),
|
||||
view='acls:acl_permissions',
|
||||
link_acl_delete = Link(
|
||||
args='resolved_object.pk', icon_class=icon_acl_delete,
|
||||
permissions=(permission_acl_edit,), tags='dangerous', text=_('Delete'),
|
||||
view='acls:acl_delete'
|
||||
)
|
||||
link_acl_list = Link(
|
||||
icon_class=icon_acl_list, kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list'
|
||||
)
|
||||
link_acl_permissions = Link(
|
||||
args='resolved_object.pk', icon_class=icon_acl_permissions,
|
||||
permissions=(permission_acl_edit,),
|
||||
text=_('Permissions'), view='acls:acl_permissions'
|
||||
)
|
||||
|
||||
Binary file not shown.
@@ -7,9 +7,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2019-03-16 22:48+0000\n"
|
||||
"Last-Translator: Yaman Sanobar <yman.snober@gmail.com>\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/ar/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -17,52 +17,61 @@ msgstr ""
|
||||
"Language: ar\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Access control lists"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "الصلاحيات"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "حذف"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "حذف"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "الصلاحيات"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "لا شيء"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Access control lists"
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
msgstr "Edit ACLs"
|
||||
@@ -71,112 +80,124 @@ msgstr "Edit ACLs"
|
||||
msgid "View ACLs"
|
||||
msgstr "View ACLs"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Roles"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/language/bg/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,52 +17,61 @@ msgstr ""
|
||||
"Language: bg\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Контролни списъци за достъп"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Разрешения"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Разрешения"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr "достъп вписване"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr "достъп вписвания"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "Няма"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Контролни списъци за достъп"
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
msgstr "Редактиране на контролни списъци за достъп"
|
||||
@@ -71,112 +80,124 @@ msgstr "Редактиране на контролни списъци за до
|
||||
msgid "View ACLs"
|
||||
msgstr "Преглед на контролни списъци за достъп"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Роли"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/rosarior/mayan-edms/language/bs_BA/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,51 +18,60 @@ msgstr ""
|
||||
"Language: bs_BA\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Liste kontrole pristupa (ACLs)"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr "Uloga"
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Dozvole"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "Obriši"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr "Novi ACL"
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "Obriši"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Dozvole"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Nedovoljan pristup za:%s"
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr "Pristupni unos"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr "Pristupni unosi"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Pristup \"%(permissions)s\" za ulogu \"%(role)s\" za \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "Nijedno"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Liste kontrole pristupa (ACLs)"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Uloga \"%(role)s\" dozvole za \"%(object)s\""
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
@@ -72,112 +81,124 @@ msgstr "Izmjeniti ACLs"
|
||||
msgid "View ACLs"
|
||||
msgstr "Pregledati ACLs"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr "API URL ukazujući na listu dozvola za ovu listu kontrole pristupa."
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr "URL API koji ukazuje na dozvolu u vezi sa listom kontrole pristupa kojoj je priložena. Ova URL adresa se razlikuje od kanonskog URL-a za radni tok."
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr "Primarni ključ za novu dozvolu za dodjelu listi kontrole pristupa."
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr "Nema takve dozvole: %s"
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr "Lista odvojenih primarnih ključeva za razdvajanje sa komandom dodeljuje se ovoj listi kontrola pristupa."
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr "Primarni ključevi uloge na koje se ova lista kontrole pristupa vezuje."
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr "Nove kontrole pristupa za:%s"
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "Obriši ACL:%s"
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr "Liste kontrole pristupa (ACL) za: %s"
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr "Dostupne dozvole"
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr "Dodjeljene dozvole"
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr "Dostupne dozvole"
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Uloga \"%(role)s\" dozvole za \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Dozvole za onesposobljavanje su nasledjene od roditeljskog objekta."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr "Tip objekta"
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "Tip objekta za koji će se pristup mijenjati."
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr "ID objekta"
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr "Numerički identifikator objekta za koji će se pristup mijenjati."
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Role"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "Uloge čiji će pristup biti modifikovan."
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr "Dozvole za dodeljivanje / poništavanje / od uloge za gore izabrani objekat."
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr "Dodjeljen pristup"
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr "Opozvati pristup"
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -3,13 +3,14 @@
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# Jiri Fait <fait@orkasolutions.cz>, 2019
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2019-01-17 19:28+0000\n"
|
||||
"Last-Translator: Jiri Fait <fait@orkasolutions.cz>\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Czech (http://www.transifex.com/rosarior/mayan-edms/language/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -17,50 +18,59 @@ msgstr ""
|
||||
"Language: cs\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "Odstranit"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "Odstranit"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Práva"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: permissions.py:10
|
||||
@@ -71,112 +81,124 @@ msgstr ""
|
||||
msgid "View ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -8,9 +8,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2018-11-12 14:13+0000\n"
|
||||
"Last-Translator: Rasmus Kierudsen <tebrasso@gmail.com>\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Danish (Denmark) (http://www.transifex.com/rosarior/mayan-edms/language/da_DK/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -18,50 +18,59 @@ msgstr ""
|
||||
"Language: da_DK\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "ACL'er"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr "Rolle"
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Tilladelser"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "Slet"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr "Ny ACL"
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "Slet"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Tilladelser"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Utilstækkelig adgang for: %s"
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Tilladelse \"%(permissions)s\" til rolle \"%(role)s\" for \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "Ingen"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: permissions.py:10
|
||||
@@ -72,112 +81,124 @@ msgstr "Editér ACL"
|
||||
msgid "View ACLs"
|
||||
msgstr "Se ACL"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "Slet ACL: %s"
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr "Objekttype"
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr "Objekt ID"
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Roller"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr "Giv tilladelse"
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr "Tilbagekald tilladelse"
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -11,9 +11,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2019-03-31 21:36+0000\n"
|
||||
"Last-Translator: Mathias Behrle <mathiasb@m9s.biz>\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: German (Germany) (http://www.transifex.com/rosarior/mayan-edms/language/de_DE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -21,51 +21,60 @@ msgstr ""
|
||||
"Language: de_DE\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "Zugriffsberechtigungen"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Zugriffsberechtigungen"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr "Zugriffsberechtigung erstellt"
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr "Zugriffsberechtigung bearbeitet"
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr "Rolle"
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Berechtigungen"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr "Neue Berechtigung"
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Berechtigungen"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr "Objekt \"%s\" ist kein Modell und kann nicht auf Zugriffsberechtigungen überprüft werden."
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Unzureichende Berechtigung für: %s"
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr "Berechtigungseintrag"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr "Berechtigungseinträge"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Berechtigungen \"%(permissions)s\" von Rolle \"%(role)s\" für \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "Keine"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Zugriffsberechtigungen"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\""
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
@@ -75,112 +84,124 @@ msgstr "Zugriffsberechtigungen bearbeiten"
|
||||
msgid "View ACLs"
|
||||
msgstr "Zugriffsberechtigungen anzeigen"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr "API URL für die Liste der Berechtigungen dieser ACL"
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr "API URL für die Berechtigung in Beziehung zur Zugriffsberechtigungsliste der sie zugeordnet ist. Diese URL unterscheidet sich von der normalen Workflow URL."
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr "Primärschlüssel der neuen Berechtigung für die Zugriffsberechtigungsliste."
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr "Keine solche Berechtigung: %s"
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr "Durch Komma getrennte Liste von Primärschlüsseln der zu dieser Zugriffsberechtigungsliste hinzuzufügenden Berechtigungen."
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr "Primärschlüssel der Rolle die dieser Zugriffsberechtigung zugeordnet ist."
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr "Neue Zugriffsberechtigunglisten für %s"
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "Zugriffsberechtigung \"%s\" löschen"
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr "Keine Zugriffsberechtigungen für dieses Objekt verfügbar"
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr "Über Zugriffsberechtigungen wird der Zugriff von Benutzern zu Systemobjekten kontrolliert."
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr "Zugriffsberechtigungen für %s"
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr "Verfügbare Berechtigungen"
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr "Erteilte Berechtigungen"
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr "Verfügbare Berechtigungen"
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\"."
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Deaktivierte Berechtigungen sind von einem übergeordneten Objekt vererbt."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr "Unzureichende Berechtigungen werden durch ein übergeordnetes Objekt vererbt oder direkt an die Rolle erteilt. Sie können nicht direkt auf diesem Formular bearbeitet werden. Vererbte Berechtigungen müssen auf dem übergeordneten Objekt oder für die Rolle über das Einrichtungsmenü eingestellt werden."
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr "Objekttyp"
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "Objekttyp für den der Zugang bearbeitet wird."
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr "Objekt ID"
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr "Numerischer Identifikator des Objekts"
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Rollen"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "Rollen deren Zugang bearbeitet wird."
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr "Berechtigungen, die der Rolle für das ausgewählte Objekt erteilt oder entzogen werden."
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr "Zugriffsberechtigung erteilen"
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr "Zugriffsberechtigung entziehen"
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Greek (http://www.transifex.com/rosarior/mayan-edms/language/el/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,51 +17,60 @@ msgstr ""
|
||||
"Language: el\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "ΛΕΠ"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Λίστες Ελέγχου Πρόσβασης (ΛΕΠ)"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr "Ρόλος"
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Ανεπαρκή δικαιώματα"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "Διαγραφή"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr "Νέα ΛΕΠ"
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "Διαγραφή"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Ανεπαρκή δικαιώματα"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Μη επαρκή δικαιώματα πρόσβασης για το: %s"
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Δικαιώματα \"%(permissions)s\" στον ρόλο \"%(role)s\" για \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "Κανένα"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Λίστες Ελέγχου Πρόσβασης (ΛΕΠ)"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Δικαιώματα του Ρόλου \"%(role)s\" για \"%(object)s\""
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
@@ -71,112 +80,124 @@ msgstr "Τροποποιηση ΛΕΠ"
|
||||
msgid "View ACLs"
|
||||
msgstr "Εμφάνιση ΛΕΠ"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr "Άγνωστο δικαίωμα: %s"
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr "Νέα λίστα ελέγχου για: %s"
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "Διαγραφή ΛΕΠ: %s"
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr "Λίστα ελέγχου πρόσβασης για: %s"
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr "Διαθέσιμα δικαιώματα"
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr "Χωρηγημένα δικαιώματα"
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr "Διαθέσιμα δικαιώματα"
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Δικαιώματα του Ρόλου \"%(role)s\" για \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Απενεργοποιημένα δικαιώματα κληρονομούνται από το \"γοννικό\" αντικείμενο"
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr "Τύπος αντικειμένου"
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "Τύπος του αντικειμένου για το οποίο η πρόσβαση θα τροποποιηθεί."
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr "Αναγνωριστικό αντικειμένου"
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr "Αριθμητικό αναγνωριστικό του αντικειμένου για το οποίο η πρόσβαση θα τροποποιηθεί."
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Ρόλοι"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "Ρόλοι των οποιων η πρόσβαση θα τροποποιηθει."
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr "Δικαιώματα προς χορήγηση/ανάληση προς/από τον ρόλο για το ανωτέρω επιλεγμένο αντικείμενο."
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr "Χορήγηση πρόσβασης"
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr "Ανάκληση πρόσβασης"
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -17,50 +17,59 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: permissions.py:10
|
||||
@@ -71,111 +80,123 @@ msgstr ""
|
||||
msgid "View ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid "Numeric identifier of the object for which the access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -5,13 +5,13 @@
|
||||
# Translators:
|
||||
# jmcainzos <jmcainzos@vodafone.es>, 2015
|
||||
# Roberto Rosario, 2015
|
||||
# Roberto Rosario, 2015-2018
|
||||
# Roberto Rosario, 2015-2019
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2018-09-27 01:48+0000\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:51+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -20,51 +20,60 @@ msgstr ""
|
||||
"Language: es\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "LCAs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Listas de control de acceso"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr "LCA creada"
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr "LCA editada"
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr "Rol"
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Permisos"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "Borrar"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr "Nueva LCA"
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "Borrar"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "Permisos"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr "El objeto \"%s\"; no es un modelo y no se puede verificar el acceso."
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Acceso insuficiente para: %s"
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr "Entrada de acceso"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr "Entradas de acceso"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Permisos \"%(permissions)s\" para el rol \"%(role)s\" para \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "Ninguno"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Listas de control de acceso"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Permisos del rol \"%(role)s\" para \"%(object)s\""
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
@@ -74,112 +83,124 @@ msgstr "Editar LCAs"
|
||||
msgid "View ACLs"
|
||||
msgstr "Ver LCAs"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr "URL de la API que apunta a la lista de permisos para esta lista de control de acceso."
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr "URL de la API que apunta a un permiso en relación con la lista de control de acceso a la que está conectado. Esta URL es diferente de la URL canónica de flujo de trabajo."
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr "Llave primaria del nuevo permiso para conceder a la lista de control de acceso."
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr "No existe el permiso: %s"
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr "Lista separada por comas de las llaves primarias de permisos para conceder a esta lista de control de acceso."
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr "Las llaves primarias de los roles a los que se vincula esta lista de control de acceso."
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr "Nueva lista de control de acceso para: %s"
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "Borrar LCA: %s"
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr "No hay LCAs para este objeto"
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr "LCA significa Lista de Control de Acceso y es un método preciso para controlar el acceso de los usuarios a los objetos en el sistema."
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr "Listas de control de acceso para: %s"
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr "Permisos disponibles"
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr "Permisos otorgados"
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr "Permisos disponibles"
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr "Permisos del rol \"%(role)s\" para \"%(object)s\""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Los permisos inactivos se heredan de un objeto precedente."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr "Los permisos deshabilitados se heredan de un objeto principal o se otorgan directamente al rol y no se pueden eliminar de esta vista. Los permisos heredados deben eliminarse de la LCA del objeto principal o de su rol a través del menú de Configuración."
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr "Tipo de objeto"
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "Tipo de objeto para el que se modificará el acceso."
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr "ID de objeto"
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr "Identificador numérico del objeto para el que se modificará el acceso."
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "Roles"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "Roles cuyo acceso será modificado."
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr "Permisos para otorgar/revocar a los roles para el objeto seleccionado anteriormente."
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr "Otorgar acceso"
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr "Revocar acceso"
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr "Otorgar acceso a documento"
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr "Revocar acceso documento"
|
||||
|
||||
Binary file not shown.
@@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-04-02 14:29-0400\n"
|
||||
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
|
||||
"POT-Creation-Date: 2019-06-15 03:35-0400\n"
|
||||
"PO-Revision-Date: 2019-06-15 07:48+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Persian (http://www.transifex.com/rosarior/mayan-edms/language/fa/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -19,51 +19,60 @@ msgstr ""
|
||||
"Language: fa\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37
|
||||
#: apps.py:24 links.py:44
|
||||
msgid "ACLs"
|
||||
msgstr "دسترسی ها"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: events.py:8 permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "لیست کنترل دسترسی ها"
|
||||
|
||||
#: events.py:12
|
||||
msgid "ACL created"
|
||||
msgstr ""
|
||||
|
||||
#: events.py:15
|
||||
msgid "ACL edited"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:15 models.py:49
|
||||
msgid "Role"
|
||||
msgstr "نقش"
|
||||
|
||||
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "مجوزها"
|
||||
|
||||
#: links.py:32
|
||||
msgid "Delete"
|
||||
msgstr "حذف"
|
||||
|
||||
#: links.py:41
|
||||
#: links.py:34
|
||||
msgid "New ACL"
|
||||
msgstr "دسترسی جدید"
|
||||
|
||||
#: managers.py:57 managers.py:96
|
||||
#: links.py:39
|
||||
msgid "Delete"
|
||||
msgstr "حذف"
|
||||
|
||||
#: links.py:49 models.py:45 workflow_actions.py:49 workflow_actions.py:164
|
||||
msgid "Permissions"
|
||||
msgstr "مجوزها"
|
||||
|
||||
#: managers.py:216
|
||||
#, python-format
|
||||
msgid "Object \"%s\" is not a model and cannot be checked for access."
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:236
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "کمبود دسترسی برای: %s"
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:57
|
||||
msgid "Access entry"
|
||||
msgstr "ورودی دسترسی"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:58
|
||||
msgid "Access entries"
|
||||
msgstr "ورودیهای دسترسی"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:62
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "اچازه های \"%(permissions)s\" به نقش \"%(role)s\" برای \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
msgid "None"
|
||||
msgstr "هیچکدام."
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "لیست کنترل دسترسی ها"
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "نقش\"%(role)s\" دارای اجازه برای \"%(object)s\""
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
@@ -73,112 +82,124 @@ msgstr "ویرایش دسترسی ها"
|
||||
msgid "View ACLs"
|
||||
msgstr "دیدن دسترسی ها"
|
||||
|
||||
#: serializers.py:24 serializers.py:132
|
||||
#: serializers.py:26 serializers.py:136
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr "API URL اشاره گر به لیست اجازه های این دسترسی."
|
||||
|
||||
#: serializers.py:57
|
||||
#: serializers.py:59
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr "URL API اشاره به اجازه در رابطه با لیست کنترل دسترسی که به آن متصل است. این URL متفاوت از URL کارآفرینی کانونی است."
|
||||
|
||||
#: serializers.py:87
|
||||
#: serializers.py:91
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr "کلید اولیه مجوز جدید برای اعطای لیست کنترل دسترسی."
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#: serializers.py:115 serializers.py:191
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr "این اجازه ئوجود ندارد: %s"
|
||||
|
||||
#: serializers.py:126
|
||||
#: serializers.py:130
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr "لیست مجوز از کلیدهای مجاز مجاز برای حذف این لیست کنترل دسترسی جداگانه را از یکدیگر جدا کنید."
|
||||
|
||||
#: serializers.py:138
|
||||
#: serializers.py:142
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr "کلید اصلی نقش که این لیست کنترل دسترسی به آن متصل می شود."
|
||||
|
||||
#: views.py:77
|
||||
#: views.py:62
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr "لیست کنترل دسترسی جدید برای: %s"
|
||||
|
||||
#: views.py:104
|
||||
#: views.py:100
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "حذف لیست دسترسی ها: %s"
|
||||
|
||||
#: views.py:148
|
||||
#: views.py:147
|
||||
msgid "There are no ACLs for this object"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
#: views.py:150
|
||||
msgid ""
|
||||
"ACL stands for Access Control List and is a precise method to control user "
|
||||
"access to objects in the system."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
#: views.py:154
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr "لیست کنترل دسترسی ها برای : %s"
|
||||
|
||||
#: views.py:167
|
||||
msgid "Available permissions"
|
||||
msgstr "مجوزهای موجود"
|
||||
|
||||
#: views.py:168
|
||||
#: views.py:170
|
||||
msgid "Granted permissions"
|
||||
msgstr "مجوزهای داده شده"
|
||||
|
||||
#: views.py:230
|
||||
#: views.py:171
|
||||
msgid "Available permissions"
|
||||
msgstr "مجوزهای موجود"
|
||||
|
||||
#: views.py:215
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "نقش\"%(role)s\" دارای اجازه برای \"%(object)s\""
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "مجوزهای غیرفعال، از شیء بالاتر به ارث رسیدهاند."
|
||||
#: views.py:224
|
||||
msgid ""
|
||||
"Disabled permissions are inherited from a parent object or directly granted "
|
||||
"to the role and can't be removed from this view. Inherited permissions need "
|
||||
"to be removed from the parent object's ACL or from them role via the Setup "
|
||||
"menu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:25
|
||||
#: workflow_actions.py:26
|
||||
msgid "Object type"
|
||||
msgstr "نوع شی"
|
||||
|
||||
#: workflow_actions.py:28
|
||||
#: workflow_actions.py:29
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "نوع شی که دسترسی به آن تغییر خواهد کرد."
|
||||
|
||||
#: workflow_actions.py:34
|
||||
#: workflow_actions.py:35
|
||||
msgid "Object ID"
|
||||
msgstr "شناسه اشیاء"
|
||||
|
||||
#: workflow_actions.py:37
|
||||
#: workflow_actions.py:38
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr "شناسه عددی شئی که دسترسی به آن تغییر خواهد کرد."
|
||||
|
||||
#: workflow_actions.py:42
|
||||
#: workflow_actions.py:43 workflow_actions.py:158
|
||||
msgid "Roles"
|
||||
msgstr "نقش ها"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
#: workflow_actions.py:45 workflow_actions.py:160
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "نقش هایی که دسترسی به آنها تغییر خواهد کرد."
|
||||
|
||||
#: workflow_actions.py:51
|
||||
#: workflow_actions.py:52 workflow_actions.py:167
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr "مجوز برای اعطای / لغو به / از نقش مورد انتخاب شده در بالا."
|
||||
|
||||
#: workflow_actions.py:59
|
||||
#: workflow_actions.py:60
|
||||
msgid "Grant access"
|
||||
msgstr "دادن دسترسی"
|
||||
|
||||
#: workflow_actions.py:129
|
||||
#: workflow_actions.py:143
|
||||
msgid "Revoke access"
|
||||
msgstr "لغو دسترسی"
|
||||
|
||||
#: workflow_actions.py:175
|
||||
msgid "Grant document access"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:214
|
||||
msgid "Revoke document access"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user