Compare commits

..

75 Commits

Author SHA1 Message Date
Roberto Rosario
2de95b57d3 Fix translation file formatting
GitLab issue #579.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-09 02:53:24 -04:00
Roberto Rosario
cd74f6f461 Merge remote-tracking branch 'origin/hotfix' into hotfix 2019-04-09 02:51:55 -04:00
Roberto Rosario
9e1b77c5fc Revert "Language and translation file updates"
This reverts commit fbf03788a2.
2019-04-09 02:51:30 -04:00
Roberto Rosario
fbf03788a2 Language and translation file updates
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-09 02:41:39 -04:00
Roberto Rosario
4ee11cd067 Language and translation file updates
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-09 01:46:59 -04:00
Roberto Rosario
ad84cf8cdb Make mimetype app translatable
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-09 00:53:17 -04:00
Roberto Rosario
d627e9713c Fix source text typo
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-09 00:51:41 -04:00
Roberto Rosario
80e5fd89e4 Update translation sources
Also update the translatable text template in document states
views module.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-09 00:32:04 -04:00
Roberto Rosario
7d756de3de Add DOCUMENTS_HASH_BLOCK_SIZE setting
This new setting is used to control the size of the file
blocks when calculating a document's checksum. The default
value of 0 disables the features and preserves the current
behavior of reading the entire file into memory.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-07 22:58:01 -04:00
Roberto Rosario
69bd6c116e Improve multiple tag wizard step code
Previous code produce an error when there were not tag
IDs passed to the wizard.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-07 22:45:06 -04:00
Roberto Rosario
0065edfae9 Lower the log severity when links don't resolve
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-07 22:39:42 -04:00
Roberto Rosario
9ec021241c Update release notes
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-07 20:41:28 -04:00
Roberto Rosario
3a60155bfa Add checkout tests
Add link tests. Add checkout info view tests. Move common code to
a test mixin.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-07 01:08:46 -04:00
Roberto Rosario
f6a0a421a5 Update the check out info link permission
Update the link permission to match the same required permission
as the view.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-07 01:07:01 -04:00
Roberto Rosario
7ed26f4d4c Add checkout details view tests
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-06 20:17:32 -04:00
Roberto Rosario
daca9dd539 Fix multiple tag selection wizard step
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-06 19:36:14 -04:00
Roberto Rosario
d493ec34b2 Update build string
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 22:04:18 -04:00
Roberto Rosario
51ea493a26 Use bytes for hash and return the unicode
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 22:03:19 -04:00
Roberto Rosario
49403978b1 Update build string
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 17:09:43 -04:00
Roberto Rosario
8c770d5ba3 Merge branch 'releases/all' 2019-04-04 17:08:03 -04:00
Roberto Rosario
b01e8707a3 Add troubleshooting documenation topic
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 17:07:41 -04:00
Roberto Rosario
8896f58d6f Add support for skipping a default set of tests
Tests to be excluded by default should be tagged
as 'exclude'.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 16:48:11 -04:00
Roberto Rosario
3afb74224d Update build strings
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 02:49:05 -04:00
Roberto Rosario
3a4f97c5c2 Bump version to 3.1.10
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 02:48:00 -04:00
Roberto Rosario
8419facb8a PEP8 cleanups
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 02:46:25 -04:00
Roberto Rosario
3cbc6435a2 Improve markup in release notes
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 02:39:57 -04:00
Roberto Rosario
e7627a723e Remove repeated section
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 02:39:46 -04:00
Roberto Rosario
e77afeee37 Add API client examples
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 02:32:02 -04:00
Roberto Rosario
6a5a2350bb Fix documentation tag chapter reference
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 02:31:26 -04:00
Roberto Rosario
912675bf99 Force object to text
Force text display of object when raising PermissionDenied
to avoid UnicodeDecodeError. Thanks to Mathias Behrle
(@mbehrle) for the report and the debug information.
GitLab issue #576.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-04 01:39:06 -04:00
Roberto Rosario
a56e3ca111 Add the MIMETYPE_FILE_READ_SIZE setting
This new setting is used to limit the number of bytes read
while determining the MIME type of a new document. A value
of 0 will cause the entire file to be loaded into memory.
1024 appears to be a suitable number for most cases. This
setting defaults to 0 to preserve the current behavior but
might change in a future version.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-03 22:24:19 -04:00
Roberto Rosario
5f877cdc22 Validate the state completion value before saving
Thanks to Manoel Brunnen (@mbru) for the report and debug
information. GitLab issue #557.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-03 18:28:25 -04:00
Roberto Rosario
d5efd53b5b Add issue 564 credit.
Thanks to the Stéphane (@shoyu) for the report and debug
information.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-03 16:54:45 -04:00
Roberto Rosario
c156c02376 Fix index list API view
Add index create, delete, detail API tests. Fixes GitLab
issue #564.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-03 16:52:54 -04:00
Roberto Rosario
a196205593 Add missing index API view create permission
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-03 16:50:44 -04:00
Roberto Rosario
26cf7fb97c Add release notes for version 3.1.10
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-03 15:28:19 -04:00
Roberto Rosario
863892f909 Add metadata wizard step test
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-03 14:51:26 -04:00
Roberto Rosario
5a64a3e833 Reject emails attachments of size 0
Thanks to Robert Schoeftner (@robert.schoeftner)for the report
and solution. GitLab issue #574.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 23:51:53 -04:00
Roberto Rosario
45786005ab Update changelog
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 22:39:37 -04:00
Roberto Rosario
f45384e399 Add API to list all templates
Remove newlines from the rendered templates.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 22:37:46 -04:00
Roberto Rosario
33a542b9d5 Add support for server side link badges
GitLab issue #562.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 22:36:57 -04:00
Roberto Rosario
00d07214b1 Remove notification badge AJAX setup
Individual link AJAX workers are obsolete now that the menu
is being rendered by its own AJAX renderer.
GitLab issue #562.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 22:34:54 -04:00
Roberto Rosario
1e8030a722 Add view test for compressed files
GitLab issue #572.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 18:58:17 -04:00
Roberto Rosario
f6404fbd4b Merge remote-tracking branch 'origin/master' into hotfix 2019-04-02 18:56:47 -04:00
Roberto Rosario
b59c39261f Merge branch 'feature/error_ziparchive_children' into 'master'
Updates method for getting zip file members - Closes #572

Closes #572

See merge request mayan-edms/mayan-edms!41
2019-04-02 22:55:28 +00:00
Roberto Rosario
a5b513f986 Update changelog
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 18:31:05 -04:00
Roberto Rosario
45a688749c Merge remote-tracking branch 'origin/master' into hotfix 2019-04-02 18:20:48 -04:00
Roberto Rosario
15473620c4 Merge branch '568-pin-tornado-version' into 'master'
Pin tornado dependency to maintain Py27 compatibility - fixes #568

Closes #568

See merge request mayan-edms/mayan-edms!40
2019-04-02 22:20:31 +00:00
Roberto Rosario
7cd0e16cc2 Merge remote-tracking branch 'origin/master' into hotfix
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 15:23:24 -04:00
Roberto Rosario
caab7b3b59 Merge branch '566-custom-rooturl-in-tests' into 'master'
Support custom ROOT_URLCONF in tests - fixes #566

Closes #566

See merge request mayan-edms/mayan-edms!37
2019-04-02 19:15:17 +00:00
Roberto Rosario
47d850e164 Synchronize translations
Add Czech and Greek. Replace 'da' with 'da_DK', 'zn_CN' with 'zh'.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 15:08:49 -04:00
Roberto Rosario
b27e160d15 Update required Django version to 1.11.20
From Django 1.11.16.

* Django 1.11.17 fixes several bugs in 1.11.16 and adds compatibility
  with Python 3.7.
* Prevented repetitive calls to geos_version_tuple() in the WKBWriter
  class in an attempt to fix a random crash involving LooseVersion
  since Django 1.11.14 (#29959).
* CVE-2019-3498: Content spoofing possibility in the default 404 page
  An attacker could craft a malicious URL that could make spoofed
  content appear on the default page generated by the
  django.views.defaults.page_not_found() view. The URL path is no
  longer displayed in the default 404 template and the request_path
  context variable is now quoted to fix the issue for custom
  templates that use the path
* CVE-2019-6975: Memory exhaustion in django.utils.numberformat.format()
  If django.utils.numberformat.format() – used by contrib.admin as
  well as the the floatformat, filesizeformat, and intcomma templates
  filters – received a Decimal with a large number of digits or a large
  exponent, it could lead to significant memory usage due to a call to
  '{:f}'.format(). To avoid this, decimals with more than 200 digits
  are now formatted using scientific notation.
* Corrected packaging error from 1.11.19 (#30175).

https://docs.djangoproject.com/en/2.1/releases/1.11.17/
https://docs.djangoproject.com/en/2.1/releases/1.11.18/
https://docs.djangoproject.com/en/2.1/releases/1.11.19/
https://docs.djangoproject.com/en/2.1/releases/1.11.20/

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 14:13:20 -04:00
Roberto Rosario
3eb4a70fbf Update changelog
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 13:36:16 -04:00
Roberto Rosario
d4df7e69d7 Merge remote-tracking branch 'origin/master' into hotfix 2019-04-02 13:32:42 -04:00
Roberto Rosario
0055429703 Merge branch 'mbn/docker-build-fixes' into 'master'
Docker build fixes

See merge request mayan-edms/mayan-edms!35
2019-04-02 17:32:02 +00:00
Roberto Rosario
eafdfd8177 Merge remote-tracking branch 'origin/master' into hotfix 2019-04-02 13:26:46 -04:00
Roberto Rosario
a8e52126f5 Merge branch 'hotfix' of gitlab.com:mayan-edms/mayan-edms into hotfix
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 13:11:26 -04:00
Roberto Rosario
70facb96f0 Merge branch 'master' into 'master'
Update translation file

See merge request mayan-edms/mayan-edms!33
2019-04-02 17:10:43 +00:00
Roberto Rosario
f583e24c47 Update changelog
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 13:09:56 -04:00
Roberto Rosario
7db27aa9fe Update changelog
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 13:07:43 -04:00
Roberto Rosario
f5bc055a11 Fix test document reference
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 13:04:43 -04:00
Roberto Rosario
965160b7a2 Merge remote-tracking branch 'origin/master' into hotfix 2019-04-02 13:04:12 -04:00
Roberto Rosario
85b3164592 Merge branch 'master' into 'master'
Fix super call in APIAdvancedSearchView

See merge request mayan-edms/mayan-edms!36
2019-04-02 17:02:13 +00:00
Roberto Rosario
7634d9e5da Improve search API tests
Add tests for the advanced search API. GitLab merge !36.
Thanks to Simeon Walker (@simeon-walker) for the find and fix.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 13:00:37 -04:00
Roberto Rosario
48253f3f85 Update index test case to be order agnostic
Use sets and remove explicit index node ordering to allow tests
to work regardless of the node creation order. GitLab issue #559.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 02:36:30 -04:00
Roberto Rosario
dd2c64d453 Remove unused import
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 02:35:13 -04:00
Roberto Rosario
517c05a9c2 Allow passing arguments to the makefile targets
Add an ARGUMENTS option to the test-all and test targets.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 02:34:19 -04:00
Roberto Rosario
99bbe7d47c Simple optimizations to the checkout app
Use exists and use subqueries optimizations.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 02:33:32 -04:00
Roberto Rosario
586d41eeff Backport test case improvements
Add random primary key mixin. Split test case code into mixins.
Make the view test case and the API test cases part of the same
class hierachy. Update tests that failed due to the new import
locations.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-02 02:31:35 -04:00
Jorge E. Gómez
7fb18b14eb Fixes error: ZipArchive object has no attribute 'children' 2019-03-15 22:58:15 +00:00
Roger Hunwicks
68398e2ce6 Pin tornado dependency to maintain Py27 compatibility - fixes #568
Signed-off-by: Roger Hunwicks <roger@tonic-solutions.com>
2019-03-05 10:54:46 +02:00
Roger Hunwicks
d23f5eb540 Support custom ROOT_URLCONF in tests - fixes #566 2019-02-28 14:02:46 +02:00
Simeon Walker
4bbd5dab70 Fix super call in APIAdvancedSearchView 2019-02-14 10:10:31 +00:00
Manoel Brunnen
c4b9ae596e Workaround for pip bug #6179
See https://github.com/pypa/pip/issues/6197
2019-02-04 11:24:56 +01:00
Littm
f5d2f34e30 Update translation file 2018-11-25 01:04:12 +00:00
5910 changed files with 174860 additions and 80303 deletions

View File

@@ -1,6 +0,0 @@
[settings]
default_section = THIRDPARTY
known_first_party = mayan
known_django = django
multi_line_output = 5
sections = FUTURE,STDLIB,DJANGO,THIRDPARTY,FIRSTPARTY,LOCALFOLDER

View File

@@ -19,12 +19,6 @@ 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
@@ -49,12 +43,6 @@ 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.django_gpg-2-0]
file_filter = mayan/apps/django_gpg/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -109,12 +97,6 @@ source_lang = en
source_file = mayan/apps/events/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.file_caching-2-0]
file_filter = mayan/apps/file_caching/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/file_caching/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.linking-2-0]
file_filter = mayan/apps/linking/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -145,6 +127,12 @@ source_lang = en
source_file = mayan/apps/mirroring/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.mimetype-2-0]
file_filter = mayan/apps/mimetype/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/mimetype/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.motd-2-0]
file_filter = mayan/apps/motd/locale/<lang>/LC_MESSAGES/django.po
source_lang = en

File diff suppressed because it is too large Load Diff

View File

@@ -62,7 +62,6 @@ clean-pyc:
find . -name '*.pyc' -exec rm -f {} +
find . -name '*.pyo' -exec rm -f {} +
find . -name '*~' -exec rm -f {} +
find . -name '__pycache__' -exec rm -R -f {} +
# Testing
@@ -284,7 +283,7 @@ test-with-docker-frontend:
./manage.py runserver --settings=mayan.settings.staging.docker
test-with-docker-worker:
./manage.py celery worker --settings=mayan.settings.staging.docker -B -l INFO
./manage.py celery worker --settings=mayan.settings.staging.docker -B -l INFO -O fair
docker-mysql-on:
docker run -d --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan_edms mysql

View File

@@ -18,7 +18,7 @@ sudo apt-get -qq update
sudo apt-get -y upgrade
echo -e "\n -> Installing core binaries \n"
sudo apt-get -y install exiftool git-core python-virtualenv gcc python-dev libjpeg-dev libpng-dev libtiff-dev tesseract-ocr poppler-utils libreoffice
sudo apt-get -y install git-core python-virtualenv gcc python-dev libjpeg-dev libpng-dev libtiff-dev tesseract-ocr poppler-utils libreoffice
echo -e "\n -> Cloning development branch of repository \n"
git clone /mayan-edms-repository/ $INSTALLATION_DIRECTORY

View File

