Compare commits

..

2 Commits

Author SHA1 Message Date
Roberto Rosario
bbcf7f53fb Change PCL conversion output format to PNG. Add special case for empty pages at the end of PCL documents. 2016-02-25 02:04:47 -04:00
Roberto Rosario
7e67a2384f Add PCL detection and rendering support. 2016-02-25 01:27:43 -04:00
1787 changed files with 40401 additions and 59859 deletions

View File

@@ -10,26 +10,26 @@ variables:
POSTGRES_PASSWORD: "postgres"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_DATABASE: "mayan_edms"
#test:mysql:
# script:
# - pip install -r requirements/testing.txt
# - pip install -q 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 "ALTER DATABASE $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
# - coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
# - bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
# tags:
# - mysql
#test:postgres:
# script:
# - pip install -r requirements/testing.txt
# - pip install -q psycopg2
# - coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci.db_postgres --nomigrations
# - bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
# tags:
# - postgres
#test:sqlite:
# script:
# - pip install -r requirements/testing.txt
# - coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci --nomigrations
# - bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
test:mysql:
script:
- pip install -r requirements/testing.txt
- pip install -q 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 "ALTER DATABASE $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
- coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
- bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
tags:
- mysql
test:postgres:
script:
- pip install -r requirements/testing.txt
- pip install -q psycopg2
- coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci.db_postgres --nomigrations
- bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
tags:
- postgres
test:sqlite:
script:
- pip install -r requirements/testing.txt
- coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci --nomigrations
- bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN

View File

@@ -127,16 +127,10 @@ source_lang = en
source_file = mayan/apps/mirroring/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.mirroring-2-0]
file_filter = mayan/apps/mirroring/locale/<lang>/LC_MESSAGES/django.po
[mayan-edms.navigation-2-0]
file_filter = mayan/apps/navigation/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/mirroring/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.motd-2-0]
file_filter = mayan/apps/motd/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/motd/locale/en/LC_MESSAGES/django.po
source_file = mayan/apps/navigation/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.ocr-2-0]

View File

