Compare commits
43 Commits
feature/mu
...
developmen
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25854a0a1c | ||
|
|
6006fc9b74 | ||
|
|
57baf76a50 | ||
|
|
8385ef13b0 | ||
|
|
dd1e4cb685 | ||
|
|
6dcfd1b861 | ||
|
|
d867614c1c | ||
|
|
6cc574e631 | ||
|
|
5b94d202dc | ||
|
|
3e7d3946f8 | ||
|
|
2cbb1bc9e1 | ||
|
|
f0505db3b7 | ||
|
|
39995764eb | ||
|
|
d0aad4cb35 | ||
|
|
7abf8a7fc0 | ||
|
|
fc0127c7ad | ||
|
|
bbef5fd570 | ||
|
|
7a492b28f3 | ||
|
|
abd720bf10 | ||
|
|
25c1391649 | ||
|
|
95c0be45fb | ||
|
|
944ddd682b | ||
|
|
c6bf3b00cd | ||
|
|
bd419dc943 | ||
|
|
70e2ca3334 | ||
|
|
5dd88ad690 | ||
|
|
ae57b97a1b | ||
|
|
cb15e40f70 | ||
|
|
01420c42dd | ||
|
|
20e3634f5a | ||
|
|
48fc36d54e | ||
|
|
7a29b2496b | ||
|
|
c0407652c0 | ||
|
|
5083a2d261 | ||
|
|
ba1ab5d4f1 | ||
|
|
17b7d6f25e | ||
|
|
ca1f674d78 | ||
|
|
93aeb8cffe | ||
|
|
8eeee5b5a4 | ||
|
|
6221187070 | ||
|
|
acdc7dca48 | ||
|
|
105eab0740 | ||
|
|
b91f7f685a |
@@ -1,10 +0,0 @@
|
||||
.git
|
||||
.gitignore
|
||||
HISTORY.md
|
||||
mayan/media
|
||||
db.sqlite*
|
||||
docker
|
||||
!docker/etc
|
||||
!docker/entrypoint.sh
|
||||
./.*
|
||||
docs
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -28,4 +28,3 @@ static_collected/
|
||||
/mayan/media/static/
|
||||
/venv/
|
||||
/whoosh_index/
|
||||
node_modules/
|
||||
|
||||
109
.gitlab-ci.yml
109
.gitlab-ci.yml
@@ -1,82 +1,41 @@
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
|
||||
job_docker_master:
|
||||
stage: build
|
||||
image: docker:latest
|
||||
services:
|
||||
- docker:dind
|
||||
before_script:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
image: ubuntu:16.10
|
||||
services:
|
||||
- mysql:latest
|
||||
- postgres
|
||||
before_script:
|
||||
- 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
|
||||
- apt-get update -qq
|
||||
- apt-get install -qq curl graphviz python-dev python-pip gcc gnupg1 tesseract-ocr tesseract-ocr-deu ghostscript libjpeg-dev libpng-dev libtiff-dev poppler-utils libreoffice
|
||||
variables:
|
||||
POSTGRES_DB: "mayan_edms"
|
||||
POSTGRES_PASSWORD: "postgres"
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
|
||||
MYSQL_DATABASE: "mayan_edms"
|
||||
test:mysql:
|
||||
script:
|
||||
- docker build --pull -t "$CI_REGISTRY_IMAGE" -f docker/Dockerfile .
|
||||
- docker run --rm "$CI_REGISTRY_IMAGE" run-tests
|
||||
- docker push "$CI_REGISTRY_IMAGE"
|
||||
only:
|
||||
- master
|
||||
|
||||
job_docker_other:
|
||||
stage: build
|
||||
image: docker:latest
|
||||
services:
|
||||
- docker:dind
|
||||
before_script:
|
||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||
script:
|
||||
- docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" -f docker/Dockerfile .
|
||||
- docker run --rm "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" run-tests
|
||||
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
|
||||
except:
|
||||
- master
|
||||
|
||||
.test_base: &test_base
|
||||
stage: test
|
||||
image: ubuntu:16.04
|
||||
cache:
|
||||
paths:
|
||||
- ~/.cache/pip/
|
||||
- /var/cache/apt/archives/
|
||||
before_script:
|
||||
- apt-get -qq update
|
||||
- apt-get install -qq locales
|
||||
- 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
|
||||
- apt-get install -qq curl gcc ghostscript gpgv gnupg graphviz 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
|
||||
|
||||
test-mysql:
|
||||
<<: *test_base
|
||||
variables:
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
|
||||
MYSQL_DATABASE: "mayan_edms"
|
||||
services:
|
||||
- mysql:8.0.3
|
||||
script:
|
||||
- apt-get install -qq libmysqlclient-dev mysql-client
|
||||
- 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
|
||||
- apt-get install -qq libmysqlclient-dev
|
||||
- pip install -r requirements/testing.txt
|
||||
- pip install mysql-python
|
||||
- apt-get install -qq mysql-client
|
||||
- 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;"
|
||||
- coverage run manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
|
||||
- codecov
|
||||
tags:
|
||||
- mysql
|
||||
|
||||
test-postgres:
|
||||
<<: *test_base
|
||||
variables:
|
||||
POSTGRES_DB: "mayan_edms"
|
||||
POSTGRES_PASSWORD: "postgres"
|
||||
services:
|
||||
- postgres
|
||||
test:postgres:
|
||||
script:
|
||||
- apt-get install -qq libpq-dev
|
||||
- pip install psycopg2
|
||||
- python manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_postgres --nomigrations
|
||||
- apt-get install -qq libpq-dev
|
||||
- pip install -r requirements/testing.txt
|
||||
- pip install psycopg2
|
||||
- coverage run manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci.db_postgres --nomigrations
|
||||
- codecov
|
||||
tags:
|
||||
- postgres
|
||||
|
||||
test-sqlite:
|
||||
<<: *test_base
|
||||
test:sqlite:
|
||||
script:
|
||||
- python manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci --nomigrations
|
||||
- pip install -r requirements/testing.txt
|
||||
- coverage run manage.py test --mayan-apps --settings=mayan.settings.testing.gitlab-ci --nomigrations
|
||||
- codecov
|
||||
|
||||
@@ -23,7 +23,6 @@ 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](http://mayan.readthedocs.io/en/latest/topics/caa_individual.rst) or [Mayan EDMS Entity Contributor Assignment Agreement](http://mayan.readthedocs.io/en/latest/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:
|
||||
|
||||
188
HISTORY.rst
188
HISTORY.rst
@@ -1,189 +1,7 @@
|
||||
3.0 (2018-04-XX)
|
||||
3.0 (2017-XX-XX)
|
||||
================
|
||||
- Rename the role groups link label from "Members" to "Groups".
|
||||
- Rename the group users link label from "Members" to "Users".
|
||||
- Don't show full document version label in the heading of the document
|
||||
version list view.
|
||||
- Show the number of pages of a document and of document versions in
|
||||
the document list view and document versions list views respectively.
|
||||
- Display a document version's thumbnail before other attributes.
|
||||
- User Django's provided form for setting an users password.
|
||||
This change allows displaying the current password policies
|
||||
and validation.
|
||||
- Add method to modify a group's role membership from the group's
|
||||
view.
|
||||
- Rename the group user count column label from "Members" to "Users".
|
||||
- Backport support for global and object event notification.
|
||||
GitLab issue #262.
|
||||
- Remove Vagrant section of the document. Anything related to
|
||||
Vagrant has been move into its own repository at:
|
||||
https://gitlab.com/mayan-edms/mayan-edms-vagrant
|
||||
- Add view to show list of events performed by an user.
|
||||
- Allow filtering an event list by clicking on the user column.
|
||||
- Display a proper message in the document type metadata type relationship
|
||||
view when there are no metadata types exist.
|
||||
- Require the document view permission to view trashed documents.
|
||||
- Make the multi object form perform an auto submit when the value is changed.
|
||||
- Improved styling and interaction of the multiple object action form.
|
||||
- Add checkbox to allow selecting all item in the item list view.
|
||||
- Revise and improve permission requirements for the documents app API.
|
||||
- Downloading a document version now requires the document download permission
|
||||
instead of just the document view permission.
|
||||
- Creating a new document no longer works by having the document create
|
||||
permission in a global manner. It is now possible to create a document via
|
||||
the API by having the document permission for a specific document type.
|
||||
- Viewing the version list of a document now required the document version
|
||||
view permission instead of the document view permission.
|
||||
- Not having the document version view permission for a document will not
|
||||
return a 403 error. Instead a blank response will be returned.
|
||||
- Reverting a document via API will new require the document version revert
|
||||
permission instead of the document edit permission.
|
||||
- Fix permission filtering when performing document page searching.
|
||||
- Fix cabinet detail view pagination.
|
||||
- Update project to work with Django 1.11.11.
|
||||
- Fix deprecations in preparation for Django 2.0.
|
||||
- Improve permission handling in the workflow app.
|
||||
- The checkedout detail view permission is now required for the checked out document detail API view.
|
||||
- Switch to a resource and service based API from previous app based one.
|
||||
- Add missing services for the checkout API.
|
||||
- Fix existing checkout APIs.
|
||||
- Update API vies and serializers for the latest Django REST framework version. Replace DRF Swagger with DRF-YASG.
|
||||
- Update to the latest version of Pillow, django-activity-stream, django-compressor, django-cors-headers,
|
||||
django-formtools, django-qsstats-magic, django-stronghold, django-suit, furl, graphviz, pyocr,
|
||||
python-dateutil, python-magic, pytz, sh.
|
||||
- Update to the latest version the packages for building, development, documentation and testing.
|
||||
- Add statistics script to produce a report of the views, APIs and test for each app.
|
||||
- Merge base64 filename patch from Cornelius Ludmann.
|
||||
- SearchModel retrun interface changed. The class no longer returns the result_set value. Use the queryset returned instead.
|
||||
- Update to Font Awesome 5.
|
||||
- Turn Mayan EDMS into a single page app.
|
||||
- Split base.js into mayan_app.js, mayan_image.js, partial_navigation.js.
|
||||
- Add a HOME_VIEW setting. Use it for the default view to be loaded.
|
||||
- Fix bug in document page view. Was storing the URL and the querystring as a single url variable.
|
||||
- Use history.back instead of history.go(-1).
|
||||
- Don't use the previous variable when canceling a form action. Form now use only javascript's history.back().
|
||||
- Add template and modal to display server side errors.
|
||||
- Remove the unused scrollable_content internal feature.
|
||||
- Remove unused animate.css package.
|
||||
- Add page loading indicator.
|
||||
- Add periodic AJAX workers to update the value of the notifications link.
|
||||
- Add notification count inside a badge on the notification link.
|
||||
- Add the MERC specifying javascript library usage.
|
||||
- Documents without at least a version are not scanned for duplicates.
|
||||
- Use a SHA256 hex digest of the secret key at the name of the lockfile. This makes the generation of the name repeatable while unique between installations.
|
||||
- Squashed apps migrations.
|
||||
- Convert document thumbnails, preview, image preview and staging files to template base widgets.
|
||||
- Unify all document widgets.
|
||||
- Display resolution settings are now specified as width and height and not a single resolution value.
|
||||
- Printed pages are now full width.
|
||||
- Move the invalid document markup to a separate HTML template.
|
||||
- Update to Fancybox 3.
|
||||
- Update to jQuery 3.3.1
|
||||
- Move transfomations to their own module.
|
||||
- Split documents.tests.test_views into base.py, test_deleted_document_views.py,
|
||||
test_document_page_views.py, test_document_type_views.py, test_document_version_views.py,
|
||||
test_document_views.py, test_duplicated_document_views.py
|
||||
- Sort smart links by label.
|
||||
- Rename the internal name of the document type permissions namespace. Existing permissions will need to be updated.
|
||||
- Add support for OR type searches. Use the "OR" string between the terms. Example: term1 OR term2.
|
||||
- Removed redundant permissions checks.
|
||||
- Move the page count display to the top of the image.
|
||||
- Unify the way to gather the project's metadata. Use mayan.__XX__ and a new common tag named {% project_information '' %}
|
||||
- Return to the same source view after uploading a document.
|
||||
- Add new WizardStep class to decouple the wizard step configuration.
|
||||
- Add support for deregister upload wizard steps.
|
||||
- Add wizard step to insert the document being uploaded to a cabinet.
|
||||
- Fix documentation formatting.
|
||||
- Add upload wizard step chapte.
|
||||
- Improve and add additional diagrams.
|
||||
- Change documenation theme to rtd.
|
||||
- Fix carousel item height issues.
|
||||
- Add the "to=" keyword argument to all ForeignKey, ManayToMany and OneToOne Fields.
|
||||
- Add Makefile target to check the format of the README.rst file.
|
||||
- Mark the feature to detect and fix the orientatin of PDF as experimental.
|
||||
- Don't show documents with 0 duplicates in the duplicated document list.
|
||||
- Clean up the duplicated document model after a document is deleted.
|
||||
- Add support for roles ACLs.
|
||||
- Add support for users ACLs.
|
||||
- Add support for groups ACLs.
|
||||
- Sort permission namespaces and permissions in the role permission views.
|
||||
- Invert the columns in the ACL detail view.
|
||||
- Fix issue #454. Thanks to Andrei Korostelev @kindkaktus for the issue and the
|
||||
solution.
|
||||
- Update the role permission edit view require the permission grant or permission
|
||||
revoke permissions for the selected role.
|
||||
- Only show the new document link if the user has access to create documents of
|
||||
at least one document type. GitLab Issue #302. Thanks to kg @kgraves.
|
||||
- Support passing arguments to the document, document cache and document signatures
|
||||
storage backends. New settings: DOCUMENTS_STORAGE_BACKEND_ARGUMENTS,
|
||||
DOCUMENTS_CACHE_STORAGE_BACKEND_ARGUMENTS, SIGNATURES_STORAGE_BACKEND_ARGUMENTS
|
||||
- Remove the setting STORAGE_FILESTORAGE_LOCATION. Document storage
|
||||
location for the storage.backend.filebasedstorage.FileBasedStorage
|
||||
backdend must now passed via the DOCUMENTS_STORAGE_BACKEND_ARGUMENTS,
|
||||
DOCUMENTS_CACHE_STORAGE_BACKEND_ARGUMENTS, or
|
||||
SIGNATURES_STORAGE_BACKEND_ARGUMENTS if the backend is used to documents,
|
||||
the document image cache and/or document signatures. Use
|
||||
DOCUMENTS_STORAGE_BACKEND_ARGUMENTS = '{ location: <specific_path> }'
|
||||
If no path is specified the backend will default to
|
||||
'mayan/media/document_storage'.
|
||||
- Standardize the way storages are used. All apps that use storage now define
|
||||
their storages in the .storages modules instead of the .runtime module.
|
||||
The storage.backends.filebasedstorage.FileBasedStorage has been remove,
|
||||
instead Django's default storage is used and each app is responsible
|
||||
of specifying their default path.
|
||||
- Unify checkbox selection code for list items and table items.
|
||||
- Add smart checkbox manager.
|
||||
- Update Chart.js version.
|
||||
- Improve line chart appearance. Fix mouse hover label issue.
|
||||
- Add JavaScript dependency manager.
|
||||
- Add support for passing arguments to the OCR backend.
|
||||
- Fix issue when using workflows transitions with the new version
|
||||
upload event as trigger. Thanks to Sema @Miggaten for the find and
|
||||
the solution.
|
||||
- Removing running workflow instances in document of a specific type if
|
||||
that document type is removed from the workflow.
|
||||
- Make error messages persistent and increase the timeout of warning to 10 seconds.
|
||||
- Improve rendering of the details form.
|
||||
- Update rendering of the readonly multiselect widget to conform to Django's updated field class interface.
|
||||
- Add warning when using SQLite as the database backend.
|
||||
- Use Mailgun's flanker library to process the email sources.
|
||||
- Add locking for interval sources. This reduces the chance of repeated documents from long running email downloads.
|
||||
- Add the option to enable or disable parsing when uploading a document for each document type.
|
||||
- Add a new setting option to enable automatic parsing for each new document type created.
|
||||
- Add support for HTML bodies to the user mailers.
|
||||
- Production ALLOWED_HOSTS settings now defaults to a safer ['127.0.0.1', 'localhost', '[::1]']
|
||||
- Capture menu resolution errors on invalid URLs. Closes GitLab issue #420.
|
||||
- New environment variables: MAYAN_SECRET_KEY, MAYAN_CELERY_ALWAYS_EAGER, MAYAN_CELERY_RESULT_BACKEND,
|
||||
MAYAN_BROKER_URL, MAYAN_DATABASE_ENGINE, MAYAN_DATABASE_CONN_MAX_AGE, MAYAN_DATABASE_NAME,
|
||||
MAYAN_DATABASE_USER, MAYAN_DATABASE_PASSWORD, MAYAN_DATABASE_HOST, MAYAN_DATABASE_PORT,
|
||||
MAYAN_DEBUG.
|
||||
- Stricter defaults. CELERY_ALWAYS_EAGER to False, ALLOWED_HOSTS to ['127.0.0.1', 'localhost', '[::1]'].
|
||||
- New initialization command. Creates media/system and populates the SECRET_KEY and VERSION files.
|
||||
- Sane scanner source paper source now defaults to blank.
|
||||
- Merge Docker image creation back into the main repository.
|
||||
- Docker image now uses gunicorn and whitenoise instead of NGINX to server the app and
|
||||
the static media.
|
||||
- All installation artifact are now created and read from the media folder.
|
||||
- Debian is now the Linux distribution used for the Docker image.
|
||||
- Most Docker Celery workers are now execute using a lower OS priority number.
|
||||
- Add COMMON_PRODUCTION_ERROR_LOGGING setting to control the logging of errors in production. Defaults to False.
|
||||
- Change the error log file handle class to RotatingFileHandle to avoid an indefinitely growing log file.
|
||||
- Disable embedded signatute verification during the perform upgrade command.
|
||||
- Replace the DOCUMENTS_LANGUAGE_CHOICES setting option. Replaced with the new DOCUMENTS_LANGUAGE_CODES.
|
||||
- Fix error when trying to upload a document from and email account with 'from' and 'subject' metadata.
|
||||
- Fix typo on message.header get from 'Suject' to 'Subject'.
|
||||
- On multi part emails keep the original From and Subject properties for all subsequent parts if the sub parts don't specify them. Fixes issue #481. Thanks to Robert Schöftner @robert.schoeftner for the report and debug information.
|
||||
- Don't provide a default for the scanner source adf_mode. Some scanners throw an error even when the selection
|
||||
if supported.
|
||||
- Add a "Quick Download" action to reduce the number of steps to download a single document. GitLab issue #338.
|
||||
|
||||
2.7.3 (2017-09-11)
|
||||
==================
|
||||
- Fix task manager queue list view. Thanks to LeVon Smoker for
|
||||
the report.
|
||||
- Fix resolved link class URL mangling when the keep_query argument is
|
||||
used. Thanks to Nick Douma (LordGaav) for the report and diagnostic
|
||||
information. Fixes source navigation on the document upload wizard.
|
||||
- Add support for notifications. GitLab #262.
|
||||
- Add quota support. GitLab #284.
|
||||
|
||||
2.7.2 (2017-09-06)
|
||||
==================
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
include README.md LICENSE HISTORY.rst mayan/LICENSE
|
||||
recursive-include mayan/apps *.txt *.html *.css *.ico *.png *.jpg *.js *.po *.mo *.ttf *.woff *.woff2 *.gif *.eot *.svg *.doc *.pdf *.tiff *.sig *.asc *.gpg *.zip package.json
|
||||
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
|
||||
global-exclude mayan/settings/local.py mayan/settings/travis/* mayan/media/*
|
||||
|
||||
172
Makefile
172
Makefile
@@ -1,14 +1,12 @@
|
||||
.PHONY: clean-pyc clean-build
|
||||
|
||||
help: docker-help
|
||||
|
||||
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 "generate_setup - Create and updated setup.py"
|
||||
|
||||
@echo "test-all - Run all tests."
|
||||
@echo "test MODULE=<python module name> - Run tests for a single app, module or test class."
|
||||
@@ -19,35 +17,43 @@ help: docker-help
|
||||
@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 "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 "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 "requirements_dev - Install development requirements."
|
||||
@echo "requirements_docs - Install documentation requirements."
|
||||
@echo "requirements_testing - Install testing requirements."
|
||||
|
||||
@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 "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_test_via_docker_alpine - Package (sdist and wheel) and upload to the PyPI test server using an Alpine Docker builder."
|
||||
@echo "release_via_docker_ubuntu - Package (sdist and wheel) and upload to PyPI using an Ubuntu Docker builder."
|
||||
@echo "release_via_docker_alpine - Package (sdist and wheel) and upload to PyPI using an Alpine 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 "docker_services_on - Launch and initialize production-like services using Docker (Postgres and Redis)."
|
||||
@echo "docker_services_off - Stop and delete the Docker production-like services."
|
||||
@echo "docker_services_frontend - Launch a front end instance that uses the production-like services."
|
||||
@echo "docker_services_worker - Launch a worker instance that uses the production-like services."
|
||||
@echo "docker_service_mysql_on - Launch and initialize a MySQL Docker container."
|
||||
@echo "docker_service_mysql_off - Stop and delete the MySQL Docker container."
|
||||
@echo "docker_service_postgres_on - Launch and initialize a PostgreSQL Docker container."
|
||||
@echo "docker_service_postgres_off - Stop and delete the PostgreSQL Docker container."
|
||||
|
||||
@echo "safety_check - Run a package safety check."
|
||||
|
||||
@echo "safety-check - Run a package safety check."
|
||||
|
||||
# Cleaning
|
||||
|
||||
@@ -67,10 +73,10 @@ clean-pyc:
|
||||
# Testing
|
||||
|
||||
test:
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing.development --nomigrations
|
||||
./manage.py test $(MODULE) --settings=mayan.settings.testing --nomigrations
|
||||
|
||||
test-all:
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing.development --nomigrations
|
||||
./manage.py test --mayan-apps --settings=mayan.settings.testing --nomigrations
|
||||
|
||||
test-launch-postgres:
|
||||
@docker rm -f test-postgres || true
|
||||
@@ -130,7 +136,7 @@ test-with-oracle-all: test-launch-oracle
|
||||
|
||||
# Documentation
|
||||
|
||||
docs-serve:
|
||||
docs_serve:
|
||||
cd docs;make livehtml
|
||||
|
||||
|
||||
@@ -149,14 +155,25 @@ translations_pull:
|
||||
tx pull -f
|
||||
|
||||
|
||||
generate-setup:
|
||||
# Requirements
|
||||
|
||||
requirements_dev:
|
||||
pip install -r requirements/development.txt
|
||||
|
||||
requirements_docs:
|
||||
pip install -r requirements/documentation.txt
|
||||
|
||||
requirements_testing:
|
||||
pip install -r requirements/testing.txt
|
||||
|
||||
generate_setup:
|
||||
@./generate_setup.py
|
||||
@echo "Complete."
|
||||
|
||||
# Releases
|
||||
|
||||
|
||||
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"
|
||||
|
||||
@@ -171,7 +188,7 @@ wheel: clean sdist
|
||||
pip wheel --no-index --no-deps --wheel-dir dist dist/*.tar.gz
|
||||
ls -l dist
|
||||
|
||||
release-test-via-docker-ubuntu:
|
||||
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 && \
|
||||
@@ -182,9 +199,9 @@ release-test-via-docker-ubuntu:
|
||||
apt-get install make python-pip -y && \
|
||||
pip install -r requirements/build.txt && \
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make test-release"
|
||||
make test_release"
|
||||
|
||||
release-via-docker-ubuntu:
|
||||
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 "\
|
||||
echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
locale-gen en_US.UTF-8 && \
|
||||
@@ -197,7 +214,33 @@ release-via-docker-ubuntu:
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make release"
|
||||
|
||||
test-sdist-via-docker-ubuntu:
|
||||
release_test_via_docker_alpine:
|
||||
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source alpine /bin/busybox sh -c "\
|
||||
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 && \
|
||||
cp -r /host_source/* . && \
|
||||
apk update && \
|
||||
apk add python2 py2-pip make && \
|
||||
pip install -r requirements/build.txt && \
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make test_release"
|
||||
|
||||
release_via_docker_alpine:
|
||||
docker run --rm --name mayan_release -v $(HOME):/host_home:ro -v `pwd`:/host_source -w /source alpine /bin/busybox sh -c "\
|
||||
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 && \
|
||||
cp -r /host_source/* . && \
|
||||
apk update && \
|
||||
apk add python2 py2-pip make && \
|
||||
pip install -r requirements/build.txt && \
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make release"
|
||||
|
||||
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 && \
|
||||
@@ -207,10 +250,10 @@ test-sdist-via-docker-ubuntu:
|
||||
apt-get update && \
|
||||
apt-get install make python-pip libreoffice tesseract-ocr tesseract-ocr-deu poppler-utils -y && \
|
||||
pip install -r requirements/development.txt && \
|
||||
make sdist-test-suit \
|
||||
make sdist_test_suit \
|
||||
"
|
||||
|
||||
test-wheel-via-docker-ubuntu:
|
||||
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 && \
|
||||
@@ -220,10 +263,10 @@ test-wheel-via-docker-ubuntu:
|
||||
apt-get update && \
|
||||
apt-get install make python-pip libreoffice tesseract-ocr tesseract-ocr-deu poppler-utils -y && \
|
||||
pip install -r requirements/development.txt && \
|
||||
make wheel-test-suit \
|
||||
make wheel_test_suit \
|
||||
"
|
||||
|
||||
sdist-test-suit: sdist
|
||||
sdist_test_suit: sdist
|
||||
rm -f -R _virtualenv
|
||||
virtualenv _virtualenv
|
||||
sh -c '\
|
||||
@@ -234,7 +277,7 @@ sdist-test-suit: sdist
|
||||
_virtualenv/bin/mayan-edms.py test --mayan-apps \
|
||||
'
|
||||
|
||||
wheel-test-suit: wheel
|
||||
wheel_test_suit: wheel
|
||||
rm -f -R _virtualenv
|
||||
virtualenv _virtualenv
|
||||
sh -c '\
|
||||
@@ -248,79 +291,50 @@ wheel-test-suit: wheel
|
||||
# Dev server
|
||||
|
||||
runserver:
|
||||
./manage.py runserver --settings=mayan.settings.development $(ADDRPORT)
|
||||
./manage.py runserver --settings=mayan.settings.development
|
||||
|
||||
runserver_plus:
|
||||
./manage.py runserver_plus --settings=mayan.settings.development $(ADDRPORT)
|
||||
./manage.py runserver_plus --settings=mayan.settings.development
|
||||
|
||||
shell_plus:
|
||||
./manage.py shell_plus --settings=mayan.settings.development
|
||||
|
||||
test-with-docker-services-on:
|
||||
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
|
||||
while ! nc -z 127.0.0.1 5432; do sleep 1; done
|
||||
sleep 4
|
||||
sleep 2
|
||||
./manage.py initialsetup --settings=mayan.settings.staging.docker
|
||||
|
||||
test-with-docker-services-off:
|
||||
docker_services_off:
|
||||
docker stop postgres redis
|
||||
docker rm postgres redis
|
||||
|
||||
test-with-docker-frontend:
|
||||
docker_services_frontend:
|
||||
./manage.py runserver --settings=mayan.settings.staging.docker
|
||||
|
||||
test-with-docker-worker:
|
||||
docker_services_worker:
|
||||
./manage.py celery worker --settings=mayan.settings.staging.docker -B -l INFO -O fair
|
||||
|
||||
docker-mysql-on:
|
||||
docker_service_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:
|
||||
docker_service_mysql_off:
|
||||
docker stop mysql
|
||||
docker rm mysql
|
||||
|
||||
docker-postgres-on:
|
||||
docker_service_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:
|
||||
docker_service_postgres_off:
|
||||
docker stop postgres
|
||||
docker rm postgres
|
||||
|
||||
|
||||
# Security
|
||||
|
||||
safety-check:
|
||||
safety_check:
|
||||
safety check
|
||||
|
||||
|
||||
# Other
|
||||
find-gitignores:
|
||||
@export FIND_GITIGNORES=`find -name '.gitignore'| wc -l`; \
|
||||
if [ $${FIND_GITIGNORES} -gt 1 ] ;then echo "More than one .gitignore found."; fi
|
||||
|
||||
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-alpine3.7 /bin/busybox sh -c "\
|
||||
rm /host_source/dist -R || true && \
|
||||
mkdir /host_source/dist || true && \
|
||||
export LC_ALL=en_US.UTF-8 && \
|
||||
cp -r /host_source/* . && \
|
||||
apk update && \
|
||||
apk add make && \
|
||||
pip install -r requirements/build.txt && \
|
||||
cp -r /host_home/.pypirc ~/.pypirc && \
|
||||
make wheel && \
|
||||
cp dist/* /host_source/dist/"
|
||||
|
||||
check-readme:
|
||||
python setup.py check -r -s
|
||||
|
||||
check-missing-migrations:
|
||||
./manage.py makemigrations --dry-run --noinput --check
|
||||
|
||||
|
||||
include docker/Makefile
|
||||
|
||||
10
README.md
10
README.md
@@ -3,9 +3,6 @@
|
||||
[![coverage][cover]][cover-url]
|
||||
![python][python]
|
||||
![license][license]
|
||||
[](https://hub.docker.com/r/mayanedms/mayanedms/)
|
||||
[](https://hub.docker.com/r/mayanedms/mayanedms/)
|
||||
[](https://microbadger.com/images/mayanedms/mayanedms)
|
||||
|
||||
[pypi]: http://img.shields.io/pypi/v/mayan-edms.svg
|
||||
[pypi-url]: http://badge.fury.io/py/mayan-edms
|
||||
@@ -38,7 +35,7 @@
|
||||
<p>
|
||||
|
||||
<p align="center">
|
||||
<img width="400" src="https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/overview.gif">
|
||||
<img src="https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/overview.gif">
|
||||
</p>
|
||||
|
||||
</div>
|
||||
@@ -49,8 +46,9 @@ The easiest way to use Mayan EDMS is by using the official
|
||||
[Docker](https://www.docker.com/) image. Make sure Docker is properly installed
|
||||
and working before attempting to install Mayan EDMS.
|
||||
|
||||
For the complete set of installation instructions visit the Mayan EDMS documentation
|
||||
at: http://mayan.readthedocs.io/en/latest/topics/installation.html
|
||||
For the complete set of installation, configuration, upgrade, and backup
|
||||
instructions visit the Mayan EDMS Docker Hub page at:
|
||||
https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
|
||||
<h2 align="center">Hardware requirements</h2>
|
||||
|
||||
|
||||
16
README.rst
16
README.rst
@@ -1,4 +1,4 @@
|
||||
|pypi| |builds| |coverage| |python| |license| |docker_pulls| |docker_stars| |docker_layers|
|
||||
|pypi| |builds| |coverage| |python| |license|
|
||||
|
||||
|
||||
.. image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/mayan_logo.png
|
||||
@@ -14,14 +14,15 @@ are its workflow system, role based access control, and REST API.
|
||||
|
||||
.. image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/overview.gif
|
||||
:align: center
|
||||
:width: 300
|
||||
|
||||
|
||||
The easiest way to use Mayan EDMS is by using the official Docker_ image.
|
||||
Make sure Docker is properly installed and working before attempting to install
|
||||
Mayan EDMS.
|
||||
|
||||
For the complete set of installation instructions visit the Mayan EDMS documentation
|
||||
at: http://mayan.readthedocs.io/en/latest/topics/installation.html
|
||||
For the complete set of installation, configuration, upgrade, and backup
|
||||
instructions visit the Mayan EDMS Docker Hub page at:
|
||||
https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
|
||||
.. _Docker: https://www.docker.com/
|
||||
|
||||
@@ -46,6 +47,7 @@ Important links
|
||||
- `Translations <https://www.transifex.com/rosarior/mayan-edms/>`__
|
||||
|
||||
|
||||
|
||||
.. |pypi| image:: http://img.shields.io/pypi/v/mayan-edms.svg
|
||||
:target: http://badge.fury.io/py/mayan-edms
|
||||
.. |builds| image:: https://gitlab.com/mayan-edms/mayan-edms/badges/master/build.svg
|
||||
@@ -54,9 +56,3 @@ Important links
|
||||
:target: https://codecov.io/gitlab/mayan-edms/mayan-edms?branch=master
|
||||
.. |python| image:: https://img.shields.io/pypi/pyversions/mayan-edms.svg
|
||||
.. |license| image:: https://img.shields.io/pypi/l/mayan-edms.svg?style=flat
|
||||
.. |docker_pulls| image:: https://img.shields.io/docker/pulls/mayanedms/mayanedms.svg?maxAge=3600
|
||||
:target: https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
.. |docker_stars| image:: https://img.shields.io/docker/stars/mayanedms/mayanedms.svg?maxAge=3600
|
||||
:target: https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
.. |docker_layers| image:: https://images.microbadger.com/badges/image/mayanedms/mayanedms.svg
|
||||
:target: https://microbadger.com/images/mayanedms/mayanedms
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends tesseract-ocr-deu
|
||||
|
||||
pip install -r $DOCKER_ROOT/requirements-testing.txt
|
||||
|
||||
mayan-edms.py test --mayan-apps --settings=mayan.settings.testing
|
||||
@@ -10,9 +10,9 @@ APP_LIST = (
|
||||
'converter', 'django_gpg', 'document_comments', 'document_indexing',
|
||||
'document_parsing', 'document_signatures', 'document_states', 'documents',
|
||||
'dynamic_search', 'events', 'linking', 'lock_manager', 'mayan_statistics',
|
||||
'mailer', 'metadata', 'mirroring', 'motd', 'navigation', 'ocr', 'permissions',
|
||||
'rest_api', 'smart_settings', 'sources', 'storage', 'tags', 'task_manager',
|
||||
'user_management'
|
||||
'mailer', 'metadata', 'mirroring', 'motd', 'navigation', 'ocr',
|
||||
'permissions', 'rest_api', 'smart_settings', 'sources', 'storage', 'tags',
|
||||
'task_manager', 'user_management'
|
||||
)
|
||||
|
||||
LANGUAGE_LIST = (
|
||||
|
||||
@@ -1,103 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
|
||||
BASE_PATH = 'mayan/apps'
|
||||
|
||||
|
||||
def print_views_summary(module_filename):
|
||||
with open(module_filename) as file_object:
|
||||
print ' module:', module_filename
|
||||
count_class_based_views = 0
|
||||
count_function_based_views = 0
|
||||
for line in file_object:
|
||||
if line.startswith('class') and 'View' in line:
|
||||
count_class_based_views += 1
|
||||
|
||||
if line.startswith('def') and 'request' in line:
|
||||
count_function_based_views += 1
|
||||
|
||||
print ' class based views: {}'.format(count_class_based_views)
|
||||
print ' function based views: {}'.format(count_function_based_views)
|
||||
return count_class_based_views, count_function_based_views
|
||||
|
||||
|
||||
def print_tests_summary(module_filename):
|
||||
with open(module_filename) as file_object:
|
||||
print ' module:', module_filename
|
||||
count_tests = 0
|
||||
for line in file_object:
|
||||
if line.startswith(' def test'):
|
||||
count_tests += 1
|
||||
|
||||
print ' tests: {}'.format(count_tests)
|
||||
return count_tests
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
count_totals = {
|
||||
'Apps': 0,
|
||||
'Class based views': 0,
|
||||
'Function based views': 0,
|
||||
'Class based API views': 0,
|
||||
'Function based API views': 0,
|
||||
'Tests': 0,
|
||||
}
|
||||
|
||||
for app_name in sorted(os.listdir(BASE_PATH)):
|
||||
if app_name != '__init__.py':
|
||||
count_totals['Apps'] += 1
|
||||
print '\n\nApp name: {}'.format(app_name)
|
||||
app_path = os.path.join(BASE_PATH, app_name)
|
||||
|
||||
print '\n Views'
|
||||
try:
|
||||
module_filename = os.path.join(app_path, 'views.py')
|
||||
count_class_based_views, count_function_based_views = print_views_summary(module_filename=module_filename)
|
||||
count_totals['Class based views'] += count_class_based_views
|
||||
count_totals['Function based views'] += count_function_based_views
|
||||
|
||||
except IOError:
|
||||
# Check for multiple view files inside a view directory
|
||||
try:
|
||||
module_path = os.path.join(app_path, 'views')
|
||||
for module_name in os.listdir(module_path):
|
||||
if not module_name.startswith('__init__.py') and not module_name.endswith('.pyc'):
|
||||
module_filename = os.path.join(module_path, module_name)
|
||||
count_class_based_views, count_function_based_views = print_views_summary(module_filename=module_filename)
|
||||
count_totals['Class based views'] += count_class_based_views
|
||||
count_totals['Function based views'] += count_function_based_views
|
||||
except OSError:
|
||||
# No views directory, skip app
|
||||
print ' No views'
|
||||
|
||||
print '\n API Views'
|
||||
try:
|
||||
module_filename = os.path.join(app_path, 'api_views.py')
|
||||
count_class_based_views, count_function_based_views = print_views_summary(module_filename=module_filename)
|
||||
count_totals['Class based API views'] += count_class_based_views
|
||||
count_totals['Function based API views'] += count_function_based_views
|
||||
|
||||
except IOError:
|
||||
# No API views directory, skip app
|
||||
print ' No API views'
|
||||
|
||||
print '\n Tests'
|
||||
module_path = os.path.join(app_path, 'tests')
|
||||
try:
|
||||
for module_name in os.listdir(module_path):
|
||||
if not module_name.startswith('__init__.py') and not module_name.endswith('.pyc'):
|
||||
module_filename = os.path.join(module_path, module_name)
|
||||
if module_name.startswith('test'):
|
||||
count_tests = print_tests_summary(module_filename=module_filename)
|
||||
count_totals['Tests'] += count_tests
|
||||
|
||||
except OSError:
|
||||
# No tests directory, skip app
|
||||
print ' No tests'
|
||||
|
||||
print '-' * 10
|
||||
|
||||
print 'Totals:'
|
||||
for key, value in count_totals.items():
|
||||
print ' {}: {}'.format(key, value)
|
||||
@@ -3,7 +3,8 @@ from __future__ import absolute_import
|
||||
import ldap
|
||||
from django_auth_ldap.config import LDAPSearch
|
||||
|
||||
from .base import * # NOQA
|
||||
from .base import *
|
||||
from django.conf import settings
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
SECRET_KEY = '<your secret key>'
|
||||
@@ -26,24 +27,22 @@ AUTH_LDAP_BIND_DN = LDAP_ADMIN_DN
|
||||
AUTH_LDAP_BIND_PASSWORD = LDAP_PASSWORD
|
||||
|
||||
|
||||
AUTH_LDAP_USER_SEARCH = LDAPSearch(
|
||||
'%s,%s' % (LDAP_ADDITIONAL_USER_DN, LDAP_BASE_DN),
|
||||
ldap.SCOPE_SUBTREE, '(uid=%(user)s)'
|
||||
)
|
||||
AUTH_LDAP_USER_SEARCH = LDAPSearch('%s,%s'%(LDAP_ADDITIONAL_USER_DN, LDAP_BASE_DN), ldap.SCOPE_SUBTREE, "(uid=%(user)s)")
|
||||
AUTH_LDAP_USER_ATTR_MAP = {
|
||||
'first_name': 'cn',
|
||||
'last_name': 'sn',
|
||||
'email': 'mail'
|
||||
}
|
||||
AUTHENTICATION_BACKENDS = (
|
||||
'django_auth_ldap.backend.LDAPBackend',
|
||||
'mayan.settings.settings_local.EmailOrUsernameModelBackend',
|
||||
)
|
||||
"first_name": "cn",
|
||||
"last_name": "sn",
|
||||
"email": "mail"
|
||||
}
|
||||
|
||||
AUTHENTICATION_BACKENDS = (
|
||||
'django_auth_ldap.backend.LDAPBackend',
|
||||
'mayan.settings.settings_local.EmailOrUsernameModelBackend',
|
||||
)
|
||||
|
||||
class EmailOrUsernameModelBackend(object):
|
||||
"""
|
||||
This is a ModelBacked that allows authentication with either a username or an email address.
|
||||
|
||||
"""
|
||||
def authenticate(self, username=None, password=None):
|
||||
if '@' in username:
|
||||
@@ -54,7 +53,7 @@ class EmailOrUsernameModelBackend(object):
|
||||
user = get_user_model().objects.get(**kwargs)
|
||||
if user.check_password(password):
|
||||
return user
|
||||
except get_user_model().DoesNotExist:
|
||||
except User.DoesNotExist:
|
||||
return None
|
||||
|
||||
def get_user(self, username):
|
||||
|
||||
@@ -1,149 +0,0 @@
|
||||
# vim:set ft=dockerfile:
|
||||
|
||||
####################
|
||||
# Base image start #
|
||||
####################
|
||||
|
||||
FROM debian:9.4-slim as BASE_IMAGE
|
||||
|
||||
MAINTAINER Roberto Rosario "roberto.rosario@mayan-edms.com"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
ENV LC_ALL C.UTF-8
|
||||
ENV PROJECT_INSTALL_DIR=/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 \
|
||||
g++ \
|
||||
gcc \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
gnupg1 \
|
||||
graphviz \
|
||||
libffi-dev \
|
||||
libjpeg-dev \
|
||||
libmagic1 \
|
||||
default-libmysqlclient-dev \
|
||||
libpng-dev \
|
||||
libpq-dev \
|
||||
libreoffice \
|
||||
libtiff-dev \
|
||||
poppler-utils \
|
||||
python-dev \
|
||||
python-pip \
|
||||
python-setuptools \
|
||||
python-wheel \
|
||||
redis-server \
|
||||
sane-utils \
|
||||
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
|
||||
|
||||
# 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 (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 \
|
||||
apt-get install libssl-dev -y && \
|
||||
ln -s /usr/lib/arm-linux-gnueabihf/libz.so /usr/lib/ && \
|
||||
ln -s /usr/lib/arm-linux-gnueabihf/libjpeg.so /usr/lib/ \
|
||||
; fi
|
||||
|
||||
#####################
|
||||
# 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
|
||||
|
||||
WORKDIR /root/
|
||||
|
||||
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
|
||||
|
||||
# Install build Mayan EDMS
|
||||
RUN pip install *.whl && \
|
||||
rm *.whl
|
||||
|
||||
# Setup supervisor
|
||||
COPY docker/etc/supervisor/mayan.conf /etc/supervisor/conf.d
|
||||
|
||||
# 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"]
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["mayan"]
|
||||
|
||||
RUN rm /root/.cache -R
|
||||
RUN rm -rf /tmp/*
|
||||
|
||||
RUN apt-get -y autoremove --purge && apt-get -y autoclean && apt-get -y clean
|
||||
|
||||
RUN rm -rf /usr/share/man/*
|
||||
RUN rm -rf /usr/share/doc/*
|
||||
|
||||
RUN find /var/lib/apt -type f | xargs rm -f
|
||||
RUN find /var/cache -type f -exec rm -rf {} \;
|
||||
|
||||
RUN find /var/log -type f | while read f; do echo -ne '' > $f; done;
|
||||
@@ -1,150 +0,0 @@
|
||||
# vim:set ft=dockerfile:
|
||||
|
||||
####################
|
||||
# Base image start #
|
||||
####################
|
||||
|
||||
FROM ubuntu:16.04 as BASE_IMAGE
|
||||
|
||||
MAINTAINER Roberto Rosario "roberto.rosario@mayan-edms.com"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
ENV LANG en_US.UTF-8
|
||||
ENV PROJECT_INSTALL_DIR=/usr/local/lib/python2.7/dist-packages/mayan
|
||||
|
||||
ARG APT_PROXY
|
||||
# Package caching
|
||||
RUN if [ "${APT_PROXY}" ]; then echo "Acquire::http { Proxy \"http://${APT_PROXY}\"; };" > /etc/apt/apt.conf.d/01proxy; fi
|
||||
|
||||
# Install base Ubuntu libraries
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
curl \
|
||||
g++ \
|
||||
gcc \
|
||||
gettext-base \
|
||||
ghostscript \
|
||||
gpgv \
|
||||
graphviz \
|
||||
libffi-dev \
|
||||
libjpeg-dev \
|
||||
libmagic1 \
|
||||
libmysqlclient-dev \
|
||||
libpng-dev \
|
||||
libpq-dev \
|
||||
libreoffice \
|
||||
libtiff-dev \
|
||||
locales \
|
||||
netcat-openbsd \
|
||||
poppler-utils \
|
||||
python-dev \
|
||||
python-pip \
|
||||
python-setuptools \
|
||||
python-wheel \
|
||||
redis-server \
|
||||
supervisor \
|
||||
tesseract-ocr \
|
||||
zlib1g-dev \
|
||||
&& \
|
||||
apt-get clean autoclean && \
|
||||
apt-get autoremove --purge -y && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
rm -f /var/cache/apt/archives/*.deb
|
||||
|
||||
# Switch to UTF locale
|
||||
RUN echo "LC_ALL=\"en_US.UTF-8\"" >> /etc/default/locale && \
|
||||
locale-gen en_US.UTF-8 && \
|
||||
update-locale LANG=en_US.UTF-8 && \
|
||||
export LC_ALL=en_US.UTF-8
|
||||
|
||||
# Install apt-get-install
|
||||
ADD https://raw.githubusercontent.com/guilhem/apt-get-install/master/apt-get-install /usr/bin/
|
||||
RUN chmod +x /usr/bin/apt-get-install
|
||||
|
||||
# Install Python clients for PostgreSQL, REDIS, librabbitmq
|
||||
RUN pip install psycopg2==2.7.3.2 redis==2.10.6 mysql-python==1.2.5 librabbitmq==1.6.1
|
||||
|
||||
RUN adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
|
||||
|
||||
# Pillow can't find zlib or libjpeg on aarch64
|
||||
RUN if [ "$(uname -m)" = "aarch64" ]; then \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libz.so /usr/lib/ && \
|
||||
ln -s /usr/lib/aarch64-linux-gnu/libjpeg.so /usr/lib/ \
|
||||
; fi
|
||||
|
||||
#####################
|
||||
# Build image start #
|
||||
#####################
|
||||
|
||||
FROM python:2-alpine3.7 as BUILDER_IMAGE
|
||||
|
||||
WORKDIR /code
|
||||
|
||||
COPY . /code
|
||||
|
||||
RUN apk update && \
|
||||
apk add make
|
||||
|
||||
RUN pip install -r requirements/build.txt
|
||||
|
||||
RUN make wheel
|
||||
|
||||
RUN chmod 777 dist -R
|
||||
|
||||
#####################
|
||||
# Final image start #
|
||||
#####################
|
||||
|
||||
FROM BASE_IMAGE
|
||||
|
||||
WORKDIR /root/
|
||||
|
||||
COPY --from=BUILDER_IMAGE /code/dist/*.whl .
|
||||
|
||||
# Install build Mayan EDMS
|
||||
RUN pip install *.whl && \
|
||||
rm *.whl
|
||||
|
||||
# Setup supervisor
|
||||
#RUN mkdir /etc/supervisor.d/
|
||||
COPY docker/etc/supervisor/beat.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/gunicorn.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/redis.conf /etc/supervisor/conf.d
|
||||
COPY docker/etc/supervisor/workers.conf /etc/supervisor/conf.d
|
||||
|
||||
# Create the directory for the logs
|
||||
RUN mkdir /var/log/mayan
|
||||
|
||||
# Fix ownership
|
||||
RUN chown -R mayan:mayan $PROJECT_INSTALL_DIR
|
||||
|
||||
# Allow flanker to autogenerate its PLY files
|
||||
RUN chown -R mayan:mayan /usr/local/lib/python2.7/dist-packages/flanker/
|
||||
|
||||
RUN mkdir /var/lib/mayan
|
||||
VOLUME ["/var/lib/mayan"]
|
||||
|
||||
COPY docker/entrypoint.sh /usr/local/bin/
|
||||
RUN ln -s usr/local/bin/entrypoint.sh / # backwards compat
|
||||
ENTRYPOINT ["entrypoint.sh"]
|
||||
|
||||
# Healthcheck setup
|
||||
HEALTHCHECK --interval=15s --timeout=1s --retries=20 \
|
||||
CMD curl -s -f http://localhost/authentication/login/ | grep 'form' > /dev/null || exit 1
|
||||
|
||||
EXPOSE 8000
|
||||
CMD ["mayan"]
|
||||
|
||||
RUN rm /root/.cache -R
|
||||
RUN rm -rf /tmp/*
|
||||
|
||||
RUN apt-get -y autoremove --purge && apt-get -y autoclean && apt-get -y clean
|
||||
|
||||
RUN rm -rf /usr/share/man/*
|
||||
RUN rm -rf /usr/share/doc/*
|
||||
|
||||
RUN find /var/lib/apt -type f | xargs rm -f
|
||||
RUN find /var/cache -type f -exec rm -rf {} \;
|
||||
|
||||
RUN find /var/log -type f | while read f; do echo -ne '' > $f; done;
|
||||
@@ -1,33 +0,0 @@
|
||||
APT_PROXY ?= `/sbin/ip route|awk '/docker0/ { print $$9 }'`:3142
|
||||
IMAGE_VERSION ?= `cat docker/version`
|
||||
CONSOLE_COLUMNS ?= `echo $$(tput cols)`
|
||||
CONSOLE_LINES ?= `echo $$(tput lines)`
|
||||
|
||||
docker-help:
|
||||
@echo
|
||||
@echo "**** Docker makefile ****"
|
||||
@echo "docker-build - Build a new image locally."
|
||||
@echo "docker-build-with-proxy - Build a new image locally using an APT proxy."
|
||||
@echo "docker-test-container - Build and run a test container."
|
||||
@echo "docker-test-cleanup - Delete the test container and the test volume."
|
||||
@echo "docker-test-all - Build and executed the test suite in a test container."
|
||||
@echo "docker-shell - Launch a bash instance inside a running container. Pass the container name via DOCKER_CONTAINER."
|
||||
|
||||
docker-build:
|
||||
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile .
|
||||
|
||||
docker-build-with-proxy:
|
||||
docker build -t mayanedms/mayanedms:$(IMAGE_VERSION) -f docker/Dockerfile --build-arg APT_PROXY=$(APT_PROXY) .
|
||||
|
||||
docker-shell:
|
||||
docker exec -e TERM=$(TERM) -e "COLUMNS=$(CONSOLE_COLUMNS)" -e "LINES=$(CONSOLE_LINES)" -it $(DOCKER_CONTAINER) /bin/bash
|
||||
|
||||
docker-test-container: docker-build-with-proxy docker-test-cleanup
|
||||
docker run -d --name test-mayan-edms -p 80:8000 -v test-mayan_data:/var/lib/mayan mayanedms/mayanedms:$(DOCKER_VERSION)
|
||||
|
||||
docker-test-cleanup:
|
||||
@docker rm -f test-mayan-edms || true
|
||||
@docker volume rm test-mayan_data || true
|
||||
|
||||
docker-test-all: docker-build-with-proxy
|
||||
docker run --rm run-tests
|
||||
@@ -1 +0,0 @@
|
||||
Mayan EDMS is a free open source electronic document management system.
|
||||
549
docker/README.md
549
docker/README.md
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,72 +0,0 @@
|
||||
version: '2.1'
|
||||
|
||||
volumes:
|
||||
broker:
|
||||
driver: local
|
||||
app:
|
||||
driver: local
|
||||
db:
|
||||
driver: local
|
||||
results:
|
||||
driver: local
|
||||
|
||||
services:
|
||||
broker:
|
||||
container_name: mayan-edms-broker
|
||||
image: healthcheck/rabbitmq
|
||||
environment:
|
||||
RABBITMQ_DEFAULT_USER: mayan
|
||||
RABBITMQ_DEFAULT_PASS: mayan
|
||||
RABBITMQ_DEFAULT_VHOST: mayan
|
||||
volumes:
|
||||
- broker:/var/lib/rabbitmq
|
||||
results:
|
||||
container_name: mayan-edms-results
|
||||
image: healthcheck/redis
|
||||
volumes:
|
||||
- results:/data
|
||||
#db:
|
||||
# container_name: mayan-edms-db
|
||||
# image: healthcheck/mysql
|
||||
# environment:
|
||||
# MYSQL_DATABASE: mayan
|
||||
# MYSQL_PASSWORD: mayan-password
|
||||
# MYSQL_ROOT_PASSWORD: root-password
|
||||
# MYSQL_USER: mayan
|
||||
# volumes:
|
||||
# - db:/var/lib/mysql
|
||||
db:
|
||||
container_name: mayan-edms-db
|
||||
image: healthcheck/postgres
|
||||
environment:
|
||||
POSTGRES_DB: mayan
|
||||
POSTGRES_PASSWORD: mayan-password
|
||||
POSTGRES_USER: mayan
|
||||
volumes:
|
||||
- db:/var/lib/postgresql/data
|
||||
mayan-edms:
|
||||
container_name: mayan-edms-app
|
||||
image: mayan-edms/next
|
||||
build:
|
||||
context: ./
|
||||
args:
|
||||
- APT_PROXY=172.18.0.1:3142
|
||||
depends_on:
|
||||
broker:
|
||||
condition: service_healthy
|
||||
db:
|
||||
condition: service_healthy
|
||||
results:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
MAYAN_BROKER_URL: amqp://mayan:mayan@broker:5672/mayan
|
||||
MAYAN_CELERY_RESULT_BACKEND: redis://results:6379/0
|
||||
MAYAN_DATABASE_DRIVER: django.db.backends.postgres
|
||||
MAYAN_DATABASE_HOST: db
|
||||
MAYAN_DATABASE_NAME: mayan
|
||||
MAYAN_DATABASE_PASSWORD: mayan-password
|
||||
MAYAN_DATABASE_USER: mayan
|
||||
ports:
|
||||
- "80:80"
|
||||
volumes:
|
||||
- app:/var/lib/mayan
|
||||
@@ -1,58 +0,0 @@
|
||||
version: '2.1'
|
||||
|
||||
volumes:
|
||||
broker:
|
||||
driver: local
|
||||
app:
|
||||
driver: local
|
||||
db:
|
||||
driver: local
|
||||
results:
|
||||
driver: local
|
||||
|
||||
services:
|
||||
broker:
|
||||
container_name: mayan-edms-broker
|
||||
image: healthcheck/rabbitmq
|
||||
environment:
|
||||
RABBITMQ_DEFAULT_USER: mayan
|
||||
RABBITMQ_DEFAULT_PASS: mayan
|
||||
RABBITMQ_DEFAULT_VHOST: mayan
|
||||
volumes:
|
||||
- broker:/var/lib/rabbitmq
|
||||
results:
|
||||
container_name: mayan-edms-results
|
||||
image: healthcheck/redis
|
||||
volumes:
|
||||
- results:/data
|
||||
db:
|
||||
container_name: mayan-edms-db
|
||||
image: healthcheck/postgres
|
||||
environment:
|
||||
POSTGRES_DB: mayan
|
||||
POSTGRES_PASSWORD: mayan-password
|
||||
POSTGRES_USER: mayan
|
||||
volumes:
|
||||
- db:/var/lib/postgresql/data
|
||||
mayan-edms:
|
||||
container_name: mayan-edms-app
|
||||
image: mayanedms/mayanedms:latest
|
||||
depends_on:
|
||||
broker:
|
||||
condition: service_healthy
|
||||
db:
|
||||
condition: service_healthy
|
||||
results:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
MAYAN_BROKER_URL: amqp://mayan:mayan@broker:5672/mayan
|
||||
MAYAN_CELERY_RESULT_BACKEND: redis://results:6379/0
|
||||
MAYAN_DATABASE_DRIVER: django.db.backends.postgres
|
||||
MAYAN_DATABASE_HOST: db
|
||||
MAYAN_DATABASE_NAME: mayan
|
||||
MAYAN_DATABASE_PASSWORD: mayan-password
|
||||
MAYAN_DATABASE_USER: mayan
|
||||
ports:
|
||||
- "80:8000"
|
||||
volumes:
|
||||
- app:/var/lib/mayan
|
||||
@@ -1,86 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
echo "mayan: starting entrypoint.sh"
|
||||
INSTALL_FLAG=/var/lib/mayan/media/system/SECRET_KEY
|
||||
export DOCKER_ROOT=/root
|
||||
|
||||
export MAYAN_DEFAULT_BROKER_URL=redis://127.0.0.1:6379/0
|
||||
export MAYAN_DEFAULT_CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
|
||||
|
||||
export MAYAN_ALLOWED_HOSTS=*
|
||||
export MAYAN_BIN=/usr/local/lib/python2.7/dist-packages/mayan/bin/mayan-edms.py
|
||||
export MAYAN_BROKER_URL=${MAYAN_BROKER_URL:-${MAYAN_DEFAULT_BROKER_URL}}
|
||||
export MAYAN_CELERY_RESULT_BACKEND=${MAYAN_CELERY_RESULT_BACKEND:-${MAYAN_DEFAULT_CELERY_RESULT_BACKEND}}
|
||||
export MAYAN_GUNICORN_WORKERS=${MAYAN_GUNICORN_WORKERS:-2}
|
||||
export MAYAN_INSTALL_DIR=/usr/local/lib/python2.7/dist-packages/mayan
|
||||
export MAYAN_PYTHON_DIR=/usr/local/bin
|
||||
export MAYAN_MEDIA_ROOT=/var/lib/mayan
|
||||
export MAYAN_SETTINGS_MODULE=${MAYAN_SETTINGS_MODULE:-mayan.settings.production}
|
||||
|
||||
export CELERY_ALWAYS_EAGER=False
|
||||
export PYTHONPATH=$PYTHONPATH:$MAYAN_MEDIA_ROOT
|
||||
|
||||
chown mayan:mayan /var/lib/mayan -R
|
||||
|
||||
initialize() {
|
||||
echo "mayan: initialize()"
|
||||
su mayan -c "mayan-edms.py initialsetup --force"
|
||||
su mayan -c "mayan-edms.py collectstatic --noinput --clear"
|
||||
}
|
||||
|
||||
upgrade() {
|
||||
echo "mayan: upgrade()"
|
||||
su mayan -c "mayan-edms.py performupgrade"
|
||||
su mayan -c "mayan-edms.py collectstatic --noinput --clear"
|
||||
}
|
||||
|
||||
start() {
|
||||
echo "mayan: start()"
|
||||
rm -rf /var/run/supervisor.sock
|
||||
exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
|
||||
}
|
||||
|
||||
os_package_installs() {
|
||||
echo "mayan: os_package_installs()"
|
||||
if [ "${MAYAN_APT_INSTALLS}" ]; then
|
||||
apt-get-install $MAYAN_APT_INSTALLS
|
||||
fi
|
||||
}
|
||||
|
||||
pip_installs() {
|
||||
echo "mayan: pip_installs()"
|
||||
if [ "${MAYAN_PIP_INSTALLS}" ]; then
|
||||
pip install $MAYAN_PIP_INSTALLS
|
||||
fi
|
||||
}
|
||||
|
||||
os_package_installs || true
|
||||
pip_installs || true
|
||||
|
||||
case "$1" in
|
||||
|
||||
mayan) # Check if this is a new install, otherwise try to upgrade the existing
|
||||
# installation on subsequent starts
|
||||
if [ ! -f $INSTALL_FLAG ]; then
|
||||
initialize
|
||||
else
|
||||
upgrade
|
||||
fi
|
||||
start
|
||||
;;
|
||||
|
||||
run-tests) # Check if this is a new install, otherwise try to upgrade the existing
|
||||
# installation on subsequent starts
|
||||
if [ ! -f $INSTALL_FLAG ]; then
|
||||
initialize
|
||||
else
|
||||
upgrade
|
||||
fi
|
||||
$DOCKER_ROOT/run-tests.sh
|
||||
;;
|
||||
|
||||
*) su mayan -c "$@";
|
||||
;;
|
||||
|
||||
esac
|
||||
@@ -1,80 +0,0 @@
|
||||
[program:mayan-gunicorn]
|
||||
autorestart = false
|
||||
autostart = true
|
||||
command = /bin/bash -c "cd ${MAYAN_PYTHON_DIR}; gunicorn -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}"
|
||||
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 "cd ${MAYAN_PYTHON_DIR}; python ${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q converter -n mayan-worker-fast.%%h --concurrency=1"
|
||||
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 "cd ${MAYAN_PYTHON_DIR}; python ${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 --concurrency=1"
|
||||
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 "cd ${MAYAN_PYTHON_DIR}; python ${MAYAN_BIN} celery --settings=${MAYAN_SETTINGS_MODULE} worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1"
|
||||
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 "cd ${MAYAN_PYTHON_DIR}; python ${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
|
||||
@@ -1,30 +0,0 @@
|
||||
version: '3.1'
|
||||
|
||||
volumes:
|
||||
app:
|
||||
driver: local
|
||||
db:
|
||||
driver: local
|
||||
|
||||
services:
|
||||
|
||||
db:
|
||||
image: postgres
|
||||
environment:
|
||||
POSTGRES_DB: mayan
|
||||
POSTGRES_PASSWORD: mayan-password
|
||||
POSTGRES_USER: mayan
|
||||
|
||||
app:
|
||||
image: mayanedms/mayanedms:latest
|
||||
ports:
|
||||
- 80:8000
|
||||
environment:
|
||||
MAYAN_DATABASE_ENGINE: django.db.backends.postgresql
|
||||
MAYAN_DATABASE_HOST: db
|
||||
MAYAN_DATABASE_NAME: mayan
|
||||
MAYAN_DATABASE_PASSWORD: mayan-password
|
||||
MAYAN_DATABASE_USER: mayan
|
||||
volumes:
|
||||
- app:/var/lib/mayan
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
3.0rc1
|
||||
BIN
docs/_static/overview.gif
vendored
BIN
docs/_static/overview.gif
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 6.6 MiB After Width: | Height: | Size: 628 KiB |
31
docs/conf.py
31
docs/conf.py
@@ -33,7 +33,7 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext"))
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
#extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode']
|
||||
#extensions = ["djangodocs", "sphinx.ext.intersphinx"]
|
||||
extensions = ['sphinxcontrib.blockdiag']
|
||||
extensions = ['djangodocs', 'sphinxcontrib.blockdiag']
|
||||
|
||||
blockdiag_antialias = True
|
||||
blockdiag_html_image_format = "SVG"
|
||||
@@ -53,7 +53,7 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = mayan.__title__
|
||||
copyright = mayan.__copyright_short__
|
||||
copyright = mayan.__copyright__
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
@@ -179,9 +179,6 @@ html_static_path = ['_static']
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'MayanEDMSdoc'
|
||||
|
||||
html_show_sourcelink = False
|
||||
|
||||
html_show_sphinx = False
|
||||
|
||||
# -- Options for LaTeX output --------------------------------------------------
|
||||
|
||||
@@ -227,8 +224,28 @@ latex_documents = [
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
('index', 'mayanedms', '{} Documentation'.format(mayan.__title__),
|
||||
('index', 'mayanedms', 'Mayan EDMS Documentation',
|
||||
[mayan.__author__], 1)
|
||||
]
|
||||
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
|
||||
# -- Custom options
|
||||
import alabaster
|
||||
|
||||
html_theme_path = [alabaster.get_path()]
|
||||
extensions.append('alabaster')
|
||||
html_theme = 'alabaster'
|
||||
html_sidebars = {
|
||||
'**': [
|
||||
'about.html', 'donate.html', 'navigation.html', 'searchbox.html',
|
||||
]
|
||||
}
|
||||
html_theme_options = {
|
||||
'description': mayan.__description__,
|
||||
'github_button': False,
|
||||
'travis_button': False,
|
||||
'gratipay_user': 'rosarior',
|
||||
'github_banner': False,
|
||||
}
|
||||
|
||||
html_logo = '_static/logo_pyramid_only.png'
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
Welcome to Mayan EDMS!
|
||||
======================
|
||||
|
||||
.. image:: /_static/mayan_logo.png
|
||||
:alt: Logo is a trademark of Roberto Rosario
|
||||
:align: center
|
||||
|
||||
|
||||
Mayan EDMS is a `Free Open Source`_ `Electronic Document Management System`_,
|
||||
coded in the Python language using the Django_ web application framework and
|
||||
released under the `Apache 2.0 License`_. It provides an electronic vault or
|
||||
@@ -19,43 +14,17 @@ repository for electronic documents.
|
||||
|
||||
Installation <topics/installation>
|
||||
Features <topics/features>
|
||||
Release notes and upgrading <releases/index>
|
||||
|
||||
ACLs <topics/acls>
|
||||
Backups <topics/backups>
|
||||
Checkouts <topics/checkouts>
|
||||
Document types <topics/document_types>
|
||||
File storage <topics/file_storage>
|
||||
Document indexes <topics/indexes>
|
||||
Document languages <topics/languages>
|
||||
Document signatures <topics/signatures>
|
||||
Mailing <topics/mailing>
|
||||
Metadata <topics/metadata>
|
||||
OCR <topics/ocr_backend>
|
||||
Permissions <topics/permissions>
|
||||
Settings <topics/settings>
|
||||
Sources <topics/sources>
|
||||
Smart links <topics/smart_links>
|
||||
Tags <topics/tags>
|
||||
Transformations <topics/transformations>
|
||||
Upload wizard <topics/upload_wizard>
|
||||
Versioning <topics/versioning>
|
||||
|
||||
Docker image <topics/docker>
|
||||
Advanced deployment <topics/deploying>
|
||||
|
||||
Release notes and upgrading <releases/index>
|
||||
Concepts <topics/index>
|
||||
Development <topics/development>
|
||||
App creation <topics/app_creation>
|
||||
Pending work <topics/pending_work>
|
||||
Code statistics <topics/code_statistics>
|
||||
Roadmap <topics/roadmap>
|
||||
Translations <topics/translations>
|
||||
Contributors <topics/contributors>
|
||||
Licensing <topics/license>
|
||||
FAQ <topics/faq>
|
||||
Contact <topics/contact>
|
||||
MERCs <mercs/index>
|
||||
Pending work <topics/pending_work>
|
||||
Individual Contributor Assignment Agreement <topics/caa_individual>
|
||||
Entity Contributor Assignment Agreement <topics/caa_entity>
|
||||
|
||||
.. _Docker: https://www.docker.com/
|
||||
.. _Django: http://www.djangoproject.com/
|
||||
|
||||
@@ -1,211 +0,0 @@
|
||||
==============================
|
||||
MERC 1: Purpose and Guidelines
|
||||
==============================
|
||||
|
||||
:MERC: 1
|
||||
:Author: Michael Price
|
||||
:Status: Accepted
|
||||
:Type: Process
|
||||
:Created: 2018-02-17
|
||||
:Last-Modified: 2018-02-17
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
What is a MERC?
|
||||
===============
|
||||
|
||||
A Mayan EDMS Request For Comment document or MERC document is a design
|
||||
document providing information to the Mayan EDMS community, or
|
||||
describing a new feature or process for Mayan EDMS. MERCs provide
|
||||
concise technical specifications of features, along with rationales.
|
||||
|
||||
MERC Types
|
||||
==========
|
||||
|
||||
There are three kinds of MERCs:
|
||||
|
||||
1. A **Feature** MERC describes a new feature or implementation
|
||||
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.
|
||||
|
||||
3. A **Process** MERC describes a process surrounding Mayan EDMS, or
|
||||
proposes a change to (or an event in) a process. Process MERCs are
|
||||
like Feature MERCs but apply to areas other than the Mayan EDMS
|
||||
framework itself. They may propose an implementation, but not to
|
||||
Mayan EDMS's codebase; they often require community consensus; unlike
|
||||
Informational MERCs, they are more than recommendations, and users
|
||||
are typically not free to ignore them. Examples include
|
||||
procedures, guidelines, changes to the decision-making process, and
|
||||
changes to the tools or environment used in Mayan EDMS development.
|
||||
Any meta-MERC is also considered a Process MERC. (So this document
|
||||
is a Process MERC).
|
||||
|
||||
MERC submission workflow
|
||||
========================
|
||||
|
||||
Pre-proposal
|
||||
------------
|
||||
|
||||
The MERC process begins with a new idea for Mayan EDMS. It is highly recommended
|
||||
that a single MERC contain a single key proposal or new idea. Small enhancements
|
||||
or patches usually don't need a MERC and follow Mayan EDMS's normal contribution
|
||||
process.
|
||||
|
||||
MERCs should be focused on a single topic. If in doubt, split your MERC
|
||||
into several well-focused ones.
|
||||
|
||||
Once the idea's been vetted, a draft MERC should be presented to the
|
||||
Mayan EDMS mailing list. This gives the author a chance to flesh out the
|
||||
draft MERC to make sure it's properly formatted, of high quality, and to address
|
||||
initial concerns about the proposal.
|
||||
|
||||
The Core Developers will be responsible for accepting or rejecting the MERC proposal.
|
||||
|
||||
|
||||
Submitting the draft
|
||||
--------------------
|
||||
|
||||
Following the discussion on Mayan EDMS mailing list, the proposal
|
||||
should be sent as a merge request to the Mayan EDMS repository. The draft must
|
||||
be written in MERC style; if it isn't the merge request may be rejected until proper
|
||||
formatting rules are followed.
|
||||
|
||||
|
||||
Implementation
|
||||
--------------
|
||||
|
||||
Finally, once a MERC has been accepted, the implementation must be completed. In
|
||||
many cases some (or all) implementation will actually happen during the MERC
|
||||
process: Feature MERCs will often have fairly complete implementations before
|
||||
being reviewed. When the implementation is complete and incorporated
|
||||
into the main source code repository, the status will be changed to
|
||||
"Final".
|
||||
|
||||
MERC format
|
||||
===========
|
||||
|
||||
MERCs need to follow a common format and outline; this section describes
|
||||
that format.
|
||||
|
||||
MERCs must be written in `reStructuredText <http://docutils.sourceforge.net/rst.html>`_
|
||||
(the same format as Mayan EDMS's documentation).
|
||||
|
||||
Each MERC should have the following parts:
|
||||
|
||||
#. A short descriptive title (e.g. "User document filters"), which is also reflected
|
||||
in the MERC's filename (e.g. ``0002-user-document-filters.rst``).
|
||||
|
||||
#. A preamble -- a rST `field list <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#field-lists>`_
|
||||
containing metadata about the MERC, including the MERC number and so forth. See
|
||||
`MERC Metadata`_ below for specific details.
|
||||
|
||||
#. Abstract -- a short (~200 word) description of the technical issue
|
||||
being addressed.
|
||||
|
||||
#. Specification -- The technical specification should describe the syntax and
|
||||
semantics of any new feature. The specification should be detailed enough to
|
||||
allow implementation -- that is, developers other than the author should
|
||||
(given the right experience) be able to independently implement the feature,
|
||||
given only the MERC.
|
||||
|
||||
#. Motivation -- The motivation is critical for MERCs that want to add
|
||||
substantial new features or materially refactor existing ones. It should
|
||||
clearly explain why the existing solutions are inadequate to address the
|
||||
problem that the MERC solves. MERC submissions without sufficient motivation
|
||||
may be rejected outright.
|
||||
|
||||
#. Rationale -- The rationale fleshes out the specification by describing what
|
||||
motivated the design and why particular design decisions were made. It
|
||||
should describe alternate designs that were considered and related work.
|
||||
|
||||
The rationale should provide evidence of consensus within the community and
|
||||
discuss important objections or concerns raised during discussion.
|
||||
|
||||
#. Backwards Compatibility -- All MERCs that introduce backwards
|
||||
incompatibilities must include a section describing these incompatibilities
|
||||
and their severity. The MERC must explain how the author proposes to deal
|
||||
with these incompatibilities. MERC submissions without a sufficient backwards
|
||||
compatibility treatise may be rejected outright.
|
||||
|
||||
#. Reference Implementation -- The reference implementation must be completed
|
||||
before any MERC is given status "Final", but it need not be completed before
|
||||
the MERC is accepted. While there is merit to the approach of reaching
|
||||
consensus on the specification and rationale before writing code, the
|
||||
principle of "rough consensus and running code" is still useful when it comes
|
||||
to resolving many discussions of API details.
|
||||
|
||||
The final implementation must include tests and documentation, per Mayan EDMS
|
||||
development guide.
|
||||
|
||||
|
||||
MERC Metadata
|
||||
-------------
|
||||
|
||||
Each MERC must begin with some metadata given as an rST
|
||||
`field list <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#field-lists>`_.
|
||||
The headers must contain the following fields:
|
||||
|
||||
``MERC``
|
||||
The MERC number. In an initial merge request, this can be left out or given
|
||||
as ``XXXX``; the reviewer who merges the pull request will assign the MERC
|
||||
number.
|
||||
``Type``
|
||||
``Feature``, ``Informational``, or ``Process``
|
||||
``Status``
|
||||
``Draft``, ``Accepted``, ``Rejected``, ``Withdrawn``, ``Final``, or ``Superseded``
|
||||
``Created``
|
||||
Original creation date of the MERC (in ``yyyy-mm-dd`` format)
|
||||
``Last-Modified``
|
||||
Date the MERC was last modified (in ``yyyy-mm-dd`` format)
|
||||
``Author``
|
||||
The MERC's author(s).
|
||||
``Implementation-Team``
|
||||
The person/people who have committed to implementing this MERC
|
||||
``Requires``
|
||||
If this MERC depends on another MERC being implemented first,
|
||||
this should be a link to the required MERC.
|
||||
``Mayan EDMS-Version`` (optional)
|
||||
For Feature MERCs, the version of Mayan EDMS (e.g. ``2.7.3``) that this
|
||||
feature will be released in.
|
||||
``Replaces`` and ``Superseded-By`` (optional)
|
||||
These fields indicate that a MERC has been rendered obsolete. The newer MERC
|
||||
must have a ``Replaces`` header containing the number of the MERC that it
|
||||
rendered obsolete; the older MERC has a ``Superseded-By`` header pointing to
|
||||
the newer MERC.
|
||||
``Resolution`` (optional)
|
||||
For MERCs that have been decided upon, this can be a link to the final
|
||||
rationale for acceptance/rejection. It's also reasonable to simply update
|
||||
the MERC with a "Resolution" section, in which case this header can be left
|
||||
out.
|
||||
|
||||
Auxiliary Files
|
||||
---------------
|
||||
|
||||
MERCs may include auxiliary files such as diagrams. Such files must be named
|
||||
``XXXX-descriptive-title.ext``, where "XXXX" is the MERC number,
|
||||
"descriptive-title" is a short slug indicating what the file contains, and
|
||||
"ext" is replaced by the actual file extension (e.g. "png").
|
||||
|
||||
Reporting MERC Bugs, or Submitting MERC Updates
|
||||
===============================================
|
||||
|
||||
How you report a bug, or submit a MERC update depends on several factors, such as
|
||||
the maturity of the MERC, the preferences of the MERC author, and the nature of
|
||||
your comments. For the early draft stages of the MERC, it's probably best to
|
||||
send your comments and changes directly to the MERC author. For more mature, or
|
||||
finished MERCs you can submit corrections as repository issues or merge requests
|
||||
against the git repository.
|
||||
|
||||
When in doubt about where to send your changes, please check first with the MERC
|
||||
author and/or a core developer.
|
||||
|
||||
MERC authors with git push privileges for the MERC repository can update the MERCs
|
||||
themselves.
|
||||
@@ -1,82 +0,0 @@
|
||||
=====================
|
||||
MERC 2: Test writing
|
||||
=====================
|
||||
|
||||
:MERC: 2
|
||||
:Author: Michael Price
|
||||
:Status: Accepted
|
||||
:Type: Feature
|
||||
:Created: 2018-02-22
|
||||
:Last-Modified: 2018-04-01
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes a standard methodology for writing tests for Mayan EDMS.
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
Having a standard methodology for writing tests has the following advantages:
|
||||
|
||||
1. Scaffolding can be reduced by providing the most frequently used
|
||||
paradigms as methods or helper functions.
|
||||
2. Reduce the probabilities of errors slipping through poorly written tests.
|
||||
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
1. Tests must test each view in at least two ways:
|
||||
|
||||
A. Object creations views must be tested with and without permissions.
|
||||
B. Object detail, list and delete views must be tested with and without
|
||||
object access.
|
||||
|
||||
2. Tests must assert the status code of the response even
|
||||
when the expected status is HTTP 200.
|
||||
3. The actual request performed must be enclosed in a private methods
|
||||
so that the fail and pass tests use the same HTTP request.
|
||||
4. Test must verify that changes happened and didn't happened in the
|
||||
database regardless of the return code. Even is an edit view returns
|
||||
and error 4XX (404-Not found, 403-Forbidden, etc), the test must
|
||||
ensure that the data was not indeed modified.
|
||||
5. All tests must use the test user created by the BaseAPITestCase and not
|
||||
an super user unless absolutely required by the test.
|
||||
6. Each test must test just one thing.
|
||||
7. If a test object needs to be created before the execution of a request
|
||||
this object must be created by a private method.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def _request_tag_create(self):
|
||||
return self.post(
|
||||
viewname='rest_api:tag-list', data={
|
||||
'label': TEST_TAG_LABEL, 'color': TEST_TAG_COLOR
|
||||
}
|
||||
)
|
||||
|
||||
def test_tag_create_view_no_permission(self):
|
||||
response = self._request_tag_create()
|
||||
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
||||
self.assertEqual(Tag.objects.count(), 0)
|
||||
|
||||
def test_tag_create_view_with_permission(self):
|
||||
self.grant_permission(permission=permission_tag_create)
|
||||
response = self._request_tag_create()
|
||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||
|
||||
tag = Tag.objects.first()
|
||||
self.assertEqual(response.data['id'], tag.pk)
|
||||
self.assertEqual(response.data['label'], TEST_TAG_LABEL)
|
||||
self.assertEqual(response.data['color'], TEST_TAG_COLOR)
|
||||
|
||||
self.assertEqual(Tag.objects.count(), 1)
|
||||
self.assertEqual(tag.label, TEST_TAG_LABEL)
|
||||
self.assertEqual(tag.color, TEST_TAG_COLOR)
|
||||
@@ -1,74 +0,0 @@
|
||||
==================================
|
||||
MERC 3: Using javascript libraries
|
||||
==================================
|
||||
|
||||
:MERC: 3
|
||||
:Author: Eric Riggs
|
||||
:Status: Accepted
|
||||
:Type: Feature
|
||||
:Created: 2018-03-08
|
||||
:Last-Modified: 2018-06-04
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes a standard way to use javascript libraries.
|
||||
|
||||
Rationale
|
||||
=========
|
||||
|
||||
Mayan EDMS uses several javascript libraries for user interface features.
|
||||
Currently, the libraries are not installed using any javascript package
|
||||
manager but copied uncompressed. Installing the libraries in this manner
|
||||
carries some disadvantages.
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
The inclusion of the libraries in source form is required by many licenses
|
||||
if the library is not installed by a package manager in distributable form.
|
||||
There are several disavantages with the current approach:
|
||||
|
||||
1. Having the library in source form means that the entire weight of the
|
||||
library's size carries over the overall size of the Mayan EDMS distribution files.
|
||||
The justification for not doing this is the same as with the Python libraries
|
||||
which are not copied with the code but downloaded upon installation.
|
||||
2. Upgrading the libraries means manually examining the version of the
|
||||
installed in the project and manually searching, downloading, compressing
|
||||
and adding the files to the repository.
|
||||
3. The source form of the libraries includes normal and minified versions
|
||||
of the code and the accompaning CSS files. There is no define preference
|
||||
and through the project both versions of the libraries are loaded
|
||||
interchangeably. Using a packager manager the minified version would be
|
||||
used of a pipeline to minify the installed libraries should be added.
|
||||
|
||||
Backwards Compatibility
|
||||
=======================
|
||||
|
||||
There are no backwards compatibility issues with this proposal.
|
||||
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
Changes needed:
|
||||
|
||||
1. Python based javascript package manager. Alternatively a Python wrapper
|
||||
for a javascript package manager could be used.
|
||||
2. Package manifest for the javascript libraries used.
|
||||
3. Installation pipeline to install the javascript libraries during the
|
||||
installation and setup of the project.
|
||||
|
||||
References:
|
||||
|
||||
- https://github.com/JDeuce/powser
|
||||
- https://github.com/javrasya/version-manager
|
||||
- https://github.com/inveniosoftware-attic/setuptools-bower
|
||||
- https://pypi.python.org/pypi/django-bower-cache/0.5.0
|
||||
- http://django-pipeline.readthedocs.io/en/latest/index.html
|
||||
- https://github.com/nvbn/django-bower
|
||||
@@ -1,51 +0,0 @@
|
||||
=====
|
||||
MECRs
|
||||
=====
|
||||
|
||||
Mayan EDMS Request For Comment documents index.
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 2
|
||||
:local:
|
||||
|
||||
Status
|
||||
======
|
||||
|
||||
Accepted
|
||||
--------
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
0001-merc-process
|
||||
0002-test-writing
|
||||
0003-using-javascript-libraries
|
||||
|
||||
Draft
|
||||
-----
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
merging-roles-and-groups
|
||||
support-forum
|
||||
|
||||
|
||||
Type
|
||||
====
|
||||
|
||||
Process
|
||||
-------
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
0001-merc-process
|
||||
|
||||
|
||||
Feature
|
||||
-------
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
0002-test-writing
|
||||
0003-using-javascript-libraries
|
||||
@@ -1,67 +0,0 @@
|
||||
===============================
|
||||
MERC XX: Unify Roles and Groups
|
||||
===============================
|
||||
|
||||
:MERC: XX
|
||||
:Author: Michael Price
|
||||
:Status: Draft
|
||||
:Type: Feature
|
||||
:Created: 2018-02-27
|
||||
:Last-Modified: 2018-02-27
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes the merging of the Roles and Group models.
|
||||
|
||||
Rationale
|
||||
=========
|
||||
|
||||
Mayan EDMS uses Groups as units of users that are meant to mirror an
|
||||
organization's actual user hierarchy. Roles are used as permission units.
|
||||
|
||||
Separation of concerns is a concept Mayan EDMS executes very successfully
|
||||
but when it comes to the Roles/Groups relationship that execution causes
|
||||
overheads without providing advantages in the day to day operations.
|
||||
|
||||
In reality there is almost a 1 to 1 correlation between Roles and Groups.
|
||||
Other permissions systems already use Groups as permission units without
|
||||
disavantages. An example of this is LDAP and its commercial counterpart
|
||||
Active Directory.
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
Merging the Role and Group model will reduce some complexity when initially
|
||||
setting up Mayan EDMS. The merge allows removing a Mayan EDMS model in
|
||||
favor of using a native Django model for the same task.
|
||||
|
||||
Merging the Role and Group models will also provide a speed boost in every
|
||||
permission check and queryset filtering. These checks are nested in nature.
|
||||
Since the access checks are performed for every view and for every link
|
||||
in the view the performace gain should be substantial.
|
||||
|
||||
Backwards Compatibility
|
||||
=======================
|
||||
|
||||
To avoid loss of role configuration a data migration will be needed to
|
||||
convert existing roles to groups.
|
||||
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
Changes needed:
|
||||
|
||||
1. Data migration to convert existing roles to groups.
|
||||
2. Prepend or append an identifier to the migrated roles.
|
||||
3. Intermediate model to map permissions to a group. This will substitute
|
||||
the Role model's permissions many to many field.
|
||||
4. Update the ``AccessControlList`` models roles field to point to the group
|
||||
models.
|
||||
5. Update the role checks in the ``check_access`` and ``filter_by_access``
|
||||
``AccessControlList`` model manager methods.
|
||||
@@ -1,48 +0,0 @@
|
||||
======================
|
||||
MERC XX: Support forum
|
||||
======================
|
||||
|
||||
:MERC: XX
|
||||
:Author: Michael Price
|
||||
:Status: Draft
|
||||
:Type: Process
|
||||
:Created: 2018-02-27
|
||||
:Last-Modified: 2018-02-27
|
||||
|
||||
.. contents:: Table of Contents
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
This MERC proposes the move of the official community meeting place
|
||||
from Google Group to a self hosted forum platform.
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
Google Groups is not a proper forum platform and as such is lacking many
|
||||
features that would increase participation. Google Groups has not had any
|
||||
significant update in years and the age of the platform is visible. There
|
||||
are no official mobile apps for Google Groups, no responsible template
|
||||
is not provided. There are not integration options. These factors
|
||||
contribute to the problems of knowledge dilution and one time
|
||||
participation being experienced in the Mayan EDMS community.
|
||||
|
||||
Other concerns for moving the community to a self hosted forum solution
|
||||
are that Google Groups presents a single point of failure by relying on
|
||||
a free product hosted by a commercial company with no continuation plan
|
||||
for the product. Google Groups doesn't provide archiving features and
|
||||
the current archive solution relies on other third party services, one
|
||||
of which (GMANE) has stopped working. Recent user privacy and censorship
|
||||
issues regarding Google, reinforce the need for a self hosted solution.
|
||||
|
||||
|
||||
Specification
|
||||
=============
|
||||
|
||||
The proposed solution is to use the bbPress (https://wordpress.org/plugins/bbpress/)
|
||||
forum plugin for Wordpress. After 14 years, Wordpress dominance continues
|
||||
unrivaled. The wealth of material, themes, templates and professional avaialbe make
|
||||
it a safe option.
|
||||
@@ -63,6 +63,8 @@ Backward incompatible changes
|
||||
Bugs fixed or issues closed
|
||||
===========================
|
||||
|
||||
* None
|
||||
=======
|
||||
* `GitLab issue #378 <https://gitlab.com/mayan-edms/mayan-edms/issues/378>`_ Add metadata widget changes from @Macrobb
|
||||
* `GitLab issue #379 <https://gitlab.com/mayan-edms/mayan-edms/issues/379>`_ Add new document version list view permission.
|
||||
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
===============================
|
||||
Mayan EDMS v2.7.3 release notes
|
||||
===============================
|
||||
|
||||
Released: September 11, 2017
|
||||
|
||||
What's new
|
||||
==========
|
||||
|
||||
- Fix task manager queue list view. Thanks to LeVon Smoker for
|
||||
the report.
|
||||
- Fix resolved link class URL mangling when the keep_query argument is
|
||||
used. Fixes source navigation on the document upload wizard. Thanks to
|
||||
Nick Douma (LordGaav) for the report and diagnostic information. GitLab
|
||||
issue #436.
|
||||
|
||||
Removals
|
||||
--------
|
||||
* None
|
||||
|
||||
Upgrading from a previous version
|
||||
---------------------------------
|
||||
|
||||
Using PIP
|
||||
~~~~~~~~~
|
||||
|
||||
Type in the console::
|
||||
|
||||
$ pip install -U mayan-edms
|
||||
|
||||
the requirements will also be updated automatically.
|
||||
|
||||
Using Git
|
||||
~~~~~~~~~
|
||||
|
||||
If you installed Mayan EDMS by cloning the Git repository issue the commands::
|
||||
|
||||
$ git reset --hard HEAD
|
||||
$ git pull
|
||||
|
||||
otherwise download the compressed archived and uncompress it overriding the
|
||||
existing installation.
|
||||
|
||||
Next upgrade/add the new requirements::
|
||||
|
||||
$ pip install --upgrade -r requirements.txt
|
||||
|
||||
Common steps
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Migrate existing database schema with::
|
||||
|
||||
$ mayan-edms.py performupgrade
|
||||
|
||||
Add new static media::
|
||||
|
||||
$ mayan-edms.py collectstatic --noinput
|
||||
|
||||
The upgrade procedure is now complete.
|
||||
|
||||
|
||||
Backward incompatible changes
|
||||
=============================
|
||||
|
||||
* None
|
||||
|
||||
Bugs fixed or issues closed
|
||||
===========================
|
||||
|
||||
* `GitLab issue #431 <https://gitlab.com/mayan-edms/mayan-edms/issues/431>`_ can't create new mailer
|
||||
* `GitLab issue #436 <https://gitlab.com/mayan-edms/mayan-edms/issues/436>`_ New document source menu does not contain source_ids
|
||||
|
||||
|
||||
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,20 +17,11 @@ Final releases
|
||||
Below are release notes through Mayan EDMS |version| and its minor releases. Newer
|
||||
versions of the documentation contain the release notes for any later releases.
|
||||
|
||||
3.0 series
|
||||
----------
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
3.0
|
||||
|
||||
|
||||
2.0 series
|
||||
----------
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
2.7.3
|
||||
2.7.2
|
||||
2.7.1
|
||||
2.7
|
||||
|
||||
BIN
docs/topics/.development.rst.swp
Normal file
BIN
docs/topics/.development.rst.swp
Normal file
Binary file not shown.
@@ -11,13 +11,11 @@ system-wide.
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document [ label = 'Document' ];
|
||||
role [ label = 'Role' ];
|
||||
permission [ label = 'Permission' ];
|
||||
|
||||
role -> permission -> document;
|
||||
role -> document <- permission;
|
||||
}
|
||||
|
||||
Example:
|
||||
@@ -25,13 +23,11 @@ Example:
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document [ label = '2015 Payroll report.txt', width=200 ];
|
||||
role [ label = 'Accountants' ];
|
||||
permission [ label = 'View document' ];
|
||||
|
||||
role -> permission -> document;
|
||||
role -> document <- permission;
|
||||
}
|
||||
|
||||
In this scenario only users in groups belonging to the ``Accountants`` role
|
||||
@@ -47,14 +43,11 @@ permission for all documents of that type.
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
document_type [ label = 'Document type' ];
|
||||
role [ label = 'Role' ];
|
||||
permission [ label = 'Permission' ];
|
||||
documents [shape = "note", stacked];
|
||||
|
||||
role -> permission -> document_type ;
|
||||
document_type -> documents [folded, label = "inherit" ];
|
||||
role -> document_type <- permission;
|
||||
}
|
||||
|
||||
Example:
|
||||
@@ -62,14 +55,11 @@ Example:
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
document_type [ label = 'Payroll reports', width=200 ];
|
||||
role [ label = 'Accountants' ];
|
||||
permission [ label = 'View document' ];
|
||||
documents [shape = "note", stacked, label="payroll_report*.pdf" ];
|
||||
|
||||
role -> permission -> document_type ;
|
||||
document_type -> documents [folded, label = "inherit" ];
|
||||
role -> document_type <- permission;
|
||||
}
|
||||
|
||||
The role ``Accountants`` is given the permission ``document view`` for the
|
||||
|
||||
@@ -4,66 +4,12 @@ Backups
|
||||
|
||||
To backup your install of Mayan EDMS just copy the actual document files and
|
||||
the database content. If you are using the default storage backend, the
|
||||
document files should be found in the ``media`` folder of your installation.
|
||||
document files should be found in ``mayan/media/document_storage/``.
|
||||
|
||||
To dump the content of your database manager refer to the documentation chapter
|
||||
regarding database data "dumping".
|
||||
|
||||
Here is an example of how to perform a backup and a restore of a PostgreSQL
|
||||
database.
|
||||
|
||||
To dump the database into an SQL text file::
|
||||
|
||||
pg_dump -h <host> -U <database user> -c <database name> -W > `date +%Y-%m-%d"_"%H-%M-%S`.sql
|
||||
|
||||
Example::
|
||||
|
||||
pg_dump -h 127.0.0.1 -U mayan -c mayan -W > `date +%Y-%m-%d"_"%H-%M-%S`.sql
|
||||
|
||||
To restore the database from the SQL text file::
|
||||
|
||||
psql -h <host> -U <database user> -d <database name> -W -f <sql dump file>
|
||||
|
||||
Example::
|
||||
|
||||
psql -h 127.0.0.1 -U mayan -d mayan -W -f 2018-06-07_18-10-56.sql
|
||||
|
||||
Here is an example of how to perform a backup and a restore of a PostgreSQL
|
||||
Docker container using a compressed dump file. A dump file is not compatible or
|
||||
can be used interchangeable with an SQL text file.
|
||||
|
||||
To backup a PostgreSQL Docker container::
|
||||
|
||||
docker exec <container name> pg_dump -U <database user> -Fc -c <database name> > `date +%Y-%m-%d"_"%H-%M-%S`.dump
|
||||
|
||||
Example::
|
||||
|
||||
docker exec mayan-edms-db pg_dump -U mayan -Fc -c mayan > `date +%Y-%m-%d"_"%H-%M-%S`.dump
|
||||
|
||||
This will produce a compressed dump file with the current date and time as the filename.
|
||||
|
||||
To restore a PostgreSQL Docker container::
|
||||
|
||||
docker exec -i <container name> pg_restore -U <database user> -d <database name> < <dump file>
|
||||
|
||||
Since it is not possible to drop a currently open PostgreSQL database, this
|
||||
command must be used on a new and empty PostsgreSQL container.
|
||||
|
||||
Example::
|
||||
|
||||
docker run -d \
|
||||
--name mayan-edms-pg-new \
|
||||
--restart=always \
|
||||
-p 5432:5432 \
|
||||
-e POSTGRES_USER=mayan \
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres-new:/var/lib/postgresql/data \
|
||||
-d postgres:9.5
|
||||
|
||||
docker exec -i mayan-edms-pg-new pg_restore -U mayan -d mayan < 2018-06-07_17-09-34.dump
|
||||
|
||||
More information at:
|
||||
Example:
|
||||
|
||||
- Postgresl: http://www.postgresql.org/docs/current/static/backup.html
|
||||
- MySQL: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
|
||||
|
||||
@@ -1,217 +0,0 @@
|
||||
==================================================
|
||||
Mayan EDMS Entity Contributor Assignment Agreement
|
||||
==================================================
|
||||
|
||||
Thank you for your interest in contributing to Mayan EDMS ("We" or "Us").
|
||||
|
||||
This contributor agreement ("Agreement") documents the rights granted by
|
||||
contributors to Us. To make this document effective, please print it, sign it
|
||||
(by copyright holder or authorized party) and send it to Us by email to
|
||||
caa@mayan-edms.com. This is a legally binding document, so please read it
|
||||
carefully before agreeing to it. The Agreement may cover more than one
|
||||
software project managed by Us.
|
||||
|
||||
1. Definitions
|
||||
--------------
|
||||
"You" means any Legal Entity on behalf of whom a Contribution has been received
|
||||
by Us. "Legal Entity" means an entity which is not a natural person.
|
||||
"Affiliates" means other Legal Entities that control, are controlled by, or
|
||||
under common control with that Legal Entity. For the purposes of this
|
||||
definition, "control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such Legal Entity, whether by contract or otherwise,
|
||||
(ii) ownership of fifty percent (50%) or more of the outstanding shares or
|
||||
securities which vote to elect the management or other persons who direct such
|
||||
Legal Entity or (iii) beneficial ownership of such entity.
|
||||
|
||||
"Contribution" means any work of authorship that is Submitted by You to Us in
|
||||
which You own or assert ownership of the Copyright. We cannot accept
|
||||
contributions for which you do not own the Copyright or for which you don't
|
||||
have the necesary legal power to transfer.
|
||||
|
||||
"Copyright" means all rights protecting works of authorship owned or controlled
|
||||
by You or Your Affiliates, including copyright, moral and neighboring rights,
|
||||
as appropriate, for the full term of their existence including any extensions
|
||||
by You.
|
||||
|
||||
"Material" means the work of authorship which is made available by Us to third
|
||||
parties. When this Agreement covers more than one software project, the
|
||||
Material means the work of authorship to which the Contribution was Submitted.
|
||||
After You Submit the Contribution, it may be included in the Material.
|
||||
|
||||
"Submit" means any form of electronic, verbal, or written communication sent
|
||||
to Us or our representatives, including but not limited to electronic mailing
|
||||
lists, source code control systems, and issue tracking systems that are managed
|
||||
by, or on behalf of, Us for the purpose of discussing and improving the
|
||||
Material, but excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by You as "Not a Contribution."
|
||||
|
||||
"Submission Date" means the date on which You Submit a Contribution to Us.
|
||||
|
||||
"Effective Date" means the date You execute this Agreement or the date You
|
||||
first Submit a Contribution to Us, whichever is earlier.
|
||||
|
||||
2. Grant of Rights
|
||||
------------------
|
||||
2.1 Copyright Assignment
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
a. At the time the Contribution is Submitted, You assign to Us all right, title,
|
||||
and interest worldwide in all Copyright covering the Contribution; provided
|
||||
that this transfer is conditioned upon compliance with Section 2.3.
|
||||
|
||||
b. To the extent that any of the rights in Section 2.1(a) cannot be assigned by
|
||||
You to Us, You grant to Us a perpetual, worldwide, exclusive, royalty-free,
|
||||
transferable, irrevocable license under such non-assigned rights, with rights
|
||||
to sublicense through multiple tiers of sublicensees, to practice such
|
||||
non-assigned rights, including, but not limited to, the right to reproduce,
|
||||
modify, display, perform and distribute the Contribution; provided that this
|
||||
license is conditioned upon compliance with Section 2.3.
|
||||
|
||||
c. To the extent that any of the rights in Section 2.1(a) can neither be
|
||||
assigned nor licensed by You to Us, You irrevocably waive and agree never to
|
||||
assert such rights against Us, any of our successors in interest, or any of
|
||||
our licensees, either direct or indirect; provided that this agreement not
|
||||
to assert is conditioned upon compliance with Section 2.3.
|
||||
|
||||
d. Upon such transfer of rights to Us, the Contribution will be licenses under
|
||||
the terms of the Material.
|
||||
|
||||
2.2 Patent License
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
For patent claims including, without limitation, method, process, and apparatus
|
||||
claims which You or Your Affiliates own, control or have the right to grant,
|
||||
now or in the future, You grant to Us a perpetual, worldwide, non-exclusive,
|
||||
transferable, royalty-free, irrevocable patent license, with the right to
|
||||
sublicense these rights to multiple tiers of sublicensees, to make, have made,
|
||||
use, sell, offer for sale, import and otherwise transfer the Contribution and
|
||||
the Contribution in combination with the Material (and portions of such
|
||||
combination). This license is granted only to the extent that the exercise of
|
||||
the licensed rights infringes such patent claims; and provided that this license
|
||||
is conditioned upon compliance with Section 2.3.
|
||||
|
||||
2.3 Outbound License
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
As a condition on the grant of rights in Sections 2.1 and 2.2, We agree to
|
||||
license the Contribution only under the terms of the license or licenses which
|
||||
We are using on the Submission Date for the Material (including any rights to
|
||||
adopt any future version of a license if permitted).
|
||||
|
||||
2.4 Moral Rights
|
||||
~~~~~~~~~~~~~~~~
|
||||
If moral rights apply to the Contribution, to the maximum extent permitted by
|
||||
law, You waive and agree not to assert such moral rights against Us or our
|
||||
successors in interest, or any of our licensees, either direct or indirect.
|
||||
|
||||
2.5 Our Rights
|
||||
~~~~~~~~~~~~~~
|
||||
You acknowledge that We are not obligated to use Your Contribution as part of
|
||||
the Material and may decide to include any Contribution We consider appropriate.
|
||||
|
||||
2.6 Reservation of Rights
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Any rights not expressly assigned or licensed under this section are expressly
|
||||
reserved by You.
|
||||
|
||||
3. Agreement
|
||||
------------
|
||||
You confirm that:
|
||||
|
||||
a. You have the legal authority to enter into this Agreement.
|
||||
|
||||
b. You or Your Affiliates own the Copyright and patent claims covering the
|
||||
Contribution which are required to grant the rights under Section 2.
|
||||
|
||||
c. The grant of rights under Section 2 does not violate any grant of rights
|
||||
which You or Your Affiliates have made to third parties.
|
||||
|
||||
|
||||
4. Disclaimer
|
||||
-------------
|
||||
EXCEPT FOR THE EXPRESS WARRANTIES IN SECTION 3, THE CONTRIBUTION IS PROVIDED
|
||||
"AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES INCLUDING,
|
||||
WITHOUT LIMITATION, ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED BY YOU TO US
|
||||
AND BY US TO YOU. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE DISCLAIMED,
|
||||
SUCH WARRANTY IS LIMITED IN DURATION TO THE MINIMUM PERIOD PERMITTED BY LAW.
|
||||
|
||||
5. Consequential Damage Waiver
|
||||
------------------------------
|
||||
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU OR US
|
||||
BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA,
|
||||
INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING OUT
|
||||
OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY (CONTRACT, TORT
|
||||
OR OTHERWISE) UPON WHICH THE CLAIM IS BASED.
|
||||
|
||||
6. Miscellaneous
|
||||
----------------
|
||||
6.1 Juristiction
|
||||
~~~~~~~~~~~~~~~~
|
||||
This Agreement will be governed by and construed in accordance with the laws of
|
||||
Puerto Rico excluding its conflicts of law provisions. Under certain circumstances,
|
||||
the governing law in this section might be superseded by the United Nations
|
||||
Convention on Contracts for the International Sale of Goods ("UN Convention")
|
||||
and the parties intend to avoid the application of the UN Convention to this
|
||||
Agreement and, thus, exclude the application of the UN Convention in its
|
||||
entirety to this Agreement.
|
||||
|
||||
6.2 Acceptance
|
||||
~~~~~~~~~~~~~~
|
||||
This Agreement sets out the entire agreement between You and Us for Your
|
||||
Contributions to Us and overrides all other agreements or understandings.
|
||||
|
||||
6.3 Third parties
|
||||
~~~~~~~~~~~~~~~~~
|
||||
If You or We assign the rights or obligations received through this Agreement
|
||||
to a third party, as a condition of the assignment, that third party must
|
||||
agree in writing to abide by all the rights and obligations in the Agreement.
|
||||
|
||||
6.4 Unmet responsabilities
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
The failure of either party to require performance by the other party of any
|
||||
provision of this Agreement in one situation shall not affect the right of a
|
||||
party to require such performance at any time in the future. A waiver of
|
||||
performance under a provision in one situation shall not be considered a
|
||||
waiver of the performance of the provision in the future or a waiver of the
|
||||
provision in its entirety.
|
||||
|
||||
6.5 Continuation
|
||||
~~~~~~~~~~~~~~~~
|
||||
If any provision of this Agreement is found void and unenforceable, such
|
||||
provision will be replaced to the extent possible with a provision that comes
|
||||
closest to the meaning of the original provision and which is enforceable.
|
||||
The terms and conditions set forth in this Agreement shall apply
|
||||
notwithstanding any failure of essential purpose of this Agreement or any
|
||||
limited remedy to the maximum extent possible under law.
|
||||
|
||||
|
||||
::
|
||||
|
||||
|
||||
Name: _________________________________________________
|
||||
|
||||
|
||||
Email: ________________________________________________
|
||||
|
||||
|
||||
Address: ______________________________________________
|
||||
|
||||
|
||||
Address (cont): _______________________________________
|
||||
|
||||
|
||||
Country: ______________________________________________
|
||||
|
||||
|
||||
Phone number: _________________________________________
|
||||
|
||||
|
||||
Fax number: ___________________________________________
|
||||
|
||||
|
||||
|
||||
_______________________________________________________
|
||||
Signature
|
||||
|
||||
|
||||
|
||||
Mayan EDMS Entity CAA Version 1.0 April 8, 2018
|
||||
@@ -1,211 +0,0 @@
|
||||
======================================================
|
||||
Mayan EDMS Individual Contributor Assignment Agreement
|
||||
======================================================
|
||||
|
||||
Thank you for your interest in contributing to Mayan EDMS ("We" or "Us").
|
||||
|
||||
This contributor agreement ("Agreement") documents the rights granted by
|
||||
contributors to Us. To make this document effective, please print it, sign it
|
||||
(by copyright holder or authorized party) and send it to Us by email to
|
||||
caa@mayan-edms.com. This is a legally binding document, so please read it
|
||||
carefully before agreeing to it. The Agreement may cover more than one
|
||||
software project managed by Us.
|
||||
|
||||
1. Definitions
|
||||
--------------
|
||||
|
||||
"You" means the individual who Submits a Contribution to Us.
|
||||
|
||||
"Contribution" means any work of authorship that is Submitted by You to Us
|
||||
in which You own or assert ownership of the Copyright. We cannot accept
|
||||
contributions for which you do not own the Copyright or for which you don't
|
||||
have the necesary legal power to transfer.
|
||||
|
||||
"Copyright" means all rights protecting works of authorship owned or
|
||||
controlled by You, including copyright, moral and neighboring rights,
|
||||
as appropriate, for the full term of their existence including any extensions
|
||||
by You.
|
||||
|
||||
"Material" means the work of authorship which is made available by Us to third
|
||||
parties. When this Agreement covers more than one software project, the Material
|
||||
means the work of authorship to which the Contribution was Submitted. After
|
||||
You Submit the Contribution, it may be included in the Material.
|
||||
|
||||
"Submit" means any form of electronic, verbal, or written communication
|
||||
sent to Us or our representatives, including but not limited to
|
||||
electronic mailing lists, source code control systems, and issue tracking systems
|
||||
that are managed by, or on behalf of, Us for the purpose of discussing and
|
||||
improving the Material, but excluding communication that is conspicuously marked
|
||||
or otherwise designated in writing by You as "Not a Contribution."
|
||||
|
||||
"Submission Date" means the date on which You Submit a Contribution to Us.
|
||||
|
||||
"Effective Date" means the date You execute this Agreement or the date You first
|
||||
Submit a Contribution to Us, whichever is earlier.
|
||||
|
||||
2. Grant of Rights
|
||||
------------------
|
||||
|
||||
2.1 Copyright Assignment
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
a. At the time the Contribution is Submitted, You assign to Us all right,
|
||||
title, and interest worldwide in all Copyright covering the Contribution;
|
||||
provided that this transfer is conditioned upon compliance with Section 2.3.
|
||||
|
||||
b. To the extent that any of the rights in Section 2.1(a) cannot be assigned
|
||||
by You to Us, You grant to Us a perpetual, worldwide, exclusive, royalty-free,
|
||||
transferable, irrevocable license under such non-assigned rights, with rights
|
||||
to sublicense through multiple tiers of sublicensees, to practice such
|
||||
non-assigned rights, including, but not limited to, the right to reproduce,
|
||||
modify, display, perform and distribute the Contribution; provided that
|
||||
this license is conditioned upon compliance with Section 2.3.
|
||||
|
||||
c. To the extent that any of the rights in Section 2.1(a) can neither be
|
||||
assigned nor licensed by You to Us, You irrevocably waive and agree never to
|
||||
assert such rights against Us, any of our successors in interest, or any of
|
||||
our licensees, either direct or indirect; provided that this agreement not
|
||||
to assert is conditioned upon compliance with Section 2.3.
|
||||
|
||||
d. Upon such transfer of rights to Us, the Contribution will be licenses under
|
||||
the terms of the Material.
|
||||
|
||||
2.2 Patent License
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
For patent claims including, without limitation, method, process, and apparatus
|
||||
claims which You own, control or have the right to grant, now or in the future,
|
||||
You grant to Us a perpetual, worldwide, non-exclusive, transferable, royalty-free,
|
||||
irrevocable patent license, with the right to sublicense these rights to multiple
|
||||
tiers of sublicensees, to make, have made, use, sell, offer for sale, import and
|
||||
otherwise transfer the Contribution and the Contribution in combination with
|
||||
the Material (and portions of such combination). This license is granted only
|
||||
to the extent that the exercise of the licensed rights infringes such patent claims;
|
||||
and provided that this license is conditioned upon compliance with Section 2.3.
|
||||
|
||||
2.3 Outbound License
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
As a condition on the grant of rights in Sections 2.1 and 2.2, We agree to
|
||||
license the Contribution only under the terms of the license or licenses which
|
||||
We are using on the Submission Date for the Material (including any rights to
|
||||
adopt any future version of a license if permitted).
|
||||
|
||||
2.4 Moral Rights
|
||||
~~~~~~~~~~~~~~~~
|
||||
If moral rights apply to the Contribution, to the maximum extent permitted by law,
|
||||
You waive and agree not to assert such moral rights against Us or our successors
|
||||
in interest, or any of our licensees, either direct or indirect.
|
||||
|
||||
2.5 Our Rights
|
||||
~~~~~~~~~~~~~~
|
||||
You acknowledge that We are not obligated to use Your Contribution as part of
|
||||
the Material and may decide to include any Contribution We consider appropriate.
|
||||
|
||||
2.6 Reservation of Rights
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Any rights not expressly assigned or licensed under this section are expressly
|
||||
reserved by You.
|
||||
|
||||
3. Agreement
|
||||
------------
|
||||
You confirm that:
|
||||
|
||||
a. You have the legal authority to enter into this Agreement.
|
||||
|
||||
b. You own the Copyright and patent claims covering the Contribution which are
|
||||
required to grant the rights under Section 2.
|
||||
|
||||
c. The grant of rights under Section 2 does not violate any grant of rights
|
||||
which You have made to third parties, including Your employer. If You are an
|
||||
employee, You have had Your employer approve this Agreement or sign the Entity
|
||||
version of this document. If You are less than eighteen years old, please have
|
||||
Your parents or guardian sign the Agreement.
|
||||
|
||||
4. Disclaimer
|
||||
-------------
|
||||
EXCEPT FOR THE EXPRESS WARRANTIES IN SECTION 3, THE CONTRIBUTION IS PROVIDED
|
||||
"AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES INCLUDING, WITHOUT
|
||||
LIMITATION, ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED BY YOU TO US AND BY US
|
||||
TO YOU. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE DISCLAIMED, SUCH
|
||||
WARRANTY IS LIMITED IN DURATION TO THE MINIMUM PERIOD PERMITTED BY LAW.
|
||||
|
||||
5. Consequential Damage Waiver
|
||||
------------------------------
|
||||
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU OR US
|
||||
BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA,
|
||||
INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING OUT
|
||||
OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY (CONTRACT, TORT
|
||||
OR OTHERWISE) UPON WHICH THE CLAIM IS BASED.
|
||||
|
||||
6. Miscellaneous
|
||||
----------------
|
||||
6.1 Juristiction
|
||||
~~~~~~~~~~~~~~~~
|
||||
This Agreement will be governed by and construed in accordance with the laws of
|
||||
Puerto Rico excluding its conflicts of law provisions. Under certain circumstances,
|
||||
the governing law in this section might be superseded by the United Nations
|
||||
Convention on Contracts for the International Sale of Goods ("UN Convention")
|
||||
and the parties intend to avoid the application of the UN Convention to this
|
||||
Agreement and, thus, exclude the application of the UN Convention in its
|
||||
entirety to this Agreement.
|
||||
|
||||
6.2 Acceptance
|
||||
~~~~~~~~~~~~~~
|
||||
This Agreement sets out the entire agreement between You and Us for Your
|
||||
Contributions to Us and overrides all other agreements or understandings.
|
||||
|
||||
6.3 Third parties
|
||||
~~~~~~~~~~~~~~~~~
|
||||
If You or We assign the rights or obligations received through this Agreement
|
||||
to a third party, as a condition of the assignment, that third party must
|
||||
agree in writing to abide by all the rights and obligations in the Agreement.
|
||||
|
||||
6.4 Unmet responsabilities
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
The failure of either party to require performance by the other party of any
|
||||
provision of this Agreement in one situation shall not affect the right of a
|
||||
party to require such performance at any time in the future. A waiver of
|
||||
performance under a provision in one situation shall not be considered a
|
||||
waiver of the performance of the provision in the future or a waiver of the
|
||||
provision in its entirety.
|
||||
|
||||
6.5 Continuation
|
||||
~~~~~~~~~~~~~~~~
|
||||
If any provision of this Agreement is found void and unenforceable,
|
||||
such provision will be replaced to the extent possible with a provision that
|
||||
comes closest to the meaning of the original provision and which is enforceable.
|
||||
The terms and conditions set forth in this Agreement shall apply notwithstanding
|
||||
any failure of essential purpose of this Agreement or any limited remedy to
|
||||
the maximum extent possible under law.
|
||||
|
||||
|
||||
::
|
||||
|
||||
|
||||
Name: _________________________________________________
|
||||
|
||||
|
||||
Email: ________________________________________________
|
||||
|
||||
|
||||
Address: ______________________________________________
|
||||
|
||||
|
||||
Address (cont): _______________________________________
|
||||
|
||||
|
||||
Country: ______________________________________________
|
||||
|
||||
|
||||
Phone number: _________________________________________
|
||||
|
||||
|
||||
Fax number: ___________________________________________
|
||||
|
||||
|
||||
|
||||
_______________________________________________________
|
||||
Signature
|
||||
|
||||
|
||||
|
||||
Mayan EDMS Individual CAA Version 1.0 April 8, 2018
|
||||
File diff suppressed because it is too large
Load Diff
38
docs/topics/contributors.rst
Normal file
38
docs/topics/contributors.rst
Normal file
@@ -0,0 +1,38 @@
|
||||
.. _contributors:
|
||||
|
||||
============
|
||||
Contributors
|
||||
============
|
||||
|
||||
|
||||
How to contribute?
|
||||
------------------
|
||||
|
||||
You can help further the development of Mayan EDMS by testing, reporting
|
||||
bugs, submitting documentation or code patches.
|
||||
|
||||
Lead developer
|
||||
--------------
|
||||
* Roberto Rosario (roberto.rosario@mayan-edms.com) <https://twitter.com/siloraptor>
|
||||
|
||||
Contributors (in alphabetical order)
|
||||
------------------------------------
|
||||
* Aziz M. Bookwala (https://github.com/azizmb)
|
||||
* Bertrand Bordage (https://github.com/BertrandBordage)
|
||||
* Brian E (brian@realize.org)
|
||||
* David Herring (https://github.com/abadger1406)
|
||||
* Emlyn Clay (https://github.com/EmlynC)
|
||||
* Jens Kadenbach (https://github.com/audax)
|
||||
* Kolmar Kafran
|
||||
* Helga Carrero
|
||||
* IHLeanne (https://github.com/IHLeanne)
|
||||
* Iliya Georgiev (ikgeorgiev@gmail.com)
|
||||
* Lars Kruse (devel@sumpfralle.de)
|
||||
* Mathias Behrle <mbehrle@m9s.biz>
|
||||
* Meurig Freeman (https://github.com/meurig)
|
||||
* Nate Aune (nate@appsembler.com)
|
||||
* Paul Whipp [https://github.com/pwhipp] [http://paulwhippconsulting.com]
|
||||
* Rafael Esparra <rafael.esparra1@upr.edu>
|
||||
* Sergey Glita (s.v.glita@gmail.com)
|
||||
* Simone Federici [https://twitter.com/aldaranalton] [https://github.com/simone]
|
||||
* Webfaction (https://www.webfaction.com)
|
||||
@@ -1,5 +1,3 @@
|
||||
.. _deploying:
|
||||
|
||||
===================
|
||||
Advanced deployment
|
||||
===================
|
||||
@@ -21,127 +19,258 @@ Ubuntu
|
||||
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
|
||||
requirements using::
|
||||
|
||||
sudo apt-get install g++ gcc ghostscript gnupg1 graphviz libjpeg-dev libmagic1 \
|
||||
libpq-dev libpng-dev libreoffice libtiff-dev poppler-utils postgresql \
|
||||
python-dev python-pip python-virtualenv redis-server sane-utils supervisor \
|
||||
tesseract-ocr zlib1g-dev -y
|
||||
apt-get install graphviz nginx supervisor redis-server postgresql \
|
||||
libpq-dev libjpeg-dev libmagic1 libpng-dev libreoffice \
|
||||
libtiff-dev gcc ghostscript gnupg python-dev python-virtualenv \
|
||||
tesseract-ocr poppler-utils -y
|
||||
|
||||
Create an user account for the installation::
|
||||
If using Ubuntu 16.10 also install GPG version 1 (as GPG version 2 is the new default for this distribution and not yet supported by Mayan EDMS) ::
|
||||
|
||||
sudo adduser mayan --disabled-password --disabled-login --no-create-home --gecos ""
|
||||
apt-get install gnupg1 -y
|
||||
|
||||
Create the parent directory where the project will be deployed::
|
||||
|
||||
sudo mkdir -p /opt
|
||||
Mac OSX
|
||||
-------
|
||||
|
||||
Mayan EDMS is dependent on a number of binary packages and the recommended
|
||||
way is to use a package manager such as `MacPorts <https://www.macports.org/>`_
|
||||
or `Homebrew <http://brew.sh/>`_.
|
||||
|
||||
|
||||
Use MacPorts to install binary dependencies
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
With MacPorts installed run the command:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo port install python-dev gcc tesseract-ocr unpaper \
|
||||
python-virtualenv ghostscript libjpeg-dev libpng-dev \
|
||||
poppler-utils
|
||||
|
||||
Set the Binary paths
|
||||
********************
|
||||
|
||||
Mayan EDMS by default will look in /usr/bin/ for the binary files it needs
|
||||
so either you can symlink the binaries installed via MacPorts in /opt/local/bin/
|
||||
to /usr/bin/ with ...
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo ln -s /opt/local/bin/tesseract /usr/bin/tesseract
|
||||
|
||||
Alternatively, set the paths in the ``settings/locals.py``
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
LIBREOFFICE_PATH = '/Applications/LibreOffice.app/Contents/MacOS/soffice'
|
||||
|
||||
Or Use Homebrew
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
With Homebrew installed run the command:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
brew install python gcc tesseract unpaper poppler libpng postgresql
|
||||
|
||||
Set the Binary paths
|
||||
********************
|
||||
|
||||
Mayan EDMS by default will look in /usr/bin/ for the binary files it needs.
|
||||
You can symlink the binaries installed via brew in /usr/local/bin/
|
||||
to /usr/bin/ with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo ln -s /usr/local/bin/tesseract /usr/bin/tesseract && \
|
||||
sudo ln -s /usr/local/bin/unpaper /usr/bin/unpaper && \
|
||||
sudo ln -s /usr/local/bin/pdftotext /usr/bin/pdftotext && \
|
||||
sudo ln -s /usr/local/bin/gs /usr/bin/gs
|
||||
|
||||
Alternatively, set the paths in the ``settings/locals.py``
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
LIBREOFFICE_PATH = '/Applications/LibreOffice.app/Contents/MacOS/soffice'
|
||||
|
||||
|
||||
Common steps
|
||||
------------
|
||||
Switch to superuser::
|
||||
|
||||
sudo -i
|
||||
|
||||
Change to the directory where the project will be deployed::
|
||||
|
||||
cd /usr/share
|
||||
|
||||
Create the Python virtual environment for the installation::
|
||||
|
||||
sudo virtualenv /opt/mayan-edms
|
||||
virtualenv mayan-edms
|
||||
|
||||
Create the folder for the Mayan EDMS data::
|
||||
Activate the virtualenv::
|
||||
|
||||
sudo mkdir /opt/mayan-edms/media
|
||||
|
||||
Make the mayan user the owner of the installation directory::
|
||||
|
||||
sudo chown mayan:mayan /opt/mayan-edms -R
|
||||
source mayan-edms/bin/activate
|
||||
|
||||
Install Mayan EDMS from PyPI::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir mayan-edms
|
||||
pip install mayan-edms
|
||||
|
||||
Install the Python client for PostgreSQL and Redis::
|
||||
Install the Python client for PostgreSQL, Redis, and uWSGI::
|
||||
|
||||
sudo -u mayan /opt/mayan-edms/bin/pip install --no-cache-dir psycopg2==2.7.3.2 redis==2.10.6
|
||||
pip install psycopg2 redis uwsgi
|
||||
|
||||
Create the database for the installation::
|
||||
|
||||
sudo -u postgres psql -c "CREATE USER mayan WITH password 'mayanuserpass';"
|
||||
sudo -u postgres createuser -P mayan (provide password)
|
||||
sudo -u postgres createdb -O mayan mayan
|
||||
|
||||
Initialize the project::
|
||||
Create the directory for the log files::
|
||||
|
||||
sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
|
||||
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py initialsetup
|
||||
mkdir /var/log/mayan
|
||||
|
||||
Change the current directory to be the one of the installation::
|
||||
|
||||
cd mayan-edms
|
||||
|
||||
Make a convenience symbolic link::
|
||||
|
||||
ln -s lib/python2.7/site-packages/mayan .
|
||||
|
||||
Create an initial settings file::
|
||||
|
||||
mayan-edms.py createsettings
|
||||
|
||||
Append the following to the ``mayan/settings/local.py`` file, paying attention to replace the ``PASSWORD`` value::
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': 'mayan',
|
||||
'USER': 'mayan',
|
||||
'PASSWORD': '<password used when creating postgreSQL user>',
|
||||
'HOST': 'localhost',
|
||||
'PORT': '5432',
|
||||
}
|
||||
}
|
||||
|
||||
BROKER_URL = 'redis://127.0.0.1:6379/0'
|
||||
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
|
||||
|
||||
If using Ubuntu 16.10, also add this line to the ``mayan/settings/local.py`` file::
|
||||
|
||||
SIGNATURES_GPG_PATH = '/usr/bin/gpg1'
|
||||
|
||||
Migrate the database or initialize the project::
|
||||
|
||||
mayan-edms.py initialsetup
|
||||
|
||||
Disable the default NGINX site::
|
||||
|
||||
rm /etc/nginx/sites-enabled/default
|
||||
|
||||
Create a ``uwsgi.ini`` file with the following contents::
|
||||
|
||||
[uwsgi]
|
||||
chdir = /usr/share/mayan-edms/lib/python2.7/site-packages/mayan
|
||||
chmod-socket = 664
|
||||
chown-socket = www-data:www-data
|
||||
env = DJANGO_SETTINGS_MODULE=mayan.settings.production
|
||||
gid = www-data
|
||||
logto = /var/log/uwsgi/%n.log
|
||||
pythonpath = /usr/share/mayan-edms/lib/python2.7/site-packages
|
||||
master = True
|
||||
max-requests = 5000
|
||||
socket = /usr/share/mayan-edms/uwsgi.sock
|
||||
uid = www-data
|
||||
vacuum = True
|
||||
wsgi-file = /usr/share/mayan-edms/lib/python2.7/site-packages/mayan/wsgi.py
|
||||
|
||||
Create the directory for the uWSGI log files::
|
||||
|
||||
mkdir /var/log/uwsgi
|
||||
|
||||
Create the NGINX site file for Mayan EDMS, ``/etc/nginx/sites-available/mayan``::
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
include uwsgi_params;
|
||||
uwsgi_pass unix:/usr/share/mayan-edms/uwsgi.sock;
|
||||
|
||||
client_max_body_size 30M; # Increse if your plan to upload bigger documents
|
||||
proxy_read_timeout 30s; # Increase if your document uploads take more than 30 seconds
|
||||
}
|
||||
|
||||
location /static {
|
||||
alias /usr/share/mayan-edms/mayan/media/static;
|
||||
expires 1h;
|
||||
}
|
||||
|
||||
location /favicon.ico {
|
||||
alias /usr/share/mayan-edms/mayan/media/static/appearance/images/favicon.ico;
|
||||
expires 1h;
|
||||
}
|
||||
}
|
||||
|
||||
Enable the NGINX site for Mayan EDMS::
|
||||
|
||||
ln -s /etc/nginx/sites-available/mayan /etc/nginx/sites-enabled/
|
||||
|
||||
Create the supervisor file for the uWSGI process, ``/etc/supervisor/conf.d/mayan-uwsgi.conf``::
|
||||
|
||||
[program:mayan-uwsgi]
|
||||
command = /usr/share/mayan-edms/bin/uwsgi --ini /usr/share/mayan-edms/uwsgi.ini
|
||||
user = root
|
||||
autostart = true
|
||||
autorestart = true
|
||||
redirect_stderr = true
|
||||
|
||||
Create the supervisor file for the Celery worker, ``/etc/supervisor/conf.d/mayan-celery.conf``::
|
||||
|
||||
[program:mayan-worker]
|
||||
command = /usr/share/mayan-edms/bin/python /usr/share/mayan-edms/bin/mayan-edms.py celery --settings=mayan.settings.production worker -Ofair -l ERROR
|
||||
directory = /usr/share/mayan-edms
|
||||
user = www-data
|
||||
stdout_logfile = /var/log/mayan/worker-stdout.log
|
||||
stderr_logfile = /var/log/mayan/worker-stderr.log
|
||||
autostart = true
|
||||
autorestart = true
|
||||
startsecs = 10
|
||||
stopwaitsecs = 10
|
||||
killasgroup = true
|
||||
priority = 998
|
||||
|
||||
[program:mayan-beat]
|
||||
command = /usr/share/mayan-edms/bin/python /usr/share/mayan-edms/bin/mayan-edms.py celery --settings=mayan.settings.production beat -l ERROR
|
||||
directory = /usr/share/mayan-edms
|
||||
user = www-data
|
||||
numprocs = 1
|
||||
stdout_logfile = /var/log/mayan/beat-stdout.log
|
||||
stderr_logfile = /var/log/mayan/beat-stderr.log
|
||||
autostart = true
|
||||
autorestart = true
|
||||
startsecs = 10
|
||||
stopwaitsecs = 1
|
||||
killasgroup = true
|
||||
priority = 998
|
||||
|
||||
Collect the static files::
|
||||
|
||||
sudo -u mayan MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
|
||||
/opt/mayan-edms/bin/mayan-edms.py collectstatic --noinput
|
||||
mayan-edms.py collectstatic --noinput
|
||||
|
||||
Create the supervisor file at ``/etc/supervisor/conf.d/mayan.conf``::
|
||||
Make the installation directory readable and writable by the webserver user::
|
||||
|
||||
[supervisord]
|
||||
environment=
|
||||
MAYAN_ALLOWED_HOSTS="*", # Allow access to other network hosts other than localhost
|
||||
MAYAN_CELERY_RESULT_BACKEND="redis://127.0.0.1:6379/0",
|
||||
MAYAN_BROKER_URL="redis://127.0.0.1:6379/0",
|
||||
PYTHONPATH=/opt/mayan-edms/lib/python2.7/site-packages:/opt/mayan-edms/data,
|
||||
MAYAN_MEDIA_ROOT=/opt/mayan-edms/media,
|
||||
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql,
|
||||
MAYAN_DATABASE_HOST=127.0.0.1,
|
||||
MAYAN_DATABASE_NAME=mayan,
|
||||
MAYAN_DATABASE_PASSWORD=mayanuserpass,
|
||||
MAYAN_DATABASE_USER=mayan,
|
||||
MAYAN_DATABASE_CONN_MAX_AGE=60,
|
||||
DJANGO_SETTINGS_MODULE=mayan.settings.production
|
||||
|
||||
[program:mayan-gunicorn]
|
||||
autorestart = true
|
||||
autostart = true
|
||||
command = /opt/mayan-edms/bin/gunicorn -w 2 mayan.wsgi --max-requests 500 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000
|
||||
user = mayan
|
||||
|
||||
[program:mayan-worker-fast]
|
||||
autorestart = true
|
||||
autostart = true
|
||||
command = nice -n 1 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q converter -n mayan-worker-fast.%%h --concurrency=1
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-worker-medium]
|
||||
autorestart = true
|
||||
autostart = true
|
||||
command = nice -n 18 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h --concurrency=1
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-worker-slow]
|
||||
autorestart = true
|
||||
autostart = true
|
||||
command = nice -n 19 /opt/mayan-edms/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
|
||||
[program:mayan-celery-beat]
|
||||
autorestart = true
|
||||
autostart = true
|
||||
command = nice -n 1 /opt/mayan-edms/bin/mayan-edms.py celery beat --pidfile= -l ERROR
|
||||
killasgroup = true
|
||||
numprocs = 1
|
||||
priority = 998
|
||||
startsecs = 10
|
||||
stopwaitsecs = 1
|
||||
user = mayan
|
||||
chown www-data:www-data /usr/share/mayan-edms -R
|
||||
|
||||
Enable and restart the services [1_]::
|
||||
|
||||
systemctl enable supervisor
|
||||
systemctl restart supervisor
|
||||
systemctl restart nginx
|
||||
|
||||
[1]: https://bugs.launchpad.net/ubuntu/+source/supervisor/+bug/1594740
|
||||
|
||||
|
||||
@@ -253,7 +253,12 @@ Steps to deploy a development version
|
||||
|
||||
Contributing changes
|
||||
--------------------
|
||||
Follow the latest contributing guidelines outlined here: https://gitlab.com/mayan-edms/mayan-edms/blob/master/CONTRIBUTING.md
|
||||
Once your have created and committed some new code or feature, submit a Pull
|
||||
Request. Be sure to merge with the development branch before doing a Pull
|
||||
Request so that patches apply as cleanly as possible. If there are no conflicts,
|
||||
Merge Requests can be merged directly from the website UI otherwise a manual
|
||||
command line merge has to be done and your patches might take longer to get
|
||||
merged.
|
||||
|
||||
|
||||
Debugging
|
||||
@@ -326,7 +331,7 @@ first need to install the documentation editing dependencies with::
|
||||
Then, to build an HTML version of the documentation, run the following command
|
||||
from the **docs** directory::
|
||||
|
||||
$ make docs-serve
|
||||
$ make docs_serve
|
||||
|
||||
The generated documentation can be viewed by browsing to http://127.0.0.1:8000
|
||||
or by browsing to the ``docs/_build/html`` directory.
|
||||
@@ -399,52 +404,40 @@ Release checklist
|
||||
|
||||
1. Check for missing migrations::
|
||||
|
||||
make check-missing-migrations
|
||||
$ ./manage.py makemigrations
|
||||
|
||||
2. Synchronize translations::
|
||||
|
||||
make translations-pull
|
||||
$ make translations_pull
|
||||
|
||||
3. Compile translations::
|
||||
|
||||
make translations-compile
|
||||
$ make translations_compile
|
||||
|
||||
4. Write release notes.
|
||||
5. Update changelog.
|
||||
6. Scan the code with flake8 for simple style warnings.
|
||||
7. Check README.rst format with::
|
||||
6. Update requirements version in `setup.py`
|
||||
7. Bump version in `mayan/__init__.py`
|
||||
8. Build source package and test::
|
||||
|
||||
python setup.py check -r -s
|
||||
$ make test_sdist_via_docker_ubuntu
|
||||
|
||||
or with::
|
||||
9. Build wheel package and test::
|
||||
|
||||
make check-readme
|
||||
$ make test_whell_via_docker_ubuntu
|
||||
|
||||
8. Bump version in `mayan/__init__.py` and in `docker/version`.
|
||||
9. Update requirements version in `setup.py` using::
|
||||
10. Tag version::
|
||||
|
||||
make generate-setup
|
||||
$ git tag -a vX.Y.Z -m "Version X.Y.Z"
|
||||
|
||||
10. Build source package and test::
|
||||
11. Push tag upstream::
|
||||
|
||||
make test-sdist-via-docker-ubuntu
|
||||
$ git push --tags
|
||||
|
||||
11. Build wheel package and test::
|
||||
12. Build and upload a test release::
|
||||
|
||||
make test-wheel-via-docker-ubuntu
|
||||
$ make release_test_via_docker_ubuntu
|
||||
|
||||
12. Tag version::
|
||||
13. Build and upload a final release::
|
||||
|
||||
git tag -a vX.Y.Z -m "Version X.Y.Z"
|
||||
|
||||
13. Push tag upstream::
|
||||
|
||||
git push --tags
|
||||
|
||||
14. Build and upload a test release::
|
||||
|
||||
make release-test-via-docker-ubuntu
|
||||
|
||||
15. Build and upload a final release::
|
||||
|
||||
make release-via-docker-ubuntu
|
||||
$ make release_via_docker_ubuntu
|
||||
|
||||
@@ -1,372 +0,0 @@
|
||||
.. _docker:
|
||||
|
||||
|
||||
============
|
||||
Docker image
|
||||
============
|
||||
|
||||
How to use this image
|
||||
=====================
|
||||
|
||||
Start a Mayan EDMS instance
|
||||
------------------------------
|
||||
|
||||
With Docker properly installed, proceed to download the Mayan EDMS image using the command::
|
||||
|
||||
docker pull mayanedms/mayanedms:<version>
|
||||
|
||||
Then download version 9.5 of the Docker PostgreSQL image::
|
||||
|
||||
docker pull postgres:9.5
|
||||
|
||||
Create and run a PostgreSQL container::
|
||||
|
||||
docker run -d \
|
||||
--name mayan-edms-postgres \
|
||||
--restart=always \
|
||||
-p 5432:5432 \
|
||||
-e POSTGRES_USER=mayan \
|
||||
-e POSTGRES_DB=mayan \
|
||||
-e POSTGRES_PASSWORD=mayanuserpass \
|
||||
-v /docker-volumes/mayan-edms/postgres:/var/lib/postgresql/data \
|
||||
-d postgres:9.5
|
||||
|
||||
The PostgreSQL container will have one database named ``mayan``, with an user
|
||||
named ``mayan`` too, with a password of ``mayanuserpass``. The container will
|
||||
expose its internal 5432 port (PostgreSQL's default port) via the host's
|
||||
5432 port. The data of this container will reside on the host's
|
||||
``/docker-volumes/mayan-edms/postgres`` folder.
|
||||
|
||||
Finally create and run a Mayan EDMS container. Change <version> with the
|
||||
latest version in numeric form (example: 2.7.3) or use the ``latest``
|
||||
identifier::
|
||||
|
||||
docker run -d \
|
||||
--name mayan-edms \
|
||||
--restart=always \
|
||||
-p 80:8000 \
|
||||
-e MAYAN_DATABASE_ENGINE=django.db.backends.postgresql \
|
||||
-e MAYAN_DATABASE_HOST=172.17.0.1 \
|
||||
-e MAYAN_DATABASE_NAME=mayan \
|
||||
-e MAYAN_DATABASE_PASSWORD=mayanuserpass \
|
||||
-e MAYAN_DATABASE_USER=mayan \
|
||||
-e MAYAN_DATABASE_CONN_MAX_AGE=60 \
|
||||
-v /docker-volumes/mayan-edms/media:/var/lib/mayan \
|
||||
mayanedms/mayanedms:<version>
|
||||
|
||||
The Mayan EDMS container will connect to the PostgreSQL container via the
|
||||
``172.17.0.1`` IP address (the Docker host's default IP address). It will
|
||||
connect using the ``django.db.backends.postgresql`` database drivern and
|
||||
connect to the ``mayan`` database using the ``mayan`` user with the password
|
||||
``mayanuserpass``. The container will keep connections to the database
|
||||
for up to 60 seconds in an attempt to reuse them increasing response time
|
||||
and reducing memory usage. The files of the container will be store in the
|
||||
host's ``/docker-volumes/mayan-edms/media`` folder. The container will
|
||||
expose its web service running on port 8000 on the host's port 80.
|
||||
|
||||
The container will be available by browsing to ``http://localhost`` or to
|
||||
the IP address of the computer running the container.
|
||||
|
||||
If another web server is running on port 80 use a different port in the
|
||||
``-p`` option. For example: ``-p 81:8000``.
|
||||
|
||||
|
||||
Stopping and starting the container
|
||||
--------------------------------------
|
||||
|
||||
To stop the container use::
|
||||
|
||||
docker stop mayan-edms
|
||||
|
||||
|
||||
To start the container again::
|
||||
|
||||
docker start mayan-edms
|
||||
|
||||
|
||||
Environment Variables
|
||||
---------------------
|
||||
|
||||
The Mayan EDMS image can be configure via environment variables.
|
||||
|
||||
``MAYAN_DATABASE_ENGINE``
|
||||
|
||||
Defaults to ``None``. This environment variable configures the database
|
||||
backend to use. If left unset, SQLite will be used. The database backends
|
||||
supported by this Docker image are:
|
||||
|
||||
- ``'django.db.backends.postgresql'``
|
||||
- ``'django.db.backends.mysql'``
|
||||
- ``'django.db.backends.sqlite3'``
|
||||
|
||||
When using the SQLite backend, the database file will be saved in the Docker
|
||||
volume. The SQLite database as used by Mayan EDMS is meant only for development
|
||||
or testing, never use it in production.
|
||||
|
||||
``MAYAN_DATABASE_NAME``
|
||||
|
||||
Defaults to 'mayan'. This optional environment variable can be used to define
|
||||
the database name that Mayan EDMS will connect to. For more information read
|
||||
the pertinent Django documentation page: `Connecting to the database`_
|
||||
|
||||
.. _Connecting to the database: https://docs.djangoproject.com/en/1.10/ref/databases/#connecting-to-the-database
|
||||
|
||||
``MAYAN_DATABASE_USER``
|
||||
|
||||
Defaults to 'mayan'. This optional environment variable is used to set the
|
||||
username that will be used to connect to the database. For more information
|
||||
read the pertinent Django documentation page: `Settings, USER`_
|
||||
|
||||
.. _Settings, USER: https://docs.djangoproject.com/en/1.10/ref/settings/#user
|
||||
|
||||
``MAYAN_DATABASE_PASSWORD``
|
||||
|
||||
Defaults to ''. This optional environment variable is used to set the
|
||||
password that will be used to connect to the database. For more information
|
||||
read the pertinent Django documentation page: `Settings, PASSWORD`_
|
||||
|
||||
.. _Settings, PASSWORD: https://docs.djangoproject.com/en/1.10/ref/settings/#password
|
||||
|
||||
``MAYAN_DATABASE_HOST``
|
||||
|
||||
Defaults to `None`. This optional environment variable is used to set the
|
||||
hostname that will be used to connect to the database. This can be the
|
||||
hostname of another container or an IP address. For more information read
|
||||
the pertinent Django documentation page: `Settings, HOST`_
|
||||
|
||||
.. _Settings, HOST: https://docs.djangoproject.com/en/1.10/ref/settings/#host
|
||||
|
||||
``MAYAN_DATABASE_PORT``
|
||||
|
||||
Defaults to `None`. This optional environment variable is used to set the
|
||||
port number to use when connecting to the database. An empty string means
|
||||
the default port. Not used with SQLite. For more information read the
|
||||
pertinent Django documentation page: `Settings, PORT`_
|
||||
|
||||
.. _Settings, PORT: https://docs.djangoproject.com/en/1.11/ref/settings/#port
|
||||
|
||||
``MAYAN_BROKER_URL``
|
||||
|
||||
This optional environment variable determines the broker that Celery will use
|
||||
to relay task messages between the frontend code and the background workers.
|
||||
For more information read the pertinent Celery Kombu documentation page: `Broker URL`_
|
||||
|
||||
.. _Broker URL: http://kombu.readthedocs.io/en/latest/userguide/connections.html#connection-urls
|
||||
|
||||
This Docker image supports using Redis and RabbitMQ as brokers.
|
||||
|
||||
Caveat: If the `MAYAN_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment
|
||||
variables are specified, the built-in Redis server inside the container will
|
||||
be disabled.
|
||||
|
||||
``MAYAN_CELERY_RESULT_BACKEND``
|
||||
|
||||
This optional environment variable determines the results backend that Celery
|
||||
will use to relay result messages from the background workers to the frontend
|
||||
code. For more information read the pertinent Celery Kombu documentation page:
|
||||
`Task result backend settings`_
|
||||
|
||||
.. _Task result backend settings: http://docs.celeryproject.org/en/3.1/configuration.html#celery-result-backend
|
||||
|
||||
This Docker image supports using Redis and RabbitMQ as result backends.
|
||||
|
||||
Caveat: If the `MAYAN_BROKER_URL` and `MAYAN_CELERY_RESULT_BACKEND` environment
|
||||
variables are specified, the built-in Redis server inside the container will
|
||||
be disabled.
|
||||
|
||||
``MAYAN_SETTINGS_MODULE``
|
||||
|
||||
Optional. Allows loading an alternate settings file.
|
||||
|
||||
|
||||
``MAYAN_DATABASE_CONN_MAX_AGE``
|
||||
|
||||
Amount in seconds to keep a database connection alive. Allow reuse of database
|
||||
connections. For more information read the pertinent Django documentation
|
||||
page: `Settings, CONN_MAX_AGE`_
|
||||
|
||||
.. _Settings, CONN_MAX_AGE: https://docs.djangoproject.com/en/1.10/ref/settings/#conn-max-age
|
||||
|
||||
|
||||
``MAYAN_SETTINGS_FILE``
|
||||
|
||||
Optional. Previously only the ``local.py`` file was the only settings file
|
||||
available to allow users to make configuration changes to their installations.
|
||||
Now with this environment variable, users are free to create multiple settings
|
||||
files and tell the Mayan EDMS container which setting file to import. The
|
||||
only requirement is that the setting file starts with a global import of
|
||||
``mayan.settings.production``. In the form::
|
||||
|
||||
from mayan.settings.production import *
|
||||
|
||||
|
||||
``MAYAN_GUNICORN_WORKERS``
|
||||
|
||||
Optional. This environment variable controls the number of frontend workers
|
||||
that will be executed. If not specified the default is 2. For heavier loads,
|
||||
user a higher number. A formula recommended for this setting is the number
|
||||
of CPU cores + 1.
|
||||
|
||||
Accessing outside data
|
||||
======================
|
||||
|
||||
To use Mayan EDMS's staging folders or watch folders from Docker, the data
|
||||
for these source must be made accessible to the container. This is done by
|
||||
mounting the folders in the host computer to folders inside the container.
|
||||
This is necessary because Docker containers do not have access to host data
|
||||
on purpose. For example, to make a folder in the host accessible as a watch
|
||||
folder, add the following to the Docker command line when starting the
|
||||
container::
|
||||
|
||||
-v /opt/scanned_files:/srv/watch_folder
|
||||
|
||||
The command line would look like this::
|
||||
|
||||
docker run ... -v /opt/scanned_files:/srv/watch_folder mayanedms/mayanedms:latest
|
||||
|
||||
Now create a watch folder in Mayan EDMS using the path ``/srv/watch_folder``
|
||||
and the documents from the host folder ``/opt/scanned_files`` will be
|
||||
automatically available. Use the same procedure to mount host folders to be
|
||||
used as staging folderes. In this example ``/srv/watch_folder`` was as the
|
||||
container directory, but any path can be used as long as it is not an
|
||||
already existing path or a path used by any other program.
|
||||
|
||||
|
||||
Performing backups
|
||||
==================
|
||||
|
||||
To backup the existing data, stop the image and copy the content of the volume.
|
||||
For the example::
|
||||
|
||||
docker run -d --name mayan-edms --restart=always -p 80:8000 \
|
||||
-v /docker-volumes/mayan:/var/lib/mayan \
|
||||
-v /opt/scanned_files:/srv/watch_folder mayanedms/mayanedms:latest
|
||||
|
||||
That would be the ``/docker-volumes/mayan folder``::
|
||||
|
||||
sudo tar -zcvf backup.tar.gz /docker-volumes/mayan
|
||||
sudo chown `whoami` backup.tar.gz
|
||||
|
||||
If using an external PostgreSQL or MySQL database or database containers, these
|
||||
too need to be backed up using their respective procedures. A simple solution
|
||||
is to copy the entire database container volume after the container has
|
||||
been stopped.
|
||||
|
||||
Restoring from a backup
|
||||
=======================
|
||||
|
||||
Uncompress the backup archive in the original docker volume using::
|
||||
|
||||
sudo tar -xvzf backup.tar.gz -C /
|
||||
|
||||
Upgrading
|
||||
=========
|
||||
|
||||
Upgrading a Mayan EDMS Docker container is actually a matter of stopping and
|
||||
deleting the container, downloading the most recent version of the image and
|
||||
starting a container again. The container will take care of updating the
|
||||
database structure to the newest version if necessary.
|
||||
|
||||
**IMPORTANT!** Do not delete the volume storing the data, only the container.
|
||||
|
||||
Stop the container to be upgraded::
|
||||
|
||||
docker stop mayan-edms
|
||||
|
||||
|
||||
Remove the container::
|
||||
|
||||
docker rm mayan-edms
|
||||
|
||||
|
||||
Pull the new image version::
|
||||
|
||||
docker pull mayanedms/mayanedms:latest
|
||||
|
||||
|
||||
Start the container again with the new image version::
|
||||
|
||||
docker run -d --name mayan-edms --restart=always -p 80:8000 -v /docker-volumes/mayan:/var/lib/mayan mayanedms/mayanedms:latest
|
||||
|
||||
Building the image
|
||||
==================
|
||||
|
||||
Clone the repository with::
|
||||
|
||||
git clone https://gitlab.com/mayan-edms/mayan-edms.git
|
||||
|
||||
Change to the directory of the cloned repository::
|
||||
|
||||
cd mayan-edms
|
||||
|
||||
Execute Docker's build command using the provided makefile::
|
||||
|
||||
make docker-build
|
||||
|
||||
Or using an apt cacher to speed up the build::
|
||||
|
||||
make docker-build-with-proxy APT_PROXY=172.17.0.1:3142
|
||||
|
||||
Replace the IP address `172.17.0.1` with the IP address of the computer
|
||||
running the APT proxy and caching service.
|
||||
|
||||
Customizing the image
|
||||
=====================
|
||||
|
||||
Simple method
|
||||
-------------
|
||||
|
||||
If you just need to add a few Ubuntu or Python packages to your installation,
|
||||
you can use the following environment variables:
|
||||
|
||||
``MAYAN_APT_INSTALLS``
|
||||
|
||||
Specifies a list of Ubuntu .deb packages to be installed via APT when the
|
||||
container is first created. The installed packages are not lost when the image
|
||||
is stopped. Example: To install the Tesseract OCR language packs for German
|
||||
and Spanish add the following in your ``docker start`` command line::
|
||||
|
||||
-e MAYAN_APT_INSTALLS="tesseract-ocr-deu tesseract-ocr-spa"
|
||||
|
||||
``MAYAN_PIP_INSTALLS``
|
||||
|
||||
Specifies a list of Python packages to be installed via ``pip``. Packages will
|
||||
be downloaded from the Python Package Index (https://pypi.python.org) by
|
||||
default.
|
||||
|
||||
Using Docker compose
|
||||
====================
|
||||
|
||||
To deploy a complete production stack using the included Docker compose file
|
||||
execute::
|
||||
|
||||
docker-compose -f docker-compose.yml up -d
|
||||
|
||||
This Docker compose file will provision four containers:
|
||||
|
||||
- Postgres as the database
|
||||
- Redis as the Celery result storage
|
||||
- RabbitMQ as the Celery broker
|
||||
- Mayan EDMS using the above service containers
|
||||
|
||||
To stop the stack use::
|
||||
|
||||
docker-compose -f docker-compose.yml stop
|
||||
|
||||
The stack will also create four volumes to store the data of each container.
|
||||
These are:
|
||||
|
||||
- mayan_app - The Mayan EDMS data container, normally called `mayan_data` when not using Docker compose.
|
||||
- mayan_broker - The broker volume, in this case RabbitMQ.
|
||||
- mayan_db - The database volume, in this case Postgres.
|
||||
- mayan_results - The celery result backend volume, in this case Redis.
|
||||
|
||||
|
||||
Nightly images
|
||||
==============
|
||||
The continious integration pipeline used for testing development builds also
|
||||
produces a resulting Docker image. These are build automatically and their
|
||||
stability is not guaranteed. They should never be used in production.
|
||||
If you want to try out the Docker images the development uses or want a sneak
|
||||
peek at the new features being worked on checkout the container registry at:
|
||||
https://gitlab.com/mayan-edms/mayan-edms/container_registry
|
||||
@@ -9,46 +9,6 @@ uploaded. It is not possible to upload documents without assigning them a
|
||||
document type. Examples of document type: **invoices**, **blueprints**,
|
||||
**receipts**.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document_type [ label = 'Document type' ];
|
||||
documents [ label = 'Documents' ];
|
||||
|
||||
document_type -> documents;
|
||||
}
|
||||
|
||||
|
||||
Examples:
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document_type [ label = 'Invoice' ];
|
||||
documents_1 [ label = 'invoice_001.pdf', width=200 ];
|
||||
documents_2 [ label = 'invoice_032.pdf', width=200 ];
|
||||
|
||||
document_type -> documents_1, documents_2;
|
||||
}
|
||||
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
document_type [ label = 'Receipts' ];
|
||||
documents_1 [ label = 'groceries_18-01-11.pdf', width=200 ];
|
||||
documents_2 [ label = 'car_payment-17-01-02.png', width=200 ];
|
||||
|
||||
document_type -> documents_1, documents_2;
|
||||
}
|
||||
|
||||
|
||||
Settings and attributes are applied to document types and documents will
|
||||
inherit those settings and attributes based on the document type they were
|
||||
assigned when uploaded into Mayan EDMS. A document can only be of one
|
||||
|
||||
@@ -121,8 +121,6 @@ A the moment no, but it is something being considered.
|
||||
|
||||
Not at the moment. When all the projects and libraries upon which Mayan is
|
||||
dependent support Python 3 then will the project move to fully support Python 3.
|
||||
Update 2018-06-04: Python 3 will be required from Django 2.0 onwards. As such
|
||||
this is now a bigger priority and the transition to Python 3 has begun.
|
||||
|
||||
**Q: The watched folder feature is not working**
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ without extension, and stored in a simple flat arrangement in a directory.
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
file [ label = 'mayan_1-1.pdf', width=120];
|
||||
document [ label = 'mayan/media/document_storage/ab6c1cfe-8a8f-4a30-96c9-f54f606b9248', width=450];
|
||||
file -> document [label = "upload"];
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Topics
|
||||
======
|
||||
Concepts
|
||||
========
|
||||
|
||||
Introductions to all the key parts of Mayan EDMS you'll need to know:
|
||||
|
||||
@@ -24,7 +24,3 @@ Introductions to all the key parts of Mayan EDMS you'll need to know:
|
||||
settings
|
||||
file_storage
|
||||
backups
|
||||
upload_wizard
|
||||
pending_work
|
||||
code_statistics
|
||||
docker
|
||||
|
||||
@@ -23,9 +23,6 @@ Example:
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
span_width = 30;
|
||||
|
||||
index [ label = 'Product sheets per year', width=180 ];
|
||||
root [ label = 'Root (Has document links? No)', width=450];
|
||||
level_2 [ label = '{{ document.metadata_value_of.product_year }} (Has document links? Yes)', width=450];
|
||||
@@ -53,8 +50,6 @@ that will be generate based on the tree template would be as follows:
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
|
||||
index [ label = 'Product sheets per year', width=180 ];
|
||||
year_1 [ label = '2001', width = 60 ];
|
||||
year_2 [ label = '2002', width = 60 ];
|
||||
@@ -94,20 +89,5 @@ via the network with network file system software like
|
||||
`Samba <https://www.samba.org/>`_ or
|
||||
`NFS <https://en.wikipedia.org/wiki/Network_File_System>`_.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
orientation = portrait
|
||||
span_width = 200;
|
||||
|
||||
index [ label = 'Product sheets per year', width=180 ];
|
||||
block_device [ height = 100, label = "Block device\n(Hard drive)", shape = flowchart.database ];
|
||||
network [ label = "Network", shape = cloud ];
|
||||
user [ label = "Users", shape = actor ];
|
||||
|
||||
index -> block_device [ label = "mirroring", fontsize = 8 ];
|
||||
block_device -> network -> user;
|
||||
}
|
||||
|
||||
Indexes and mirrored indexes are Read Only as they are generated as a result of
|
||||
prior activities like document uploads, metadata changes.
|
||||
|
||||
@@ -14,29 +14,9 @@ Hardware requirements
|
||||
Docker procedure
|
||||
----------------
|
||||
|
||||
Docker is a computer program that performs operating-system-level
|
||||
virtualization also known as containerization. It allows independent
|
||||
"containers" to run within a single Linux instance, avoiding the overhead
|
||||
of starting and maintaining virtual machines (VMs).
|
||||
|
||||
Docker can be installed using their automated script::
|
||||
|
||||
wget -qO- https://get.docker.com/ | sh
|
||||
|
||||
This installs the latest versions of Docker. If you don't want run an automated
|
||||
script follow the instructions outlined in their documentation: https://docs.docker.com/install/
|
||||
|
||||
Once the Docker installtion is finished, proceed to the link below to install
|
||||
the Docker image for Mayan EDMS.
|
||||
|
||||
Docker image chapter: :ref:`docker`
|
||||
|
||||
Direct installation
|
||||
-------------------
|
||||
|
||||
For users with knowledge of Python, Django, Ubuntu, and databases.
|
||||
|
||||
Advanced deployment chapter: :ref:`deploying`
|
||||
For the complete set of installation, configuration, upgrade, and backup
|
||||
instructions visit the Mayan EDMS Docker Hub page at:
|
||||
https://hub.docker.com/r/mayanedms/mayanedms/
|
||||
|
||||
|
||||
.. _Docker: https://www.docker.com/
|
||||
|
||||
@@ -4,10 +4,10 @@ Languages
|
||||
|
||||
The list of languages choices in the language dropdown used for documents is
|
||||
based on the current ISO 639 list. This list can be quite extensive. To reduce
|
||||
the number of languages available use the settings ``DOCUMENTS_LANGUAGE_CODES``,
|
||||
the number of languages available use the settings ``DOCUMENTS_LANGUAGE_CHOICES``,
|
||||
and set it to a nested list of abbreviations + languages names like::
|
||||
|
||||
DOCUMENTS_LANGUAGE_CODES = ('eng', 'spa')
|
||||
DOCUMENTS_LANGUAGE_CHOICES = (('eng', 'English'), ('spa', 'Spanish'))
|
||||
|
||||
|
||||
The default language to appear on the dropdown can also be configured using::
|
||||
|
||||
@@ -1,312 +0,0 @@
|
||||
============
|
||||
Pending work
|
||||
============
|
||||
|
||||
Release blockers
|
||||
----------------
|
||||
|
||||
These are errors or issues that are blocking a release.
|
||||
|
||||
- None
|
||||
|
||||
Pending work
|
||||
------------
|
||||
|
||||
These are tasks that need to be completed but are missing a dependency or
|
||||
a design decision. As more information is added to each, they should be
|
||||
converted into a MERC.
|
||||
|
||||
API
|
||||
~~~
|
||||
- User API edit view: Should not be able to add of remove groups without
|
||||
corresponding group access.
|
||||
- User group list API get & post views: Should adding a group to an user
|
||||
via the API return 201 or 200. Currently returns 201.
|
||||
- Consistent API return code for delete views without access. Some views
|
||||
return 403 other return 404.
|
||||
- Update API docstrings. The upgrade to the latest DRF broke all formatting.
|
||||
- Make views smaller. Much as much as possible to serializers.
|
||||
- Switch to ViewSets.
|
||||
- Add API filtering. Example unread notifications.
|
||||
|
||||
|
||||
Documents
|
||||
~~~~~~~~~
|
||||
- Navigating to the interactive document page image is not triggering
|
||||
the document view event.
|
||||
|
||||
|
||||
Events
|
||||
~~~~~~
|
||||
- New event: document emailed.
|
||||
|
||||
|
||||
Forms processing
|
||||
~~~~~~~~~~~~~~~~
|
||||
- Remove usage of self.cleaned_data. Use self.clean_data instead.
|
||||
|
||||
|
||||
Permissions
|
||||
~~~~~~~~~~~
|
||||
- Permission should be reciprocal. Example: To be able to add a tag to a
|
||||
document, the user must hold the tag add permission for the document
|
||||
and for the tag to be added. To be able to enable a metadata type to a
|
||||
document type, the user must hold the metadata add permissions for the
|
||||
metadata type and for the document type.
|
||||
- Edit type permissions should only grant the ability to edit the properties
|
||||
of an object. To modify its relationship with other objects a reciprocal
|
||||
permission check should be instead.
|
||||
|
||||
|
||||
Search
|
||||
~~~~~~
|
||||
- Rename SearchModel.pk to id
|
||||
|
||||
|
||||
Sources
|
||||
~~~~~~~
|
||||
- Add ACLs support to sources.
|
||||
- Provide error message/feedback when scanning from a remote scanner fails.
|
||||
- Require a permission for document types to avoid a user that has the workflow
|
||||
creation permission to attach a workflow to a document type they don't
|
||||
control.
|
||||
- Research making APIWorkflowDocumentTypeList a subclass of documents.api_views.APIDocumentTypeList
|
||||
- A POST request to APIWorkflowDocumentTypeList should require some permission
|
||||
on the document type part to avoid adding non controlled document types
|
||||
to a new workflow.
|
||||
- To transition a workflow, the transition permission is only needed for the
|
||||
workflow. Make it necesary to have the same permission for the document
|
||||
of document type.
|
||||
- To view the transition log, the workflow view permission is only needed for the
|
||||
document. Make it necesary to have the same permission for the workflow or
|
||||
for the transition and the states.
|
||||
- Render date time of scanned documents using SANE to a better output
|
||||
(like document versions).
|
||||
|
||||
|
||||
Testing
|
||||
~~~~~~~
|
||||
- Add document test mixin that creates documents types and documents
|
||||
(to be used in dynamic_search.test_api).
|
||||
- Update all API tests using self.client to just self. and the HTTP method.
|
||||
- Add test for searches for each app that uses search.
|
||||
|
||||
|
||||
UI - Frontend
|
||||
~~~~~~~~~~~~~
|
||||
- Fix menu not collapsing at the same width of nav parent.
|
||||
- Move direct CSS style from code into base.css. grep 'style' * -R. Style code in:
|
||||
|
||||
* appearance/templates/appearance/generic_list_items_subtemplate.html
|
||||
* appearance/templates/appearance/base.html
|
||||
* appearance/templates/appearance/generic_list_subtemplate.html
|
||||
* appearance/templates/navigation/generic_link_instance.html
|
||||
|
||||
- Check if location is found in partial and remove it. Avoid circular loading.
|
||||
- Add location to history after a form submit redirect.
|
||||
|
||||
|
||||
UI
|
||||
~~
|
||||
- Shift click select to seletect multiple documents.
|
||||
- During the document upload wizard and the option to double click to
|
||||
select document type and submit the form. The purpose is to speed up
|
||||
the step with less mouse travel since this is a common screen.
|
||||
- Add metadata to the Menu class to allow UI code to decide where and how
|
||||
to display each menu.
|
||||
- Reduce the facet buttons paddings.
|
||||
- Make facet action button smaller. Reduce margin-bottom.
|
||||
- Remove previous from the views.py. It is not longer used by the form's cancel button.
|
||||
|
||||
|
||||
Workflows
|
||||
~~~~~~~~~
|
||||
- Workflow trigger filters. Example: {{ document.document_type.name = 'invoice' }}
|
||||
or same UI as the smart links app. Will allow restricting the firing of workflow
|
||||
actions by an user defined filter criteria.
|
||||
- Require a permission for document types to avoid a user that has the workflow
|
||||
creation permission to attach a workflow to a document type they don't
|
||||
control.
|
||||
- Research making APIWorkflowDocumentTypeList a subclass of
|
||||
documents.api_views.APIDocumentTypeList
|
||||
- A POST request to APIWorkflowDocumentTypeList should require some permission
|
||||
on the document type part to avoid adding non controlled document types
|
||||
to a new workflow.
|
||||
- To transition a workflow, the transition permission is only needed for the
|
||||
workflow. Make it necesary to have the same permission for the document
|
||||
of document type.
|
||||
- To view the transition log, the workflow view permission is only needed for
|
||||
the document. Make it necesary to have the same permission for the workflow or
|
||||
for the transition and the states.
|
||||
|
||||
|
||||
New features
|
||||
------------
|
||||
|
||||
|
||||
API
|
||||
~~~
|
||||
- Add converter API
|
||||
- Document signatures API
|
||||
- Smart settings API
|
||||
- Use REST_API's 'mayan_permission_attribute_check' to simplify API views access checking and filtering.
|
||||
- DRF filtering using the URL query.
|
||||
|
||||
|
||||
Converter
|
||||
~~~~~~~~~
|
||||
- New zoom transformation. Resample, not just bigger final size but do
|
||||
a resize * zoom multiple before. Produces a bigger image or higher
|
||||
quality than the original.
|
||||
|
||||
|
||||
Caching
|
||||
~~~~~~~
|
||||
- Size limited caching. A new model in the common app will keep track
|
||||
of all cache files. A manager method will be provided that will
|
||||
return the cache files in other of age to be deleted.
|
||||
|
||||
|
||||
Distribution
|
||||
~~~~~~~~~~~~
|
||||
- Python based Javascript package manager. Each app specifies what
|
||||
library and version needs. The common app (or a new app) will add all
|
||||
the JS loading lines automatically so that compress can detect them.
|
||||
|
||||
|
||||
Metadata
|
||||
~~~~~~~~
|
||||
- Metadata lookup memory. Add a select2 style widget that will query a
|
||||
new metadata API endpoint that will return all used values so far.
|
||||
- Metadata validation_choices and parser_choices as static model methods
|
||||
- Metadata.api as Metadata.utils and manager
|
||||
|
||||
|
||||
Search
|
||||
~~~~~~
|
||||
- Add support for highlighting the search results in pages.
|
||||
|
||||
|
||||
Settings
|
||||
~~~~~~~~
|
||||
- Database based settings.
|
||||
|
||||
|
||||
Sources
|
||||
~~~~~~~
|
||||
- UI improvement for staging folders files selection. GitLab issue.
|
||||
|
||||
|
||||
UI
|
||||
~~
|
||||
- Upgrade to Bootstrap 4.
|
||||
- Upgrade to Flatly 4.
|
||||
- Better workflow transition UI. Instead of a dropdown show all the
|
||||
available transitions as buttons.
|
||||
|
||||
|
||||
Workflows
|
||||
~~~~~~~~~
|
||||
- Workflow trigger filters. Example: {{ document.document_type.name = 'invoice' }} or same
|
||||
UI as the smart links app. Will allow restricting the firing of workflow
|
||||
actions by an user defined filter criteria.
|
||||
- New workflow action: send email. Subject and content are templates.
|
||||
|
||||
|
||||
Other
|
||||
~~~~~
|
||||
- Python based Javascript package manager. Each app specifies what
|
||||
library and version needs. The common app (or a new app) will add all
|
||||
the JS loading lines automatically so that compress can detect them.
|
||||
- When moving documents to the trash update the message to "submitted"
|
||||
and not "moved" or "deleted" since this is handled by a task queue
|
||||
and is not immediate and doesn't delete the document.
|
||||
- When emptying the trash update the message to "submitted"
|
||||
since this is handled by a task queue and is not immediate.
|
||||
- New app that allows creating user document filters. Will provide the
|
||||
same service as the document filters class. Interface can be made
|
||||
using the template language or the same UI as the smart links.
|
||||
- Allow add queue metadata that can be exported via a management command.
|
||||
This will allow creating supervisor templates without all the worker
|
||||
entries being hardcoded.
|
||||
- Delete .gitignore files from copied packages. Include .gitignore files
|
||||
keep compiled or distributable files from being included in the main
|
||||
repository. Temporary measure until a Javascript library manager is
|
||||
added.
|
||||
- Automatically capture license information from installed Javascript
|
||||
libraries.
|
||||
- Automatically capture license information from installed Python
|
||||
packages.
|
||||
- Update celery to 4.1.0
|
||||
- Update to use the new class based views in the authentication app.
|
||||
password_change(), password_change_done(), password_reset(),
|
||||
password_reset_done(), password_reset_confirm(), and password_reset_complete()
|
||||
function-based views are deprecated in favor of new class-based views
|
||||
PasswordChangeView, PasswordChangeDoneView, PasswordResetView,
|
||||
PasswordResetDoneView, PasswordResetConfirmView, and PasswordResetCompleteView.
|
||||
- django.utils.translation.string_concat() is deprecated in favor of
|
||||
django.utils.text.format_lazy(). string_concat(strings) can be
|
||||
replaced by format_lazy('{}' x len(strings), strings).
|
||||
Found in converter/classes.py and metadata/forms.py.
|
||||
- Fix warnings in preparation for Django 2.0.
|
||||
- Update all tempfile.mkstemp() to tempfile.mkstemp(dir=setting_temporary_directory.value)
|
||||
- Get rid of common.utils.get_descriptor only used by common.utils.copyfile
|
||||
- Update common.utils.copyfile to use only file objects.
|
||||
- Change metadata label column from CharField to Label
|
||||
- Start testing to Python 3 compatibility.
|
||||
- Unify all RelationshipForms into a common class.
|
||||
- Add test for event subscription view.
|
||||
- Repeated templates: password_reset_confirm.html and password_reset_form.html
|
||||
- Remove unused text=get_notification_count from events.links
|
||||
- Reduce number of languages so dropzone view starts faster.
|
||||
- In DocumentComment model, rename comment field to text.
|
||||
- class MultipleInstanceActionMixin is deprecated. Replace views using this with
|
||||
MultipleObjectFormActionView or MultipleObjectConfirmActionView
|
||||
- Subscribe to tag events
|
||||
- Subscribe to workflow events
|
||||
- Subscribe to workflow state events
|
||||
- Link to go from event notification to view. Example document workflow notification to document workflow views.
|
||||
- Find replacement for ``python-gnupg``. Unstable & inconsistent API.
|
||||
- New app that allows creating user document filters. Will provide the
|
||||
same service as the document filters class. Interface can be made
|
||||
using the template language or the same UI as the smart links.
|
||||
- Allow add queue metadata that can be exported via a management command.
|
||||
This will allow creating supervisor templates without all the worker
|
||||
entries being hardcoded.
|
||||
- Automatically capture license information from installed Javascript
|
||||
libraries.
|
||||
- Automatically capture license information from installed Python
|
||||
packages.
|
||||
- Finish and merge improved compressed file branch.
|
||||
- Improve and merge PCL support branch.
|
||||
- Swtich to self hosted documentation.
|
||||
- Unify error logs in a common model. Fields: Datetime, namespace,
|
||||
message, content type, object id.
|
||||
- Export documents as PDF. Each document image is used to create a PDF
|
||||
dinamycally.
|
||||
- Document splitting. Only for PDF files first. A document versions
|
||||
relationship between the documents has to be designed.
|
||||
- Manually linking documents.
|
||||
- Migrate settings/base.py to Django's 1.11 format.
|
||||
- Rename model methods to use ``get_`` or ``do_``
|
||||
- Hunt TODO
|
||||
- Hunt FIXME
|
||||
- Convert SETTING_GPG_BACKEND into a setting option similar to converter and converter options.
|
||||
- Reorganize modelForms Meta class and methods.
|
||||
- Periodic messages, like notifications. Using an AJAX worker.
|
||||
- Find replacement for ``python-gnupg``. Unstable & inconsistent API.
|
||||
- Google docs integration. Upload document from Google Drive.
|
||||
- Get ``dumpdata`` and ``loaddata`` working flawlessly. Will allow for easier backups, restores and database backend migrations.
|
||||
- Add generic list ordering. ``django.views.generic.list.MultipleObjectMixin`` (https://docs.djangoproject.com/en/1.8/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin) now supports an ``ordering`` parameter.
|
||||
- Add support to convert any document to PDF. https://gitlab.mister-muffin.de/josch/img2pdf
|
||||
- Add support for combining documents.
|
||||
- Add support for splitting documents.
|
||||
- Add new document source to get documents from an URL.
|
||||
- Add support for metadata mapping files. CSV file containing filename to metadata values mapping, useful for bulk upload and migrations.
|
||||
- Add support for registering widgets to the home screen.
|
||||
- Merge mimetype and converter apps.
|
||||
- Metadata widgets (Date, time, timedate).
|
||||
- Datatime widget: https://github.com/smalot/bootstrap-datetimepicker
|
||||
- Add events for document signing app (uploaded detached signateure, signed document, deleted signature)
|
||||
- A configurable conversion process. Being able to invoke different binaries for file conversion, as opposed to the current libreoffice only solution.
|
||||
- A tool in the admin interface to mass (re)convert the files (basically the page count function, but then applied on all documents).
|
||||
@@ -10,11 +10,6 @@ that permission can exercise it throughout the entire system.
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
orientation = portrait
|
||||
default_shape = roundedbox
|
||||
span_width = 240;
|
||||
span_height = 100;
|
||||
|
||||
user [ label = 'Users' ];
|
||||
group [ label = 'Groups' ];
|
||||
role [ label = 'Roles' ];
|
||||
|
||||
74
docs/topics/roadmap.rst
Normal file
74
docs/topics/roadmap.rst
Normal file
@@ -0,0 +1,74 @@
|
||||
=======
|
||||
Roadmap
|
||||
=======
|
||||
|
||||
- Workflow:
|
||||
|
||||
- Improve workflow system
|
||||
- Workflow actions. Predefined actions to be execute on document leaving or entering a state or a transition. Example: "Add to folder X", "Attach tag X".
|
||||
- Add support for state recipients.
|
||||
- Add workflow document inbox notification.
|
||||
|
||||
- Indexing
|
||||
|
||||
- Replace indexing and smart linking template language (use Jinja2 instead of Django's).
|
||||
|
||||
- Distribution:
|
||||
|
||||
- Debian packages. Limited success so far using https://github.com/astraw/stdeb.
|
||||
|
||||
- Notifications:
|
||||
|
||||
- Add support for subscribing to a document's events.
|
||||
- Add support for subscribing to a document type events.
|
||||
- Add support for subscribing specific events.
|
||||
|
||||
- OCR:
|
||||
|
||||
- Add image preprocessing for OCR. Increase effectiveness of Tesseract.
|
||||
|
||||
- Python 3:
|
||||
|
||||
- Complete support for Python3.
|
||||
- Find replacement for pdfminer (Python3 support blocker). Use pdfminer.six (#257).
|
||||
|
||||
- Simple serving:
|
||||
|
||||
- Provide option to serve Mayan EDMS without a webserver (using Tornado o similar). Work started in branch: ``/feature/tornado``
|
||||
|
||||
- Upload wizard:
|
||||
|
||||
- Make wizard step configurable. Create ``WirzardStep`` class so apps can add their own upload wizard steps, instead of the steps being hardcoded in the sources app.
|
||||
- Add upload wizard step to add the new documents to a folder.
|
||||
|
||||
- Other
|
||||
|
||||
- Use a sequence and not the document upload date to determine the document version sequence. MySQL doesn't store milisecond value in dates and if several version are uploaded in a single second there is no way to know the order or which one is the latests. This is why the document version tests include a 2 second delay. Possible solution: http://schinckel.net/2015/05/17/django-second-autofield/
|
||||
- Include external app Mayan-EXIF into main code.
|
||||
- Convert all views from functions to class based views (CBV).
|
||||
- Increase test coverage.
|
||||
- Mock external services in tests. For example the ``django_GPG`` app key search and receive tests.
|
||||
- Pluggable icon app. Make switching icon set easier.
|
||||
- Reduce dependency on binary executables for a default install.
|
||||
- Find replacement for ``cssmin`` & ``django-compressor``.
|
||||
- Find replacement for ``python-gnupg``. Unstable & inconsistent API.
|
||||
- Google docs integration. Upload document from Google Drive.
|
||||
- Get ``dumpdata`` and ``loaddata`` working flawlessly. Will allow for easier backups, restores and database backend migrations.
|
||||
- Add generic list ordering. ``django.views.generic.list.MultipleObjectMixin`` (https://docs.djangoproject.com/en/1.8/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin) now supports an ``ordering`` parameter.
|
||||
- Add support to convert any document to PDF. https://gitlab.mister-muffin.de/josch/img2pdf
|
||||
- Add support for combining documents.
|
||||
- Add support for splitting documents.
|
||||
- Add new document source to get documents from an URL.
|
||||
- Document overlay support. Such as watermarks. https://gist.github.com/umrashrf/8616550
|
||||
- Add support for metadata mapping files. CSV file containing filename to metadata values mapping, useful for bulk upload and migrations.
|
||||
- Add support for registering widgets to the home screen.
|
||||
- Merge mimetype and converter apps.
|
||||
- Add GPG key generation.
|
||||
- If SourceColumn label is None take description from model. Avoid unnecessary translatable strings.
|
||||
- Metadata widgets (Date, time, timedate).
|
||||
- Datatime widget: https://github.com/smalot/bootstrap-datetimepicker
|
||||
- Separate Event class instances with a parent namespace class: EventNamespace.
|
||||
- Add events for document signing app (uploaded detached signateure, signed document, deleted signature)
|
||||
- A configurable conversion process. Being able to invoke different binaries for file conversion, as opposed to the current libreoffice only solution.
|
||||
- A tool in the admin interface to mass (re)convert the files (basically the page count function, but then applied on all documents).
|
||||
- Find solution so that documents in watched folders are not processed until they are ready. Use case scanning directly to scanned folders.
|
||||
@@ -2,77 +2,17 @@
|
||||
Settings
|
||||
========
|
||||
|
||||
Mayan EDMS can be configure via environment variables or by setting files.
|
||||
When Mayan EDMS is initially installed a ``local.py`` file is created inside the
|
||||
``/mayan/settings/`` folder. So if you installed Mayan EDMS according to the
|
||||
instructions provided in this documentation your ``local.py`` should be located in
|
||||
the directory: ``/usr/share/mayan-edms/mayan/settings/local.py``.
|
||||
|
||||
Via environment variables
|
||||
=========================
|
||||
For a list of all the configuration options, go to "Setup" then "Settings" on
|
||||
your browser. This is also a good place to check if your overrided setting
|
||||
option value in your ``local.py`` file is being interpreted correctly.
|
||||
|
||||
To use environment variables, lookup the name of the setting you want to
|
||||
override in the "Settings" menu. The "Settings" menu is located inside the
|
||||
"Setup" main menu. To pass a value via an environment variable append
|
||||
``"MAYAN_"`` to the name of the settings option. For example, to change
|
||||
the number of documents displayed per page (COMMON_PAGINATE_BY, by default 40),
|
||||
use::
|
||||
Settings can also be changed via environment variables by prepending the string
|
||||
"MAYAN_" to the configuration name. For example, to change the number of documents
|
||||
displayed per page (COMMON_PAGINATE_BY, by default 40), use::
|
||||
|
||||
export MAYAN_COMMON_PAGINATE_BY=10
|
||||
|
||||
Restart Mayan EDMS and the new value will take effect. The "Settings" menu
|
||||
can be used to verify if the overrided setting value is being interpreted
|
||||
correctly.
|
||||
|
||||
Via settings files
|
||||
==================
|
||||
|
||||
Another way to configure Mayan EDMS is via Python-style, settings files.
|
||||
If Mayan EDMS was installed using the Python package a ``mayan_settings``
|
||||
folder will created for this purpose. If you installed Mayan EDMS
|
||||
according to the :ref:`deploying` instructions provided in this
|
||||
documentation your ``mayan_settings`` folder should be located in the directory:
|
||||
``/usr/share/mayan-edms/mayan/media/mayan_settings``.
|
||||
|
||||
If Mayan EDMS was installed using Docker, the ``mayan_settings`` folder
|
||||
will be found inside the install Docker volume. If you installed Mayan EDMS
|
||||
according to the :ref:`docker` instructions provided in this documentation
|
||||
your ``mayan_settings`` folder should be located in the directory:
|
||||
``/docker-volumes/mayan/mayan_settings``.
|
||||
|
||||
Create a file with any valid name and a ``.py`` extension in the
|
||||
``mayan_settings`` folder. The file must starts with a global import of
|
||||
``mayan.settings.production``. In the form::
|
||||
|
||||
from mayan.settings.production import *
|
||||
|
||||
Now add the corresponding lines to override the default settings.
|
||||
In the settings file, it is not necesary to prepend the string ``MAYAN_`` to
|
||||
the setting option. For example, to change the number of documents displayed
|
||||
per page (COMMON_PAGINATE_BY, by default 40),
|
||||
use::
|
||||
|
||||
COMMON_PAGINATE_BY=10
|
||||
|
||||
versus::
|
||||
|
||||
export MAYAN_COMMON_PAGINATE_BY=10
|
||||
|
||||
when using the environment variable method.
|
||||
|
||||
For this example let's assume the file was saved with the name ``mysettings.py``.
|
||||
|
||||
The way used to tell Mayan EDMS to import this file will vary based on the
|
||||
installation method.
|
||||
|
||||
For the :ref:`deploying` method, the full import path will be
|
||||
``mayan.media.mayan_settings.mysettings`` and can be passed via the
|
||||
``--settings`` command line argument like this::
|
||||
|
||||
python manage.py runserver --settings=mayan.media.mayan_settings.mysettings
|
||||
|
||||
or via the ``DJANGO_SETTINGS_MODULE`` environment variable like this::
|
||||
|
||||
export DJANGO_SETTINGS_MODULE=mayan.media.mayan_settings.mysettings
|
||||
|
||||
For the :ref:`docker` installation method, the full import path will be
|
||||
``mayan_settings.mysettings`` and can only be passed via the
|
||||
``MAYAN_SETTINGS_MODULE`` environment variable like this::
|
||||
|
||||
docker run <...> -e MAYAN_SETTINGS_MODULE=mayan_settings.mysettings
|
||||
MAYAN_COMMON_PAGINATE_BY=10
|
||||
|
||||
@@ -8,25 +8,6 @@ uploaded, this signature is readily detected as part of the document
|
||||
inspection step. The status of the signature can be verified by accessing the
|
||||
signatures sections of a document.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
orientation = portrait
|
||||
span_width = 240;
|
||||
|
||||
user [ shape = "actor" ];
|
||||
key [ shape = flowchart.database, label = "Key" ];
|
||||
document [ shape = "note", label = "Document" ];
|
||||
document_signed [ label = "Signed\nDocument" ];
|
||||
|
||||
|
||||
key -> user -> document -> document_signed;
|
||||
}
|
||||
|
||||
Signed documents are tamper-proof. That means that if any part of the document's
|
||||
file is edited (even just one character or one pixel), the document's
|
||||
signature becomes invalid alerting that an unathorized change has ocurred.
|
||||
|
||||
Existing non signed documents can be signed in one of two ways:
|
||||
by downloading the document, signing it, and uploading the signed document
|
||||
as a new version of the existing one or by creating a detached signature for
|
||||
@@ -40,6 +21,6 @@ keys no longer needed can also be deleted from this menu.
|
||||
|
||||
Only `GNU Privacy Guard`_ signatures are support at the moment.
|
||||
|
||||
Only version 1 of `GNU Privacy Guard`_ is supported at the moment.
|
||||
Only version 1 of `GNU Privacy Guard`_ is supported for now.
|
||||
|
||||
.. _`GNU Privacy Guard`: www.gnupg.org/
|
||||
|
||||
@@ -31,27 +31,6 @@ The current document sources supported are:
|
||||
when the quality of the scans is irrelevant or when they will be known
|
||||
to be of good quality, such as when receiving e-faxes as PDFs.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
mayan [shape = "roundedbox", label = "Mayan EDMS" ];
|
||||
email_pop3 [shape = "mail", label = "e-mail (POP3)"];
|
||||
email_imap [shape = "mail", label = "e-mail (IMAP)"];
|
||||
staging [shape = "flowchart.database", label = "Staging folder" ];
|
||||
watch [shape = "flowchart.database", label = "Watch folder" ];
|
||||
automatic [shape = "box", label = "Automatic\n(via schedule)" ];
|
||||
manual [shape = "actor", height=60, label = "Manual\n(user interaction)" ];
|
||||
web [shape = "note", label = "Webform upload" ];
|
||||
|
||||
automatic -> mayan;
|
||||
email_pop3 -> automatic;
|
||||
email_imap -> automatic;
|
||||
watch -> automatic;
|
||||
manual -> mayan;
|
||||
staging -> manual;
|
||||
web -> manual;
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
=============
|
||||
Upload wizard
|
||||
=============
|
||||
|
||||
The steps needed to upgrade a document using form-tools' ``SessionWizard``
|
||||
were hardcoded in the ``source`` app. This made it very difficult to add or remove
|
||||
wizard steps.
|
||||
|
||||
The steps of the wizard are now defined by a new class called
|
||||
``sources.wizard.WizardStep``. The existing steps to select a document type,
|
||||
enter metadata and tag the document, have been converted to function as
|
||||
``WizardSteps`` subclasses. The converted steps now live in
|
||||
|
||||
``sources.wizards.WizardStepDocumentType``, ``tag.wizard_steps.WizardStepTags``,
|
||||
and ``metadata.wizard_steps.WizardStepMetadata``.
|
||||
|
||||
The steps need to define the following methods:
|
||||
|
||||
- ``done``: This method is execute when the wizard finished the last step
|
||||
an enter the step where the actual file are uploaded. This steps is used
|
||||
to encode form data into the URL query string that will be passed to the
|
||||
document upload view for each file uploaded.
|
||||
|
||||
- ``condition``: This method is used to display the step conditionally.
|
||||
If this method return True it will be displayed during the upload wizard
|
||||
execution. To skip the step, return False or None.
|
||||
|
||||
- ``get_form_initial``: This method is used to return the initial data
|
||||
for the step form. Use this method to set up initial values for the step's
|
||||
form fields.
|
||||
|
||||
- ``step_post_upload_process``: This method will be executed once the
|
||||
document finishes uploading. Use this method to process the information
|
||||
encoded in the URL querystring by the step's `done`` method.
|
||||
|
||||
Once the ``WizardStep`` subclass is defined, it needs to be registered. This
|
||||
is done by calling the ``.register`` method of the ``WizardStep`` class with
|
||||
the subclass as the argument. Example::
|
||||
|
||||
WizardStep.register(WizardStepMetadata)
|
||||
|
||||
This statement must be located after the subclass definition. Finally,
|
||||
the module defining the wizard step must be imported so that it is loaded
|
||||
with the rest of the code and enabled. The best place to do this is in the
|
||||
``.ready`` method of the apps' ``apps.py`` module. Example::
|
||||
|
||||
class TagsApp(MayanAppConfig):
|
||||
has_rest_api = True
|
||||
has_tests = True
|
||||
name = 'tags'
|
||||
verbose_name = _('Tags')
|
||||
|
||||
def ready(self):
|
||||
super(TagsApp, self).ready()
|
||||
from actstream import registry
|
||||
|
||||
from .wizard_steps import WizardStepTags # NOQA
|
||||
|
||||
The ``WizardStep`` class also allows for unregistering existing steps. This
|
||||
is accomplished by calling the ``.deregister`` method of the ``WizardStep``
|
||||
class and passing the subclass as the argument. This method should
|
||||
also be called inside the ``.ready`` method of an apps' ``apps.py``
|
||||
module. Example::
|
||||
|
||||
|
||||
class TagsApp(MayanAppConfig):
|
||||
has_rest_api = True
|
||||
has_tests = True
|
||||
name = 'tags'
|
||||
verbose_name = _('Tags')
|
||||
|
||||
def ready(self):
|
||||
super(TagsApp, self).ready()
|
||||
from actstream import registry
|
||||
|
||||
from metadata.wizard_steps import WizardStepMetadata # NOQA
|
||||
from sources.wizards import WizardStep # NOQA
|
||||
from .wizard_steps import WizardStepTags # NOQA
|
||||
|
||||
WizardStep.deregister(WizardStepTags)
|
||||
|
||||
|
||||
This will cause the tags assigment step to not be assigned to the upload
|
||||
wizard anymore.
|
||||
@@ -8,41 +8,5 @@ version changes in comparison with the previous one. If a new version was
|
||||
uploaded by mistake or such new version is no longer necessary the option to
|
||||
revert to a previous version of the document is provided.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
orientation = portrait
|
||||
node_width = 200;
|
||||
version_1 [ label = "Version 1" ];
|
||||
version_2 [ label = "Version 2" ];
|
||||
document_1 [ label = "payroll_report.pdf" ];
|
||||
document_2 [ label = "payroll_report_fixed.pdf" ];
|
||||
upload_1 [ label = "payroll_report.pdf" ];
|
||||
upload_2 [ label = "payroll_report_fixed.pdf" ];
|
||||
|
||||
upload_1 -> version_1 -> document_1;
|
||||
upload_2 -> version_2 -> document_2;
|
||||
document_1 -> document_2;
|
||||
}
|
||||
|
||||
Only the interactive document sources (:doc:`sources`) (``Web`` and ``Staging folders``) are
|
||||
available to upload new document versions.
|
||||
|
||||
There is no limit to the number of versions a document can have.
|
||||
|
||||
.. blockdiag::
|
||||
|
||||
blockdiag {
|
||||
default_shape = roundedbox
|
||||
orientation = portrait
|
||||
node_width = 200;
|
||||
|
||||
document [ label = "payroll_report.pdf" ];
|
||||
versions [ label = "Versions", stacked ];
|
||||
|
||||
document -> versions;
|
||||
}
|
||||
|
||||
By default, the last version will be showed when working with the document
|
||||
but any of the versions can be inspected and viewed.
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
__title__ = 'Mayan EDMS'
|
||||
__version__ = '3.0rc1'
|
||||
__build__ = 0x030000
|
||||
__version__ = '2.7.2'
|
||||
__build__ = 0x020702
|
||||
__author__ = 'Roberto Rosario'
|
||||
__author_email__ = 'roberto.rosario@mayan-edms.com'
|
||||
__description__ = 'Free Open Source Electronic Document Management System'
|
||||
__license__ = 'Apache 2.0'
|
||||
__copyright_short__ = '2011-2018 Roberto Rosario'
|
||||
__copyright__ = '{} {}'.format('Copyright', __copyright_short__)
|
||||
__website__ = 'https://www.mayan-edms.com'
|
||||
|
||||
__copyright__ = 'Copyright 2011-2016 Roberto Rosario'
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from rest_framework import generics
|
||||
|
||||
from permissions import Permission
|
||||
|
||||
from .models import AccessControlList
|
||||
from .permissions import permission_acl_edit, permission_acl_view
|
||||
from .serializers import (
|
||||
@@ -15,10 +18,13 @@ from .serializers import (
|
||||
|
||||
|
||||
class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
"""
|
||||
get: Returns a list of all the object's access control lists
|
||||
post: Create a new access control list for the selected object.
|
||||
"""
|
||||
def get(self, *args, **kwargs):
|
||||
"""
|
||||
Returns a list of all the object's access control lists
|
||||
"""
|
||||
|
||||
return super(APIObjectACLListView, self).get(*args, **kwargs)
|
||||
|
||||
def get_content_object(self):
|
||||
content_type = get_object_or_404(
|
||||
ContentType, app_label=self.kwargs['app_label'],
|
||||
@@ -34,10 +40,14 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
else:
|
||||
permission_required = permission_acl_edit
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_required, user=self.request.user,
|
||||
obj=content_object
|
||||
)
|
||||
try:
|
||||
Permission.check_permissions(
|
||||
self.request.user, permissions=(permission_required,)
|
||||
)
|
||||
except PermissionDenied:
|
||||
AccessControlList.objects.check_access(
|
||||
permission_required, self.request.user, content_object
|
||||
)
|
||||
|
||||
return content_object
|
||||
|
||||
@@ -48,21 +58,13 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
"""
|
||||
Extra context provided to the serializer class.
|
||||
"""
|
||||
context = super(APIObjectACLListView, self).get_serializer_context()
|
||||
if self.kwargs:
|
||||
context.update(
|
||||
{
|
||||
'content_object': self.get_content_object(),
|
||||
}
|
||||
)
|
||||
|
||||
return context
|
||||
|
||||
def get_serializer(self, *args, **kwargs):
|
||||
if not self.request:
|
||||
return None
|
||||
|
||||
return super(APIObjectACLListView, self).get_serializer(*args, **kwargs)
|
||||
return {
|
||||
'content_object': self.get_content_object(),
|
||||
'format': self.format_kwarg,
|
||||
'request': self.request,
|
||||
'view': self
|
||||
}
|
||||
|
||||
def get_serializer_class(self):
|
||||
if self.request.method == 'GET':
|
||||
@@ -70,14 +72,31 @@ class APIObjectACLListView(generics.ListCreateAPIView):
|
||||
else:
|
||||
return WritableAccessControlListSerializer
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
"""
|
||||
Create a new access control list for the selected object.
|
||||
"""
|
||||
|
||||
return super(APIObjectACLListView, self).post(*args, **kwargs)
|
||||
|
||||
|
||||
class APIObjectACLView(generics.RetrieveDestroyAPIView):
|
||||
"""
|
||||
delete: Delete the selected access control list.
|
||||
get: Returns the details of the selected access control list.
|
||||
"""
|
||||
serializer_class = AccessControlListSerializer
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
"""
|
||||
Delete the selected access control list.
|
||||
"""
|
||||
|
||||
return super(APIObjectACLView, self).delete(*args, **kwargs)
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
"""
|
||||
Returns the details of the selected access control list.
|
||||
"""
|
||||
|
||||
return super(APIObjectACLView, self).get(*args, **kwargs)
|
||||
|
||||
def get_content_object(self):
|
||||
if self.request.method == 'GET':
|
||||
permission_required = permission_acl_view
|
||||
@@ -93,10 +112,14 @@ class APIObjectACLView(generics.RetrieveDestroyAPIView):
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
)
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_required, user=self.request.user,
|
||||
obj=content_object
|
||||
)
|
||||
try:
|
||||
Permission.check_permissions(
|
||||
self.request.user, permissions=(permission_required,)
|
||||
)
|
||||
except PermissionDenied:
|
||||
AccessControlList.objects.check_access(
|
||||
permission_required, self.request.user, content_object
|
||||
)
|
||||
|
||||
return content_object
|
||||
|
||||
@@ -105,10 +128,15 @@ class APIObjectACLView(generics.RetrieveDestroyAPIView):
|
||||
|
||||
|
||||
class APIObjectACLPermissionListView(generics.ListCreateAPIView):
|
||||
"""
|
||||
get: Returns the access control list permission list.
|
||||
post: Add a new permission to the selected access control list.
|
||||
"""
|
||||
def get(self, *args, **kwargs):
|
||||
"""
|
||||
Returns the access control list permission list.
|
||||
"""
|
||||
|
||||
return super(
|
||||
APIObjectACLPermissionListView, self
|
||||
).get(*args, **kwargs)
|
||||
|
||||
def get_acl(self):
|
||||
return get_object_or_404(
|
||||
self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
@@ -124,22 +152,20 @@ class APIObjectACLPermissionListView(generics.ListCreateAPIView):
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
)
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_acl_view, user=self.request.user,
|
||||
obj=content_object
|
||||
)
|
||||
try:
|
||||
Permission.check_permissions(
|
||||
self.request.user, permissions=(permission_acl_view,)
|
||||
)
|
||||
except PermissionDenied:
|
||||
AccessControlList.objects.check_access(
|
||||
permission_acl_view, self.request.user, content_object
|
||||
)
|
||||
|
||||
return content_object
|
||||
|
||||
def get_queryset(self):
|
||||
return self.get_acl().permissions.all()
|
||||
|
||||
def get_serializer(self, *args, **kwargs):
|
||||
if not self.request:
|
||||
return None
|
||||
|
||||
return super(APIObjectACLPermissionListView, self).get_serializer(*args, **kwargs)
|
||||
|
||||
def get_serializer_class(self):
|
||||
if self.request.method == 'GET':
|
||||
return AccessControlListPermissionSerializer
|
||||
@@ -147,25 +173,45 @@ class APIObjectACLPermissionListView(generics.ListCreateAPIView):
|
||||
return WritableAccessControlListPermissionSerializer
|
||||
|
||||
def get_serializer_context(self):
|
||||
context = super(APIObjectACLPermissionListView, self).get_serializer_context()
|
||||
if self.kwargs:
|
||||
context.update(
|
||||
{
|
||||
'acl': self.get_acl(),
|
||||
}
|
||||
)
|
||||
return {
|
||||
'acl': self.get_acl(),
|
||||
'format': self.format_kwarg,
|
||||
'request': self.request,
|
||||
'view': self
|
||||
}
|
||||
|
||||
return context
|
||||
def post(self, *args, **kwargs):
|
||||
"""
|
||||
Add a new permission to the selected access control list.
|
||||
"""
|
||||
|
||||
return super(
|
||||
APIObjectACLPermissionListView, self
|
||||
).post(*args, **kwargs)
|
||||
|
||||
|
||||
class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
|
||||
"""
|
||||
delete: Remove the permission from the selected access control list.
|
||||
get: Returns the details of the selected access control list permission.
|
||||
"""
|
||||
lookup_url_kwarg = 'permission_pk'
|
||||
serializer_class = AccessControlListPermissionSerializer
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
"""
|
||||
Remove the permission from the selected access control list.
|
||||
"""
|
||||
|
||||
return super(
|
||||
APIObjectACLPermissionView, self
|
||||
).delete(*args, **kwargs)
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
"""
|
||||
Returns the details of the selected access control list permission.
|
||||
"""
|
||||
|
||||
return super(
|
||||
APIObjectACLPermissionView, self
|
||||
).get(*args, **kwargs)
|
||||
|
||||
def get_acl(self):
|
||||
return get_object_or_404(
|
||||
self.get_content_object().acls, pk=self.kwargs['pk']
|
||||
@@ -181,10 +227,14 @@ class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
|
||||
content_type.model_class(), pk=self.kwargs['object_pk']
|
||||
)
|
||||
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=permission_acl_view, user=self.request.user,
|
||||
obj=content_object
|
||||
)
|
||||
try:
|
||||
Permission.check_permissions(
|
||||
self.request.user, permissions=(permission_acl_view,)
|
||||
)
|
||||
except PermissionDenied:
|
||||
AccessControlList.objects.check_access(
|
||||
permission_acl_view, self.request.user, content_object
|
||||
)
|
||||
|
||||
return content_object
|
||||
|
||||
@@ -192,12 +242,9 @@ class APIObjectACLPermissionView(generics.RetrieveDestroyAPIView):
|
||||
return self.get_acl().permissions.all()
|
||||
|
||||
def get_serializer_context(self):
|
||||
context = super(APIObjectACLPermissionView, self).get_serializer_context()
|
||||
if self.kwargs:
|
||||
context.update(
|
||||
{
|
||||
'acl': self.get_acl(),
|
||||
}
|
||||
)
|
||||
|
||||
return context
|
||||
return {
|
||||
'acl': self.get_acl(),
|
||||
'format': self.format_kwarg,
|
||||
'request': self.request,
|
||||
'view': self
|
||||
}
|
||||
|
||||
@@ -4,12 +4,12 @@ from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common import MayanAppConfig, menu_object, menu_sidebar
|
||||
from navigation import SourceColumn
|
||||
from rest_api.classes import APIEndPoint
|
||||
|
||||
from .links import link_acl_create, link_acl_delete, link_acl_permissions
|
||||
|
||||
|
||||
class ACLsApp(MayanAppConfig):
|
||||
has_rest_api = True
|
||||
has_tests = True
|
||||
name = 'acls'
|
||||
verbose_name = _('ACLs')
|
||||
@@ -17,15 +17,17 @@ class ACLsApp(MayanAppConfig):
|
||||
def ready(self):
|
||||
super(ACLsApp, self).ready()
|
||||
|
||||
APIEndPoint(app=self, version_string='1')
|
||||
|
||||
AccessControlList = self.get_model('AccessControlList')
|
||||
|
||||
SourceColumn(
|
||||
source=AccessControlList, label=_('Role'), attribute='role'
|
||||
)
|
||||
SourceColumn(
|
||||
source=AccessControlList, label=_('Permissions'),
|
||||
attribute='get_permission_titles'
|
||||
)
|
||||
SourceColumn(
|
||||
source=AccessControlList, label=_('Role'), attribute='role'
|
||||
)
|
||||
|
||||
menu_object.bind_links(
|
||||
links=(link_acl_permissions, link_acl_delete),
|
||||
|
||||
@@ -56,7 +56,7 @@ class ModelPermission(object):
|
||||
|
||||
permissions = []
|
||||
|
||||
class_permissions = cls.get_for_class(klass=type(instance))
|
||||
class_permissions = cls._registry.get(type(instance))
|
||||
|
||||
if class_permissions:
|
||||
permissions.extend(class_permissions)
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from appearance.classes import Icon
|
||||
|
||||
icon_acl_list = Icon(driver_name='fontawesome', symbol='lock')
|
||||
@@ -5,7 +5,6 @@ from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from navigation import Link
|
||||
|
||||
from .icons import icon_acl_list
|
||||
from .permissions import permission_acl_view, permission_acl_edit
|
||||
|
||||
|
||||
@@ -28,25 +27,24 @@ def get_kwargs_factory(variable_name):
|
||||
|
||||
|
||||
link_acl_delete = Link(
|
||||
args='resolved_object.pk', permissions=(permission_acl_edit,),
|
||||
permissions_related='content_object', tags='dangerous', text=_('Delete'),
|
||||
view='acls:acl_delete',
|
||||
permissions=(permission_acl_edit,), permissions_related='content_object',
|
||||
tags='dangerous', text=_('Delete'), view='acls:acl_delete',
|
||||
args='resolved_object.pk'
|
||||
)
|
||||
link_acl_list = Link(
|
||||
kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list'
|
||||
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list',
|
||||
kwargs=get_kwargs_factory('resolved_object')
|
||||
)
|
||||
link_acl_list_with_icon = Link(
|
||||
icon_class=icon_acl_list, kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list'
|
||||
icon='fa fa-lock', permissions=(permission_acl_view,), text=_('ACLs'),
|
||||
view='acls:acl_list', kwargs=get_kwargs_factory('resolved_object')
|
||||
)
|
||||
link_acl_create = Link(
|
||||
kwargs=get_kwargs_factory('resolved_object'),
|
||||
permissions=(permission_acl_edit,), text=_('New ACL'),
|
||||
view='acls:acl_create'
|
||||
view='acls:acl_create', kwargs=get_kwargs_factory('resolved_object')
|
||||
)
|
||||
link_acl_permissions = Link(
|
||||
args='resolved_object.pk', permissions=(permission_acl_edit,),
|
||||
permissions_related='content_object', text=_('Permissions'),
|
||||
view='acls:acl_permissions',
|
||||
permissions=(permission_acl_edit,), permissions_related='content_object',
|
||||
text=_('Permissions'), view='acls:acl_permissions',
|
||||
args='resolved_object.pk'
|
||||
)
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-22 13:25+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/ar/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,23 +17,23 @@ msgstr ""
|
||||
"Language: ar\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "الصلاحيات"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
@@ -42,20 +42,20 @@ msgstr ""
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "لا شيء"
|
||||
|
||||
@@ -124,12 +124,12 @@ msgstr ""
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-22 13:25+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/language/bg/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,23 +17,23 @@ msgstr ""
|
||||
"Language: bg\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Разрешения"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
@@ -42,20 +42,20 @@ msgstr ""
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "достъп вписване"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "достъп вписвания"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Няма"
|
||||
|
||||
@@ -124,12 +124,12 @@ msgstr ""
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-22 13:25+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/rosarior/mayan-edms/language/bs_BA/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,23 +17,23 @@ msgstr ""
|
||||
"Language: bs_BA\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Dozvole"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
@@ -42,20 +42,20 @@ msgstr ""
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "Pristupni unos"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "Pristupni unosi"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Nijedno"
|
||||
|
||||
@@ -124,12 +124,12 @@ msgstr ""
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-22 13:25+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Danish (http://www.transifex.com/rosarior/mayan-edms/language/da/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,23 +17,23 @@ msgstr ""
|
||||
"Language: da\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
@@ -42,20 +42,20 @@ msgstr ""
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Ingen"
|
||||
|
||||
@@ -124,12 +124,12 @@ msgstr ""
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
@@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-23 21:29+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: German (Germany) (http://www.transifex.com/rosarior/mayan-edms/language/de_DE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -20,23 +20,23 @@ msgstr ""
|
||||
"Language: de_DE\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "Zugriffsberechtigungen"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Rolle"
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Berechtigungen"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Rolle"
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr "Neue Berechtigung"
|
||||
|
||||
@@ -45,20 +45,20 @@ msgstr "Neue Berechtigung"
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "Berechtigungseintrag"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "Berechtigungseinträge"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Berechtigungen \"%(permissions)s\" zur Rolle \"%(role)s\" für \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Keine"
|
||||
|
||||
@@ -127,12 +127,12 @@ msgstr "Verfügbare Berechtigungen"
|
||||
msgid "Granted permissions"
|
||||
msgstr "Erteilte Berechtigungen"
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Deaktivierte Berechtigungen sind von einem übergeordneten Objekt vererbt."
|
||||
|
||||
|
||||
Binary file not shown.
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-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,23 +17,23 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
@@ -42,20 +42,20 @@ msgstr ""
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
@@ -124,12 +124,12 @@ msgstr ""
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
@@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-23 21:29+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:38+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -20,23 +20,23 @@ msgstr ""
|
||||
"Language: es\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "LCAs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Rol"
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Permisos"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Rol"
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "Borrar"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr "Nueva LCA"
|
||||
|
||||
@@ -45,20 +45,20 @@ msgstr "Nueva LCA"
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Acceso insuficiente para: %s"
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "Entrada de acceso"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "Entradas de acceso"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Permisos \"%(permissions)s\" para el rol \"%(role)s\" para \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Ninguno"
|
||||
|
||||
@@ -127,12 +127,12 @@ msgstr "Permisos disponibles"
|
||||
msgid "Granted permissions"
|
||||
msgstr "Permisos otorgados"
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Permisos del rol \"%(role)s\" para \"%(object)s\""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Los permisos inactivos se heredan de un objeto precedente."
|
||||
|
||||
|
||||
Binary file not shown.
@@ -3,61 +3,60 @@
|
||||
# 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
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2018-03-12 13:25+0000\n"
|
||||
"Last-Translator: Mehdi Amani <MehdiAmani@toorintan.com>\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Persian (http://www.transifex.com/rosarior/mayan-edms/language/fa/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: fa\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "دسترسی ها"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "نقش"
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "مجوزها"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "نقش"
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "حذف"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr "دسترسی جدید"
|
||||
msgstr ""
|
||||
|
||||
#: managers.py:57 managers.py:86
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "کمبود دسترسی برای: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "ورودی دسترسی"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "ورودیهای دسترسی"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "اچازه های \"%(permissions)s\" به نقش \"%(role)s\" برای \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "هیچکدام."
|
||||
|
||||
@@ -76,42 +75,42 @@ msgstr "دیدن دسترسی ها"
|
||||
#: serializers.py:24 serializers.py:132
|
||||
msgid ""
|
||||
"API URL pointing to the list of permissions for this access control list."
|
||||
msgstr "API URL اشاره گر به لیست اجازه های این دسترسی."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:57
|
||||
msgid ""
|
||||
"API URL pointing to a permission in relation to the access control list to "
|
||||
"which it is attached. This URL is different than the canonical workflow URL."
|
||||
msgstr "URL API اشاره به اجازه در رابطه با لیست کنترل دسترسی که به آن متصل است. این URL متفاوت از URL کارآفرینی کانونی است."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:87
|
||||
msgid "Primary key of the new permission to grant to the access control list."
|
||||
msgstr "کلید اولیه مجوز جدید برای اعطای لیست کنترل دسترسی."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr "این اجازه ئوجود ندارد: %s"
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:126
|
||||
msgid ""
|
||||
"Comma separated list of permission primary keys to grant to this access "
|
||||
"control list."
|
||||
msgstr "لیست مجوز از کلیدهای مجاز مجاز برای حذف این لیست کنترل دسترسی جداگانه را از یکدیگر جدا کنید."
|
||||
msgstr ""
|
||||
|
||||
#: serializers.py:138
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
msgstr "کلید اصلی نقش که این لیست کنترل دسترسی به آن متصل می شود."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:74
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr "لیست کنترل دسترسی جدید برای: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:101
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "حذف لیست دسترسی ها: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:139
|
||||
#, python-format
|
||||
@@ -126,31 +125,31 @@ msgstr "مجوزهای موجود"
|
||||
msgid "Granted permissions"
|
||||
msgstr "مجوزهای داده شده"
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "نقش\"%(role)s\" دارای اجازه برای \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "مجوزهای غیرفعال، از شیء بالاتر به ارث رسیدهاند."
|
||||
|
||||
#: workflow_actions.py:25
|
||||
msgid "Object type"
|
||||
msgstr "نوع شی"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "نوع شی که دسترسی به آن تغییر خواهد کرد."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
msgid "Object ID"
|
||||
msgstr "شناسه اشیاء"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:37
|
||||
msgid ""
|
||||
"Numeric identifier of the object for which the access will be modified."
|
||||
msgstr "شناسه عددی شئی که دسترسی به آن تغییر خواهد کرد."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
msgid "Roles"
|
||||
@@ -158,17 +157,17 @@ msgstr "نقش ها"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "نقش هایی که دسترسی به آنها تغییر خواهد کرد."
|
||||
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 "دادن دسترسی"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
msgid "Revoke access"
|
||||
msgstr "لغو دسترسی"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -5,14 +5,13 @@
|
||||
# Translators:
|
||||
# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2016-2017
|
||||
# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2015
|
||||
# Yves Dubois <ydubois@gmail.com>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2018-04-11 14:37+0000\n"
|
||||
"Last-Translator: Yves Dubois <ydubois@gmail.com>\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: French (http://www.transifex.com/rosarior/mayan-edms/language/fr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -20,64 +19,64 @@ msgstr ""
|
||||
"Language: fr\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "Droits"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Permissions"
|
||||
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Rôle"
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Autorisations"
|
||||
|
||||
#: links.py:32
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "Suppression"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr "Nouveau droit"
|
||||
|
||||
#: managers.py:57 managers.py:86
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Droits d'accès insuffisants pour : %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "Entrée d'accès"
|
||||
|
||||
#: models.py:55
|
||||
msgid "Access entry"
|
||||
msgstr "Autorisation d'accès"
|
||||
|
||||
#: models.py:56
|
||||
msgid "Access entries"
|
||||
msgstr "Autorisations d'accès"
|
||||
msgstr "Entrées d'accès"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Autorisations \"%(permissions)s\" du rôle \"%(role)s\" pour \"%(object)s\""
|
||||
msgstr "Permissions \"%(permissions)s\" du rôle \"%(role)s\" pour \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Aucun"
|
||||
|
||||
#: permissions.py:7
|
||||
msgid "Access control lists"
|
||||
msgstr "Listes de contrôle des droits d'accès"
|
||||
msgstr "Liste de contrôle des accès"
|
||||
|
||||
#: permissions.py:10
|
||||
msgid "Edit ACLs"
|
||||
msgstr "Éditer les droits"
|
||||
msgstr "Editer les droits"
|
||||
|
||||
#: permissions.py:13
|
||||
msgid "View ACLs"
|
||||
msgstr "Voir les droits"
|
||||
msgstr "voir les droits d'accès"
|
||||
|
||||
#: 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 indiquant la liste des autorisations pour cette liste de contrôle d'accès."
|
||||
|
||||
#: serializers.py:57
|
||||
msgid ""
|
||||
@@ -87,18 +86,18 @@ msgstr "URL de l'API pointant vers une autorisation en relation avec la liste de
|
||||
|
||||
#: 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 pour autoriser à la liste de contrôle d'accès."
|
||||
|
||||
#: serializers.py:111 serializers.py:187
|
||||
#, python-format
|
||||
msgid "No such permission: %s"
|
||||
msgstr "Aucune autorisation de ce genre : %s"
|
||||
msgstr "Aucune autorisation de ce genre: %s"
|
||||
|
||||
#: 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 pour autoriser à cette liste de contrôle d'accès."
|
||||
|
||||
#: serializers.py:138
|
||||
msgid "Primary keys of the role to which this access control list binds to."
|
||||
@@ -107,51 +106,51 @@ msgstr "Clés primaires du rôle auquel cette liste de contrôle d'accès se rat
|
||||
#: views.py:74
|
||||
#, python-format
|
||||
msgid "New access control lists for: %s"
|
||||
msgstr "Nouvelle liste de contrôle d'accès pour : %s"
|
||||
msgstr "Nouvelle liste de contrôle d'accès pour: %s"
|
||||
|
||||
#: views.py:101
|
||||
#, python-format
|
||||
msgid "Delete ACL: %s"
|
||||
msgstr "Supprimer le droit : %s"
|
||||
msgstr "Supprimer le droit: %s"
|
||||
|
||||
#: views.py:139
|
||||
#, python-format
|
||||
msgid "Access control lists for: %s"
|
||||
msgstr "Liste de contrôle d'accès pour : %s"
|
||||
msgstr "Liste des contrôle d'accès pour: %s"
|
||||
|
||||
#: views.py:151
|
||||
msgid "Available permissions"
|
||||
msgstr "Autorisations disponibles"
|
||||
msgstr "Permissions disponibles"
|
||||
|
||||
#: views.py:152
|
||||
msgid "Granted permissions"
|
||||
msgstr "Autorisations accordées"
|
||||
msgstr "Permissions autorisées"
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Autorisation du rôle \"%(role)s\" pour \"%(object)s\""
|
||||
msgstr "Permission du rôle \"%(role)s\" pour \"%(object)s\"@"
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Les autorisations révoquées sont héritées de l'objet parent."
|
||||
msgstr "La désactivation de permission est hérité de l'objet parent"
|
||||
|
||||
#: workflow_actions.py:25
|
||||
msgid "Object type"
|
||||
msgstr "Type d'objet"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "Type d'objet pour lequel les droits d'accès vont être modifiés."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
msgid "Object ID"
|
||||
msgstr "Identifiant de l'objet"
|
||||
msgstr ""
|
||||
|
||||
#: 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."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
msgid "Roles"
|
||||
@@ -159,17 +158,17 @@ msgstr "Rôles"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "Rôles pour lesquels les droits d'accès vont être modifiés."
|
||||
msgstr ""
|
||||
|
||||
#: 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 ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
msgid "Grant access"
|
||||
msgstr "Accorder le droit d'accès"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
msgid "Revoke access"
|
||||
msgstr "Révoquer le droit d'accès"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-22 13:25+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Hungarian (http://www.transifex.com/rosarior/mayan-edms/language/hu/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,23 +17,23 @@ msgstr ""
|
||||
"Language: hu\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "ACL-ek"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Szerepkör"
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Engedélyek"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Szerepkör"
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "Törlés"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
@@ -42,20 +42,20 @@ msgstr ""
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "Hozzáférési bejegyzés"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "Hozzáférési bejegyzések"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Semmi"
|
||||
|
||||
@@ -124,12 +124,12 @@ msgstr "Elérhető jogosúltságok"
|
||||
msgid "Granted permissions"
|
||||
msgstr "Élvezett jogosúltságok"
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Indonesian (http://www.transifex.com/rosarior/mayan-edms/language/id/)\n"
|
||||
@@ -17,23 +17,23 @@ msgstr ""
|
||||
"Language: id\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
@@ -42,20 +42,20 @@ msgstr ""
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
@@ -124,12 +124,12 @@ msgstr ""
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-23 21:29+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Italian (http://www.transifex.com/rosarior/mayan-edms/language/it/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,23 +18,23 @@ msgstr ""
|
||||
"Language: it\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "ACLs"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Ruolo"
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Permessi"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Ruolo"
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "Cancella"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr "Nuova ACL"
|
||||
|
||||
@@ -43,20 +43,20 @@ msgstr "Nuova ACL"
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "Voce di accesso"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "Voci di accesso"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
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
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Nessuna "
|
||||
|
||||
@@ -125,12 +125,12 @@ msgstr "Autorizzazioni disponibili "
|
||||
msgid "Granted permissions"
|
||||
msgstr "Autorizzazioni concesse "
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Permessi del ruolo \"%(role)s\" per \"%(object)s\""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Il permesso disabilita è ereditato dall'oggetto padre"
|
||||
|
||||
|
||||
Binary file not shown.
@@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-22 13:25+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/rosarior/mayan-edms/language/nl_NL/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -19,23 +19,23 @@ msgstr ""
|
||||
"Language: nl_NL\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "Authorisatielijsten"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Gebruikersrol"
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Permissies"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Gebruikersrol"
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "Verwijder"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr "Nieuwe authorisatielijst"
|
||||
|
||||
@@ -44,20 +44,20 @@ msgstr "Nieuwe authorisatielijst"
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "Authorisatie invoer"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "Authorisaties invoer"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
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
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Geen"
|
||||
|
||||
@@ -126,12 +126,12 @@ msgstr "Beschikbare permissies"
|
||||
msgid "Granted permissions"
|
||||
msgstr "Toegekende permissies"
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Rol \"%(role)s\" permissies voor \"%(object)s\""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr "Uitgeschakelde permissies zijn geërfd van een parent object."
|
||||
|
||||
|
||||
Binary file not shown.
@@ -3,16 +3,15 @@
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# Daniel Winiarski <daniel.winiarski.dw@gmail.com>, 2017
|
||||
# Wojtek Warczakowski <w.warczakowski@gmail.com>, 2016
|
||||
# Wojtek Warczakowski <w.warczakowski@gmail.com>, 2017-2018
|
||||
# Wojtek Warczakowski <w.warczakowski@gmail.com>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2018-01-22 19:19+0000\n"
|
||||
"Last-Translator: Wojtek Warczakowski <w.warczakowski@gmail.com>\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Polish (http://www.transifex.com/rosarior/mayan-edms/language/pl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -20,45 +19,45 @@ msgstr ""
|
||||
"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"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "Listy ACL"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Rola"
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Uprawnienia"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr "Rola"
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "Usuń"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr "Nowa lista ACL"
|
||||
|
||||
#: managers.py:57 managers.py:86
|
||||
#, python-format
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr "Niewystarczający dostęp dla: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr "Zgłoszenie dostępu"
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr "Zgłoszenia dostępu"
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr "Uprawnienia \"%(permissions)s\" dla roli \"%(role)s\" dotyczące \"%(object)s\""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Brak"
|
||||
|
||||
@@ -127,31 +126,31 @@ msgstr "Dostępne uprawnienia"
|
||||
msgid "Granted permissions"
|
||||
msgstr "Przyznane uprawnienia"
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr "Uprawnienia roli \"%(role)s\" dla obiektu \"%(object)s\""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
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"
|
||||
msgstr "Typ obiektu"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:28
|
||||
msgid "Type of the object for which the access will be modified."
|
||||
msgstr "Typ obiektu, dla którego dostęp zostanie zmodyfikowany."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:34
|
||||
msgid "Object ID"
|
||||
msgstr "ID obiektu"
|
||||
msgstr ""
|
||||
|
||||
#: 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."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:42
|
||||
msgid "Roles"
|
||||
@@ -159,17 +158,17 @@ msgstr "Role"
|
||||
|
||||
#: workflow_actions.py:44
|
||||
msgid "Roles whose access will be modified."
|
||||
msgstr "Role, których dostęp zostanie zmodyfikowany."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:51
|
||||
msgid ""
|
||||
"Permissions to grant/revoke to/from the role for the object selected above."
|
||||
msgstr "Uprawnienia do nadawania/odwoływania do/z roli dla obiektu."
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:59
|
||||
msgid "Grant access"
|
||||
msgstr "Przyznaj dostęp"
|
||||
msgstr ""
|
||||
|
||||
#: workflow_actions.py:129
|
||||
msgid "Revoke access"
|
||||
msgstr "Odwołaj dostęp"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-07 21:02-0400\n"
|
||||
"PO-Revision-Date: 2017-09-22 13:25+0000\n"
|
||||
"POT-Creation-Date: 2017-08-27 12:45-0400\n"
|
||||
"PO-Revision-Date: 2017-08-27 16:32+0000\n"
|
||||
"Last-Translator: Roberto Rosario\n"
|
||||
"Language-Team: Portuguese (http://www.transifex.com/rosarior/mayan-edms/language/pt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -17,23 +17,23 @@ msgstr ""
|
||||
"Language: pt\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps.py:15 links.py:37 links.py:41
|
||||
#: apps.py:15 links.py:35 links.py:39
|
||||
msgid "ACLs"
|
||||
msgstr "ACL's"
|
||||
|
||||
#: apps.py:23 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: apps.py:26 links.py:50 models.py:43 workflow_actions.py:48
|
||||
#: apps.py:25 links.py:48 models.py:43 workflow_actions.py:48
|
||||
msgid "Permissions"
|
||||
msgstr "Permissões"
|
||||
|
||||
#: links.py:32
|
||||
#: apps.py:29 models.py:47
|
||||
msgid "Role"
|
||||
msgstr ""
|
||||
|
||||
#: links.py:31
|
||||
msgid "Delete"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: links.py:45
|
||||
#: links.py:43
|
||||
msgid "New ACL"
|
||||
msgstr ""
|
||||
|
||||
@@ -42,20 +42,20 @@ msgstr ""
|
||||
msgid "Insufficient access for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:55
|
||||
#: models.py:54
|
||||
msgid "Access entry"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:56
|
||||
#: models.py:55
|
||||
msgid "Access entries"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:60
|
||||
#: models.py:59
|
||||
#, python-format
|
||||
msgid "Permissions \"%(permissions)s\" to role \"%(role)s\" for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: models.py:77
|
||||
#: models.py:76
|
||||
msgid "None"
|
||||
msgstr "Nenhum"
|
||||
|
||||
@@ -124,12 +124,12 @@ msgstr ""
|
||||
msgid "Granted permissions"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
#: views.py:207
|
||||
#, python-format
|
||||
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
|
||||
msgstr ""
|
||||
|
||||
#: views.py:234
|
||||
#: views.py:227
|
||||
msgid "Disabled permissions are inherited from a parent object."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user