Compare commits

..

43 Commits

Author SHA1 Message Date
Roberto Rosario
25854a0a1c Merge branch 'cherry-pick-273f94e9' into 'development'
Merge branch 'fix-context' into 'development'

See merge request !22
2017-09-07 05:14:16 +00:00
Roberto Rosario
6006fc9b74 Merge branch 'fix-context' into 'master'
Fix error in context: it must be a dict

See merge request !15
2017-09-07 05:13:42 +00:00
Roberto Rosario
57baf76a50 Add information on installing flake8's git hook.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 01:08:01 -04:00
Roberto Rosario
8385ef13b0 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

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 01:05:13 -04:00
Roberto Rosario
dd1e4cb685 Update event tests to use .id of an event instead of the .name.
The .id now also returns the namespace.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 01:01:11 -04:00
Roberto Rosario
6dcfd1b861 Ignore ProgramminError exception too while initializing the Quota model.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 01:00:31 -04:00
Roberto Rosario
d867614c1c Update requirements versions.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 00:52:42 -04:00
Roberto Rosario
6cc574e631 Fix method name typo.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 00:22:00 -04:00
Roberto Rosario
5b94d202dc Use get_object_list instead of get_queryset.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 00:13:28 -04:00
Roberto Rosario
3e7d3946f8 Don't error out when an object doesn't provide a get_absolute_url
method.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 00:12:17 -04:00
Roberto Rosario
2cbb1bc9e1 Add get_absolute_url method to document types.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 00:12:06 -04:00
Roberto Rosario
f0505db3b7 Update apps to use the new event type namespace class.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-07 00:11:25 -04:00
Roberto Rosario
39995764eb Merge remote-tracking branch 'origin/series/2.0' into development
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-09-06 23:09:54 -04:00
Roberto Rosario
d0aad4cb35 Merge branch 'feature/textfield_metadata#426' into 'development'
add migration for documentmetadata value to textfield

See merge request !20
2017-09-07 02:50:56 +00:00
Gustavo Selbach Teixeira
7abf8a7fc0 add migration for documentmetadata value to textfield 2017-09-06 08:45:11 -03:00
Roberto Rosario
fc0127c7ad Merge branch 'feature/textfield_metadata#426' into 'development'
Makes documentmetadata value a textfield

See merge request !19
2017-09-06 03:10:59 +00:00
Gustavo Selbach Teixeira
bbef5fd570 Makes documentmetadata value a textfield 2017-09-05 10:23:11 -03:00
Roberto Rosario
7a492b28f3 Merge branch 'feature/decode-base64-encoded-attachment-filename' into 'development'
Decode base64 encoded e-mail attachment filename.

See merge request !16
2017-08-15 15:58:08 +00:00
Cornelius Ludmann
abd720bf10 Test for base64 encoded e-mail attachment filename
Signed-off-by: Cornelius Ludmann <dev@cornelius-ludmann.de>
2017-08-02 14:35:11 +02:00
Cornelius Ludmann
25c1391649 Decode base64 encoded e-mail attachment filename.
According to RFC 2231 the filename of e-mail attachments can be encoded,
e.g. with base64 (for example, the Brother ADS2800W Scanner does this).

Here an example how it looks like:

Content-Disposition: attachment; filename="=?UTF-8?B?QlJXMjg1NjVBOEI5RkQyXzIwMTcwNTIzXzIzMDMzN18wMDAzMDMucGRm?="