@@ -1445,15 +1445,15 @@ sudo -u mayan \
dialog --infobox "Preparing static files" 3 70
sudo -u mayan \
MAYAN_MEDIA_ROOT=$MAYAN_MEDIA_ROOT \
$MAYAN_BIN preparestatic --noinput > /dev/null
$MAYAN_BIN collectstatic --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
[supervisord]
environment=
MAYAN_ALLOWED_HOSTS="*", # Allow access to other network hosts other than localhost
MAYAN_CELERY_BROKER_URL="redis://127.0.0.1:6379/0",
MAYAN_CELERY_RESULT_BACKEND="redis://127.0.0.1:6379/0",
MAYAN_BROKER_URL="redis://127.0.0.1:6379/0",
PYTHONPATH=${MAYAN_INSTALLATION_FOLDER}/lib/python2.7/site-packages:$MAYAN_MEDIA_ROOT,
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql,
MAYAN_DATABASE_HOST=127.0.0.1,
@@ -1473,7 +1473,7 @@ user = mayan
[program:mayan-worker-fast]
autorestart = true
autostart = true
command = nice -n 1 ${MAYAN_BIN} celery worker -l ERROR -Q converter -n mayan-worker-fast.%%h --concurrency=1
command = nice -n 1 ${MAYAN_BIN} celery worker -Ofair -l ERROR -Q converter -n mayan-worker-fast.%%h --concurrency=1
killasgroup = true
numprocs = 1
priority = 998
@@ -1484,7 +1484,7 @@ user = mayan
[program:mayan-worker-medium]
autorestart = true
autostart = true
command = nice -n 18 ${MAYAN_BIN} celery worker -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h --concurrency=1
command = nice -n 18 ${MAYAN_BIN} celery worker -Ofair -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h --concurrency=1
killasgroup = true
numprocs = 1
priority = 998
@@ -1495,7 +1495,7 @@ user = mayan
[program:mayan-worker-slow]
autorestart = true
autostart = true
command = nice -n 19 ${MAYAN_BIN} celery worker -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1
command = nice -n 19 ${MAYAN_BIN} celery worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1
killasgroup = true
numprocs = 1
priority = 998

View File

@@ -20,7 +20,7 @@ apt-get -qq update
apt-get -y upgrade
echo -e "\n -> Installing core binaries \n"
apt-get install exiftool nginx supervisor redis-server postgresql libpq-dev libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
apt-get install nginx supervisor redis-server postgresql libpq-dev libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
echo -e "\n -> Setting up virtualenv \n"
rm -f ${INSTALLATION_DIRECTORY}
@@ -133,7 +133,7 @@ EOF
echo -e "\n -> Creating the supervisor file for the Celery worker, /etc/supervisor/conf.d/mayan-celery.conf \n"
cat > /etc/supervisor/conf.d/mayan-celery.conf << EOF
[program:mayan-worker]
command = ${INSTALLATION_DIRECTORY}bin/python ${INSTALLATION_DIRECTORY}bin/mayan-edms.py celery --settings=mayan.settings.production worker -l ERROR
command = ${INSTALLATION_DIRECTORY}bin/python ${INSTALLATION_DIRECTORY}bin/mayan-edms.py celery --settings=mayan.settings.production worker -Ofair -l ERROR
directory = ${INSTALLATION_DIRECTORY}
user = www-data
stdout_logfile = /var/log/mayan/worker-stdout.log
@@ -161,7 +161,7 @@ priority = 998
EOF
echo -e "\n -> Collecting the static files \n"
mayan-edms.py preparestatic --noinput
mayan-edms.py collectstatic --noinput
echo -e "\n -> Making the installation directory readable and writable by the webserver user \n"
chown www-data:www-data ${INSTALLATION_DIRECTORY} -R

View File

@@ -9,20 +9,19 @@ import sh
APP_LIST = (
'acls', 'appearance', 'authentication', 'autoadmin', 'cabinets',
'checkouts', 'common', 'converter', 'dashboards', 'django_gpg',
'document_comments', 'document_indexing', 'document_parsing',
'document_signatures', 'document_states', 'documents', 'dynamic_search',
'events', 'file_caching', 'linking', 'lock_manager', 'mayan_statistics',
'mailer', 'metadata', 'mirroring', 'motd', 'navigation', 'ocr',
'permissions', 'rest_api', 'smart_settings', 'sources', 'storage',
'tags', 'task_manager', 'user_management'
'acls', 'appearance', 'authentication', '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', 'mimetype', 'mirroring', 'motd', 'navigation', 'ocr',
'permissions','rest_api', 'smart_settings', 'sources', 'storage', 'tags',
'task_manager', 'user_management'
)
LANGUAGE_LIST = (
'ar', 'bg', 'bs_BA', 'da', 'de_DE', 'en', 'es', 'fa', 'fr', 'hu', 'id',
'it', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI', 'tr_TR',
'vi_VN', 'zh_CN',
'ar', 'bg', 'bs_BA', 'cs', 'da_DK', 'de_DE', 'en', 'es', 'el', 'fa', 'fr',
'hu', 'id', 'it', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI',
'tr_TR', 'vi_VN', 'zh',
)
makemessages = sh.Command('django-admin.py')

View File

@@ -21,7 +21,6 @@ RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY
# Install base Ubuntu libraries
RUN apt-get update && \
apt-get install -y --no-install-recommends \
exiftool \
g++ \
gcc \
ghostscript \

View File