@@ -1,69 +1,3 @@
2.1.4 (2016-XX-XX)
==================
- Add missing link to the 2.1.3 release notes in the index file.
- Improve TempfileCheckMixin.
2.1.3 (2016-06-29)
==================
- Add help message when initialsetup migration phase fails. Relates to GitLab issue #296.
- Start using self.setdout instead of print as per documentation.
- Fix GitLab issue #295, "When editing a user the top bar jumps to the name of the user".
- Normalize handling of temporary file and directory creation.
- Fix GitLab issue #309, "Temp files quickly filling-up my /tmp (1GB tmpfs)".
- Explicitly check for residual temporary files in tests.
- Add missing temporary file cleanup for office documents.
- Fix file descriptor leak in the document signature download test.
2.1.2 (2016-05-20)
==================
- Sort document languages and user profile locale language lists. GitLab issue #292.
- Fix metadata lookup for {{ users }} and {{ group }}. Fixes GitLab #290.
- Add Makefile for common development tasks
2.1.1 (2016-05-17)
==================
- Fix navigation issue that make it impossible to add new sources. GitLab issue #288.
- The Tesseract OCR backend now reports if the requested language file is missing. GitLab issue #289.
- Ensure the automatic default index is created after the default document type.
2.1 (2016-05-14)
================
- Upgrade to use Django 1.8.13. Issue #246.
- Upgrade requirements.
- Remove remaining references to Django's User model. GitLab issue #225
- Rename 'Content' search box to 'OCR'.
- Remove included login required middleware using django-stronghold instead (http://mikegrouchy.com/django-stronghold/).
- Improve generation of success and error messages for class based views.
- Remove ownership concept from folders.
- Replace strip_spaces middleware with the spaceless template tag. GitLab issue #255
- Deselect the update checkbox for optional metadata by default.
- Silence all Django 1.8 model import warnings.
- Implement per document type document creation permission. Closes GitLab issue #232.
- Add icons to the document face menu links.
- Increase icon to text spacing to 3px.
- Make document type delete time period optional.
- Fixed date locale handling in document properties, checkout and user detail views.
- Add new permission: checkout details view.
- Add HTML5 upload widget. Issue #162.
- Add Message of the Day app. Issue #222
- Update Document model's uuid field to use Django's native UUIDField class.
- Add new split view index navigation
- Newly uploaded documents appear in the Recent document list of the user.
- Document indexes now have ACL support.
- Remove the document index setup permission.
- Status messages now display the object class on which they operate not just the word "Object".
- More tests added.
- Handle unicode filenames in staging folders.
- Add staging file deletion permission.
- New document_signature_view permission.
- Add support for signing documents.
- Instead of multiple keyservers only one keyserver is now supported.
- Replace document type selection widget with an opened selection list.
- Add mailing documentation chapter.
- Add roadmap documentation chapter.
- API updates.
2.0.2 (2016-02-09)
==================
- Install testing dependencies when installing development dependencies.
@@ -76,16 +10,15 @@
- Strip HTML tags from the browser title.
- Remove Docker and Docker Compose files.
2.0.1 (2016-01-22)
==================
- Fix GitLab issue #243, "System allows a user to skip entering values for a required metadata field while uploading a new document"
- Fix GitLab issue #245, "Add multiple metadata not possible"
- Updated Vagrantfile to provision a production box too.
2.0 (2015-12-04)
================
- New source homepage: https://gitlab.com/mayan-edms/mayan-edms
- Update to Django 1.7
- New Bootstrap Frontend UI
@@ -157,6 +90,7 @@
1.1 (2015-02-10)
================
- Uses Celery for background tasks
- Removal of the splash screen
- Adds a home view with common function buttons
@@ -182,6 +116,7 @@
1.0 (2014-08-27)
================
- New home @ https://github.com/mayan-edms/mayan-edms
- Updated to use Django 1.6
- Translation updates

113
Makefile
View File

@@ -1,113 +0,0 @@
.PHONY: clean-pyc clean-build
define BROWSER_PYSCRIPT
import sys, webbrowser
webbrowser.open(sys.argv[1])
endef
export BROWSER_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"
help:
@echo
@echo "clean-build - Remove build artifacts."
@echo "clean-pyc - Remove Python artifacts."
@echo "clean - Remove Python and build artifacts."
@echo "test MODULE=<python module name> - Run tests for a single App, module or test class."
@echo "test-all - Run all tests."
@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 "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 "runserver - Run the development server."
# Cleaning
clean: clean-build clean-pyc
clean-build:
rm -fr build/
rm -fr dist/
rm -fr *.egg-info
clean-pyc:
find . -name '*.pyc' -exec rm -f {} +
find . -name '*.pyo' -exec rm -f {} +
find . -name '*~' -exec rm -f {} +
# Testing
test:
python -Wall ./manage.py test $(MODULE) --settings=mayan.settings.testing --nomigrations
test-all:
python -Wall ./manage.py runtests --settings=mayan.settings.testing --nomigrations
# Documentation
docs_serve:
$(BROWSER) http://127.0.0.1:8000
cd docs;make livehtml
# Translations
translations_make:
contrib/scripts/process_messages.py -m
translations_compile:
contrib/scripts/process_messages.py -c
translations_push:
tx push -s
translations_pull:
tx pull
# 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
# Releases
release: clean
python setup.py sdist bdist_wheel upload
sdist: clean
python setup.py sdist
ls -l dist
wheel: clean
python setup.py bdist_wheel
ls -l dist
# Dev server
runserver:
$(BROWSER) http://127.0.0.1:8000
./manage.py runserver

View File

@@ -1,4 +1,4 @@
|PyPI badge| |Build Status| |Coverage badge| |License badge|
|Build Status| |Coverage badge| |PyPI badge| |Installs badge| |License badge|
|Logo|
@@ -19,6 +19,10 @@ Free Open Source Electronic Document Management System.
|Animation|
Support
-------
Help support further improvements and development by donating at: https://www.patreon.com/siloraptor
License
-------
@@ -27,7 +31,7 @@ This project is open sourced under `Apache 2.0 License`_.
Installation
------------
To install Mayan EDMS, simply do:
To install **Mayan EDMS**, simply do:
.. code-block:: bash
@@ -59,10 +63,12 @@ Contribute
.. _`the repository`: http://gitlab.com/mayan-edms/mayan-edms
.. _`contributors file`: https://gitlab.com/mayan-edms/mayan-edms/blob/master/docs/topics/contributors.rst
.. |Build Status| image:: https://gitlab.com/mayan-edms/mayan-edms/badges/master/build.svg
:target: https://gitlab.com/mayan-edms/mayan-edms/commits/master
.. |Build Status| image:: https://gitlab.com/ci/projects/6169/status.png?ref=master
:target: https://gitlab.com/ci/projects/6169?ref=master
.. |Logo| image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/mayan_logo.png
.. |Animation| image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/overview.gif
.. |Installs badge| image:: http://img.shields.io/pypi/dm/mayan-edms.svg?style=flat
:target: https://crate.io/packages/mayan-edms/
.. |PyPI badge| image:: http://img.shields.io/pypi/v/mayan-edms.svg?style=flat
:target: http://badge.fury.io/py/mayan-edms
.. |License badge| image:: http://img.shields.io/badge/license-Apache%202.0-green.svg?style=flat

View File

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

View File

@@ -20,7 +20,7 @@ apt-get -qq update
apt-get -y upgrade
echo -e "\n -> Installing core binaries \n"
apt-get install nginx supervisor redis-server postgresql libpq-dev libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
apt-get install nginx supervisor redis-server postgresql libpq-dev libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr unpaper poppler-utils -y
echo -e "\n -> Setting up virtualenv \n"
rm -f ${INSTALLATION_DIRECTORY}

View File

@@ -9,17 +9,19 @@ APP_LIST = (
'converter', 'django_gpg', 'document_comments', 'document_indexing',
'document_signatures', 'document_states', 'documents', 'dynamic_search',
'events', 'folders', 'installation', 'linking', 'lock_manager', 'mailer',
'metadata', 'mirroring', 'motd', 'navigation', 'ocr', 'permissions',
'rest_api', 'smart_settings', 'sources', 'statistics', 'storage', 'tags',
'metadata', 'mirroring', 'navigation', 'ocr', 'permissions', 'rest_api',
'smart_settings', 'sources', 'statistics', 'storage', 'tags',
'user_management'
)
LANGUAGE_LIST = (
'ar', 'bg', 'bs_BA', 'da', 'de_DE', 'en', 'es', 'fa', 'fr', 'hu', 'id',
'it', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI', 'vi_VN',
'zh_CN',
)
# Inactive translations
# 'de_CH', 'hr_HR', 'lv', 'nb', 'sq', 'tr_TR', 'zh_TW'
makemessages = sh.Command('django-admin.py')
makemessages = makemessages.bake('makemessages')

View File

@@ -1,4 +1,15 @@
<h3>Support</h3>
<p>
Consulting, support, customization, rebranding, and plug-in development are available. Email for information to: <a href='mailto:info@mayan-edms.com'>info@mayan-edms.com</a>
<h3>Donate</h3>
<p>Help support further improvements and development, via:
<ul>
<li>
- <a href="https://www.paypal.me/RobertoRosario">PayPal.Me</a>
</li>
<li>
- <a href="https://www.patreon.com/siloraptor">Patreon</a>
</li>
<li>- or Gumroad:
<script type="text/javascript" src="https://gumroad.com/js/gumroad.js"></script>
<a href="https://gumroad.com/l/UNApl" class="gumroad-button">Buy Mayan EDMS</a>
</li>
</ul>
</p>

View File

@@ -1,16 +1,16 @@
Welcome to Mayan EDMS!
======================
Mayan EDMS is a `Free Open Source`_ `Electronic Document Management System`_, coded in
**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 repository for electronic documents.
The easiest way to use Mayan EDMS is by using a Debian based Linux distribution
and install it from PyPI with the following commands:
The easiest way to install and try **Mayan EDMS** is by using a Debian based Linux distribution
and installing it from PyPI with the following commands:
.. code-block:: bash
sudo apt-get install libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
sudo apt-get install libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr unpaper poppler-utils -y
virtualenv venv
source venv/bin/activate
pip install mayan-edms
@@ -33,7 +33,6 @@ account.
Concepts <topics/index>
Development <topics/development>
App creation <topics/app_creation>
Roadmap <topics/roadmap>
Translations <topics/translations>
Contributors <topics/contributors>
Screenshots <topics/screenshots>

View File

@@ -25,9 +25,9 @@ What's new in Mayan EDMS v0.12.1
Fabric file (fabfile)
~~~~~~~~~~~~~~~~~~~~~
A Fabric file is included to help users not very familiar with Ubuntu,
Python and Django install Mayan EDMS, or for system administrators
Python and Django install **Mayan EDMS**, or for system administrators
looking to automate the install whether in local or remote systems.
At the moment the fabfile will install Mayan EDMS in the same configurations
At the moment the fabfile will install **Mayan EDMS** in the same configurations
listed in this documentation, that is: (Ubuntu/Debian/Fedora) + virtualenv + Apache + MySQL.
Feel free to submit your configuration settings and files for different databases,
webserver or Linux distribution. More configurations will be added to
@@ -38,7 +38,7 @@ Documentation update
The installation instructions were updated to include the installation of
the libpng-dev and libjpeg-dev libraries as well as the installation of
the poppler-utils package. An additional step to help users test their
new installation of Mayan EDMS was also added.
new installation of **Mayan EDMS** was also added.
Translations
~~~~~~~~~~~~

View File

@@ -24,7 +24,7 @@ What's new in Mayan EDMS v0.12.2
Smarter auto admin creation
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mayan EDMS creates a administrator user during the
**Mayan EDMS** creates a administrator user during the
database creation phase to reduce the amount of steps required for a
functional install. The creation of this account is controlled by the configuration
option `COMMON_AUTO_CREATE_ADMIN`, the username of the account is
@@ -41,7 +41,7 @@ As per the feature request filed under `issue #26`_, a new document
check out and check in functionality has been added. Users can now
check out a document and lock new version of it from being uploaded to avoid
editing conflicts. Document check outs have an expiration period after which
Mayan EDMS will automatically check them back in to avoid a permanent
**Mayan EDMS** will automatically check them back in to avoid a permanent
document lockout. Only the user who has checked out a document can upload
new versions of it or check the document back in before the expiration period,
unless being granted the ``Allow overriding check out restrictions`` or
@@ -52,14 +52,14 @@ Installation environment app
Diagnosting remote installations of web based applications without access to the
command line can be a bit hard, to alleviate this situation a new installation
environment details app has been added. The purpose of this app is to provide
support staff information about the physical environment where Mayan EDMS has
support staff information about the physical environment where **Mayan EDMS** has
been installed. To avoid possible security compromises only administrators
can access this app.
Editable compressed documents filename
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Previously when downloading more than one document in a compressed manner,
Mayan EDMS would produce a file with the name ``document_bundle.zip`` for
**Mayan EDMS** would produce a file with the name ``document_bundle.zip`` for
download. A different filename can now be specified at the same download dialog.
German translation
@@ -71,7 +71,7 @@ Statistics gathering
~~~~~~~~~~~~~~~~~~~~
Previous attempts at gathering usage statistics have been met with deficient results.
User participation in surveys as well as the quality of the data entered by users
was disappointing. That is why this version of Mayan EDMS features an
was disappointing. That is why this version of **Mayan EDMS** features an
anonymous statistics gathering functionality.

View File

@@ -6,12 +6,12 @@ Mayan EDMS v0.12 release notes
Welcome to Mayan EDMS v0.12!
This release commemorates Mayan EDMS first aniversary!
This release commemorates **Mayan EDMS** first aniversary!
Overview
========
Aside from new features, the focus of this release of Mayan EDMS also
Aside from new features, the focus of this release of **Mayan EDMS** also
been about improving the code and documentation quality standard
even further. The permission system has been completely overhauled to make
it entire class based. The other big change is the addition of object
@@ -61,7 +61,7 @@ Anonymous user support
~~~~~~~~~~~~~~~~~~~~~~
Anonymous user support is a two tier function, first is the addition of
the `COMMON_ALLOW_ANONYMOUS_ACCESS` configuration option that
allows non authenticated user to browse all the pages of a Mayan EDMS installation.
allows non authenticated user to browse all the pages of a **Mayan EDMS** installation.
The second part of this support is the ability to assign permissions
or individual access to objects to anonymous users.
@@ -89,7 +89,7 @@ the download of several documents in a single compressed file.
Customizable GPG home directory
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Addition of the `SIGNATURES_GPG_HOME` configuration option to let
administrators set Mayan EDMS's GPG instance home directory, used to
administrators set **Mayan EDMS**'s GPG instance home directory, used to
store keyrings and other GPG configuration files.
Out of process bulk uploading
@@ -114,7 +114,7 @@ stage to beta stage. Index configuration menus are now available on the
be populated with document links depending on their metadata and properties.
These populated trees can also be mirrored on the physical filesystem and shared
using Samba or another filesharing server giving users a structured view
of the documents contained within Mayan EDMS from the ``Indexes`` tab
of the documents contained within **Mayan EDMS** from the ``Indexes`` tab
or from a mirrored index shared via the network. A new configuration option
has been added, `DOCUMENT_INDEXING_FILESYSTEM_SERVING`, which maps
the index internal name with the physical directory where such index will be
@@ -127,7 +127,7 @@ Included in this version is a small feedback application, found under the
help determine the priority of the next planned features on the pipeline,
or even help add new features if enough requests are received. All questions
are optional but answering as many as possible will help greatly understand
the need of the Mayan EDMS user base.
the need of the **Mayan EDMS** user base.
Staging file previews
~~~~~~~~~~~~~~~~~~~~~

View File

@@ -31,39 +31,39 @@ Attaching or removing tags from a large number of documents is now much easier.
Registration
~~~~~~~~~~~~
Based on requests made by the community for greater commercial support and services for
Mayan EDMS, a new feature has been added that allows users to register their
copies of Mayan EDMS and better help users with commercial support packages.
**Mayan EDMS**, a new feature has been added that allows users to register their
copies of **Mayan EDMS** and better help users with commercial support packages.
Registration for non commercial users is voluntary and optional, and in no way
affects the functionality of Mayan EDMS. However even for non commercial users
affects the functionality of **Mayan EDMS**. However even for non commercial users
registration offers the advantage of automatically branding the user's copy
of Mayan EDMS with their name or the company name in the title area.
of **Mayan EDMS** with their name or the company name in the title area.
Per document type indexing
~~~~~~~~~~~~~~~~~~~~~~~~~~
Index can now be restricted to update only on specific document types, this
greatly increases the usefulness of indexes, and prevents unwanted index
updates.
updates.
Bootstrap
~~~~~~~~~
Setting up Mayan EDMS after installation has been indetified by users as the
main difficulty when knowledge about Mayan EDMS is relatively low. To
Setting up **Mayan EDMS** after installation has been indetified by users as the
main difficulty when knowledge about **Mayan EDMS** is relatively low. To
address this situation a new feature that provides preconfigured setups has been
added. These preconfigured setups are published in the Mayan EDMS website and
added. These preconfigured setups are published in the **Mayan EDMS** website and
upon synchonization are available to users, this gives users access and integrators
access to new setups without having to wait for new versions of Mayan EDMS.
access to new setups without having to wait for new versions of **Mayan EDMS**.
Aside from including preconfigured setups, the new bootstrap app
has the ability of dumping an user's current setup into a serialized text file
which can be tweaked by hand and sent via email to other users. The possibilities
enabled by this range from company wide defaults setups to consultants providing
their clients with customized setups without having to access their clients'
Mayan EDMS instances. ``JSON``, ``YAML`` and a custom ``YAML`` format
**Mayan EDMS** instances. ``JSON``, ``YAML`` and a custom ``YAML`` format
(http://djangosnippets.org/snippets/2461/) are supported by this new app.
Add documents to folders in bulk
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As requested, the ability to add more than one document at a time to a selected
folder has been added.
folder has been added.
Translation updates
~~~~~~~~~~~~~~~~~~~
@@ -96,7 +96,7 @@ removes any traces of code and configuration options related to UNOCONV.
Optimizations
~~~~~~~~~~~~~
Inspired by the idea of getting Mayan EDMS running effectively on low power hardware such as
Inspired by the idea of getting **Mayan EDMS** running effectively on low power hardware such as
the Raspberry Pi, several rounds or profiling and optimization were done.
Some caching optimization were introduced to the permission model, resulting in
@@ -105,13 +105,13 @@ and a 18% query reduction on cache hits.
Upgrading from a previous version
=================================
If you installed Mayan EDMS by cloning the Git repository issue the commands::
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 add the new requirements::
$ pip install -r requirements/production.txt

View File

@@ -118,7 +118,7 @@ to do document OCR using software or services other than Tesseract.
OCR improvements
~~~~~~~~~~~~~~~~
OCR queue state is now reset when reloading Mayan EMDS, avoiding the OCR queue
OCR queue state is now reset when reloading **Mayan EMDS**, avoiding the OCR queue
to remain locked. `unpaper` binary is now an optional pre OCR requirement, the OCR
queue will now continue working is `unpaper` is not installed. Addition of post
OCR processing support for French and German.
@@ -131,7 +131,7 @@ commercial products is now explicitly allowed.
PyPI package
~~~~~~~~~~~~
Mayan EDMS has been packaged and submitted to the PyPI_ Python Package Index
**Mayan EDMS** has been packaged and submitted to the PyPI_ Python Package Index
making it even easier to install and use.
New REST API

View File

@@ -13,7 +13,7 @@ What's new in Mayan EDMS v1.1
Celery
~~~~~~
All background tasks processing has been converted to use Celery_. By default
Mayan EDMS runs in "Eager" until a broker and result backend are configured
**Mayan EDMS** runs in "Eager" until a broker and result backend are configured
as per `Celery's documentation`_. This change made the built-in scheduler and
job_processing apps obsolete, both were removed.
@@ -21,7 +21,7 @@ job_processing apps obsolete, both were removed.
Views namespaces
~~~~~~~~~~~~~~~~
All views are namespaced_ with the name of the app which defines them. If you have
developed 3rd party apps for Mayan EDMS be sure to update any reference to a view
developed 3rd party apps for **Mayan EDMS** be sure to update any reference to a view
by prepending the app name to the view name.
@@ -43,7 +43,7 @@ mail serving.
Update to Django 1.6.8
~~~~~~~~~~~~~~~~~~~~~~
Mayan EDMS has been updated to use Django 1.6.8.
**Mayan EDMS** has been updated to use Django 1.6.8.
Events app
@@ -55,13 +55,13 @@ for `Django activity stream`_
Watch folders
~~~~~~~~~~~~~
Filesystem folders can be monitored for change and their files automatically
uploaded as documents in Mayan EDMS.
uploaded as documents in **Mayan EDMS**.
Vagrant file included
~~~~~~~~~~~~~~~~~~~~~
A vagrant file is now included to allow developers to provision a virtual machine
with the latest development version of Mayan EDMS.
with the latest development version of **Mayan EDMS**.
User locale profile (language and timezone)
@@ -101,7 +101,7 @@ the metadata types of the new document type are automatically assigned.
New release cycle
~~~~~~~~~~~~~~~~~
Starting with this version a new release cycle methodology will come into effect.
The goal of this release cycle is to allow two series of versions of Mayan EDMS to be
The goal of this release cycle is to allow two series of versions of **Mayan EDMS** to be
active at a given time: A new major version with new functionality and a minor version
providing upgrades and fixes. This release (1.1) will be active and supported
during releases of versions 2.x, but will go into end-of-life as soon as
@@ -111,24 +111,24 @@ maintenance mode.
Deprecation of Python 2.6
~~~~~~~~~~~~~~~~~~~~~~~~~
Series 1.0 of Mayan EDMS will be the last series supporting Python 2.6. Series
Series 1.0 of **Mayan EDMS** will be the last series supporting Python 2.6. Series
2.0 will be using Django 1.7.x which itself requires Python 2.7 or later.
Improved testings
~~~~~~~~~~~~~~~~~
Mayan EDMS is now automatically tested against SQLite, MySQL and PostgreSQL.
**Mayan EDMS** is now automatically tested against SQLite, MySQL and PostgreSQL.
API updates
~~~~~~~~~~~
Many new API endpoints have been added exposing the majority of Mayan EDMS functionality.
Many new API endpoints have been added exposing the majority of **Mayan EDMS** functionality.
Messages contextual improvements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Many updates and simplifications were made to the source text messages to reduce the
difficulty of translating Mayan EDMS and maintaing the contextual meaning of the
difficulty of translating **Mayan EDMS** and maintaing the contextual meaning of the
text messages.
Improved method for custom settings
@@ -186,7 +186,7 @@ More technical documentation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Many new sub topics were added to the development section of the documentation
to allow developers to better understand the inner workings and philosophies
of Mayan EDMS.
of **Mayan EDMS**.
Other changes

View File

@@ -13,7 +13,7 @@ What's new in Mayan EDMS v2.0
Update to Django 1.7
--------------------
The biggest change of this release comes in the form of support for Django 1.7.
Mayan EDMS makes use of several new features of Django 1.7 like: migrations,
**Mayan EDMS** makes use of several new features of Django 1.7 like: migrations,
app config and transaction handling. The version of Django supported in this
version is 1.7.10. With the move to Django 1.7, support for South migrations
and Python 2.6 is removed. The switch to Django 1.7's app config means that
@@ -27,10 +27,10 @@ update a lot of legacy HTML and CSS was removed, greatly simplifying the
existing template and allowing the removal of some.
Theming and re-branding
-----------------------
----------------------
All the presentation logic and markup has been moved into it's own app, the
'appearance' app. All modifications required to customize the entire look of
the Mayan EDMS can now be done in a single app. Very little markup remains
the **Mayan EDMS** can now be done in a single app. Very little markup remains
in the other apps, and it's usually because of necessity, namely the widgets.py
modules.
@@ -98,7 +98,7 @@ app are no longer required. These are:
* slate
ACL system re-factor
--------------------
-------------------
The Access Control System has been greatly simplified and optimized. The
logistics to grant and revoke permissions are now as follows: Only Roles can
hold permissions, groups and user can no longer on their own be granted a
@@ -135,7 +135,7 @@ support. Administrators wanting to make a group of documents public are
encouraged to create an user, group and role for that purpose.
Metadata validators re-factor
-----------------------------
----------------------------
The metadata validators have been split into: Validators and Parsers.
Validators will just check that the input value conforms to certain
specification, raising a validation error is not and blocking the user from
@@ -194,11 +194,11 @@ Failure tolerance
-----------------
Previous versions made use of transactions to prevent data loss in the event of
an unexpected error. This release improves on that approach by also reacting
to infrastructure failures. Mayan EDMS can now recover without any or
to infrastructure failures. **Mayan EDMS** can now recover without any or
minimal data loss from critical events such as loss of connectivity to the
database manager. This changes allow installation of using database managers
that do not provide guaranteed concurrency such as SQLite, to scale to thousand
of documents. While this configuration is still not recommended, Mayan EDMS
of documents. While this configuration is still not recommended, **Mayan EDMS**
will now work and scale much better in environments where parts of the
infrastructure cannot be changed (such as the database manager).
@@ -219,7 +219,7 @@ new scheme.
Default document type and default document source
-------------------------------------------------
After installation a default document type and document source are created,
this means that users can start uploading documents as soon as Mayan EDMS
this means that users can start uploading documents as soon as **Mayan EDMS**
is installed without having to do any configuration setting changes. The
default document type and default document source are both called 'Default'.
@@ -229,7 +229,7 @@ Support for allowing 3rd party apps to unbind links binded by the core apps
was added to further improve re-branding and customization.
Statistics re-factor
--------------------
-------------------
Statistics gathering and generation has been overhauled to allow for the
creation of scheduled statistics. This allows statistics computation to be
scheduled during low load times. A new management command was added to

View File

@@ -1,87 +0,0 @@
===============================
Mayan EDMS v2.1.1 release notes
===============================
Released: May 17, 2016
What's new
==========
This is a bugfix release and all users are encouraged to upgrade.
Fix object column resolution issue in navigation app
----------------------------------------------------
Version 2.1 includes a navigation feature that allows model instances from a
queryset generated using the .defer() or .only() Django filter optimization
features to resolve to their parent class transparently. This optimization
caused problems with the sources app which uses a
Missing Tesseract language files
--------------------------------
The Tesseract OCR backend now reports if the tesseract language file is missing
for the requested document's language.
Other changes
-------------
- Ensure the automatic default index is created after the default document type.
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 #288 <https://gitlab.com/mayan-edms/mayan-edms/issues/288>`_ Can't add sources in mayan-edms 2.1.
* `GitLab issue #289 <https://gitlab.com/mayan-edms/mayan-edms/issues/289>`_ OCR fails with Exception.
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -1,86 +0,0 @@
===============================
Mayan EDMS v2.1.2 release notes
===============================
Released: May 20, 2016
What's new
==========
This is a bugfix release and all users are encouraged to upgrade.
Language list sorting
---------------------
The document language list and the user locale profile language list are now
sorted to make it easier to find the desired language.
Fixed the metadata lookup options: {{ users }} and {{ groups }}
---------------------------------------------------------------
When configuring metadata type lookup options the {{ users }} and {{ groups }}
special options can be used to display a list of users or a list of groups.
These options where producing a list in the wrong format and were updated.
Other changes
-------------
- Add Makefile for common development tasks
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 #290 <https://gitlab.com/mayan-edms/mayan-edms/issues/290>`_ Unicode characters not supported as metadata values
* `GitLab issue #292 <https://gitlab.com/mayan-edms/mayan-edms/issues/292>`_ Sort languages by name not by abbreviation
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -1,87 +0,0 @@
===============================
Mayan EDMS v2.1.3 release notes
===============================
Released: June 29, 2016
What's new
==========
This is a bug-fix release and all users are encouraged to upgrade.
Temporary files cleanup
-----------------------
When uploading PDF files that had been OCRed by previous software, the text
parser backend that uses Poppler, would leave behind some temporary files in
the /tmp folder. The issue has been resolved and from the fix a test mixin
system check has been devised that will identify places in the codebase with
similar behaviors, reducing the recurrence of similar issues in the future.
Other changes
-------------
- Add help message when initialsetup migration phase fails. Relates to GitLab issue #296
- Start using self.setdout instead of print as per documentation.
- Fix GitLab issue #295, "When editing a user the top bar jumps to the name of the user".
- Normalize handling of temporary file and directory creation.
- Explicitly check for residual temporary files in tests.
- Add missing temporary file cleanup for office documents.
- Fix file descriptor leak in the document signature download test.
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 #295 <https://gitlab.com/mayan-edms/mayan-edms/issues/295>`_ When editing a user the top bar jumps to the name of the user
* `GitLab issue #309 <https://gitlab.com/mayan-edms/mayan-edms/issues/309>`_ Temp files quickly filling-up my /tmp (1GB tmpfs)
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -1,238 +0,0 @@
=============================
Mayan EDMS v2.1 release notes
=============================
Released: May 14, 2016
What's new
==========
Upgrade to use Django 1.8.13
----------------------------
With the end of life support for Django 1.7, moving to the next Mayan EDMS
minor version was a target for this release. The Django minor release chosen was
1.8 as it is very compatible with 1.7 and required minimal changes. Django 1.8
is an LTS release (Long Term Support) meaning that is no new big feature of a
new Django version is required, the project can stay in Django 1.8 for a good
amount of time with no downsides.
Remove remaining references to Django's User model
--------------------------------------------------
The few remaining hard code references to Django's User model that were missed
in a previous release have been removed. Using a custom User model with Mayan
should present very little if any obstacles.
Remove included login required middleware
-----------------------------------------
The custom middleware include with Mayan EDMS that forces user to be
authenticated before being able to access any view has been removed in favor of
a dedicated 3rd party Django app for that purpose. The app chosen was
django-stronghold (http://mikegrouchy.com/django-stronghold/).
Improve generation of success and error messages for class based views
----------------------------------------------------------------------
In the past success messages for actions would show a generic mention to the
object being manipulated (document, folder, tag). Now the errors and success
messages with be more explicit in describing what the view has or was trying
to manipulate.
Remove ownership concept from folders
-------------------------------------
Currently Folders in Mayan EDMS have a field that stores a reference to the
user that has created that folders. One of the design decisions of Mayan EDMS
is that there should never be any explicit ownership of any object. Ownership
is relative and is defined by the Access Control List of an object. The
removal of the user field from the Folders model brings this app in line with
the defined behavior.
Replacement of strip_spaces middleware with the spaceless template tag
----------------------------------------------------------------------
As a size optimization technique HTML content was dynamically stripped of spaces
as it was being served. The technique used involved detecting the MIME type of
the content being served and if found to be of text/HTML type spaces between
tags were stripped. An edge case was found where this did not worked always.
The approached has been changed to use Django's official tag to strip spaces.
In addition to using an official approach, the removal of spaces only happens
when the template is compiled and not at each HTTP response. The optimization
is minimal but since it happened at every response a small increase in speed
is expected for all deployment scenarios.
Deselect the update checkbox for optional metadata by default
-------------------------------------------------------------
During the last releases the behavior of the of metadata edit checkbox has seen
several tune ups. Thanks to community feedback one small change has been
introduced. The edit checkbox will be deselected by default for all optional
document type metadata entries.
Implement per document type document creation permission
--------------------------------------------------------
If is now possible to grant the document creation permission to a role for a
document type. Previously document creation was a "blanket" permission. Having
the permission meant that user could create any type of document. With this
change it is now possible to restrict which types of document users of a
specific role can create.
Make document type delete time period optional
----------------------------------------------
The entries that defined after how long a document in the trash would be
permanently deleted have been made optional. This means that if a document
type has this option blank, the corresponding document of this type would never
be deleted from the trash can.
Fixed date locale handling in document properties, checkout and user detail views
---------------------------------------------------------------------------------
A few releases back the ability to for users to set their timezone was added.
This change also included a smart date rendering update to adjust the dates
and times fields to the user's timezone. Some users reported a few views where
this timezone adjustment was not happening, this has been fully fixed.
Default index
-------------
During new installations a default index that organizes document by year/month
when they were uploaded will be created to help users better understand the
concept of indexes in Mayan EDMS.
HTML5 upload widget
-------------------
A common request is the ability to just drap and drop documents from other
windows into Mayan EDMS's document upload wizard. This release includes that
capability and will also show a completion bar for the upload. Document
uploading is sped up dramatically with this change.
Message of the Day app
----------------------
Administrators wanting to display announcements has no other way to do so
than to customize the login template. To avoid this a new app has been added
that allows for the creation of messages to be shown at the user login
screen. These messages can have an activation and an expiration date and
time. These messages are useful for display company access policies,
maintenance announcement, etc.
Document signing
----------------
The biggest change for this release if the addition of document signing from
within the UI. Enterprise users request this feature very often as in those
environments cryptographic signatures are a basic requirement. Previously
Mayan EDMS had the ability to automatically check if a document was signed and
if signed, verify the validity of the signature. However, to sign documents
user had to download the document, sign the document offline, and either
re-upload the signed document as a new version or upload a detached
signature for the existing document version. Aside from being now able to sign
documents from the web user interface, the way keys are handled has been
rewritten from scratch to support distributed key storage. This means that
a key uploaded in one computer by one user can be used transparently by
other users in other computers to sign documents. The relevant access control
updates were added to the new document signing system. Users wanting to sign a
document need the singing permission for the document (or document type),
for the private key they intend to use, and the passphrase (if the key has one).
Finally documents are now checked just once for signatures and not every time
they are accessed, this provides a very sizable speed improvement in document
access and availability.
Other changes
=============
- Upgrade Python requirements to recent versions.
- Rename 'Content' search box to 'OCR'.
- Silence all Django 1.8 model import warnings.
- Add icons to the document face menu links.
- Increase icon to text spacing to 3px.
- Add new permission: checkout details view.
- Add HTML tags stripping to the browser title generation template.
- Folder and Tag creation API calls now return the id of the created instances.
- Update Document model's uuid field to use Django's native UUIDField class.
- Add new split view index navigation
- Newly uploaded documents appear in the Recent document list of the user.
- Start migration from django-sendfile to django-downloadview.
- Index more model fields.
- Navigation system support querysets using .defer() or .only() optimizations.
- API fixes and improvements.
- Increase total test count to 311.
- Increase test coverage to 77%.
- Documentation improvements.
- Handle unicode filenames in staging folders.
- Add staging file deletion permission.
- New document_signature_view permission.
- Instead of multiple keyservers only one keyserver is now supported.
- Replace document type selection widget with an opened selection list.
- Add roadmap documentation chapter.
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 #137 <https://gitlab.com/mayan-edms/mayan-edms/issues/137>`_ Add app creation chapter to documentation.
* `GitLab issue #147 <https://gitlab.com/mayan-edms/mayan-edms/issues/147>`_ Add in app document signing.
* `GitLab issue #161 <https://gitlab.com/mayan-edms/mayan-edms/issues/161>`_ Email backend setup documentation.
* `GitLab issue #162 <https://gitlab.com/mayan-edms/mayan-edms/issues/162>`_ Add HTML5 file uploader.
* `GitLab issue #191 <https://gitlab.com/mayan-edms/mayan-edms/issues/191>`_ Split index contents title into title and path/breadcrumb widget.
* `GitLab issue #206 <https://gitlab.com/mayan-edms/mayan-edms/issues/206>`_ Support for dynamic LOGIN_EXEMPT_URLS.
* `GitLab issue #208 <https://gitlab.com/mayan-edms/mayan-edms/issues/208>`_ Add tagging step to upload wizard.
* `GitLab issue #218 <https://gitlab.com/mayan-edms/mayan-edms/issues/218>`_ Cookie cutter template for Mayan apps.
* `GitLab issue #222 <https://gitlab.com/mayan-edms/mayan-edms/issues/222>`_ Add notice board or Message of the Day.
* `GitLab issue #225 <https://gitlab.com/mayan-edms/mayan-edms/issues/225>`_ Remove hard coded User model.
* `GitLab issue #232 <https://gitlab.com/mayan-edms/mayan-edms/issues/232>`_ "Create documents" is a blanket permission for a user to create a document of any document type.
* `GitLab issue #246 <https://gitlab.com/mayan-edms/mayan-edms/issues/246>`_ Upgrade to Django version 1.8 as Django 1.7 is end-of-life.
* `GitLab issue #251 <https://gitlab.com/mayan-edms/mayan-edms/issues/251>`_ Add method to disable metadata edit form "update" checkbox when not needed.
* `GitLab issue #255 <https://gitlab.com/mayan-edms/mayan-edms/issues/255>`_ UnicodeDecodeError in apps/common/middleware/strip_spaces_widdleware.py.
* `GitLab issue #256 <https://gitlab.com/mayan-edms/mayan-edms/issues/256>`_ typo in locale settings (Dutch).
* `GitLab issue #261 <https://gitlab.com/mayan-edms/mayan-edms/issues/261>`_ Feature: Document Access Audit Logging.
* `GitLab issue #265 <https://gitlab.com/mayan-edms/mayan-edms/issues/265>`_ Indexes show list (show indexe only if the user has ACLs on document type).
* `GitLab issue #266 <https://gitlab.com/mayan-edms/mayan-edms/issues/266>`_ Smart links : Dynamic label with Postgresql.
* `GitLab issue #267 <https://gitlab.com/mayan-edms/mayan-edms/issues/267>`_ Release 2.1 RC1 : Notes and ideas.
* `GitLab issue #268 <https://gitlab.com/mayan-edms/mayan-edms/issues/268>`_ Release 2.1 RC1 : Bug to access inside an indexes.
* `GitLab issue #270 <https://gitlab.com/mayan-edms/mayan-edms/issues/270>`_ Release 2.1 RC1 : Bug statistics.
* `GitLab issue #274 <https://gitlab.com/mayan-edms/mayan-edms/issues/274>`_ [Release 2.1 RC2] Web Tests.
* `GitLab issue #275 <https://gitlab.com/mayan-edms/mayan-edms/issues/275>`_ [Release 2.1 RC2] Notes.
* `GitLab issue #276 <https://gitlab.com/mayan-edms/mayan-edms/issues/276>`_ [Release 2.1 RC2] API Tests.
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -2,19 +2,19 @@
Release notes
=============
Release notes for the official Mayan EDMS releases. Each release note will tell you
Release notes for the official **Mayan EDMS** releases. Each release note will tell you
what's new in each version, and will also describe any backwards-incompatible
changes made in that version.
For those upgrading to a new version of Mayan EDMS, you will need to check
For those upgrading to a new version of **Mayan EDMS**, you will need to check
all the backwards-incompatible changes and deprecated features for
each 'final' release from the one after your current Mayan EDMS version,
each 'final' release from the one after your current **Mayan EDMS** version,
up to and including the latest version.
Final releases
==============
Below are release notes through Mayan EDMS |version| and its minor releases. Newer
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.
2.0 series
@@ -22,13 +22,9 @@ versions of the documentation contain the release notes for any later releases.
.. toctree::
:maxdepth: 1
2.1.3
2.1.2
2.1.1
2.1
2.0.2
2.0.1
2.0
2.0.1
2.0.2
1.0 series
----------

View File

@@ -2,7 +2,7 @@
Access control lists
====================
Besides the permissions system explained in :doc:`permissions`, Mayan EDMS
Besides the permissions system explained in :doc:`permissions`, **Mayan EDMS**
provides per object permission granting. This feature is used to grant a
permission to a role, but this permission can only be executed for a limited
number of objects (documents, folders, tags) instead of being effective

View File

@@ -2,7 +2,7 @@
App creation
============
Mayan EDMS apps are essentially Django app with some extra code to register
**Mayan EDMS** apps are essentially Django app with some extra code to register
navigation, permissions and other relationships.
@@ -21,7 +21,7 @@ App modules
- api_views.py
REST API views go here. Mayan EDMS uses Django REST Framework API view
REST API views go here. **Mayan EDMS** uses Django REST Framework API view
classes.
- apps.py
@@ -135,7 +135,7 @@ Views
=====
The module common.generics provides custom generic class based views to be used.
The basic views used to create, edit, view and delete objects in Mayan EDMS
The basic views used to create, edit, view and delete objects in **Mayan EDMS**
are: SingleObjectCreateView, SingleObjectDetailView, SingleObjectEditView,
and SingleObjectListView

View File

@@ -1,16 +0,0 @@
=======
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 ``mayan/media/document_storage/``.
To dump the content of your database manager refer to the documentation chapter
regarding database data "dumping".
Example:
- Postgresl: http://www.postgresql.org/docs/current/static/backup.html
- MySQL: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
- SQLite: Just copy the file ``mayan/media/db.sqlite3``

View File

@@ -15,14 +15,14 @@ Search for information in the `archives of the mayan-edms mailing list`_, or
`post a question`_. If you prefer news servers, use the gateway provided by
Gmane_.
Mayan EDMS community developers do their best to reply to basic questions.
**Mayan EDMS** community developers do their best to reply to basic questions.
Be sure to check the list archives as it may already containt the answers to
your questions.
Twitter
-------
Mayan EDMS has an official Twitter account, `@mayanedms
**Mayan EDMS** has an official Twitter account, `@mayanedms
<http://twitter.com/mayanedms>`_, which is used for announcements and occasional
related news tidbits.
@@ -30,7 +30,7 @@ related news tidbits.
Bugs/ticket tracker
-------------------
Report bugs with Mayan EDMS or search existing ones using Gitlab's `ticket tracker`_.
Report bugs with **Mayan EDMS** or search existing ones using Github's `ticket tracker`_.
.. _archives of the mayan-edms mailing list: http://groups.google.com/group/mayan-edms/

View File

@@ -8,7 +8,7 @@ Contributors
How to contribute?
------------------
You can help further the development of Mayan EDMS by testing, reporting
You can help further the development of **Mayan EDMS** by testing, reporting
bugs, submitting documentation or code patches.
Lead developer

View File

@@ -5,7 +5,7 @@ Deploying
OS "bare metal"
===============
Like other Django based projects Mayan EDMS can be deployed in a wide variety
Like other Django based projects **Mayan EDMS** can be deployed in a wide variety
of ways. The method provided below is only a bare minimum example.
These instructions are independent of the instructions mentioned in the
:doc:`installation` chapter but assume you have already made a test install to
@@ -109,7 +109,7 @@ 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``::
Create the NGINX site file for **Mayan EDMS**, ``/etc/nginx/sites-available/mayan``::
server {
listen 80;
@@ -134,7 +134,7 @@ Create the NGINX site file for Mayan EDMS, ``/etc/nginx/sites-available/mayan``:
}
}
Enable the NGINX site for Mayan EDMS::
Enable the NGINX site for **Mayan EDMS**::
ln -s /etc/nginx/sites-available/mayan /etc/nginx/sites-enabled/
@@ -198,7 +198,7 @@ Deploy the Docker image stack::
docker run --name redis -d redis
docker run --name mayan-edms -p 80:80 --link postgres:postgres --link redis:redis -e POSTGRES_DB=mayan -e POSTGRES_USER=mayan -e POSTGRES_PASSWORD=mysecretpassword -v /usr/local/lib/python2.7/dist-packages/mayan/media -d mayanedms/monolithic
After the Mayan EDMS container finishes initializing (about 5 minutes), it will
After the **Mayan EDMS** container finishes initializing (about 5 minutes), it will
be available by browsing to http://127.0.0.1. You can inspect the initialization
with::
@@ -242,7 +242,7 @@ Launch the entire stack (Postgres, Redis, and Mayan EDMS) using::
docker-compose -f docker-compose.yml -p mayanedms up -d
After the Mayan EDMS container finishes initializing (about 5 minutes), it will
After the **Mayan EDMS** container finishes initializing (about 5 minutes), it will
be available by browsing to http://127.0.0.1. You can inspect the initialization
with::

View File

@@ -3,7 +3,7 @@
Development
===========
Mayan EDMS is under active development, and contributions are welcome.
**Mayan EDMS** is under active development, and contributions are welcome.
If you have a feature request, suggestion or bug report, please open a new
issue on the `GitLab issue tracker`_. To submit patches, please send a pull
@@ -16,8 +16,8 @@ request on GitLab_. Make sure to add yourself to the :ref:`contributors` file.
Project philosophies
--------------------
How to think about Mayan EDMS when doing changes or adding new features,
why things are the way they are in Mayan EDMS.
How to think about **Mayan EDMS** when doing changes or adding new features,
why things are the way they are in **Mayan EDMS**.
- Functionality must be as market/sector independent as possible, code for the
95% of use cases.
@@ -125,7 +125,7 @@ Correct:
Dependencies
~~~~~~~~~~~~
Mayan EDMS apps follow a hierarchical model of dependency. Apps import from
**Mayan EDMS** apps follow a hierarchical model of dependency. Apps import from
their parents or siblings, never from their children. Think plugins. A parent
app must never assume anything about a possible existing child app. The
documents app and the Document model are the basic entities they must never
@@ -136,7 +136,7 @@ Variables
~~~~~~~~~
Naming of variables should follow a Major to Minor convention, usually
including the purpose of the variable as the first piece of the name, using
underscores as spaces. camelCase is not used in Mayan EDMS.
underscores as spaces. camelCase is not used in **Mayan EDMS**.
Examples:
@@ -171,7 +171,7 @@ Classes:
Strings
~~~~~~~
Quotation character used in Mayan EDMS for strings is the single quote.
Quotation character used in **Mayan EDMS** for strings is the single quote.
Double quote is used for multiple line comments or HTML markup.
Migrations
@@ -199,7 +199,7 @@ as passed directly from the exception object.
Source Control
--------------
Mayan EDMS source is controlled with Git_.
**Mayan EDMS** source is controlled with Git_.
The project is publicly accessible, hosted and can be cloned from **GitLab** using::
@@ -209,7 +209,7 @@ The project is publicly accessible, hosted and can be cloned from **GitLab** usi
Git branch structure
--------------------
Mayan EDMS follows a simplified model layout based on Vincent Driessen's
**Mayan EDMS** follows a simplified model layout based on Vincent Driessen's
`Successful Git Branching Model`_ blog post.
``develop``
@@ -299,7 +299,7 @@ merged.
Debugging
---------
Mayan EDMS makes extensive use of Django's new `logging capabilities`_.
**Mayan EDMS** makes extensive use of Django's new `logging capabilities`_.
By default debug logging for all apps is turned on. If you wish to customize
how logging is managed turn off automatic logging by setting
`COMMON_AUTO_LOGGING` to ``False`` and add the following lines to your

View File

@@ -2,7 +2,7 @@
Document types
==============
The basic unit of data in Mayan EDMS is the ``document type``. A document
The basic unit of data in **Mayan EDMS** is the ``document type``. A document
type can be interpreted also as a document category, a document class, or a
document template. Document types need to be created before documents can be
uploaded. It is not possible to upload documents without assigning them a
@@ -11,7 +11,7 @@ document type. Examples of document type: **invoices**, **blueprints**,
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
assigned when uploaded into **Mayan EDMS**. A document can only be of one
type at a given moment, but if needed, the type of a document can be changed.
Upon changing its type, the document will lose its previous settings and
attributes, and will inherit the settings and attributes of its new type.

View File

@@ -7,7 +7,7 @@ Frequently asked questions and solutions
**Q: PostgreSQL vs. MySQL**
Since Django abstracts database operations from a functional point of view
Mayan EDMS will behave exactly the same either way. The only concern
**Mayan EDMS** will behave exactly the same either way. The only concern
would be that MySQL doesn't support transactions for schema modifying
commands. The only moment this could cause problems is when running
South migrations during upgrades, if a migration fails the database

View File

@@ -19,7 +19,7 @@ Features
* Office document format support.
* Mayan EDMS can detect the presence of Libre Office and use it to support
* **Mayan EDMS** can detect the presence of Libre Office and use it to support
word processing files, spreadsheets and presentations.
* User defined metadata fields.
@@ -44,7 +44,7 @@ Features
* Previews for many file formats.
* Mayan EDMS provides image preview generation for many popular file
* **Mayan EDMS** provides image preview generation for many popular file
formats.
* Full text searching.
@@ -78,7 +78,7 @@ Features
* Multilingual user interface.
* Mayan EDMS being written using the Django_ framework, can be translated
* **Mayan EDMS** being written using the Django_ framework, can be translated
to practically any language spoken in the world. For a list of translated
languages have a look at the Transifex_ project location.

View File

@@ -2,7 +2,7 @@
File storage
============
The files are stored and placed under Mayan EDMS "control" to avoid
The files are stored and placed under **Mayan EDMS** "control" to avoid
filename clashes each file gets renamed to its ``UUID`` (Universally Unique ID),
without extension, and stored in a simple flat arrangement in a directory.
@@ -20,16 +20,9 @@ This doesn't stop access to the files but renaming, moving or updating
directly them is not recommended because it would throw the database out
of sync.
Because Mayan EDMS components are as decoupled from each other as possible,
Because **Mayan EDMS** components are as decoupled from each other as possible,
storage in this case is decoupled and its behavior is controlled
not by the project but by the ``Storage`` module class. All the other
modules don't make any assumptions about how the actual document files are
stored. This way files can be saved locally, over the network or even across
the Internet and everything will still operate exactly the same.
The default file storage backend: ``storage.backends.filebasedstorage.FileBasedStorage``
is a simple backend that only supports paths and not IP addresses. In case you
are interested in using remote volumes to store documents (NFS, SAMBA), first
mount these volumes so that they appear as a directories to Mayan EDMS. For
direct support for remote volumes a custom backend would be needed such as those
provided by the Django Storages project (https://django-storages.readthedocs.org/en/latest/).

View File

@@ -1,7 +1,7 @@
Concepts
========
Introductions to all the key parts of Mayan EDMS you'll need to know:
Introductions to all the key parts of **Mayan EDMS** you'll need to know:
.. toctree::
:maxdepth: 1
@@ -15,13 +15,8 @@ Introductions to all the key parts of Mayan EDMS you'll need to know:
checkouts
versioning
signatures
ocr_backend
indexes
languages
smart_links
tags
mailing
settings
file_storage
backups
screenshots

View File

@@ -17,7 +17,7 @@ Example:
- Metadata type: ``Product year``, associated as a required metadata for the document type ``Product sheet``.
- Index: ``Product sheets per year``, and associated to the document type ``Product sheet``.
- Index slug: ``product-sheets-per-year``. Slugs are internal unique identifiers that can be used by other Mayan EDMS modules to reference each index.
- Index slug: ``product-sheets-per-year``. Slugs are internal unique identifiers that can be used by other **Mayan EDMS** modules to reference each index.
- Index tree template as follows:
.. blockdiag::

View File

@@ -2,11 +2,11 @@
Installation
============
Mayan EDMS should be deployed like any other Django_ project and
**Mayan EDMS** should be deployed like any other Django_ project and
preferably using virtualenv_.
Being a Django_ and a Python_ project, familiarity with these technologies is
recommended to better understand why Mayan EDMS does some of the things it
recommended to better understand why **Mayan EDMS** does some of the things it
does.
Bellow are the step needed for a test install.
@@ -20,13 +20,13 @@ Ubuntu
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
requirements using::
sudo apt-get install libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
sudo apt-get install libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr unpaper poppler-utils -y
Mac OSX
-------
Mayan EDMS is dependent on a number of binary packages and the recommended
**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/>`_.
@@ -45,7 +45,7 @@ With MacPorts installed run the command:
Set the Binary paths
********************
Mayan EDMS by default will look in /usr/bin/ for the binary files it needs
**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 ...
@@ -71,7 +71,7 @@ With Homebrew installed run the command:
Set the Binary paths
********************
Mayan EDMS by default will look in /usr/bin/ for the binary files it needs
**Mayan EDMS** by default will look in /usr/bin/ for the binary files it needs
so either you can symlink the binaries installed via brew in /usr/local/bin/
to /usr/bin/ with ...
@@ -99,8 +99,8 @@ Initialize a ``virtualenv`` to deploy the project:
source venv/bin/activate
pip install mayan-edms
By default Mayan EDMS will create a single file SQLite_ database, which makes
it very easy to start using Mayan EDMS. Populate the database with the
By default **Mayan EDMS** will create a single file SQLite_ database, which makes
it very easy to start using **Mayan EDMS**. Populate the database with the
project's schema doing:
.. code-block:: bash
@@ -112,22 +112,14 @@ Point your browser to http://127.0.0.1:8000. If everything was installed
correctly you should see the login screen and panel showing a randomly generated
admin password.
Background tasks and scheduled tasks will not run when using the test server.
Note: Background tasks and scheduled tasks will not run when using the test server.
The ``runserver`` command is only meant for testing, do not use in a production
server.
Note that the default IP address, 127.0.0.1, is not accessible from other
machines on your network. To make your test server viewable to other
machines on the network, use its own IP address (e.g. 192.168.2.1) or 0.0.0.0 or :: (with IPv6 enabled).
You can provide an IPv6 address surrounded by brackets (e.g. [200a::1]:8000). This will automatically enable IPv6 support.
Production use
==============
After making sure everything is running correctly, stop the ``runserver`` command.
Deploy Mayan EDMS using the webserver of your preference. For more information
After making sure everything is running correctly, stop the `runserver` command.
Deploy **Mayan EDMS** using the webserver of your preference. For more information
on deployment instructions and examples, checkout Django's official documentation
on the topic https://docs.djangoproject.com/en/1.7/howto/deployment/
For a simple production deployment setup follow the instructions in the

View File

@@ -1,19 +0,0 @@
=========
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_CHOICES``,
and set it to a nested list of abbreviations + languages names like::
DOCUMENTS_LANGUAGE_CHOICES = (('eng', 'English'), ('spa', 'Spanish'))
The default language to appear on the dropdown can also be configured using::
DOCUMENTS_LANGUAGE = 'spa'
Use the correct ISO 639-3 language abbreviation (https://en.wikipedia.org/wiki/ISO_639)
as this code is used in several subsystems in Mayan EDMS such as the OCR app
to determine how to interpret the document.

View File

@@ -2,7 +2,7 @@
License
=======
Mayan EDMS is distributed under the `Apache 2.0 License`_.
**Mayan EDMS** is distributed under the `Apache 2.0 License`_.
The complete license terms are included below.
.. _Apache 2.0 License: https://www.apache.org/licenses/LICENSE-2.0.txt

View File

@@ -1,17 +0,0 @@
=================
Mailing documents
=================
To be able to send documents via email from inside Mayan EDMS you need to add
and configure the following configuration variables in your
mayan/settings/local.py file::
EMAIL_HOST = 'smtp.gmail.com' # Or similar
EMAIL_PORT = 587
EMAIL_HOST_USER = '<your smtp username>'
EMAIL_HOST_PASSWORD = '<your smtp password>'
EMAIL_USE_TLS = True
"Mail is sent using the SMTP host and port specified in the EMAIL_HOST and EMAIL_PORT settings. The EMAIL_HOST_USER andEMAIL_HOST_PASSWORD settings, if set, are used to authenticate to the SMTP server, and the EMAIL_USE_TLS and EMAIL_USE_SSL settings control whether a secure connection is used."
For more details consult Django's documentation on the topic: https://docs.djangoproject.com/en/1.8/ref/settings/#email-host

View File

@@ -1,15 +0,0 @@
===========
OCR backend
===========
Mayan EDMS ships an OCR backend that uses the FLOSS engine Tesseract, but it can
use other engines. To support other engines a wrapper that subclasess the
``OCRBackendBase`` class defined in mayan/apps/ocr/classes. This subclass should
expose the ``execute`` method. For an example of how the Tesseract backend
is implemented take a look at the file ``mayan/apps/ocr/backends/tesseract.py``
Once you create you own backend, in your local.py settings add the option
OCR_BACKEND and point it to your new OCR backend class path.
The default value of OCR_BACKEND is ``"ocr.backends.tesseract.Tesseract"``

View File

@@ -2,7 +2,7 @@
Permissions
===========
Mayan EDMS provides very fine control over which actions users can
**Mayan EDMS** provides very fine control over which actions users can
perform. Action control works by allowing ``roles``, that are composed of
``groups`` of ``users`` to be granted a ``permission`` such that the holder of
that permission can exercise it throughout the entire system.

View File

@@ -1,102 +0,0 @@
=======
Roadmap
=======
- Goals for version 2.2:
- Improve workflow system
- Workflow indexing support. Accessor already works ``{{ document.workflows.all.0.get_current_state }}``. Index recalculation after workflow transition is missing.
- 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.
- Replace indexing and smart linking template language (use Jinja2 instead of Django's).
- Display/find documents by their current workflow state.
- Goals for version 3.0:
- Replace UI.
- General goals:
- Distribution:
- Debian packages. Limited success so far using https://github.com/astraw/stdeb.
- Downloads:
- Transition from filetransfer package to django-downloadview. This task was started and the view ``common.generics.SingleObjectDownloadView`` was created. The ``document_signatures`` app is the first app to use it.
- 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.
- Improve interface with tesseract.
- Fix pytesseract shortcomings via upstream patches or re-implement. Move to PyOCR.
- 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``
- Source code:
- Implement Developer certificate of origin: http://developercertificate.org/
- 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.
- Make more view asynchronous:
- trash can emptying.
- document delete view.
- Add support for loading settings from environment variables, not just settings/local.py.
- 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.
- Workaround GitLab CI MySQL test errors. GitLab MySQL's container doesn't support UTF-8 content.
- Add support for downloading the OCR content as a text file.
- 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 task viewer.
- 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 entry in About menu to check latest Mayan EDMS version via PyPI.
- Add GPG key generation.
- Add documentation section on editing the settings/local.py file.
- Add documentation section with warning about using runserver.
- Replace ``urlpatterns = patterns( ''``, with Python lists. Django recommendation for post 1.7.
- 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

@@ -1,12 +0,0 @@
========
Settings
========
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``.
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.

View File

@@ -2,7 +2,7 @@
Document signatures
===================
Mayan EDMS supports two types of document signatures: embedded and
**Mayan EDMS** supports two types of document signatures: embedded and
detached signatures. When a document with an embedded signature is
uploaded, this signature is readily detected as part of the document
inspection step. The status of the signature can be verified by accessing the

View File

@@ -7,16 +7,5 @@ documents. For example: a scanning equipment may only produce landscape PDFs.
In this case an useful transformation for that document source would be to
rotate all documents scanned by 270 degrees after being uploaded, this way
whenever a document is uploaded from that scanner it will appear in portrait
orientation. In this case add a this transformation to the Mayan EDMS source
that is connected to that device this way all pages scanned via that source
with inherit the transformation as they are created.
Transformations can also be added to existing documents, by clicking on a
document's page, then clicking on "transformations". In this view the Actions
menu will have a new option that reads "Create new transformation". At the
moment the rotation, zoom, crop, and resize transformations are available.
Once the document image has been corrected resubmit it for OCR for improved
results.
Transformations are not destructive and do not physically modify the document
file, they just modify the document's graphical representation.
orientation. Transformations do not physically modify the document file but
are just associated with the document's temporary graphical representation.

View File

@@ -2,7 +2,7 @@
Document versioning
===================
Mayan EDMS has the ability to store different versions of the same
**Mayan EDMS** has the ability to store different versions of the same
document. A comment field is provided to allow users to summarize the new
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

View File

@@ -1,10 +1,10 @@
from __future__ import unicode_literals
__title__ = 'Mayan EDMS'
__version__ = '2.1.3'
__build__ = 0x020103
__version__ = '2.0.2'
__build__ = 0x020002
__author__ = 'Roberto Rosario'
__author_email__ = 'roberto.rosario@mayan-edms.com'
__description__ = 'Free Open Source Electronic Document Management System'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2011-2016 Roberto Rosario'
__copyright__ = 'Copyright 2011-2015 Roberto Rosario'

View File

@@ -5,7 +5,8 @@ from django.utils.translation import ugettext_lazy as _
from common import MayanAppConfig, menu_object, menu_sidebar
from navigation import SourceColumn
from .links import link_acl_create, link_acl_delete, link_acl_permissions
from .links import link_acl_new, link_acl_delete, link_acl_permissions
from .models import AccessControlList
class ACLsApp(MayanAppConfig):
@@ -16,8 +17,6 @@ class ACLsApp(MayanAppConfig):
def ready(self):
super(ACLsApp, self).ready()
AccessControlList = self.get_model('AccessControlList')
SourceColumn(
source=AccessControlList, label=_('Permissions'),
attribute='get_permission_titles'
@@ -31,5 +30,5 @@ class ACLsApp(MayanAppConfig):
sources=(AccessControlList,)
)
menu_sidebar.bind_links(
links=(link_acl_create,), sources=('acls:acl_list',)
links=(link_acl_new,), sources=('acls:acl_list',)
)

View File

@@ -2,7 +2,7 @@ from __future__ import unicode_literals, absolute_import
import logging
from django.apps import apps
from permissions.models import StoredPermission
logger = logging.getLogger(__name__)
@@ -20,23 +20,15 @@ class ModelPermission(object):
@classmethod
def get_for_instance(cls, instance):
StoredPermission = apps.get_model(
app_label='permissions', model_name='StoredPermission'
)
try:
permissions = cls._registry[type(instance)]
except KeyError:
try:
permissions = cls._registry[cls._proxies[type(instance)]]
except KeyError:
permissions = ()
permissions = []
class_permissions = cls._registry.get(type(instance))
if class_permissions:
permissions.extend(class_permissions)
proxy = cls._proxies.get(type(instance))
if proxy:
permissions.extend(cls._registry.get(proxy))
pks = [permission.stored_permission.pk for permission in set(permissions)]
pks = [permission.stored_permission.pk for permission in permissions]
return StoredPermission.objects.filter(pk__in=pks)
@classmethod

View File

@@ -23,20 +23,18 @@ def get_kwargs_factory(variable_name):
link_acl_delete = Link(
permissions=(permission_acl_edit,), permissions_related='content_object',
tags='dangerous', text=_('Delete'), view='acls:acl_delete',
args='resolved_object.pk'
permissions=(permission_acl_edit,), tags='dangerous', text=_('Delete'),
view='acls:acl_delete', args='resolved_object.pk'
)
link_acl_list = Link(
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list',
kwargs=get_kwargs_factory('resolved_object')
)
link_acl_create = Link(
link_acl_new = Link(
permissions=(permission_acl_edit,), text=_('New ACL'),
view='acls:acl_create', kwargs=get_kwargs_factory('resolved_object')
view='acls:acl_new', kwargs=get_kwargs_factory('resolved_object')
)
link_acl_permissions = Link(
permissions=(permission_acl_edit,), permissions_related='content_object',
text=_('Permissions'), view='acls:acl_permissions',
args='resolved_object.pk'
permissions=(permission_acl_edit,), text=_('Permissions'),
view='acls:acl_permissions', args='resolved_object.pk'
)

View File

@@ -1,34 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/"
"ar/)\n"
"Language: ar\n"
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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"
"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:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "الصلاحيات"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -37,12 +36,13 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Insufficient access."
msgstr ""
#: models.py:44
msgid "Access entry"
@@ -54,50 +54,51 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "لا شيء"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Access control lists"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Edit ACLs"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "View ACLs"
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -194,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/"
"language/bg/)\n"
"Language: bg\n"
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/language/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Разрешения"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -36,12 +36,13 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Недостатъчен достъп."
msgstr ""
#: models.py:44
msgid "Access entry"
@@ -53,11 +54,11 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "Няма"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Контролни списъци за достъп"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
@@ -67,36 +68,37 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,34 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/"
"rosarior/mayan-edms/language/bs_BA/)\n"
"Language: bs_BA\n"
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/rosarior/mayan-edms/language/bs_BA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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"
"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:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Dozvole"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -37,12 +36,13 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Nedovoljne dozvole."
msgstr ""
#: models.py:44
msgid "Access entry"
@@ -54,50 +54,51 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "Nijedno"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Liste kontrole pristupa (ACLs)"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Izmjeniti ACLs"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "Pregledati ACLs"
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -194,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Danish (http://www.transifex.com/rosarior/mayan-edms/language/"
"da/)\n"
"Language: da\n"
"Language-Team: Danish (http://www.transifex.com/rosarior/mayan-edms/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -36,10 +36,11 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr ""
@@ -53,7 +54,7 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "Ingen"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
@@ -67,36 +68,37 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
# Berny <berny@bernhard-marx.de>, 2015
@@ -9,26 +9,26 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Mathias Behrle <mathiasb@m9s.biz>\n"
"Language-Team: German (Germany) (http://www.transifex.com/rosarior/mayan-"
"edms/language/de_DE/)\n"
"Language: de_DE\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 17:20+0000\n"
"Last-Translator: Berny <berny@bernhard-marx.de>\n"
"Language-Team: German (Germany) (http://www.transifex.com/rosarior/mayan-edms/language/de_DE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "Zugriffsberechtigungen"
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Berechtigungen"
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "Rolle"
@@ -37,10 +37,11 @@ msgid "Delete"
msgstr "Löschen"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr "Neue Berechtigung"
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Fehlende Berechtigung"
@@ -68,39 +69,39 @@ msgstr "Zugriffsberechtigungen bearbeiten"
msgid "View ACLs"
msgstr "Zugriffsberechtigungen anzeigen"
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr "Neue Zugriffsberechtigung für %s"
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr "ACL \"%s\" löschen"
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr "Zugriffsberechtigungen für %s"
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr "Neue Zugriffsberechtigung für %s"
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr "ACL \"%s\" löschen"
#: views.py:147
msgid "Available permissions"
msgstr "Verfügbare Berechtigungen"
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr "Erteilte Berechtigungen"
#: views.py:222
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr "Deaktivierte Berechtigungen sind von einem übergeordneten Objekt vererbt."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
"Deaktivierte Berechtigungen sind von einem übergeordneten Objekt vererbt."
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,10 +196,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2012-02-02 18:20+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: English (http://www.transifex.com/projects/p/mayan-edms/"
@@ -22,12 +22,12 @@ msgstr ""
msgid "ACLs"
msgstr "ACLs"
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
#, fuzzy
msgid "Permissions"
msgstr "permissions"
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#, fuzzy
#| msgid "Roles"
msgid "Role"
@@ -43,7 +43,7 @@ msgstr ""
msgid "New ACL"
msgstr "View ACLs"
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Insufficient access."
@@ -73,39 +73,39 @@ msgstr "Edit ACLs"
msgid "View ACLs"
msgstr "View ACLs"
#: views.py:78
#: views.py:61
#, fuzzy, python-format
msgid "Access control lists for: %s"
msgstr "access control lists for: %s"
#: views.py:107
#, fuzzy, python-format
msgid "New access control lists for: %s"
msgstr "access control lists for: %s"
#: views.py:109
#: views.py:132
#, fuzzy, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr "Default ACLs"
#: views.py:151
#, fuzzy, python-format
msgid "Access control lists for: %s"
msgstr "access control lists for: %s"
#: views.py:162
#: views.py:147
#, fuzzy
msgid "Available permissions"
msgstr "has permission"
#: views.py:163
#: views.py:148
#, fuzzy
msgid "Granted permissions"
msgstr "has permission"
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"

View File

@@ -6,13 +6,13 @@
# Translators:
# jmcainzos <jmcainzos@vodafone.es>, 2015
# Roberto Rosario, 2015
# Roberto Rosario, 2015-2016
# Roberto Rosario, 2015
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-05-09 01:48+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+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"
@@ -25,11 +25,11 @@ msgstr ""
msgid "ACLs"
msgstr "LCAs"
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Permisos"
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "Rol"
@@ -43,7 +43,7 @@ msgstr "Borrar"
msgid "New ACL"
msgstr "Nueva LCA"
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Acceso insuficiente."
@@ -71,39 +71,39 @@ msgstr "Editar LCAs"
msgid "View ACLs"
msgstr "Ver LCAs"
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr "Nueva lista de control de acceso para: %s"
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr "Borrar LCA: %s"
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr "Listas de control de acceso para: %s"
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr "Nueva lista de control de acceso para: %s"
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr "Permisos disponibles"
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr "Permisos otorgados"
#: views.py:222
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr "Los permisos inactivos se heredan de un objeto precedente."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Permisos del rol \"%(role)s\" para \"%(object)s\""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr "Los permisos inactivos se heredan de un objeto precedente."
#~ msgid "New holder"
#~ msgstr "New holder"

View File

@@ -1,102 +1,104 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Persian (http://www.transifex.com/rosarior/mayan-edms/"
"language/fa/)\n"
"Language: fa\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=1; plural=0;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "مجوزها"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "نقش"
msgstr ""
#: links.py:26
msgid "Delete"
msgstr "حذف"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "دسترسی ناکافی"
msgstr ""
#: models.py:44
msgid "Access entry"
msgstr "ورودی دسترسی"
msgstr ""
#: models.py:45
msgid "Access entries"
msgstr "ورودیهای دسترسی"
msgstr ""
#: models.py:60
msgid "None"
msgstr "هیچکدام."
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "لیست کنترل دسترسی ها"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "ویرایش دسترسی ها"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "دیدن دسترسی ها"
msgstr ""
#: views.py:78
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "لیست کنترل دسترسی ها برای : %s"
#: views.py:162
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,104 +1,105 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Christophe CHAUVET <christophe.chauvet@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/rosarior/mayan-edms/language/"
"fr/)\n"
"Language: fr\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+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"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "Droits"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Permissions"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "Rôle"
msgstr ""
#: links.py:26
msgid "Delete"
msgstr "Suppression"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr "Nouveau droit"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "droit d'accès insuffisant."
msgstr ""
#: models.py:44
msgid "Access entry"
msgstr "Entrée d'accès"
msgstr ""
#: models.py:45
msgid "Access entries"
msgstr "Entrées d'accès"
msgstr ""
#: models.py:60
msgid "None"
msgstr "Aucun"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Liste de contrôle des accès"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editer les droits"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "voir les droits d'accès"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr "Nouvelle liste de contrôle d'accès pour: %s"
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr "Supprimer le droit: %s"
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr "Liste des contrôle d'accès pour: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr "Permissions disponibles"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr "Permissions autorisées"
msgstr ""
#: views.py:222
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Permission du rôle \"%(role)s\" pour \"%(object)s\"@"
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr "La désactivation de permission est hérité de l'objet parent"
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -194,10 +195,8 @@ msgstr "La désactivation de permission est hérité de l'objet parent"
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Hungarian (http://www.transifex.com/rosarior/mayan-edms/"
"language/hu/)\n"
"Language: hu\n"
"Language-Team: Hungarian (http://www.transifex.com/rosarior/mayan-edms/language/hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACL-ek"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -36,10 +36,11 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr ""
@@ -53,7 +54,7 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "Semmi"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
@@ -67,36 +68,37 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Indonesian (http://www.transifex.com/rosarior/mayan-edms/"
"language/id/)\n"
"Language: id\n"
"Language-Team: Indonesian (http://www.transifex.com/rosarior/mayan-edms/language/id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -36,10 +36,11 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr ""
@@ -67,36 +68,37 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,104 +1,106 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Italian (http://www.transifex.com/rosarior/mayan-edms/"
"language/it/)\n"
"Language: it\n"
"Language-Team: Italian (http://www.transifex.com/rosarior/mayan-edms/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Permessi"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "Ruolo"
msgstr ""
#: links.py:26
msgid "Delete"
msgstr "Cancella"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Accesso insufficiente."
msgstr ""
#: models.py:44
msgid "Access entry"
msgstr "Voce di accesso"
msgstr ""
#: models.py:45
msgid "Access entries"
msgstr "Voci di accesso"
msgstr ""
#: models.py:60
msgid "None"
msgstr "Nessuna "
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Liste di controllo accessi"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Modifica ACL"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "Visualizza ACL"
msgstr ""
#: views.py:78
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "Lista dei permessi d'accesso per: %s"
#: views.py:162
#: views.py:147
msgid "Available permissions"
msgstr "Autorizzazioni disponibili "
#: views.py:163
msgid "Granted permissions"
msgstr "Autorizzazioni concesse "
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,104 +1,105 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
# Justin Albstbstmeijer <justin@albstmeijer.nl>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Justin Albstbstmeijer <justin@albstmeijer.nl>\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/rosarior/mayan-"
"edms/language/nl_NL/)\n"
"Language: nl_NL\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+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"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl_NL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "Authorisatielijsten"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Permissies"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "Gebruikersrol"
msgstr ""
#: links.py:26
msgid "Delete"
msgstr "Verwijder"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr "Nieuwe authorisatielijst"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Permissie is ontoereikend"
msgstr ""
#: models.py:44
msgid "Access entry"
msgstr "Authorisatie invoer"
msgstr ""
#: models.py:45
msgid "Access entries"
msgstr "Authorisaties invoer"
msgstr ""
#: models.py:60
msgid "None"
msgstr "Geen"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Authorisatielijsten"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Bewerk authorisatielijsten"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "Bekijk authorisatielijsten"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr "Nieuwe authorisatielijsten voor: %s"
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr "Verwijder authorisatielijst: %s"
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr "Authorisatielijsten voor: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr "Beschikbare permissies"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr "Toegekende permissies"
msgstr ""
#: views.py:222
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Rol \"%(role)s\" permissies voor \"%(object)s\""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr "Uitgeschakelde permissies zijn geërfd van een parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -194,10 +195,8 @@ msgstr "Uitgeschakelde permissies zijn geërfd van een parent object."
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,105 +1,105 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
# Wojciech Warczakowski <w.warczakowski@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Wojciech Warczakowski <w.warczakowski@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/rosarior/mayan-edms/language/"
"pl/)\n"
"Language: pl\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+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"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "Listy ACL"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Uprawnienia"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "Rola"
msgstr ""
#: links.py:26
msgid "Delete"
msgstr "Usuń"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr "Nowa lista ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Niewystarczający dostęp."
msgstr ""
#: models.py:44
msgid "Access entry"
msgstr "Zgłoszenie dostępu"
msgstr ""
#: models.py:45
msgid "Access entries"
msgstr "Zgłoszenia dostępu"
msgstr ""
#: models.py:60
msgid "None"
msgstr "Brak"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Listy ACL"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Edytuj listy ACL"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "Przeglądaj listy ACL"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr "Nowe listy ACL dla: %s"
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr "Usuń listę ACL: %s"
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr "Listy ACL dla: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr "Dostępne uprawnienia"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr "Przyznane uprawnienia"
msgstr ""
#: views.py:222
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Uprawnienia roli \"%(role)s\" dla obiektu \"%(object)s\""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr "Domyślne uprawnienia są dziedziczone z obiektu nadrzędnego."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,10 +195,8 @@ msgstr "Domyślne uprawnienia są dziedziczone z obiektu nadrzędnego."
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,47 +1,48 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Portuguese (http://www.transifex.com/rosarior/mayan-edms/"
"language/pt/)\n"
"Language: pt\n"
"Language-Team: Portuguese (http://www.transifex.com/rosarior/mayan-edms/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACL's"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Permissões"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
#: links.py:26
msgid "Delete"
msgstr "Eliminar"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Acesso insuficiente."
msgstr ""
#: models.py:44
msgid "Access entry"
@@ -53,50 +54,51 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "Nenhum"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Listas de controlo de acesso"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editar ACL's"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "Ver ACL's"
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,102 +1,104 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/rosarior/mayan-"
"edms/language/pt_BR/)\n"
"Language: pt_BR\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/rosarior/mayan-edms/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Permissões"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "Regras"
msgstr ""
#: links.py:26
msgid "Delete"
msgstr "Excluir"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Acesso insuficiente."
msgstr ""
#: models.py:44
msgid "Access entry"
msgstr "Acesso entrada"
msgstr ""
#: models.py:45
msgid "Access entries"
msgstr "Entradas de acesso"
msgstr ""
#: models.py:60
msgid "None"
msgstr "Nenhum"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Listas de controle de acesso"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editar ACLs"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "Visualizar ACLs"
msgstr ""
#: views.py:78
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "listas de controle de acesso para: %s"
#: views.py:162
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,34 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/rosarior/mayan-"
"edms/language/ro_RO/)\n"
"Language: ro_RO\n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/rosarior/mayan-edms/language/ro_RO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
"Language: ro_RO\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACL-uri"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Permisiuni"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -37,12 +36,13 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Accesul insuficient."
msgstr ""
#: models.py:44
msgid "Access entry"
@@ -54,50 +54,51 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "Nici unul"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Lista de control acces"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editați ACL-uri"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "Vezi ACL-uri"
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -194,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,35 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Russian (http://www.transifex.com/rosarior/mayan-edms/"
"language/ru/)\n"
"Language: ru\n"
"Language-Team: Russian (http://www.transifex.com/rosarior/mayan-edms/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"%100>=11 && n%100<=14)? 2 : 3);\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "Разрешения"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -38,12 +36,13 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "Недостаточный доступ."
msgstr ""
#: models.py:44
msgid "Access entry"
@@ -55,50 +54,51 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "Ни один"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "Списки контроля доступа"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Редактировать списки ACL"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "Просмотр списков ACL"
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -195,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,34 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/rosarior/mayan-"
"edms/language/sl_SI/)\n"
"Language: sl_SI\n"
"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/rosarior/mayan-edms/language/sl_SI/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3);\n"
"Language: sl_SI\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -37,10 +36,11 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr ""
@@ -54,7 +54,7 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "Brez"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
@@ -68,36 +68,37 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -194,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/rosarior/"
"mayan-edms/language/vi_VN/)\n"
"Language: vi_VN\n"
"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/rosarior/mayan-edms/language/vi_VN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: vi_VN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "ACLs"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -36,10 +36,11 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr ""
@@ -53,7 +54,7 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr "None"
msgstr ""
#: permissions.py:7
msgid "Access control lists"
@@ -67,36 +68,37 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Chinese (China) (http://www.transifex.com/rosarior/mayan-edms/"
"language/zh_CN/)\n"
"Language: zh_CN\n"
"Language-Team: Chinese (China) (http://www.transifex.com/rosarior/mayan-edms/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "访问控制列表"
msgstr ""
#: apps.py:22 links.py:38 models.py:36
#: apps.py:20 links.py:38 models.py:36
msgid "Permissions"
msgstr "权限"
msgstr ""
#: apps.py:26 models.py:38
#: apps.py:24 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr ""
@@ -36,67 +36,69 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:85
#: managers.py:72
msgid "Insufficient access."
msgstr "权限不足"
msgstr ""
#: models.py:44
msgid "Access entry"
msgstr "访问入口"
msgstr ""
#: models.py:45
msgid "Access entries"
msgstr "多个访问入口"
msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr "访问控制列表"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr "编辑访问控制列表"
msgstr ""
#: permissions.py:13
msgid "View ACLs"
msgstr "查看访问控制列表"
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:109
#, python-format
msgid "Delete ACL: %s"
msgstr ""
#: views.py:151
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
#: views.py:107
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
msgid "Available permissions"
msgstr ""
#: views.py:163
#: views.py:148
msgid "Granted permissions"
msgstr ""
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
#: views.py:218
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#~ msgid "New holder"
@@ -193,10 +195,8 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -8,7 +8,6 @@ from django.db import models
from django.db.models import Q
from django.utils.translation import ugettext
from common.utils import return_attrib
from permissions.models import StoredPermission
from .classes import ModelPermission
@@ -55,11 +54,10 @@ class AccessControlListManager(models.Manager):
permission.stored_permission for permission in permissions
]
except TypeError:
# Not a list of permissions, just one
stored_permissions = [permissions.stored_permission]
if related:
obj = return_attrib(obj, related)
obj = getattr(obj, related)
try:
parent_accessor = ModelPermission.get_inheritance(obj._meta.model)
@@ -74,14 +72,15 @@ class AccessControlListManager(models.Manager):
pass
user_roles = []
for group in user.organization_groups.all():
for group in user.groups.all():
for role in group.roles.all():
if set(stored_permissions).intersection(set(self.get_inherited_permissions(role=role, obj=obj))):
return True
user_roles.append(role)
if not self.model.on_organization.filter(content_type=ContentType.objects.get_for_model(obj), object_id=obj.pk, permissions__in=stored_permissions, role__in=user_roles).exists():
# TODO: possible .exists() optimization
if not self.filter(content_type=ContentType.objects.get_for_model(obj), object_id=obj.pk, permissions__in=stored_permissions, role__in=user_roles):
raise PermissionDenied(ugettext('Insufficient access.'))
def filter_by_access(self, permission, user, queryset):
@@ -89,7 +88,7 @@ class AccessControlListManager(models.Manager):
return queryset
user_roles = []
for group in user.organization_groups.all():
for group in user.groups.all():
for role in group.roles.all():
user_roles.append(role)

View File

@@ -1,21 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import organizations.shortcuts
class Migration(migrations.Migration):
dependencies = [
('organizations', '0002_add_data_default_organization'),
('acls', '0002_auto_20150703_0513'),
]
operations = [
migrations.AddField(
model_name='accesscontrollist',
name='organization',
field=models.ForeignKey(default=organizations.shortcuts.get_current_organization, to='organizations.Organization'),
),
]

View File

@@ -2,15 +2,12 @@ from __future__ import absolute_import, unicode_literals
import logging
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
from organizations.models import Organization
from organizations.managers import CurrentOrganizationManager
from organizations.shortcuts import get_current_organization
from permissions.models import Role, StoredPermission
from .managers import AccessControlListManager
@@ -29,13 +26,10 @@ class AccessControlList(models.Model):
related_name='object_content_type'
)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey(
content_object = generic.GenericForeignKey(
ct_field='content_type',
fk_field='object_id',
)
organization = models.ForeignKey(
Organization, default=get_current_organization
)
# TODO: limit choices to the permissions valid for the content_object
permissions = models.ManyToManyField(
StoredPermission, blank=True, related_name='acls',
@@ -44,7 +38,6 @@ class AccessControlList(models.Model):
role = models.ForeignKey(Role, related_name='acls', verbose_name=_('Role'))
objects = AccessControlListManager()
on_organization = CurrentOrganizationManager()
class Meta:
unique_together = ('content_type', 'object_id', 'role')
@@ -52,11 +45,7 @@ class AccessControlList(models.Model):
verbose_name_plural = _('Access entries')
def __str__(self):
return _('Permissions "%(permissions)s" to role "%(role)s" for "%(object)s"') % {
'permissions': self.get_permission_titles(),
'object': self.content_object,
'role': self.role
}
return '{} <=> {}'.format(self.content_object, self.role)
def get_inherited_permissions(self):
return AccessControlList.objects.get_inherited_permissions(

View File

@@ -1,103 +0,0 @@
from __future__ import unicode_literals
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from documents.tests.test_views import GenericDocumentViewTestCase
from user_management.tests.literals import (
TEST_USER_PASSWORD, TEST_USER_USERNAME
)
from ..links import (
link_acl_delete, link_acl_list, link_acl_create, link_acl_permissions
)
from ..models import AccessControlList
from ..permissions import permission_acl_edit, permission_acl_view
class ACLsLinksTestCase(GenericDocumentViewTestCase):
def test_document_acl_create_link(self):
acl = AccessControlList.objects.create(
content_object=self.document, role=self.role
)
acl.permissions.add(permission_acl_edit.stored_permission)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.add_test_view(test_object=self.document)
context = self.get_test_view()
resolved_link = link_acl_create.resolve(context=context)
self.assertNotEqual(resolved_link, None)
content_type = ContentType.objects.get_for_model(self.document)
kwargs = {
'app_label': content_type.app_label,
'model': content_type.model,
'object_id': self.document.pk
}
self.assertEqual(
resolved_link.url, reverse('acls:acl_create', kwargs=kwargs)
)
def test_document_acl_delete_link(self):
acl = AccessControlList.objects.create(
content_object=self.document, role=self.role
)
acl.permissions.add(permission_acl_edit.stored_permission)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.add_test_view(test_object=acl)
context = self.get_test_view()
resolved_link = link_acl_delete.resolve(context=context)
self.assertNotEqual(resolved_link, None)
self.assertEqual(
resolved_link.url, reverse('acls:acl_delete', args=(acl.pk,))
)
def test_document_acl_edit_link(self):
acl = AccessControlList.objects.create(
content_object=self.document, role=self.role
)
acl.permissions.add(permission_acl_edit.stored_permission)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.add_test_view(test_object=acl)
context = self.get_test_view()
resolved_link = link_acl_permissions.resolve(context=context)
self.assertNotEqual(resolved_link, None)
self.assertEqual(
resolved_link.url, reverse('acls:acl_permissions', args=(acl.pk,))
)
def test_document_acl_list_link(self):
acl = AccessControlList.objects.create(
content_object=self.document, role=self.role
)
acl.permissions.add(permission_acl_view.stored_permission)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.add_test_view(test_object=self.document)
context = self.get_test_view()
resolved_link = link_acl_list.resolve(context=context)
self.assertNotEqual(resolved_link, None)
content_type = ContentType.objects.get_for_model(self.document)
kwargs = {
'app_label': content_type.app_label,
'model': content_type.model,
'object_id': self.document.pk
}
self.assertEqual(
resolved_link.url, reverse('acls:acl_list', kwargs=kwargs)
)

View File

@@ -1,17 +1,17 @@
from __future__ import absolute_import, unicode_literals
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.core.exceptions import PermissionDenied
from django.test import override_settings
from django.core.files import File
from django.test import TestCase, override_settings
from documents.models import Document, DocumentType
from documents.permissions import permission_document_view
from documents.tests import TEST_SMALL_DOCUMENT_PATH, TEST_DOCUMENT_TYPE
from organizations.tests.base import OrganizationTestCase
from permissions.classes import Permission
from permissions.models import Role
from permissions.tests.literals import TEST_ROLE_LABEL
from user_management.models import MayanGroup
from user_management.tests.literals import TEST_USER_USERNAME, TEST_GROUP
from ..models import AccessControlList
@@ -20,50 +20,46 @@ TEST_DOCUMENT_TYPE_2 = 'test document type 2'
@override_settings(OCR_AUTO_OCR=False)
class PermissionTestCase(OrganizationTestCase):
class PermissionTestCase(TestCase):
def setUp(self):
super(PermissionTestCase, self).setUp()
self.document_type_1 = DocumentType.on_organization.create(
self.document_type_1 = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE
)
self.document_type_2 = DocumentType.on_organization.create(
self.document_type_2 = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_2
)
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document_1 = self.document_type_1.new_document(
file_object=file_object
file_object=File(file_object)
)
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document_2 = self.document_type_1.new_document(
file_object=file_object
file_object=File(file_object)
)
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document_3 = self.document_type_2.new_document(
file_object=file_object
file_object=File(file_object)
)
self.user = get_user_model().on_organization.create(
self.user = get_user_model().objects.create(
username=TEST_USER_USERNAME
)
self.group = MayanGroup.on_organization.create(name=TEST_GROUP)
self.role = Role.on_organization.create(label=TEST_ROLE_LABEL)
self.group = Group.objects.create(name=TEST_GROUP)
self.role = Role.objects.create(label=TEST_ROLE_LABEL)
self.group.users.add(self.user)
self.role.organization_groups.add(self.group)
self.group.user_set.add(self.user)
self.role.groups.add(self.group)
Permission.invalidate_cache()
def tearDown(self):
for document_type in DocumentType.on_organization.all():
for document_type in DocumentType.objects.all():
document_type.delete()
super(PermissionTestCase, self).tearDown()
def test_check_access_without_permissions(self):
with self.assertRaises(PermissionDenied):
AccessControlList.objects.check_access(
@@ -80,7 +76,7 @@ class PermissionTestCase(OrganizationTestCase):
)
def test_check_access_with_acl(self):
acl = AccessControlList.on_organization.create(
acl = AccessControlList.objects.create(
content_object=self.document_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -96,7 +92,7 @@ class PermissionTestCase(OrganizationTestCase):
def test_filtering_with_permissions(self):
self.role.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.on_organization.create(
acl = AccessControlList.objects.create(
content_object=self.document_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -109,7 +105,7 @@ class PermissionTestCase(OrganizationTestCase):
)
def test_check_access_with_inherited_acl(self):
acl = AccessControlList.on_organization.create(
acl = AccessControlList.objects.create(
content_object=self.document_type_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -123,12 +119,12 @@ class PermissionTestCase(OrganizationTestCase):
self.fail('PermissionDenied exception was not expected.')
def test_check_access_with_inherited_acl_and_local_acl(self):
acl = AccessControlList.on_organization.create(
acl = AccessControlList.objects.create(
content_object=self.document_type_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.on_organization.create(
acl = AccessControlList.objects.create(
content_object=self.document_3, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -144,7 +140,7 @@ class PermissionTestCase(OrganizationTestCase):
def test_filtering_with_inherited_permissions(self):
self.role.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.on_organization.create(
acl = AccessControlList.objects.create(
content_object=self.document_type_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -160,12 +156,12 @@ class PermissionTestCase(OrganizationTestCase):
def test_filtering_with_inherited_permissions_and_local_acl(self):
self.role.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.on_organization.create(
acl = AccessControlList.objects.create(
content_object=self.document_type_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.on_organization.create(
acl = AccessControlList.objects.create(
content_object=self.document_3, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)

View File

@@ -1,111 +0,0 @@
from __future__ import absolute_import, unicode_literals
from django.contrib.contenttypes.models import ContentType
from documents.tests.test_views import GenericDocumentViewTestCase
from user_management.tests import (
TEST_USER_USERNAME, TEST_USER_PASSWORD
)
from ..models import AccessControlList
from ..permissions import permission_acl_edit
class AccessControlListViewTestCase(GenericDocumentViewTestCase):
def setUp(self):
super(AccessControlListViewTestCase, self).setUp()
content_type = ContentType.objects.get_for_model(self.document)
self.view_arguments = {
'app_label': content_type.app_label,
'model': content_type.model,
'object_id': self.document.pk
}
def test_acl_create_view_no_permission(self):
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
response = self.post(
viewname='acls:acl_create', kwargs=self.view_arguments, data={
'role': self.role.pk
}
)
self.assertEquals(response.status_code, 403)
self.assertEqual(AccessControlList.on_organization.count(), 0)
def test_acl_create_view_with_permission(self):
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.role.permissions.add(
permission_acl_edit.stored_permission
)
response = self.post(
viewname='acls:acl_create', kwargs=self.view_arguments, data={
'role': self.role.pk
}, follow=True
)
self.assertContains(response, text='created', status_code=200)
self.assertEqual(AccessControlList.on_organization.count(), 1)
def test_acl_create_duplicate_view_with_permission(self):
"""
Test creating a duplicate ACL entry: same object & role
Result: Should redirect to existing ACL for object + role combination
"""
acl = AccessControlList.on_organization.create(
content_object=self.document, role=self.role
)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.role.permissions.add(
permission_acl_edit.stored_permission
)
response = self.post(
viewname='acls:acl_create', kwargs=self.view_arguments, data={
'role': self.role.pk
}, follow=True
)
self.assertContains(
response, text='vailable permissions', status_code=200
)
self.assertEqual(AccessControlList.on_organization.count(), 1)
self.assertEqual(AccessControlList.on_organization.first().pk, acl.pk)
def test_orphan_acl_create_view_with_permission(self):
"""
Test creating an ACL entry for an object with no model permissions.
Result: Should display a blank permissions list (not optgroup)
"""
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.role.permissions.add(
permission_acl_edit.stored_permission
)
recent_entry = self.document.add_as_recent_document_for_user(self.user)
content_type = ContentType.objects.get_for_model(recent_entry)
view_arguments = {
'app_label': content_type.app_label,
'model': content_type.model,
'object_id': recent_entry.pk
}
response = self.post(
viewname='acls:acl_create', kwargs=view_arguments, data={
'role': self.role.pk
}, follow=True
)
self.assertNotContains(response, text='optgroup', status_code=200)
self.assertEqual(AccessControlList.on_organization.count(), 1)

View File

@@ -9,8 +9,8 @@ from .views import (
urlpatterns = patterns(
'acls.views',
url(
r'^(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/create/$',
ACLCreateView.as_view(), name='acl_create'
r'^(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/new/$',
ACLCreateView.as_view(), name='acl_new'
),
url(
r'^(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/list/$',

View File

@@ -6,7 +6,7 @@ import logging
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseRedirect
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _
@@ -24,104 +24,6 @@ from .permissions import permission_acl_edit, permission_acl_view
logger = logging.getLogger(__name__)
class ACLCreateView(SingleObjectCreateView):
fields = ('role',)
def dispatch(self, request, *args, **kwargs):
self.content_type = get_object_or_404(
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
try:
self.content_object = self.content_type.get_object_for_this_type(
pk=self.kwargs['object_id']
)
except self.content_type.model_class().DoesNotExist:
raise Http404
try:
Permission.check_permissions(
request.user, permissions=(permission_acl_edit,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_acl_edit, request.user, self.content_object
)
return super(ACLCreateView, self).dispatch(request, *args, **kwargs)
def form_valid(self, form):
try:
acl = AccessControlList.on_organization.get(
content_type=self.content_type,
object_id=self.content_object.pk,
role=form.cleaned_data['role']
)
except AccessControlList.DoesNotExist:
return super(ACLCreateView, self).form_valid(form)
else:
return HttpResponseRedirect(
reverse('acls:acl_permissions', args=(acl.pk,))
)
def get_extra_context(self):
return {
'object': self.content_object,
'title': _(
'New access control lists for: %s'
) % self.content_object
}
def get_instance_extra_data(self):
return {
'content_object': self.content_object
}
def get_queryset(self):
return AccessControlList.on_organization.all()
def get_success_url(self):
if self.object.pk:
return reverse('acls:acl_permissions', args=(self.object.pk,))
else:
return super(ACLCreateView, self).get_success_url()
class ACLDeleteView(SingleObjectDeleteView):
def dispatch(self, request, *args, **kwargs):
acl = get_object_or_404(AccessControlList, pk=self.kwargs['pk'])
try:
Permission.check_permissions(
request.user, permissions=(permission_acl_edit,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_acl_edit, request.user, acl.content_object
)
return super(ACLDeleteView, self).dispatch(request, *args, **kwargs)
def get_extra_context(self):
return {
'object': self.get_object().content_object,
'title': _('Delete ACL: %s') % self.get_object(),
}
def get_post_action_redirect(self):
instance = self.get_object()
return reverse(
'acls:acl_list', args=(
instance.content_type.app_label,
instance.content_type.model, instance.object_id
)
)
def get_queryset(self):
return AccessControlList.on_organization.all()
class ACLListView(SingleObjectListView):
def dispatch(self, request, *args, **kwargs):
self.content_type = get_object_or_404(
@@ -147,6 +49,11 @@ class ACLListView(SingleObjectListView):
return super(ACLListView, self).dispatch(request, *args, **kwargs)
def get_queryset(self):
return AccessControlList.objects.filter(
content_type=self.content_type, object_id=self.content_object.pk
)
def get_extra_context(self):
return {
'hide_object': True,
@@ -154,9 +61,84 @@ class ACLListView(SingleObjectListView):
'title': _('Access control lists for: %s' % self.content_object),
}
def get_queryset(self):
return AccessControlList.on_organization.filter(
content_type=self.content_type, object_id=self.content_object.pk
class ACLCreateView(SingleObjectCreateView):
fields = ('role',)
model = AccessControlList
def dispatch(self, request, *args, **kwargs):
content_type = get_object_or_404(
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
try:
self.content_object = content_type.get_object_for_this_type(
pk=self.kwargs['object_id']
)
except content_type.model_class().DoesNotExist:
raise Http404
try:
Permission.check_permissions(
request.user, permissions=(permission_acl_edit,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_acl_edit, request.user, self.content_object
)
return super(ACLCreateView, self).dispatch(request, *args, **kwargs)
def form_valid(self, form):
self.instance = form.save(commit=False)
self.instance.content_object = self.content_object
self.instance.save()
return super(ACLCreateView, self).form_valid(form)
def get_success_url(self):
return reverse('acls:acl_permissions', args=(self.instance.pk,))
def get_extra_context(self):
return {
'object': self.content_object,
'title': _(
'New access control lists for: %s'
) % self.content_object
}
class ACLDeleteView(SingleObjectDeleteView):
model = AccessControlList
def dispatch(self, request, *args, **kwargs):
acl = get_object_or_404(AccessControlList, pk=self.kwargs['pk'])
try:
Permission.check_permissions(
request.user, permissions=(permission_acl_edit,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_acl_edit, request.user, acl.content_object
)
return super(ACLDeleteView, self).dispatch(request, *args, **kwargs)
def get_extra_context(self):
return {
'object': self.get_object().content_object,
'title': _('Delete ACL: %s') % self.get_object(),
}
def get_post_action_redirect(self):
instance = self.get_object()
return reverse(
'acls:acl_list', args=(
instance.content_type.app_label,
instance.content_type.model, instance.object_id
)
)
@@ -199,6 +181,17 @@ class ACLPermissionsView(AssignRemoveView):
ACLPermissionsView, self
).dispatch(request, *args, **kwargs)
def get_right_list_help_text(self):
if self.get_object().get_inherited_permissions():
return _(
'Disabled permissions are inherited from a parent object.'
)
return None
def get_object(self):
return get_object_or_404(AccessControlList, pk=self.kwargs['pk'])
def get_available_list(self):
return ModelPermission.get_for_instance(
instance=self.get_object().content_object
@@ -236,23 +229,12 @@ class ACLPermissionsView(AssignRemoveView):
merged_pks = self.get_object().permissions.values_list('pk', flat=True) | self.get_object().get_inherited_permissions().values_list('pk', flat=True)
return StoredPermission.objects.filter(pk__in=merged_pks)
def get_object(self):
return get_object_or_404(AccessControlList, pk=self.kwargs['pk'])
def get_right_list_help_text(self):
if self.get_object().get_inherited_permissions():
return _(
'Disabled permissions are inherited from a parent object.'
)
return None
def left_list(self):
return ACLPermissionsView.generate_choices(self.get_available_list())
def right_list(self):
return ACLPermissionsView.generate_choices(self.get_granted_list())
def remove(self, item):
permission = get_object_or_404(StoredPermission, pk=item)
self.get_object().permissions.remove(permission)
def right_list(self):
return ACLPermissionsView.generate_choices(self.get_granted_list())

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