Compare commits
75 Commits
versions/n
...
hotfix
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2de95b57d3 | ||
|
|
cd74f6f461 | ||
|
|
9e1b77c5fc | ||
|
|
fbf03788a2 | ||
|
|
4ee11cd067 | ||
|
|
ad84cf8cdb | ||
|
|
d627e9713c | ||
|
|
80e5fd89e4 | ||
|
|
7d756de3de | ||
|
|
69bd6c116e | ||
|
|
0065edfae9 | ||
|
|
9ec021241c | ||
|
|
3a60155bfa | ||
|
|
f6a0a421a5 | ||
|
|
7ed26f4d4c | ||
|
|
daca9dd539 | ||
|
|
d493ec34b2 | ||
|
|
51ea493a26 | ||
|
|
49403978b1 | ||
|
|
8c770d5ba3 | ||
|
|
b01e8707a3 | ||
|
|
8896f58d6f | ||
|
|
3afb74224d | ||
|
|
3a4f97c5c2 | ||
|
|
8419facb8a | ||
|
|
3cbc6435a2 | ||
|
|
e7627a723e | ||
|
|
e77afeee37 | ||
|
|
6a5a2350bb | ||
|
|
912675bf99 | ||
|
|
a56e3ca111 | ||
|
|
5f877cdc22 | ||
|
|
d5efd53b5b | ||
|
|
c156c02376 | ||
|
|
a196205593 | ||
|
|
26cf7fb97c | ||
|
|
863892f909 | ||
|
|
5a64a3e833 | ||
|
|
45786005ab | ||
|
|
f45384e399 | ||
|
|
33a542b9d5 | ||
|
|
00d07214b1 | ||
|
|
1e8030a722 | ||
|
|
f6404fbd4b | ||
|
|
b59c39261f | ||
|
|
a5b513f986 | ||
|
|
45a688749c | ||
|
|
15473620c4 | ||
|
|
7cd0e16cc2 | ||
|
|
caab7b3b59 | ||
|
|
47d850e164 | ||
|
|
b27e160d15 | ||
|
|
3eb4a70fbf | ||
|
|
d4df7e69d7 | ||
|
|
0055429703 | ||
|
|
eafdfd8177 | ||
|
|
a8e52126f5 | ||
|
|
70facb96f0 | ||
|
|
f583e24c47 | ||
|
|
7db27aa9fe | ||
|
|
f5bc055a11 | ||
|
|
965160b7a2 | ||
|
|
85b3164592 | ||
|
|
7634d9e5da | ||
|
|
48253f3f85 | ||
|
|
dd2c64d453 | ||
|
|
517c05a9c2 | ||
|
|
99bbe7d47c | ||
|
|
586d41eeff | ||
|
|
7fb18b14eb | ||
|
|
68398e2ce6 | ||
|
|
d23f5eb540 | ||
|
|
4bbd5dab70 | ||
|
|
c4b9ae596e | ||
|
|
f5d2f34e30 |
@@ -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
|
||||
24
.tx/config
24
.tx/config
@@ -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
|
||||
|
||||
479
HISTORY.rst
479
HISTORY.rst
File diff suppressed because it is too large
Load Diff
3
Makefile
3
Makefile
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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`
|
||||
|
||||
|
||||
@@ -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`
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1 +1 @@
|
||||
3.1.9
|
||||
3.1.10
|
||||
|
||||
@@ -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'}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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::
|
||||
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
====================
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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 %}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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>'
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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: ''
|
||||
|
||||
@@ -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
|
||||
|
||||
89
docs/conf.py
89
docs/conf.py
@@ -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 --------------------------------------------
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ repository for electronic documents.
|
||||
topics/integration
|
||||
topics/advanced
|
||||
topics/administration
|
||||
topics/troubleshooting
|
||||
topics/development
|
||||
topics/faq
|
||||
topics/license
|
||||
|
||||
@@ -31,9 +31,9 @@ for Mayan EDMS. Most MERCs will be Feature MERCs.
|
||||
2. An **Informational** MERC describes a Mayan EDMS design issue, or
|
||||
provides general guidelines or information to the Mayan EDMS community,
|
||||
but does not propose a new feature. Informational MERCs do not
|
||||
necessarily represent a community consensus or recommendation, so users
|
||||
and implementers are free to ignore Informational MERCs or follow their
|
||||
advice.
|
||||
necessarily represent a community consensus or
|
||||
recommendation, so users and implementers are free to ignore
|
||||
Informational MERCs or follow their advice.
|
||||
|
||||
3. A **Process** MERC describes a process surrounding Mayan EDMS, or
|
||||
proposes a change to (or an event in) a process. Process MERCs are
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
====================
|
||||
=====================
|
||||
MERC 2: Test writing
|
||||
====================
|
||||
=====================
|
||||
|
||||
:MERC: 2
|
||||
:Author: Michael Price
|
||||
|
||||
@@ -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()
|
||||
),
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
188
docs/releases/3.1.10.rst
Normal file
@@ -0,0 +1,188 @@
|
||||
Version 3.1.10
|
||||
==============
|
||||
|
||||
Released: April 04, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
Test improvements
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
A number of test improvements were backported from the development branch. These
|
||||
include a mixin to assign random primary keys to the test objects. Normally
|
||||
primary keys are sequential and their predictability can hide edge cases that
|
||||
would normally only manifest in production. The tests case code was also split
|
||||
into smaller mixin units separating them by purpose. All code to perform HTTP
|
||||
requests now resides in the ``ClientMethodsTestCaseMixin``. Changes in the
|
||||
``ContentTypeCheckTestCaseMixin`` were added to enable this mixin for the API views
|
||||
in a future minor version. The test view code was moved into its own mixin
|
||||
called ``TestViewTestCaseMixin``. This mixin allows creating dynamic views to test
|
||||
object and link resolution among other things. The API base test case class is
|
||||
now part of the same class hierarchy, this means that the API test code will
|
||||
now behave the same and will benefit from all improvements in the base test case
|
||||
classes. Some indexing tests were failing randomly. This was caused by the way
|
||||
the test were built and not because of faulty code. The tests were updated and
|
||||
now operate as expected. While there is no official support for installing
|
||||
Mayan EDMS as a sub URL updates to the ``TestViewTestCaseMixin`` will allow it to
|
||||
execute with custom ``ROOT_URLCONF`` configurations. Further work and feedback is
|
||||
needed to officially support this installation method.
|
||||
|
||||
|
||||
Fixes
|
||||
^^^^^
|
||||
|
||||
The advanced search API endpoint was fixed and is now usable. Tests for all
|
||||
the issues fixed were added to avoid future regressions. A fix was applied
|
||||
to the compressed class that caused compressed files uploads to fail from the
|
||||
web form.
|
||||
|
||||
Docker
|
||||
^^^^^^
|
||||
|
||||
Updates were added to the Docker image that allow it to build on armv7l
|
||||
platforms like the RasperryPi, Odroid XU4, and Odroid HC2. This doesn't imply
|
||||
official support for these platforms. Further experimentation and optimization
|
||||
is needed and this changed will now allow users to build the image and provide
|
||||
feedback in an easier manner.
|
||||
|
||||
|
||||
Installation
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The installation process has been updated to work around the Python pip
|
||||
issue #6197 (https://github.com/pypa/pip/issues/6197).
|
||||
|
||||
|
||||
User interface
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Improvements in the AJAX menu rendering were conflicting with an old method
|
||||
of refreshing the unread notification counter badge. This conflict would cause
|
||||
the unread notification counter badge to blink and/or disappear. The older
|
||||
badge refresh method was removed and improvements to the menu rendering from
|
||||
the development branch were backported to support displaying link badges from
|
||||
the templates completing fixing the issue. An API entrypoint was also backported
|
||||
showing a list of all the server side AJAX templates. This change doesn't affect
|
||||
the API layout and it remains compatible with the previous version. Newlines
|
||||
are now explicitly removed from the rendered AJAX templates avoiding rendering
|
||||
issues on some browsers.
|
||||
|
||||
|
||||
Emails
|
||||
^^^^^^
|
||||
|
||||
An update was added to will now cause Mayan EDMS to reject all email attachments
|
||||
with a size 0 even if the attachment is valid. Documents of size 0 are not
|
||||
consideref valid in Mayan EDMS since they can't be introspected for MIME type,
|
||||
don't contain at least one version, and don't contain a single page. All these
|
||||
are requirements for a valid document in Mayan EDMS.
|
||||
|
||||
|
||||
Memory usage
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The ``MIMETYPE_FILE_READ_SIZE`` setting was added to limit the number of bytes that
|
||||
will be read into memory to determine the MIME type of a new document. For
|
||||
compatibility with the current bevahor this setting defaults to 0 which means
|
||||
that it is disabled. Disabling the setting will cause the entire document's
|
||||
file to be loaded into memory. If documents are not processing due to out of
|
||||
memory errors (large documents or devices with limited memory), set
|
||||
``MIMETYPE_FILE_READ_SIZE`` to a value other than 0. Limited tests suggest 1024
|
||||
to be a good alternative as most "magic numbers" used for MIME type detection
|
||||
are located at the start of the file and just reading the first 1024 bytes will
|
||||
result in a positive identification with little memory usage.
|
||||
|
||||
|
||||
Other changes
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
* Add missing document index API view create permission.
|
||||
* Fix index list API view. Add index create, delete, detail API tests.
|
||||
* Add support for skipping a default set of tests. Tests to be excluded
|
||||
by default should be tagged as 'exclude'.
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
* None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.1.10
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
|
||||
Common steps
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Perform these steps after updating the code from either step above.
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
* None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
* :gitlab-issue:`557` Break workflows with invalid input
|
||||
* :gitlab-issue:`559` IndexTestCase.test_dual_level_dual_document_index failure
|
||||
* :gitlab-issue:`562` events.links.link_user_notifications_list should use
|
||||
reverse
|
||||
* :gitlab-issue:`564` API REST /api/indexes/ generates an "Internal Server Error"
|
||||
* :gitlab-issue:`566` apps.common.tests.base.GenericViewTestCase doesn't work
|
||||
with a custom ROOT_URLCONF
|
||||
* :gitlab-issue:`568` Tornado 6.0 doesn't support Python 2.7
|
||||
* :gitlab-issue:`572` Error when sending compressed files: ziparchive object
|
||||
has no attribute children
|
||||
* :gitlab-issue:`574` import of E-Mails with empty attachment fails
|
||||
* :gitlab-issue:`576` Exception with access check for cabinets containing
|
||||
NON-ASCII chars
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
148
docs/releases/3.1.11.rst
Normal file
148
docs/releases/3.1.11.rst
Normal file
@@ -0,0 +1,148 @@
|
||||
Version 3.1.11
|
||||
==============
|
||||
|
||||
Released: April XX, 2019
|
||||
|
||||
|
||||
Changes
|
||||
-------
|
||||
|
||||
Memory usage
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The ``DOCUMENTS_HASH_BLOCK_SIZE`` setting was added to limit the number of
|
||||
bytes that will be read into memory when calculating the checksum of a new
|
||||
document. For compatibility with the current bevahor this setting defaults to
|
||||
0 which means that it is disabled. Disabling the setting will cause the
|
||||
entire document's file to be loaded into memory. If documents are not
|
||||
processing due to out of memory errors (large documents or devices with
|
||||
limited memory), set ``DOCUMENTS_HASH_BLOCK_SIZE`` to a value other than 0.
|
||||
Limited tests suggest 65535 to be a good alternative.
|
||||
|
||||
|
||||
Tag wizard step
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The tag wizard step was fixed and will now allow attaching multple tags to a
|
||||
new document.
|
||||
|
||||
|
||||
Permissions
|
||||
^^^^^^^^^^^
|
||||
|
||||
Previously the document checkout information link required one of the following
|
||||
permissions: document check in, document check in override, or document
|
||||
checkout. Meanwhile the document checkout information view would require the
|
||||
document checkout detail view permission. This difference in permissions
|
||||
has been eliminated and the link will now required the document checkout
|
||||
detail view permission, same as the view. Update your user role permissions
|
||||
accordingly.
|
||||
|
||||
|
||||
Other changes
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
* Lower the log severity when links don't resolve.
|
||||
|
||||
|
||||
Removals
|
||||
--------
|
||||
|
||||
* None
|
||||
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
If installed via Python's PIP
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install mayan-edms==3.1.11
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
If installed using a direct deployment
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | sudo -u mayan /opt/mayan-edms/bin/pip uninstall -r /dev/stdin
|
||||
|
||||
Download and install the new version::
|
||||
|
||||
$ sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir --no-use-pep517 mayan-edms==3.1.11
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
Run the upgrade command::
|
||||
|
||||
$ sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
|
||||
MAYAN_DATABASE_NAME=mayan MAYAN_DATABASE_PASSWORD=mayanuserpass \
|
||||
MAYAN_DATABASE_USER=mayan MAYAN_DATABASE_HOST=127.0.0.1 \
|
||||
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py performupgrade
|
||||
|
||||
Add any new static files::
|
||||
|
||||
$ sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media /opt/mayan-edms/bin/mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
Using Git
|
||||
^^^^^^^^^
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Remove deprecated requirements::
|
||||
|
||||
$ pip uninstall -y -r removals.txt
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
-----------------------------
|
||||
|
||||
* None
|
||||
|
||||
|
||||
Bugs fixed or issues closed
|
||||
---------------------------
|
||||
|
||||
* None
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
--------
|
||||
|
||||
@@ -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/
|
||||
@@ -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
|
||||
|
||||
@@ -9,4 +9,3 @@ Administration
|
||||
.. include:: ../chapters/backups.rst
|
||||
.. include:: ../chapters/scaling_up.rst
|
||||
.. include:: ../chapters/database_conversion.rst
|
||||
.. include:: ../chapters/docker.rst
|
||||
|
||||
@@ -8,4 +8,3 @@ Advanced topics
|
||||
.. include:: ../chapters/metadata.rst
|
||||
.. include:: ../chapters/transformations.rst
|
||||
.. include:: ../chapters/versioning.rst
|
||||
.. include:: ../chapters/password_validation.rst
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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/
|
||||
|
||||
86
docs/topics/troubleshooting.rst
Normal file
86
docs/topics/troubleshooting.rst
Normal 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
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
@@ -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
|
||||
@@ -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')
|
||||
|
||||
@@ -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',
|
||||
)
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
BIN
mayan/apps/acls/locale/cs/LC_MESSAGES/django.mo
Normal file
BIN
mayan/apps/acls/locale/cs/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
183
mayan/apps/acls/locale/cs/LC_MESSAGES/django.po
Normal file
183
mayan/apps/acls/locale/cs/LC_MESSAGES/django.po
Normal 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 ""
|
||||
Binary file not shown.
@@ -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 ""
|
||||
BIN
mayan/apps/acls/locale/da_DK/LC_MESSAGES/django.mo
Normal file
BIN
mayan/apps/acls/locale/da_DK/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
184
mayan/apps/acls/locale/da_DK/LC_MESSAGES/django.po
Normal file
184
mayan/apps/acls/locale/da_DK/LC_MESSAGES/django.po
Normal 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"
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
BIN
mayan/apps/acls/locale/el/LC_MESSAGES/django.mo
Normal file
BIN
mayan/apps/acls/locale/el/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
188
mayan/apps/acls/locale/el/LC_MESSAGES/django.po
Normal file
188
mayan/apps/acls/locale/el/LC_MESSAGES/django.po
Normal 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 "Ανάκληση πρόσβασης"
|
||||
@@ -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 ""
|
||||
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user