Compare commits

..

8 Commits

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

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

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-09 00:32:04 -04:00
6058 changed files with 236269 additions and 129573 deletions

View File

@@ -4,7 +4,8 @@ HISTORY.md
mayan/media
db.sqlite*
docker
!docker/rootfs
!docker/etc
!docker/entrypoint.sh
!docker/version
./.*
docs

View File

@@ -1,3 +1,2 @@
[flake8]
exclude = node_modules,static,templates
ignore = E501, N801, N802, N804, N805, N806
ignore = E501

1
.gitignore vendored
View File

@@ -7,7 +7,6 @@
.coverage
.coverage.tox*
.idea/
*.swp
.tox/
.vagrant
_build/

View File

@@ -119,7 +119,7 @@ job_build_python:
- update-locale LANG=en_US.UTF-8
- export LC_ALL=en_US.UTF-8
- pip install -r requirements/build.txt
- make python-wheel
- make wheel
only:
- releases/all
- releases/python
@@ -140,7 +140,7 @@ job_push_python:
.test_base: &test_base
stage: test
image: ubuntu:18.04
image: ubuntu:16.04
cache:
paths:
- ~/.cache/pip/
@@ -152,8 +152,8 @@ job_push_python:
- locale-gen en_US.UTF-8
- update-locale LANG=en_US.UTF-8
- export LC_ALL=en_US.UTF-8
- apt-get install -qq curl exiftool gcc ghostscript gnupg1 graphviz libfuse2 libjpeg-dev libmagic1 libpng-dev libtiff-dev poppler-utils libreoffice poppler-utils python-dev python-pip tesseract-ocr tesseract-ocr-deu
- pip install -r requirements.txt -r requirements/testing-base.txt
- apt-get install -qq curl gcc ghostscript gpgv gnupg graphviz libfuse2 libjpeg-dev libmagic1 libpng-dev libtiff-dev poppler-utils libreoffice poppler-utils python-dev python-pip tesseract-ocr tesseract-ocr-deu
- pip install -r requirements/testing.txt
only:
- releases/all
- releases/docker
@@ -171,7 +171,7 @@ test-mysql:
- mysql:8.0.3
script:
- apt-get install -qq libmysqlclient-dev mysql-client
- pip install mysqlclient
- pip install mysql-python
- mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "set global character_set_server=utf8mb4;"
- python manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
tags:

View File

@@ -19,12 +19,6 @@ source_lang = en
source_file = mayan/apps/authentication/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.autoadmin-2-0]
file_filter = mayan/apps/autoadmin/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/autoadmin/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.cabinets-2-0]
file_filter = mayan/apps/cabinets/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -49,24 +43,18 @@ source_lang = en
source_file = mayan/apps/converter/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.dashboards-2-0]
file_filter = mayan/apps/dashboards/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/dashboards/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.dependencies-3-0]
file_filter = mayan/apps/dependencies/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/dependencies/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.django_gpg-2-0]
file_filter = mayan/apps/django_gpg/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/django_gpg/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.documents-2-0]
file_filter = mayan/apps/documents/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/documents/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.document_comments-2-0]
file_filter = mayan/apps/document_comments/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -97,12 +85,6 @@ source_lang = en
source_file = mayan/apps/document_states/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.documents-2-0]
file_filter = mayan/apps/documents/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/documents/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.dynamic_search-2-0]
file_filter = mayan/apps/dynamic_search/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -115,12 +97,6 @@ source_lang = en
source_file = mayan/apps/events/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.file_metadata-3-0]
file_filter = mayan/apps/file_metadata/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/file_metadata/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.linking-2-0]
file_filter = mayan/apps/linking/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -151,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
@@ -169,12 +151,6 @@ source_lang = en
source_file = mayan/apps/permissions/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.platform-2-0]
file_filter = mayan/apps/platform/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/platform/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.rest_api-2-0]
file_filter = mayan/apps/rest_api/locale/<lang>/LC_MESSAGES/django.po
source_lang = en

View File