Signed-off-by: Cornelius Ludmann <dev@cornelius-ludmann.de>
2017-08-02 13:28:43 +02:00
Roberto Rosario
95c0be45fb Remove the 'folders' app. GitLab issue #380.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:30:39 -04:00
Roberto Rosario
944ddd682b Add ACL list link with icon and use it for the document facet menu.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:27:25 -04:00
Roberto Rosario
c6bf3b00cd Fix mailing app permissions labels.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:24:36 -04:00
Roberto Rosario
bd419dc943 Add missing events app migration.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:23:42 -04:00
Roberto Rosario
70e2ca3334 Update changelog.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:22:50 -04:00
Roberto Rosario
5dd88ad690 Add ACLs link and ACLs permissions to the mailer profile model.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:20:44 -04:00
Roberto Rosario
ae57b97a1b Improve document creation via sources app to trigger
correct event.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:16:43 -04:00
Roberto Rosario
cb15e40f70 Improve mailer URL regex.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:16:04 -04:00
Roberto Rosario
01420c42dd Add support for quotas. GitLab issue #284.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:10:55 -04:00
Roberto Rosario
20e3634f5a Add support for dropdown menus for the item list view template.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:10:24 -04:00
Roberto Rosario
48fc36d54e Convert the document version list view to item view mode.
Add document version preview and thumbnail widgets.
Update the new version upload event have the version
as the target and the document as the action object.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-02 04:10:09 -04:00
Roberto Rosario
7a29b2496b Update release notes.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-01 01:20:44 -04:00
Roberto Rosario
c0407652c0 Add support for global and object event notification. GitLab issue #262.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-08-01 01:18:07 -04:00
Roberto Rosario
5083a2d261 Fix tests.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-07-29 02:13:46 -04:00
Roberto Rosario
ba1ab5d4f1 Merge remote-tracking branch 'origin/master' into development
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-07-29 01:55:42 -04:00
Roberto Rosario
17b7d6f25e Merge remote-tracking branch 'origin/master' into development 2017-07-05 16:03:50 -04:00
Roberto Rosario
ca1f674d78 Merge remote-tracking branch 'origin/master' into merge_master
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-06-07 13:56:35 -04:00
Roberto Rosario
93aeb8cffe Merge remote-tracking branch 'origin/master' into merge_master
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-05-24 15:02:36 -04:00
Roberto Rosario
8eeee5b5a4 Update the required versions of Pillow, django-compressor, django-suit,
pyocr and sh.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-05-16 23:16:28 -04:00
Roberto Rosario
6221187070 Merge branch 'development' into feature/sane_source 2017-05-12 18:06:19 -04:00
Roberto Rosario
acdc7dca48 Convert the API URL system from an App based one
to a resource based one.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-05-12 17:55:12 -04:00
Roberto Rosario
105eab0740 Add new document version list view permission. GitLab issue #379
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-05-04 01:04:53 -04:00
Roberto Rosario
b91f7f685a Incorporate @Macrobb metadata widget and content visual changes.
GitLab issue #378

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-05-04 00:42:59 -04:00
5864 changed files with 160179 additions and 180099 deletions

View File

@@ -1,10 +0,0 @@
.git
.gitignore
HISTORY.md
mayan/media
db.sqlite*
docker
!docker/etc
!docker/entrypoint.sh
./.*
docs

1
.gitignore vendored
View File

@@ -28,4 +28,3 @@ static_collected/
/mayan/media/static/
/venv/
/whoosh_index/
node_modules/

View File

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

View File

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

View File

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

View File

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

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

View File

@@ -3,9 +3,6 @@
[![coverage][cover]][cover-url]
![python][python]
![license][license]
[![Docker pulls](https://img.shields.io/docker/pulls/mayanedms/mayanedms.svg?maxAge=3600)](https://hub.docker.com/r/mayanedms/mayanedms/)
[![Docker Stars](https://img.shields.io/docker/stars/mayanedms/mayanedms.svg?maxAge=3600)](https://hub.docker.com/r/mayanedms/mayanedms/)
[![Docker layers](https://images.microbadger.com/badges/image/mayanedms/mayanedms.svg)](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>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1 +0,0 @@
Mayan EDMS is a free open source electronic document management system.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1 +0,0 @@
3.0rc1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 MiB

After

Width:  |  Height:  |  Size: 628 KiB

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View 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)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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"];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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