@@ -126,13 +126,13 @@ Defaults to `None`. This optional environment variable is used to set the hostna
Defaults to `None`. This optional environment variable is used to set the port number to use when connecting to the database. An empty string means the default port. Not used with SQLite. For more information read the pertinent Django documentation page: [Settings, PORT](https://docs.djangoproject.com/en/1.11/ref/settings/#port)
### `MAYAN_CELERY_BROKER_URL`
### `MAYAN_BROKER_URL`
Defaults to 'redis://127.0.0.1:6379/0'. This optional environment variable is determines the broker that Celery will use to relay task messages between the frontend code and the background workers. For more information read the pertinent Celery Kombu documentation page: [Broker URL](http://kombu.readthedocs.io/en/latest/userguide/connections.html#connection-urls)
This Docker image supports using Redis and RabbitMQ as brokers.
Caveat: If the `MAYAN_CELERY_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment variables are specified, the built-in Redis server inside the container will be disabled.
Caveat: If the `MAYAN_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment variables are specified, the built-in Redis server inside the container will be disabled.
### `MAYAN_CELERY_RESULT_BACKEND`
@@ -140,7 +140,7 @@ Defaults to 'redis://127.0.0.1:6379/0'. This optional environment variable is de
This Docker image supports using Redis and RabbitMQ as result backends.
Caveat: If the `MAYAN_CELERY_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment variables are specified, the built-in Redis server inside the container will be disabled.
Caveat: If the `MAYAN_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment variables are specified, the built-in Redis server inside the container will be disabled.
### `MAYAN_NGINX_CLIENT_MAX_BODY_SIZE`

View File

@@ -126,13 +126,13 @@ Defaults to `None`. This optional environment variable is used to set the hostna
Defaults to `None`. This optional environment variable is used to set the port number to use when connecting to the database. An empty string means the default port. Not used with SQLite. For more information read the pertinent Django documentation page: [Settings, PORT](https://docs.djangoproject.com/en/1.11/ref/settings/#port)
### `MAYAN_CELERY_BROKER_URL`
### `MAYAN_BROKER_URL`
Defaults to 'redis://127.0.0.1:6379/0'. This optional environment variable is determines the broker that Celery will use to relay task messages between the frontend code and the background workers. For more information read the pertinent Celery Kombu documentation page: [Broker URL](http://kombu.readthedocs.io/en/latest/userguide/connections.html#connection-urls)
This Docker image supports using Redis and RabbitMQ as brokers.
Caveat: If the `MAYAN_CELERY_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment variables are specified, the built-in Redis server inside the container will be disabled.
Caveat: If the `MAYAN_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment variables are specified, the built-in Redis server inside the container will be disabled.
### `MAYAN_CELERY_RESULT_BACKEND`
@@ -140,7 +140,7 @@ Defaults to 'redis://127.0.0.1:6379/0'. This optional environment variable is de
This Docker image supports using Redis and RabbitMQ as result backends.
Caveat: If the `MAYAN_CELERY_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment variables are specified, the built-in Redis server inside the container will be disabled.
Caveat: If the `MAYAN_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment variables are specified, the built-in Redis server inside the container will be disabled.
### `MAYAN_NGINX_CLIENT_MAX_BODY_SIZE`

View File

@@ -59,7 +59,7 @@ services:
results:
condition: service_healthy
environment:
MAYAN_CELERY_BROKER_URL: amqp://mayan:mayan@broker:5672/mayan
MAYAN_BROKER_URL: amqp://mayan:mayan@broker:5672/mayan
MAYAN_CELERY_RESULT_BACKEND: redis://results:6379/0
MAYAN_DATABASE_ENGINE: django.db.backends.postgresql
MAYAN_DATABASE_HOST: db

View File

@@ -45,7 +45,7 @@ services:
results:
condition: service_healthy
environment:
MAYAN_CELERY_BROKER_URL: amqp://mayan:mayan@broker:5672/mayan
MAYAN_BROKER_URL: amqp://mayan:mayan@broker:5672/mayan
MAYAN_CELERY_RESULT_BACKEND: redis://results:6379/0
MAYAN_DATABASE_ENGINE: django.db.backends.postgresql
MAYAN_DATABASE_HOST: db

View File

@@ -6,12 +6,12 @@ INSTALL_FLAG=/var/lib/mayan/system/SECRET_KEY
CONCURRENCY_ARGUMENT=--concurrency=
export DOCKER_ROOT=/opt/mayan-edms
export MAYAN_DEFAULT_CELERY_BROKER_URL=redis://127.0.0.1:6379/0
export MAYAN_DEFAULT_BROKER_URL=redis://127.0.0.1:6379/0
export MAYAN_DEFAULT_CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
export MAYAN_ALLOWED_HOSTS='["*"]'
export MAYAN_BIN=/opt/mayan-edms/bin/mayan-edms.py
export MAYAN_CELERY_BROKER_URL=${MAYAN_CELERY_BROKER_URL:-${MAYAN_DEFAULT_CELERY_BROKER_URL}}
export MAYAN_BROKER_URL=${MAYAN_BROKER_URL:-${MAYAN_DEFAULT_BROKER_URL}}
export MAYAN_CELERY_RESULT_BACKEND=${MAYAN_CELERY_RESULT_BACKEND:-${MAYAN_DEFAULT_CELERY_RESULT_BACKEND}}
export MAYAN_INSTALL_DIR=/opt/mayan-edms
export MAYAN_PYTHON_BIN_DIR=/opt/mayan-edms/bin/
@@ -55,13 +55,13 @@ chown mayan:mayan /var/lib/mayan -R
initialize() {
echo "mayan: initialize()"
su mayan -c "${MAYAN_BIN} initialsetup --force"
su mayan -c "${MAYAN_BIN} preparestatic --noinput --clear"
su mayan -c "${MAYAN_BIN} collectstatic --noinput --clear"
}
upgrade() {
echo "mayan: upgrade()"
su mayan -c "${MAYAN_BIN} performupgrade"
su mayan -c "${MAYAN_BIN} preparestatic --noinput --clear"
su mayan -c "${MAYAN_BIN} collectstatic --noinput --clear"
}
start() {

View File

@@ -12,7 +12,7 @@ user = mayan
[program:redis]
autorestart = false
autostart = true
command = /bin/bash -c "if [ ${MAYAN_CELERY_BROKER_URL} == ${MAYAN_DEFAULT_BROKER_URL} ] && [ ${MAYAN_CELERY_RESULT_BACKEND} == ${MAYAN_DEFAULT_CELERY_RESULT_BACKEND} ];then /usr/bin/redis-server /etc/redis/;fi"
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
@@ -22,7 +22,7 @@ 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 -l ERROR -Q converter,document_states_fast,sources_fast -n mayan-worker-fast.%%h ${MAYAN_WORKER_FAST_CONCURRENCY}"
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
@@ -37,7 +37,7 @@ 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 -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h ${MAYAN_WORKER_MEDIUM_CONCURRENCY}"
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
@@ -52,7 +52,7 @@ 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 -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h ${MAYAN_WORKER_SLOW_CONCURRENCY}"
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

View File

@@ -1 +1 @@
3.1.9
3.1.10

View File

@@ -26,3 +26,77 @@ endpoints are structured by resource type. Examples:
The API supports the HTTP verbs: **GET**, **POST**, **PUT**, **PATCH**,
and **DELETE**.
Example use
===========
Install Python Requests (http://docs.python-requests.org/en/master/)::
pip install requests
Get a list of document types::
import requests
requests.get('http://127.0.0.1:8000/api/document_types/', auth=('username', 'password')).json()
{u'count': 1,
u'next': None,
u'previous': None,
u'results': [{u'delete_time_period': 30,
u'delete_time_unit': u'days',
u'documents_count': 12,
u'documents_url': u'http://127.0.0.1:8000/api/document_types/1/documents/',
u'filenames': [],
u'id': 1,
u'label': u'Default',
u'trash_time_period': None,
u'trash_time_unit': None,
u'url': u'http://127.0.0.1:8000/api/document_types/1/'}]}
Upload a new document::
with open('test_document.pdf', mode='rb') as
requests.post('http://127.0.0.1:8000/api/documents/', auth=('username', 'password'), files={'file': file_object}, data={'document_type': 1}).json()
{u'description': u'',
u'document_type': 1,
u'id': 19,
u'label': u'test_document.pdf',
u'language': u'eng'}
Use API tokens to avoid sending the username and password on every request. Obtain a token by making a POST request to ``/api/auth/token/obtain/?format=json``::
requests.post('http://127.0.0.1:8000/api/auth/token/obtain/?format=json', data={'username': 'username', 'password': 'password'}).json()
{u'token': u'4ccbc35b5eb327aa82dc3b7c9747b578900f02bb'}
Add the API token to the request header::
headers = {'Authorization': 'Token 4ccbc35b5eb327aa82dc3b7c9747b578900f02bb'}
requests.get('http://127.0.0.1:8000/api/document_types/', headers=headers).json()
{u'description': u'',
u'document_type': 1,
u'id': 19,
u'label': u'test_document.pdf',
u'language': u'eng'}
Use sessions to avoid having to add the headers on each request::
session = requests.Session()
headers = {'Authorization': 'Token 4ccbc35b5eb327aa82dc3b7c9747b578900f02bb'}
session.headers.update(headers)
session.get('http://127.0.0.1:8000/api/document_types/')
{u'description': u'',
u'document_type': 1,
u'id': 19,
u'label': u'test_document.pdf',
u'language': u'eng'}

View File

@@ -136,8 +136,8 @@ Views
The module common.generics provides custom generic class based views to be used.
The basic views used to create, edit, view and delete objects in Mayan EDMS
are: ``SingleObjectCreateView``, ``SingleObjectDetailView``,
``SingleObjectEditView``, and ``SingleObjectListView``.
are: SingleObjectCreateView, SingleObjectDetailView, SingleObjectEditView,
and SingleObjectListView
These views handle aspects relating to view permissions, object permissions,
post action redirection and template context generation.

View File

@@ -27,7 +27,7 @@ Direct install
* Install the Python client for PostgreSQL::
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir psycopg2==2.7.3.2
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 psycopg2==2.7.3.2
* Copy the newly created fallback config file::

View File

@@ -21,10 +21,10 @@ Binary dependencies
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
requirements using::
sudo apt-get install exiftool g++ gcc ghostscript gnupg1 graphviz \
libfuse2 libjpeg-dev libmagic1 libpq-dev libpng-dev libreoffice \
libtiff-dev poppler-utils postgresql python-dev python-virtualenv \
redis-server sane-utils supervisor tesseract-ocr zlib1g-dev -y
sudo apt-get install g++ gcc ghostscript gnupg1 graphviz libfuse2 \
libjpeg-dev libmagic1 libpq-dev libpng-dev libreoffice libtiff-dev \
poppler-utils postgresql python-dev python-virtualenv redis-server \
sane-utils supervisor tesseract-ocr zlib1g-dev -y
Create an user account for the installation:
--------------------------------------------
@@ -54,13 +54,13 @@ Install Mayan EDMS from PyPI:
-----------------------------
::
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir mayan-edms
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 mayan-edms
Install the Python client for PostgreSQL and Redis:
---------------------------------------------------
::
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir psycopg2==2.7.3.2 redis==2.10.6
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 psycopg2==2.7.3.2 redis==2.10.6
Create the database for the installation:
-----------------------------------------
@@ -73,8 +73,9 @@ Initialize the project:
-----------------------
::
sudo -u mayan MAYAN_DATABASES='{default: {ENGINE: django.db.backends.postgresql, NAME: mayan, PASSWORD: mayanuserpass, USER: mayan, HOST=127.0.0.1}}' \
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
/opt/mayan-edms/bin/mayan-edms.py initialsetup
Collect the static files:
@@ -82,7 +83,7 @@ Collect the static files:
::
sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
/opt/mayan-edms/bin/mayan-edms.py preparestatic --noinput
/opt/mayan-edms/bin/mayan-edms.py collectstatic --noinput
Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
--------------------------------------------------------------------
@@ -91,11 +92,16 @@ Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
[supervisord]
environment=
MAYAN_ALLOWED_HOSTS='["*"]', # Allow access to other network hosts other than localhost
MAYAN_CELERY_BROKER_URL="redis://127.0.0.1:6379/0",
MAYAN_CELERY_RESULT_BACKEND="redis://127.0.0.1:6379/0",
MAYAN_BROKER_URL="redis://127.0.0.1:6379/0",
PYTHONPATH=/opt/mayan-edms/lib/python2.7/site-packages:/opt/mayan-edms/data,
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media,
MAYAN_DATABASES='{default: {ENGINE: django.db.backends.postgresql, HOST: 127.0.0.1, NAME: mayan, PASSWORD: mayanuserpass, USER: mayan, CONN_MAX_AGE: 60}}',
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql,
MAYAN_DATABASE_HOST=127.0.0.1,
MAYAN_DATABASE_NAME=mayan,
MAYAN_DATABASE_PASSWORD=mayanuserpass,
MAYAN_DATABASE_USER=mayan,
MAYAN_DATABASE_CONN_MAX_AGE=60,
DJANGO_SETTINGS_MODULE=mayan.settings.production
[program:mayan-gunicorn]
@@ -107,7 +113,7 @@ Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
[program:mayan-worker-fast]
autorestart = true
autostart = true
command = nice -n 1 /opt/mayan-edms/bin/mayan-edms.py celery worker -l ERROR -Q converter,document_states_fast,sources_fast -n mayan-worker-fast.%%h --concurrency=1
command = nice -n 1 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q converter,sources_fast -n mayan-worker-fast.%%h --concurrency=1
killasgroup = true
numprocs = 1
priority = 998
@@ -118,7 +124,7 @@ Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
[program:mayan-worker-medium]
autorestart = true
autostart = true
command = nice -n 18 /opt/mayan-edms/bin/mayan-edms.py celery worker -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h --concurrency=1
command = nice -n 18 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h --concurrency=1
killasgroup = true
numprocs = 1
priority = 998
@@ -129,7 +135,7 @@ Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
[program:mayan-worker-slow]
autorestart = true
autostart = true
command = nice -n 19 /opt/mayan-edms/bin/mayan-edms.py celery worker -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1
command = nice -n 19 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1
killasgroup = true
numprocs = 1
priority = 998
@@ -182,11 +188,10 @@ Binary dependencies
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
requirements using::
sudo apt-get install exiftool g++ gcc ghostscript gnupg1 graphviz \
libfuse2 libjpeg-dev libmagic1 libpq-dev libpng-dev libreoffice \
libtiff-dev poppler-utils postgresql python-dev python-virtualenv \
rabbitmq-server redis-server sane-utils supervisor tesseract-ocr \
zlib1g-dev -y
sudo apt-get install g++ gcc ghostscript gnupg1 graphviz libfuse2 \
libjpeg-dev libmagic1 libpq-dev libpng-dev libreoffice libtiff-dev \
poppler-utils postgresql python-dev python-virtualenv rabbitmq-server \
redis-server sane-utils supervisor tesseract-ocr zlib1g-dev -y
Create an user account for the installation:
--------------------------------------------
@@ -216,13 +221,13 @@ Install Mayan EDMS from PyPI:
-----------------------------
::
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir mayan-edms
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 mayan-edms
Install the Python client for PostgreSQL and Redis:
---------------------------------------------------
::
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir librabbitmq==2.0.0 psycopg2==2.7.3.2 redis==2.10.6
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 librabbitmq==2.0.0 psycopg2==2.7.3.2 redis==2.10.6
Create the database for the installation:
-----------------------------------------
@@ -235,8 +240,9 @@ Initialize the project:
-----------------------
::
sudo -u mayan MAYAN_DATABASES='{default: {ENGINE: django.db.backends.postgresql, NAME: mayan, PASSWORD: mayanuserpass, USER: mayan, HOST=127.0.0.1}}' \
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
/opt/mayan-edms/bin/mayan-edms.py initialsetup
Collect the static files:
@@ -244,7 +250,7 @@ Collect the static files:
::
sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
/opt/mayan-edms/bin/mayan-edms.py preparestatic --noinput
/opt/mayan-edms/bin/mayan-edms.py collectstatic --noinput
Create the RabbitMQ user and vhost:
-----------------------------------
@@ -261,11 +267,16 @@ Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
[supervisord]
environment=
MAYAN_ALLOWED_HOSTS='["*"]', # Allow access to other network hosts other than localhost
MAYAN_CELERY_BROKER_URL="amqp://mayan:mayanrabbitmqpassword@localhost:5672/mayan",
MAYAN_CELERY_RESULT_BACKEND="redis://127.0.0.1:6379/0",
MAYAN_BROKER_URL="amqp://mayan:mayanrabbitmqpassword@localhost:5672/mayan",
PYTHONPATH=/opt/mayan-edms/lib/python2.7/site-packages:/opt/mayan-edms/data,
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media,
MAYAN_DATABASES='{default: {ENGINE: django.db.backends.postgresql, HOST: 127.0.0.1, NAME: mayan, PASSWORD: mayanuserpass, USER: mayan, CONN_MAX_AGE: 60}}',
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql,
MAYAN_DATABASE_HOST=127.0.0.1,
MAYAN_DATABASE_NAME=mayan,
MAYAN_DATABASE_PASSWORD=mayanuserpass,
MAYAN_DATABASE_USER=mayan,
MAYAN_DATABASE_CONN_MAX_AGE=360,
DJANGO_SETTINGS_MODULE=mayan.settings.production
[program:mayan-gunicorn]
@@ -277,7 +288,7 @@ Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
[program:mayan-worker-fast]
autorestart = true
autostart = true
command = nice -n 1 /opt/mayan-edms/bin/mayan-edms.py celery worker -l ERROR -Q converter,document_states_fast,sources_fast -n mayan-worker-fast.%%h
command = nice -n 1 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q converter,sources_fast -n mayan-worker-fast.%%h
killasgroup = true
numprocs = 1
priority = 998
@@ -288,7 +299,7 @@ Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
[program:mayan-worker-medium]
autorestart = true
autostart = true
command = nice -n 18 /opt/mayan-edms/bin/mayan-edms.py celery worker -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h --concurrency=1
command = nice -n 18 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h --concurrency=1
killasgroup = true
numprocs = 1
priority = 998
@@ -299,7 +310,7 @@ Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``:
[program:mayan-worker-slow]
autorestart = true
autostart = true
command = nice -n 19 /opt/mayan-edms/bin/mayan-edms.py celery worker -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1
command = nice -n 19 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1
killasgroup = true
numprocs = 1
priority = 998
@@ -334,36 +345,6 @@ Enable and restart the services [1_]:
systemctl enable supervisor
systemctl restart supervisor
Troubleshooting
===============
- Due to OS differences some binaries might reside in different locations.
Use environment variables or the configuration file to tell Mayan EDMS where
to file these binaries.
Example: OpenBSD. Add the following entries to supervisor configuration files.
::
MAYAN_DOCUMENT_PARSING_PDFTOTEXT_PATH=/usr/local/bin/pdftotext,
MAYAN_SIGNATURES_GPG_PATH=/usr/local/bin/gpg,
MAYAN_SOURCES_SCANIMAGE_PATH: /usr/local/bin/scanimage,
Alternatively a symlink from the actual binary location to where Mayan
EDMS is expecting them to be found by default also works for some users::
ln -s /usr/local/bin/gpg /usr/bin/gpg1
Example 2: Ubuntu 16.04. Add the following entries to supervisor
configuration files.
::
MAYAN_SIGNATURES_GPG_PATH=/usr/bin/gpg1,
Or add a symlink::
ln -s /usr/bin/gpg /usr/bin/gpg1
[1]: https://bugs.launchpad.net/ubuntu/+source/supervisor/+bug/1594740
.. _Debian: https://www.debian.org/

View File

@@ -447,28 +447,13 @@ Version numbering
=================
Mayan EDMS uses the Semantic Versioning (http://semver.org/) method to choose
version numbers along with Python's PEP-0440
(https://www.python.org/dev/peps/pep-0440/) to format them.
version numbers along with Python's PEP-0440 (https://www.python.org/dev/peps/pep-0440/)
to format them.
+----------------+-------------------+-----------------------------------------+
| Version number | Name | Description |
+================+===================+=========================================+
| X.YalphaN | Alpha release | Usable but unstable, API changes. |
+----------------+-------------------+-----------------------------------------+
| X.YbetaN | Beta release | Code is frozen, testing. |
+----------------+-------------------+-----------------------------------------+
| X.YrcN | Release Candidate | Almost ready for production, not major |
| | | changes between this version and the |
| | | final release. |
+----------------+-------------------+-----------------------------------------+
| X.Y | Final release | API changes, many backward incompatible |
| | | changes. |
+----------------+-------------------+-----------------------------------------+
| X.Y+1 | Minor release | Minor changes, minor backwards |
| | | incompatible changes |
+----------------+-------------------+-----------------------------------------+
| X.Y.Z | Micro release | Minor changes, bugfixes. |
+----------------+-------------------+-----------------------------------------+
X.YaN # Alpha release
X.YbN # Beta release
X.YrcN # Release Candidate
X.Y # Final release
Release checklist

View File

@@ -1,10 +1,118 @@
************
============
Docker image
************
============
How to use this image
=====================
.. _docker_install:
Start a Mayan EDMS image
------------------------
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::
docker pull postgres:9.5
Create and run a PostgreSQL container::
docker run -d \
--name mayan-edms-postgres \
--restart=always \
-p 5432:5432 \
-e POSTGRES_USER=mayan \
-e POSTGRES_DB=mayan \
-e POSTGRES_PASSWORD=mayanuserpass \
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
-d postgres:9.5
The PostgreSQL container will have one database named ``mayan``, with an user
named ``mayan`` too, with a password of ``mayanuserpass``. The container will
expose its internal 5432 port (PostgreSQL's default port) via the host's
5432 port. The data of this container will reside on the host's
``/docker-volumes/mayan-edms/postgres`` folder.
Finally create and run a Mayan EDMS container. Change <version> with the
latest version in numeric form (example: 2.7.3) or use the ``latest``
identifier::
docker run -d \
--name mayan-edms \
--restart=always \
-p 80:8000 \
-e MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
-e MAYAN_DATABASE_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 \
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
mayanedms/mayanedms:<version>
The Mayan EDMS container will connect to the PostgreSQL container via the
``172.17.0.1`` IP address (the Docker host's default IP address). It will
connect using the ``django.db.backends.postgresql`` database driver and
connect to the ``mayan`` database using the ``mayan`` user with the password
``mayanuserpass``. The container will keep connections to the database
for up to 60 seconds in an attempt to reuse them increasing response time
and reducing memory usage. The files of the container will be store in the
host's ``/docker-volumes/mayan-edms/media`` folder. The container will
expose its web service running on port 8000 on the host's port 80.
The container will be available by browsing to ``http://localhost`` or to
the IP address of the computer running the container.
If another web server is running on port 80 use a different port in the
``-p`` option. For example: ``-p 81:8000``.
Using a dedicated Docker network
--------------------------------
Use this method to avoid having to expose PostreSQL port to the host's network
or if you have other PostgreSQL instances but still want to use the default
port of 5432 for this installation.
Create the network::
docker network create mayan
Launch the PostgreSQL container with the network option and remove the port
binding (``-p 5432:5432``)::
docker run -d \
--name mayan-edms-postgres \
--network=mayan \
--restart=always \
-e POSTGRES_USER=mayan \
-e POSTGRES_DB=mayan \
-e POSTGRES_PASSWORD=mayanuserpass \
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
-d postgres:9.5
Launch the Mayan EDMS container with the network option and change the
database hostname to the PostgreSQL container name (``mayan-edms-postgres``)
instead of the IP address of the Docker host (``172.17.0.1``)::
docker run -d \
--name mayan-edms \
--network=mayan \
--restart=always \
-p 80:8000 \
-e MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
-e MAYAN_DATABASE_HOST=mayan-edms-postgres \
-e MAYAN_DATABASE_NAME=mayan \
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
-e MAYAN_DATABASE_USER=mayan \
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
mayanedms/mayanedms:<version>
Stopping and starting the container
===================================
-----------------------------------
To stop the container use::
@@ -19,11 +127,9 @@ To start the container again::
.. _docker_environment_variables:
Environment Variables
=====================
---------------------
In addition to the all the environment variables supported by Mayan EDMS, the
Mayan EDMS image provides some additional variables to configure the Docker
specifics of the image.
The Mayan EDMS image can be configure via environment variables.
``MAYAN_DATABASE_ENGINE``
@@ -39,6 +145,27 @@ When using the SQLite backend, the database file will be saved in the Docker
volume. The SQLite database as used by Mayan EDMS is meant only for development
or testing, never use it in production.
``MAYAN_DATABASE_NAME``
Defaults to 'mayan'. This optional environment variable can be used to define
the database name that Mayan EDMS will connect to. For more information read
the pertinent Django documentation page:
:django-docs:`Connecting to the database <ref/databases/#connecting-to-the-database>`
``MAYAN_DATABASE_USER``
Defaults to 'mayan'. This optional environment variable is used to set the
username that will be used to connect to the database. For more information
read the pertinent Django documentation page:
:django-docs:`Settings, USER <ref/settings/#user>`
``MAYAN_DATABASE_PASSWORD``
Defaults to ''. This optional environment variable is used to set the
password that will be used to connect to the database. For more information
read the pertinent Django documentation page:
:django-docs:`Settings, PASSWORD <ref/settings/#password>`
``MAYAN_DATABASE_HOST``
Defaults to `None`. This optional environment variable is used to set the
@@ -55,7 +182,7 @@ the default port. Not used with SQLite. For more information read the
pertinent Django documentation page:
:django-docs:`Settings, PORT <ref/settings/#port>`
``MAYAN_CELERY_BROKER_URL``
``MAYAN_BROKER_URL``
This optional environment variable determines the broker that Celery will use
to relay task messages between the frontend code and the background workers.
@@ -65,7 +192,7 @@ For more information read the pertinent Celery Kombu documentation page: `Broker
This Docker image supports using Redis and RabbitMQ as brokers.
Caveat: If the `MAYAN_CELERY_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment
Caveat: If the `MAYAN_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment
variables are specified, the built-in Redis server inside the container will
be disabled.
@@ -80,7 +207,7 @@ code. For more information read the pertinent Celery Kombu documentation page:
This Docker image supports using Redis and RabbitMQ as result backends.
Caveat: If the `MAYAN_CELERY_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment
Caveat: If the `MAYAN_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment
variables are specified, the built-in Redis server inside the container will
be disabled.
@@ -88,6 +215,12 @@ be disabled.
Optional. Allows loading an alternate settings file.
``MAYAN_DATABASE_CONN_MAX_AGE``
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>`
``MAYAN_GUNICORN_WORKERS``
Optional. This environment variable controls the number of frontend workers
@@ -119,7 +252,6 @@ 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).
Accessing outside data
======================
@@ -165,7 +297,6 @@ 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
=======================
@@ -173,7 +304,6 @@ Uncompress the backup archive in the original docker volume using::
sudo tar -xvzf backup.tar.gz -C /
Upgrading
=========
@@ -203,7 +333,6 @@ 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
==================
@@ -226,11 +355,9 @@ Or using an apt cacher to speed up the build::
Replace the IP address `172.17.0.1` with the IP address of the computer
running the APT proxy and caching service.
Customizing the image
=====================
Simple method
-------------
@@ -252,7 +379,6 @@ 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
====================

View File

@@ -1,109 +0,0 @@
*******************
Docker installation
*******************
Docker is a system that allows running programs in isolated areas which
have restricted access to resources, devices, and memory. Docker usage also
distributing software as a single file.
Make sure Docker is properly installed and working before attempting to install
Mayan EDMS.
Docker can be installed using their automated script::
wget -qO- https://get.docker.com/ | sh
This installs the latest versions of Docker. If you don't want run an automated
script follow the instructions outlined in their documentation:
https://docs.docker.com/install/
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::
docker pull postgres:9.5
Create and run a PostgreSQL container::
docker run -d \
--name mayan-edms-postgres \
--restart=always \
-p 5432:5432 \
-e POSTGRES_USER=mayan \
-e POSTGRES_DB=mayan \
-e POSTGRES_PASSWORD=mayanuserpass \
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
-d postgres:9.5
The PostgreSQL container will have one database named ``mayan``, with an user
named ``mayan`` too, with a password of ``mayanuserpass``. The container will
expose its internal 5432 port (PostgreSQL's default port) via the host's
5432 port. The data of this container will reside on the host's
``/docker-volumes/mayan-edms/postgres`` folder.
Finally create and run a Mayan EDMS container. Change <version> with the
latest version in numeric form (example: 2.7.3) or use the ``latest``
identifier::
docker run -d \
--name mayan-edms \
--restart=always \
-p 80:8000 \
-e MAYAN_DATABASES='{default: {ENGINE: django.db.backends.postgresql, HOST: 172.17.0.1, NAME: mayan, PASSWORD: mayanuserpass, USER: mayan, CONN_MAX_AGE: 60}}' \
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
mayanedms/mayanedms:<version>
The Mayan EDMS container will connect to the PostgreSQL container via the
``172.17.0.1`` IP address (the Docker host's default IP address). It will
connect using the ``django.db.backends.postgresql`` database driver and
connect to the ``mayan`` database using the ``mayan`` user with the password
``mayanuserpass``. The container will keep connections to the database
for up to 60 seconds in an attempt to reuse them increasing response time
and reducing memory usage. The files of the container will be store in the
host's ``/docker-volumes/mayan-edms/media`` folder. The container will
expose its web service running on port 8000 on the host's port 80.
The container will be available by browsing to ``http://localhost`` or to
the IP address of the computer running the container.
If another web server is running on port 80 use a different port in the
``-p`` option. For example: ``-p 81:8000``.
Using a dedicated Docker network
================================
Use this method to avoid having to expose PostreSQL port to the host's network
or if you have other PostgreSQL instances but still want to use the default
port of 5432 for this installation.
Create the network::
docker network create mayan
Launch the PostgreSQL container with the network option and remove the port
binding (``-p 5432:5432``)::
docker run -d \
--name mayan-edms-postgres \
--network=mayan \
--restart=always \
-e POSTGRES_USER=mayan \
-e POSTGRES_DB=mayan \
-e POSTGRES_PASSWORD=mayanuserpass \
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
-d postgres:9.5
Launch the Mayan EDMS container with the network option and change the
database hostname to the PostgreSQL container name (``mayan-edms-postgres``)
instead of the IP address of the Docker host (``172.17.0.1``)::
docker run -d \
--name mayan-edms \
--network=mayan \
--restart=always \
-p 80:8000 \
-e MAYAN_DATABASES='{default: {ENGINE: django.db.backends.postgresql, HOST: mayan-edms-postgres, NAME: mayan, PASSWORD: mayanuserpass, USER: mayan, CONN_MAX_AGE: 60}}' \
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
mayanedms/mayanedms:<version>

View File

@@ -86,11 +86,11 @@ Index by OCR content
This example indexes documents in a "quarterly report" level if they have the
fragment “quarterly report” in the OCR text::
{% if "quarterly report" in document.ocr_content.lower() %}Quarterly reports{% endif %}
{% if "quarterly report" in document.latest_version.ocr_content|join:" "|lower %}Quarterly reports{% endif %}
The same applies to text content extracted for the document::
{% if "quarterly report" in document.content.lower() %}Quarterly reports{% endif %}
{% if "quarterly report" in document.latest_version.content|join:" "|lower %}Quarterly reports{% endif %}

View File

@@ -29,32 +29,3 @@ to use a S3 style storage for documents.
'{access_key: <your S3 access key>, secret_key: <your S3 secret key>, bucket_name: <S3 bucket name>}'
5. Save and restart your Mayan EDMS installation for the setting to take effect.
Storage
=======
Mayan EDMS stores documents in their original file format only changing the
filename to avoid collision. For best input and output speed use a block
based local filesystem for the ``/media`` sub folder of the path specified by
the MEDIA_ROOT setting. For increased storage capacity use an object storage
filesystem like S3.
To use a S3 compatible object storage do the following:
* Install the Python packages ``django-storages`` and ``boto3``:
* Using Python::
pip install django-storages boto3
* Using Docker::
-e MAYAN_PIP_INSTALLS='django-storages boto3'
On the Mayan EDMS user interface, go to ``System``, ``Setup``, ``Settings``,
``Documents`` and change the following setting:
* ``DOCUMENTS_STORAGE_BACKEND`` to ``storages.backends.s3boto3.S3Boto3Storage``
* ``DOCUMENTS_STORAGE_BACKEND_ARGUMENTS`` to ``'{access_key: <your access key>, secret_key: <your secret key>, bucket_name: <bucket name>}'``.
Restart Mayan EDMS for the changes to take effect.

View File

@@ -15,7 +15,6 @@ via the :ref:`configuration file <configuration_file>`.
Example::
DEFAULT_FROM_EMAIL: '<your administrator email>'
EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST: '<your smtp ip address or hostname>'
EMAIL_HOST_PASSWORD: '<your smtp password>'

View File

@@ -1,48 +0,0 @@
*******************
Password validation
*******************
To help reduce the use of weak passwords, Mayan EDMS includes support for
password validators. Password validator enforce policies by rejecting
password that don't conform with the validator's logic.
By default, Mayan EDMS sets this password validation setup:
- That the password is not similar no any user attributes.
- A minimum password size of 8 characters.
- The password is not one of the 20,000 commonly used weak password.
- That the password is not entirely numeric.
This default is coded in the following manner by the default Python setup file::
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
If using the YAML configuration file the same setup would be coded in the
following manner::
AUTH_PASSWORD_VALIDATORS:
- NAME: django.contrib.auth.password_validation.UserAttributeSimilarityValidator
- NAME: django.contrib.auth.password_validation.MinimumLengthValidator
- NAME: django.contrib.auth.password_validation.CommonPasswordValidator
- NAME: django.contrib.auth.password_validation.NumericPasswordValidator
In addition to the password validators provided by Django
:django-docs:`validators provided by Django <topics/auth/passwords/#included-validators>`,
Mayan EDMS adds the following validators:
.. autoclass:: mayan.apps.authentication.validators.MinimumCapitalLettersContentValidator
.. autoclass:: mayan.apps.authentication.validators.MinimumNumberContentValidator

View File

@@ -116,11 +116,11 @@ For the Docker image, launch a separate RabbitMQ container
docker run -d --name mayan-edms-rabbitmq -e RABBITMQ_DEFAULT_USER=mayan -e RABBITMQ_DEFAULT_PASS=mayanrabbitmqpassword -e RABBITMQ_DEFAULT_VHOST=mayan rabbitmq:3
Pass the MAYAN_CELERY_BROKER_URL environment variable (https://kombu.readthedocs.io/en/latest/userguide/connections.html#connection-urls)
Pass the MAYAN_BROKER_URL environment variable (https://kombu.readthedocs.io/en/latest/userguide/connections.html#connection-urls)
to the Mayan EDMS container so that it uses the RabbitMQ container the
message broker::
-e MAYAN_CELERY_BROKER_URL="amqp://mayan:mayanrabbitmqpassword@localhost:5672/mayan",
-e MAYAN_BROKER_URL="amqp://mayan:mayanrabbitmqpassword@localhost:5672/mayan",
When tasks finish, they leave behind a return status or the result of a
calculation, these are stored for a while so that whoever requested the

View File

@@ -37,7 +37,6 @@ http://yaml.org/). Here is an example of what the looks like::
DOCUMENT_PARSING_AUTO_PARSING: true
DOCUMENT_PARSING_PDFTOTEXT_PATH: /usr/bin/pdftotext
DEFAUL_FROM_EMAIL: mayan.admin@example.com
EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST: localhost
EMAIL_HOST_PASSWORD: ''

View File

@@ -15,7 +15,7 @@ The current document sources supported are:
- IMAP email - Same as the ``POP3`` email source but for email accounts using
the ``IMAP`` protocol.
- Watch folder - A filesystem folder that is scanned periodically for files.
Any file found in the watch folder is uploaded and subsequently deleted.
Any file in the watch folder is automatically uploaded.
- Staging folder - Folder where networked attached scanned can save image
files. The files in these staging folders are scanned and a preview is
generated to help the process of upload. Staging folders and Watch folders

View File

@@ -13,8 +13,7 @@ from __future__ import unicode_literals
# All configuration values have a default; values that are commented out
# serve to show the default.
import os
import sys
import sys, os
sys.path.insert(0, os.path.abspath('..'))
@@ -23,25 +22,24 @@ import mayan
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.append(
os.path.abspath(os.path.join(os.path.dirname(__file__), '_ext'))
)
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext")))
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
# needs_sphinx = '1.0'
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
#extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode']
#extensions = ["djangodocs", "sphinx.ext.intersphinx"]
extensions = [
'sphinx.ext.autodoc', 'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag',
'sphinxcontrib.spelling', 'sphinx.ext.viewcode'
'sphinx.ext.extlinks', 'sphinxcontrib.blockdiag', 'sphinxcontrib.spelling'
]
blockdiag_antialias = True
blockdiag_html_image_format = 'SVG'
blockdiag_latex_image_format = 'PDF'
blockdiag_html_image_format = "SVG"
blockdiag_latex_image_format = "PDF"
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
@@ -71,20 +69,20 @@ release = version
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
# language = None
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ''
#today = ''
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = '%B %d, %Y'
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
# default_role = None
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
@@ -101,7 +99,7 @@ show_authors = False
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
#modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------------
@@ -113,26 +111,26 @@ html_theme = 'classic'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
# html_theme_options = {}
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
# html_title = None
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
# html_short_title = None
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
@@ -141,44 +139,44 @@ html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
# html_last_updated_fmt = '%b %d, %Y'
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}
#html_additional_pages = {}
# If false, no module index is generated.
# html_domain_indices = True
#html_domain_indices = True
# If false, no index is generated.
# html_use_index = True
#html_use_index = True
# If true, the index is split into individual pages for each letter.
# html_split_index = False
#html_split_index = False
# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ''
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'MayanEDMSdoc'
@@ -190,42 +188,41 @@ html_show_sphinx = False
# -- Options for LaTeX output --------------------------------------------------
# The paper size ('letter' or 'a4').
# latex_paper_size = 'letter'
#latex_paper_size = 'letter'
# The font size ('10pt', '11pt' or '12pt').
# latex_font_size = '10pt'
#latex_font_size = '10pt'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
(
'index', 'MayanEDMS.tex', 'Mayan EDMS Documentation',
mayan.__author__, 'manual'
),
('index', 'MayanEDMS.tex', 'Mayan EDMS Documentation',
mayan.__author__, 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
# latex_logo = None
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# latex_use_parts = False
#latex_use_parts = False
# If true, show page references after internal links.
# latex_show_pagerefs = False
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
# latex_show_urls = False
#latex_show_urls = False
# Additional stuff for the LaTeX preamble.
# latex_preamble = ''
#latex_preamble = ''
# Documents to append as an appendix to all manuals.
# latex_appendices = []
#latex_appendices = []
# If false, no module index is generated.
# latex_domain_indices = True
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------

View File

@@ -29,6 +29,7 @@ repository for electronic documents.
topics/integration
topics/advanced
topics/administration
topics/troubleshooting
topics/development
topics/faq
topics/license

View File

@@ -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

View File

@@ -1,6 +1,6 @@
====================
=====================
MERC 2: Test writing
====================
=====================
:MERC: 2
:Author: Michael Price

View File

@@ -1,149 +0,0 @@
==========================
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, clases 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 posible 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 synchonized 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()
),

View File

@@ -1,81 +0,0 @@
==================================
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 existance 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 fulfullin 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)

View File

@@ -20,8 +20,6 @@ Accepted
../mercs/0001-merc-process
../mercs/0002-test-writing
../mercs/0003-using-javascript-libraries
../mercs/0005-explicit-arguments
../mercs/0006-lower-information-disclose
Draft
-----
@@ -51,5 +49,3 @@ Feature
../mercs/0002-test-writing
../mercs/0003-using-javascript-libraries
../mercs/0005-explicit-arguments
../mercs/0006-lower-information-disclose

View File

@@ -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 ``restrict_queryset``
5. Update the role checks in the ``check_access`` and ``filter_by_access``
``AccessControlList`` model manager methods.

188
docs/releases/3.1.10.rst Normal file
View File

@@ -0,0 +1,188 @@
Version 3.1.10
==============
Released: April 04, 2019
Changes
-------
Test improvements
^^^^^^^^^^^^^^^^^
A number of test improvements were backported from the development branch. These
include a mixin to assign random primary keys to the test objects. Normally
primary keys are sequential and their predictability can hide edge cases that
would normally only manifest in production. The tests case code was also split
into smaller mixin units separating them by purpose. All code to perform HTTP
requests now resides in the ``ClientMethodsTestCaseMixin``. Changes in the
``ContentTypeCheckTestCaseMixin`` were added to enable this mixin for the API views
in a future minor version. The test view code was moved into its own mixin
called ``TestViewTestCaseMixin``. This mixin allows creating dynamic views to test
object and link resolution among other things. The API base test case class is
now part of the same class hierarchy, this means that the API test code will
now behave the same and will benefit from all improvements in the base test case
classes. Some indexing tests were failing randomly. This was caused by the way
the test were built and not because of faulty code. The tests were updated and
now operate as expected. While there is no official support for installing
Mayan EDMS as a sub URL updates to the ``TestViewTestCaseMixin`` will allow it to
execute with custom ``ROOT_URLCONF`` configurations. Further work and feedback is
needed to officially support this installation method.
Fixes
^^^^^
The advanced search API endpoint was fixed and is now usable. Tests for all
the issues fixed were added to avoid future regressions. A fix was applied
to the compressed class that caused compressed files uploads to fail from the
web form.
Docker
^^^^^^
Updates were added to the Docker image that allow it to build on armv7l
platforms like the RasperryPi, Odroid XU4, and Odroid HC2. This doesn't imply
official support for these platforms. Further experimentation and optimization
is needed and this changed will now allow users to build the image and provide
feedback in an easier manner.
Installation
^^^^^^^^^^^^
The installation process has been updated to work around the Python pip
issue #6197 (https://github.com/pypa/pip/issues/6197).
User interface
^^^^^^^^^^^^^^
Improvements in the AJAX menu rendering were conflicting with an old method
of refreshing the unread notification counter badge. This conflict would cause
the unread notification counter badge to blink and/or disappear. The older
badge refresh method was removed and improvements to the menu rendering from
the development branch were backported to support displaying link badges from
the templates completing fixing the issue. An API entrypoint was also backported
showing a list of all the server side AJAX templates. This change doesn't affect
the API layout and it remains compatible with the previous version. Newlines
are now explicitly removed from the rendered AJAX templates avoiding rendering
issues on some browsers.
Emails
^^^^^^
An update was added to will now cause Mayan EDMS to reject all email attachments
with a size 0 even if the attachment is valid. Documents of size 0 are not
consideref valid in Mayan EDMS since they can't be introspected for MIME type,
don't contain at least one version, and don't contain a single page. All these
are requirements for a valid document in Mayan EDMS.
Memory usage
^^^^^^^^^^^^
The ``MIMETYPE_FILE_READ_SIZE`` setting was added to limit the number of bytes that
will be read into memory to determine the MIME type of a new document. For
compatibility with the current bevahor this setting defaults to 0 which means
that it is disabled. Disabling the setting will cause the entire document's
file to be loaded into memory. If documents are not processing due to out of
memory errors (large documents or devices with limited memory), set
``MIMETYPE_FILE_READ_SIZE`` to a value other than 0. Limited tests suggest 1024
to be a good alternative as most "magic numbers" used for MIME type detection
are located at the start of the file and just reading the first 1024 bytes will
result in a positive identification with little memory usage.
Other changes
^^^^^^^^^^^^^
* Add missing document index API view create permission.
* Fix index list API view. Add index create, delete, detail API tests.
* Add support for skipping a default set of tests. Tests to be excluded
by default should be tagged as 'exclude'.
Removals
--------
* None
Upgrading from a previous version
---------------------------------
If installed via Python's PIP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Remove deprecated requirements::
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
Type in the console::
$ pip install mayan-edms==3.1.10
the requirements will also be updated automatically.
Using Git
^^^^^^^^^
If you installed Mayan EDMS by cloning the Git repository issue the commands::
$ git reset --hard HEAD
$ git pull
otherwise download the compressed archived and uncompress it overriding the
existing installation.
Remove deprecated requirements::
$ pip uninstall -y -r removals.txt
Next upgrade/add the new requirements::
$ pip install --upgrade -r requirements.txt
Common steps
^^^^^^^^^^^^
Perform these steps after updating the code from either step above.
Migrate existing database schema with::
$ mayan-edms.py performupgrade
Add new static media::
$ mayan-edms.py collectstatic --noinput
The upgrade procedure is now complete.
Backward incompatible changes
-----------------------------
* None
Bugs fixed or issues closed
---------------------------
* :gitlab-issue:`557` Break workflows with invalid input
* :gitlab-issue:`559` IndexTestCase.test_dual_level_dual_document_index failure
* :gitlab-issue:`562` events.links.link_user_notifications_list should use
reverse
* :gitlab-issue:`564` API REST /api/indexes/ generates an "Internal Server Error"
* :gitlab-issue:`566` apps.common.tests.base.GenericViewTestCase doesn't work
with a custom ROOT_URLCONF
* :gitlab-issue:`568` Tornado 6.0 doesn't support Python 2.7
* :gitlab-issue:`572` Error when sending compressed files: ziparchive object
has no attribute children
* :gitlab-issue:`574` import of E-Mails with empty attachment fails
* :gitlab-issue:`576` Exception with access check for cabinets containing
NON-ASCII chars
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

148
docs/releases/3.1.11.rst Normal file
View File

@@ -0,0 +1,148 @@
Version 3.1.11
==============
Released: April XX, 2019
Changes
-------
Memory usage
^^^^^^^^^^^^
The ``DOCUMENTS_HASH_BLOCK_SIZE`` setting was added to limit the number of
bytes that will be read into memory when calculating the checksum of a new
document. For compatibility with the current bevahor this setting defaults to
0 which means that it is disabled. Disabling the setting will cause the
entire document's file to be loaded into memory. If documents are not
processing due to out of memory errors (large documents or devices with
limited memory), set ``DOCUMENTS_HASH_BLOCK_SIZE`` to a value other than 0.
Limited tests suggest 65535 to be a good alternative.
Tag wizard step
^^^^^^^^^^^^^^^
The tag wizard step was fixed and will now allow attaching multple tags to a
new document.
Permissions
^^^^^^^^^^^
Previously the document checkout information link required one of the following
permissions: document check in, document check in override, or document
checkout. Meanwhile the document checkout information view would require the
document checkout detail view permission. This difference in permissions
has been eliminated and the link will now required the document checkout
detail view permission, same as the view. Update your user role permissions
accordingly.
Other changes
^^^^^^^^^^^^^
* Lower the log severity when links don't resolve.
Removals
--------
* None
Upgrading from a previous version
---------------------------------
If installed via Python's PIP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Remove deprecated requirements::
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
Type in the console::
$ pip install mayan-edms==3.1.11
the requirements will also be updated automatically.
Migrate existing database schema with::
$ mayan-edms.py performupgrade
Add new static media::
$ mayan-edms.py collectstatic --noinput
The upgrade procedure is now complete.
If installed using a direct deployment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Remove deprecated requirements::
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | sudo -u mayan /opt/mayan-edms/bin/pip uninstall -r /dev/stdin
Download and install the new version::
$ sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 mayan-edms==3.1.11
the requirements will also be updated automatically.
Run the upgrade command::
$ sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
MAYAN_DATABASE_NAME=mayan MAYAN_DATABASE_PASSWORD=mayanuserpass \
MAYAN_DATABASE_USER=mayan MAYAN_DATABASE_HOST=127.0.0.1 \
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py performupgrade
Add any new static files::
$ sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py collectstatic --noinput
The upgrade procedure is now complete.
Using Git
^^^^^^^^^
If you installed Mayan EDMS by cloning the Git repository issue the commands::
$ git reset --hard HEAD
$ git pull
otherwise download the compressed archived and uncompress it overriding the
existing installation.
Remove deprecated requirements::
$ pip uninstall -y -r removals.txt
Next upgrade/add the new requirements::
$ pip install --upgrade -r requirements.txt
Migrate existing database schema with::
$ mayan-edms.py performupgrade
Add new static media::
$ mayan-edms.py collectstatic --noinput
The upgrade procedure is now complete.
Backward incompatible changes
-----------------------------
* None
Bugs fixed or issues closed
---------------------------
* None
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -9,10 +9,10 @@ Changes
* Improve index mirroring value clean up code to remove the spaces at the
starts and at the end of directories. Closes again GitLab issue #520
Thanks to @TheOneValen for the report.
Thanks to TheOneValen @ for the report.
* Improve index mirroring cache class to use the hash of the keys
instead of the literal keys. Avoid warning about invalid key
characters. Closes GitLab issue #518. Thanks to @TheOneValen for the
characters. Closes GitLab issue #518. Thanks to TheOneValen @ for the
report.
* Only render the Template API view for authenticated users.
Thanks rgarcia for the report.

View File

@@ -12,10 +12,10 @@ Changes
* Remove duplicate YAML loading of environment variables.
* Don't load development apps if they are already loaded.
* Make sure all key used as input for the cache key hash are
bytes and not unicode. GitLab issue #520. Thanks to @TheOneValen for
the report.
bytes and not unicode. GitLab issue #520. Thanks to TheOneValen
@TheOneValen for the report.
* Ignore document stub from the index mirror. GitLab issue
#520. Thanks to @TheOneValen for the report.
#520. Thanks to TheOneValen @TheOneValen for the report.
* Fix for the Docker image INSTALL_FLAG path. Thanks to
Mark Maglana @relaxdiego for the report and to Hamish Farroq @farroq_HAM
for the patch. GitLab issue #525.

View File

@@ -8,8 +8,7 @@ Changes
-------
* Convert the furl instance to text to allow serializing it into
JSON and be passed as arguments to the background task. Fixes
metadata assignment issues when uploading new documents.
JSON to be passed as arguments to the background task.
Removals
--------

View File

@@ -1,106 +0,0 @@
Version 4.0
===========
Released: XX XX, 2019
Changes
-------
Switch to full app paths
^^^^^^^^^^^^^^^^^^^^^^^^
Instead of inserting the path of the apps into the Python app,
the apps are now referenced by their full import path.
This solves name clashes with external or native Python libraries.
Example: Mayan statistics app vs. Python new statistics library.
Every app reference is now prepended with 'mayan.apps'.
Existing config.yml files need to be updated manually.
Other changes
^^^^^^^^^^^^^
* Split source models into different modules.
* Fix multiple tag selection wizard step.
Removals
--------
* Django suit
* django-environ
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
the requirements will also be updated automatically.
Using Git
^^^^^^^^^
If you installed Mayan EDMS by cloning the Git repository issue the commands::
$ git reset --hard HEAD
$ git pull
otherwise download the compressed archived and uncompress it overriding the
existing installation.
Remove deprecated requirements::
$ pip uninstall -y -r removals.txt
Next upgrade/add the new requirements::
$ pip install --upgrade -r requirements.txt
Common steps
^^^^^^^^^^^^
Perform these steps after updating the code from either step above.
Migrate existing database schema with::
$ mayan-edms.py performupgrade
Add new static media::
$ mayan-edms.py preparestatic --noinput
The upgrade procedure is now complete.
Backward incompatible changes
-----------------------------
* None
Bugs fixed or issues closed
---------------------------
* :gitlab-issue:`395` Add support to limit the size of the cache.
* :gitlab-issue:`487` gnupg1 Issue with Ubuntu 16.04 - Could not show/view documents
* :gitlab-issue:`498` Can't scan subdirectories
* :gitlab-issue:`522` Office 365 SMTP
* :gitlab-issue:`532` Workflow preview isn't updated right after transitions are modified
* :gitlab-issue:`539` Setting for default email sender is missing
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -20,7 +20,8 @@ versions of the documentation contain the release notes for any later releases.
.. toctree::
:maxdepth: 1
3.2
3.1.11
3.1.10
3.1.9
3.1.8
3.1.7

View File

@@ -9,4 +9,3 @@ Administration
.. include:: ../chapters/backups.rst
.. include:: ../chapters/scaling_up.rst
.. include:: ../chapters/database_conversion.rst
.. include:: ../chapters/docker.rst

View File

@@ -8,4 +8,3 @@ Advanced topics
.. include:: ../chapters/metadata.rst
.. include:: ../chapters/transformations.rst
.. include:: ../chapters/versioning.rst
.. include:: ../chapters/password_validation.rst

View File

@@ -83,43 +83,6 @@ moment this could cause problems is when running South migrations during
upgrades, if a migration fails the database structure is left in a transitory
state and has to be reverted manually before trying again.
_mysql_exceptions. OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci, IMPLICIT) and (utf8_general_ci, COERCIBLE) for operation ='”)
---------------------------------------------------------------------------------------------------------------------------------------------------------
::
$ mayan-edms.py shell
>>> from django.db import connection
>>> cursor = connection.cursor()
>>> cursor.execute('SHOW TABLES')
>>> results=[]
>>> for row in cursor.fetchall(): results.append(row)
>>> for row in results: cursor.execute('ALTER TABLE %s CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' % (row[0]))
References:
* http://stackoverflow.com/questions/1073295/django-character-set-with-mysql-weirdness
Incorrect string value: ``'xE2x80x95rs6…'`` for column ``'content'`` at row 1
-----------------------------------------------------------------------------
When using MySQL and doing OCR on languages other than English
Use utf-8 collation on MySQL server, or at least in table
documents_documentpage', content' field
References:
* http://groups.google.com/group/django-users/browse_thread/thread/429447086fca6412
* http://markmail.org/message/bqajx2utvmtriixi
Error "django.db.utils.IntegrityError IntegrityError: (1452, Cannot add or update a child row: a foreign key constraint fails (`…`.`…`, CONSTRAINT `…_refs_id_b0252274` FOREIGN KEY (`…`) REFERENCES `…` (`…`))')
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Solution:
Convert all MySQL tables to the same type, either all MyISAM or InnoDB
Document versions
=================
@@ -185,7 +148,7 @@ 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 preparestatic
$ mayan-edms.py collectstatic
should be used and the resulting static folder served from a webserver.
For more information check the

View File

@@ -92,7 +92,7 @@ Features
* It is very easy to use 3rd party plugins such as the ones available for
Amazon EC2.
* Color coded <../chapters/tags>`.
* :doc:`Color coded tags <../chapters/tags>`.
* Labeled and color coded tags can be assigned for intuitive recognition.

View File

@@ -2,11 +2,9 @@
Installation
############
Mayan EDMS can be install in several way. The two recommended ways are: by
using Docker_, and by doing a direct installation.
The Docker method provides the easiest installation process while the direct
installation provides better performance and customization.
The easiest way to use Mayan EDMS is by using the official Docker_ image.
Make sure Docker is properly installed and working before attempting to install
Mayan EDMS.
*****************************
Minimum hardware requirements
@@ -17,9 +15,34 @@ Minimum hardware requirements
- Unix-like operating system like Linux and OpenBSD. For other operating systems
user container technologies like Docker or virtual machines.
****************
Docker procedure
****************
.. include:: ../chapters/docker_installation.rst
.. include:: ../chapters/deploying.rst
Docker is a computer program that performs operating-system-level
virtualization also known as containerization. It allows independent
"containers" to run within a single Linux instance, avoiding the overhead
of starting and maintaining virtual machines (VMs).
Docker can be installed using their automated script::
wget -qO- https://get.docker.com/ | sh
This installs the latest versions of Docker. If you don't want run an automated
script follow the instructions outlined in their documentation: https://docs.docker.com/install/
Once the Docker installation is finished, proceed to the link below to install
the Docker image for Mayan EDMS.
Docker image chapter: :ref:`docker_install`
*******************
Direct installation
*******************
For users with knowledge of Python, Django, Ubuntu, and databases.
Deployments chapter: :doc:`../chapters/deploying`
.. _Docker: https://www.docker.com/

View File

@@ -0,0 +1,86 @@
###############
Troubleshooting
###############
********
Database
********
_mysql_exceptions. OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci, IMPLICIT) and (utf8_general_ci, COERCIBLE) for operation ='”)
=========================================================================================================================================================
::
$ mayan-edms.py shell
>>> from django.db import connection
>>> cursor = connection.cursor()
>>> cursor.execute('SHOW TABLES')
>>> results=[]
>>> for row in cursor.fetchall(): results.append(row)
>>> for row in results: cursor.execute('ALTER TABLE %s CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' % (row[0]))
References:
* http://stackoverflow.com/questions/1073295/django-character-set-with-mysql-weirdness
Incorrect string value: ``'xE2x80x95rs6…'`` for column ``'content'`` at row 1
=============================================================================
When using MySQL and doing OCR on languages other than English
Use utf-8 collation on MySQL server, or at least in table
documents_documentpage', content' field
References:
* http://groups.google.com/group/django-users/browse_thread/thread/429447086fca6412
* http://markmail.org/message/bqajx2utvmtriixi
Error "django.db.utils.IntegrityError IntegrityError: (1452, Cannot add or update a child row: a foreign key constraint fails (`…`.`…`, CONSTRAINT `…_refs_id_b0252274` FOREIGN KEY (`…`) REFERENCES `…` (`…`))')
==================================================================================================================================================================================================================
Solution:
Convert all MySQL tables to the same type, either all MyISAM or InnoDB
******
Docker
******
MAYAN_APT_INSTALLS does not work for Archlinux with kernels > 4.14
==================================================================
This is caused by a change from kernel 4.18 - 4.19. Metacopy on these kernels
is set to yes in archlinux kernels (/sys/module/overlay/parameters/metacopy)
and overlayfs should override this which it does not at the moment.
The workaround is to disable metacopy::
echo N | sudo tee /sys/module/overlay/parameters/metacopy
References:
* https://bbs.archlinux.org/viewtopic.php?id=241866
* https://www.spinics.net/lists/linux-unionfs/msg06316.html
*********
Passwords
*********
Missing initial credentials or admin password reset
===================================================
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> /bin/bash
/opt/mayan-edms/bin/mayan-edms.py changepassword admin

View File

@@ -1,9 +1,9 @@
from __future__ import unicode_literals
__title__ = 'Mayan EDMS'
__version__ = '3.1.9'
__build__ = 0x030109
__build_string__ = 'v3.1.9_Thu Nov 1 03:55:06 2018 -0400'
__version__ = '3.1.10'
__build__ = 0x030110
__build_string__ = 'v3.1.10-1-g51ea493a26_Thu Apr 4 22:03:19 2019 -0400'
__django_version__ = '1.11'
__author__ = 'Roberto Rosario'
__author_email__ = 'roberto.rosario@mayan-edms.com'

View File

@@ -2,4 +2,4 @@ from __future__ import unicode_literals
from .classes import ModelPermission # NOQA
default_app_config = 'mayan.apps.acls.apps.ACLsApp'
default_app_config = 'acls.apps.ACLsApp'

View File

@@ -1,121 +1,203 @@
from __future__ import absolute_import, unicode_literals
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import get_object_or_404
from mayan.apps.common.mixins import ContentTypeViewMixin
from mayan.apps.permissions.serializers import (
PermissionSerializer, RolePermissionAddRemoveSerializer
)
from mayan.apps.rest_api.mixins import ExternalObjectAPIViewSetMixin
from mayan.apps.rest_api.viewsets import MayanAPIModelViewSet
from rest_framework import generics
from .models import AccessControlList
from .permissions import permission_acl_edit, permission_acl_view
from .serializers import AccessControlListSerializer
from .serializers import (
AccessControlListPermissionSerializer, AccessControlListSerializer,
WritableAccessControlListPermissionSerializer,
WritableAccessControlListSerializer
)
class ObjectACLAPIViewSet(ContentTypeViewMixin, ExternalObjectAPIViewSetMixin, MayanAPIModelViewSet):
content_type_url_kw_args = {
'app_label': 'app_label',
'model': 'model_name'
}
external_object_pk_url_kwarg = 'object_id'
lookup_url_kwarg = 'acl_id'
serializer_class = AccessControlListSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.validated_data.update(
{
'object_id': self.external_object.pk,
'content_type': self.get_content_type(),
}
class APIObjectACLListView(generics.ListCreateAPIView):
"""
get: Returns a list of all the object's access control lists
post: Create a new access control list for the selected object.
"""
def get_content_object(self):
content_type = get_object_or_404(
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def get_external_object_permission(self):
action = getattr(self, 'action', None)
if action is None:
return None
elif action in ['list', 'retrieve', 'permission_list', 'permission_inherited_list']:
return permission_acl_view
content_object = get_object_or_404(
content_type.model_class(), pk=self.kwargs['object_pk']
)
if self.request.method == 'GET':
permission_required = permission_acl_view
else:
return permission_acl_edit
permission_required = permission_acl_edit
def get_external_object_queryset(self):
# Here we get a queryset the object model for which the event
# will be accessed.
return self.get_content_type().get_all_objects_for_this_type()
AccessControlList.objects.check_access(
permissions=permission_required, user=self.request.user,
obj=content_object
)
return content_object
def get_queryset(self):
return self.get_external_object().acls.all()
return self.get_content_object().acls.all()
@action(
detail=True, lookup_url_kwarg='acl_id', methods=('post',),
serializer_class=RolePermissionAddRemoveSerializer,
url_name='permission-add', url_path='permissions/add'
)
def permission_add(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.permissions_add(instance=instance)
headers = self.get_success_headers(data=serializer.data)
return Response(
serializer.data, headers=headers, status=status.HTTP_200_OK
def get_serializer_context(self):
"""
Extra context provided to the serializer class.
"""
context = super(APIObjectACLListView, self).get_serializer_context()
if self.kwargs:
context.update(
{
'content_object': self.get_content_object(),
}
)
return context
def get_serializer(self, *args, **kwargs):
if not self.request:
return None
return super(APIObjectACLListView, self).get_serializer(*args, **kwargs)
def get_serializer_class(self):
if self.request.method == 'GET':
return AccessControlListSerializer
else:
return WritableAccessControlListSerializer
class APIObjectACLView(generics.RetrieveDestroyAPIView):
"""
delete: Delete the selected access control list.
get: Returns the details of the selected access control list.
"""
serializer_class = AccessControlListSerializer
def get_content_object(self):
if self.request.method == 'GET':
permission_required = permission_acl_view
else:
permission_required = permission_acl_edit
content_type = get_object_or_404(
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
@action(
detail=True, lookup_url_kwarg='acl_id',
serializer_class=PermissionSerializer, url_name='permission-list',
url_path='permissions'
)
def permission_list(self, request, *args, **kwargs):
queryset = self.get_object().permissions.all()
page = self.paginate_queryset(queryset)
serializer = self.get_serializer(
queryset, many=True, context={'request': request}
content_object = get_object_or_404(
content_type.model_class(), pk=self.kwargs['object_pk']
)
if page is not None:
return self.get_paginated_response(serializer.data)
return Response(serializer.data)
@action(
detail=True, lookup_url_kwarg='acl_id',
serializer_class=PermissionSerializer,
url_name='permission-inherited-list', url_path='permissions/inherited'
)
def permission_inherited_list(self, request, *args, **kwargs):
queryset = self.get_object().get_inherited_permissions()
page = self.paginate_queryset(queryset)
serializer = self.get_serializer(
queryset, many=True, context={'request': request}
AccessControlList.objects.check_access(
permissions=permission_required, user=self.request.user,
obj=content_object
)
if page is not None:
return self.get_paginated_response(serializer.data)
return content_object
return Response(serializer.data)
def get_queryset(self):
return self.get_content_object().acls.all()
@action(
detail=True, lookup_url_kwarg='acl_id',
methods=('post',), serializer_class=RolePermissionAddRemoveSerializer,
url_name='permission-remove', url_path='permissions/remove'
)
def permission_remove(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.permissions_remove(instance=instance)
headers = self.get_success_headers(data=serializer.data)
return Response(
serializer.data, headers=headers, status=status.HTTP_200_OK
class APIObjectACLPermissionListView(generics.ListCreateAPIView):
"""
get: Returns the access control list permission list.
post: Add a new permission to the selected access control list.
"""
def get_acl(self):
return get_object_or_404(
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'],
model=self.kwargs['model']
)
content_object = get_object_or_404(
content_type.model_class(), pk=self.kwargs['object_pk']
)
AccessControlList.objects.check_access(
permissions=permission_acl_view, user=self.request.user,
obj=content_object
)
return content_object
def get_queryset(self):
return self.get_acl().permissions.all()
def get_serializer(self, *args, **kwargs):
if not self.request:
return None
return super(APIObjectACLPermissionListView, self).get_serializer(*args, **kwargs)
def get_serializer_class(self):
if self.request.method == 'GET':
return AccessControlListPermissionSerializer
else:
return WritableAccessControlListPermissionSerializer
def get_serializer_context(self):
context = super(APIObjectACLPermissionListView, self).get_serializer_context()
if self.kwargs:
context.update(
{
'acl': self.get_acl(),
}
)
return context
class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
"""
delete: Remove the permission from the selected access control list.
get: Returns the details of the selected access control list permission.
"""
lookup_url_kwarg = 'permission_pk'
serializer_class = AccessControlListPermissionSerializer
def get_acl(self):
return get_object_or_404(
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'],
model=self.kwargs['model']
)
content_object = get_object_or_404(
content_type.model_class(), pk=self.kwargs['object_pk']
)
AccessControlList.objects.check_access(
permissions=permission_acl_view, user=self.request.user,
obj=content_object
)
return content_object
def get_queryset(self):
return self.get_acl().permissions.all()
def get_serializer_context(self):
context = super(APIObjectACLPermissionView, self).get_serializer_context()
if self.kwargs:
context.update(
{
'acl': self.get_acl(),
}
)
return context

View File

@@ -2,55 +2,35 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from mayan.apps.common import MayanAppConfig, menu_object, menu_secondary
from mayan.apps.events import ModelEventType
from mayan.apps.events.links import (
link_events_for_object, link_object_event_types_user_subcriptions_list
)
from mayan.apps.navigation import SourceColumn
from common import MayanAppConfig, menu_object, menu_sidebar
from navigation 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 = 'mayan.apps.acls'
name = 'acls'
verbose_name = _('ACLs')
def ready(self):
super(ACLsApp, self).ready()
from actstream import registry
AccessControlList = self.get_model(model_name='AccessControlList')
ModelEventType.register(
event_types=(event_acl_created, event_acl_edited),
model=AccessControlList
)
ModelPermission.register_inheritance(
model=AccessControlList, related='content_object',
)
AccessControlList = self.get_model('AccessControlList')
SourceColumn(
attribute='role', is_identifier=True, is_sortable=True,
source=AccessControlList
source=AccessControlList, label=_('Role'), attribute='role'
)
SourceColumn(
source=AccessControlList, label=_('Permissions'),
attribute='get_permission_titles'
)
menu_object.bind_links(
links=(
link_acl_permissions, link_acl_delete,
link_events_for_object,
link_object_event_types_user_subcriptions_list
),
links=(link_acl_permissions, link_acl_delete),
sources=(AccessControlList,)
)
menu_secondary.bind_links(
menu_sidebar.bind_links(
links=(link_acl_create,), sources=('acls:acl_list',)
)
registry.register(AccessControlList)

View File

@@ -1,4 +1,4 @@
from __future__ import absolute_import, unicode_literals
from __future__ import unicode_literals, absolute_import
import logging
@@ -8,9 +8,23 @@ logger = logging.getLogger(__name__)
class ModelPermission(object):
_inheritances = {}
_proxies = {}
_registry = {}
_proxies = {}
_inheritances = {}
@classmethod
def register(cls, model, permissions):
from django.contrib.contenttypes.fields import GenericRelation
cls._registry.setdefault(model, [])
for permission in permissions:
cls._registry[model].append(permission)
AccessControlList = apps.get_model(
app_label='acls', model_name='AccessControlList'
)
model.add_to_class('acls', GenericRelation(AccessControlList))
@classmethod
def get_classes(cls, as_content_type=False):
@@ -40,38 +54,31 @@ class ModelPermission(object):
app_label='permissions', model_name='StoredPermission'
)
permissions = cls.get_for_class(klass=type(instance))
permissions = []
class_permissions = cls.get_for_class(klass=type(instance))
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 permissions
permission.stored_permission.pk for permission in set(permissions)
]
return StoredPermission.objects.filter(pk__in=pks)
@classmethod
def get_inheritances(cls, model):
return cls._inheritances[model]
@classmethod
def register(cls, model, permissions):
from django.contrib.contenttypes.fields import GenericRelation
cls._registry.setdefault(model, [])
for permission in permissions:
cls._registry[model].append(permission)
AccessControlList = apps.get_model(
app_label='acls', model_name='AccessControlList'
)
model.add_to_class(
name='acls', value=GenericRelation(to=AccessControlList)
)
def register_proxy(cls, source, model):
cls._proxies[model] = source
@classmethod
def register_inheritance(cls, model, related):
cls._inheritances.setdefault(model, [])
cls._inheritances[model].append(related)
cls._inheritances[model] = related
@classmethod
def register_proxy(cls, source, model):
cls._proxies[model] = source
def get_inheritance(cls, model):
return cls._inheritances[model]

View File

@@ -1,16 +0,0 @@
from __future__ import absolute_import, unicode_literals
from django.utils.translation import ugettext_lazy as _
from mayan.apps.events 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'
)

View File

@@ -1,13 +0,0 @@
from __future__ import unicode_literals
from django import forms
from mayan.apps.common.forms import FilteredSelectionForm
from .models import AccessControlList
class ACLCreateForm(FilteredSelectionForm, forms.ModelForm):
class Meta:
fields = ('role',)
model = AccessControlList

View File

@@ -1,10 +1,6 @@
from __future__ import absolute_import, unicode_literals
from mayan.apps.appearance.classes import Icon
from appearance.classes import Icon
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-dual', primary_symbol='lock',
secondary_symbol='plus'
)
icon_acl_new = Icon(driver_name='fontawesome', symbol='plus')

View File

@@ -3,11 +3,10 @@ from __future__ import unicode_literals
from django.apps import apps
from django.utils.translation import ugettext_lazy as _
from mayan.apps.navigation import Link
from mayan.apps.permissions.icons import icon_permission
from navigation import Link
from .icons import icon_acl_delete, icon_acl_list, icon_acl_new
from .permissions import permission_acl_edit, permission_acl_view
from .icons import icon_acl_list, icon_acl_new
from .permissions import permission_acl_view, permission_acl_edit
def get_kwargs_factory(variable_name):
@@ -21,7 +20,7 @@ def get_kwargs_factory(variable_name):
)
return {
'app_label': '"{}"'.format(content_type.app_label),
'model_name': '"{}"'.format(content_type.model),
'model': '"{}"'.format(content_type.model),
'object_id': '{}.pk'.format(variable_name)
}
@@ -29,21 +28,21 @@ def get_kwargs_factory(variable_name):
link_acl_delete = Link(
icon_class=icon_acl_delete, kwargs={'acl_id': 'resolved_object.pk'},
permission=permission_acl_edit, tags='dangerous', text=_('Delete'),
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(
variable_name='resolved_object'
), permission=permission_acl_view, text=_('ACLs'), view='acls:acl_list'
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'),
permission=permission_acl_edit, text=_('New ACL'), view='acls:acl_create'
permissions=(permission_acl_edit,), text=_('New ACL'),
view='acls:acl_create'
)
link_acl_permissions = Link(
args='resolved_object.pk', icon_class=icon_permission,
permission=permission_acl_edit, text=_('Permissions'),
args='resolved_object.pk', permissions=(permission_acl_edit,),
permissions_related='content_object', text=_('Permissions'),
view='acls:acl_permissions',
)

View File

@@ -1,21 +1,23 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/ar/)\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2019-03-16 22:48+0000\n"
"Last-Translator: Yaman Sanobar <yman.snober@gmail.com>\n"
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/"
"ar/)\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"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"
"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
msgid "ACLs"
@@ -31,13 +33,13 @@ msgstr "الصلاحيات"
#: links.py:32
msgid "Delete"
msgstr ""
msgstr "حذف"
#: links.py:41
msgid "New ACL"
msgstr ""
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
@@ -156,8 +158,7 @@ msgid "Object ID"
msgstr ""
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42

View File

@@ -1,20 +1,21 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/language/bg/)\n"
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/"
"language/bg/)\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
@@ -37,7 +38,7 @@ msgstr ""
msgid "New ACL"
msgstr ""
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
@@ -156,8 +157,7 @@ msgid "Object ID"
msgstr ""
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42

View File

@@ -1,22 +1,24 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Atdhe Tabaku <Atdhe617@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/rosarior/mayan-edms/language/bs_BA/)\n"
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/"
"rosarior/mayan-edms/language/bs_BA/)\n"
"Language: bs_BA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"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"
"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
msgid "ACLs"
@@ -38,7 +40,7 @@ msgstr "Obriši"
msgid "New ACL"
msgstr "Novi ACL"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Nedovoljan pristup za:%s"
@@ -81,7 +83,9 @@ msgstr "API URL ukazujući na listu dozvola za ovu listu kontrole pristupa."
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."
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
msgid "Primary key of the new permission to grant to the access control list."
@@ -96,7 +100,9 @@ msgstr "Nema takve dozvole: %s"
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."
msgstr ""
"Lista odvojenih primarnih ključeva za razdvajanje sa komandom dodeljuje se "
"ovoj listi kontrola pristupa."
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
@@ -157,8 +163,7 @@ msgid "Object ID"
msgstr "ID objekta"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
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
@@ -172,7 +177,8 @@ msgstr "Uloge čiji će pristup biti modifikovan."
#: workflow_actions.py:51
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."
msgstr ""
"Dozvole za dodeljivanje / poništavanje / od uloge za gore izabrani objekat."
#: workflow_actions.py:59
msgid "Grant access"

Binary file not shown.

View File

@@ -0,0 +1,183 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2019-01-17 19:28+0000\n"
"Last-Translator: Jiri Fait <fait@orkasolutions.cz>\n"
"Language-Team: Czech (http://www.transifex.com/rosarior/mayan-edms/language/"
"cs/)\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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
msgid "ACLs"
msgstr ""
#: apps.py:23 models.py:47
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
msgid "New ACL"
msgstr ""
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:60
#, 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"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr ""
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:57
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
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:151
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
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: workflow_actions.py:25
msgid "Object type"
msgstr ""
#: workflow_actions.py:28
msgid "Type of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:34
msgid "Object ID"
msgstr ""
#: workflow_actions.py:37
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42
msgid "Roles"
msgstr ""
#: workflow_actions.py:44
msgid "Roles whose access will be modified."
msgstr ""
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr ""
#: workflow_actions.py:59
msgid "Grant access"
msgstr ""
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

View File

@@ -1,183 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Rasmus Kierudsen <tebrasso@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Danish (http://www.transifex.com/rosarior/mayan-edms/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACLs"
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Rolle"
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Tilladelse"
#: links.py:32
msgid "Delete"
msgstr "Slet"
#: links.py:41
msgid "New ACL"
msgstr "Ny ACL"
#: managers.py:57 managers.py:96
#, python-format
msgid "Insufficient access for: %s"
msgstr "Utilstrækkelig adgang til: %s"
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:60
#, 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"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Redigér ACL'er"
#: permissions.py:13
msgid "View ACLs"
msgstr "Se ACL'er"
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:57
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
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Slet ACL: %s"
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:151
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
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:167
msgid "Available permissions"
msgstr "Tilgængelige tilladelser"
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: workflow_actions.py:25
msgid "Object type"
msgstr ""
#: workflow_actions.py:28
msgid "Type of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:34
msgid "Object ID"
msgstr ""
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42
msgid "Roles"
msgstr "Roller"
#: workflow_actions.py:44
msgid "Roles whose access will be modified."
msgstr ""
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr ""
#: workflow_actions.py:59
msgid "Grant access"
msgstr ""
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

Binary file not shown.

View File

@@ -0,0 +1,184 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Rasmus Kierudsen <tebrasso@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-11-12 14:13+0000\n"
"Last-Translator: Rasmus Kierudsen <tebrasso@gmail.com>\n"
"Language-Team: Danish (Denmark) (http://www.transifex.com/rosarior/mayan-"
"edms/language/da_DK/)\n"
"Language: da_DK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACL'er"
#: apps.py:23 models.py:47
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
msgid "New ACL"
msgstr "Ny ACL"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Utilstækkelig adgang for: %s"
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:60
#, 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"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editér ACL"
#: permissions.py:13
msgid "View ACLs"
msgstr "Se ACL"
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:57
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
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Slet ACL: %s"
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:151
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
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: workflow_actions.py:25
msgid "Object type"
msgstr "Objekttype"
#: workflow_actions.py:28
msgid "Type of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:34
msgid "Object ID"
msgstr "Objekt ID"
#: workflow_actions.py:37
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42
msgid "Roles"
msgstr "Roller"
#: workflow_actions.py:44
msgid "Roles whose access will be modified."
msgstr ""
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr ""
#: workflow_actions.py:59
msgid "Grant access"
msgstr "Giv tilladelse"
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Tilbagekald tilladelse"

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Berny <berny@bernhard-marx.de>, 2015
# Jesaja Everling <jeverling@gmail.com>, 2017
@@ -11,14 +11,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"PO-Revision-Date: 2018-10-07 11:53+0000\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2019-03-31 21:36+0000\n"
"Last-Translator: Mathias Behrle <mathiasb@m9s.biz>\n"
"Language-Team: German (Germany) (http://www.transifex.com/rosarior/mayan-edms/language/de_DE/)\n"
"Language-Team: German (Germany) (http://www.transifex.com/rosarior/mayan-"
"edms/language/de_DE/)\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
@@ -41,7 +42,7 @@ msgstr "Löschen"
msgid "New ACL"
msgstr "Neue Berechtigung"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Unzureichende Berechtigung für: %s"
@@ -57,7 +58,8 @@ msgstr "Berechtigungseinträge"
#: models.py:60
#, 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\""
msgstr ""
"Berechtigungen \"%(permissions)s\" von Rolle \"%(role)s\" für \"%(object)s\""
#: models.py:77
msgid "None"
@@ -84,11 +86,15 @@ msgstr "API URL für die Liste der Berechtigungen dieser ACL"
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."
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
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."
msgstr ""
"Primärschlüssel der neuen Berechtigung für die Zugriffsberechtigungsliste."
#: serializers.py:111 serializers.py:187
#, python-format
@@ -99,11 +105,14 @@ msgstr "Keine solche Berechtigung: %s"
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."
msgstr ""
"Durch Komma getrennte Liste von Primärschlüsseln der zu dieser "
"Zugriffsberechtigungsliste hinzuzufügenden Berechtigungen."
#: serializers.py:138
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."
msgstr ""
"Primärschlüssel der Rolle die dieser Zugriffsberechtigung zugeordnet ist."
#: views.py:77
#, python-format
@@ -123,7 +132,9 @@ msgstr "Keine Zugriffsberechtigungen für dieses Objekt verfügbar"
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."
msgstr ""
"Über Zugriffsberechtigungen wird der Zugriff von Benutzern zu Systemobjekten "
"kontrolliert."
#: views.py:155
#, python-format
@@ -145,7 +156,8 @@ 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."
msgstr ""
"Deaktivierte Berechtigungen sind von einem übergeordneten Objekt vererbt."
#: workflow_actions.py:25
msgid "Object type"
@@ -160,8 +172,7 @@ msgid "Object ID"
msgstr "Objekt ID"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr "Numerischer Identifikator des Objekts"
#: workflow_actions.py:42
@@ -175,12 +186,14 @@ msgstr "Rollen deren Zugang bearbeitet wird."
#: workflow_actions.py:51
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."
msgstr ""
"Berechtigungen, die der Rolle für das ausgewählte Objekt erteilt oder "
"entzogen werden."
#: workflow_actions.py:59
msgid "Grant access"
msgstr "Zugriff erteilen"
msgstr "Zugriffsberechtigung erteilen"
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Zugriff entziehen"
msgstr "Zugriffsberechtigung entziehen"

Binary file not shown.

View File

@@ -0,0 +1,188 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Greek (http://www.transifex.com/rosarior/mayan-edms/language/"
"el/)\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ΛΕΠ"
#: apps.py:23 models.py:47
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
msgid "New ACL"
msgstr "Νέα ΛΕΠ"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Μη επαρκή δικαιώματα πρόσβασης για το: %s"
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:60
#, 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 "Λίστες Ελέγχου Πρόσβασης (ΛΕΠ)"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Τροποποιηση ΛΕΠ"
#: permissions.py:13
msgid "View ACLs"
msgstr "Εμφάνιση ΛΕΠ"
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:57
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
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Άγνωστο δικαίωμα: %s"
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Νέα λίστα ελέγχου για: %s"
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Διαγραφή ΛΕΠ: %s"
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:151
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
#, python-format
msgid "Access control lists for: %s"
msgstr "Λίστα ελέγχου πρόσβασης για: %s"
#: views.py:167
msgid "Available permissions"
msgstr "Διαθέσιμα δικαιώματα"
#: views.py:168
msgid "Granted permissions"
msgstr "Χωρηγημένα δικαιώματα"
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Δικαιώματα του Ρόλου \"%(role)s\" για \"%(object)s\""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
"Απενεργοποιημένα δικαιώματα κληρονομούνται από το \"γοννικό\" αντικείμενο"
#: workflow_actions.py:25
msgid "Object type"
msgstr "Τύπος αντικειμένου"
#: workflow_actions.py:28
msgid "Type of the object for which the access will be modified."
msgstr "Τύπος του αντικειμένου για το οποίο η πρόσβαση θα τροποποιηθεί."
#: workflow_actions.py:34
msgid "Object ID"
msgstr "Αναγνωριστικό αντικειμένου"
#: workflow_actions.py:37
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
"Αριθμητικό αναγνωριστικό του αντικειμένου για το οποίο η πρόσβαση θα "
"τροποποιηθεί."
#: workflow_actions.py:42
msgid "Roles"
msgstr "Ρόλοι"
#: workflow_actions.py:44
msgid "Roles whose access will be modified."
msgstr "Ρόλοι των οποιων η πρόσβαση θα τροποποιηθει."
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr ""
"Δικαιώματα προς χορήγηση/ανάληση προς/από τον ρόλο για το ανωτέρω επιλεγμένο "
"αντικείμενο."
#: workflow_actions.py:59
msgid "Grant access"
msgstr "Χορήγηση πρόσβασης"
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Ανάκληση πρόσβασης"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-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"
@@ -37,7 +37,7 @@ msgstr ""
msgid "New ACL"
msgstr ""
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# jmcainzos <jmcainzos@vodafone.es>, 2015
# Roberto Rosario, 2015
@@ -10,14 +10,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"PO-Revision-Date: 2018-09-27 01:48+0000\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2019-04-09 05:08+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n"
"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/"
"language/es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
@@ -40,7 +41,7 @@ msgstr "Borrar"
msgid "New ACL"
msgstr "Nueva LCA"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Acceso insuficiente para: %s"
@@ -56,7 +57,8 @@ msgstr "Entradas de acceso"
#: models.py:60
#, 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\""
msgstr ""
"Permisos \"%(permissions)s\" para el rol \"%(role)s\" para \"%(object)s\""
#: models.py:77
msgid "None"
@@ -77,17 +79,24 @@ msgstr "Ver LCAs"
#: serializers.py:24 serializers.py:132
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."
msgstr ""
"URL de la API que apunta a la lista de permisos para esta lista de control "
"de acceso."
#: serializers.py:57
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."
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
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."
msgstr ""
"Llave primaria del nuevo permiso para conceder a la lista de control de "
"acceso."
#: serializers.py:111 serializers.py:187
#, python-format
@@ -98,11 +107,15 @@ msgstr "No existe el permiso: %s"
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."
msgstr ""
"Lista separada por comas de las llaves primarias de permisos para conceder a "
"esta lista de control de acceso."
#: serializers.py:138
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."
msgstr ""
"Las llaves primarias de los roles a los que se vincula esta lista de control "
"de acceso."
#: views.py:77
#, python-format
@@ -122,7 +135,9 @@ msgstr "No hay LCAs para este objeto"
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."
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
#, python-format
@@ -159,8 +174,7 @@ msgid "Object ID"
msgstr "ID de objeto"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
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
@@ -174,7 +188,9 @@ msgstr "Roles cuyo acceso será modificado."
#: workflow_actions.py:51
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."
msgstr ""
"Permisos para otorgar/revocar a los roles para el objeto seleccionado "
"anteriormente."
#: workflow_actions.py:59
msgid "Grant access"

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Mehdi Amani <MehdiAmani@toorintan.com>, 2017
# Nima Towhidi <nima.towhidi@gmail.com>, 2017
@@ -9,14 +9,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Persian (http://www.transifex.com/rosarior/mayan-edms/language/fa/)\n"
"Language-Team: Persian (http://www.transifex.com/rosarior/mayan-edms/"
"language/fa/)\n"
"Language: fa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fa\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: apps.py:15 links.py:37
@@ -39,7 +40,7 @@ msgstr "حذف"
msgid "New ACL"
msgstr "دسترسی جدید"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "کمبود دسترسی برای: %s"
@@ -82,7 +83,9 @@ msgstr "API URL اشاره گر به لیست اجازه های این دستر
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 کارآفرینی کانونی است."
msgstr ""
"URL API اشاره به اجازه در رابطه با لیست کنترل دسترسی که به آن متصل است. این "
"URL متفاوت از URL کارآفرینی کانونی است."
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
@@ -97,7 +100,9 @@ msgstr "این اجازه ئوجود ندارد: %s"
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr "لیست مجوز از کلیدهای مجاز مجاز برای حذف این لیست کنترل دسترسی جداگانه را از یکدیگر جدا کنید."
msgstr ""
"لیست مجوز از کلیدهای مجاز مجاز برای حذف این لیست کنترل دسترسی جداگانه را از "
"یکدیگر جدا کنید."
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
@@ -158,8 +163,7 @@ msgid "Object ID"
msgstr "شناسه اشیاء"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr "شناسه عددی شئی که دسترسی به آن تغییر خواهد کرد."
#: workflow_actions.py:42

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2016-2017
# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2015
@@ -10,14 +10,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: French (http://www.transifex.com/rosarior/mayan-edms/language/fr/)\n"
"Language-Team: French (http://www.transifex.com/rosarior/mayan-edms/language/"
"fr/)\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: apps.py:15 links.py:37
@@ -40,7 +41,7 @@ msgstr "Suppression"
msgid "New ACL"
msgstr "Nouveau droit"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Droits d'accès insuffisants pour : %s"
@@ -56,7 +57,8 @@ msgstr "Autorisations d'accès"
#: models.py:60
#, python-format
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr "Autorisations \"%(permissions)s\" du rôle \"%(role)s\" pour \"%(object)s\""
msgstr ""
"Autorisations \"%(permissions)s\" du rôle \"%(role)s\" pour \"%(object)s\""
#: models.py:77
msgid "None"
@@ -77,17 +79,24 @@ msgstr "Voir les droits"
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr "URL de l'API pointant vers la liste des autorisations pour cette liste de contrôle d'accès."
msgstr ""
"URL de l'API pointant vers la liste des autorisations pour cette liste de "
"contrôle d'accès."
#: serializers.py:57
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 l'API pointant vers une autorisation en relation avec la liste de contrôle d'accès à laquelle elle est attachée. Cette URL est différente de l'URL du flux de travail canonique."
msgstr ""
"URL de l'API pointant vers une autorisation en relation avec la liste de "
"contrôle d'accès à laquelle elle est attachée. Cette URL est différente de "
"l'URL du flux de travail canonique."
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr "Clé principale de la nouvelle autorisation à accorder à la liste de contrôle d'accès."
msgstr ""
"Clé principale de la nouvelle autorisation à accorder à la liste de contrôle "
"d'accès."
#: serializers.py:111 serializers.py:187
#, python-format
@@ -98,11 +107,14 @@ msgstr "Aucune autorisation de ce genre : %s"
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr "Liste séparée par des virgules des clés primaires d'autorisation à accorder à cette liste de contrôle d'accès."
msgstr ""
"Liste séparée par des virgules des clés primaires d'autorisation à accorder "
"à cette liste de contrôle d'accès."
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr "Clés primaires du rôle auquel cette liste de contrôle d'accès se rattache."
msgstr ""
"Clés primaires du rôle auquel cette liste de contrôle d'accès se rattache."
#: views.py:77
#, python-format
@@ -159,9 +171,10 @@ msgid "Object ID"
msgstr "Identifiant de l'objet"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgstr "Identifiant numérique de l'objet pour lequel les droits d'accès vont être modifiés."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
"Identifiant numérique de l'objet pour lequel les droits d'accès vont être "
"modifiés."
#: workflow_actions.py:42
msgid "Roles"
@@ -174,7 +187,8 @@ msgstr "Rôles pour lesquels les droits d'accès vont être modifiés."
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr "Autorisations à accorder/révoquer au rôle pour l'objet sélectionné ci-dessus."
msgstr ""
"Autorisations à accorder/révoquer au rôle pour l'objet sélectionné ci-dessus."
#: workflow_actions.py:59
msgid "Grant access"

View File

@@ -1,20 +1,21 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Hungarian (http://www.transifex.com/rosarior/mayan-edms/language/hu/)\n"
"Language-Team: Hungarian (http://www.transifex.com/rosarior/mayan-edms/"
"language/hu/)\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
@@ -37,7 +38,7 @@ msgstr "Törlés"
msgid "New ACL"
msgstr ""
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
@@ -156,8 +157,7 @@ msgid "Object ID"
msgstr ""
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42

View File

@@ -1,20 +1,21 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Indonesian (http://www.transifex.com/rosarior/mayan-edms/language/id/)\n"
"Language-Team: Indonesian (http://www.transifex.com/rosarior/mayan-edms/"
"language/id/)\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: apps.py:15 links.py:37
@@ -37,7 +38,7 @@ msgstr ""
msgid "New ACL"
msgstr ""
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
@@ -156,8 +157,7 @@ msgid "Object ID"
msgstr ""
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42

View File

@@ -1,21 +1,22 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Marco Camplese <marco.camplese.mc@gmail.com>, 2016-2017
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Italian (http://www.transifex.com/rosarior/mayan-edms/language/it/)\n"
"Language-Team: Italian (http://www.transifex.com/rosarior/mayan-edms/"
"language/it/)\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
@@ -38,7 +39,7 @@ msgstr "Cancella"
msgid "New ACL"
msgstr "Nuova ACL"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
@@ -81,7 +82,10 @@ msgstr "URL delle API che punta alla lista controllo accessi"
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 che indica una autorizzazione in relazione all'elenco di controllo di accesso a cui è associato. Questo URL è diverso dall'originale canonico URL."
msgstr ""
"API URL che indica una autorizzazione in relazione all'elenco di controllo "
"di accesso a cui è associato. Questo URL è diverso dall'originale canonico "
"URL."
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
@@ -96,7 +100,9 @@ msgstr "Nessun permesso: %s"
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr "Lista separata da virgole delle chiavi primarie dei permessi per garantire l'accesso alle liste di controllo"
msgstr ""
"Lista separata da virgole delle chiavi primarie dei permessi per garantire "
"l'accesso alle liste di controllo"
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
@@ -157,8 +163,7 @@ msgid "Object ID"
msgstr ""
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Evelijn Saaltink <evelijnsaaltink@gmail.com>, 2016
# Justin Albstbstmeijer <justin@albstmeijer.nl>, 2016
@@ -10,14 +10,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/rosarior/mayan-edms/language/nl_NL/)\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/rosarior/mayan-"
"edms/language/nl_NL/)\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl_NL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
@@ -40,7 +41,7 @@ msgstr "Verwijder"
msgid "New ACL"
msgstr "Nieuwe authorisatielijst"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Onvoldoende toegang voor: %s"
@@ -56,7 +57,9 @@ msgstr "Authorisaties invoer"
#: models.py:60
#, python-format
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr "Permissies \"%(permissions)s\" voor gebruikersrol \"%(role)s\" voor \"%(object)s\""
msgstr ""
"Permissies \"%(permissions)s\" voor gebruikersrol \"%(role)s\" voor "
"\"%(object)s\""
#: models.py:77
msgid "None"
@@ -83,26 +86,37 @@ msgstr "UPI URL wijzend naar de permissielijst voor deze toegangscontrolelijst"
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 "UPI URL wijzend naar een permissie gerelateerd aan de toegangscontrolelijst waarvan het een aanhangsel is. Dit URL is anders dan de canonical Workflow URL"
msgstr ""
"UPI URL wijzend naar een permissie gerelateerd aan de toegangscontrolelijst "
"waarvan het een aanhangsel is. Dit URL is anders dan de canonical Workflow "
"URL"
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr "Primaire sleutel van de nieuwe permissie om toegang te geven tot de toeganscontrolelijst"
msgstr ""
"Primaire sleutel van de nieuwe permissie om toegang te geven tot de "
"toeganscontrolelijst"
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Permissie niet gevonden: %s\n\nAlternative translation: Permissie bestaat niet (Permission does not exist)"
msgstr ""
"Permissie niet gevonden: %s\n"
"\n"
"Alternative translation: Permissie bestaat niet (Permission does not exist)"
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr "Kommagescheiden lijst van primaire permissie sleutels om toegang te geven tot deze toegangscontrole lijst"
msgstr ""
"Kommagescheiden lijst van primaire permissie sleutels om toegang te geven "
"tot deze toegangscontrole lijst"
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr "Primaire Sleutel van de rol waar deze togangscontrolelijst aan gekoppeld is. "
msgstr ""
"Primaire Sleutel van de rol waar deze togangscontrolelijst aan gekoppeld is. "
#: views.py:77
#, python-format
@@ -159,8 +173,7 @@ msgid "Object ID"
msgstr "voorwerp identificatie"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr "Nummer van het voorwerp waarvoor de toegang wordt gewijzigd"
#: workflow_actions.py:42
@@ -174,7 +187,9 @@ msgstr "Gebruikersrol waarvoor de toegang wordt gewijzigd"
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr "Permissies to geven/verwijderen naar/van de rol voor het geselecteerde object hierboven "
msgstr ""
"Permissies to geven/verwijderen naar/van de rol voor het geselecteerde "
"object hierboven "
#: workflow_actions.py:59
msgid "Grant access"

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Daniel Winiarski <daniel.winiarski.dw@gmail.com>, 2017
# Wojciech Warczakowski <w.warczakowski@gmail.com>, 2016
@@ -10,15 +10,18 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Polish (http://www.transifex.com/rosarior/mayan-edms/language/pl/)\n"
"Language-Team: Polish (http://www.transifex.com/rosarior/mayan-edms/language/"
"pl/)\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
#: apps.py:15 links.py:37
msgid "ACLs"
@@ -40,7 +43,7 @@ msgstr "Usuń"
msgid "New ACL"
msgstr "Nowa lista ACL"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Niewystarczający dostęp dla: %s"
@@ -56,7 +59,9 @@ msgstr "Zgłoszenia dostępu"
#: models.py:60
#, python-format
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr "Uprawnienia \"%(permissions)s\" dla roli \"%(role)s\" dotyczące \"%(object)s\""
msgstr ""
"Uprawnienia \"%(permissions)s\" dla roli \"%(role)s\" dotyczące \"%(object)s"
"\""
#: models.py:77
msgid "None"
@@ -83,11 +88,15 @@ msgstr "API URL prowadzący do listy uprawnień dla listy kontroli dostępu."
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 prowadzący do uprawnienia w liście kontroli dostępu, w której uprawnienie występuje. "
msgstr ""
"API URL prowadzący do uprawnienia w liście kontroli dostępu, w której "
"uprawnienie występuje. "
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr "Klucz główny nowego uprawnienia dla udzielenia dostępu do listy kontroli dostępu."
msgstr ""
"Klucz główny nowego uprawnienia dla udzielenia dostępu do listy kontroli "
"dostępu."
#: serializers.py:111 serializers.py:187
#, python-format
@@ -98,7 +107,9 @@ msgstr "Brak uprawnienia: %s"
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr "Rozdzielona przecinkami lista uprawnień kluczy głównych dla udzielenia dostępu do listy kontroli dostępu."
msgstr ""
"Rozdzielona przecinkami lista uprawnień kluczy głównych dla udzielenia "
"dostępu do listy kontroli dostępu."
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
@@ -159,9 +170,9 @@ msgid "Object ID"
msgstr "ID obiektu"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgstr "Numeryczny identyfikator obiektu, dla którego dostęp zostanie zmodyfikowany."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
"Numeryczny identyfikator obiektu, dla którego dostęp zostanie zmodyfikowany."
#: workflow_actions.py:42
msgid "Roles"

View File

@@ -1,20 +1,21 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Portuguese (http://www.transifex.com/rosarior/mayan-edms/language/pt/)\n"
"Language-Team: Portuguese (http://www.transifex.com/rosarior/mayan-edms/"
"language/pt/)\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:15 links.py:37
@@ -37,7 +38,7 @@ msgstr "Eliminar"
msgid "New ACL"
msgstr ""
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
@@ -156,8 +157,7 @@ msgid "Object ID"
msgstr ""
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
#: workflow_actions.py:42

View File

@@ -1,22 +1,24 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Aline Freitas <aline@alinefreitas.com.br>, 2016
# Jadson Ribeiro <jadsonbr@outlook.com.br>, 2017
# José Samuel Facundo da Silva <samuel.facundo@ufca.edu.br>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/rosarior/mayan-edms/language/pt_BR/)\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2018-12-21 01:11+0000\n"
"Last-Translator: José Samuel Facundo da Silva <samuel.facundo@ufca.edu.br>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/rosarior/mayan-"
"edms/language/pt_BR/)\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: apps.py:15 links.py:37
@@ -25,7 +27,7 @@ msgstr "Controle Acesso \"ACLs\""
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Regras"
msgstr "Papéis"
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
@@ -39,10 +41,10 @@ msgstr "Excluir"
msgid "New ACL"
msgstr "Nova regra"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
msgstr "Acesso insuficiente para: %s"
#: models.py:55
msgid "Access entry"
@@ -55,7 +57,8 @@ msgstr "Entradas de acesso"
#: models.py:60
#, python-format
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr "Permissões \"%(permissions)s\" do papel \"%(role)s\" para \"%(object)s\""
msgstr ""
"Permissões \"%(permissions)s\" do papel \"%(role)s\" para \"%(object)s\""
#: models.py:77
msgid "None"
@@ -67,26 +70,32 @@ msgstr "Listas de controle de acesso"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editar regras"
msgstr "Editar Controle de Acesso \"ACLs\""
#: permissions.py:13
msgid "View ACLs"
msgstr "Visualizar regras"
msgstr "Visualizar Controle de Acesso \"ACLs\""
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr "API URL apontando para a lista de permissões para esta lista de controle de acesso."
msgstr ""
"API URL apontando para a lista de permissões para esta lista de controle de "
"acesso."
#: serializers.py:57
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 apontando para uma permissão em relação à lista de controle de acesso à qual ela está anexada. Esse URL é diferente do URL de fluxo de trabalho canônico."
msgstr ""
"API URL apontando para uma permissão em relação à lista de controle de "
"acesso à qual ela está anexada. Esse URL é diferente do URL de fluxo de "
"trabalho canônico."
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr "Chave primária da nova permissão para conceder à lista de controle de acesso."
msgstr ""
"Chave primária da nova permissão para aceder à lista de controle de acesso."
#: serializers.py:111 serializers.py:187
#, python-format
@@ -97,11 +106,14 @@ msgstr "Sem permissão: %s"
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr "Lista de chaves primárias de permissão separadas por vírgulas para conceder a esta lista de controle de acesso."
msgstr ""
"Lista de chaves primárias de permissão separadas por vírgulas para conceder "
"a esta lista de controle de acesso."
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr "As chaves primárias da função a que esta lista de controle de acesso se liga."
msgstr ""
"As chaves primárias da função a que esta lista de controle de acesso se liga."
#: views.py:77
#, python-format
@@ -115,13 +127,15 @@ msgstr "Apagar ACL: %s"
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
msgstr "Não há Controle de Acesso \"ACLs\" para este objeto"
#: views.py:151
msgid ""
"ACL stands for Access Control List and is a precise method to control user "
"access to objects in the system."
msgstr ""
"ACL significa Lista de Controle de Acesso - \"Acess Control List\" - e é um "
"método preciso para controlar o acesso do usuário a objetos do sistema."
#: views.py:155
#, python-format
@@ -147,38 +161,39 @@ msgstr "As permissões inativas foram herdadas de um objeto precedente."
#: workflow_actions.py:25
msgid "Object type"
msgstr ""
msgstr "Tipo do objeto"
#: workflow_actions.py:28
msgid "Type of the object for which the access will be modified."
msgstr ""
msgstr "Tipo do objeto cujo acesso será modificado."
#: workflow_actions.py:34
msgid "Object ID"
msgstr ""
msgstr "ID do objeto"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgstr ""
msgid "Numeric identifier of the object for which the access will be modified."
msgstr "Identificador numérico do objeto cujo acesso será modificado."
#: workflow_actions.py:42
msgid "Roles"
msgstr "Regras"
msgstr "Papéis"
#: workflow_actions.py:44
msgid "Roles whose access will be modified."
msgstr ""
msgstr "Papéis cujo acesso será modificado."
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr ""
"Permissões a serem concedidas/revogadas para o papel em relação ao objeto "
"selecionado acima."
#: workflow_actions.py:59
msgid "Grant access"
msgstr ""
msgstr "Conceder acesso"
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""
msgstr "Revogar acesso"

View File

@@ -1,21 +1,24 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Harald Ersch, 2019
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-29 12:42-0400\n"
"PO-Revision-Date: 2018-09-08 08:06+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/rosarior/mayan-edms/language/ro_RO/)\n"
"POT-Creation-Date: 2019-04-09 02:06-0400\n"
"PO-Revision-Date: 2019-03-15 07:43+0000\n"
"Last-Translator: Harald Ersch\n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/rosarior/mayan-"
"edms/language/ro_RO/)\n"
"Language: ro_RO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ro_RO\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
#: apps.py:15 links.py:37
msgid "ACLs"
@@ -23,7 +26,7 @@ msgstr "ACL-uri"
#: apps.py:23 models.py:47
msgid "Role"
msgstr ""
msgstr "Rol"
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
@@ -35,25 +38,26 @@ msgstr "Șterge"
#: links.py:41
msgid "New ACL"
msgstr ""
msgstr "ACL nou"
#: managers.py:57 managers.py:96
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
msgstr "Acces insuficient pentru: %s"
#: models.py:55
msgid "Access entry"
msgstr ""
msgstr "Înregistrare acces"
#: models.py:56
msgid "Access entries"
msgstr ""
msgstr "Înregistrări de acces"
#: models.py:60
#, python-format
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr ""
"Permisiunile \"%(permissions)s\" la rolul \"%(role)s\" pentru \"%(object)s\""
#: models.py:77
msgid "None"
@@ -75,90 +79,102 @@ msgstr "Vezi ACL-uri"
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
"Adresă URL API care indică lista permisiunilor pentru această listă de "
"control acces."
#: serializers.py:57
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 ""
"Adresă URL API care indică o permisiune în legătură cu lista de control al "
"accesului la care este atașată. Această adresă URL este diferită de adresa "
"URL canonică a fluxului de lucru."
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
"Cheie primară a noii permisiuni de acordare a listei de control al accesului."
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
msgstr "Nu există o astfel de permisiune: %s"
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
"Liste separate prin virgulă de chei primare de permisiune pentru a acorda "
"această listă de control acces."
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
"Cheile primare ale rolului la care se leagă această listă de control al "
"accesului."
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
msgstr "Noi liste de control acces pentru: %s"
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
msgstr "Șterge ACL: %s"
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
msgstr "Nu există ACL-uri pentru acest obiect"
#: views.py:151
msgid ""
"ACL stands for Access Control List and is a precise method to control user "
"access to objects in the system."
msgstr ""
"ACL reprezintă lista de control al accesului și este o metodă precisă de "
"control al accesului utilizatorilor la obiecte din sistem."
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr ""
msgstr "Listele de control al accesului pentru: %s"
#: views.py:167
msgid "Available permissions"
msgstr ""
msgstr "Permisiuni disponibile"
#: views.py:168
msgid "Granted permissions"
msgstr ""
msgstr "Permisiuni acordate"
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
msgstr "Permisiunile rolului \"%(role)s\" pentru \"%(object)s\""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
msgstr "Permisiunile dezactivate sunt moștenite de la un obiect părinte."
#: workflow_actions.py:25
msgid "Object type"
msgstr ""
msgstr "Tipul obiectului"
#: workflow_actions.py:28
msgid "Type of the object for which the access will be modified."
msgstr ""
msgstr "Tipul obiectului pentru care va fi modificat accesul ."
#: workflow_actions.py:34
msgid "Object ID"
msgstr ""
msgstr "ID obiect"
#: workflow_actions.py:37
msgid ""
"Numeric identifier of the object for which the access will be modified."
msgid "Numeric identifier of the object for which the access will be modified."
msgstr ""
"Identificatorul numeric al obiectului pentru care va fi modificat accesul."
#: workflow_actions.py:42
msgid "Roles"
@@ -166,17 +182,19 @@ msgstr "Roluri"
#: workflow_actions.py:44
msgid "Roles whose access will be modified."
msgstr ""
msgstr "Roluri a căror acces va fi modificat."
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr ""
"Permisiuni de acordare / revocare în / a rolului pentru obiectului selectat "
"mai sus."
#: workflow_actions.py:59
msgid "Grant access"
msgstr ""
msgstr "Acordă acces"
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""
msgstr "Revocă acces"

Some files were not shown because too many files have changed in this diff Show More