@@ -23,7 +23,7 @@ with deployments, webservers, cloud providers, etc.
Code
----
1. Complete and mail, or scan and email the corresponding Contributor Assignment Agreement: [Mayan EDMS Individual Contributor Assignment Agreement](https://gitlab.com/mayan-edms/mayan-edms/blob/master/docs/chapters/caa_individual.rst) or [Mayan EDMS Entity Contributor Assignment Agreement](https://gitlab.com/mayan-edms/mayan-edms/blob/master/docs/chapters/caa_entity.rst).
1. Complete and mail, or scan and email the corresponding Contributor Assignment Agreement: [Mayan EDMS Individual Contributor Assignment Agreement](https://docs.mayan-edms.com/topics/caa_individual.rst) or [Mayan EDMS Entity Contributor Assignment Agreement](https://docs.mayan-edms.com/topics/topics/caa_entity.rst).
1. Fork [the repository](http://gitlab.com/mayan-edms/mayan-edms).
1. Choose the version for which you want to develop. The code is divided in the
following branches:

View File

@@ -1,279 +1,3 @@
3.2 (2019-04-XX)
================
* Split sources models into separate modules.
* Add support for subfolder scanning to watchfolders. Closes
GitLab issue #498 and #563.
* Updated the source check behavior to allow checking a source
even when the source is disabled and to not deleted processed files
during a check.
* Switch to full app paths.
* Split document app models into separate modules.
* Split workflow views into separate modules.
* Add custom DatabaseWarning to tag the SQLite usage warning.
* Add keyword arguments to add_to_class instances.
* Move add_to_class function to their own module called methods.py
* Remove catch all exception handling for the check in and
check out views.
* Improve checkouts tests code reducing redundant code.
* Change how the HOME_VIEW setting is defined.
* Remove the role permission grant and revoke permission.
* Split trashed document views into their own module.
* Show entire sys trace when an App import exception is raised.
* Remove Django suit from requirements.
* Remove development URLs from main URL file.
* Move API documentation generation from the root URLs module
to the REST API app's URLs module.
* Update Pillow to version 6.0.0
* Update PyYAML to version 5.1. Update use of safe_load and
safe_dump to load and dump using the SafeLoader.
* Add SilenceLoggerTestCaseMixin to lower level of loggers
during tests.
* New default value for setting DOCUMENTS_HASH_BLOCK_SIZE is
65535.
* New default value for setting MIMETYPE_FILE_READ_SIZE is
1024.
* Add workaround for Tesseract bug 1670
https://github.com/tesseract-ocr/tesseract/issues/1670
https://github.com/tesseract-ocr/tesseract/commit/3292484f67af8bdda23aa5e510918d0115785291
https://gitlab.gnome.org/World/OpenPaperwork/pyocr/issues/104
* Move setting COMMON_TEMPORARY_DIRECTORY to the storage app.
The setting is now STORAGE_TEMPORARY_DIRECTORY.
* Move file related utilities to the storage app.
* Backport and remove unused code from the permission app.
* Move the navigation and authentication templates to their
respective apps.
* Add dashboard app.
* Remove queryset slicing hack from the Document list view.
And slice the Recently Added Document queryset itself.
* Move stub filtering to the Document model manager.
* Increase the default number of recently added documents and
recently accessed documents from 40 to 400.
* Integrate django-autoadmin into the core apps.
* Update middleware to new style classes.
* Add server side invalid document template.
* Move tag specific JavaScript to the tags app.
* Reduce form boilerplate code with new FormOptions class.
* Use FormOptions for the DetailForm class.
* DetailForm now support help text on extra fields.
* Add FilteredSelectionForm class.
* Use FilteredSelectionForm for TagMultipleSelectionForm.
* Use FilteredSelectionForm for the class CabinetListForm.
* Add keyword arguments to URL definitions.
* Use FilteredSelectionForm to add a new ACLCreateForm.
* Rename IndexListForm to IndexTemplateFilteredForm.
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm.
* Improve document signatures tests.
* Add docstrings to most models.
* Add support to the mailing profiles for specifying a from
address. Closes GitLab issue #522.
* Expose new Django settings: AUTH_PASSWORD_VALIDATORS, DEFAULT_FROM_EMAIL,
EMAIL_TIMEOUT, INTERNAL_IPS, LANGUAGES, LANGUAGE_CODE, STATIC_URL,
STATICFILES_STORAGE, TIME_ZONE, WSGI_APPLICATION.
* Convert language choices into a function.
* Move language choices generation to documents.utils.
* Remove support for generating documents images in base 64
format.
* Move Pillow initialization from the module to the backend
class initialization.
* Remove star import from the ACL and Common apps.
* Add dependencies app
* Convert the document tags widget to use HTML templates.
* Move Tag app HTML widgets to their own module.
* Move the document index app widgets to the html_widget.py
module.
* Update group members view permission. The group edit and
user edit permission are now required.
* Add keyword arguments to messages uses.
* Add keyword arguments to the reverse use in views.
* Add MERCs 5 and 6.
* Update authentication function views to use Django's new class
based authentication views.
* Expose Django's LOGOUT_REDIRECT_URL setting.
* Move current user views from the common app to the user
management app.
* Move the purge permission logic to the StorePermission
manager.
* Remove the MIMETYPE_FILE_READ_SIZE setting.
* Use copyfileobj in the document parsers.
* Backport list facet menu code.
* Backport sidebar code.
* CSS updates to maximize usable width.
* Improve partial navigation error messages and display.
* Add user created and user edited events.
* Add group created and group edited events.
* Add support for SourceColumn widgets.
* Improve styling of the template debug view.
* Add support for showing the current user's events.
* Add support kwargs to the SourceColumn class.
* Improve the event widgets, views and tests.
* Add mailer use event.
* Remove the include fontawesome and download it from
the NPMregistry.
* Fix issue installing scoped NPM packages.
* Add new icons classes and templates.
* Add support for icon composition.
* Add support for link icon path imports.
* Remove support for link icon strings.
* Split document app form into separate modules.
* Move the favorite document views to their own module.
* Replace DocumentTypeSelectioForm with an improved
version that does filtering.
* Update OCR links activation.
* Update document parsing link activation.
* Add favorite document views tests.
* Add document state action view test.
* Remove sidebar menu instance. The secondary menu and the
previour sidebar menu now perform the same function.
* Backport source column identifiable and sortable
improvements.
* Update the way the no-result template is shown.
* Improve TwoStateWidget to use a template. Make
it compatible with the SourceColumn.
* Update SourceColumn to support related attributes.
* Add support for display for empty values for
source columns.
* Add support for source column object or attribute
absolute URLs.
* Add sortable columns to all apps.
* Remove permission list display from the ACL list view.
Reduces clutter and unpredictable column size.
* Remove the full name from the user list.
* Add the first name and last name to the user list.
* Add file metadata app.
* Add support for submitting forms by pressing the
Enter key or by double clicking.
* Rename form template 'form_class' to 'form_css_classes'.
* Add support for adding form button aside from the
default submit and cancel.
* Update ChoiceForm to be full height.
* Add AddRemoveView to replace AssignRemoveView
* Update the group roles view to use the new AddRemoveView.
* Add role create and edit events.
* Sort users by lastname, firstname.
* Switch user groups and group users views to AddRemoveView.
* Commit user edit event when an user is added or removed
from a group.
* Commit the group edit event when a group is added or remove
from an user.
* Require dual permissions when add or removing users to and
from group. Same with group to users.
* Backport search improvements.
* Remove search elapsed time calculation.
* Remove SEARCH_LIMIT setting.
* Use the 'handler' prefix for all the signal handler functions.
* Remove custom email widget and use Django's.
* Increase default maximum number of favorite documents to 400.
* Update the role group list view to use the new AddRemoveView.
* Commit the group event in conjunction with the role event
when a group is added or remove from role.
* Update the role permission view to use the new AddRemoveView.
* Rename transformation manager method add_for_model to
add_to_object.
* Rename transformation manager method get_for_model to
get_for_object.
* Load the converter class on demand.
* Remove app top level star imports.
* Monkeypatch group and user models to make their fields
translatable.
* Add new and default Tesseract OCR backend to avoid
Tesseract bug 1670
(https://github.com/tesseract-ocr/tesseract/issues/1670)
* Load only one language in the document properties form.
* Convert title calculation form to a template tag.
* Show the full title as a hover title even when truncated.
* Increase default title truncation length to 120 characters.
* Improve inherited permission computation.
* Add test case mixin that produces ephimeral models.
* Update ACL permissions view to use the new AddRemoveView class.
* Add ACL created and edited events.
* Update index document types view to use the new AddRemoveView
class.
* Add index create and edit events.
* Allow overloading the action_add and action_remove methods
from the AddRemoveView.
* Add view to link document type and indexes from the document
type side.
* Update smart link document type selection view to use
AddRemoveView class.
* Add smart link created and edited events.
* Fix smart link ACL support.
* Update JavaScript downloader to work with Python 3.
* Improve speed of the NPM package hash verification.
* Add view to enable smart links for documents types
from the document type side.
* Enable list link icons.
* Add outline links CSS for facets.
* Add a bottom margin to list links.
* Use copyfileobj to save documents to files
* Add user logged in and logged out events.
* Add transaction handling in more places.
* Update ACLs tests to use ephimeral models.
* Add new app to handle all dependencies.
* Remove the licenses.py module and replace
it with a dependencies.py module.
* Backport ACL computation improvements.
* Remove model permission proxy models.
* Remove related access control argument. This is
now handled by the related field registration.
* Allow nested access control checking.
* check_access's permissions argument must now be
an interable.
* Remove permissions_related from links.
* Remove mayan_permission_attribute_check from
API permission.
* Update Bootstrap and Bootswatch to version 3.4.1.
* Convert the workflow document types view to use
the new AddRemove view.
* Add the workflow created and edited events.
* Remove AssignRemove View.
* Add view to setup workflows per document type
from the document type side.
* Make workflows, workflows states, workflow
transitions column sortable.
* Show completion and intial state in the
workflow proxy instance menu list.
* Fix translation of the source upload forms
using dropzone.js
* Rename get_object_list to get_source_queryset.
* Add uniqueness validation to SingleObjectCreateView.
* Remove MultipleInstanceActionMixin.
* Backport MultipleObjectMixin improvements.
* Remove ObjectListPermissionFilterMixin.
* Add deprecation warning to convertdb
* Add the preparestatic command.
* Remove the related attribute of check_access.
* Remove filter_by_access. Replaced by restrict_queryset.
* Move the user set password views to the authentication app.
* All views redirect to common's home view instead of the
REDIRECT_URL setting.
* Update tag document list and the document tag list
views to require the view permissions for both objects.
* Install and server static content to and from the image.
* Add support for editing document comments.
* Remove Internet Explorer specific markup.
* Fix optional metadata remove when mixed with required
metadata.
* Create intermedia file cache folder. Fixes preview errors
when the first document uploaded is an office file.
* Move queue and task registration to the CeleryQueue class.
The .queues.py module is now loaded automatically.
* Allow setting the Docker user UID and GUID.
* Add task path validation.
* Increase dropzone upload file size limit to 2GB.
* Add cabinet created and edited events.
* Show a null mailer backend if there is backend with an
invalid path. Due to the app full path change, existing
mailer setups need to be recreated.
* The document link URL when mailed is now composed of the
COMMON_PROJECT_URL + document URL instead of the Site
domain.
* Add the checkdependencies command.
* Add comment and make file target to generate all requirement
files.
* Place deletion policies units before periods for clarity.
3.1.11 (2019-04-XX)
===================
* Fix multiple tag selection wizard step.
@@ -656,10 +380,6 @@
model.
- Make icon classes file template based.
- Add the current step and total steps of a wizard in the template context.
- Chart updates: Show last update date and time in list view and details view.
Change color scheme to match rest of project. Increase size of data points.
Improve responsive settings. Redirect to the current view after queueing.
- Split document type retention policies into it own view.
3.0.3 (2018-08-17)
==================

View File

@@ -1,6 +1,3 @@
include README.md LICENSE HISTORY.rst mayan/LICENSE
recursive-include mayan/apps *.txt *.html *.css *.ico *.png *.jpg *.js *.mo *.ttf *.woff *.woff2 *.gif *.eot *.svg *.doc *.pdf *.tiff *.sig *.asc *.gpg *.zip *.tar *.gz *.bz2 *.tmpl
global-exclude mayan/settings/local.py *.po
prune mayan/apps/*/static/*/node_modules/*
prune mayan/settings/travis/*
prune mayan/media/*
recursive-include mayan/apps *.txt *.html *.css *.ico *.png *.jpg *.js *.po *.mo *.ttf *.woff *.woff2 *.gif *.eot *.svg *.doc *.pdf *.tiff *.sig *.asc *.gpg *.zip *.tar *.gz *.bz2 package.json
global-exclude mayan/settings/local.py mayan/settings/travis/* mayan/media/*

169
Makefile
View File

@@ -1,20 +1,64 @@
.PHONY: clean-pyc clean-build
help:
@echo "Usage: make <target>\n"
@awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_-]+:.*?## / { printf " * %-40s -%s\n", $$1, $$2 }' $(MAKEFILE_LIST)|sort
help: docker-help
@echo
@echo "**** Main makefile ****"
@echo "clean-build - Remove build artifacts."
@echo "clean-pyc - Remove Python artifacts."
@echo "clean - Remove Python and build artifacts."
@echo "generate-setup - Create and updated setup.py"
@echo "check-readme - Checks validity of the README.rst file for PyPI publication."
@echo "check-missing_migrations - Make sure all models have proper migrations."
@echo "test-all - Run all tests."
@echo "test MODULE=<python module name> - Run tests for a single app, module or test class."
@echo "test-with-postgres-all - Run all tests against a Postgres database container."
@echo "test-postgres MODULE=<python module name> - Run tests for a single app, module or test class against a Postgres database container."
@echo "test-with-mysql-all - Run all tests against a MySQL database container."
@echo "test-mysql MODULE=<python module name> - Run tests for a single app, module or test class against a MySQL database container."
@echo "test-with-oracle-all - Run all tests against a Oracle database container."
@echo "test-oracle MODULE=<python module name> - Run tests for a single app, module or test class against a Oracle database container."
@echo "docs-serve - Run the livehtml documentation generator."
@echo "translations-make - Refresh all translation files."
@echo "translations-compile - Compile all translation files."
@echo "translations-push - Upload all translation files to Transifex."
@echo "translations-pull - Download all translation files from Transifex."
@echo "sdist - Build the source distribution package."
@echo "wheel - Build the wheel distribution package."
@echo "release - Package (sdist and wheel) and upload a release."
@echo "test-release - Package (sdist and wheel) and upload to the PyPI test server."
@echo "release-test-via-docker-ubuntu - Package (sdist and wheel) and upload to the PyPI test server using an Ubuntu Docker builder."
@echo "release-via-docker-ubuntu - Package (sdist and wheel) and upload to PyPI using an Ubuntu Docker builder."
@echo "test-sdist-via-docker-ubuntu - Make an sdist packange and test it using an Ubuntu Docker container."
@echo "test-wheel-via-docker-ubuntu - Make a wheel package and test it using an Ubuntu Docker container."
@echo "runserver - Run the development server."
@echo "runserver_plus - Run the Django extension's development server."
@echo "shell_plus - Run the shell_plus command."
@echo "test-with-docker-services-on - Launch and initialize production-like services using Docker (Postgres and Redis)."
@echo "test-with-docker-services-off - Stop and delete the Docker production-like services."
@echo "test-with-docker-frontend - Launch a front end instance that uses the production-like services."
@echo "test-with-docker-worker - Launch a worker instance that uses the production-like services."
@echo "docker-mysql-on - Launch and initialize a MySQL Docker container."
@echo "docker-mysql-off - Stop and delete the MySQL Docker container."
@echo "docker-postgres-on - Launch and initialize a PostgreSQL Docker container."
@echo "docker-postgres-off - Stop and delete the PostgreSQL Docker container."
@echo "safety-check - Run a package safety check."
# Cleaning
clean: ## Remove Python and build artifacts.
clean: clean-build clean-pyc
clean-build: ## Remove build artifacts.
clean-build:
rm -fr build/
rm -fr dist/
rm -fr *.egg-info
clean-pyc: ## Remove Python artifacts.
clean-pyc:
find . -name '*.pyc' -exec rm -f {} +
find . -name '*.pyo' -exec rm -f {} +
find . -name '*~' -exec rm -f {} +
@@ -22,29 +66,25 @@ clean-pyc: ## Remove Python artifacts.
# Testing
test: clean-pyc
test: ## MODULE=<python module name> - Run tests for a single app, module or test class.
test:
./manage.py test $(MODULE) --settings=mayan.settings.testing.development --nomigrations $(ARGUMENTS)
test-all: ## Run all tests.
test-all: clean-pyc
test-all:
./manage.py test --mayan-apps --settings=mayan.settings.testing.development --nomigrations $(ARGUMENTS)
test-launch-postgres:
@docker rm -f test-postgres || true
@docker volume rm test-postgres || true
docker run -d --name test-postgres -p 5432:5432 -v test-postgres:/var/lib/postgresql/data healthcheck/postgres
sudo apt-get install -q libpq-dev
sudo apt-get install -qq libpq-dev
pip install psycopg2
while ! docker inspect --format='{{json .State.Health}}' test-postgres|grep 'Status":"healthy"'; do sleep 1; done
test-with-postgres: ## MODULE=<python module name> - Run tests for a single app, module or test class against a Postgres database container.
test-with-postgres: test-launch-postgres
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_postgres --nomigrations
@docker rm -f test-postgres || true
@docker volume rm test-postgres || true
test-with-postgres-all: ## Run all tests against a Postgres database container.
test-with-postgres-all: test-launch-postgres
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_postgres --nomigrations
@docker rm -f test-postgres || true
@@ -54,19 +94,16 @@ test-launch-mysql:
@docker rm -f test-mysql || true
@docker volume rm test-mysql || true
docker run -d --name test-mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan -v test-mysql:/var/lib/mysql healthcheck/mysql
sudo apt-get install -q libmysqlclient-dev mysql-client
pip install mysqlclient
sudo apt-get install -qq libmysqlclient-dev mysql-client
pip install mysql-python
while ! docker inspect --format='{{json .State.Health}}' test-mysql|grep 'Status":"healthy"'; do sleep 1; done
mysql -h 127.0.0.1 -P 3306 -uroot -e "set global character_set_server=utf8mb4;"
test-with-mysql: ## MODULE=<python module name> - Run tests for a single app, module or test class against a MySQL database container.
test-with-mysql: test-launch-mysql
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_mysql --nomigrations
@docker rm -f test-mysql || true
@docker volume rm test-mysql || true
test-with-mysql-all: ## Run all tests against a MySQL database container.
test-with-mysql-all: test-launch-mysql
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_mysql --nomigrations
@docker rm -f test-mysql || true
@@ -81,13 +118,11 @@ test-launch-oracle:
while ! nc -z 127.0.0.1 49161; do sleep 1; done
sleep 10
test-with-oracle: ## MODULE=<python module name> - Run tests for a single app, module or test class against a Oracle database container.
test-with-oracle: test-launch-oracle
./manage.py test $(MODULE) --settings=mayan.settings.testing.docker.db_oracle --nomigrations
@docker rm -f test-oracle || true
@docker volume rm test-oracle || true
test-with-oracle-all: ## Run all tests against a Oracle database container.
test-with-oracle-all: test-launch-oracle
./manage.py test --mayan-apps --settings=mayan.settings.testing.docker.db_oracle --nomigrations
@docker rm -f test-oracle || true
@@ -95,56 +130,58 @@ test-with-oracle-all: test-launch-oracle
# Documentation
docs-serve: ## Run the livehtml documentation generator.
docs-serve:
cd docs;make livehtml
docs-spellcheck: ## Spellcheck the documentation.
docs-spellcheck:
sphinx-build -b spelling -d docs/_build/ docs docs/_build/spelling
# Translations
translations-make: ## Refresh all translation files.
translations-make:
contrib/scripts/process_messages.py -m
translations-compile: ## Compile all translation files.
translations-compile:
contrib/scripts/process_messages.py -c
translations-push: ## Upload all translation files to Transifex.
translations-push:
tx push -s
translations-pull: ## Download all translation files from Transifex.
translations-pull:
tx pull -f
generate-setup:
@./generate_setup.py
@echo "Complete."
# Releases
increase-version: ## Increase the version number of the entire project's files.
increase-version:
@VERSION=`grep "__version__ =" mayan/__init__.py| cut -d\' -f 2|./increase_version.py - $(PART)`; \
BUILD=`echo $$VERSION|awk '{split($$VERSION,a,"."); printf("0x%02d%02d%02d\n", a[1],a[2], a[3])}'`; \
sed -i -e "s/__build__ = 0x[0-9]*/__build__ = $${BUILD}/g" mayan/__init__.py; \
sed -i -e "s/__version__ = '[0-9\.]*'/__version__ = '$${VERSION}'/g" mayan/__init__.py; \
echo $$VERSION > docker/rootfs/version
echo $$VERSION > docker/version
make generate-setup
python-test-release: ## Package (sdist and wheel) and upload to the PyPI test server.
python-test-release: clean wheel
test-release: clean wheel
twine upload dist/* -r testpypi
@echo "Test with: pip install -i https://testpypi.python.org/pypi mayan-edms"
python-release: ## Package (sdist and wheel) and upload a release.
python-release: clean python-wheel
release: clean wheel
twine upload dist/* -r pypi
python-sdist: ## Build the source distribution package.
python-sdist: clean
sdist: clean
python setup.py sdist
ls -l dist
python-wheel: ## Build the wheel distribution package.
python-wheel: clean python-sdist
wheel: clean sdist
pip wheel --no-index --no-deps --wheel-dir dist dist/*.tar.gz
ls -l dist
python-release-test-via-docker-ubuntu: ## Package (sdist and wheel) and upload to the PyPI test server using an Ubuntu Docker builder.
release-test-via-docker-ubuntu:
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
locale-gen en_US.UTF-8 && \
@@ -157,7 +194,7 @@ python-release-test-via-docker-ubuntu: ## Package (sdist and wheel) and upload t
cp -r /host_home/.pypirc ~/.pypirc && \
make test-release"
python-release-via-docker-ubuntu: ## Package (sdist and wheel) and upload to PyPI using an Ubuntu Docker builder.
release-via-docker-ubuntu:
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
apt-get update && \
apt-get -y install locales && \
@@ -171,7 +208,7 @@ python-release-via-docker-ubuntu: ## Package (sdist and wheel) and upload to PyP
cp -r /host_home/.pypirc ~/.pypirc && \
make release"
test-sdist-via-docker-ubuntu: ## Make an sdist package and test it using an Ubuntu Docker container.
test-sdist-via-docker-ubuntu:
docker run --rm --name mayan_sdist_test -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
cp -r /host_source/* . && \
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
@@ -184,7 +221,7 @@ test-sdist-via-docker-ubuntu: ## Make an sdist package and test it using an Ubun
make sdist-test-suit \
"
test-wheel-via-docker-ubuntu: ## Make a wheel package and test it using an Ubuntu Docker container.
test-wheel-via-docker-ubuntu:
docker run --rm --name mayan_wheel_test -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source ubuntu:16.04 /bin/bash -c "\
cp -r /host_source/* . && \
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
@@ -197,7 +234,7 @@ test-wheel-via-docker-ubuntu: ## Make a wheel package and test it using an Ubunt
make wheel-test-suit \
"
python-sdist-test-suit: sdist
sdist-test-suit: sdist
rm -f -R _virtualenv
virtualenv _virtualenv
sh -c '\
@@ -208,7 +245,7 @@ python-sdist-test-suit: sdist
_virtualenv/bin/mayan-edms.py test --mayan-apps \
'
python-wheel-test-suit: wheel
wheel-test-suit: wheel
rm -f -R _virtualenv
virtualenv _virtualenv
sh -c '\
@@ -219,30 +256,18 @@ python-wheel-test-suit: wheel
_virtualenv/bin/mayan-edms.py test --mayan-apps \
'
generate-setup: ## Create and update the setup.py file.
generate-setup: generate-requirements
@./generate_setup.py
@echo "Complete."
generate-requirements: ## Generate all requirements files from the project depedency declarations.
@./manage.py generaterequirements build > requirements/build.txt
@./manage.py generaterequirements development > requirements/development.txt
@./manage.py generaterequirements testing > requirements/testing-base.txt
@./manage.py generaterequirements production --exclude=django > requirements/base.txt
@./manage.py generaterequirements production --only=django > requirements/common.txt
# Dev server
runserver: ## Run the development server.
runserver:
./manage.py runserver --settings=mayan.settings.development $(ADDRPORT)
runserver_plus: ## Run the Django extension's development server.
runserver_plus:
./manage.py runserver_plus --settings=mayan.settings.development $(ADDRPORT)
shell_plus: ## Run the shell_plus command.
shell_plus:
./manage.py shell_plus --settings=mayan.settings.development
test-with-docker-services-on: ## Launch and initialize production-like services using Docker (Postgres and Redis).
test-with-docker-services-on:
docker run -d --name redis -p 6379:6379 redis
docker run -d --name postgres -p 5432:5432 postgres
while ! nc -z 127.0.0.1 6379; do sleep 1; done
@@ -250,45 +275,45 @@ test-with-docker-services-on: ## Launch and initialize production-like services
sleep 4
./manage.py initialsetup --settings=mayan.settings.staging.docker
test-with-docker-services-off: ## Stop and delete the Docker production-like services.
test-with-docker-services-off:
docker stop postgres redis
docker rm postgres redis
test-with-docker-frontend: ## Launch a front end instance that uses the production-like services.
test-with-docker-frontend:
./manage.py runserver --settings=mayan.settings.staging.docker
test-with-docker-worker: ## Launch a worker instance that uses the production-like services.
test-with-docker-worker:
./manage.py celery worker --settings=mayan.settings.staging.docker -B -l INFO -O fair
docker-mysql-on: ## Launch and initialize a MySQL Docker container.
docker-mysql-on:
docker run -d --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -e MYSQL_DATABASE=mayan_edms mysql
while ! nc -z 127.0.0.1 3306; do sleep 1; done
docker-mysql-off: ## Stop and delete the MySQL Docker container.
docker-mysql-off:
docker stop mysql
docker rm mysql
docker-postgres-on: ## Launch and initialize a PostgreSQL Docker container.
docker-postgres-on:
docker run -d --name postgres -p 5432:5432 postgres
while ! nc -z 127.0.0.1 5432; do sleep 1; done
docker-postgres-off: ## Stop and delete the PostgreSQL Docker container.
docker-postgres-off:
docker stop postgres
docker rm postgres
# Security
safety-check: ## Run a package safety check.
safety-check:
safety check
# Other
find-gitignores: ## Find stray .gitignore files.
find-gitignores:
@export FIND_GITIGNORES=`find -name '.gitignore'| wc -l`; \
if [ $${FIND_GITIGNORES} -gt 1 ] ;then echo "More than one .gitignore found."; fi
python-build:
build:
docker rm -f mayan-edms-build || true && \
docker run --rm --name mayan-edms-build -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source python:2-slim sh -c "\
rm /host_source/dist -R || true && \
@@ -301,13 +326,11 @@ python-build:
make wheel && \
cp dist/* /host_source/dist/"
check-readme: ## Checks validity of the README.rst file for PyPI publication.
check-readme:
python setup.py check -r -s
check-missing-migrations: ## Make sure all models have proper migrations.
check-missing-migrations:
./manage.py makemigrations --dry-run --noinput --check
setup-dev-environment: ## Bootstrap a virtualenv by install all dependencies to start developing.
pip install -r requirements.txt -r requirements/development.txt -r requirements/testing-base.txt -r requirements/documentation.txt -r requirements/build.txt
-include docker/Makefile
include docker/Makefile

View File

@@ -1,10 +1,8 @@
#!/bin/sh
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y --no-install-recommends tesseract-ocr-deu
$MAYAN_PIP_BIN install -r ${MAYAN_INSTALL_DIR}/requirements-testing.txt
$MAYAN_PIP_BIN install -r $DOCKER_ROOT/requirements-testing.txt
$MAYAN_BIN test --mayan-apps --settings=mayan.settings.testing

View File

@@ -1445,7 +1445,7 @@ sudo -u mayan \
dialog --infobox "Preparing static files" 3 70
sudo -u mayan \
MAYAN_MEDIA_ROOT=$MAYAN_MEDIA_ROOT \
$MAYAN_BIN 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

View File

@@ -16,7 +16,7 @@ set -e
: ${DATABASE_USER:=mayan}
: ${DATABASE_NAME:=mayan}
: ${DATABASE_PASSWORD:=mayanuserpass}
: ${DOCKER_POSTGRES_IMAGE:=postgres:9.6}
: ${DOCKER_POSTGRES_IMAGE:=postgres:9.5}
: ${DOCKER_POSTGRES_CONTAINER:=mayan-edms-postgres}
: ${DOCKER_POSTGRES_VOLUME:=/docker-volumes/mayan-edms/postgres}
: ${DOCKER_POSTGRES_PORT:=5432}
@@ -121,7 +121,7 @@ docker run -d \
-e MAYAN_DATABASE_PASSWORD=$DATABASE_PASSWORD \
-e MAYAN_DATABASE_USER=$DATABASE_USER \
-e MAYAN_DATABASE_PORT=$DOCKER_POSTGRES_PORT \
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
-v $DOCKER_MAYAN_VOLUME:/var/lib/mayan \
$DOCKER_MAYAN_IMAGE >/dev/null
echo "Done"

View File

@@ -161,7 +161,7 @@ priority = 998
EOF
echo -e "\n -> Collecting the static files \n"
mayan-edms.py preparestatic --noinput
mayan-edms.py collectstatic --noinput
echo -e "\n -> Making the installation directory readable and writable by the webserver user \n"
chown www-data:www-data ${INSTALLATION_DIRECTORY} -R

View File

@@ -9,15 +9,13 @@ import sh
APP_LIST = (
'acls', 'appearance', 'authentication', 'autoadmin', 'cabinets',
'checkouts', 'common', 'converter', 'dashboards', 'dependencies',
'django_gpg', 'document_comments', 'document_indexing',
'document_parsing', 'document_signatures', 'document_states',
'documents', 'dynamic_search', 'events', 'file_metadata', 'linking',
'lock_manager', 'mayan_statistics', 'mailer', 'metadata', 'mirroring',
'motd', 'navigation', 'ocr', 'permissions', 'platform', 'rest_api',
'smart_settings', 'sources', 'storage', 'tags', 'task_manager',
'user_management'
'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 = (

View File

@@ -1,157 +1,164 @@
# vim:set ft=dockerfile:
####
# BASE_IMAGE - Bare bones image with the base packages needed to run Mayan EDMS
####
####################
# Base image start #
####################
FROM debian:9.8-slim as BASE_IMAGE
FROM debian:9.4-slim as BASE_IMAGE
LABEL maintainer="Roberto Rosario roberto.rosario@mayan-edms.com"
MAINTAINER Roberto Rosario "roberto.rosario@mayan-edms.com"
ENV PYTHONUNBUFFERED=1 \
LC_ALL=C.UTF-8 \
PROJECT_INSTALL_DIR=/opt/mayan-edms
ENV DEBIAN_FRONTEND noninteractive
ENV PYTHONUNBUFFERED 1
ENV LC_ALL C.UTF-8
ENV PROJECT_INSTALL_DIR=/opt/mayan-edms
ENV PYTHON_PIP=${PROJECT_INSTALL_DIR}/bin/pip
# Debian package caching
ARG APT_PROXY
RUN set -x \
&& if [ "${APT_PROXY}" ]; \
then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy \
; fi \
# Install base OS packages to run Mayan EDMS
&& DEBIAN_FRONTEND=noninteractive \
apt-get update \
&& apt-get install -y --no-install-recommends \
exiftool \
ghostscript \
gpgv \
gnupg1 \
graphviz \
libfuse2 \
libmagic1 \
libmariadbclient18 \
libreoffice \
libpq5 \
poppler-utils \
redis-server \
sane-utils \
sudo \
supervisor \
tesseract-ocr \
# Remove make and build dependencies
&& apt-get remove make libproxy-tools libreoffice-avmedia-backend-vlc libvlc-bin libvlc5 libvlccore9 adwaita-icon-theme gsettings-desktop-schemas libgstreamer-plugins-base1.0-0 -y \
&& apt-get autoremove -y --purge \
# Add mayan user
&& adduser mayan --disabled-password --disabled-login --no-create-home --gecos "" \
# Pillow can't find zlib or libjpeg on aarch64 (ODROID C2)
&& if [ "$(uname -m)" = "aarch64" ]; then \
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ \
&& ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
; fi \
# Pillow can't find zlib or libjpeg on armv7l (ODROID HC1)
&& if [ "$(uname -m)" = "armv7l" ]; then \
ln -s /usr/lib/arm-linux-gnueabihf/libz.so /usr/lib/ \
&& ln -s /usr/lib/arm-linux-gnueabihf/libjpeg.so /usr/lib/ \
; fi \
# Discard data when Redis runs out of memory
&& echo "maxmemory-policy allkeys-lru" >> /etc/redis/redis.conf \
# Disable saving the Redis database
echo "save \"\"" >> /etc/redis/redis.conf \
# Only provision 1 database
&& echo "databases 1" >> /etc/redis/redis.conf
# Package caching
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
####
# BUILDER_IMAGE - This image buildS the Python package and is discarded afterwards
####
# Reuse image
FROM BASE_IMAGE as BUILDER_IMAGE
WORKDIR /src
# Copy the source files needed to build the Python package
COPY --chown=mayan:mayan requirements /src/requirements
COPY --chown=mayan:mayan \
HISTORY.rst \
LICENSE \
MANIFEST.in \
README.md \
README.rst \
setup.py \
/src/
COPY --chown=mayan:mayan mayan /src/mayan
# Install development packages needed to build the Python packages
RUN DEBIAN_FRONTEND=noninteractive \
# Install base Ubuntu libraries
RUN apt-get update && \
apt-get install -y --no-install-recommends \
default-libmysqlclient-dev \
libffi-dev \
libjpeg-dev \
libpng-dev \
libpq-dev \
libtiff-dev \
zlib1g-dev \
libssl-dev \
g++ \
gcc \
python-dev \
python-virtualenv \
&& mkdir -p "${PROJECT_INSTALL_DIR}" \
&& chown -R mayan:mayan "${PROJECT_INSTALL_DIR}" \
&& chown -R mayan:mayan /src
g++ \
gcc \
ghostscript \
gpgv \
gnupg1 \
graphviz \
libffi-dev \
libfuse2 \
libjpeg-dev \
libmagic1 \
default-libmysqlclient-dev \
libpng-dev \
libpq-dev \
libreoffice \
libtiff-dev \
poppler-utils \
python-dev \
python-setuptools \
python-virtualenv \
python-wheel \
redis-server \
sane-utils \
sudo \
supervisor \
tesseract-ocr \
zlib1g-dev \
libssl-dev \
&& \
apt-get clean autoclean && \
apt-get autoremove --purge -y && \
rm -rf /var/lib/apt/lists/* && \
rm -f /var/cache/apt/archives/*.deb
USER mayan
RUN python -m virtualenv "${PROJECT_INSTALL_DIR}" \
&& . "${PROJECT_INSTALL_DIR}/bin/activate" \
&& pip install --no-cache-dir --no-use-pep517 \
librabbitmq==1.6.1 \
mysql-python==1.2.5 \
psycopg2==2.7.3.2 \
redis==2.10.6 \
# psutil is needed by ARM builds otherwise gevent and gunicorn fail to start
&& UNAME=`uname -m` && if [ "${UNAME#*arm}" != $UNAME ]; then \
pip install --no-cache-dir --no-use-pep517 \
psutil==5.6.2 \
; fi \
# Install the Python packages needed to build Mayan EDMS
&& pip install --no-cache-dir --no-use-pep517 -r /src/requirements/build.txt \
# Build Mayan EDMS
&& python setup.py sdist \
# Install the built Mayan EDMS package
&& pip install --no-cache-dir --no-use-pep517 dist/mayan* \
# Install the static content
&& mayan-edms.py installjavascript \
&& MAYAN_STATIC_ROOT=${PROJECT_INSTALL_DIR}/static mayan-edms.py preparestatic --link --noinput
# Install apt-get-install
ADD https://raw.githubusercontent.com/guilhem/apt-get-install/master/apt-get-install /usr/bin/
RUN chmod +x /usr/bin/apt-get-install
COPY --chown=mayan:mayan requirements/testing-base.txt "${PROJECT_INSTALL_DIR}"
RUN adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
####
# Final image - BASE_IMAGE + Mayan install directory from the builder image
####
# Pillow can't find zlib or libjpeg on aarch64 (ODROID C2)
RUN if [ "$(uname -m)" = "aarch64" ]; then \
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ && \
ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
; fi
# Pillow can't find zlib or libjpeg on armv7l (ODROID HC1)
RUN if [ "$(uname -m)" = "armv7l" ]; then \
ln -s /usr/lib/arm-linux-gnueabihf/libz.so /usr/lib/ && \
ln -s /usr/lib/arm-linux-gnueabihf/libjpeg.so /usr/lib/ \
; fi
# Discard data when Redis runs out of memory
RUN echo "maxmemory-policy allkeys-lru" >> /etc/redis/redis.conf
# Disable saving the Redis database
RUN echo "save \"\"" >> /etc/redis/redis.conf
# Only provision 1 database
RUN echo "databases 1" >> /etc/redis/redis.conf
#####################
# Build image start #
#####################
FROM debian:9.4-slim as BUILDER_IMAGE
ARG APT_PROXY
# Package caching
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
WORKDIR /code
COPY . /code
RUN apt-get update && apt-get install make python-dev python-pip -y
RUN pip install -r requirements/build.txt
ENV LC_ALL C.UTF-8
RUN touch docker/Makefile
RUN make wheel
RUN chmod 777 dist -R
#####################
# Final image start #
#####################
FROM BASE_IMAGE
COPY --from=BUILDER_IMAGE --chown=mayan:mayan "${PROJECT_INSTALL_DIR}/" "${PROJECT_INSTALL_DIR}/"
RUN mkdir -p /opt
USER root
RUN python /usr/lib/python2.7/dist-packages/virtualenv.py $PROJECT_INSTALL_DIR
COPY docker/rootfs /
WORKDIR $PROJECT_INSTALL_DIR
COPY --from=BUILDER_IMAGE /code/dist/*.whl .
COPY --from=BUILDER_IMAGE /code/contrib/scripts/docker/run-tests.sh .
COPY --from=BUILDER_IMAGE /code/requirements/testing-base.txt requirements-testing.txt
COPY --from=BUILDER_IMAGE /code/docker/version .
# Fix ownership
RUN chown -R mayan:mayan $PROJECT_INSTALL_DIR
# Install build Mayan EDMS
RUN sudo -u mayan $PYTHON_PIP install --no-cache-dir --no-use-pep517 *.whl && \
rm *.whl
# Install Python clients for librabbitmq, MySQL, PostgreSQL, REDIS
RUN sudo -u mayan $PYTHON_PIP install --no-cache-dir --no-use-pep517 librabbitmq==1.6.1 mysql-python==1.2.5 psycopg2==2.7.3.2 redis==2.10.6
# Setup supervisor
COPY docker/etc/supervisor/mayan.conf /etc/supervisor/conf.d
RUN mkdir /var/lib/mayan
VOLUME ["/var/lib/mayan"]
COPY docker/entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/entrypoint.sh / # backwards compat
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 8000
CMD ["mayan"]
RUN ${PROJECT_INSTALL_DIR}/bin/mayan-edms.py platformtemplate supervisord_docker > /etc/supervisor/conf.d/mayan.conf \
&& apt-get clean autoclean \
&& apt-get autoremove --purge -y \
&& rm -rf /var/lib/apt/lists/* \
&& rm -f /var/cache/apt/archives/*.deb \
# Remove temporary files owned by root from the platformtemplate step
&& rm /tmp/* \
# Keep displaying log messages to stdout
&& find /var/log -type f | while read f; do echo -ne '' > $f; done;
RUN rm /root/.cache -R
RUN rm -rf /tmp/*
RUN apt-get -y autoremove --purge && apt-get -y autoclean && apt-get -y clean
RUN rm -rf /usr/share/man/*
RUN rm -rf /usr/share/doc/*
RUN find /var/lib/apt -type f | xargs rm -f
RUN find /var/cache -type f -exec rm -rf {} \;
RUN find /var/log -type f | while read f; do echo -ne '' > $f; done;

150
docker/Dockerfile.ubuntu Executable file
View File

@@ -0,0 +1,150 @@
# vim:set ft=dockerfile:
####################
# Base image start #
####################
FROM ubuntu:16.04 as BASE_IMAGE
MAINTAINER Roberto Rosario "roberto.rosario@mayan-edms.com"
ENV DEBIAN_FRONTEND noninteractive
ENV PYTHONUNBUFFERED 1
ENV LANG en_US.UTF-8
ENV PROJECT_INSTALL_DIR=/usr/local/lib/python2.7/dist-packages/mayan
ARG APT_PROXY
# Package caching
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
# Install base Ubuntu libraries
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
g++ \
gcc \
gettext-base \
ghostscript \
gpgv \
graphviz \
libffi-dev \
libjpeg-dev \
libmagic1 \
libmysqlclient-dev \
libpng-dev \
libpq-dev \
libreoffice \
libtiff-dev \
locales \
netcat-openbsd \
poppler-utils \
python-dev \
python-pip \
python-setuptools \
python-wheel \
redis-server \
supervisor \
tesseract-ocr \
zlib1g-dev \
&& \
apt-get clean autoclean && \
apt-get autoremove --purge -y && \
rm -rf /var/lib/apt/lists/* && \
rm -f /var/cache/apt/archives/*.deb
# Switch to UTF locale
RUN echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
locale-gen en_US.UTF-8 && \
update-locale LANG=en_US.UTF-8 && \
export LC_ALL=en_US.UTF-8
# Install apt-get-install
ADD https://raw.githubusercontent.com/guilhem/apt-get-install/master/apt-get-install /usr/bin/
RUN chmod +x /usr/bin/apt-get-install
# Install Python clients for PostgreSQL, REDIS, librabbitmq
RUN pip install psycopg2==2.7.3.2 redis==2.10.6 mysql-python==1.2.5 librabbitmq==1.6.1
RUN adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
# Pillow can't find zlib or libjpeg on aarch64
RUN if [ "$(uname -m)" = "aarch64" ]; then \
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ && \
ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
; fi
#####################
# Build image start #
#####################
FROM python:2-alpine3.7 as BUILDER_IMAGE
WORKDIR /code
COPY . /code
RUN apk update && \
apk add make
RUN pip install -r requirements/build.txt
RUN make wheel
RUN chmod 777 dist -R
#####################
# Final image start #
#####################
FROM BASE_IMAGE
WORKDIR /root/
COPY --from=BUILDER_IMAGE /code/dist/*.whl .
# Install build Mayan EDMS
RUN pip install *.whl && \
rm *.whl
# Setup supervisor
#RUN mkdir /etc/supervisor.d/
COPY docker/etc/supervisor/beat.conf /etc/supervisor/conf.d
COPY docker/etc/supervisor/gunicorn.conf /etc/supervisor/conf.d
COPY docker/etc/supervisor/redis.conf /etc/supervisor/conf.d
COPY docker/etc/supervisor/workers.conf /etc/supervisor/conf.d
# Create the directory for the logs
RUN mkdir /var/log/mayan
# Fix ownership
RUN chown -R mayan:mayan $PROJECT_INSTALL_DIR
# Allow flanker to autogenerate its PLY files
RUN chown -R mayan:mayan /usr/local/lib/python2.7/dist-packages/flanker/
RUN mkdir /var/lib/mayan
VOLUME ["/var/lib/mayan"]
COPY docker/entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/entrypoint.sh / # backwards compat
ENTRYPOINT ["entrypoint.sh"]
# Healthcheck setup
HEALTHCHECK --interval=15s --timeout=1s --retries=20 \
CMD curl -s -f http://localhost/authentication/login/ | grep 'form' > /dev/null || exit 1
EXPOSE 8000
CMD ["mayan"]
RUN rm /root/.cache -R
RUN rm -rf /tmp/*
RUN apt-get -y autoremove --purge && apt-get -y autoclean && apt-get -y clean
RUN rm -rf /usr/share/man/*
RUN rm -rf /usr/share/doc/*
RUN find /var/lib/apt -type f | xargs rm -f
RUN find /var/cache -type f -exec rm -rf {} \;
RUN find /var/log -type f | while read f; do echo -ne '' > $f; done;

View File

@@ -1,25 +1,33 @@
APT_PROXY ?= `/sbin/ip route|awk '/docker0/ { print $$9 }'`:3142
IMAGE_VERSION ?= `cat docker/rootfs/version`
IMAGE_VERSION ?= `cat docker/version`
CONSOLE_COLUMNS ?= `echo $$(tput cols)`
CONSOLE_LINES ?= `echo $$(tput lines)`
docker-build: ## Build a new image locally.
docker-help:
@echo
@echo "**** Docker makefile ****"
@echo "docker-build - Build a new image locally."
@echo "docker-build-with-proxy - Build a new image locally using an APT proxy."
@echo "docker-test-container - Build and run a test container."
@echo "docker-test-cleanup - Delete the test container and the test volume."
@echo "docker-test-all - Build and executed the test suite in a test container."
@echo "docker-shell - Launch a bash instance inside a running container. Pass the container name via DOCKER_CONTAINER."
docker-build:
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile .
docker-build-with-proxy: ## Build a new image locally using an APT proxy as APT_PROXY.
docker-build-with-proxy:
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile --build-arg APT_PROXY=$(APT_PROXY) .
docker-shell: ## Launch a bash instance inside a running container. Pass the container name via DOCKER_CONTAINER.
docker-shell:
docker exec -e TERM=$(TERM) -e "COLUMNS=$(CONSOLE_COLUMNS)" -e "LINES=$(CONSOLE_LINES)" -it $(DOCKER_CONTAINER) /bin/bash
docker-test-container: ## Build and run a test container.
docker-test-container: docker-build-with-proxy docker-test-cleanup
docker run -d --name test-mayan-edms -p 80:8000 -v test-mayan_data:/var/lib/mayan mayanedms/mayanedms:$(DOCKER_VERSION)
docker-test-cleanup: ## Delete the test container and the test volume.
docker-test-cleanup:
@docker rm -f test-mayan-edms || true
@docker volume rm test-mayan_data || true
docker-test-all: ## Build and executed the test suite in a test container.
docker-test-all: docker-build-with-proxy
docker run --rm run-tests

View File

@@ -4,9 +4,7 @@ set -e
echo "mayan: starting entrypoint.sh"
INSTALL_FLAG=/var/lib/mayan/system/SECRET_KEY
CONCURRENCY_ARGUMENT=--concurrency=
DEFAULT_USER_UID=1000
DEFAULT_USER_GUID=1000
export DOCKER_ROOT=/opt/mayan-edms
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
@@ -23,16 +21,11 @@ export MAYAN_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE:-mayan.settings.production}
export MAYAN_GUNICORN_BIN=${MAYAN_PYTHON_BIN_DIR}gunicorn
export MAYAN_GUNICORN_WORKERS=${MAYAN_GUNICORN_WORKERS:-2}
export MAYAN_PIP_BIN=${MAYAN_PYTHON_BIN_DIR}pip
export MAYAN_STATIC_ROOT=${MAYAN_INSTALL_DIR}/static
MAYAN_WORKER_FAST_CONCURRENCY=${MAYAN_WORKER_FAST_CONCURRENCY:-1}
MAYAN_WORKER_MEDIUM_CONCURRENCY=${MAYAN_WORKER_MEDIUM_CONCURRENCY:-1}
MAYAN_WORKER_SLOW_CONCURRENCY=${MAYAN_WORKER_SLOW_CONCURRENCY:-1}
echo "mayan: changing uid/guid"
usermod mayan -u ${MAYAN_USER_UID:-${DEFAULT_USER_UID}}
groupmod mayan -g ${MAYAN_USER_GUID:-${DEFAULT_USER_GUID}}
if [ "$MAYAN_WORKER_FAST_CONCURRENCY" -eq 0 ]; then
MAYAN_WORKER_FAST_CONCURRENCY=
else
@@ -59,30 +52,16 @@ export PYTHONPATH=$PYTHONPATH:$MAYAN_MEDIA_ROOT
chown mayan:mayan /var/lib/mayan -R
apt_get_install() {
apt-get -q update
apt-get install -y --force-yes --no-install-recommends --auto-remove "$@"
apt-get -q clean
rm -rf /var/lib/apt/lists/*
}
initialize() {
echo "mayan: initialize()"
su mayan -c "${MAYAN_BIN} initialsetup --force --no-javascript"
su mayan -c "${MAYAN_BIN} initialsetup --force"
su mayan -c "${MAYAN_BIN} collectstatic --noinput --clear"
}
os_package_installs() {
echo "mayan: os_package_installs()"
if [ "${MAYAN_APT_INSTALLS}" ]; then
DEBIAN_FRONTEND=noninteractive apt_get_install $MAYAN_APT_INSTALLS
fi
}
pip_installs() {
echo "mayan: pip_installs()"
if [ "${MAYAN_PIP_INSTALLS}" ]; then
su mayan -c "${MAYAN_PIP_BIN} install $MAYAN_PIP_INSTALLS"
fi
upgrade() {
echo "mayan: upgrade()"
su mayan -c "${MAYAN_BIN} performupgrade"
su mayan -c "${MAYAN_BIN} collectstatic --noinput --clear"
}
start() {
@@ -91,9 +70,18 @@ start() {
exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
}
upgrade() {
echo "mayan: upgrade()"
su mayan -c "${MAYAN_BIN} performupgrade --no-javascript"
os_package_installs() {
echo "mayan: os_package_installs()"
if [ "${MAYAN_APT_INSTALLS}" ]; then
apt-get-install $MAYAN_APT_INSTALLS
fi
}
pip_installs() {
echo "mayan: pip_installs()"
if [ "${MAYAN_PIP_INSTALLS}" ]; then
$MAYAN_PIP_BIN install $MAYAN_PIP_INSTALLS
fi
}
os_package_installs || true
@@ -118,7 +106,7 @@ run-tests) # Check if this is a new install, otherwise try to upgrade the existi
else
upgrade
fi
run-tests.sh
$DOCKER_ROOT/run-tests.sh
;;
*) su mayan -c "$@";

View File

@@ -0,0 +1,80 @@
[program:mayan-gunicorn]
autorestart = false
autostart = true
command = /bin/bash -c "${MAYAN_GUNICORN_BIN} -w ${MAYAN_GUNICORN_WORKERS} mayan.wsgi --max-requests 500 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000 --env DJANGO_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE}" --timeout 120
redirect_stderr = true
stderr_logfile = /dev/fd/2
stderr_logfile_maxbytes = 0
stdout_logfile = /dev/fd/1
stdout_logfile_maxbytes = 0
user = mayan
[program:redis]
autorestart = false
autostart = true
command = /bin/bash -c "if [ ${MAYAN_BROKER_URL} == ${MAYAN_DEFAULT_BROKER_URL} ] && [ ${MAYAN_CELERY_RESULT_BACKEND} == ${MAYAN_DEFAULT_CELERY_RESULT_BACKEND} ];then /usr/bin/redis-server /etc/redis/;fi"
stderr_logfile = /dev/fd/2
stderr_logfile_maxbytes = 0
stdout_logfile = /dev/fd/1
stdout_logfile_maxbytes = 0
user = root
[program:mayan-worker-fast]
autorestart = false
autostart = true
command = nice -n 1 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q converter,sources_fast -n mayan-worker-fast.%%h ${MAYAN_WORKER_FAST_CONCURRENCY}"
killasgroup = true
numprocs = 1
priority = 998
startsecs = 10
stderr_logfile = /dev/fd/2
stderr_logfile_maxbytes = 0
stdout_logfile = /dev/fd/1
stdout_logfile_maxbytes = 0
stopwaitsecs = 1
user = mayan
[program:mayan-worker-medium]
autorestart = false
autostart = true
command = nice -n 18 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h ${MAYAN_WORKER_MEDIUM_CONCURRENCY}"
killasgroup = true
numprocs = 1
priority = 998
startsecs = 10
stderr_logfile = /dev/fd/2
stderr_logfile_maxbytes = 0
stdout_logfile = /dev/fd/1
stdout_logfile_maxbytes = 0
stopwaitsecs = 1
user = mayan
[program:mayan-worker-slow]
autorestart = false
autostart = true
command = nice -n 19 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h ${MAYAN_WORKER_SLOW_CONCURRENCY}"
killasgroup = true
numprocs = 1
priority = 998
startsecs = 10
stderr_logfile = /dev/fd/2
stderr_logfile_maxbytes = 0
stdout_logfile = /dev/fd/1
stdout_logfile_maxbytes = 0
stopwaitsecs = 1
user = mayan
[program:mayan-celery-beat]
autorestart = false
autostart = true
command = nice -n 1 /bin/bash -c "${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} beat --pidfile= -l ERROR"
killasgroup = true
numprocs = 1
priority = 998
stderr_logfile = /dev/fd/2
stderr_logfile_maxbytes = 0
stdout_logfile = /dev/fd/1
stdout_logfile_maxbytes = 0
startsecs = 10
stopwaitsecs = 1
user = mayan

View File

@@ -1,10 +0,0 @@
#!/bin/sh
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y --no-install-recommends gcc python-dev tesseract-ocr-deu
su mayan -c "$MAYAN_PIP_BIN install -r ${MAYAN_INSTALL_DIR}/testing-base.txt"
su mayan -c "$MAYAN_BIN test --mayan-apps --settings=mayan.settings.testing"

View File

@@ -1 +0,0 @@
3.2b1

View File

@@ -27,6 +27,6 @@ services:
MAYAN_DATABASE_NAME: mayan
MAYAN_DATABASE_PASSWORD: mayan-password
MAYAN_DATABASE_USER: mayan
MAYAN_DATABASE_CONN_MAX_AGE: 0
MAYAN_DATABASE_CONN_MAX_AGE: 60
volumes:
- app:/var/lib/mayan

1
docker/version Executable file
View File

@@ -0,0 +1 @@
3.1.10

View File

@@ -1,5 +0,0 @@
.menuselection {
color: white;
background: #2c3e50;
padding: 3px;
}

View File

@@ -59,17 +59,6 @@ App modules
corresponding signal in the ready() method of the MayanAppConfig subclass in
apps.py
- html_widgets.py
Classes to render an HTML widget. HTML widget are not the same as Django's
native form widgets. Form widgets only work as part of a form field.
HTML widgets are for use outside of forms, such as in a table cell.
- licenses.py
This module outlines the license text of the third party content used in
the app. It could be other Python libraries, JavaScript libraries, etc.
- links.py
Defines the links to be used by the app. Import only from the navigation app
@@ -103,11 +92,6 @@ App modules
This module acts as a shared memory space for the other modules of the app or
other apps.
- search.py
Search model definitions. Define which field of the app's models are
searchable.
- serializers.py
Hold Django REST Framework serializers used by the api_views.py module.
@@ -143,7 +127,7 @@ App modules
- widgets.py
Custom form widgets go here. This should be the only place with presentation
HTML widgets go here. This should be the only place with presentation
directives in the app (aside the templates).

View File

@@ -59,7 +59,7 @@ Example::
-e POSTGRES_DB=mayan \
-e POSTGRES_PASSWORD=mayanuserpass \
-v /docker-volumes/mayan-edms/postgres-new:/var/lib/postgresql/data \
-d postgres:9.6
-d postgres:9.5
docker exec -i mayan-edms-pg-new pg_restore -U mayan -d mayan < 2018-06-07_17-09-34.dump

View File

@@ -99,5 +99,5 @@ Direct install
MAYAN_DATABASE_NAME=mayan,
MAYAN_DATABASE_PASSWORD=mayanuserpass,
MAYAN_DATABASE_USER=mayan,
MAYAN_DATABASE_CONN_MAX_AGE=0,
MAYAN_DATABASE_CONN_MAX_AGE=360,
<...>

File diff suppressed because it is too large Load Diff

View File

@@ -7,23 +7,16 @@ How to use this image
.. _docker_install:
Start a Mayan EDMS Docker image
-------------------------------
Start a Mayan EDMS image
------------------------
With Docker properly installed, proceed to download the Mayan EDMS image using
the command::
With Docker properly installed, proceed to download the Mayan EDMS image using the command::
docker pull mayanedms/mayanedms:<version>
Instead of a specific version tag you may use then generic ``:latest`` tag
to the get latest version available automatically. If you use the ``:latest``
tag here, remember to do so in the next steps also.::
Then download version 9.5 of the Docker PostgreSQL image::
docker pull mayanedms/mayanedms:latest
Then download version 9.6 of the Docker PostgreSQL image::
docker pull postgres:9.6
docker pull postgres:9.5
Create and run a PostgreSQL container::
@@ -35,7 +28,7 @@ Create and run a PostgreSQL container::
-e POSTGRES_DB=mayan \
-e POSTGRES_PASSWORD=mayanuserpass \
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
-d postgres:9.6
-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
@@ -43,7 +36,9 @@ 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.
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 \
@@ -54,7 +49,7 @@ Finally create and run a Mayan EDMS container.
-e MAYAN_DATABASE_NAME=mayan \
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
-e MAYAN_DATABASE_USER=mayan \
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
mayanedms/mayanedms:<version>
@@ -77,7 +72,6 @@ If another web server is running on port 80 use a different port in the
Using a dedicated Docker network
--------------------------------
Use this method to avoid having to expose PostreSQL port to the host's network
or if you have other PostgreSQL instances but still want to use the default
port of 5432 for this installation.
@@ -97,7 +91,7 @@ binding (``-p 5432:5432``)::
-e POSTGRES_DB=mayan \
-e POSTGRES_PASSWORD=mayanuserpass \
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
-d postgres:9.6
-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``)
@@ -113,11 +107,10 @@ instead of the IP address of the Docker host (``172.17.0.1``)::
-e MAYAN_DATABASE_NAME=mayan \
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
-e MAYAN_DATABASE_USER=mayan \
-e MAYAN_DATABASE_CONN_MAX_AGE=0 \
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
mayanedms/mayanedms:<version>
Stopping and starting the container
-----------------------------------
@@ -133,7 +126,6 @@ To start the container again::
.. _docker_environment_variables:
Environment Variables
---------------------
@@ -228,10 +220,6 @@ Optional. Allows loading an alternate settings file.
Amount in seconds to keep a database connection alive. Allow reuse of database
connections. For more information read the pertinent Django documentation
page: :django-docs:`Settings, CONN_MAX_AGE <ref/settings/#conn-max-age>`
According to new information Gunicorn's microthreads don't share connections
and will exhaust the available Postgres connections available if a number
other than 0 is used. Reference: https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq
and https://github.com/benoitc/gunicorn/issues/996
``MAYAN_GUNICORN_WORKERS``
@@ -264,19 +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).
``MAYAN_USER_UID``
Optional. Changes the UID of the ``mayan`` user internal to the Docker
container. Defaults to 1000.
``MAYAN_USER_GUID``
Optional. Changes the GUID of the ``mayan`` user internal to the Docker
container. Defaults to 1000.
.. _docker-accessing-outside-data:
Accessing outside data
======================
@@ -322,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
=======================
@@ -330,7 +304,6 @@ Uncompress the backup archive in the original docker volume using::
sudo tar -xvzf backup.tar.gz -C /
Upgrading
=========
@@ -360,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
==================
@@ -383,7 +355,6 @@ 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
=====================
@@ -408,7 +379,6 @@ Specifies a list of Python packages to be installed via ``pip``. Packages will
be downloaded from the Python Package Index (https://pypi.python.org) by
default.
Using Docker compose
====================

View File

@@ -68,21 +68,5 @@ type at a given moment, but if needed, the type of a document can be changed.
Upon changing its type, the document will lose its previous settings and
attributes, and will inherit the settings and attributes of its new type.
Creating document types
=======================
.. admonition:: Permissions required
:class: warning
The "Create document types" permission is required for this action.
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
#. From the :guilabel:`Actions` dropdown select :guilabel:`Create document type`.
#. Enter a label to be shown to users when using this document type.
#. Optional: Enter a period of time after which documents of this type will be moved to the trash.
#. Optional: Select the unit of time for the period after which the document will be moved to the trash.
#. Optional: Enter a period of time after which documents moved to the trash will be permanently deleted.
#. Optional: Select the unit of time for the period of time after which the documents moved to the trash will be permanently deleted
#. Press :guilabel:`Submit`.
Document types are create in the
:menuselection:`System --> Setup --> Document types` menu.

View File

@@ -5,32 +5,22 @@ Index examples
Index of document types
^^^^^^^^^^^^^^^^^^^^^^^
.. admonition:: Permissions required
:class: warning
- The "Create new document indexes" permission is required for this action.
- The "Edit document indexes" permission is required for this action, globally
of via an ACL for a document index.
- The "Edit document types" permission is required for this action, globally
of via an ACL for a document type.
This index will create one level for each document type in the system and place
links to the document of each respective type.
#. Go to the :menuselection:`System --> Setup --> Indexes` menu.
#. Create a new index using :guilabel:`Actions` > :guilabel:`Create new`.
#. Create a new index using :menuselection:`Actions --> Create new`.
#. Give it a label to describe it, and an internal name. The internal name is
used when referencing this index in other parts of the system.
#. Press the :guilabel:`Template` link of the newly created index.
#. Select :guilabel:`New child node` to create a new level in which the
#. Press the :menuselection:`Template` link of the newly created index.
#. Select :menuselection:`New child node` to create a new level in which the
following template code will be entered.
::
{{ document.document_type }}
#. Save the template.
#. Click on :guilabel:`Document types` and associate this index with
#. Go to :menuselection:`Document types` and associate this index with
existing document types in the system.
#. Finally go to :menuselection:`Tools --> Rebuild indexes` to execute the
index template. The rebuild process is only necessary when changes are

View File

@@ -6,7 +6,7 @@ The list of languages choices in the language dropdown used for documents is
based on the current ISO 639 list. This list can be quite extensive. To reduce
the number of languages available use the setting ``DOCUMENTS_LANGUAGE_CODES``,
and set it to a nested list of abbreviations. This setting can be found in the
:menuselection:`System --> Setup --> Settings --> Common` menu.
:menuselection:`System --> Setup -> Settings -> Common` menu.
For example, to reduce the list to just English and Spanish use
::

View File

@@ -26,74 +26,3 @@ interpret and modify the value provided by the user to a conform to a specific
format. An example of a provided parser is the date parser which will interpret
and correct dates provided by users regardless of the format in which they are
entered.
Creating metadata types
=======================
.. admonition:: Permissions required
:class: warning
The "Create new metadata types" permission is required for this action.
#. Go to the :menuselection:`System --> Setup --> Metadata types` menu.
#. From the :guilabel:`Actions` dropdown select :guilabel:`Create new`.
#. Provide a name to reference this metadata type in other parts of the system.
#. Enter a label to be shown to users when using this metadata type.
#. Optional: Enter a default value for the metadata type.
#. Optional: Provide a comma separated list of options to restrict the data entry
when using this metadata type.
#. Optional: Select a validator and a parser to validate and cleanup the data
entry when not using a predetermined list of values.
#. Press :guilabel:`Submit`.
Assigning a metadata type to a document type
============================================
.. admonition:: Permissions required
:class: warning
- The "Edit metadata types" permission is required for this action, globally or
via an ACL for a metadata type.
- Also the "Edit document type" permission
is required, globally or via an ACL for a document type.
This action can be performed in two ways.
Option 1: Via the metadata type view
------------------------------------
#. Go to the :menuselection:`System --> Setup --> Metadata types` menu.
#. Click on the button :guilabel:`Document types` of the metadata type you which
to associate.
#. From the list of existing document types press either:
- :guilabel:`None` if this metadata type will not be available for documents
of the type.
- :guilabel:`Optional` if this metadata type will be available and is
optional to provide a value for documents of the type.
- :guilabel:`Required` if this metadata type will be available and is
required to provide a value for documents of the type.
#. Press :guilabel:`Save`.
Option 2: Via the document type view
------------------------------------
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
#. Click on the button :guilabel:`Metadata types` of the metadata type you which
to associate.
#. From the list of existing metadata types press either:
- :guilabel:`None` if this metadata type will not be available for documents
of the type.
- :guilabel:`Optional` if this metadata type will be available and is
optional to provide a value for documents of the type.
- :guilabel:`Required` if this metadata type will be available and is
required to provide a value for documents of the type.
#. Press :guilabel:`Save`.

View File

@@ -1,70 +0,0 @@
************
Quick labels
************
Quick labels are predetermined filenames that allow the quick renaming of
documents as they are uploaded or after they have been uploaded.
Quick labels are added and associated to a document type.
Example of quick label: Invoice, Receipt from X store, Purchase order.
It is possible to preserve the file extension when using quick labels.
Extensions are required for some operating system to be able to detect the
correct file type to access the content.
For example if a document file is named "file0001.pdf" and the quick label
"Receipt from X store" is applied, the resulting document label will be
"Receipt from X store.pdf".
Creating quick labels
=====================
.. admonition:: Permissions required
:class: warning
The "Edit document types" permission is required for this action, either
globally or via an ACL for a document type.
Since quick labels are associated with document types, creating quick labels
must be done from the document type view.
#. Go to the :menuselection:`System --> Setup --> Document types` menu.
#. In the document type list, click on the :guilabel:`Quick labels` button of
the document type for which you wish to create a quick label.
#. In the view titled "Quick labels for document type: <your document type>",
from the :guilabel:`Actions` dropdown select :guilabel:`Add quick label to document type`.
#. At the quick label creation form enter the desired label and press :guilabel:`Save`.
Using quick labels during upload
================================
#. Use the new document upload wizard from :menuselection:`Documents --> New document`.
#. Select a document type and navigate to the penultimate step, where you have
the option to drag and drop files to upload.
#. Select a an option from the :guilabel:`Quick document rename` dropdown.
#. Optionally select the :guilabel:`Preserve extension` checkbox to keep the file
extension.
#. Upload your documents.
Using quick labels for existing documents
=========================================
.. admonition:: Permissions required
:class: warning
The "Edit document properties" permission is required for this action, either
globally or via an ACL for a document or document type.
#. Navigate to the document preview view of the document to rename. Make sure
quick labels for the document type of the document select have been created.
#. From the :guilabel:`Actions` dropdown select :guilabel:`Edit Properties`.
#. Select a an option from the :guilabel:`Quick document rename` dropdown.
#. Optionally select the :guilabel:`Preserve extension` checkbox to keep the file
extension.
#. Press :guilabel:`Save` to rename the document.

View File

@@ -6,19 +6,15 @@ The default installation method fits most use cases. If you use case requires
more speed or capacity here are some suggestion that can help you improve the
performance of your installation.
Change the database manager
===========================
Use PostgreSQL or MySQL as the database manager.
Tweak the memory setting of the database manager to increase memory allocation.
More PostgreSQL specific examples are available in their wiki page:
https://wiki.postgresql.org/wiki/Performance_Optimization
Increase the number of Gunicorn workers
=======================================
The Gunicorn workers process HTTP requests and affect the speed at which the
website responds.
@@ -37,7 +33,6 @@ And increase the value of the ``-w 2`` argument. This line is found in the
Background task processing
==========================
The Celery workers are system processes that take care of the background
tasks requested by the frontend interactions like document image rendering
and periodic tasks like OCR. There are several dozen tasks defined in the code.
@@ -50,9 +45,37 @@ low volume, medium duration tasks. It is not advisable to have the same
worker processing OCR to process image rendering too. If the worker is
processing several OCR tasks it will not be able to provide fast images
when an user is browsing the user interface. This is why by default the
queues are split into 3 workers: fast, medium, and slow. Each worker will handle
queues based on the latency required by each queue group.
queues are split into 3 workers: fast, medium, and slow.
The fast worker handles the queues:
* converter: Handles document page rendering
* sources_fast: Does staging file image rendering
The medium worker handles the queues:
* checkouts_periodic: Scheduled tasks that check if a document's checkout
period has expired
* documents_periodic:
* indexing: Does reindexing of documents in the background when their
properties change
* metadata:
* sources:
* sources_periodic: Checking email accounts and watch folders for new
documents.
* uploads: Processes files to turn the into Mayan documents. Processing
encompasses MIME type detection, page count detection.
* documents:
The slow worker handles the queues:
* mailing: Does the actual sending of documents via email as requested by
users via the mailing profiles
* tools: Executes in the background maintenance requests from the options
in the tools menu
* statistics: Recalculates statistics and charts
* parsing: Parses documents to extract actual text content
* ocr: Performs OCR to transcribe page images to text
Optimizations
-------------
@@ -65,16 +88,15 @@ Optimizations
* By default each worker process uses 1 thread. You can increase the thread
count of each worker process with the Docker environment options:
* ``MAYAN_WORKER_FAST_CONCURRENCY``
* ``MAYAN_WORKER_MEDIUM_CONCURRENCY``
* ``MAYAN_WORKER_SLOW_CONCURRENCY``
* MAYAN_WORKER_FAST_CONCURRENCY
* MAYAN_WORKER_MEDIUM_CONCURRENCY
* MAYAN_WORKER_SLOW_CONCURRENCY
* If using direct deployment, increase the value of the ``--concurrency=1``
* If using direct deployment, increase the value of the --concurrency=1
argument of each worker in the supervisor file. You can also remove this
argument and let the Celery algorithm choose the number of threads to
launch. Usually this defaults to the number of CPU cores + 1.
Change the message broker
=========================
Messages are the method of communication between front end interactive code
@@ -105,13 +127,11 @@ calculation, these are stored for a while so that whoever requested the
background task, is able retrieve the result. These results are stored in the
result storage. By default a Redis server is launched inside the Mayan EDMS
container. You can launch a separate Docker Redis container and tell the Mayan
EDMS container to use this via the ``MAYAN_CELERY_RESULT_BACKEND`` environment
EDMS container to use this via the MAYAN_CELERY_RESULT_BACKEND environment
variable. The format of this variable is explained here: http://docs.celeryproject.org/en/3.1/configuration.html#celery-result-backend
Deployment type
===============
Docker provides a faster deployment and the overhead is not high on modern
systems. It is however memory and CPU limited by default and you need to
increase this limits. The settings to change the container resource limits
@@ -120,10 +140,8 @@ are here: https://docs.docker.com/config/containers/resource_constraints/#limit-
For the best performance possible use the advanced deployment method on a
host dedicated to serving only Mayan EDMS.
Storage
=======
For best input and output speed use a block based local filesystem on an
SSD drive for the ``/media`` sub folder. The location of the ``/media`` folder
will be specified by the ``MEDIA_ROOT`` setting.
@@ -131,10 +149,8 @@ will be specified by the ``MEDIA_ROOT`` setting.
If capacity is your bottom line, switch to an
:doc:`object storage <../chapters/object_storage>` system.
Use additional hosts
====================
When one host is not enough you can use multiple hosts and share the load.
Make sure that all hosts share the ``/media`` folder as specified by the
``MEDIA_ROOT`` setting, also the database, the broker, and the result storage.

View File

@@ -11,7 +11,6 @@ signatures sections of a document.
.. blockdiag::
blockdiag {
orientation = portrait
span_width = 240;

View File

@@ -51,29 +51,7 @@ The current document sources supported are:
web -> manual;
}
Document sources can be configure to allow document bundles to uploaded as
Document source can be configure to allow document bundles to uploaded as
compressed files which are decompressed and their content uploaded as separate
documents. This feature is useful when migrating from another document
manager system.
.. note::
If you deployed a Mayan EDMS Docker container and want to use watched folders
or staging folder, refer to the Docker chapter :ref:`docker-accessing-outside-data`.
Creating new sources
====================
.. admonition:: Permissions required
:class: warning
The "Create new document sources" permission is required for this action.
#. Go to the :menuselection:`System --> Setup --> Sources` menu.
#. From the :guilabel:`Actions` dropdown select the new type of source to create.
#. Each source type will have different fields to customize its behaviour. Enter
the required information in each field based on the help text provided.
#. Press :guilabel:`Save`.

View File

@@ -5,6 +5,10 @@ Tags are color coded properties that can be attached or removed from documents.
Tags allow giving documents a binary property. Documents can also be tagged
with more than one tag.
Tags are created from the :menuselection:`Tags --> Create` menu.
To view all created tags use the :menuselection:`Tags --> All` menu.
Once tagged, documents can be searched by their tags. It is also possible to
show all the documents tagged with a particular
tag via the **Documents** link of each tag.
@@ -17,30 +21,3 @@ more tags to the document and another to remove tags from the document.
It is also possible to tag documents in bulk by selecting several documents
from any view that displays a list documents and selecting the **Attach tag**
or **Remove tags** from the dropdown menu.
Creating tags
=============
.. admonition:: Permissions required
:class: warning
The "Create new tags" permission is required for this action.
#. Go to the :menuselection:`Tags --> Create` menu.
#. Enter a label to identify the tag.
#. Select a color for the tag.
#. Press :guilabel:`Submit`.
View all tags
=============
.. admonition:: Permissions required
:class: warning
The "View tags" permission is required for this action, globally or via an
ACL for a tag.
#. Go to the :menuselection:`Tags --> All` menu.

View File

@@ -46,35 +46,3 @@ There is no limit to the number of versions a document can have.
By default, the last version will be showed when working with the document
but any of the versions can be inspected and viewed.
View a document version list
============================
.. admonition:: Permissions required
:class: warning
The "View documents' versions list" permission is required for this action,
either globally or via an ACL for a document or document type.
#. Navigate to the select document's preview view.
#. Click on the sibebar's :guilabel:`Versions` button.
Uploading a new document version
================================
.. admonition:: Permissions required
:class: warning
The "Create new document versions" permission is required for this action,
either globally or via an ACL for a document or document type.
#. Navigate to the select document's versions list view.
#. From the :guilabel:`Actions` dropdown select :guilabel:`Upload new version`.
#. Optionally type a comment explaining the changes in the new version.
#. Press the :guilabel:`Browse` button and select a new file.
#. Press :guilabel:`Save` upload the new verision.

View File

@@ -5,7 +5,7 @@ Workflows
Introduction
============
Workflows provide a structured method for storing a sequence of states over
Workflows provide a structure method for storing a sequence of states over
which the a document will progress. Workflows keep track how a document has
been processed so far.
@@ -20,36 +20,6 @@ provide and order for the sequence of possible states changes.
Transitions can be executed manually by users if they have the required access
level as configure by the system administrator.
.. blockdiag::
:caption: Example workflow. Circles represent states, rectangles represent transitions.
span_width = 30;
submitted [shape = circle, width = 60, height = 60];
approved [shape = circle, width = 60, height = 60];
rejected [shape = circle, width = 60, height = 60];
archived [shape = circle, width = 60, height = 60];
approve [label = approve];
reject [label = reject];
reopen [label = "re-open"];
submitted -> approve -> approved;
approved -> archived;
submitted -> reject -> rejected;
rejected -> archived;
archived -> reopen -> submitted;
Workflows in Mayan EDMS are implemented as finite state machines
(https://en.wikipedia.org/wiki/Finite-state_machine).
Workflows are mainly used to represent business processes. But they can also be
used an automation system to customized Mayan EDMS and have it perform some
tasks automatically.
Automation
==========
@@ -96,18 +66,26 @@ Implementation
==============
Internally, workflows are implemented as a finite state machines
(https://en.wikipedia.org/wiki/Finite-state_machine). To make them simpler to
use, workflow have been designed so that only one state can be the current
active state for a workflow being executed. Another design decision is that
every workflow needs at least one state marked as the initial state.
(https://en.wikipedia.org/wiki/Finite-state_machine). And have the limitation
that only one state can be the current active state for a workflow being
executed. The other limitation of the current implementation is that every
workflow needs at least one state marked as the initial state. These limitations
are the result of a compromised in the design between flexibility and ease of
use.
Visualizations
==============
The graphical representation of a workflow is similar to a flowchart. The
states are represented with circles. The transitions are represented with
arrows. Circle with a double border represent the initial state of the workflow.
The graphical representation of a workflow (or a finite state machine style
in Mayan EDMS's case) is similar to a flowchart. The states are represented
with circles. The transitions are represented with arrows. Circle with a
double border represent the initial state of the workflow.
To view the graphical representations of workflow use **Preview** button of
the workflow in the setup view.
We are working now on workflow transition trigger filters to have
the trigger move the state of the workflow on certain conditions. For example: Attach a tag if there is a specific word found in the OCR text.

View File

@@ -249,6 +249,3 @@ extlinks = {
'https://gitlab.com/mayan-edms/mayan-edms/issues/%s', 'GitLab issue #'
)
}
def setup(app):
app.add_stylesheet('css/custom.css')

View File

@@ -21,14 +21,12 @@ repository for electronic documents.
topics/installation
releases/index
topics/getting_started
topics/adding_documents
topics/access_control
topics/categorization
topics/collaboration
topics/settings
topics/storage
topics/integration
topics/docker
topics/advanced
topics/administration
topics/troubleshooting

View File

@@ -31,9 +31,9 @@ for Mayan EDMS. Most MERCs will be Feature MERCs.
2. An **Informational** MERC describes a Mayan EDMS design issue, or
provides general guidelines or information to the Mayan EDMS community,
but does not propose a new feature. Informational MERCs do not
necessarily represent a community consensus or recommendation, so users
and implementers are free to ignore Informational MERCs or follow their
advice.
necessarily represent a community consensus or
recommendation, so users and implementers are free to ignore
Informational MERCs or follow their advice.
3. A **Process** MERC describes a process surrounding Mayan EDMS, or
proposes a change to (or an event in) a process. Process MERCs are

View File

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

View File

@@ -1,149 +0,0 @@
==========================
MERC 5: Explicit arguments
==========================
:MERC: 5
:Author: Roberto Rosario
:Status: Accepted
:Type: Feature
:Created: 2018-12-30
:Last-Modified: 2018-12-31
.. contents:: Table of Contents
:depth: 3
:local:
Abstract
========
This MERC proposes the adoption of a new methodology when performing calls.
It seeks to reduce the use of positional arguments in favor of keyword
arguments in as many places as possible.
Motivation
==========
As the project grows, legibility of code becomes more important. Keyword
argument help document the use of services, clases and functions. Refactors
that affect the interface of services are also easier to find and update and
fix. Positional argument can cause a call to continue working as long as the
datatype of the argument remains the same. Usage of keyword arguments will
automatically raise and error that will prevent such situations. Keyword
argument further eliminate the relevance of position or the arguments, and
the arguments can be sorted alphabetically for easier visual scanning or by
semantic significance improving code readability.
Specification
=============
Adoption of this MERC will require an audit of existing calls and the use
of the method proposed for new calls. Every call regardless of the type or
origin of the source callable will name each argument used. By type it is
meant: classes, functions, methods. Origin means: local from the project,
from the framework, third party libraries or the standard library.
Backwards Compatibility
=======================
No backwards compatibility issues are expected. New errors arising from the use
if keyword arguments could be interpreted as existing latent issues that
have not been uncovered.
Reference Implementation
========================
Example:
Before:
.. code-block:: python
from mayan.apps.common.classes import Template
Template(
'menu_main', 'appearance/menu_main.html'
)
After:
.. code-block:: python
from mayan.apps.common.classes import Template
Template(
name='menu_main', template_name='appearance/menu_main.html'
)
When calls use a mixture or positional and keyword arguments, the keywords
arguments can only be found after the positional arguments. Complete use
of keyword arguments allow the reposition of arguments for semantic
purposes.
Example:
Before:
.. code-block:: python
from django.conf.urls import url
from .views import AboutView, HomeView, RootView
urlpatterns = [
url(r'^$', RootView.as_view(), name='root'),
url(r'^home/$', HomeView.as_view(), name='home'),
url(r'^about/$', AboutView.as_view(), name='about_view'),
]
After:
.. code-block:: python
from django.conf.urls import url
from .views import AboutView, HomeView, RootView
urlpatterns = [
url(regex=r'^$', name='root', view=RootView.as_view()),
url(regex=r'^home/$', name='home', view=HomeView.as_view()),
url(regex=r'^about/$', name='about_view', view=AboutView.as_view()),
]
Keyword arguments should also be used for callables that pass those to others
down the line like Django's ``reverse`` function. Any change to the name of
the ``pk`` URL parameter will raise an exception in this code alerting to
any posible incompatible use.
Example:
.. code-block:: python
def get_absolute_url(self):
return reverse(
viewname='documents:document_preview', kwargs={'pk': self.pk}
)
This becomes even more important when multiple URL parameters are used. Since
the API documentation is auto generated from the code itself, it would make
sense to rename the first URL parameter from ``pk`` to ``document_pk``. Such
change will cause all address to view resolutions to break forcing their
update and allowing all consumers' interface usage to remain synchonized to the
callable's interface.
.. code-block:: python
url(
regex=r'^documents/(?P<pk>[0-9]+)/versions/(?P<document_version_pk>[0-9]+)/pages/(?P<document_page_pk>[0-9]+)/image/$',
name='documentpage-image', view=APIDocumentPageImageView.as_view()
),

View File

@@ -1,81 +0,0 @@
==================================
MERC 6: Lower information disclose
==================================
:MERC: 6
:Author: Michael Price
:Status: Accepted
:Type: Feature
:Created: 2018-12-30
:Last-Modified: 2018-12-31
.. contents:: Table of Contents
:depth: 3
:local:
Abstract
========
This MERC proposes the use of errors that don't disclose the existance of a
resource in the event that the requester doesn't have the required credentials.
Motivation
==========
When an user tries to perform an action like opening a view to a document for
which the required permission is missing, a permission required or access
denied error is presented. This is semantically correct, but from the stand
point of security it is still failing because it is letting the user know
that such document exists in the first place. This MERC proposes changing the
error message for existing resource to one that doesn't divulge any information
to unauthorized parties, like "Not Found".
Specification
=============
Out of the 4 basic CRUD operations, Read, Update and Delete should return an
HTTP 404 error instead of an HTTP 403 error. Only the Create operation will
continue returning the current HTTP 403 error, unless it is creating a
new resource that is related to an existing resource.
Since most view use the internal custom CRUD classes making a change to the
``ObjectPermissionCheckMixin`` class to raise an HTTP 404 on object access
failure will fulfill the proposal of this MERC.
Adding the ``object_permission_raise_404`` class attribute and setting it
to default to False will allow fulfullin the goal of this MERC while
keeping the existing functionality intact.
Example:
.. code-block:: python
class ObjectPermissionCheckMixin(object):
"""
If object_permission_raise_404 is True an HTTP 404 error will be raised
instead of the normal 403.
"""
object_permission = None
object_permission_raise_404 = False
def get_permission_object(self):
return self.get_object()
def dispatch(self, request, *args, **kwargs):
if self.object_permission:
try:
AccessControlList.objects.check_access(
permissions=self.object_permission, user=request.user,
obj=self.get_permission_object(),
related=getattr(self, 'object_permission_related', None)
)
except PermissionDenied:
if self.object_permission_raise_404:
raise Http404
else:
raise
return super(
ObjectPermissionCheckMixin, self
).dispatch(request, *args, **kwargs)

View File

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

View File

@@ -63,5 +63,5 @@ Changes needed:
the Role model's permissions many to many field.
4. Update the ``AccessControlList`` models roles field to point to the group
models.
5. Update the role checks in the ``check_access`` and ``restrict_queryset``
5. Update the role checks in the ``check_access`` and ``filter_by_access``
``AccessControlList`` model manager methods.

File diff suppressed because it is too large Load Diff

View File

@@ -20,7 +20,6 @@ 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

View File

@@ -1,5 +1,3 @@
Archlinux
archlinux
adf
ajax
ajaxForm
@@ -175,15 +173,3 @@ YaN
yasg
YbN
YrcN
metacopy
overlayfs
sys
supervisord
Monkeypatch
Bootswatch
sortable
Odroid
callables
ModelPermission
mixins
kwargs

View File

@@ -1,5 +0,0 @@
################
Adding documents
################
.. include:: ../chapters/sources.rst

View File

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

View File

@@ -7,12 +7,10 @@ allows showing users different views of document groups. These are divided
into ones requiring manual maintenance and others that are updated
automatically.
**************
Manual methods
**************
.. include:: ../chapters/document_types.rst
.. include:: ../chapters/cabinets.rst
.. include:: ../chapters/tags.rst

View File

@@ -1,8 +0,0 @@
######
Docker
######
Docker is a container technology. Containers are a standard unit of software
that packages up code and all its dependencies.
.. include:: ../chapters/docker.rst

View File

@@ -148,7 +148,7 @@ Django's development server doesn't serve static files unless the DEBUG option
is set to True, this mode of operation should only be used for development or
testing. For production deployments the management command::
$ mayan-edms.py preparestatic
$ mayan-edms.py collectstatic
should be used and the resulting static folder served from a webserver.
For more information check the

View File

@@ -4,19 +4,6 @@ Getting started
These are the basic concepts you need to understand to start using Mayan EDMS.
The absolute minimum setup to start using Mayan EDMS is:
#. A document type
#. A document source to add new documents
that's it!
To make things even easier, a default document type (named "Default") and a
default document source (also named "Default") were created for you during the
installation. So you don't need to do anything more to start adding documents
right now, however take your time reading the information below to get a deeper
understanding about how these concepts work.
.. include:: ../chapters/document_types.rst
.. include:: ../chapters/sources.rst

View File

@@ -72,67 +72,15 @@ References:
Passwords
*********
.. _troubleshooting-admin-password:
Missing initial credentials or admin password reset
===================================================
Admin password reset
====================
To reset the password of the admin account use the following command::
MAYAN_MEDIA_ROOT=<your Mayan media root setting> <installation directory>/bin/mayan-edms.py changepassword admin
If you followed the deploying instructions from the documentation your
``MAYAN_MEDIA_ROOT`` will be ``/opt/mayan-edms/media``.
If using a Docker image, execute the command inside the container. First you
need to know the name of the Docker container running Mayan EDMS on your setup
with::
First you need to know the name of the Docker container running Mayan EDMS
on your setup with::
docker ps
Then execute the password reset command inside the Docker container::
docker exec -ti <your docker container name> /opt/mayan-edms/bin/mayan-edms.py changepassword admin
Another way to do this is to execute a shell inside the container to get a
command prompt::
docker exec -ti <your docker container name> /bin/bash
And then execute the command::
/opt/mayan-edms/bin/mayan-edms.py changepassword admin
.. _troubleshooting-autoadmin-account:
Missing automatic admin account after installation
==================================================
This is caused when the ``initialsetup`` command is interrupted as the admin
user is created outside of the database migrations.
To create an admin super user account manually use the command::
MAYAN_MEDIA_ROOT=<your Mayan media root setting> <installation directory>/bin/mayan-edms.py createsuperuser
If you followed the deploying instructions from the documentation your
``MAYAN_MEDIA_ROOT`` will be ``/opt/mayan-edms/media``.
If using a Docker image, execute the command inside the container. First
find you container name with::
docker ps
Then execute the command inside the container::
docker exec -ti <your docker container name> /opt/mayan-edms/bin/mayan-edms.py createsuperuser
Another way to do this is to execute a shell inside the container to get a
command prompt::
docker exec -ti <your docker container name> /bin/bash
And then execute the command::
/opt/mayan-edms/bin/mayan-edms.py createsuperuser

View File

@@ -1,9 +1,9 @@
from __future__ import unicode_literals
__title__ = 'Mayan EDMS'
__version__ = '3.2b1'
__build__ = 0x030200
__build_string__ = 'v3.2b1_Thu May 16 01:31:36 2019 -0400'
__version__ = '3.1.10'
__build__ = 0x030110
__build_string__ = 'v3.1.10-1-g51ea493a26_Thu Apr 4 22:03:19 2019 -0400'
__django_version__ = '1.11'
__author__ = 'Roberto Rosario'
__author_email__ = 'roberto.rosario@mayan-edms.com'

View File

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

View File

@@ -21,12 +21,12 @@ class APIObjectACLListView(generics.ListCreateAPIView):
"""
def get_content_object(self):
content_type = get_object_or_404(
klass=ContentType, app_label=self.kwargs['app_label'],
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
content_object = get_object_or_404(
klass=content_type.model_class(), pk=self.kwargs['object_id']
content_type.model_class(), pk=self.kwargs['object_pk']
)
if self.request.method == 'GET':
@@ -35,8 +35,8 @@ class APIObjectACLListView(generics.ListCreateAPIView):
permission_required = permission_acl_edit
AccessControlList.objects.check_access(
obj=content_object, permissions=(permission_required,),
user=self.request.user
permissions=permission_required, user=self.request.user,
obj=content_object
)
return content_object
@@ -62,9 +62,7 @@ class APIObjectACLListView(generics.ListCreateAPIView):
if not self.request:
return None
return super(APIObjectACLListView, self).get_serializer(
*args, **kwargs
)
return super(APIObjectACLListView, self).get_serializer(*args, **kwargs)
def get_serializer_class(self):
if self.request.method == 'GET':
@@ -87,17 +85,17 @@ class APIObjectACLView(generics.RetrieveDestroyAPIView):
permission_required = permission_acl_edit
content_type = get_object_or_404(
klass=ContentType, app_label=self.kwargs['app_label'],
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
content_object = get_object_or_404(
klass=content_type.model_class(), pk=self.kwargs['object_id']
content_type.model_class(), pk=self.kwargs['object_pk']
)
AccessControlList.objects.check_access(
obj=content_object, permissions=(permission_required,),
user=self.request.user
permissions=permission_required, user=self.request.user,
obj=content_object
)
return content_object
@@ -113,27 +111,22 @@ class APIObjectACLPermissionListView(generics.ListCreateAPIView):
"""
def get_acl(self):
return get_object_or_404(
klass=self.get_content_object().acls, pk=self.kwargs['pk']
self.get_content_object().acls, pk=self.kwargs['pk']
)
def get_content_object(self):
content_type = get_object_or_404(
klass=ContentType, app_label=self.kwargs['app_label'],
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
content_object = get_object_or_404(
klass=content_type.model_class(), pk=self.kwargs['object_id']
content_type.model_class(), pk=self.kwargs['object_pk']
)
if self.request.method == 'GET':
permission = permission_acl_view
else:
permission = permission_acl_edit
AccessControlList.objects.check_access(
obj=content_object, permissions=(permission,),
user=self.request.user
permissions=permission_acl_view, user=self.request.user,
obj=content_object
)
return content_object
@@ -154,9 +147,7 @@ class APIObjectACLPermissionListView(generics.ListCreateAPIView):
return WritableAccessControlListPermissionSerializer
def get_serializer_context(self):
context = super(
APIObjectACLPermissionListView, self
).get_serializer_context()
context = super(APIObjectACLPermissionListView, self).get_serializer_context()
if self.kwargs:
context.update(
{
@@ -177,27 +168,22 @@ class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
def get_acl(self):
return get_object_or_404(
klass=self.get_content_object().acls, pk=self.kwargs['pk']
self.get_content_object().acls, pk=self.kwargs['pk']
)
def get_content_object(self):
content_type = get_object_or_404(
klass=ContentType, app_label=self.kwargs['app_label'],
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
content_object = get_object_or_404(
klass=content_type.model_class(), pk=self.kwargs['object_id']
content_type.model_class(), pk=self.kwargs['object_pk']
)
if self.request.method == 'GET':
permission = permission_acl_view
else:
permission = permission_acl_edit
AccessControlList.objects.check_access(
obj=content_object, permissions=(permission,),
user=self.request.user
permissions=permission_acl_view, user=self.request.user,
obj=content_object
)
return content_object
@@ -206,9 +192,7 @@ class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
return self.get_acl().permissions.all()
def get_serializer_context(self):
context = super(
APIObjectACLPermissionView, self
).get_serializer_context()
context = super(APIObjectACLPermissionView, self).get_serializer_context()
if self.kwargs:
context.update(
{

View File

@@ -2,56 +2,35 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.apps import MayanAppConfig
from mayan.apps.common.menus import menu_object, menu_secondary
from mayan.apps.events.classes import ModelEventType
from mayan.apps.events.links import (
link_events_for_object, link_object_event_types_user_subcriptions_list
)
from mayan.apps.navigation.classes import SourceColumn
from 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_sortable=True, source=AccessControlList,
source=AccessControlList, label=_('Role'), attribute='role'
)
SourceColumn(
source=AccessControlList, label=_('Permissions'),
attribute='get_permission_titles'
)
menu_object.bind_links(
links=(
link_acl_permissions, link_acl_delete,
link_events_for_object,
link_object_event_types_user_subcriptions_list
),
links=(link_acl_permissions, link_acl_delete),
sources=(AccessControlList,)
)
menu_secondary.bind_links(
menu_sidebar.bind_links(
links=(link_acl_create,), sources=('acls:acl_list',)
)
registry.register(AccessControlList)

View File

@@ -8,9 +8,9 @@ logger = logging.getLogger(__name__)
class ModelPermission(object):
_functions = {}
_inheritances = {}
_registry = {}
_proxies = {}
_inheritances = {}
@classmethod
def register(cls, model, permissions):
@@ -24,9 +24,7 @@ class ModelPermission(object):
app_label='acls', model_name='AccessControlList'
)
model.add_to_class(
name='acls', value=GenericRelation(AccessControlList)
)
model.add_to_class('acls', GenericRelation(AccessControlList))
@classmethod
def get_classes(cls, as_content_type=False):
@@ -36,7 +34,7 @@ class ModelPermission(object):
if as_content_type:
content_type_dictionary = ContentType.objects.get_for_models(
models=cls._registry.keys()
*cls._registry.keys()
)
content_type_ids = [
content_type.pk for content_type in content_type_dictionary.values()
@@ -63,23 +61,24 @@ class ModelPermission(object):
if class_permissions:
permissions.extend(class_permissions)
proxy = cls._proxies.get(type(instance))
if proxy:
permissions.extend(cls._registry.get(proxy))
pks = [
permission.stored_permission.pk for permission in set(permissions)
]
return StoredPermission.objects.filter(pk__in=pks)
@classmethod
def get_function(cls, model):
return cls._functions[model]
@classmethod
def get_inheritance(cls, model):
return cls._inheritances[model]
@classmethod
def register_function(cls, model, function):
cls._functions[model] = function
def register_proxy(cls, source, model):
cls._proxies[model] = source
@classmethod
def register_inheritance(cls, model, related):
cls._inheritances[model] = related
@classmethod
def get_inheritance(cls, model):
return cls._inheritances[model]

View File

@@ -1,16 +0,0 @@
from __future__ import absolute_import, unicode_literals
from django.utils.translation import ugettext_lazy as _
from mayan.apps.events.classes import EventTypeNamespace
namespace = EventTypeNamespace(
label=_('Access control lists'), name='acls'
)
event_acl_created = namespace.add_event_type(
label=_('ACL created'), name='acl_created'
)
event_acl_edited = namespace.add_event_type(
label=_('ACL edited'), name='acl_edited'
)

View File

@@ -1,17 +0,0 @@
from __future__ import unicode_literals
from django import forms
from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.forms import FilteredSelectionForm
from .models import AccessControlList
class ACLCreateForm(FilteredSelectionForm, forms.ModelForm):
class Meta:
field_name = 'role'
fields = ('role',)
label = _('Role')
model = AccessControlList
widget_attributes = {'class': 'select2'}

View File

@@ -1,12 +1,6 @@
from __future__ import absolute_import, unicode_literals
from mayan.apps.appearance.classes import Icon
from mayan.apps.permissions.icons import icon_permission
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_permissions = icon_permission
icon_acl_new = Icon(driver_name='fontawesome', symbol='plus')

View File

@@ -3,11 +3,9 @@ from __future__ import unicode_literals
from django.apps import apps
from django.utils.translation import ugettext_lazy as _
from mayan.apps.navigation.classes import Link
from navigation import Link
from .icons import (
icon_acl_delete, icon_acl_list, icon_acl_new, icon_acl_permissions
)
from .icons import icon_acl_list, icon_acl_new
from .permissions import permission_acl_view, permission_acl_edit
@@ -29,22 +27,22 @@ def get_kwargs_factory(variable_name):
return get_kwargs
link_acl_create = Link(
icon_class=icon_acl_new, kwargs=get_kwargs_factory('resolved_object'),
permissions=(permission_acl_edit,), text=_('New ACL'),
view='acls:acl_create'
)
link_acl_delete = Link(
args='resolved_object.pk', icon_class=icon_acl_delete,
permissions=(permission_acl_edit,), tags='dangerous', text=_('Delete'),
view='acls:acl_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('resolved_object'),
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list'
)
link_acl_permissions = Link(
args='resolved_object.pk', icon_class=icon_acl_permissions,
permissions=(permission_acl_edit,),
text=_('Permissions'), view='acls:acl_permissions'
link_acl_create = Link(
icon_class=icon_acl_new, kwargs=get_kwargs_factory('resolved_object'),
permissions=(permission_acl_edit,), text=_('New ACL'),
view='acls:acl_create'
)
link_acl_permissions = Link(
args='resolved_object.pk', permissions=(permission_acl_edit,),
permissions_related='content_object', text=_('Permissions'),
view='acls:acl_permissions',
)

View File

@@ -1,77 +1,70 @@
# 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-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACLs"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Access control lists"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr ""
#: links.py:34
msgid "New ACL"
msgstr ""
#: links.py:39
msgid "Delete"
msgstr "حذف"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "الصلاحيات"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
#: links.py:32
msgid "Delete"
msgstr "حذف"
#: links.py:41
msgid "New ACL"
msgstr ""
#: managers.py:229
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
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 "Access control lists"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Edit ACLs"
@@ -80,80 +73,76 @@ msgstr "Edit ACLs"
msgid "View ACLs"
msgstr "View ACLs"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:170
msgid "Granted permissions"
msgstr ""
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: 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
@@ -169,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
@@ -190,6 +178,6 @@ msgstr ""
msgid "Grant access"
msgstr ""
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

View File

@@ -1,77 +1,69 @@
# 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-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACLs"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Контролни списъци за достъп"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr ""
#: links.py:34
msgid "New ACL"
msgstr ""
#: links.py:39
msgid "Delete"
msgstr ""
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Разрешения"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
#: links.py:32
msgid "Delete"
msgstr ""
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr ""
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "достъп вписване"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "достъп вписвания"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
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 "Редактиране на контролни списъци за достъп"
@@ -80,80 +72,76 @@ msgstr "Редактиране на контролни списъци за до
msgid "View ACLs"
msgstr "Преглед на контролни списъци за достъп"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:170
msgid "Granted permissions"
msgstr ""
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: 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
@@ -169,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
@@ -190,6 +177,6 @@ msgstr ""
msgid "Grant access"
msgstr ""
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

View File

@@ -1,77 +1,70 @@
# 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: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACLs"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Liste kontrole pristupa (ACLs)"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Uloga"
#: links.py:34
msgid "New ACL"
msgstr "Novi ACL"
#: links.py:39
msgid "Delete"
msgstr "Obriši"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Dozvole"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr ""
#: links.py:32
msgid "Delete"
msgstr "Obriši"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "Novi ACL"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Nedovoljan pristup za:%s"
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "Pristupni unos"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "Pristupni unosi"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Uloga \"%(role)s\" dozvole za \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr "Pristup \"%(permissions)s\" za ulogu \"%(role)s\" za \"%(object)s\""
#: models.py:77
msgid "None"
msgstr "Nijedno"
#: permissions.py:7
msgid "Access control lists"
msgstr "Liste kontrole pristupa (ACLs)"
#: permissions.py:10
msgid "Edit ACLs"
@@ -81,81 +74,81 @@ msgstr "Izmjeniti ACLs"
msgid "View ACLs"
msgstr "Pregledati ACLs"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr "API URL ukazujući na listu dozvola za ovu listu kontrole pristupa."
#: serializers.py:59
#: 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 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr "Primarni ključ za novu dozvolu za dodjelu listi kontrole pristupa."
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Nema takve dozvole: %s"
#: serializers.py:130
#: serializers.py:126
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:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr "Primarni ključevi uloge na koje se ova lista kontrole pristupa vezuje."
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Nove kontrole pristupa za:%s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Obriši ACL:%s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Liste kontrole pristupa (ACL) za: %s"
#: views.py:170
msgid "Granted permissions"
msgstr "Dodjeljene dozvole"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Dostupne dozvole"
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgstr ""
#: views.py:168
msgid "Granted permissions"
msgstr "Dodjeljene dozvole"
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
msgstr ""
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Uloga \"%(role)s\" dozvole za \"%(object)s\""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr "Dozvole za onesposobljavanje su nasledjene od roditeljskog objekta."
#: workflow_actions.py:25
msgid "Object type"
@@ -170,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
@@ -185,12 +177,13 @@ 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"
msgstr "Dodjeljen pristup"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Opozvati pristup"

View File

@@ -1,76 +1,68 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Jiri Fait <fait@orkasolutions.cz>, 2019
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-17 14:41+0000\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-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"
"Language: cs\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
"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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr ""
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr ""
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr ""
#: links.py:34
msgid "New ACL"
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr ""
#: links.py:39
#: links.py:32
msgid "Delete"
msgstr "Odstranit"
#: links.py:49 models.py:45 workflow_actions.py:48
msgid "Permissions"
msgstr "Práva"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
#: links.py:41
msgid "New ACL"
msgstr ""
#: managers.py:229
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
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
@@ -81,80 +73,76 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:170
msgid "Granted permissions"
msgstr ""
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: 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
@@ -170,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
@@ -191,6 +178,6 @@ msgstr ""
msgid "Grant access"
msgstr ""
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

View File

@@ -1,76 +1,69 @@
# 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-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Danish (Denmark) (http://www.transifex.com/rosarior/mayan-edms/language/da_DK/)\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"
"Language: da_DK\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACL'er"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr ""
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Rolle"
#: links.py:34
msgid "New ACL"
msgstr "Ny ACL"
#: links.py:39
msgid "Delete"
msgstr "Slet"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Tilladelser"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr ""
#: links.py:32
msgid "Delete"
msgstr "Slet"
#: managers.py:229
#: 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:57
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
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
@@ -81,80 +74,76 @@ msgstr "Editér ACL"
msgid "View ACLs"
msgstr "Se ACL"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Slet ACL: %s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:170
msgid "Granted permissions"
msgstr ""
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: 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
@@ -170,8 +159,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 ""
#: workflow_actions.py:42
@@ -191,6 +179,6 @@ msgstr ""
msgid "Grant access"
msgstr "Giv tilladelse"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Tilbagekald tilladelse"

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Berny <berny@bernhard-marx.de>, 2015
# Jesaja Everling <jeverling@gmail.com>, 2017
@@ -11,70 +11,63 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-06 22:04+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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "Zugriffsberechtigungen"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Zugriffsberechtigungen"
#: events.py:12
msgid "ACL created"
msgstr "Zugriffsberechtigung erstellt"
#: events.py:15
msgid "ACL edited"
msgstr "Zugriffsberechtigung bearbeitet"
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Rolle"
#: links.py:34
msgid "New ACL"
msgstr "Neue Berechtigung"
#: links.py:39
msgid "Delete"
msgstr "Löschen"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Berechtigungen"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr "Objekt \"%s\" ist kein Modell und kann nicht auf Zugriffsberechtigungen überprüft werden."
#: links.py:32
msgid "Delete"
msgstr "Löschen"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "Neue Berechtigung"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Unzureichende Berechtigung für: %s"
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "Berechtigungseintrag"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "Berechtigungseinträge"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr ""
"Berechtigungen \"%(permissions)s\" von Rolle \"%(role)s\" für \"%(object)s\""
#: models.py:77
msgid "None"
msgstr "Keine"
#: permissions.py:7
msgid "Access control lists"
msgstr "Zugriffsberechtigungen"
#: permissions.py:10
msgid "Edit ACLs"
@@ -84,81 +77,87 @@ msgstr "Zugriffsberechtigungen bearbeiten"
msgid "View ACLs"
msgstr "Zugriffsberechtigungen anzeigen"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr "API URL für die Liste der Berechtigungen dieser ACL"
#: serializers.py:59
#: 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 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:91
#: 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:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Keine solche Berechtigung: %s"
#: serializers.py:130
#: serializers.py:126
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:142
#: 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:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Neue Zugriffsberechtigunglisten für %s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Zugriffsberechtigung \"%s\" löschen"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr "Keine Zugriffsberechtigungen für dieses Objekt verfügbar"
#: views.py:150
#: 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 "Über Zugriffsberechtigungen wird der Zugriff von Benutzern zu Systemobjekten kontrolliert."
msgstr ""
"Über Zugriffsberechtigungen wird der Zugriff von Benutzern zu Systemobjekten "
"kontrolliert."
#: views.py:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Zugriffsberechtigungen für %s"
#: views.py:170
msgid "Granted permissions"
msgstr "Erteilte Berechtigungen"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Verfügbare Berechtigungen"
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr "Erteilte Berechtigungen"
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
msgstr "Unzureichende Berechtigungen werden durch ein übergeordnetes Objekt vererbt oder direkt an die Rolle erteilt. Sie können nicht direkt auf diesem Formular bearbeitet werden. Vererbte Berechtigungen müssen auf dem übergeordneten Objekt oder für die Rolle über das Einrichtungsmenü eingestellt werden."
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
"Deaktivierte Berechtigungen sind von einem übergeordneten Objekt vererbt."
#: workflow_actions.py:25
msgid "Object type"
@@ -173,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
@@ -188,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 "Zugriffsberechtigung erteilen"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Zugriffsberechtigung entziehen"

View File

@@ -1,76 +1,69 @@
# 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-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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-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"
"Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ΛΕΠ"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Λίστες Ελέγχου Πρόσβασης (ΛΕΠ)"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Ρόλος"
#: links.py:34
msgid "New ACL"
msgstr "Νέα ΛΕΠ"
#: links.py:39
msgid "Delete"
msgstr "Διαγραφή"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Ανεπαρκή δικαιώματα"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr ""
#: links.py:32
msgid "Delete"
msgstr "Διαγραφή"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "Νέα ΛΕΠ"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Μη επαρκή δικαιώματα πρόσβασης για το: %s"
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Δικαιώματα του Ρόλου \"%(role)s\" για \"%(object)s\""
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"
@@ -80,81 +73,78 @@ msgstr "Τροποποιηση ΛΕΠ"
msgid "View ACLs"
msgstr "Εμφάνιση ΛΕΠ"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Άγνωστο δικαίωμα: %s"
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Νέα λίστα ελέγχου για: %s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Διαγραφή ΛΕΠ: %s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Λίστα ελέγχου πρόσβασης για: %s"
#: views.py:170
msgid "Granted permissions"
msgstr "Χωρηγημένα δικαιώματα"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Διαθέσιμα δικαιώματα"
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgstr ""
#: views.py:168
msgid "Granted permissions"
msgstr "Χωρηγημένα δικαιώματα"
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: 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"
@@ -169,9 +159,10 @@ msgid "Object ID"
msgstr "Αναγνωριστικό αντικειμένου"
#: 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 ""
"Αριθμητικό αναγνωριστικό του αντικειμένου για το οποίο η πρόσβαση θα "
"τροποποιηθεί."
#: workflow_actions.py:42
msgid "Roles"
@@ -184,12 +175,14 @@ msgstr "Ρόλοι των οποιων η πρόσβαση θα τροποποι
#: workflow_actions.py:51
msgid ""
"Permissions to grant/revoke to/from the role for the object selected above."
msgstr "Δικαιώματα προς χορήγηση/ανάληση προς/από τον ρόλο για το ανωτέρω επιλεγμένο αντικείμενο."
msgstr ""
"Δικαιώματα προς χορήγηση/ανάληση προς/από τον ρόλο για το ανωτέρω επιλεγμένο "
"αντικείμενο."
#: workflow_actions.py:59
msgid "Grant access"
msgstr "Χορήγηση πρόσβασης"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Ανάκληση πρόσβασης"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-21 00:57-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"
@@ -17,59 +17,50 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: apps.py:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr ""
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr ""
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr ""
#: links.py:34
msgid "New ACL"
msgstr ""
#: links.py:39
msgid "Delete"
msgstr ""
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr ""
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
#: links.py:32
msgid "Delete"
msgstr ""
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr ""
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
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
@@ -80,80 +71,76 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:170
msgid "Granted permissions"
msgstr ""
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: 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
@@ -189,6 +176,6 @@ msgstr ""
msgid "Grant access"
msgstr ""
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

View File

@@ -1,79 +1,72 @@
# 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
# Roberto Rosario, 2015-2019
# Roberto Rosario, 2015-2018
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:52+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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "LCAs"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Listas de control de acceso"
#: events.py:12
msgid "ACL created"
msgstr "LCA creada"
#: events.py:15
msgid "ACL edited"
msgstr "LCA editada"
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Rol"
#: links.py:34
msgid "New ACL"
msgstr "Nueva LCA"
#: links.py:39
msgid "Delete"
msgstr "Borrar"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Permisos"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr "El objeto \"%s\"; no es un modelo y no se puede verificar el acceso."
#: links.py:32
msgid "Delete"
msgstr "Borrar"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "Nueva LCA"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Acceso insuficiente para: %s"
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "Entrada de acceso"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "Entradas de acceso"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Permisos del rol \"%(role)s\" para \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr ""
"Permisos \"%(permissions)s\" para el rol \"%(role)s\" para \"%(object)s\""
#: models.py:77
msgid "None"
msgstr "Ninguno"
#: permissions.py:7
msgid "Access control lists"
msgstr "Listas de control de acceso"
#: permissions.py:10
msgid "Edit ACLs"
@@ -83,81 +76,90 @@ msgstr "Editar LCAs"
msgid "View ACLs"
msgstr "Ver LCAs"
#: serializers.py:26 serializers.py:136
#: 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:59
#: 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:91
#: 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:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "No existe el permiso: %s"
#: serializers.py:130
#: serializers.py:126
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:142
#: 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:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Nueva lista de control de acceso para: %s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Borrar LCA: %s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr "No hay LCAs para este objeto"
#: views.py:150
#: 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 "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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Listas de control de acceso para: %s"
#: views.py:170
msgid "Granted permissions"
msgstr "Permisos otorgados"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Permisos disponibles"
#: views.py:215
#: views.py:168
msgid "Granted permissions"
msgstr "Permisos otorgados"
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Permisos del rol \"%(role)s\" para \"%(object)s\""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
msgstr "Los permisos deshabilitados se heredan de un objeto principal o se otorgan directamente al rol y no se pueden eliminar de esta vista. Los permisos heredados deben eliminarse de la LCA del objeto principal o de su rol a través del menú de Configuración."
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr "Los permisos inactivos se heredan de un objeto precedente."
#: workflow_actions.py:25
msgid "Object type"
@@ -172,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
@@ -187,12 +188,14 @@ 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"
msgstr "Otorgar acceso"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Revocar acceso"

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Mehdi Amani <MehdiAmani@toorintan.com>, 2017
# Nima Towhidi <nima.towhidi@gmail.com>, 2017
@@ -9,70 +9,62 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "دسترسی ها"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "لیست کنترل دسترسی ها"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "نقش"
#: links.py:34
msgid "New ACL"
msgstr "دسترسی جدید"
#: links.py:39
msgid "Delete"
msgstr "حذف"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "مجوزها"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr ""
#: links.py:32
msgid "Delete"
msgstr "حذف"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "دسترسی جدید"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "کمبود دسترسی برای: %s"
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "ورودی دسترسی"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "ورودیهای دسترسی"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "نقش\"%(role)s\" دارای اجازه برای \"%(object)s\""
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"
@@ -82,81 +74,81 @@ msgstr "ویرایش دسترسی ها"
msgid "View ACLs"
msgstr "دیدن دسترسی ها"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr "API URL اشاره گر به لیست اجازه های این دسترسی."
#: serializers.py:59
#: 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 API اشاره به اجازه در رابطه با لیست کنترل دسترسی که به آن متصل است. این URL متفاوت از URL کارآفرینی کانونی است."
msgstr ""
"URL API اشاره به اجازه در رابطه با لیست کنترل دسترسی که به آن متصل است. این "
"URL متفاوت از URL کارآفرینی کانونی است."
#: serializers.py:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr "کلید اولیه مجوز جدید برای اعطای لیست کنترل دسترسی."
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "این اجازه ئوجود ندارد: %s"
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr "لیست مجوز از کلیدهای مجاز مجاز برای حذف این لیست کنترل دسترسی جداگانه را از یکدیگر جدا کنید."
msgstr ""
"لیست مجوز از کلیدهای مجاز مجاز برای حذف این لیست کنترل دسترسی جداگانه را از "
"یکدیگر جدا کنید."
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr "کلید اصلی نقش که این لیست کنترل دسترسی به آن متصل می شود."
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "لیست کنترل دسترسی جدید برای: %s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "حذف لیست دسترسی ها: %s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "لیست کنترل دسترسی ها برای : %s"
#: views.py:170
msgid "Granted permissions"
msgstr "مجوزهای داده شده"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "مجوزهای موجود"
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgstr ""
#: views.py:168
msgid "Granted permissions"
msgstr "مجوزهای داده شده"
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
msgstr ""
#: 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"
@@ -171,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
@@ -192,6 +183,6 @@ msgstr "مجوز برای اعطای / لغو به / از نقش مورد انت
msgid "Grant access"
msgstr "دادن دسترسی"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "لغو دسترسی"

View File

@@ -1,80 +1,72 @@
# 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
# Frédéric Sheedy <sheedf@gmail.com>, 2019
# Yves Dubois <ydubois@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 03:24+0000\n"
"Last-Translator: Frédéric Sheedy <sheedf@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/rosarior/mayan-edms/language/fr/)\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: 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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "Droits"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Listes de contrôle des droits d'accès"
#: events.py:12
msgid "ACL created"
msgstr "Droits créé"
#: events.py:15
msgid "ACL edited"
msgstr "Droits modifié"
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Rôle"
#: links.py:34
msgid "New ACL"
msgstr "Nouveau droit"
#: links.py:39
msgid "Delete"
msgstr "Suppression"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Autorisations"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr ""
#: links.py:32
msgid "Delete"
msgstr "Suppression"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "Nouveau droit"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Droits d'accès insuffisants pour : %s"
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "Autorisation d'accès"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "Autorisations d'accès"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Autorisation du rôle \"%(role)s\" pour \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr ""
"Autorisations \"%(permissions)s\" du rôle \"%(role)s\" pour \"%(object)s\""
#: models.py:77
msgid "None"
msgstr "Aucun"
#: permissions.py:7
msgid "Access control lists"
msgstr "Listes de contrôle des droits d'accès"
#: permissions.py:10
msgid "Edit ACLs"
@@ -84,81 +76,87 @@ msgstr "Éditer les droits"
msgid "View ACLs"
msgstr "Voir les droits"
#: serializers.py:26 serializers.py:136
#: 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:59
#: 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:91
#: 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:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Aucune autorisation de ce genre : %s"
#: serializers.py:130
#: serializers.py:126
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:142
#: 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:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Nouvelle liste de contrôle d'accès pour : %s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Supprimer le droit : %s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr "Aucun droit pour cet objet"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Liste de contrôle d'accès pour : %s"
#: views.py:170
msgid "Granted permissions"
msgstr "Autorisations accordées"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Autorisations disponibles"
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgstr "Role \"%(role)s\" permissions pour \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr "Autorisations accordées"
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
msgstr ""
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Autorisation du rôle \"%(role)s\" pour \"%(object)s\""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr "Les autorisations révoquées sont héritées de l'objet parent."
#: workflow_actions.py:25
msgid "Object type"
@@ -173,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"
@@ -188,12 +187,13 @@ 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"
msgstr "Accorder le droit d'accès"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Révoquer le droit d'accès"

View File

@@ -1,77 +1,69 @@
# 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-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACL-ek"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Hozzáférési lista"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Szerepkör"
#: links.py:34
msgid "New ACL"
msgstr ""
#: links.py:39
msgid "Delete"
msgstr "Törlés"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Engedélyek"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
#: links.py:32
msgid "Delete"
msgstr "Törlés"
#: links.py:41
msgid "New ACL"
msgstr ""
#: managers.py:229
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "Hozzáférési bejegyzés"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "Hozzáférési bejegyzések"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr ""
#: models.py:77
msgid "None"
msgstr "Semmi"
#: permissions.py:7
msgid "Access control lists"
msgstr "Hozzáférési lista"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Hozzáférési listák szerkesztése"
@@ -80,80 +72,76 @@ msgstr "Hozzáférési listák szerkesztése"
msgid "View ACLs"
msgstr "Hozzáférési listák megtekintése"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Nincs ilyen jogosúltság: %s"
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Hozzáférési lista a: %s -hoz"
#: views.py:170
msgid "Granted permissions"
msgstr "Élvezett jogosúltságok"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Elérhető jogosúltságok"
#: views.py:215
#: views.py:168
msgid "Granted permissions"
msgstr "Élvezett jogosúltságok"
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: workflow_actions.py:25
@@ -169,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
@@ -190,6 +177,6 @@ msgstr ""
msgid "Grant access"
msgstr ""
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

View File

@@ -1,75 +1,67 @@
# 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-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-12 17:32+0000\n"
"Last-Translator: Adek Lanin\n"
"Language-Team: Indonesian (http://www.transifex.com/rosarior/mayan-edms/language/id/)\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: 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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr ""
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr ""
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr ""
#: links.py:34
msgid "New ACL"
msgstr ""
#: links.py:39
msgid "Delete"
msgstr "Hapus"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr ""
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
#: links.py:32
msgid "Delete"
msgstr ""
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr ""
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
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
@@ -80,80 +72,76 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:170
msgid "Granted permissions"
msgstr ""
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: 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
@@ -169,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
@@ -190,6 +177,6 @@ msgstr ""
msgid "Grant access"
msgstr ""
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

View File

@@ -1,77 +1,69 @@
# 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: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACLs"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Liste di controllo accessi"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Ruolo"
#: links.py:34
msgid "New ACL"
msgstr "Nuova ACL"
#: links.py:39
msgid "Delete"
msgstr "Cancella"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Permessi"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr ""
#: links.py:32
msgid "Delete"
msgstr "Cancella"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "Nuova ACL"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "Voce di accesso"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "Voci di accesso"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Permessi del ruolo \"%(role)s\" per \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr "Permessi \"%(permissions)s\" del ruolo \"%(role)s\" per \"%(object)s\""
#: models.py:77
msgid "None"
msgstr "Nessuna "
#: permissions.py:7
msgid "Access control lists"
msgstr "Liste di controllo accessi"
#: permissions.py:10
msgid "Edit ACLs"
@@ -81,81 +73,82 @@ msgstr "Modifica ACL"
msgid "View ACLs"
msgstr "Visualizza ACL"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr "URL delle API che punta alla lista controllo accessi"
#: serializers.py:59
#: 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 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr "Chiavi primarie del permesso per garantire la lista controllo accessi"
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Nessun permesso: %s"
#: serializers.py:130
#: serializers.py:126
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:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr "Chiavi primarie del ruolo a cui si lega la lista controllo accessi"
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Nuova lista di controllo accesso per: %s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Cancella ACL: %s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Lista dei permessi d'accesso per: %s"
#: views.py:170
msgid "Granted permissions"
msgstr "Autorizzazioni concesse "
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Autorizzazioni disponibili "
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgstr ""
#: views.py:168
msgid "Granted permissions"
msgstr "Autorizzazioni concesse "
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
msgstr ""
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Permessi del ruolo \"%(role)s\" per \"%(object)s\""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr "Il permesso disabilita è ereditato dall'oggetto padre"
#: workflow_actions.py:25
msgid "Object type"
@@ -170,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
@@ -191,6 +183,6 @@ msgstr ""
msgid "Grant access"
msgstr ""
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Evelijn Saaltink <evelijnsaaltink@gmail.com>, 2016
# Justin Albstbstmeijer <justin@albstmeijer.nl>, 2016
@@ -10,70 +10,64 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "Authorisatielijsten"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Authorisatielijsten"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Gebruikersrol"
#: links.py:34
msgid "New ACL"
msgstr "Nieuwe authorisatielijst"
#: links.py:39
msgid "Delete"
msgstr "Verwijder"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Permissies"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr ""
#: links.py:32
msgid "Delete"
msgstr "Verwijder"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "Nieuwe authorisatielijst"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Onvoldoende toegang voor: %s"
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "Authorisatie invoer"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "Authorisaties invoer"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Rol \"%(role)s\" permissies voor \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr ""
"Permissies \"%(permissions)s\" voor gebruikersrol \"%(role)s\" voor "
"\"%(object)s\""
#: models.py:77
msgid "None"
msgstr "Geen"
#: permissions.py:7
msgid "Access control lists"
msgstr "Authorisatielijsten"
#: permissions.py:10
msgid "Edit ACLs"
@@ -83,81 +77,88 @@ msgstr "Bewerk authorisatielijsten"
msgid "View ACLs"
msgstr "Bekijk authorisatielijsten"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr "UPI URL wijzend naar de permissielijst voor deze toegangscontrolelijst"
#: serializers.py:59
#: 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 "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:91
#: 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:115 serializers.py:191
#: 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:130
#: 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:142
#: 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:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Nieuwe authorisatielijsten voor: %s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Verwijder authorisatielijst: %s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Authorisatielijsten voor: %s"
#: views.py:170
msgid "Granted permissions"
msgstr "Toegekende permissies"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Beschikbare permissies"
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgstr ""
#: views.py:168
msgid "Granted permissions"
msgstr "Toegekende permissies"
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
msgstr ""
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Rol \"%(role)s\" permissies voor \"%(object)s\""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr "Uitgeschakelde permissies zijn geërfd van een parent object."
#: workflow_actions.py:25
msgid "Object type"
@@ -172,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
@@ -187,12 +187,14 @@ 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"
msgstr "Geef toegang"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Verwijder toegang"

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Daniel Winiarski <daniel.winiarski.dw@gmail.com>, 2017
# Wojciech Warczakowski <w.warczakowski@gmail.com>, 2016
@@ -10,70 +10,66 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "Listy ACL"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Listy ACL"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr "Rola"
#: links.py:34
msgid "New ACL"
msgstr "Nowa lista ACL"
#: links.py:39
msgid "Delete"
msgstr "Usuń"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Uprawnienia"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
msgstr ""
#: links.py:32
msgid "Delete"
msgstr "Usuń"
#: managers.py:229
#: links.py:41
msgid "New ACL"
msgstr "Nowa lista ACL"
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr "Niewystarczający dostęp dla: %s"
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr "Zgłoszenie dostępu"
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr "Zgłoszenia dostępu"
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Uprawnienia roli \"%(role)s\" dla obiektu \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr ""
"Uprawnienia \"%(permissions)s\" dla roli \"%(role)s\" dotyczące \"%(object)s"
"\""
#: models.py:77
msgid "None"
msgstr "Brak"
#: permissions.py:7
msgid "Access control lists"
msgstr "Listy ACL"
#: permissions.py:10
msgid "Edit ACLs"
@@ -83,81 +79,83 @@ msgstr "Edytuj listy ACL"
msgid "View ACLs"
msgstr "Przeglądaj listy ACL"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr "API URL prowadzący do listy uprawnień dla listy kontroli dostępu."
#: serializers.py:59
#: 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 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:91
#: 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:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr "Brak uprawnienia: %s"
#: serializers.py:130
#: serializers.py:126
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:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr "Klucze główne roli, z którymi związana jest ta lista kontroli dostępu."
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr "Nowe listy ACL dla: %s"
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr "Usuń listę ACL: %s"
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr "Listy ACL dla: %s"
#: views.py:170
msgid "Granted permissions"
msgstr "Przyznane uprawnienia"
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr "Dostępne uprawnienia"
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
msgstr ""
#: views.py:168
msgid "Granted permissions"
msgstr "Przyznane uprawnienia"
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
msgstr ""
#: views.py:230
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Uprawnienia roli \"%(role)s\" dla obiektu \"%(object)s\""
#: views.py:250
msgid "Disabled permissions are inherited from a parent object."
msgstr "Domyślne uprawnienia są dziedziczone z obiektu nadrzędnego."
#: workflow_actions.py:25
msgid "Object type"
@@ -172,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"
@@ -193,6 +191,6 @@ msgstr "Uprawnienia do nadawania/odwoływania do/z roli dla obiektu."
msgid "Grant access"
msgstr "Przyznaj dostęp"
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr "Odwołaj dostęp"

View File

@@ -1,77 +1,69 @@
# 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-05-21 00:57-0400\n"
"PO-Revision-Date: 2019-05-05 01:43+0000\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:24 links.py:44
#: apps.py:15 links.py:37
msgid "ACLs"
msgstr "ACL's"
#: events.py:8 permissions.py:7
msgid "Access control lists"
msgstr "Listas de controlo de acesso"
#: events.py:12
msgid "ACL created"
msgstr ""
#: events.py:15
msgid "ACL edited"
msgstr ""
#: forms.py:15 models.py:49
#: apps.py:23 models.py:47
msgid "Role"
msgstr ""
#: links.py:34
msgid "New ACL"
msgstr ""
#: links.py:39
msgid "Delete"
msgstr "Eliminar"
#: links.py:49 models.py:45 workflow_actions.py:48
#: apps.py:26 links.py:46 models.py:43 workflow_actions.py:48
msgid "Permissions"
msgstr "Permissões"
#: managers.py:209
#, python-format
msgid "Object \"%s\" is not a model and cannot be checked for access."
#: links.py:32
msgid "Delete"
msgstr "Eliminar"
#: links.py:41
msgid "New ACL"
msgstr ""
#: managers.py:229
#: managers.py:61 managers.py:102
#, python-format
msgid "Insufficient access for: %s"
msgstr ""
#: models.py:57
#: models.py:55
msgid "Access entry"
msgstr ""
#: models.py:58
#: models.py:56
msgid "Access entries"
msgstr ""
#: models.py:62
#: models.py:60
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
msgstr ""
#: models.py:77
msgid "None"
msgstr "Nenhum"
#: permissions.py:7
msgid "Access control lists"
msgstr "Listas de controlo de acesso"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editar ACL's"
@@ -80,80 +72,76 @@ msgstr "Editar ACL's"
msgid "View ACLs"
msgstr "Ver ACL's"
#: serializers.py:26 serializers.py:136
#: serializers.py:24 serializers.py:132
msgid ""
"API URL pointing to the list of permissions for this access control list."
msgstr ""
#: serializers.py:59
#: 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:91
#: serializers.py:87
msgid "Primary key of the new permission to grant to the access control list."
msgstr ""
#: serializers.py:115 serializers.py:191
#: serializers.py:111 serializers.py:187
#, python-format
msgid "No such permission: %s"
msgstr ""
#: serializers.py:130
#: serializers.py:126
msgid ""
"Comma separated list of permission primary keys to grant to this access "
"control list."
msgstr ""
#: serializers.py:142
#: serializers.py:138
msgid "Primary keys of the role to which this access control list binds to."
msgstr ""
#: views.py:62
#: views.py:77
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:100
#: views.py:104
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:148
msgid "There are no ACLs for this object"
msgstr ""
#: views.py:150
#: 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:154
#: views.py:155
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:170
msgid "Granted permissions"
msgstr ""
#: views.py:171
#: views.py:167
msgid "Available permissions"
msgstr ""
#: views.py:215
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\"."
#: views.py:168
msgid "Granted permissions"
msgstr ""
#: views.py:224
msgid ""
"Disabled permissions are inherited from a parent object or directly granted "
"to the role and can't be removed from this view. Inherited permissions need "
"to be removed from the parent object's ACL or from them role via the Setup "
"menu."
#: 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
@@ -169,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
@@ -190,6 +177,6 @@ msgstr ""
msgid "Grant access"
msgstr ""
#: workflow_actions.py:135
#: workflow_actions.py:129
msgid "Revoke access"
msgstr ""

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