Merge branch 'development'

Conflicts:
	docs/credits/contributors.rst
	docs/index.rst
	docs/intro/installation.rst
	mayan/apps/converter/templates/converter_file_formats_help.html
	mayan/apps/document_indexing/templates/indexing_help.html
	mayan/apps/documents/templates/document_types_help.html
	mayan/apps/documents/templates/recent_document_list_help.html
	mayan/apps/dynamic_search/templates/search_help.html
	mayan/apps/folders/templates/folders_help.html
	mayan/apps/linking/templates/smart_links_help.html
	mayan/apps/metadata/templates/metadata_set_help.html
	mayan/apps/metadata/templates/metadata_type_help.html
This commit is contained in:
Roberto Rosario
2015-02-10 08:36:50 -04:00
2922 changed files with 186311 additions and 128920 deletions

3
.gitignore vendored
View File

@@ -20,4 +20,5 @@ gpg_home/
.idea/
static_collected/
*egg-info*
mayan/settings/local.py
mayan/settings/local.py
.vagrant

View File

@@ -1,19 +1,34 @@
language: python
python:
- 2.7
- 2.6
- 2.7
env:
global:
- TEST_APPS="document_indexing documents dynamic_search lock_manager document_signatures folders ocr tags"
matrix:
- DB=mysql
- DB=postgres
- DB=sqlite
before_install:
- sudo apt-get update -qq
- sudo apt-get install -qq python-dev gcc tesseract-ocr unpaper ghostscript libjpeg-dev libpng-dev poppler-utils
install:
- "pip install -r requirements/testing.txt"
- if [[ $DB == mysql ]]; then pip install -q mysql-python; fi
- if [[ $DB == postgres ]]; then pip install -q psycopg2; fi
before_script:
- mysql -e 'create database mayan_edms;'
- psql -c 'create database mayan_edms;' -U postgres
script:
- coverage run --source=documents,document_signatures,lock_manager,folders,ocr,tags manage.py test documents lock_manager document_signatures folders ocr tags
- if [[ $DB == mysql ]]; then coverage run manage.py test $TEST_APPS --settings=mayan.settings.travis.db_mysql; fi
- if [[ $DB == postgres ]]; then coverage run manage.py test $TEST_APPS --settings=mayan.settings.travis.db_postgres; fi
- if [[ $DB == sqlite ]]; then coverage run manage.py test $TEST_APPS --settings=mayan.settings.travis.base; fi
after_success:
- coveralls
branches:
only:
- master
- development
notifications:
email:
recipients:

View File

@@ -7,12 +7,6 @@ source_lang = en
source_file = mayan/apps/acls/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-bootstrap]
file_filter = mayan/apps/bootstrap/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/bootstrap/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-checkouts]
file_filter = mayan/apps/checkouts/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -61,24 +55,30 @@ source_lang = en
source_file = mayan/apps/document_signatures/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-document_states]
file_filter = mayan/apps/document_states/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/document_states/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-dynamic_search]
file_filter = mayan/apps/dynamic_search/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/dynamic_search/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-events]
file_filter = mayan/apps/events/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/events/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-folders]
file_filter = mayan/apps/folders/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/folders/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-history]
file_filter = mayan/apps/history/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/history/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-installation]
file_filter = mayan/apps/installation/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -91,6 +91,12 @@ source_lang = en
source_file = mayan/apps/linking/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-mailer]
file_filter = mayan/apps/mailer/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/mailer/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-main]
file_filter = mayan/apps/main/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
@@ -139,10 +145,10 @@ source_lang = en
source_file = mayan/apps/registration/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-scheduler]
file_filter = mayan/apps/scheduler/locale/<lang>/LC_MESSAGES/django.po
[mayan-edms.apps-rest_api]
file_filter = mayan/apps/rest_api/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/scheduler/locale/en/LC_MESSAGES/django.po
source_file = mayan/apps/rest_api/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-smart_settings]
@@ -175,8 +181,4 @@ source_lang = en
source_file = mayan/apps/user_management/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-web_theme]
file_filter = mayan/apps/web_theme/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/web_theme/locale/en/LC_MESSAGES/django.po
type = PO

View File

@@ -1,3 +1,32 @@
1.1 (2015-02-10)
================
- Uses Celery for backgroung tasks
- Removal of the splash screen
- Adds a home view with common function buttons
- Support for sending and receiving documents via email
- Removed custom logging app in favor of django-actvity-stream
- Adds watch folders
- Includes Vagrant file for unified development and testing environments
- Per user locale profile (language and timezone)
- Includes news document workflow app
- Optional and required metadata types
- Improved testings. Tested againsta SQLite, MySQL, PostgreSQL
- Many new REST API endpoints added
- Simplfied text messages
- Improved method for custom settings
- Addition of CORS support to the REST API
- Per document language setting instead of per installation language setting
- Metadata validation and parsing support
- Start of code updates towards Python 3 support
- Simplified UI
- Stable PDF previews generation
- More technical documentation
For a full changelog and release notes go to: http://mayan.readthedocs.org/en/latest/releases/1.1.html
1.0 (2014-08-27)
================

View File

@@ -50,9 +50,9 @@ Contribute
----------
- Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug.
- Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it).
- Fork `the repository`_ on GitHub to start making your changes to the **development** branch (or branch off of it).
- Write a test which shows that the bug was fixed or that the feature works as expected.
- Make sure to add yourself to the `contributors file`_.
- Add yourself to the `contributors file`_.
- Send a pull request
@@ -63,7 +63,7 @@ Contribute
.. _Mailing list (via Google Groups): http://groups.google.com/group/mayan-edms
.. _Apache 2.0 License: https://www.apache.org/licenses/LICENSE-2.0.txt
.. _`the repository`: http://github.com/mayan-edms/mayan-edms
.. _`contributors file`: https://github.com/mayan-edms/mayan-edms/blob/master/docs/credits/contributors.rst
.. _`contributors file`: https://github.com/mayan-edms/mayan-edms/blob/master/docs/topics/contributors.rst
.. |Build Status| image:: http://img.shields.io/travis/mayan-edms/mayan-edms/master.svg?style=flat
:target: https://travis-ci.org/mayan-edms/mayan-edms

12
Vagrantfile vendored Normal file
View File

@@ -0,0 +1,12 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty32"
config.vm.network "forwarded_port", guest: 8000, host: 8000
config.vm.synced_folder ".", "/mayan-edms-repository"
config.vm.provision :shell, :path => "contrib/scripts/install/development.sh", privileged: false
config.vm.provision "file", destination: "/home/vagrant/mayan-edms/mayan/settings/celery_redis.py", source: "contrib/configs/celery_redis.py"
config.vm.provision "file", destination: "/home/vagrant/mayan-edms/mayan_edms_worker.sh", source: "contrib/misc/mayan_edms_worker.sh"
end

View File

@@ -1,20 +1,19 @@
<VirtualHost *:80>
# Uncomment if libapache2-mod-xsendfile is installed
# XSendFile On
# XSendFileAllowAbove On
# Uncomment if libapache2-mod-xsendfile is installed
# XSendFile On
# XSendFileAllowAbove On
ServerName mayan.yoursite.com
ServerAdmin admin@yoursite.com
DocumentRoot /var/www/mayan-edms
WSGIScriptAlias / /var/www/mayan-edms/mayan/mayan-edms.wsgi
WSGIScriptAlias / /usr/share/mayan/mayan/wsgi/dispatch.wsgi
<Directory /usr/share/mayan/mayan>
Order deny,allow
Allow from all
</Directory>
ErrorLog /var/log/apache2/mayan_error.log
LogLevel warn
CustomLog /var/log/apache2/mayan_access.log combined
Alias /mayan-static "/usr/share/mayan/mayan/static/"
<Location "/static">
SetHandler None
</Location>
<Directory /var/www/mayan-edms>
Order allow,deny
Allow from all
</Directory>
Alias /static /var/www/mayan-edms/media/static
<Location "/static">
SetHandler None
</Location>
</VirtualHost>

View File

@@ -0,0 +1,14 @@
# sample wsgi file for usage with apache webserver
# mayan installation in a virtualenv /opt/mayan/venv
# apache deployment in /var/www/mayan-edms
import os
import sys
import site
# set up python path to virtual environment
site.addsitedir(/opt/mayan/venv/lib/python2.7/site-packages)
sys.path.append(/var/www/mayan-edms)
os.environ[PYTHON_EGG_CACHE]=/var/www/django/cache
#django WSGI specifics
From django.core.handlers.wsgi import WSGIHandler
os.environ[DJANGO_SETTING_MODULE] = mayan.settings.production
application = WSGIHandler()

View File

@@ -0,0 +1,5 @@
from .local import *
CELERY_ALWAYS_EAGER = False
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'

View File

@@ -0,0 +1,3 @@
#!/bin/sh
DJANGO_SETTINGS_MODULE='mayan.settings.celery_redis' celery -A mayan worker -l DEBUG -Q checkouts,mailing,uploads,converter,ocr,tools,indexing,metadata -Ofair -B

View File

@@ -0,0 +1,19 @@
server {
listen 80;
listen [::]:80 ipv6only=on;
server_name mayan;
access_log /var/log/nginx/access_mayan.log;
error_log /var/log/nginx/error_mayan.log;
location / {
uwsgi_pass unix:///run/uwsgi/app/mayan/socket;
include uwsgi_params;
uwsgi_param UWSGI_SCHEME $scheme;
uwsgi_param SERVER_SOFTWARE nginx/$nginx_version;
}
location /static/ {
root /srv/mayan/projects/mayan/mayan-edms/mayan/media/;
}
}

1
contrib/scripts/PEP8_check.sh Executable file
View File

@@ -0,0 +1 @@
flake8 --ignore=E501 mayan/apps | grep -v "F401 'models' imported but unused" | grep -v "F811 redefinition of unused 'models'"| grep -v "F401 'db' imported but unused" | grep -v "F812 list comprehension redefines 'user_id'" | grep -v "F812 list comprehension redefines 'document_id'" |less

View File

@@ -0,0 +1,72 @@
#!/usr/bin/env bash
INSTALLATION_DIRECTORY=/home/vagrant/mayan-edms/
DB_NAME=mayan_edms
DB_PASSWORD=test123
cat << EOF | sudo tee -a /etc/motd.tail
**********************************sudo apt
Mayan EDMS Vagrant Development Box
**********************************
EOF
# Update sources
echo -e "\n -> Running apt-get update & upgrade \n"
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 unpaper libreoffice
echo -e "\n -> Cloning development branch of repository \n"
git clone /mayan-edms-repository/ $INSTALLATION_DIRECTORY
cd $INSTALLATION_DIRECTORY
git checkout development
git reset HEAD --hard
echo -e "\n -> Setting up virtual env \n"
virtualenv venv
source venv/bin/activate
echo -e "\n -> Installing python dependencies \n"
pip install -r requirements.txt
echo -e "\n -> Running Mayan EDMS initial setup \n"
./manage.py initialsetup
echo -e "\n -> Installing Redis server \n"
sudo apt-get install -y redis-server
pip install redis
echo -e "\n -> Installing testing software \n"
pip install coverage
echo -e "\n -> Installing MySQL \n"
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password '$DB_PASSWORD
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password '$DB_PASSWORD
sudo apt-get install -y mysql-server libmysqlclient-dev
# Create a passwordless root and travis users
mysql -u root -p$DB_PASSWORD -e "SET PASSWORD = PASSWORD('');"
mysql -u root -e "CREATE USER 'travis'@'localhost' IDENTIFIED BY '';GRANT ALL PRIVILEGES ON * . * TO 'travis'@'localhost';FLUSH PRIVILEGES;"
mysql -u travis -e "CREATE DATABASE $DB_NAME;"
pip install mysql-python
echo -e "\n -> Installing PostgreSQL \n"
sudo apt-get install -y postgresql postgresql-server-dev-all
sudo -u postgres psql -c 'create database mayan_edms;' -U postgres
sudo cat > /etc/postgresql/9.3/main/pg_hba.conf << EOF
local all postgres trust
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
EOF
pip install -q psycopg2

View File

@@ -6,12 +6,11 @@ import optparse
import sh
APP_LIST = ('acls', 'checkouts', 'common', 'converter', 'django_gpg', 'documents',
'document_comments', 'document_indexing', 'document_signatures', 'dynamic_search',
'folders', 'history', 'installation', 'linking', 'main', 'metadata', 'navigation',
'ocr', 'permissions', 'project_setup', 'project_tools', 'scheduler', 'smart_settings',
'sources', 'tags', 'user_management', 'web_theme', 'bootstrap',
'registration', 'statistics')
LANGUAGE_LIST = ('ar', 'bg', 'bs_BA', 'da', 'de_DE', 'en', 'es', 'fa', 'fr', 'hu', 'hr_HR', 'id', 'it', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI', 'tr_TR', 'vi_VN', 'zh-cn')
'document_comments', 'document_indexing', 'document_signatures', 'document_states', 'dynamic_search',
'events', 'folders', 'installation', 'linking', 'mailer', 'main', 'metadata', 'navigation',
'ocr', 'permissions', 'project_setup', 'project_tools', 'registration', 'rest_api',
'smart_settings', 'sources', 'statistics', 'tags', 'user_management')
LANGUAGE_LIST = ('ar', 'bg', 'bs_BA', 'da', 'de_CH', 'de_DE', 'en', 'es', 'fa', 'fr', 'hu', 'hr_HR', 'id', 'it', 'lv', 'nb', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI', 'sq', 'tr_TR', 'vi_VN', 'zh_CN', 'zh_TW')
makemessages = sh.Command('django-admin.py')
makemessages = makemessages.bake('makemessages')

14
contrib/uwsgi/mayan.ini Normal file
View File

@@ -0,0 +1,14 @@
# Sample file for uswgi with mayan installed in a virtualenv mayan
# with project directory mayan e.g. for use with nginx connecting via
# local unix socket
[uwsgi]
#socket = 127.0.0.1:3031
plugin = python
chdir = /srv/mayan/projects/mayan/mayan-edms
virtualenv = /srv/mayan/.virtualenvs/mayan
env = DJANGO_SETTINGS_MODULE=mayan.settings.production
module = django.core.handlers.wsgi:WSGIHandler()
processes = 4
threads = 2
stats = :9191
buffer-size=32768

BIN
docs/_static/ACL.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,8 +1,8 @@
.. _contents:
=================================
Mayan EDMS documentation contents
=================================
========
Contents
========
.. toctree::
:hidden:
@@ -12,8 +12,5 @@ Mayan EDMS documentation contents
.. toctree::
:maxdepth: 3
intro/index
topics/index
credits/index
releases/index
faq/index

View File

@@ -1,92 +0,0 @@
.. _contributors:
============
Contributors
============
How to contribute?
------------------
You can help further the development of **Mayan EDMS** by reporting bugs, submitting documentation, patches, with monetary or hardware donations.
Lead developer
--------------
* Roberto Rosario (roberto.rosario@mayan-edms.com) <https://twitter.com/siloraptor>
Contributors (in alphabetical order)
------------------------------------
* Aziz M. Bookwala (https://github.com/azizmb)
* Bertrand Bordage (https://github.com/BertrandBordage)
* Brian E (brian@realize.org)
* David Herring (https://github.com/abadger1406)
* Emlyn Clay (https://github.com/EmlynC)
* Jens Kadenbach (https://github.com/audax)
* Kolmar Kafran
* IHLeanne (https://github.com/IHLeanne)
* Iliya Georgiev (ikgeorgiev@gmail.com)
* Lars Kruse (devel@sumpfralle.de)
* Mathias Behrle <mbehrle@m9s.biz>
* Meurig Freeman (https://github.com/meurig)
* Nate Aune (nate@appsembler.com)
* Paul Whipp [https://github.com/pwhipp] [http://paulwhippconsulting.com]
* Rafael Esparra <rafael.esparra1@upr.edu>
* Sergey Glita (s.v.glita@gmail.com)
* Simone Federici [https://twitter.com/aldaranalton] [https://github.com/simone]
* Webfaction (https://www.webfaction.com)
Translations
------------
* Bulgarian
- Iliya Georgiev (ikgeorgiev@gmail.com)
- Pavlin Koldamov (pkoldamov@gmail.com)
* Dutch (Netherlands)
- Lucas Weel
* French
- Pierre Lhoste (peter.cathbad.host@gmail.com)
- PatrickHetu (patrick.hetu@gmail.com)
* German (Germany)
- Tetja Rediske (tetja.rediske@googlemail.com)
- Tilmann Sittig (tilmann.sittig@web.de)
- Manticor (sl@suchreflex.de)
- Mathias Behrle <mbehrle@m9s.biz>
- Tobias Paepke <https://twitter.com/paepke_net>
* Italian
- Pierpaolo Baldan (pierpaolo.baldan@gmail.com)
- SeeOpen.IT (Numero Verde: 800.910.125, E-mail: sales@seeopen.it)
- Carlo Zanatto
* Polish
- mic (diveaway12@gmail.com, winterfall24@gmail.com)
* Portuguese
- Vítor Figueiró (vfigueiro@gmail.com)
* Portuguese (Brazil)
- Emerson Soares (dev.emerson@gmail.com)
- Renata Oliveira (renatabels@gmail.com)
- Fábio (bnafta@gmail.com)
* Russian
- Sergey Glita (s.v.glita@gmail.com)
* Slovenian (Slovenia)
- kontrabant (kontrabant@gmail.com)
* Spanish
- Roberto Rosario

View File

@@ -1,11 +0,0 @@
Credits
=======
Here we list everything and everybody that has made his/her/its part in improving
**Mayan EDMS**
.. toctree::
:maxdepth: 1
contributors
license

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -1,204 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="279.54614"
height="399.96887"
id="svg4808"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="index_template.svg"
inkscape:export-filename="/home/rosarior/development/mayan/mayan/docs/topics/index_template.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<defs
id="defs4810" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="-9.6370916"
inkscape:cy="270.24135"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata4813">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-211.6555,-315.23489)">
<rect
style="fill:#000000;fill-opacity:0.09787233;fill-rule:nonzero;stroke:none"
id="rect3396"
width="269.54614"
height="368.70569"
x="216.6555"
y="341.49808"
rx="6.2500043"
ry="2.6675141" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 279.8408,414.17828 0,19.15838"
id="path3933"
inkscape:connector-curvature="0" />
<image
y="384.87115"
x="263.04108"
id="image3004"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAdpJREFU WIXt179rE2Ecx/H3c/fcXS6Xpg0aWx1a3NxFsDHi0lGjSOMiuHXwH1BwFgdHERycu4RYLIhUx7Yu xcHRTeig9Qe2NL2eprnn6xAb8qOL5EgH7wPHcdwDn9fzPDwHp0SE44x1rO0pIAWkgBQAqL5n68qD 2lW8XN3TtnOmOM6wX0qF4udexE4jOqC5N7/66NYrwBwFsC7fW7zuT5xcunvjEtNTAVu7Q3V3MpWH za2QZy/fEe38uLn2+PbyIUJ3jfPs7ERtoVLic9OnvtZAqcEl+tcIIAKlmYCFayWevlitAXkg6gf4 RtCnJ3O8fd8g79EGDCkQaV8fvoTcOT+Gq7UG/KMAGuD7PgQO2AmUdyNiga+hMFkc7+nV/YONCFmX RJa/AwCMgIhBjOl51wsQwRhDxk3+fBogNkL/meoAZsrVgrZtWmLwneRmfxgBDIY4FqbL84XN9fo3 aPe4cw/f/D5VzFO+cI5sLkP4q5XY/ncAAkFGEzYi1jc+sr27z8r9OU8DgRGhWrlIs9kijg1uzk22 vSv+iTGqlVmWXm8ABBpwbEvx5PkKJhYGdynZKBSWpbBsC8BRQAE4+/c+ymwDnxTgAgHgjBhwAIQj 7hyMSv8LUkAK+O8BfwBPb5uGE8zc7AAAAABJRU5ErkJggg== "
height="32"
width="32" />
<image
y="456.70581"
x="264.49216"
id="image3015"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAA8RJREFU WIXtl81rnFUUxn/n3HdmUhOoU7UtpeQLVASh0kTBlRRUlIjUvSiCC6Vx5T/gyk0WIlTalQtFoX5A lXZp46J+YD80atPWGDszTtLGTJLJTJJmZu57r4t3MplJJomRKdn0Wb+c5znPee659xXvPTsJ3VH2 uwIAAYJLx4+cNtgB7xzQLBOCqBISnOkbHH4JsK0SEAC7DHbg0BsfgrXgZQOZhpETr70A7AKKrRTQ 5p0DaylffRePqTLWIyTR9Qq2tMzl958siDQRuQlEDSHB2b7B4aOscS+osTmL1zhIDOoJPOBDXClH 37FP12vbkt1DEGPkxKsDNHEvWCWyoAHIqqaoAIBSyX0L0+eaEGxC7j1CSPyht4nyRdvGAigjoiDa pKqCmJWqDcyisokGHzXmF6p1138a1Iq5CqjZQMB6iEYnY2mmwOaRCDHZK4gI77z8SO+z/fs644Em +gfPfQ/4Ogcsohp1u4UAUUGNkro8xmzmJs2P7kprHuE3xCgvPpH8QaggKBePHznbPzh8tC4DYeQA CiI0NVZAEMQo6UvXoVKif/AjcHZTEY3wEIsxcvL1AWDX6gh8BcQgYhBjIluFdW6ICKmfruFtSOeh bsrXh9h4ga2Fw7R3wZ7nyRfLF4B43QhCVA1qYqQujpK7MYE0Lars6dxH12M9OOdBTTVfWwjwgLdo Ry+58QtcyS5+DYSNGQgM85M57PIij7/5HrhwjQMCKHbyFM5H00X/63XiwIPec5DC36c49sHvnwHL QU27D1ETMDc5TbL7UXxlCTt1moZQroxETDUn24Egif2E5ZDZ7Ng00T4orzqg0SLKZ6Y4cPhpWJ4A jVfP/1qq7a7DKkXbXnLjPzOanvsYKAEuqGoD8dyeXyDRESex+wB24Q/ExGnNjR3lQxMPUMyeZ+iL 8U+AZajfhBqS+ytLsvthEIe4QrSa/2e3jXBILImzFQqTN0qjmeI/RA5UBYiAQPFWjt6n+qE8E21E adV7xaGJJLPpq2SmF88QdR/WBIgIfimPLZVpu38/fmkKaVn3RHViHeQz5/nuWv5Lqt3XBCDCws1J dh/sAu/x3K7a3wp4JGgHF1KcSDH0+diPVOdfEyCqzKTS3NfzILCIBq3sHoi1M5/5k1v50jfAInWP ktoI8qkM3c8NQKkAQXvryAFiHcxn0vyaWviKqPva2hRg7y8nnxlXfIezFhc9HFoKEcGhhb63hg8D WeoyIMC9QA+QpKW+N8ADeSANzAG1LgWIAe1A/A6Rr6BMNP/KHebZHuTuz+lOC/gX/29g6TEI7HMA AAAASUVORK5CYII= "
height="32"
width="32" />
<image
y="530.59052"
x="369.8649"
id="image3048"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABLtJREFU WIXFl02MFEUYhp+vqnp2dpEfgSgYwi7qihgTRPQAeJDIAV1CIHDxojESIwEuevPiTRM5GKIGTNSD JiYkYBAhJGpEY/AggmxiZAkSh7/FZQd2dti/memu8lA9vzuzM6yb+CZ96O6q+t7v/b5+q1qcc/yf EMCc+XD9EU3Y46wF6hESRCkizLHVu09uBcKZImCAdk3Ys/L1zyAMwUkDmpre/a9sAtqBOzNJIOms hTAkf/4dHDqOWImIts6XCHMTnN23JitSh+QUEKWJMMdX7z65hRr1TCmaDXEqARJAZQAHuAibS7N6 15eTuTWN7sAE9O5/uYc66plyoBCUASlz8gsAKArpH2Hwh7uM7hAiEt1v4vuLZGMC5BFRIIrJaSoQ XVq0glkTQRwQgs0WR04abkqL2QIo3YDAZIgSRARRU411CBrsWHVZJxMACBGlgOYERAlKK1JnL3L7 8g3ANorvScgplNGc3bd2wJNWpaas6IHIK4ACEaQeCQFBEK24fOYCFHI8tedzsCFMZWhVSzkIAnoP 7OgB2sslcAUQjYhGtPaK1SmbiJD6tQ8XRixd2UX+wl4aG1gtLHpWJ8x/nsyd/GkgUVGCCKU0Sgek fvuT9N/XkbqLKuYvvZ/OJ5ZhrQOlfdvgmnaOsyH6ngcZvHSaP66Ofg1E1T1gNMP9acKJUZ7e+T7Y qEYBARRh/0GsEx9SKQTQyqHENVbCgXMa6VhC9upBPv326jFgwlCc4iKUNgz1D3Jv1+O4whjhwBGq mrJYEtFxnxRd2pIPVdMqqORiTJgnc/3izd//Gk4D+bICKgSlyQ6keeDJDTBxHVQi/v5rxS3fizgI LCu/Wk9fuiNWrYaJCDhYvkj4ac0v9KXSXwDjgDV+OQFxjA+PEgSatrmLCUcuIjoRKzBFVsqBjui7 2YHbu37KsYfPZ9hx6Bzm52tHgAmo9AEVkbk2wLyu5SAOsVlvzU09wYFScebwzYV/SjMssHn5ImTP YW6/t5ltK+bB9lfZPvTwG5ze8iKl9ERAYOhKP/OXdUP+lndEFXgSzS4dlHyg3Wg6gvgysXpGkc2F DIzk2LZiHid2PrN1zltHDwHGl0AEN5YhzBVILlyEGxtAWsjeK+diA/NoCxQqtl1bNCcRxgohYMiM F9jYvQCr9SZKRiTCyI1+5i7pBOdwjMfytwDl4rE+WFIriucFa/2zFx69j8fe/d7XJLK4D7YRv0p6 BZTiVuoyC5Z1A6Mo02L2EO/35a5PGq+GAJH458dfWztpWnwWlVIJMqkrdG3sgVwWzKzWghcJBLl4 Fy0TAK9JX3qkauMWgUcWzCp9qAYgcnJHB8Hs3o8PYG2Dna0BNI45agzMKgASWuEo61flCK5iV3Zl AvlVO797dtfmh9ZN5KO7PqPbyNpbmdEcz6lPAJKBmnpjrKmsAUaB1EdHLw3SzHXqwwFz2OB9oE3r cvfXgaphYIACMAQM/wcCBZEC4BWIbGMCOj5BVfVAfB/F13QQJcRPTWoFuslooHiSm07GddGm7+68 HmgfukW3aQqXzGVOzX37xLpCZJmiAijxwZO5zKls/f+waWE2sBRYSGtJhUAauDJTBAz+rydJaxbq 8Nvx+AzFnz7+BfrWszSatlERAAAAAElFTkSuQmCC "
height="32"
width="32" />
<image
y="598.23926"
x="264.2951"
id="image3015-0-6"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAA8RJREFU WIXtl81rnFUUxn/n3HdmUhOoU7UtpeQLVASh0kTBlRRUlIjUvSiCC6Vx5T/gyk0WIlTalQtFoX5A lXZp46J+YD80atPWGDszTtLGTJLJTJJmZu57r4t3MplJJomRKdn0Wb+c5znPee659xXvPTsJ3VH2 uwIAAYJLx4+cNtgB7xzQLBOCqBISnOkbHH4JsK0SEAC7DHbg0BsfgrXgZQOZhpETr70A7AKKrRTQ 5p0DaylffRePqTLWIyTR9Qq2tMzl958siDQRuQlEDSHB2b7B4aOscS+osTmL1zhIDOoJPOBDXClH 37FP12vbkt1DEGPkxKsDNHEvWCWyoAHIqqaoAIBSyX0L0+eaEGxC7j1CSPyht4nyRdvGAigjoiDa pKqCmJWqDcyisokGHzXmF6p1138a1Iq5CqjZQMB6iEYnY2mmwOaRCDHZK4gI77z8SO+z/fs644Em +gfPfQ/4Ogcsohp1u4UAUUGNkro8xmzmJs2P7kprHuE3xCgvPpH8QaggKBePHznbPzh8tC4DYeQA CiI0NVZAEMQo6UvXoVKif/AjcHZTEY3wEIsxcvL1AWDX6gh8BcQgYhBjIluFdW6ICKmfruFtSOeh bsrXh9h4ga2Fw7R3wZ7nyRfLF4B43QhCVA1qYqQujpK7MYE0Lars6dxH12M9OOdBTTVfWwjwgLdo Ry+58QtcyS5+DYSNGQgM85M57PIij7/5HrhwjQMCKHbyFM5H00X/63XiwIPec5DC36c49sHvnwHL QU27D1ETMDc5TbL7UXxlCTt1moZQroxETDUn24Egif2E5ZDZ7Ng00T4orzqg0SLKZ6Y4cPhpWJ4A jVfP/1qq7a7DKkXbXnLjPzOanvsYKAEuqGoD8dyeXyDRESex+wB24Q/ExGnNjR3lQxMPUMyeZ+iL 8U+AZajfhBqS+ytLsvthEIe4QrSa/2e3jXBILImzFQqTN0qjmeI/RA5UBYiAQPFWjt6n+qE8E21E adV7xaGJJLPpq2SmF88QdR/WBIgIfimPLZVpu38/fmkKaVn3RHViHeQz5/nuWv5Lqt3XBCDCws1J dh/sAu/x3K7a3wp4JGgHF1KcSDH0+diPVOdfEyCqzKTS3NfzILCIBq3sHoi1M5/5k1v50jfAInWP ktoI8qkM3c8NQKkAQXvryAFiHcxn0vyaWviKqPva2hRg7y8nnxlXfIezFhc9HFoKEcGhhb63hg8D WeoyIMC9QA+QpKW+N8ADeSANzAG1LgWIAe1A/A6Rr6BMNP/KHebZHuTuz+lOC/gX/29g6TEI7HMA AAAASUVORK5CYII= "
height="32"
width="32" />
<image
y="662.88904"
x="371.37128"
id="image3048-0"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABLtJREFU WIXFl02MFEUYhp+vqnp2dpEfgSgYwi7qihgTRPQAeJDIAV1CIHDxojESIwEuevPiTRM5GKIGTNSD JiYkYBAhJGpEY/AggmxiZAkSh7/FZQd2dti/memu8lA9vzuzM6yb+CZ96O6q+t7v/b5+q1qcc/yf EMCc+XD9EU3Y46wF6hESRCkizLHVu09uBcKZImCAdk3Ys/L1zyAMwUkDmpre/a9sAtqBOzNJIOms hTAkf/4dHDqOWImIts6XCHMTnN23JitSh+QUEKWJMMdX7z65hRr1TCmaDXEqARJAZQAHuAibS7N6 15eTuTWN7sAE9O5/uYc66plyoBCUASlz8gsAKArpH2Hwh7uM7hAiEt1v4vuLZGMC5BFRIIrJaSoQ XVq0glkTQRwQgs0WR04abkqL2QIo3YDAZIgSRARRU411CBrsWHVZJxMACBGlgOYERAlKK1JnL3L7 8g3ANorvScgplNGc3bd2wJNWpaas6IHIK4ACEaQeCQFBEK24fOYCFHI8tedzsCFMZWhVSzkIAnoP 7OgB2sslcAUQjYhGtPaK1SmbiJD6tQ8XRixd2UX+wl4aG1gtLHpWJ8x/nsyd/GkgUVGCCKU0Sgek fvuT9N/XkbqLKuYvvZ/OJ5ZhrQOlfdvgmnaOsyH6ngcZvHSaP66Ofg1E1T1gNMP9acKJUZ7e+T7Y qEYBARRh/0GsEx9SKQTQyqHENVbCgXMa6VhC9upBPv326jFgwlCc4iKUNgz1D3Jv1+O4whjhwBGq mrJYEtFxnxRd2pIPVdMqqORiTJgnc/3izd//Gk4D+bICKgSlyQ6keeDJDTBxHVQi/v5rxS3fizgI LCu/Wk9fuiNWrYaJCDhYvkj4ac0v9KXSXwDjgDV+OQFxjA+PEgSatrmLCUcuIjoRKzBFVsqBjui7 2YHbu37KsYfPZ9hx6Bzm52tHgAmo9AEVkbk2wLyu5SAOsVlvzU09wYFScebwzYV/SjMssHn5ImTP YW6/t5ltK+bB9lfZPvTwG5ze8iKl9ERAYOhKP/OXdUP+lndEFXgSzS4dlHyg3Wg6gvgysXpGkc2F DIzk2LZiHid2PrN1zltHDwHGl0AEN5YhzBVILlyEGxtAWsjeK+diA/NoCxQqtl1bNCcRxgohYMiM F9jYvQCr9SZKRiTCyI1+5i7pBOdwjMfytwDl4rE+WFIriucFa/2zFx69j8fe/d7XJLK4D7YRv0p6 BZTiVuoyC5Z1A6Mo02L2EO/35a5PGq+GAJH458dfWztpWnwWlVIJMqkrdG3sgVwWzKzWghcJBLl4 Fy0TAK9JX3qkauMWgUcWzCp9qAYgcnJHB8Hs3o8PYG2Dna0BNI45agzMKgASWuEo61flCK5iV3Zl AvlVO797dtfmh9ZN5KO7PqPbyNpbmdEcz6lPAJKBmnpjrKmsAUaB1EdHLw3SzHXqwwFz2OB9oE3r cvfXgaphYIACMAQM/wcCBZEC4BWIbGMCOj5BVfVAfB/F13QQJcRPTWoFuslooHiSm07GddGm7+68 HmgfukW3aQqXzGVOzX37xLpCZJmiAijxwZO5zKls/f+waWE2sBRYSGtJhUAauDJTBAz+rydJaxbq 8Nvx+AzFnz7+BfrWszSatlERAAAAAElFTkSuQmCC "
height="32"
width="32" />
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="232.81795"
y="379.88388"
id="text3308"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3310"
x="232.81795"
y="379.88388"
style="font-size:13px">Sample index</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="240.23936"
y="449.4061"
id="text3308-9"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3310-9"
x="240.23936"
y="449.4061"
style="font-size:13px">'Due dates'</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="316.27951"
y="517.43311"
id="text3308-9-4"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3310-9-8"
x="316.27951"
y="517.43311"
style="font-size:13px">metadata.due_date</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="241.52823"
y="592.18439"
id="text3308-9-40"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3310-9-1"
x="241.52823"
y="592.18439"
style="font-size:13px">'Suppliers'</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="319.08157"
y="651.24176"
id="text3308-9-4-3"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3310-9-8-7"
x="319.08157"
y="651.24176"
style="font-size:13px">metadata.supplier</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="289.94205"
y="330.87161"
id="text3308-5"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3310-5"
x="289.94205"
y="330.87161">Index template</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 279.33572,488.44173 0,89.10029"
id="path3933-5"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 279.23229,542.97272 84.83096,0"
id="path3933-5-3"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 279.51264,631.87053 0,43.55572"
id="path3933-5-9"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 279.82037,674.9921 84.83098,0"
id="path3933-5-3-8"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -1,392 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="569.1853"
height="186.2328"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="permissions.svg"
inkscape:export-filename="/home/rosarior/development/mayan/mayan/docs/topics/permissions.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<defs
id="defs4">
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible">
<path
id="path3823"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-0"
style="overflow:visible">
<path
inkscape:connector-curvature="0"
id="path3823-6"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-2"
style="overflow:visible">
<path
inkscape:connector-curvature="0"
id="path3823-9"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-8"
style="overflow:visible">
<path
inkscape:connector-curvature="0"
id="path3823-67"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="182.27263"
inkscape:cy="10.247058"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(47.756703,-107.30406)">
<rect
style="fill:#000000;fill-opacity:0.09787233;fill-rule:nonzero;stroke:none"
id="rect4397-8"
width="174.59149"
height="150.71428"
x="341.8371"
y="137.82259"
rx="5.903059"
ry="2.9308865" />
<rect
style="fill:#000000;fill-opacity:0.09787233;fill-rule:nonzero;stroke:none"
id="rect4397"
width="174.59149"
height="150.71428"
x="109.13284"
y="135.93362"
rx="5.903059"
ry="2.9308865" />
<image
y="203.38187"
x="178.25146"
id="image2993"
xlink:href="data:image/png;base64,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
"
height="32"
width="32" />
<image
y="128.38187"
x="-39.605644"
id="image3004"
xlink:href="data:image/png;base64,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
XSYAAAAASUVORK5CYII=
"
height="32"
width="32" />
<image
y="156.95328"
x="33.965771"
id="image3015"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAB6NJREFU
WIXFl2uMXVUZhp+1r+ecOTNn7pVeppQKDAptwCAVKC1QoahtQtAACgpECMGIxGBSAsSmBLEECBBr
YpSICCFQoQYxApUU0lItUJBpGSrt0DK00+l0zplz2/e11/LHzMDQnkKJGL9k/9pZ63vW+73fugit
Nf/PsACEEJ/LXDed0/akaZoXG5hgAFqhVPr0vS+VLgVko0FCa/15ADg3L26PMk0Ws2e7OI6L5ytG
igHlosS1NKv/PuoC8aEDjf82M2DduLB1rZ2xmHdynmldnXR2dNHZ2U17WyfacPECk58u7vgTE4p/
3gBZ27KWT5tm4bh5zEwzdqYNt6kdN1PAdfPUQ03GsZYB2cPoP2FiccNZrQtc27jLwFhkWpBKMAxQ
Wr0cJuqWNZvK/wRcIUwMG5S2sKwMllsgqkccLB0kSUFpgTAtABeoHQ2AccNZrVflHPOh1g6baV9w
sU0bP9SUyxGlUrIoi9r8o7Nbf7BmU/kFw9B4nsmewSpaBJRKA0yfM4tzLjiNV7fsYHhodDLVYYo3
AhBXn1E4O+eYD03vcZgzq4BhZhGGQzZIESImiGsM7avRnrf/cPZx2TOlVBUp08JFl3yTsbEqJ375
eDIZB98PmDN3BhvXv0EqrajRShsB2M2O8YtM3mT2MU0YZg7TacIwHFwEbhjiZjRuJqXqBZw6I7tq
zItfzmRZPn/xAoKDRWo1j0qlThiGaK2wTUHVjzYD6jCpGwBkbcs8q63NQAkX08pi2zmcTCuO24Ll
NCHI4NgOYazJZ+0lT/XV71faqKuah1f38T2fIAiIwgjfD5nV0+L/Y7d3L3CYCo0AHCEEhgFRolEY
YNgII8tIMaJ/xwfsGy4SRhqlBIYQVCNVtLtnPl6p1IjCiDiMiaOEOIwZG63SMXPGE28OxX1AeDQA
wjAgiC2G9vvs3DnCm28O8NTT6/HiOldet4xb77wGu8kkTSQ6UQC1Ox5544GBgWE8PySRCWkiqdcD
Nr++g9t+v+U+YIwGu2GjnbD75sWdg81dtrtoyRKk0oDBSfN6yWVd6n6AlDED7w7xq9WPc0JPhurC
7pUd3bmVV/Vewq7BvRwYKVGt1KhUqlSLFQrnNVEdq//y7hXbbgPSqckamVBVo3iT63P+oouXgh/i
1X2CwKdW8wjDECkl2ZyDRUpTTydLL//hyt7eBXjPv0hXIYOOM1g6xNY2sgrXX/cgfX0bVrQWnl0x
vL+0/MFV258F9JFKEO8ryz971YjBt/+NV/fxPA/fDwnDiCiKiaKYob2jNJkppy5bTppJeWzDz1Gz
e2mbNo+u6V+kZ86XOPGUhZxx2WX8ceNtyGzKJd9dwdcWnv/MTStPuWYyd6MSuMDMVZcd//z3r710
bktbO169ThjFRBMASSKpjJbZMzSM++257D3Qj1YKw3RYsXQDUQxRnBJEIQ+/tgylErRSTG87gXlz
vs7aR1Zz9y19OSBoqAAw9sK20o27+vtRSUiSSJI4IUkSpJTIKKJaLjLrO0vYs7cflVho6RAFIY+9
8jMcwNImf9t2K1EYoqWFTm0GR96lXCuSagGQO5IHNFDf9Haxf+Mu461CTzi/2YlI0wQtFUkU8dq/
3sE6dj7H6BIqikEY44oqh/7Bl9nSvg6pFLv2b8a2cqTCQKNRyqTildFKAJhHAjCW3vvW5dLOr3q7
0NVzZfYudu6tcGCkTLVSpVyuUCsOM7RgI+HWfjot6HZfBJFBY2OoLM9svQcAU+RQ0kBNrEopg0pt
DK0/KvlUAHHuHa98i0xh7alzWtwlJ7VyXm8zO/4a0dHijDtbhVjaIqmm3H/+KNtKJ/Dc9lvYvPt7
zG35LR3u62hc0A4aSBGkYkJUIci4zZRrRfQU708CGGfevuHq6d0dv/vJkukc0+ayvQheCjPmX86+
gVfRTommNo841px+4bUc8BSJbfDjc5vZN7+X+9bfDvEaZrRsQeOiOeSWJUDWYj7YvZODw+GjTJwL
k12QPefOrf4DV/QyGmm2HoBYCfKu4KavZkiUJopTEilJZUwUBjy5p4AvwTYUX+kSdGRsrn5oH4v1
BaRGHq3NwwD8Wty3Z2f1iQ1/2bMO+ACoTyqQ68iZ1MOUl95XmGL8pjwawm+2SK4/3SaSMVpKzDRi
3YBLKYgxDU2i4aVBwTeOhTiq8cDqnRcBSQNvpYAHFCe+YGoJTC9IOFiXhKHEECAApeGd4YS1fZKL
ew1MrVj3rsFAMcU2UgwxYS4No3WQUQ1gN+P7/qGhGW/xcAJQfcyEUSwZ8yT+FACAVMFzOyQz8w6p
0mx4T+FYasJc47NqoFg3kFHARPKRBgAN40OAweEKY4EiCCViioXG2wd+/cq4qqYAJfnYf42g5BtI
2fDSc3QAQRCxa3+drG1TCVJU+tHlRQOTDygxRR0AwzRozZrs2l8niRu+PY4KQIWj7z361Pr0itNO
nk1XezP5XIZPe7YJIfD9kIHBMd7Y/j5J+f0P2+toY7IN80BP7sybr9KF4y4kU5h3tE9GIYCw0icq
7z3vb77nYWAQqH9WABPIA11AO+MHhfmJIz+KFPCBEnBwInn6iSMaAMD4+ewAGcCGQ7eyI4ZmvK1C
xtvsM5XgU+v8v47/ALAfzXQamB/sAAAAAElFTkSuQmCC
"
height="32"
width="32" />
<image
y="203.38185"
x="408.96579"
id="image3026"
xlink:href="data:image/png;base64,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
jX8iy71RAAAAAElFTkSuQmCC
"
height="32"
width="32" />
<image
y="224.93361"
x="29.714293"
id="image3004-6"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABchJREFU WIXFl1uIXWcVx3/fvpzrnExmOrmMiUJLOjaDlJiGViYllgZBqg+CYHxpqValEqk+WJG8iAjxAiKF guKADyqCgVbFS/rQaIc2rZPGZto0aY1mpsnMnMnMmZlz2efM3vu7+nAmYpIzkzNlwAXfw96svdZ/ r+9b//+3hHOO/6cFN78QQqzn73/j0NafBp73mBMiK2j7ClyqrfnlT8ZqXwXMegFu/mFxy4vOAMQX H+jd05f3L3mhx8BAhtKWEG0FcWxpRopWQxN6jkpTDf1ivP5voGNpb853SwXWsExfIbiUzfkM7y1Q LBbxvQzKCBqRJvBi4rRFtSrZVgovATkg7Saw14WPf/Rg33Hf97l7T4ZioYDnF/EzPWSyJXL5Etlc iXyuiLYeyvg8daj/OOBvFoBcPuMfLfRAMZ/H8/MEYR4/KBBmtxBmSoSZAp6fJczmaa5YivngKO0q bA4A4XnZQtFDWQ/hh/hBSJjpIchuwQ960DaL8EICL6AVW4QIspsJwBfCAyxSgpIObTy08ZieWWb8 9QtcmbnGQqVKmioEDk94fGq4ZwhYt6Wg20NoLdIElOcTrpTLaHWNeiNm5+5BjnzhEe7as5tm1OKH 3/sVrWYdh+PPF5vvrQJYl2i6AmCdTZU02c89/nkq88t4ns/wvr0Uijma0QqNWoS1lv3338PJ9+Zw 1rKa+LYs1w0AGyX6lTDh8OCunQx/bD86ahGvxDQbLZIkJU0kxhi27+gjkxHUVuSLgO4GQDdnQM7W 1e/TpmKhvIBbSUhWEpI4JU0lUiqklkgliRot8hnHYpSOAaqL2F0BSP90sXVSSre4vFzDaI2UCqX0 6lIYpTHaoJKYYiGonJho/pZNJCIJ1M9XzDdnJuewzqGNQSmFVgqtNFpbtLU0l6pMzOmngdrqd5sC wAHR2OXWy3/8w0snJl57E6zBGoMxBmsszlkuvzPF62cunPjbvxovAw3AdgOgWy2QQDUMRe781RS/ VEVYg5SSJE25PDnLW29PEwZ+DqjS5d9Dd2ooPvmj8QM23/+DNBx4+PjQ8+SqF5maWWSp2qAZRTQa DeKeId68dxSxMvdXWpVvv/CtB87SoQs2oobi8PFXH/Gyvc9tLWWyn/noHRw5sJXyWc181bBzoEA+ NFT8lMB5GOZ4+tM1XpsuPvybs/bMJ358MbVp7bOnjo38pROQ21UgeOj75059cKB46CsP7eDewTxX m3DnQEg2WeDK+ReoL5epLVyBoAcXFBkcehDbP4xX2M7uHsdb5ZifvzTP1Ur0/Nix+47Q5oWuLiTB g989MzZyzx0jXzu8i3JkebsKC7Eg8OBL+zL0hhBrh9IGYzRGpyy2JCfLW1EWtuUsH+mDD5Q8nj01 y+l3l149/Z37Pw7obrag4IQ38ujBQd64JplYBF+0ST128Oy44qkDAaEwWKVxRqOV5LnJXhAKTzjm IphpwL4BePTgIOem6iNAgXZ33GCd2jA7UPRZair+PmvR0qCkQUqDVoY4NYy+kYK1ZHyLc4Zfv5sn TjVKamTa9tfSMF62LNQVhbAdt9MZ6FQBESeK+ko7kBE3aqp1MJvAM+Pw5H6P0QmPSmwIPXPDbdRd 9418kkTDGtLcsQuk0tRiQ5JqPHHrl9bBdBWOvQhCtLfIdghvgShxpEp3SrM2gIXaCvXYIqVelyod bXBrUZ4FWokglRsEsFSLiRKLUu66tr8vE56H0pbJcm1jAKxKlk9fKPff/aHt1GKL1A5ru5+gPE+Q CQS9GZ/TF+awKl3eCAAZjY8+8Yr88u9m5+vs2tHPtoESYS6gmylOCFDKUKk0mJhfZmp6CXlu9AnW 0IdORJQBdvp9d+7N3Pfk112298Mu6LlrIyOkECB0c1Kk9X/Kf/zsGVOdege4BshumFDQ7tk+YAAo rT53I93XzdK+kETAIm2FTAG3kdkwWE2cpT3l3PaK/T/maA+p6er6bxu83+F00+zmfP8B+bkUVVuN XSYAAAAASUVORK5CYII= "
height="32"
width="32" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
d="M -5.3480176,156.29988 C 27.003852,171.28162 27.003852,171.28162 27.003852,171.28162"
id="path3047"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
d="m 67.395493,184.15702 c 32.351869,14.98174 32.351869,14.98174 32.351869,14.98174"
id="path3047-0"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
d="M 68.824063,231.99591 C 101.17593,217.01417 101.17593,217.01417 101.17593,217.01417"
id="path3047-0-5"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-size:12.00385952px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="-43.85862"
y="122.66718"
id="text4309"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4311"
x="-43.85862"
y="122.66718">Users</tspan></text>
<text
xml:space="preserve"
style="font-size:12.00385952px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="25.675428"
y="268.7955"
id="text4309-7"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4311-4"
x="25.675428"
y="268.7955">Users</tspan></text>
<text
xml:space="preserve"
style="font-size:12.00385952px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="25.675428"
y="149.50977"
id="text4309-7-2"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4311-4-9"
x="25.675428"
y="149.50977">Groups</tspan></text>
<text
xml:space="preserve"
style="font-size:12.00385952px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="172.24503"
y="193.42545"
id="text4309-7-2-2"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4311-4-9-7"
x="172.24503"
y="193.42545">Roles</tspan></text>
<text
xml:space="preserve"
style="font-size:12.00385952px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="386.28497"
y="196.12297"
id="text4309-7-2-2-6"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4311-4-9-7-9"
x="386.28497"
y="196.12297">Permissions</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="139.414"
y="122.7342"
id="text4417"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4419"
x="139.414"
y="122.7342">Tier 1: Actor</tspan></text>
<text
xml:space="preserve"
style="font-size:13.01001644px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
x="373.75424"
y="123.1968"
id="text4417-7"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4419-5"
x="373.75424"
y="123.1968"
style="line-height:125%;font-size:14px">Tier 2: Access</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
d="m 336.75275,211.81807 c -49.51065,0.33665 -49.51065,0.33665 -49.51065,0.33665"
id="path3047-0-3"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,214 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="565.61804"
height="183.21297"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="versioning.svg"
inkscape:export-filename="/home/rosarior/development/mayan/mayan/docs/topics/versioning.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible">
<path
id="path3860"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible">
<path
id="path3863"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="266.59717"
inkscape:cy="67.029044"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="5"
fit-margin-left="5"
fit-margin-right="5"
fit-margin-bottom="5"
inkscape:window-width="1366"
inkscape:window-height="713"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-19.509401,-14.183039)">
<image
y="19.183039"
x="289.25891"
id="image2993"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAoBJREFU
WIXFl0FPE0EUx39vZrfSVJEeMGjkoBfQEzcP4F2DRgtyF+PZeJKDicZ488gX4AM01GKiXvgMejUh
xsQLRIOiFAjW7vOwuwW23d02u6b/Zg6bnX3zm/+8mTcVVWWQco4/iIgz9uJtfb8ls82WAv3DWSMU
8NZ+vLx9D/gb1689cVVtN+DM8LN3mlXrG9+1tFSrATYJQFVPOgAM+TOHN5+2EN+V1FmrKh5wZ3IM
ebSKLs9TXZypzGutevBqbgFoxX1rIs8S2m4NuEZwemh+vzCiYWO7wc2JUaqL05Xik1o1yYkoQFuu
MTiOwbWS2hzH4BrTnsLIUIGPm7+YnTyXChELYEX6bqHKRYdyscCHAKL2YKZSWuoO0QEQ5r21gjX9
NT+A4hjDxeFTjA8X2dje48bEKGsPr1fKT+t1IjsvmoRHL0QQEdJT0IcODbg/fRl5/Jr2hwp4Hro8
T9O4t4AisJsKYE3vAACewNedfVYWplhZmOrap+UpwFBvAH04AGBE2Gocsrl7CHLMgGBNr42Xw+U9
ETLBAYMIPQOEsaNnZ9pRH58DVoKQ2aQpERKXIB+AZMU7YHw78wBIipHowGAAAs9s7BmZkSYVIJDt
oQrmodQcyEOZcmBgAI41/iGSQxYmXWpiAQrWDGgXBL3XP3/D5JSInipzVy90JekACPtYI+2ClEWq
SqtbFYoDOAIJf1mVHCMWQNGglGZ3QBP2UxcACT6EVmot6xXgZOxEADcow3evnM84dKdcKxykAZQc
Gmefvz/d9PToOpNV4v93KDk0fkdfHb+xiMgIcAkok/0IiEqBn8AXYCccNwrgAiWgkPPgof4Ae0Az
DuA/jdupcNx/sUsQuWjMJzEAAAAASUVORK5CYII=
"
height="32"
width="32" />
<text
xml:space="preserve"
style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="233.34525"
y="69.483757"
id="text2996"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan2998"
x="233.34525"
y="69.483757">Original version: 1.0.0</tspan></text>
<image
y="138.33658"
x="86.025414"
id="image3008"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABNlJREFU
WIWtl2tsVEUUgL953Lu7bVkoDwvEJkrCKwZDgtgm1RifQEgpUJFfEIgm4B9D9IcWFGIMmICJyA8w
RoNG/GEIRSjUkJIYoIpAgYSEAmlQ6AMo0AK27Jbt7h1/3LuPsu3uLXA2k3szO3PON2fOPWdGGGMQ
Qujxnx/8LZIQ8/sTBjAMV5QU2Dj7ur+ofBuI+55ojAEYEV5fbx5XDrfcMoUf19YCyq997T2D7sph
/8UbCEAI4QveAaqmjUd8sAezrZrdK19aVG1qf41uXrwUSOTTIb2nSLpdSbCkQPto7rikJklLVy/z
po5j98qK6tDaA22A5RcgJZaUaC2xlMjbtJZYUqaWMCpoc/b6PeZPe4rdy2ZPCK2tu5IPIgtACTHs
lpTikKY4ZHPGg6hdXjaxcF1uiBRAMu6VEig5vOYqMGgpeTocoDQcoqXrPnOnjmPfivKJozfUdwwF
obM6hEAIQf4QdKGTDlhRMQmxZi+piQZwHMy2amKOGQcUAnfzAijpHwDAEdB6N8LOJTPZuWTmoGMS
jgGwB/svG2AYHgCQQnCj9wHXex6AyHCAt6dlpcU509ogHpCIDEX+RGQZMcZfNs2OASU8lY8nxqeG
QbfgyQD4k2wPSNedTwIgrWNobYN64FEBBNKrIWKAXUPAB4DnM5WVG/0YFgip0NJCSenWh8xAFmN8
AHiifFTBh40raWFrzfn2I+w9VcNfl46TTJCWgudCsxDLmHL6Z27xUHgMGQO+jSuLkKXY3rCSI80/
Ujl7MUsqviYUKATgQSzChfaTNIw8f2zs9L7vD61lNRllesgY8CNKaoKWYnPdAi5cq2P90m/o6DlJ
w+V13OyNAFBSVMiM8Yv4cOFWttd/+t6cjbfFoXWsSkJk7bhW0q33KnezlCJgaZrbG2n6p441C77k
z9YtnGz7hTvRCDuqDDuqDN3R+/zdtoujVzayam4No0YWvfvKR1TghUgWgK0ktlYEVJ6mNQUW7DlR
w6Lydzh34ye6o+1omS5Q4L5rCV2RNs5e+4F5s5YSGM0mvOqY3gJv0uHLN5E+AlEKTdAupvFSI6+9
8D5Hr14kbiDhQMxJj4s5oBz362rraebVZ99AaCqAEBBLASRNKilSBSk3gMCSGi3hZl8TDrDlrezo
2VGZ7vvksKAzeippyx7ogRRI8pdbhPehS6A31po+G+YQJd2xmWkqC8BgvFKaG8HBpE7Fd6OdBG34
7A9BvwN9cdg6x135mkOCoAZLQsiGe30dA2Ikg9vtNQYSxvhoDv2JGNNKX+bWbQhYUBCAogAUZBw9
CmyvL+CO6eqG/ghn8BJSygOWV4YXTp+Q35cZUl6ynWXfzaB0IigL4gkGZP6ABZYGrUAYuPwvdJxm
KxAbAFCoTM/IDb+P6HdM+jiTUwRCKLQKMzlYRdPpfZTNBmWDlLDpuEh5wNKAA8eb4E47+5vrOAZE
AYR3NxwFTAq/vrzCxGPDuxgaaRJxaV4s2zV3zDNUTpkMJSWgvaXF49DZCZdaoKuNg0e+oga4CvQA
JglgASNwT66PUA/RQHjKm5SXlrHaDvN8Kp8LiP3HudYTfNvSQCPQAdzDS8VJAG8o8hEAjDcnBBQD
Y4Ei0hfUBNAL3Aa6gftkFKNMgMcVgZteQ7hJJvOGEMPd834eKsf/A5D84oCyPZs+AAAAAElFTkSu
QmCC
"
height="32"
width="32" />
<text
xml:space="preserve"
style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="23.233522"
y="189.69191"
id="text3011"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3013"
x="23.233522"
y="189.69191">New major version: 2.0.0</tspan></text>
<image
y="138.41853"
x="291.98331"
id="image3008-2"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABNlJREFU WIWtl2tsVEUUgL953Lu7bVkoDwvEJkrCKwZDgtgm1RifQEgpUJFfEIgm4B9D9IcWFGIMmICJyA8w RoNG/GEIRSjUkJIYoIpAgYSEAmlQ6AMo0AK27Jbt7h1/3LuPsu3uLXA2k3szO3PON2fOPWdGGGMQ Qujxnx/8LZIQ8/sTBjAMV5QU2Dj7ur+ofBuI+55ojAEYEV5fbx5XDrfcMoUf19YCyq997T2D7sph /8UbCEAI4QveAaqmjUd8sAezrZrdK19aVG1qf41uXrwUSOTTIb2nSLpdSbCkQPto7rikJklLVy/z po5j98qK6tDaA22A5RcgJZaUaC2xlMjbtJZYUqaWMCpoc/b6PeZPe4rdy2ZPCK2tu5IPIgtACTHs lpTikKY4ZHPGg6hdXjaxcF1uiBRAMu6VEig5vOYqMGgpeTocoDQcoqXrPnOnjmPfivKJozfUdwwF obM6hEAIQf4QdKGTDlhRMQmxZi+piQZwHMy2amKOGQcUAnfzAijpHwDAEdB6N8LOJTPZuWTmoGMS jgGwB/svG2AYHgCQQnCj9wHXex6AyHCAt6dlpcU509ogHpCIDEX+RGQZMcZfNs2OASU8lY8nxqeG QbfgyQD4k2wPSNedTwIgrWNobYN64FEBBNKrIWKAXUPAB4DnM5WVG/0YFgip0NJCSenWh8xAFmN8 AHiifFTBh40raWFrzfn2I+w9VcNfl46TTJCWgudCsxDLmHL6Z27xUHgMGQO+jSuLkKXY3rCSI80/ Ujl7MUsqviYUKATgQSzChfaTNIw8f2zs9L7vD61lNRllesgY8CNKaoKWYnPdAi5cq2P90m/o6DlJ w+V13OyNAFBSVMiM8Yv4cOFWttd/+t6cjbfFoXWsSkJk7bhW0q33KnezlCJgaZrbG2n6p441C77k z9YtnGz7hTvRCDuqDDuqDN3R+/zdtoujVzayam4No0YWvfvKR1TghUgWgK0ktlYEVJ6mNQUW7DlR w6Lydzh34ye6o+1omS5Q4L5rCV2RNs5e+4F5s5YSGM0mvOqY3gJv0uHLN5E+AlEKTdAupvFSI6+9 8D5Hr14kbiDhQMxJj4s5oBz362rraebVZ99AaCqAEBBLASRNKilSBSk3gMCSGi3hZl8TDrDlrezo 2VGZ7vvksKAzeippyx7ogRRI8pdbhPehS6A31po+G+YQJd2xmWkqC8BgvFKaG8HBpE7Fd6OdBG34 7A9BvwN9cdg6x135mkOCoAZLQsiGe30dA2Ikg9vtNQYSxvhoDv2JGNNKX+bWbQhYUBCAogAUZBw9 CmyvL+CO6eqG/ghn8BJSygOWV4YXTp+Q35cZUl6ynWXfzaB0IigL4gkGZP6ABZYGrUAYuPwvdJxm KxAbAFCoTM/IDb+P6HdM+jiTUwRCKLQKMzlYRdPpfZTNBmWDlLDpuEh5wNKAA8eb4E47+5vrOAZE AYR3NxwFTAq/vrzCxGPDuxgaaRJxaV4s2zV3zDNUTpkMJSWgvaXF49DZCZdaoKuNg0e+oga4CvQA JglgASNwT66PUA/RQHjKm5SXlrHaDvN8Kp8LiP3HudYTfNvSQCPQAdzDS8VJAG8o8hEAjDcnBBQD Y4Ei0hfUBNAL3Aa6gftkFKNMgMcVgZteQ7hJJvOGEMPd834eKsf/A5D84oCyPZs+AAAAAElFTkSu QmCC "
height="32"
width="32" />
<text
xml:space="preserve"
style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="216.05945"
y="189.77386"
id="text3011-9"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3013-6"
x="216.05945"
y="189.77386">New minor version: 1.1.0</tspan></text>
<image
y="137.65823"
x="494.88431"
id="image3008-2-2"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABNlJREFU WIWtl2tsVEUUgL953Lu7bVkoDwvEJkrCKwZDgtgm1RifQEgpUJFfEIgm4B9D9IcWFGIMmICJyA8w RoNG/GEIRSjUkJIYoIpAgYSEAmlQ6AMo0AK27Jbt7h1/3LuPsu3uLXA2k3szO3PON2fOPWdGGGMQ Qujxnx/8LZIQ8/sTBjAMV5QU2Dj7ur+ofBuI+55ojAEYEV5fbx5XDrfcMoUf19YCyq997T2D7sph /8UbCEAI4QveAaqmjUd8sAezrZrdK19aVG1qf41uXrwUSOTTIb2nSLpdSbCkQPto7rikJklLVy/z po5j98qK6tDaA22A5RcgJZaUaC2xlMjbtJZYUqaWMCpoc/b6PeZPe4rdy2ZPCK2tu5IPIgtACTHs lpTikKY4ZHPGg6hdXjaxcF1uiBRAMu6VEig5vOYqMGgpeTocoDQcoqXrPnOnjmPfivKJozfUdwwF obM6hEAIQf4QdKGTDlhRMQmxZi+piQZwHMy2amKOGQcUAnfzAijpHwDAEdB6N8LOJTPZuWTmoGMS jgGwB/svG2AYHgCQQnCj9wHXex6AyHCAt6dlpcU509ogHpCIDEX+RGQZMcZfNs2OASU8lY8nxqeG QbfgyQD4k2wPSNedTwIgrWNobYN64FEBBNKrIWKAXUPAB4DnM5WVG/0YFgip0NJCSenWh8xAFmN8 AHiifFTBh40raWFrzfn2I+w9VcNfl46TTJCWgudCsxDLmHL6Z27xUHgMGQO+jSuLkKXY3rCSI80/ Ujl7MUsqviYUKATgQSzChfaTNIw8f2zs9L7vD61lNRllesgY8CNKaoKWYnPdAi5cq2P90m/o6DlJ w+V13OyNAFBSVMiM8Yv4cOFWttd/+t6cjbfFoXWsSkJk7bhW0q33KnezlCJgaZrbG2n6p441C77k z9YtnGz7hTvRCDuqDDuqDN3R+/zdtoujVzayam4No0YWvfvKR1TghUgWgK0ktlYEVJ6mNQUW7DlR w6Lydzh34ye6o+1omS5Q4L5rCV2RNs5e+4F5s5YSGM0mvOqY3gJv0uHLN5E+AlEKTdAupvFSI6+9 8D5Hr14kbiDhQMxJj4s5oBz362rraebVZ99AaCqAEBBLASRNKilSBSk3gMCSGi3hZl8TDrDlrezo 2VGZ7vvksKAzeippyx7ogRRI8pdbhPehS6A31po+G+YQJd2xmWkqC8BgvFKaG8HBpE7Fd6OdBG34 7A9BvwN9cdg6x135mkOCoAZLQsiGe30dA2Ikg9vtNQYSxvhoDv2JGNNKX+bWbQhYUBCAogAUZBw9 CmyvL+CO6eqG/ghn8BJSygOWV4YXTp+Q35cZUl6ynWXfzaB0IigL4gkGZP6ABZYGrUAYuPwvdJxm KxAbAFCoTM/IDb+P6HdM+jiTUwRCKLQKMzlYRdPpfZTNBmWDlLDpuEh5wNKAA8eb4E47+5vrOAZE AYR3NxwFTAq/vrzCxGPDuxgaaRJxaV4s2zV3zDNUTpkMJSWgvaXF49DZCZdaoKuNg0e+oga4CvQA JglgASNwT66PUA/RQHjKm5SXlrHaDvN8Kp8LiP3HudYTfNvSQCPQAdzDS8VJAG8o8hEAjDcnBBQD Y4Ei0hfUBNAL3Aa6gftkFKNMgMcVgZteQ7hJJvOGEMPd834eKsf/A5D84oCyPZs+AAAAAElFTkSu QmCC "
height="32"
width="32" />
<text
xml:space="preserve"
style="font-size:13px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="418.96045"
y="189.01357"
id="text3011-9-6"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3013-6-4"
x="418.96045"
y="189.01357">New micro version: 1.0.1</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="m 110.10663,126.0523 c 0,-109.138839 196.30631,6.06092 197.09645,-42.415649 0.79014,48.498089 197.09644,-64.75136 197.09644,42.437169"
id="path3067"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
d="m 307.21636,84.18173 0,46.12327"
id="path3087"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -4,77 +4,57 @@
Mayan EDMS documentation
========================
.. rubric:: `Open source`_, Django_ based document manager with custom
metadata_ indexing_, file serving integration, `checking out and in`_, OCR_ capabilities,
document versioning_ and `digital signature verification`_.
.. _Django: http://www.djangoproject.com/
.. _OCR: https://secure.wikimedia.org/wikipedia/en/wiki/Optical_character_recognition
.. _digital signature verification: http://en.wikipedia.org/wiki/Digital_signature
.. _versioning: http://en.wikipedia.org/wiki/Versioning
.. _metadata: http://en.wikipedia.org/wiki/Metadata
.. _indexing: http://en.wikipedia.org/wiki/Index_card
.. _Open source: http://en.wikipedia.org/wiki/Open_source
.. _checking out and in: http://en.wikipedia.org/wiki/Revision_control
.. rubric:: `Open source`_ `document management system`_.
Getting help
============
* Try the :doc:`FAQ <faq/index>` -- it's got answers to many common questions.
* 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 Gname_.
`post a question`_. If you prefer news servers, use the gateway provided by Gmane_.
* Report bugs with **Mayan EDMS** using Github's `ticket tracker`_.
* Try the :doc:`FAQ <topics/faq>` -- it's got answers to many common questions.
.. _archives of the mayan-edms mailing list: http://groups.google.com/group/mayan-edms/
.. _Gname: http://news.gmane.org/gmane.comp.python.django.mayan-edms
.. _post a question: http://groups.google.com/group/mayan-edms
.. _ticket tracker: https://github.com/mayan-edms/mayan-edms/issues
First steps
===========
:doc:`Overview <intro/overview>` |
:doc:`Features <intro/features>` |
:doc:`Requirements <intro/requirements>` |
:doc:`Installation <intro/installation>` |
:doc:`Getting started <intro/getting_started>`
:doc:`Features <topics/features>` |
:doc:`Installation <topics/installation>` |
:doc:`Getting started <topics/getting_started>`
Understanding Mayan EDMS
========================
:doc:`File storage <topics/file_storage>` |
:doc:`Initial data loading <topics/initial_import>` |
:doc:`Permission system <topics/permissions>` |
:doc:`Transformations <topics/transformations>` |
:doc:`Document visualization <topics/document_visualization>` |
:doc:`Document versioning <topics/versioning>` |
:doc:`Document signatures <topics/signatures>` |
:doc:`Indexes <topics/indexes>` |
:doc:`Smart links <topics/smart_links>` |
:doc:`Tags <topics/tags>` |
:doc:`OCR <topics/ocr>`
Release notes
=============
:doc:`Release notes and upgrading instructions <releases/index>`
Customization and fine-tuning
==============================
:doc:`Settings <topics/settings>` | :doc:`Customization <topics/customization>`
For developers
==============
:doc:`Development <topics/development>` | :doc:`Documentation <topics/documentation>` | :doc:`Translations <topics/translations>`
:doc:`Development <topics/development>`
Credits
=======
:doc:`Contributors <credits/contributors>` |
:doc:`Licensing <credits/license>`
:doc:`Contributors <topics/contributors>` |
:doc:`Licensing <topics/license>`
.. _Django: http://www.djangoproject.com/
.. _Gmane: http://news.gmane.org/gmane.comp.python.django.mayan-edms
.. _Open source: http://en.wikipedia.org/wiki/Open_source
.. _archives of the mayan-edms mailing list: http://groups.google.com/group/mayan-edms/
.. _document management system: https://en.wikipedia.org/wiki/Document_management_system
.. _post a question: http://groups.google.com/group/mayan-edms
.. _ticket tracker: https://github.com/mayan-edms/mayan-edms/issues

View File

@@ -1,132 +0,0 @@
===============
Getting started
===============
This chapter will guide you through the initial steps needed to get **Mayan EDMS**
up and running after installation.
The easy 2 step setup
=====================
Document sources
----------------
|Setup tab| |Right arrow| |Sources button| |Right arrow| |Web form tab|
Before anything else you must define from where you will feed **Mayan EDMS**
documents for it to process and store. To do this first go to the ``Setup`` tab
then to the ``Sources`` button. To obtain the fastest working setup, create a
new source of type ``Web forms``. This source will open a browser file upload
dialog, hence the name ``Web forms``. Name it something simple like ``Local documents``,
choose an icon to visually identify this document if you so wish and select whether or not
compressed files uploaded from this source will be automatically decompressed and
their content treated as individual documents.
Quickly bootstraping your Mayan EDMS install
--------------------------------------------
|Setup tab| |Right arrow| |Bootstrap button|
**Mayan EDMS** includes an app called ``Bootstrap``. This app stores
scripted configurations, that when executed will setup your installation of **Mayan EDMS**.
From there you can then fine tune this setup to your needs. To use this
app go to the ``Setup`` area and launch the app using the ``Bootstrap`` button.
.. hint:: Predefined sample setups can be downloaded from the
`Official bootstrap setup repository for Mayan EDMS`_. If you want to use
one of the available setups for testing or as a starting point, choose one
and import it with ``Import from URL``. Finally execute it on an empty database.
The longer custom setup
=======================
Setting your document types
---------------------------
|Setup tab| |Right arrow| |Document types button|
If none of the available bootstrap setups fit your needs and your wish to
setup **Mayan EDMS** from scratch, the first thing to consider is what your document
types will be. Examples of document types are: ``Legal documents``,
``Internal documents``, ``Medical records``, ``Designing specifications``, ``Permits``.
A document type represents a group, a type, a class of documents which share some
common properties. A good indicator that can help you determine you document types
is what kind of information or ``metadata`` is attached to the documents.
Defining metadata
-----------------
|Setup tab| |Right arrow| |Metadata types button|
With your document types defined it should be much easier now to define the required
``metadata`` for each of these document types. When creating ``metadata`` types,
the first thing that will be needed is the internal name with which this metadata
type will be referenced in other areas of **Mayan EDMS**. Internal name is like a
variable so it should not contain spaces or uppercase characters. After the internal name,
enter the name that will be visible to you and your users, this is usually the same as the
internal name but with proper capitalization and spacing. ``metadata`` types
can have default values to speed up data entry, default static values are enclosed in
quotes, ie::
"Building A"
or::
"Storage room 1"
Default values can also be defined as ``Python`` statements or functions such as::
current_date()
If you want to restrict or standardize the values for a metadata type, use the ``Lookup`` field to
define the list of options that are allowed. Define the lookup list using a ``Python``
list of quoted values, for example::
["2000", "2001", "2002", "2003", "2004"].
Instead of a free entry text field, your users will get a dropdown list of years.
You can also use a ``Python`` expression to generate the lookup list.
When you are uploading a new document, a choice of metadata types will be presented
and you choose which of those you wish to enter for the document you are about
to upload. To speed data entry you can also match which metadata types will
be preselected when uploading a document of a certain type. To match metadata types
to document types, go to the ``setup`` tab, ``document types`` button, and
lastly ``Default metadata``. Choose the desired metadata for the document type
currently selected and press ``Add``. From now on whenever you upload a document of
this type, the related metadata types for this document type will be preselected.
After defining all your metadata types you can also define your indexes to
let **Mayan EDMS** automatically categorize your documents based on their metadata.
Refer to the chapter named :doc:`Indexes </topics/indexes>` for examples on how to
use the document indexes.
.. |Setup tab| image:: /_static/setup_tab.png
:alt: Setup tab
:align: middle
.. |Sources button| image:: /_static/sources_button.png
:alt: Sources button
:align: middle
.. |Web form tab| image:: /_static/web_form_source_tab.png
:alt: Web form tab
:align: middle
.. |Bootstrap button| image:: /_static/bootstrap_button.png
:alt: Bootstrap button
:align: middle
.. |Right arrow| image:: /_static/arrow_right.png
:alt: Right arrow
:align: middle
.. |Document types button| image:: /_static/document_types_button.png
:alt: Document types button
:align: middle
.. |Metadata types button| image:: /_static/metadata_types_button.png
:alt: Metadata types button
:align: middle
.. _DjangoZoom: http://djangozoom.com/
.. _`Official bootstrap setup repository for Mayan EDMS`: http://bootstrap.mayan-edms.com/

View File

@@ -1,13 +0,0 @@
Getting started
===============
New to **Mayan EDMS**? Read this material to quickly get up and running.
.. toctree::
:maxdepth: 1
overview
features
requirements
installation
getting_started

View File

@@ -1,18 +0,0 @@
====================
History and overview
====================
**Mayan EDMS** started as a simple project whose only requirement was the storage of PDF files, from there it has grown into a complete electronic document management solution.
**Mayan EDMS** can optimize an organization's bulk upload, storage and retrieval of documents.
Documents are organized using document classes, user defined metadata fields as well as automatic document grouping and indexing. Documents can be retrieved from the document index or by means of full
text searching. Users can search for terms in the document's metadata, properties or contents extracted from PDFs or transcribed by OCR_.
**Mayan EDMS** is written in Python_ using the Django_ framework, which makes it very agile and fast, specially when compared with existing Java based solutions.
Being based on patent free, `Open source`_ technologies, **Mayan EDMS** provides legal safety to users and organizations, as well as peace of mind as documents and all related information is stored in open source and transparent formats allowing portability and avoiding `vendor lock-in`_.
Being written using Python_, **Mayan EDMS** runs on many POSIX compliant operating systems. Featuring many configuration parameters, **Mayan EDMS** allows to be deployed on many hardware and software configurations such as single server based, clusters, virtualized and cloud based hosting giving adopters the choice of using the infrastructure of their choice.
.. _`vendor lock-in`: https://secure.wikimedia.org/wikipedia/en/wiki/Vendor_lock-in
.. _Python: http://www.python.org/
.. _Django: http://www.djangoproject.com/
.. _OCR: https://secure.wikimedia.org/wikipedia/en/wiki/Optical_character_recognition
.. _`Open source`: https://secure.wikimedia.org/wikipedia/en/wiki/Open_source

View File

@@ -1,50 +0,0 @@
============
Requirements
============
**Mayan EDMS** supports various levels of functionality, because of this
requirements can vary for each individual deployment.
Basic requirements
==================
Python:
* ``Django`` - A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
Execute pip install -r requirements/production.txt to install the python/django dependencies automatically.
Executables:
* ``gpg`` - The GNU Privacy Guard
Optional requirements
=====================
Improved OCR
------------
* ``unpaper`` - post-processing scanned and photocopied book pages
Enhanced MIME detection
------------------------
* ``libmagic`` - MIME detection library, if not installed **Mayan EDMS** will fall back to using python's simpler mimetype built in library
* ``python-magic`` - A python wrapper for libmagic
OCR backends
------------
** Mayan EDMS** can make use of different OCR engines via OCR backends. By default it will use the ``Tesseract OCR backend``.
* ``tesseract-ocr`` - An OCR Engine that was developed at HP Labs between 1985 and 1995... and now at Google. Version 3.x or greater required.
Image conversion backends
-------------------------
**Mayan EDMS** has the ability to switch between different image conversion backends, at the moment these three are supported:
* ``ImageMagick`` - Convert, Edit, Or Compose Bitmap Images.
* ``GraphicMagick`` - Robust collection of tools and libraries to read, write, and manipulate an image.
* Python only - Relies on ``Pillow`` to support a limited set of the most common graphics formats.
By default the python backend is used.

View File

@@ -16,7 +16,7 @@ check outs have been added too as per the feature request posted as `issue #26`_
The way the history events for a document are presented has been improved and
it is now more useful as it provides filtering by event type. To improve
the diagnosis of installation of runtime error a simple view showing the
number of internal interval jobs being used by Mayan EDMS as well as a
number of internal interval jobs being used by Mayan EDMS as well as a
new app which shows a detail of the current installation enviroment were added.
What's new in Mayan EDMS v0.12.2
@@ -35,9 +35,6 @@ created an administrator account of username 'admin' with a password of
'admin'. The new default is to randomize an initial password and show this password
at the login screen until the administrator password is changed.
.. image:: mayan_first_login.png
:alt: First login dialog
Document check outs
~~~~~~~~~~~~~~~~~~~
As per the feature request filed under `issue #26`_, a new document
@@ -47,7 +44,7 @@ editing conflicts. Document check outs have an expiration period after which
**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
unless being granted the ``Allow overriding check out restrictions`` or
``Forcefully check in documents`` permission respectively.
Installation environment app
@@ -109,7 +106,7 @@ Bugs fixed
* `issue #26`_ "checkout feature request"
Stuff removed
=============
=============
* Feedback app

View File

@@ -162,14 +162,14 @@ Next upgrade/add the new requirements::
Migrate existing database schema with::
$ ./manage.py migrate acls 0001 --fake
$ ./manage.py migrate taggit 0001 --fake
$ ./manage.py migrate ocr 0001 --fake
$ ./manage.py migrate
$ mayan-edms.py migrate acls 0001 --fake
$ mayan-edms.py migrate taggit 0001 --fake
$ mayan-edms.py migrate ocr 0001 --fake
$ mayan-edms.py migrate
Add new static media::
$ ./manage.py collectstatic --noinput
$ mayan-edms.py collectstatic --noinput
The upgrade procedure is now complete.

368
docs/releases/1.1.rst Normal file
View File

@@ -0,0 +1,368 @@
=============================
Mayan EDMS v1.1 release notes
=============================
Released: February 10, 2015
Welcome to Mayan EDMS v1.1
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
as per `Celery's documentation`_. This change made the built-in scheduler and
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
by prepending the app name to the view name.
Removal of the splash screen
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The static image home screen has been replaced with a quick links view, showing
the most used actions: Uploading documents, viewing recent documents, viewing
all documents and searching documents.
Sending and receiving documents via email
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A link or entire documents can be sent as attachments via email. Documents can
also be received via email with the addition of two document sources named IMAP and POP3
which correspond to the mail protocol used to fetch the documents. Read Django's
`email configuration settings documentation`_ for more details on how to set up
mail serving.
Update to Django 1.6.8
~~~~~~~~~~~~~~~~~~~~~~
**Mayan EDMS** has been updated to use Django 1.6.8.
Events app
~~~~~~~~~~
The built-in history app has been removed in favor of a new events wrapper app
for `Django activity stream`_
Watch folders
~~~~~~~~~~~~~
Filesystem folders can be monitored for change and their files automatically
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**.
User locale profile (language and timezone)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Interface language and locale setting can now be setup for each user and are not
installation wide as before. Date and times offsets are automatically ajusted to
each user's timezone settings.
Document states
~~~~~~~~~~~~~~~
A new simple workflow app that can represent document states has been included.
Explicit document types needed per index
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Indexes can now be tied to document types, eliminating the need to update
indexes for every document update. Indexes will only update when a document of
the type to which they are associated is updated.
Optional and required metadata types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Metadata types can now be assigned in two ways to documents types, as optional or
required. Values for required metadata types as the name implies, must be entered
for documents to be able to be uploaded. Optional metadata types on the other hand
can be left blank by the user.
Bulk document type change
~~~~~~~~~~~~~~~~~~~~~~~~~
It is now possible to change the document type of previously uploaded documents.
When the document type of a document is changed the metadata values are reset and
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
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
version 3.0 is released, at which time version series 2.x will go into
maintenance mode.
Deprecation of Python 2.6
~~~~~~~~~~~~~~~~~~~~~~~~~
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.
API updates
~~~~~~~~~~~
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
text messages.
Improved method for custom settings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Custom settings now use a string based value, it is longer needed to import
classes when customizing a setting::
from custom_app.backends import CustomStorageBackend
DOCUMENTS_STORAGE_BACKEND = CustomStorageBackend
Instead the fully qualified name of the class must be passed as the setting value::
DOCUMENTS_STORAGE_BACKEND = 'custom_app.backends.CustomStorageBackend'
Removal of the OCR config setting
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OCR behavior is now a document type property meaning that is can be turned
on or off for specific document types.
Per document language setting
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Previously the document language used for OCR was specified for the entire
installation. If documents in multiple languages were uploaded some suffered
lower successes rates. Now the language of each document can be specified.
Metadata validation and parsing support
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It is now possible to create function to validate metadata value input or
parse and store corrected values. Three sample metadata validations functions
are included: ``Parse date and time``, ``Parse date`` and ``Parse time``.
Removal of 960 grid system in favor Pure CSS's grid system
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By using Pure CSS's columns based grid system, the move towards a
Bootstrap UI migration has advanced greatly.
Simplified UI
~~~~~~~~~~~~~
All user actions as well as the logout button as now under the user functions
section.
Stable PDF previews generation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The way PDF were being generated has been improved greatly eliminating
spurious segmentation faults at the expense of a small speed penalty.
More technical documentation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Many new sub topics were added to the development section of the document
to allow developers to better understand the inner workings and philosophies
of **Mayan EDMS**.
Other changes
~~~~~~~~~~~~~
* Removal of the MAIN_SIDE_BAR_SEARCH setting
* Removal of THEMES and themes support
* Removal of VERBOSE_LOGIN setting
* Removal of graphics backend supported file format list view
* Removal of the MAIN_DISABLE_ICONS setting
* Removal of specialized Sentry support
* Removal of the MAIN_ENABLE_SCROLL_JS setting
* Remove hardcoded root (/) redirections
* Removal of APSCheduler as a requirement
* Removal of the scheduled jobs view
* Removal of the web_theme app
* Removal of the sources icon selection support
* Removal of the in-app help panels
* Removal of the duplicate document search feature
* Removal of filesystem document indexes mirroring feature
* Improve sources app model sub classes and inheritance handling
* Addition of CORS support to the API
Upgrading from a previous version
=================================
IMPORTANT! Before running the upgrade make sure none of your documents have
duplicated metadata types, meaning that the same metadata type must not appear
twice for any given document.
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
Migrate existing database schema with::
$ mayan-edms.py migrate dynamic_search 0001 --fake
$ mayan-edms.py migrate history 0001 --fake
$ mayan-edms.py migrate linking 0001 --fake
$ mayan-edms.py migrate lock_manager 0001 --fake
$ mayan-edms.py migrate tags 0001 --fake
$ mayan-edms.py migrate
During the migration several messages of stale content types can occur:
.. code-block:: bash
The following content types are stale and need to be deleted:
metadata | documenttypedefaults
metadata | metadataset
metadata | metadatasetitem
ocr | documentqueue
ocr | queuedocument
sources | watchfolder
sources | outofprocess
sources | webform
sources | stagingfolder
tags | tagproperties
Any objects related to these content types by a foreign key will also
be deleted. Are you sure you want to delete these content types?
If you're unsure, answer 'no'.
Type 'yes' to continue, or 'no' to cancel:
You can safely answer "yes".
Add new static media::
$ mayan-edms.py collectstatic --noinput
Remove unused dependencies::
$ pip uninstall APScheduler
$ pip uninstall django-taggit
The upgrade procedure is now complete.
Backward incompatible changes
=============================
* None
Bugs fixed or issues closed
===========================
* `issue #30 <https://github.com/mayan-edms/mayan-edms/issues/30>`_ Document workflows
* `issue #32 <https://github.com/mayan-edms/mayan-edms/issues/32>`_ Watched folders
* `issue #34 <https://github.com/mayan-edms/mayan-edms/issues/34>`_ Postprocessing document queue
* `issue #35 <https://github.com/mayan-edms/mayan-edms/issues/35>`_ Metadata validation
* `issue #37 <https://github.com/mayan-edms/mayan-edms/issues/37>`_ Add from __future__ import unicode_literals
* `issue #39 <https://github.com/mayan-edms/mayan-edms/issues/39>`_ Capitalization of messages
* `issue #40 <https://github.com/mayan-edms/mayan-edms/issues/40>`_ Update references to root ('/') path
* `issue #46 <https://github.com/mayan-edms/mayan-edms/issues/46>`_ Advanced search past 1st page
* `issue #49 <https://github.com/mayan-edms/mayan-edms/issues/49>`_ Problems with large pdf files
* `issue #50 <https://github.com/mayan-edms/mayan-edms/issues/50>`_ raise CommandNotFound(path)
* `issue #51 <https://github.com/mayan-edms/mayan-edms/issues/51>`_ Search with ANONYMOUS error
* `issue #55 <https://github.com/mayan-edms/mayan-edms/issues/55>`_ Document approval cicle?
* `issue #56 <https://github.com/mayan-edms/mayan-edms/issues/56>`_ Removal of non essential features, views, models
* `issue #57 <https://github.com/mayan-edms/mayan-edms/issues/57>`_ Migrate to Celery for task query and periodic tasks
* `issue #64 <https://github.com/mayan-edms/mayan-edms/issues/64>`_ Pluralize messages properly
* `issue #65 <https://github.com/mayan-edms/mayan-edms/issues/65>`_ Backport the ability to receive documents via email
* `issue #66 <https://github.com/mayan-edms/mayan-edms/issues/66>`_ Python 3 compatibility: Add from __future__ import unicode_literals and remove all u''
* `issue #68 <https://github.com/mayan-edms/mayan-edms/issues/68>`_ Revise and update the use gettext vs. gettext_lazy
* `issue #69 <https://github.com/mayan-edms/mayan-edms/issues/69>`_ Feature removal: remove "Unregistered" message from the title bar
* `issue #71 <https://github.com/mayan-edms/mayan-edms/issues/71>`_ Add retry support to the converter task
* `issue #72 <https://github.com/mayan-edms/mayan-edms/issues/72>`_ Delete unused static icons
* `issue #74 <https://github.com/mayan-edms/mayan-edms/issues/74>`_ Cache a document's first document version
* `issue #75 <https://github.com/mayan-edms/mayan-edms/issues/75>`_ Move automatic OCR queueing from a configuration settings to a property of Document Type model
* `issue #77 <https://github.com/mayan-edms/mayan-edms/issues/77>`_ Add document view permission support to the search app
* `issue #78 <https://github.com/mayan-edms/mayan-edms/issues/78>`_ COMMON_TEMPORARY_DIRECTORY seems not to be used everywhere
* `issue #79 <https://github.com/mayan-edms/mayan-edms/issues/79>`_ Error installing
* `issue #82 <https://github.com/mayan-edms/mayan-edms/issues/82>`_ Make document type a required field
* `issue #83 <https://github.com/mayan-edms/mayan-edms/issues/83>`_ Simplify source app views and navigation
* `issue #84 <https://github.com/mayan-edms/mayan-edms/issues/84>`_ Remove template context variable 'object_name' to improve translations
* `issue #85 <https://github.com/mayan-edms/mayan-edms/issues/85>`_ Reset page count for a single document
* `issue #86 <https://github.com/mayan-edms/mayan-edms/issues/86>`_ Move migrations to new 'south_migrations' folders
* `issue #87 <https://github.com/mayan-edms/mayan-edms/issues/87>`_ Per document language selection
* `issue #88 <https://github.com/mayan-edms/mayan-edms/issues/88>`_ Remove metadata type selection from the upload wizard
* `issue #89 <https://github.com/mayan-edms/mayan-edms/issues/89>`_ Allow metadata types to be required for specific document types
* `issue #90 <https://github.com/mayan-edms/mayan-edms/issues/90>`_ Remove the app_registry app
* `issue #91 <https://github.com/mayan-edms/mayan-edms/issues/91>`_ Don't preserve the ?page= URL query string value when switching sources during document upload
* `issue #92 <https://github.com/mayan-edms/mayan-edms/issues/92>`_ Make register_multi_item_links class aware
* `issue #95 <https://github.com/mayan-edms/mayan-edms/issues/95>`_ Installation error on Mac OSX; OSError: [Errno 2] No such file or directory
* `issue #96 <https://github.com/mayan-edms/mayan-edms/issues/96>`_ Remove hard code User model references
* `issue #97 <https://github.com/mayan-edms/mayan-edms/issues/97>`_ Make multi item links a drop down list
* `issue #104 <https://github.com/mayan-edms/mayan-edms/issues/104>`_ Finish polishing metadata validation patch
* `issue #105 <https://github.com/mayan-edms/mayan-edms/issues/105>`_ Tie smart links setups to document types
* `issue #106 <https://github.com/mayan-edms/mayan-edms/issues/106>`_ Convert document indexing app actions to Celery
* `issue #107 <https://github.com/mayan-edms/mayan-edms/issues/107>`_ Restrict document metadata addition and removal
* `issue #108 <https://github.com/mayan-edms/mayan-edms/issues/108>`_ New home screen
* `issue #109 <https://github.com/mayan-edms/mayan-edms/issues/109>`_ Add Roles API endpoints
* `issue #111 <https://github.com/mayan-edms/mayan-edms/issues/111>`_ Add Checkouts API endpoints
* `issue #112 <https://github.com/mayan-edms/mayan-edms/issues/112>`_ Add OCR API endpoints
* `issue #114 <https://github.com/mayan-edms/mayan-edms/issues/114>`_ Implement UI language as user preference
* `issue #116 <https://github.com/mayan-edms/mayan-edms/issues/116>`_ Add documentation topic explicitly noting the binary requirements
* `issue #118 <https://github.com/mayan-edms/mayan-edms/issues/118>`_ When a metadata type is removed from a document type, remove it from all the documents of that type
* `issue #119 <https://github.com/mayan-edms/mayan-edms/issues/119>`_ When a required metadata type is added to a document type, add it to all documents of that type
* `issue #126 <https://github.com/mayan-edms/mayan-edms/issues/126>`_ Failing migration with SQLite
* `issue #127 <https://github.com/mayan-edms/mayan-edms/issues/127>`_ Failing migration with Postgres
* `issue #128 <https://github.com/mayan-edms/mayan-edms/issues/128>`_ Add Indexes API endpoints
* `issue #129 <https://github.com/mayan-edms/mayan-edms/issues/129>`_ Search api shouldn't memorize requested page as part of the query
* `issue #130 <https://github.com/mayan-edms/mayan-edms/issues/130>`_ Users API is not working correctly
* `issue #131 <https://github.com/mayan-edms/mayan-edms/issues/131>`_ Is there an API to update a user's password?
* `issue #137 <https://github.com/mayan-edms/mayan-edms/issues/137>`_ Enhancement of language selection
* `issue #138 <https://github.com/mayan-edms/mayan-edms/issues/138>`_ Possibility to keep zoom factor
* `issue #139 <https://github.com/mayan-edms/mayan-edms/issues/139>`_ Translatability of language selection
* `issue #140 <https://github.com/mayan-edms/mayan-edms/issues/140>`_ Thumbnail creation for ods crashing
* `issue #143 <https://github.com/mayan-edms/mayan-edms/issues/143>`_ Exception Value: 'exceptions.ValueError' object has no attribute 'messages'
* `issue #144 <https://github.com/mayan-edms/mayan-edms/issues/144>`_ Behavior of 'Edit metadata' (Recent Documents)
* `issue #146 <https://github.com/mayan-edms/mayan-edms/issues/146>`_ Periodic task not initiated for mail boxes and watch folders
* `issue #149 <https://github.com/mayan-edms/mayan-edms/issues/149>`_ Attribute error in document download
* `issue #150 <https://github.com/mayan-edms/mayan-edms/issues/150>`_ Double second menu entry
* `issue #152 <https://github.com/mayan-edms/mayan-edms/issues/152>`_ Document content empty
* `issue #153 <https://github.com/mayan-edms/mayan-edms/issues/153>`_ south migration with postgres: documents: 031_remove_orphan_documents
* `issue #157 <https://github.com/mayan-edms/mayan-edms/issues/157>`_ upload new version of a document not working
* `issue #158 <https://github.com/mayan-edms/mayan-edms/issues/158>`_ Plural form not matching singular form in ocr app bug i18n
.. _Celery: http://www.celeryproject.org/
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/
.. _Celery's documentation: http://celery.readthedocs.org/en/latest/configuration.html
.. _namespaced: https://docs.djangoproject.com/en/1.6/topics/http/urls/#url-namespaces
.. _email configuration settings documentation: https://docs.djangoproject.com/en/1.6/ref/settings/#email-host
.. _Django activity stream: https://github.com/justquick/django-activity-stream

View File

@@ -17,6 +17,14 @@ Final releases
Below are release notes through **Mayan EDMS** |version| and its minor releases. Newer
versions of the documentation contain the release notes for any later releases.
1.1 release
-----------
.. toctree::
:maxdepth: 1
1.1
1.0 release
-----------
.. toctree::

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,35 @@
.. _contributors:
============
Contributors
============
How to contribute?
------------------
You can help further the development of **Mayan EDMS** by testing, reporting bugs, submitting documentation or code patches.
Lead developer
--------------
* Roberto Rosario (roberto.rosario@mayan-edms.com) <https://twitter.com/siloraptor>
Contributors (in alphabetical order)
------------------------------------
* Aziz M. Bookwala (https://github.com/azizmb)
* Bertrand Bordage (https://github.com/BertrandBordage)
* Brian E (brian@realize.org)
* David Herring (https://github.com/abadger1406)
* Jens Kadenbach (https://github.com/audax)
* Kolmar Kafran
* IHLeanne (https://github.com/IHLeanne)
* Iliya Georgiev (ikgeorgiev@gmail.com)
* Lars Kruse (devel@sumpfralle.de)
* Mathias Behrle <mbehrle@m9s.biz>
* Meurig Freeman (https://github.com/meurig)
* Nate Aune (nate@appsembler.com)
* Paul Whipp [https://github.com/pwhipp] [http://paulwhippconsulting.com]
* Rafael Esparra <rafael.esparra1@upr.edu>
* Sergey Glita (s.v.glita@gmail.com)
* Simone Federici [https://twitter.com/aldaranalton] [https://github.com/simone]
* Webfaction (https://www.webfaction.com)

View File

@@ -1,49 +0,0 @@
=============
Customization
=============
The general appearance of **Mayan EDMS** can be customized entirely just
by changing a few settings.
------
Themes
------
**Mayan EDMS** uses `Andrea Franz's excellent web app template`_, which includes
several themes that could be used to adapt **Mayan EDMS**'s appearance to match
an organtization existing applications' look and feel.
The theme can be changed very easily by setting the :setting:`WEB_THEME_THEME`
configuration option to one of its valid values.
.. image:: ../_static/themes.png
:alt: themes
------------
Login screen
------------
The amount of information presented at the login screen can also be restricted
for security or design reasons using :setting:`WEB_THEME_VERBOSE_LOGIN`
configuration option.
.. image:: ../_static/mayan-login.png
:alt: mayan login screen
-----------
Home screen
-----------
Sometimes users just want to go directly to work and not just be greeted with
a home screen. For these kind of situations **Mayan EDMS** has the
:setting:`MAIN_DISABLE_HOME_VIEW` configuration option, which will cause
users to land on their ``recent document list`` as soon as they log in.
-----
Icons
-----
Some themes such as ``default`` might be more visually appealing to some
people without the menu icons, for this **Mayan EDMS** provides the
:setting:`MAIN_DISABLE_ICONS` configuration option.
.. image:: ../_static/no-icons.png
:alt: mayan screens with out icons
.. _`Andrea Franz's excellent web app template`: https://github.com/pilu/web-app-theme

View File

@@ -5,20 +5,263 @@ Development
**Mayan EDMS** is under active development, and contributions are welcome.
If you have a feature request, suggestion, or bug reports, please open a new
If you have a feature request, suggestion or bug report, please open a new
issue on the `GitHub issue tracker`_. To submit patches, please send a pull
request on GitHub_. Contributors are credited accordingly on the :ref:`contributors` section.
Follow the coding conventions document available at: https://github.com/mayan-edms/mayan-edms/wiki/Coding-conventions
request on GitHub_. Make sure to add yourself to the :ref:`contributors` file.
.. _GitHub: https://github.com/mayan-edms/mayan-edms/
.. _`GitHub issue tracker`: https://github.com/mayan-edms/mayan-edms/issues
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**.
- Functionality must be as market/sector independent as possible, code for the 95% of use cases.
- Each user must be able to configure and customize it to their needs after install.
- Abstract as much as possible, each app must be an expert in just one thing, for other things they should use the API/classes/functions of other apps.
- Assume as little as possible about anything outside the project (hardware, OS, storage).
- Provide Python based abstraction so that a default install runs with a single step.
- No hard dependencies on binaries unless there is no other choice.
- Provide “drivers” or switchable backends to allow users to fine tune the installation.
- Call to binaries only when there is no other choice or the Python choices are not viable/mature/efficient.
- Each app is as independent and self contained as possible. Exceptions, the basic requirements: navigation, permissions, common, main.
- If an app is meant to be used by more than one other app it should be as generic as possible in regard to the project and another app will bridge the functionality.
- Example: the acls app is app agnostic, document_acls connects the acls app with the documents app.
- Example: since indexing (document_indexing) only applies to documents, the app is specialized and dependant on the documents app.
Coding conventions
------------------
Follow PEP8
~~~~~~~~~~~
Whenever possible, but don't obsess over things like line length.
.. code-block:: bash
$ flake8 --ignore=E501,E128,E122 |less
Imports
~~~~~~~
Import order should be:
- Standard Python modules
- Installed Python modules
- Core Django modules
- Installed Django modules
- Mayan EDMS modules
- Local imports
Example:
.. code-block:: bash
from __future__ import absolute_import
# Standard Python library
import base64
# 3rd party installed Python libraries
import requests
# Django core modules
from django.db.models import Q
from django.template.defaultfilters import slugify
from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
# 3rd party installed Django libraries
from rest_framework import APIView
# Mayan apps
from metadata.classes import MetadataClass
# Local app imports (relative)
from .conf.settings import (
AVAILABLE_INDEXING_FUNCTIONS,
MAX_SUFFIX_COUNT, SLUGIFY_PATHS
)
from .exceptions import MaxSuffixCountReached
from .filesystem import (
fs_create_index_directory, fs_create_document_link,
fs_delete_document_link, fs_delete_index_directory,
assemble_suffixed_filename
)
from .models import Index, IndexInstanceNode, DocumentRenameCount
All local app module imports are in relative form, local app module name is to be referenced as little as possible, unless required by a specific feature, trick, restriction, ie: Runtime modification of the module's attributes.
Incorrect:
.. code-block:: bash
# documents app views.py model
from documents.models import Document
Correct:
.. code-block:: bash
# documents app views.py model
from .models import Document
Dependencies
~~~~~~~~~~~~
**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 import anything else. The common and main apps are the base apps.
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**.
Examples:
Links:
.. code-block:: bash
link_document_page_transformation_list = ...
link_document_page_transformation_create = ...
link_document_page_transformation_edit = ...
link_document_page_transformation_delete = ...
Constants:
.. code-block:: bash
PERMISSION_SMART_LINK_VIEW = ...
PERMISSION_SMART_LINK_CREATE = ...
PERMISSION_SMART_LINK_DELETE = ...
PERMISSION_SMART_LINK_EDIT = ...
Classes:
.. code-block:: bash
class Document(models.Model):
class DocumentPage(models.Model):
class DocumentPageTransformation(models.Model):
class DocumentType(models.Model):
class DocumentTypeFilename(models.Model):
Strings
~~~~~~~
Quotation character used in **Mayan EDMS** for strings is the single quote. Double quote is used for multiline comments or HTML markup.
General
~~~~~~~
Code should appear in their modules in alphabetic order or in their order of importance if it makes more sense for the specific application.
This makes visual scanning easier on modules with a large number of imports, views or classes.
Class methods that return a value should be prepended with a ``get_`` to differentiate from an objects properties.
When a variable refers to a file it should be named as follows:
- filename: The files name and extension only.
- filepath: The entire path to the file including the filename.
- path: A path to a directory.
Flash messages should end with a period as applicable for the language.
Only exception is when the tail of the message contains an exceptions message as passed directly from the exception object.
App anatomy
~~~~~~~~~~~
- __init__.py
- Generic initialization code (should be empty if possible)
- api.py
- File to hold functions that are meant to be used by external apps.
- Interfaces meant to be used by other apps that are not models or classes.
- classes.py
- Hold python classes to be used internally or externally.
- Any class defined by the app that is not a model.
- diagnostics.py
- Define functions that will return the state of the data of an app.
- Does not fixes the problems only finds them.
- events.py
- Define history type events
- exceptions.py
- Exceptions defined by the app
- icons.py
- Defines the icons to be used by the links and views of the app.
- Imports from the icons app only.
- links.py
- Defines the links to be used by the app.
- Import only from the navigation app and the local icons.py file.
- literals.py
- Stores magic numbers, module choices (if static), settings defaults, and constants.
- Should contain all capital case variables.
- Must not import from any other module.
- maintenance.py
- Hold functions that the user may run periodically to fix errors in the apps data.
- permissions.py
- Defines the permissions to be used by links and views to validate access.
- Imports only from permissions app.
- Link or view conditions such as testing for staff or super admin status are defined in the same file.
- statistics.py
- Provides functions that will computer any sort of statistical information on the apps data.
- tasks.py
- Code to be execute as in the background or a as an process-of-process action.
- utils.py
- Hold utilitarian code that doesn't fit on any other app file or that is used by several files in the app.
- Anything used internally by the app that is not a class or a literal (should be as little as possible)
Views behavior
~~~~~~~~~~~~~~
- Delete views:
- Redirect to object list view if one object is deleted.
- Redirect to previous view if many are deleted.
- Previous view equals:
- previous variable in POST or
- previous variable in GET or
- request.META.HTTP_REFERER or
- object list view or
- 'home' view
- fallback to /
- if previous equal same view then previous should equal object list view or /
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 **GitHub** using::
@@ -36,11 +279,13 @@ Git branch structure
Current production release (|version|).
``feature/``
Unfinished/unmerged feature.
``series/``
Released versions.
Each release is tagged and available for download on the Downloads_ section of the **Mayan EDMS** repository on GitHub_
Each release is tagged and available for download on the Downloads_ section of the **Mayan EDMS** repository on GitHub_.
When submitting patches, please place your feature/change in its own branch prior to opening a pull request on GitHub_.
When submitting patches, please place your code in its own ``feature/`` branch prior to opening a pull request on GitHub_.
.. _Git: http://git-scm.org
.. _`Successful Git Branching Model`: http://nvie.com/posts/a-successful-git-branching-model/
@@ -48,10 +293,64 @@ When submitting patches, please place your feature/change in its own branch prio
.. _Downloads: https://github.com/mayan-edms/mayan-edms/archives/master
Steps to deploy a development version
-------------------------------------
.. code-block:: bash
$ git clone https://github.com/mayan-edms/mayan-edms.git
$ cd mayan-edms
$ git checkout development
$ virtualenv venv
$ source venv/bin/activate
$ pip install -r requirements.txt
$ ./manage.py initialsetup
$ ./manage.py runserver
Setting up a development version using Vagrant
----------------------------------------------
Make sure you have Vagrant and a provider properly installed as per https://docs.vagrantup.com/v2/installation/index.html
Start and provision a machine using:
.. code-block:: bash
$ vagrant up
To launch a standalone development server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-32:~$ cd ~/mayan-edms/
vagrant@vagrant-ubuntu-trusty-32:~$ source venv/bin/activate
vagrant@vagrant-ubuntu-trusty-32:~$ ./manage.py runserver 0.0.0.0:8000
To launch a development server with a celery worker and Redis as broker
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-32:~$ cd ~/mayan-edms/
vagrant@vagrant-ubuntu-trusty-32:~$ source venv/bin/activate
vagrant@vagrant-ubuntu-trusty-32:~$ ./manage.py runserver 0.0.0.0:8000 --settings=mayan.settings.celery_redis
Then on a separate console launch a celery worker from the same provisioned Vagrant machine:
.. code-block:: bash
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-32:~$ cd ~/mayan-edms/
vagrant@vagrant-ubuntu-trusty-32:~$ source venv/bin/activate
vagrant@vagrant-ubuntu-trusty-32:~$ DJANGO_SETTINGS_MODULE='mayan.settings.celery_redis' celery -A mayan worker -l DEBUG -Q checkouts,mailing,uploads,converter,ocr,tools,indexing,metadata -Ofair -B
Contributing changes
--------------------
Once your have create and committed some new code or feature, submit a Pull Request.
Be sure to merge with mayan-edms/master before doing a pull request so that patches
Once your have created and committed some new code or feature, submit a Pull Request.
Be sure to merge with mayan-edms/development before doing a pull request so that patches
apply as cleanly as possible. If there are no conflicts, Pull Requests can be merged
directly from Github otherwise a manual command line merge has to be done and
your patches might take longer to get merged.
@@ -94,6 +393,11 @@ lines to your ``settings_local.py`` file::
'propagate': True,
'level':'DEBUG',
},
'common': {
'handlers':['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
@@ -109,3 +413,81 @@ Likewise, to see the debug output of the ``tags`` app, just add the following in
.. _`logging capabilities`: https://docs.djangoproject.com/en/dev/topics/logging
Documentation
-------------
**Mayan EDMS**'s documentation is written in `reStructured Text`_ format.
The documentation lives in the ``docs`` directory. In order to build it, you will first need to install Sphinx_. ::
$ pip install sphinx
Then, to build an HTML version of the documentation, simply run the following from the **docs** directory::
$ make html
Your ``docs/_build/html`` directory will then contain an HTML version of the documentation, ready for publication on most web servers.
You can also generate the documentation in formats other than HTML.
.. _`reStructured Text`: http://docutils.sourceforge.net/rst.html
.. _Sphinx: http://sphinx.pocoo.org
Translations
------------
Translations are handled online via the **Transifex** website: https://www.transifex.com/projects/p/mayan-edms/.
To create a translation team for a new language or contribute to an already
existing language translation, create a **Transifex** account and contact
the team coordinator of the respective language in which you are interested.
Installable package
-------------------
Source file package
~~~~~~~~~~~~~~~~~~~
This is the sequence of step I use to produce an installable package:
1. Make sure there are no lingering packages from previous attempts::
$ rm dist -R
2. Generate the packaged version (will produce dist/mayan-edms-1.1.0.tar.gz)::
$ python setup.py sdist
3. Do a test install::
$ cd /tmp
$ virtualenv venv
$ source venv/bin/activate
$ pip install <path of the Git repository>/dist/mayan-edms-1.1.0.tar.gz
$ mayan-edms.py initialsetup
$ mayan-edms.py runserver
Wheel package
~~~~~~~~~~~~~
1. Install wheel::
$ pip install wheel
2. Create wheel package using the source file package (Until issue #99 of wheel is fixed: https://bitbucket.org/pypa/wheel/issue/99/cannot-exclude-directory)::
$ pip wheel --no-index --no-deps --wheel-dir dist dist/mayan-edms-1.1.0.tar.gz
3. Do a test install::
$ cd /tmp
$ virtualenv venv
$ source venv/bin/activate
$ pip install <path of the Git repository>/dist/mayan_edms-1.1.0-py2-none-any.whl
$ mayan-edms.py initialsetup
$ mayan-edms.py runserver

View File

@@ -1,41 +0,0 @@
======================
Document visualization
======================
The philosophy in place is to try to avoid having users download a documents and leave
**Mayan EDMS** to be able to see them, so in essence making **Mayan EDMS** a
visualization tool too. The conversion backend is a stack of functions,
first the mimetype is evaluated, if it is an office document it is passed
to LibreOffice_ working in headless mode (and managed by supervisor_)
for conversion to PDF_. The PDF_ is stored in a temporary
cache along side all the other files that were not office documents,
from here they are inspected to determine the page count and the
corresponding blank database entires are created. After the database
update they all go to the conversion driver specified by the configuration
option :setting:`CONVERTER_GRAPHICS_BACKEND` and a high resolution
master preview of each file is generated and stored in the persistent
cache. From the master previews in the persistent cache, volatile
previews are then created on demand for the different sizes requested
(thumbnail, page preview, full preview) and rotated interactively
in the details view.
Office document conversion however won't always work as expected because
LibreOffice_ do not provide proper API's, so subprocess calling,
temporary files and other black magic needs to be invoked to get it
properly integrated. **Mayan EDMS** treats documents as collections of pages
or frames, and text extraction and OCR is done per page not per document,
thats why even text documents need to be rendered by LibreOffice_
before they can be previewed and text can be extracted.
Version 0.12.1 introduced a new method of converting office documents, this
new method doesn't require the use of the command line utility ``UNOCONV``.
This new method proved to continue working better than previous solution
and the use of ``UNOCONV`` have been removed. Existing conversion method
uses just one configuration option: :setting:`CONVERTER_LIBREOFFICE_PATH`
which defaults to '/usr/bin/libreoffice'.
.. _PDF: http://en.wikipedia.org/wiki/Portable_Document_Format
.. _LibreOffice: http://www.libreoffice.org/
.. _supervisor: http://supervisord.org/introduction.html

View File

@@ -1,21 +0,0 @@
=============
Documentation
=============
**Mayan EDMS**'s documentation is written in `reStructured Text`_ format.
The documentation lives in the ``docs`` directory. In order to build it, you will first need to install Sphinx_. ::
$ pip install sphinx
Then, to build an HTML version of the documentation, simply run the following from the **docs** directory::
$ make html
Your ``docs/_build/html`` directory will then contain an HTML version of the documentation, ready for publication on most web servers.
You can also generate the documentation in formats other than HTML.
.. _`reStructured Text`: http://docutils.sourceforge.net/rst.html
.. _Sphinx: http://sphinx.pocoo.org

View File

@@ -4,15 +4,12 @@ FAQ
Frequently asked questions and solutions
Database related
----------------
**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
would be that MySQL doesn't support transactions for schema modifying
commands. The only moment this could cause problems is when running
commands. The only moment this could cause problems is when running
South migrations during upgrades, if a migration fails the database
structure is left in a transitory state and has to be reverted manually
before trying again.
@@ -22,7 +19,7 @@ before trying again.
* Solution::
$ manage.py shell
$ mayan-edms.py shell
>>> from django.db import connection
>>> cursor = connection.cursor()
@@ -49,8 +46,12 @@ When using ``MySQL`` and doing OCR on languages other than English
- Ref: 2- http://markmail.org/message/bqajx2utvmtriixi
Document sharing
----------------
**Q: Error "django.db.utils.IntegrityError IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`...`.`...`, CONSTRAINT `..._refs_id_b0252274` FOREIGN KEY (`...`) REFERENCES `...` (`...`))')**
* Solution:
- Convert all MySQL tables to the same type, either all MyISAM or InnoDB
**Q: File system links not showing when serving content with ``Samba``**
@@ -75,9 +76,6 @@ Document sharing
- Ref: 1- http://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html
Document handling
-----------------
**Q: How do you upload a new version of an existing file?**
* Solution:
@@ -90,9 +88,6 @@ Document handling
Deployments
-----------
**Q: Is virtualenv required as specified in the documentation?**
* It is not necessary, it's just a strong recommendation mainly to reduce
@@ -110,7 +105,7 @@ Django's development server doesn't serve static files unless the ``DEBUG``
option is set to ``True``, this mode of operation should only be used for
development or testing. For production deployments the management command::
$ ./manage.py collectstatic
$ mayan-edms.py collectstatic
should be used and the resulting ``static`` folder served from a webserver.
For more information, read https://docs.djangoproject.com/en/dev/howto/static-files/
@@ -118,9 +113,6 @@ and https://docs.djangoproject.com/en/1.2/howto/static-files/ or
http://mayan-edms-ru.blogspot.com/2011/11/blog-post_09.html
Other
-----
**Q: Can you change the display order of documents...i.e can they be in alphabetical order?**
A the moment no, but it is something being considered.

View File

@@ -14,37 +14,29 @@ Features
* Collaboration tools.
* Discuss documents, comment on new version of a document.
* Discuss documents, or comment on new versions of a document.
* Office document format support.
* Word processing files, spreadsheets, presentations are common supported formats.
* **Mayan EDMS** can detect the presence of Libre Office and use it to support word processing files, spreadsheets and presentations.
* User defined metadata fields and meta data sets.
* User defined metadata fields.
* Several metadata fields can be matched to a document type as per technical, legal or structural requirements such as the `Dublin core`_.
* Metadata fields can be grouped into sets per technical, legal or structural requirements such as the `Dublin core`_.
* Dynamic default values for metadata.
* Metadata fields can have an initial value, which can be static or determined by an user provided Python code snippet.
* Filesystem integration.
* If enabled, the document database index can be mirrored in the filesystem of the host and shared via Samba_ or any other sharing method to client computers on a network.
* User defined document unique identifier and checksum algorithms.
* Users can alter the default method used to uniquely indentify documents.
* Metadata fields can have an initial value, which can be static or determined by an user provided Python code snippet.
* Documents can be uploaded from different sources.
* Local file or server side file uploads.
* Local file or server side file uploads, multifunctional copier, or even via email.
* Batch upload many documents with the same metadata.
* Clone a document's metadata for speedier uploads and eliminate repetitive data entry.
* Previews for a great deal of image formats, including PDF.
* Previews for a great deal of image formats.
* **Mayan EDMS** provides different file conversion backends with different levels of functionality and requirements to adapt to different deployment environments.
@@ -53,7 +45,7 @@ Features
* Documents can be searched by their text content, their metadata or any other file attribute such as name, extension, etc.
* Configurable document grouping.
* Automatic linking of documents based on metadata values or document properties.
* :doc:`Roles support <../topics/permissions>`.
@@ -68,37 +60,32 @@ Features
* Multiple page PDFs and TIFFs files are supported.
* :doc:`Distributed OCR processing <../topics/ocr>`.
* Automatic OCR processing.
* The task of transcribing text from documents via OCR can be distributed among several physical or virtual computers to decrease load and increase availability.
* Multilingual user interface (English, Spanish, Portuguese, Russian, Polish).
* Multilingual user interface.
* **Mayan EDMS** is written using the Django_ framework, which natively supports Unicode. Together with the use of text templates **Mayan EDMS** can be translated to practically any language spoken in the world.
* **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 Transifex_.
* :doc:`Multilingual OCR support <../topics/ocr>`.
* Multilingual OCR support.
* Multilingual OCR is provided as supported by the available language backends of the OCR engine tesseract.
* Current language of the document is passed to the corresponding OCR engine to increase the rate of data vs. recognition errors.
* Search of duplicates.
* :doc:`Plugable storage backends <../topics/file_storage>`.
* Duplicate documents can easily be searched.
* :doc:`Plugable storage backends <../topics/file_storage>` (File based and GridFS included).
* Very easy to use 3rd party plugins such as the ones available for Amazon EC2.
* Color coded tagging.
* Labeled and color coded tags can be assigned for intuitive recognition.
* Staging folders to receive scanned documents directly from network attached scanners.
* Workflows.
* Preview scanned files even before uploading them.
* Keep track of the state a document, along with the log of the previous state changes.
.. _`Dublin core`: http://dublincore.org/metadata-basics/
.. _Samba: http://www.samba.org/
.. _Django: https://www.djangoproject.com/
.. _Transifex: https://www.transifex.com/projects/p/mayan-edms/

View File

@@ -3,24 +3,15 @@ File storage
============
The files are stored and placed under **Mayan EDMS** "control" to avoid
filename clashes (each file gets renamed to its UUID and with an extension)
and stored in a simple flat arrangement in a directory. This doesn't
filename clashes (each file gets renamed to its UUID and without extension)
and stored in a simple flat arrangement in a directory. This doesn't
stop access to the files but it is not recommended because moving,
renaming or updating the files directly would throw the database out
of sync. For direct access to the files the recommended way is to create an
:doc:`index <indexes>`, use the indexing mirroring feature and share the result via
file serving software [#f1]_.
of sync.
**Mayan EDMS** components are as decoupled from each other as possible,
storage in this case is very decoupled and its behavior is controlled
not by the project but by the Storage progamming class. Why this design?
not by the project but by the Storage progamming class. Why this design?
All the other parts don't make any assumptions about the actual file
storage, so that **Mayan EDMS** can work saving files locally, over the
network or even across the internet and still operate exactly the same.
The file storage behavior is controlled by the :setting:`DOCUMENTS_STORAGE_BACKEND`
and should be set to a class or subclass of Django's ``django.core.files.storage.Storage`` class.
.. rubric:: Footnotes
.. [#f1] http://en.wikipedia.org/wiki/File_server
storage, files can be saved locally, over the network or even across the
internet and everything will still operate exactly the same.

View File

@@ -0,0 +1,85 @@
===============
Getting started
===============
Before starting to use **Mayan EDMS**, two things need to be configured:
- At least one document source
- At least one document type
Document sources
----------------
Document sources define from where documents will be uploaded or gathered.
To add a document source go to the ``Setup`` section, then to the ``Sources`` section.
To obtain the fastest working setup, create a new source of type ``Web form``.
``Web forms`` are just HTML forms with a ``Browse`` button that will open the file upload
dialog when clicked. Name it something simple like ``Local documents`` and select whether or not
compressed files uploaded from this source will be automatically decompressed and
their content treated as individual documents.
Document types
--------------
Examples of document types are: ``Legal documents``, ``Internal documents``, ``Medical records``, ``Designing specifications``, ``Permits``.
A document type represent a class of documents which share some common property.
A good indicator that can help you determine your document types is what kind of
information or ``metadata`` is attached to those documents.
Once a document source and a document type have been created you have all the minimal
elements required to start uploading documents.
Defining metadata
-----------------
With your document types defined it should be much easier now to define the required
``metadata`` for each of these document types. When creating ``metadata`` types,
the first thing that will be needed is the internal name with which this metadata
type will be referenced in other areas of **Mayan EDMS**. The internal name must not
contain spaces or uppercase characters. After the internal name, enter the name that
will be visible to you and your users, which usually will be similar or the same as the
internal name, but with proper capitalization and spacing. The ``metadata types``
can have default values to speed up data entry. They can be single number or a
words enclosed in quotes, ie::
"Building A"
or::
"Storage room 1"
Default values can also be defined as ``Python`` statements or functions such as::
current_date()
If you want to restrict or standardize the values for a metadata type, use the ``Lookup`` field to
define the list of options that are allowed. Define the lookup list using a ``Python``
list of quoted values, for example::
["2000", "2001", "2002", "2003", "2004"].
Instead of a free entry text field, your users will get a dropdown list of years,
this will ensure an unified data entry formatting. You can also use a
``Python`` expression to generate the lookup list.
Metadata types can be assigned in two ways to a document type, by making it an
optional or a required metadata type for a specific document. This method
allows metadata very important for some types of documents (like Invoice
numbers to Invoices) to be required for an Invoice to be able to be uploaded.
Accordingly optional metadata types will be presented, but users are not required to
enter a value to be able to upload a document.
Indexes
-------
After defining all your metadata types you can also define indexes to
let **Mayan EDMS** automatically categorize your documents based on their metadata values.
To create an index to organize invoices by a year metadata field do the following:
- Create a year metadata type with the name ``year`` and the label ``Year``.
- Create an invoice document type and assign it the ``year`` metadata type as a required metadata type.
- Create a new index, give it the name ``invoices_per_year`` and the label ``Invoices per year``.
- Edit the index's ``Tree template``, add a ``New child node``, and enter ``document.metadata_value_of.year`` as the ``Indexing expression``, check the ``Link documents`` checkbox and save.
- Link this new index to the invoice document type using the ``Document types`` button of the index.
Now every time a new invoice upload or an existing invoice's ``year`` metadata value is changed, a new folder will be created in the ``Invoices`` index with the corresponding invoices for that year.

View File

@@ -6,19 +6,18 @@ Introductions to all the key parts of Mayan EDMS you'll need to know:
.. toctree::
:maxdepth: 1
contributors
development
faq
features
file_storage
initial_import
permissions
transformations
document_visualization
versioning
signatures
getting_started
indexes
installation
license
permissions
signatures
smart_links
tags
ocr
settings
customization
development
documentation
translations
transformations
versioning

View File

@@ -1,11 +1,8 @@
=======
Indexes
=======
To configure: |Setup tab| |Right arrow| |Indexes button| |Right arrow| |Tree template link|
To use: |Index tab|
Indexes are an automatic method to hierarchically organize documents in relation to their metadata and to each other.
Indexes are an automatic method to hierarchically organize documents in relation to their properties.
Index templates
===============
@@ -14,10 +11,7 @@ Since multiple indexes can be defined, the first step is to create an empty inde
Administrators then define the tree template showing how the index will be structured.
Each branch can be a pseudo folder, which can hold other child 'folders' or
a document container which will have all the links to the documents that
matched the path to reach the document container.
.. image:: ../_static/index_template.png
:alt: index template
matched the criteria of the document container.
Index instances
===============
@@ -26,57 +20,3 @@ The template is the skeleton from which an instance of the index is then
auto-populated with links to the documents depending on the rules of each
branch of the index evaluated against the metadata and properties of the documents.
.. image:: ../_static/index_instance.png
:alt: index instance
Index serving
=============
Indexes can be mirrored to the operating system filesystem
using the configuration option
:setting:`DOCUMENT_INDEXING_FILESYSTEM_SERVING`.
``settings_local.py``::
# Supposing the 'Sample index' internal name is 'sample_index'
DOCUMENT_INDEXING_FILESYSTEM_SERVING = {
'sample_index': '/var/local/document/sharing/invoices/',
}
This creates an actual directory tree and links to the actual stored files but using
the filename of the documents as stored in the database.
.. image:: ../_static/indexes.png
:alt: indexes diagram
This filesystem mirror of the index can them be served with Samba_ across the
network. This access would be read-only, with new versions of the files
being uploaded from the web GUI using the document versioning support.
The index cannot be edited manually to protect it's integrity, only changing
the rules or the metadata of the documents would cause the index to be
regenerated. For manual organization of documents there are the folders,
their structure is however flat, and they have to be manually updated and
curated.
.. _Samba: http://www.samba.org/
.. |Setup tab| image:: /_static/setup_tab.png
:alt: Setup tab
:align: middle
.. |Right arrow| image:: /_static/arrow_right.png
:alt: Right arrow
:align: middle
.. |Indexes button| image:: /_static/indexes_button.png
:alt: Indexes button
:align: middle
.. |Tree template link| image:: /_static/tree_template_link.png
:alt: Tree template link
:align: middle
.. |Index tab| image:: /_static/index_tab.png
:alt: Index tab
:align: middle

View File

@@ -1,48 +0,0 @@
====================
Initial data loading
====================
Bulk document import
--------------------
**Mayan EDMS** has the ability to individually upload the contents of compressed
files, however by nature of being a web based application it is bounded by the
limitations of the HTTP protocol. This imposes a limit on the file size and
the amount of time **Mayan EDMS** may keep a connection open while it processes
compressed files. When the desired amount of documents is bigger than what
these limitations allow, **Mayan EDMS** provides a command line tool for out of
process document importation.
The command line options for this feature are as follows::
$ ./manage.py bulk_upload --noinput --metadata '{"project": "bulk"}' --document_type "Accounting documents" compressed.zip
**Optional arguments**
* The ``--noinput`` argument skips confirmation and starts the upload immediately.
* The ``--metadata`` argument allows specifing what metadata will be assigned
to the documents when uploaded.
* And the ``--document_type`` applies a previously defined
document type to the uploaded documents.
Bulk user import
----------------
As well as providing bulk document import functionality **Mayan EDMS** also
includes a management command to import a large number of users
from a CSV file. The command line options for this feature are as
follow::
$ ./manage.py import_users --noinput --password=welcome123 --skip-repeated user_list.csv
The CSV field order must be: username, first name, last name and email, any columns after
those are ignored.
**Optional arguments**
* The ``--noinput`` argument skips confirmation and starts the import immediately.
* The ``--password`` argument allows specifing what default password will be assigned
to all the new users that are imported.
* The ``--skip-repeated`` tells the importer to not stop when finding
that a user already exists in the database.

View File

@@ -2,18 +2,20 @@
Installation
============
Ubuntu, Debian or Fedora server
-------------------------------
**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
required to understand why **Mayan EDMS** does some of the things it does the way
it does them.
Before installing **Mayan EDMS**, the binary requirements must be installed first.
Ubuntu
------
If using a Debian_ or Ubuntu_ based Linux distribution getting the executable requirements is as easy as::
$ sudo apt-get install python-dev gcc tesseract-ocr unpaper python-virtualenv ghostscript libjpeg-dev libpng-dev poppler-utils -y
If using a Fedora_ based Linux distribution get the executable requirements using Yum::
$ sudo yum install -y git gcc tesseract unpaper python-virtualenv ghostscript libjpeg-turbo-devel libpng-devel poppler-util python-devel
$ 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
Initialize a ``virtualenv`` to deploy the project:
@@ -69,7 +71,7 @@ to /usr/bin/ with ...
sudo ln -s /opt/local/bin/tesseract /usr/bin/tesseract && \
sudo ln -s /opt/local/bin/identify /usr/bin/identify && \
sudo ln -s /opt/local/bin/gs /usr/bin/gs
... alternatively set the paths in the ``settings/locals.py``
.. code-block:: python
@@ -104,7 +106,7 @@ to /usr/bin/ with ...
sudo ln -s /usr/local/bin/unpaper /usr/bin/unpaper && \
sudo ln -s /usr/local/bin/pdftotext /usr/bin/pdftotext && \
sudo ln -s /usr/local/bin/gs /usr/bin/gs && \
... alternatively set the paths in the ``settings/locals.py``
.. code-block:: python
@@ -122,25 +124,24 @@ Production use
To create a custom settings file for **Mayan EDMS**, create a Python (.py) file
in the directory: venv/lib/python2.7/site-packages/mayan/settings/ with the following basic content::
# my_settings.py
# venv/lib/python2.7/site-packages/mayan/settings/my_settings.py
from __future__ import absolute_import
from __future__ import unicode_literals
from .local import *
from . import *
<Your customized settings>
To test your settings launch **Mayan EDMS** using::
$ mayan-edms runserver --settings=mayan.settings.my_settings
$ mayan-edms.py runserver --settings=mayan.settings.my_settings
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 deployment instructions and examples, checkout Django's official documentation
on the topic https://docs.djangoproject.com/en/1.6/howto/deployment/
Other database managers
-----------------------
@@ -149,16 +150,10 @@ corresponding python database drivers and add the corresponding database setting
to your settings file (see above) as shown here: https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-DATABASES
.. _`vendor lock-in`: https://secure.wikimedia.org/wikipedia/en/wiki/Vendor_lock-in
.. _Python: http://www.python.org/
.. _Django: http://www.djangoproject.com/
.. _OCR: https://secure.wikimedia.org/wikipedia/en/wiki/Optical_character_recognition
.. _`Open source`: https://secure.wikimedia.org/wikipedia/en/wiki/Open_source
.. _Django: http://www.djangoproject.com/
.. _Apache: https://www.apache.org/
.. _Debian: http://www.debian.org/
.. _Ubuntu: http://www.ubuntu.com/
.. _Django: http://www.djangoproject.com/
.. _Download: https://github.com/mayan-edms/mayan-edms/archives/master
.. _virtualenv: http://www.virtualenv.org/en/latest/index.html
.. _Fedora: http://fedoraproject.org/
.. _Python: http://www.python.org/
.. _SQLite: https://www.sqlite.org/
.. _Ubuntu: http://www.ubuntu.com/
.. _virtualenv: http://www.virtualenv.org/en/latest/index.html

View File

@@ -1,34 +0,0 @@
===
OCR
===
To use: |Tools tab| |Right arrow| |OCR button|
Because OCR is an intensive operation, documents are queued for OCR for
later handling, the amount of documents processed in parallel is
controlled by the :setting:`OCR_NODE_CONCURRENT_EXECUTION` configuration
option. Ideally the machine serving **Mayan EDMS** should disable OCR
processing by settings this options to 0, with other machines or cloud
instances then connected to the same database doing the OCR processing.
The document is checked to see if there are text parsers available, is
no parser is available for that file type then the document is passed
to Tesseract_ page by page and the results stored per page, this is to
keep the page image in sync with the transcribed text. However when
viewing the document in the details tab all the pages text are
concatenated and shown to the user. All newly uploaded documents will be
queued automatically for OCR, if this is not desired setting the :setting:`OCR_AUTOMATIC_OCR`
option to ``False`` would stop this behavior.
.. _Tesseract: http://code.google.com/p/tesseract-ocr/
.. |Tools tab| image:: /_static/tools_tab.png
:alt: Tags tab
:align: middle
.. |Right arrow| image:: /_static/arrow_right.png
:alt: Right arrow
:align: middle
.. |OCR button| image:: /_static/ocr_button.png
:alt: OCR button
:align: middle

View File

@@ -2,64 +2,46 @@
Permissions
===========
**Mayan EDMS** provides very exact control over what activies users can
perform. This control is divided into two levels of operation:
**Mayan EDMS** provides finegrained control over which activities users can
perform. This control is divided into two levels of operation:
2 tier permissions assignement
==============================
This level of activity control works
by allowing roles that are composed of users and group, to be granted
a permission such that the holder of that permission can exercise it
throught the entire collection of objects (document, folders, tags, etc),
this method could be thought out as a global permission granting level.
Example: Roles being granted the ``Document view`` permission will be able to view
**all** documents in existance.
.. image:: ../_static/permissions.png
:alt: 2-tier permission diagram
This level of activity control works by allowing roles that are composed
of users or groups, to be granted a permission such that the holder of that
permission can exercise it throughout the entire collection of objects
(document, folders, tags, etc). This method could be thought out as a global
permission.
3 tier access control
=====================
When more control is desired over which objects
actors(user, groups and roles) can exercise an action this method should be
used. Under this level, actors are granted a
permission but only in relation to a selected object. Example: Granting user
``Joe`` the ``Document view`` access control for document ``Payroll``,
would allow him to view this document only.
When more control is desired over which objects actors
(user, groups and roles) can exercise an action, this method should be
used. Under this method, actors are granted a permission but only in relation
to a selected object. Example: Granting user
``Joe`` the ``Document view`` access control for document ``Payroll``, would
allow him to view this document only.
.. image:: ../_static/ACL.png
:alt: 3-tier access control diagram
The permission system enforces inheritance by first checking if the user
The permission system enforces inheritance by first checking, if the user
has a global permission, is a member of a group or a role that has a global
permission and if not then checks to see if that user, a group or role to
permission and if not, then checks to see if that user, a group or role to
which he belongs, has been granted access to the specific object to which
he is desiring to perform a given action that requires a permission.
Only when these checks fails the user
is forbidden to perform the action and a generic message indicating this is
displayed to avoid providing any information that could be used to sidetrack
the permission system or obtain any kind of information about the object
from which the user was not allowed access.
he is desiring to perform a given action.
Only when these checks fail the user is forbidden to perform the action and
a generic message is displayed to avoid providing any information
that could be used to sidetrack the permission system or obtain any kind of
information about the object to which the user was not allowed access.
Default Access Control Lists (Default ACLs)
-------------------------------------------
One of the specifics of the 3 tier access control in contrast with the 2 tier access control are so called Default Access Control Lists.They allow assigment to Users an access to a particular object - the class or instance of the class. The document ``Payroll`` is example of instance of class ``Documents``. A user can be granted with access to only one instance of the class ``Documents`` or to the whole class ``Documents``. And not only that but Default ACLs give the possibility to grant access to class before it is instantiated. It will be explained with the following example.
Default Access Control Lists allow assigment of an access control list to a
type of object (Document, Tags, Folders) before it is created. It is the default
permissions an object will have when it is created. With Default Access Control Lists
specific permissions can be granted to the creator of a document for example.
**Example 1.** Each user have to access only the documents that he uploads
The example will show how to restrict a user in order not to view documents uploaded by other users, but only by himself. For that purpose we have to restrict the access to something that does not exist yet. The system must know that before the actual upload in order to act accordingly. This is where Default ACLs come in place.
Follow the steps:
1. Enter **Mayan EDMS** with user that has administrative rights.
2. Go to Setup menu. Enter Default ACLs submenu.
3. Click ``New holder`` next to the class Documents. From the list of users choose the special user Creator. Give the permission ``View Documents`` to the Creator.
4. Go back to Setup menu. Go to Users and create the users ``Pedro`` and ``Sancho``.
5. Go back to Setup menu. Go to Groups and create the group ``Employees``. Click to members of the groups and add ``Pedro`` and ``Sancho`` to that group.
6. Go back to Setup menu. Go to Roles submenu. Create the role ``Uploaders``. Give the permission ``Create documents`` to the role. Add the group ``Employees`` as a member to that role.
7. Now enter **Mayan EDMS** with ``Pedro`` and ``Sancho`` one after another and upload documents. Pedro should not see the documents that ``Sancho`` uploaded and vice versa. He should see only documents uploaded by himself.
The above example will work only for documents that are uploaded after the activation of the restriction. It will not work for documents prior to the activation of the restriction.
Changes to the Default Access Control Lists (Default ACLs) only affect objects
created after the change, they will not affect documents previously uploaded.

File diff suppressed because it is too large Load Diff

View File

@@ -2,31 +2,23 @@
Document signatures
===================
**Mayan EDMS** supports two types of document signatures, these are 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. If the public key corresponding to the signee of the
document is not found, **Mayan EDMS** will try to obtain it from the list of
keyserver specified in the config option :setting:`SIGNATURES_KEYSERVERS`.
Failing that, **Mayan EDMS** will indicate that the document is signed
but that it has no way to verify such signature.
Existing non signed documents can be signed in one of two way:
by downloading the document, signing it, and uploading the signed document
as a new version of the existing one using **Mayan EDMS** :doc:`versioning support <versioning>`
or by creating a detached signature for the non signed document and uploading
such detached signature file using the option likewise named menu option.
**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
signatures sections of a document.
Maintenance of the public keyring can be done using the ``Key management``
functionality in the ``Setup menu``
Existing non signed documents can be signed in one of two ways:
by downloading the document, signing it, and uploading the signed document
as a new version of the existing one or by creating a detached signature for
the non signed document and uploading such detached signature file.
From this menu, key servers can be queried
and the results imported. Public keys no longer needed can also be deleted
from this menu.
Maintenance of the public keyring can be done using the ``Key management``
functionality in the ``Setup menu``.
Only `GNU Privacy Guard`_ signatures are support at the moment. In case
your installation of GnuPG is non-standard, you can use the :setting:`SIGNATURES_GPG_HOME`
configuration option to let **Mayan EDMS** find your GPG instance's home directory, used to
store keyrings and other GPG configuration files.
From this menu, key servers can be queried and the results imported. Public
keys no longer needed can also be deleted from this menu.
Only `GNU Privacy Guard`_ signatures are support at the moment.
.. _`GNU Privacy Guard`: www.gnupg.org/

View File

@@ -2,41 +2,13 @@
Smart links
===========
To configure: |Setup tab| |Right arrow| |Smart links button|
To use: |Document icon| |Right arrow| |Smart links link|
Smart links are usefull for navigation between documents. They are rule
based but don't created any organizational structure just show the documents
Smart links are usefull for navigation between documents. They are rule
based, but don't create any organizational structure. They just show the documents
that match the rules as evaluated against the metadata of the currently
displayed document. They are global, the smart links are dependant
on the current document the user is viewing.
.. figure:: /_static/screenshots/smart_links_screenshot.png
:alt: Smart links screenshot
:scale: 75%
Screenshot of smart links in action. The documents being shown are from the same
permit file number as the current document being viewed by the user.
Notice how the current document is also highlighted with a black border.
.. |Setup tab| image:: /_static/setup_tab.png
:alt: Setup tab
:align: middle
.. |Right arrow| image:: /_static/arrow_right.png
:alt: Right arrow
:align: middle
.. |Smart links button| image:: /_static/smart_links_button.png
:alt: Smart links button
:align: middle
.. |Document icon| image:: /_static/page.png
:alt: Document icon
:align: middle
.. |Smart links link| image:: /_static/smart_links_link.png
:alt: Smart links link
:align: middle
displayed document.
Smart links are usefull when a patient file in a patients index needs to be linked
to the medical documentation of a prescription the patient is using, but that medical
documentation is in it's own prescription index. Smart links can provide a reference
between documents of different indexes without any change in the indexes' structures.

View File

@@ -2,35 +2,8 @@
Tags
====
To configure and use: |Tags tab|
To use: |Document icon| |Right arrow| |tags link|
Tags allow giving documents a toggable property. Documents can also be tagged
with more than one tag. Once tagged, documents can be search also by their tags
Tags allow giving documents a toggable property. Documents can also be tagged
with more than one tag. Once tagged, documents can be searched also by their tags
and from the tags main menu a list of all the documents with a particular tag
can be obtained easily. Aside from their texts, tags can be assigned a particular
can be obtained easily. Aside from their texts, tags can be assigned a particular
color.
.. figure:: /_static/screenshots/tags_screenshot.png
:alt: Tags links screenshot
:scale: 35%
Screenshot of showing how tags can also be used to represent the state of a
document, in this case the review state of a permit.
.. |Tags tab| image:: /_static/tags_tab.png
:alt: Tags tab
:align: middle
.. |Right arrow| image:: /_static/arrow_right.png
:alt: Right arrow
:align: middle
.. |Tags link| image:: /_static/tags_link.png
:alt: Tags link
:align: middle
.. |Document icon| image:: /_static/page.png
:alt: Document icon
:align: middle

View File

@@ -5,8 +5,8 @@ What are transformations?
Transformation are useful to manipulate the preview of the stored documents
in a persistent manner, for example some scanning equipment only produce
landscape PDFs, in this case a default transformation for that document
source would be "rotation: 270 degress", this way whenever a document is
source would be "rotation: 270 degress". This way whenever a document is
uploaded from that scanner it appears in portrait orientation.
The transformation remains attached to the document, this way the file
is preserved in it's original state (a requirement in legal environments)
but only the representation is transformed to make it look right to the user.
The transformation remains attached to the document, the file being
preserved in it's original state (a requirement in legal environments) and
only the representation being transformed.

View File

@@ -1,8 +0,0 @@
============
Translations
============
Translations are now being handled online via the **Transifex** website: https://www.transifex.com/projects/p/mayan-edms/.
To create a translation team for a new language or contribute to an already
existing language translation, create a **Transifex** account and contact
the team coordinator of the respective language in which you are interested.

View File

@@ -3,23 +3,12 @@ Document versioning
===================
**Mayan EDMS** has the ability to store different versions of the same
document. Users are provided with a very comprehensive but easy to use
version numbering system that allows specifying a major, minor or micro
version number increase.
.. image:: ../_static/versioning.png
:alt: versioning diagram
A comment field is also provided to allow users
to summarize the new verdion changes in comparison with the previous
one. If a new version was uploded by mistake or such new version is no
longer necessary **Mayan EDMS** provides the option to revert to a previous
version of the document.
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
uploded by mistake or such new version is no longer necessary the option to
revert to a previous version of the document is provided.
To upload a new document version, select an existing document, click on the
version tab of the document, and click on the 'upload new version' on the
side bar. A new view very similar to the new document upload view will
appear show the same interactive document sources that have been defined,
but with new options to specify the new version number and an optional
comment.
side bar. A new view very similar to the new document upload view will
appear, showing the same interactive document sources that have been defined.

View File

@@ -1,6 +1,8 @@
from __future__ import unicode_literals
__title__ = 'Mayan EDMS'
__version__ = '1.0.0'
__build__ = 0x010000
__version__ = '1.1.0'
__build__ = 0x010100
__author__ = 'Roberto Rosario'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2011 Roberto Rosario'

View File

@@ -1,32 +1,30 @@
from __future__ import absolute_import
from __future__ import unicode_literals
from django.dispatch import receiver
from navigation.api import register_links, register_multi_item_links
from project_setup.api import register_setup
from south.signals import post_migrate
from .classes import (AccessHolder, AccessObjectClass, ClassAccessHolder,
AccessObject)
from .links import (acl_detail, acl_grant, acl_revoke, acl_holder_new,
acl_setup_valid_classes, acl_class_list, acl_class_acl_list,
acl_class_acl_detail, acl_class_new_holder_for, acl_class_grant,
acl_class_revoke)
from navigation.api import register_links
from project_setup.api import register_setup
from .classes import (
AccessHolder, AccessObject, AccessObjectClass, ClassAccessHolder
)
from .links import (
acl_class_acl_detail, acl_class_acl_list, acl_class_grant, acl_class_list,
acl_class_new_holder_for, acl_class_revoke, acl_detail, acl_grant,
acl_holder_new, acl_revoke, acl_setup_valid_classes
)
from .models import CreatorSingleton
register_links(AccessHolder, [acl_detail])
register_multi_item_links(['acl_detail'], [acl_grant, acl_revoke])
register_links([AccessObject], [acl_holder_new], menu_name='sidebar')
register_setup(acl_setup_valid_classes)
register_links(['acl_setup_valid_classes', 'acl_class_acl_list', 'acl_class_new_holder_for', 'acl_class_acl_detail', 'acl_class_multiple_grant', 'acl_class_multiple_revoke'], [acl_class_list], menu_name='secondary_menu')
register_links(ClassAccessHolder, [acl_class_acl_detail])
register_links(AccessObjectClass, [acl_class_acl_list, acl_class_new_holder_for])
register_multi_item_links(['acl_class_acl_detail'], [acl_class_grant, acl_class_revoke])
register_links(AccessHolder, [acl_detail])
register_links(['acls:acl_setup_valid_classes', 'acls:acl_class_acl_list', 'acls:acl_class_new_holder_for', 'acls:acl_class_acl_detail', 'acls:acl_class_multiple_grant', 'acls:acl_class_multiple_revoke'], [acl_class_list], menu_name='secondary_menu')
register_links(ClassAccessHolder, [acl_class_acl_detail])
register_links(['acls:acl_detail'], [acl_grant, acl_revoke], menu_name='multi_item_links')
register_links(['acls:acl_class_acl_detail'], [acl_class_grant, acl_class_revoke], menu_name='multi_item_links')
register_setup(acl_setup_valid_classes)
@receiver(post_migrate, dispatch_uid='create_creator_user')

View File

@@ -1,25 +1,16 @@
from __future__ import absolute_import
from __future__ import unicode_literals
from django.contrib import admin
from .models import AccessEntry
# class PermissionHolderInline(admin.StackedInline):
# model = PermissionHolder
# extra = 1
# classes = ('collapse-open',)
# allow_add = True#
#
class AccessEntryAdmin(admin.ModelAdmin):
model = AccessEntry
list_display = ('pk', 'holder_object', 'permission', 'content_object')
list_display_links = ('pk',)
related_lookup_fields = {
'generic': [['holder_type', 'holder_id'], ['content_type', 'object_id']],
}
# inlines = [PermissionHolderInline]
list_display = ('pk', 'holder_object', 'permission', 'content_object')
list_display_links = ('pk',)
model = AccessEntry
admin.site.register(AccessEntry, AccessEntryAdmin)

View File

@@ -1,4 +1,4 @@
from __future__ import absolute_import
from __future__ import unicode_literals
from django.contrib.contenttypes.models import ContentType

View File

@@ -1,4 +1,4 @@
from __future__ import absolute_import
from __future__ import unicode_literals
import logging
import sys
@@ -7,7 +7,6 @@ import types
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist
from django.db.models.base import ModelBase
from django.template.defaultfilters import capfirst
from common.models import AnonymousUserSingleton
@@ -24,7 +23,7 @@ def get_source_object(obj):
class EncapsulatedObject(object):
source_object_name = u'source_object'
source_object_name = 'source_object'
@classmethod
def object_key(cls, app_label=None, model=None, pk=None):
@@ -83,18 +82,14 @@ class EncapsulatedObject(object):
try:
content_type = ContentType.objects.get(app_label=app_label, model=model)
except ContentType.DoesNotExist:
# cls.add_to_class('DoesNotExist', subclass_exception('DoesNotExist', (ObjectDoesNotExist,), cls.__name__))
# raise cls.DoesNotExist("%s matching query does not exist." % ContentType._meta.object_name)
raise ObjectDoesNotExist("%s matching query does not exist." % ContentType._meta.object_name)
raise ObjectDoesNotExist('%s matching query does not exist.' % ContentType._meta.object_name)
else:
source_object_model_class = content_type.model_class()
if pk:
try:
source_object = content_type.get_object_for_this_type(pk=pk)
except source_object_model_class.DoesNotExist:
# cls.add_to_class('DoesNotExist', subclass_exception('DoesNotExist', (ObjectDoesNotExist,), cls.__name__))
# raise cls.DoesNotExist("%s matching query does not exist." % source_object_model_class._meta.object_name)
raise ObjectDoesNotExist("%s matching query does not exist." % source_object_model_class._meta.object_name)
raise ObjectDoesNotExist('%s matching query does not exist.' % source_object_model_class._meta.object_name)
else:
source_object = source_object_model_class
@@ -115,15 +110,15 @@ class EncapsulatedObject(object):
def __unicode__(self):
if isinstance(self.source_object, ModelBase):
return capfirst(unicode(self.source_object._meta.verbose_name_plural))
return unicode(self.source_object._meta.verbose_name_plural)
elif self.ct_fullname == 'auth.user':
return u'%s %s' % (self.source_object._meta.verbose_name, self.source_object.get_full_name())
return '%s %s' % (self.source_object._meta.verbose_name, self.source_object.get_full_name())
elif self.ct_fullname == 'common.anonymoususersingleton':
return unicode(self.source_object)
elif self.ct_fullname == 'acls.creatorsingleton':
return unicode(self.source_object)
else:
return u'%s %s' % (self.source_object._meta.verbose_name, self.source_object)
return '%s %s' % (self.source_object._meta.verbose_name, self.source_object)
def __repr__(self):
return self.__unicode__()
@@ -134,19 +129,19 @@ class EncapsulatedObject(object):
class AccessHolder(EncapsulatedObject):
source_object_name = u'holder_object'
source_object_name = 'holder_object'
class AccessObject(EncapsulatedObject):
source_object_name = u'obj'
source_object_name = 'obj'
class AccessObjectClass(EncapsulatedObject):
source_object_name = u'cls'
source_object_name = 'cls'
class ClassAccessHolder(EncapsulatedObject):
source_object_name = u'class_holder'
source_object_name = 'class_holder'
if sys.version_info < (2, 5):

View File

@@ -1,8 +0,0 @@
from __future__ import absolute_import
from .models import AccessEntry, DefaultAccessEntry
def cleanup():
AccessEntry.objects.all().delete()
DefaultAccessEntry.objects.all().delete()

View File

@@ -1,4 +1,4 @@
from __future__ import absolute_import
from __future__ import absolute_import, unicode_literals
from django import forms
from django.contrib.auth.models import User, Group
@@ -22,7 +22,7 @@ def _as_choice_list(holders):
class BaseHolderSelectionForm(forms.Form):
holder_gid = forms.ChoiceField(
label=_(u'New holder')
label=_('New holder')
)
def __init__(self, *args, **kwargs):
@@ -39,16 +39,16 @@ class BaseHolderSelectionForm(forms.Form):
non_holder_list = []
if users:
non_holder_list.append((_(u'Users'), _as_choice_list(list(users))))
non_holder_list.append((_('Users'), _as_choice_list(list(users))))
if groups:
non_holder_list.append((_(u'Groups'), _as_choice_list(list(groups))))
non_holder_list.append((_('Groups'), _as_choice_list(list(groups))))
if roles:
non_holder_list.append((_(u'Roles'), _as_choice_list(list(roles))))
non_holder_list.append((_('Roles'), _as_choice_list(list(roles))))
if special:
non_holder_list.append((_(u'Special'), _as_choice_list(list(special))))
non_holder_list.append((_('Special'), _as_choice_list(list(special))))
super(BaseHolderSelectionForm, self).__init__(*args, **kwargs)
self.fields['holder_gid'].choices = non_holder_list

View File

@@ -1,18 +1,21 @@
from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from .permissions import (ACLS_EDIT_ACL, ACLS_VIEW_ACL,
ACLS_CLASS_EDIT_ACL, ACLS_CLASS_VIEW_ACL)
from .permissions import (
ACLS_CLASS_EDIT_ACL, ACLS_CLASS_VIEW_ACL, ACLS_EDIT_ACL, ACLS_VIEW_ACL
)
acl_list = {'text': _(u'ACLs'), 'view': 'acl_list', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]}
acl_detail = {'text': _(u'details'), 'view': 'acl_detail', 'args': ['access_object.gid', 'object.gid'], 'famfam': 'key_go', 'permissions': [ACLS_VIEW_ACL]}
acl_grant = {'text': _(u'grant'), 'view': 'acl_multiple_grant', 'famfam': 'key_add', 'permissions': [ACLS_EDIT_ACL]}
acl_revoke = {'text': _(u'revoke'), 'view': 'acl_multiple_revoke', 'famfam': 'key_delete', 'permissions': [ACLS_EDIT_ACL]}
acl_holder_new = {'text': _(u'New holder'), 'view': 'acl_holder_new', 'args': 'access_object.gid', 'famfam': 'user', 'permissions': [ACLS_EDIT_ACL]}
acl_list = {'text': _('ACLs'), 'view': 'acls:acl_list', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]}
acl_detail = {'text': _('Details'), 'view': 'acls:acl_detail', 'args': ['access_object.gid', 'object.gid'], 'famfam': 'key_go', 'permissions': [ACLS_VIEW_ACL]}
acl_grant = {'text': _('Grant'), 'view': 'acls:acl_multiple_grant', 'famfam': 'key_add', 'permissions': [ACLS_EDIT_ACL]}
acl_revoke = {'text': _('Revoke'), 'view': 'acls:acl_multiple_revoke', 'famfam': 'key_delete', 'permissions': [ACLS_EDIT_ACL]}
acl_holder_new = {'text': _('New holder'), 'view': 'acls:acl_holder_new', 'args': 'access_object.gid', 'famfam': 'user', 'permissions': [ACLS_EDIT_ACL]}
acl_setup_valid_classes = {'text': _(u'Default ACLs'), 'view': 'acl_setup_valid_classes', 'icon': 'lock.png', 'permissions': [ACLS_CLASS_VIEW_ACL], 'children_view_regex': [r'^acl_class', r'^acl_setup']}
acl_class_list = {'text': _(u'List of classes'), 'view': 'acl_setup_valid_classes', 'famfam': 'package', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_acl_list = {'text': _(u'ACLs for class'), 'view': 'acl_class_acl_list', 'args': 'object.gid', 'famfam': 'lock_go', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_acl_detail = {'text': _(u'details'), 'view': 'acl_class_acl_detail', 'args': ['access_object_class.gid', 'object.gid'], 'famfam': 'key_go', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_new_holder_for = {'text': _(u'New holder'), 'view': 'acl_class_new_holder_for', 'args': 'object.gid', 'famfam': 'user', 'permissions': [ACLS_CLASS_EDIT_ACL]}
acl_class_grant = {'text': _(u'grant'), 'view': 'acl_class_multiple_grant', 'famfam': 'key_add', 'permissions': [ACLS_CLASS_EDIT_ACL]}
acl_class_revoke = {'text': _(u'revoke'), 'view': 'acl_class_multiple_revoke', 'famfam': 'key_delete', 'permissions': [ACLS_CLASS_EDIT_ACL]}
acl_setup_valid_classes = {'text': _('Default ACLs'), 'view': 'acls:acl_setup_valid_classes', 'icon': 'main/icons/lock.png', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_list = {'text': _('Classes'), 'view': 'acls:acl_setup_valid_classes', 'famfam': 'package', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_acl_list = {'text': _('ACLs for class'), 'view': 'acls:acl_class_acl_list', 'args': 'object.gid', 'famfam': 'lock_go', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_acl_detail = {'text': _('Details'), 'view': 'acls:acl_class_acl_detail', 'args': ['access_object_class.gid', 'object.gid'], 'famfam': 'key_go', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_new_holder_for = {'text': _('New holder'), 'view': 'acls:acl_class_new_holder_for', 'args': 'object.gid', 'famfam': 'user', 'permissions': [ACLS_CLASS_EDIT_ACL]}
acl_class_grant = {'text': _('Grant'), 'view': 'acls:acl_class_multiple_grant', 'famfam': 'key_add', 'permissions': [ACLS_CLASS_EDIT_ACL]}
acl_class_revoke = {'text': _('Revoke'), 'view': 'acls:acl_class_multiple_revoke', 'famfam': 'key_delete', 'permissions': [ACLS_CLASS_EDIT_ACL]}

View File

@@ -1,3 +1,4 @@
from __future__ import unicode_literals
# Content type <-> fam fam icon mapping
CONTENT_TYPE_ICON_MAP = {
@@ -6,7 +7,7 @@ CONTENT_TYPE_ICON_MAP = {
'documents.document': 'page',
'permissions.role': 'medal_gold_1',
'folders.folder': 'folder',
'taggit.tag': 'tag_blue',
'tags.tag': 'tag_blue',
'linking.smartlink': 'page_link',
'common.anonymoususersingleton': 'user',
'acls.creatorsingleton': 'user',

View File

@@ -3,14 +3,15 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Mohammed ALDOUB <voulnet@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-07-31 19:51-0400\n"
"PO-Revision-Date: 2013-01-26 08:48+0000\n"
"Last-Translator: Mohammed ALDOUB <voulnet@gmail.com>\n"
"POT-Creation-Date: 2015-02-06 20:44-0400\n"
"PO-Revision-Date: 2014-10-25 06:47+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/mayan-edms/"
"language/ar/)\n"
"Language: ar\n"
@@ -20,7 +21,7 @@ msgstr ""
"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"
#: forms.py:25 links.py:10 links.py:16
#: forms.py:25 links.py:13 links.py:19
msgid "New holder"
msgstr "New holder"
@@ -40,31 +41,31 @@ msgstr "Roles"
msgid "Special"
msgstr "Special"
#: links.py:6
#: links.py:9
msgid "ACLs"
msgstr "ACLs"
#: links.py:7 links.py:15
msgid "details"
msgstr "details"
#: links.py:10 links.py:18
msgid "Details"
msgstr ""
#: links.py:8 links.py:17
msgid "grant"
msgstr "grant"
#: links.py:11 links.py:20
msgid "Grant"
msgstr ""
#: links.py:9 links.py:18
msgid "revoke"
msgstr "revoke"
#: links.py:12 links.py:21
msgid "Revoke"
msgstr ""
#: links.py:12
#: links.py:15
msgid "Default ACLs"
msgstr "Default ACLs"
#: links.py:13
msgid "List of classes"
msgstr "List of classes"
#: links.py:16 views.py:379
msgid "Classes"
msgstr ""
#: links.py:14
#: links.py:17
msgid "ACLs for class"
msgstr "ACLs for class"
@@ -72,34 +73,30 @@ msgstr "ACLs for class"
msgid "Insufficient access."
msgstr "Insufficient access."
#: models.py:26 models.py:68
msgid "permission"
msgstr "permission"
#: models.py:25 models.py:67
msgid "Permission"
msgstr ""
#: models.py:51
msgid "Access entry"
msgstr ""
#: models.py:52
msgid "access entry"
msgstr "access entry"
msgid "Access entries"
msgstr ""
#: models.py:53
msgid "access entries"
msgstr "access entries"
#: models.py:88
msgid "Default access entry"
msgstr ""
#: models.py:89
msgid "default access entry"
msgstr "default access entry"
msgid "Default access entries"
msgstr ""
#: models.py:90
msgid "default access entries"
msgstr "default access entries"
#: models.py:109
#: models.py:108 models.py:111 models.py:112
msgid "Creator"
msgstr "Creator"
#: models.py:112 models.py:113
msgid "creator"
msgstr "creator"
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Access control lists"
@@ -120,66 +117,66 @@ msgstr "Edit class default ACLs"
msgid "View class default ACLs"
msgstr "View class default ACLs"
#: views.py:46
#: views.py:48
#, python-format
msgid "access control lists for: %s"
msgstr "access control lists for: %s"
msgid "Access control lists for: %s"
msgstr ""
#: views.py:48 views.py:408
msgid "holder"
msgstr "holder"
#: views.py:50 views.py:402
msgid "Holder"
msgstr ""
#: views.py:49 views.py:409
msgid "permissions"
msgstr "permissions"
#: views.py:51 views.py:403
msgid "Permissions"
msgstr ""
#: views.py:96
#: views.py:98
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr "permissions available to: %(actor)s for %(obj)s"
msgid "Permissions available to: %(actor)s for %(obj)s"
msgstr ""
#: views.py:103 views.py:441
msgid "namespace"
msgstr "namespace"
#: views.py:105 views.py:434
msgid "Namespace"
msgstr ""
#: views.py:104 views.py:442
msgid "label"
msgstr "label"
#: views.py:106 views.py:435
msgid "Label"
msgstr ""
#: views.py:106 views.py:444
msgid "has permission"
msgstr "has permission"
#: views.py:108 views.py:437
msgid "Has permission"
msgstr ""
#: views.py:183 views.py:276 views.py:524 views.py:603
#: views.py:181 views.py:272 views.py:516 views.py:593
msgid ", "
msgstr ", "
#: views.py:184 views.py:277 views.py:525 views.py:604
#: views.py:182 views.py:273 views.py:517 views.py:594
#, python-format
msgid " for %s"
msgstr " for %s"
#: views.py:185 views.py:526
#: views.py:183 views.py:518
#, python-format
msgid " to %s"
msgstr " to %s"
#: views.py:188 views.py:529
#: views.py:186 views.py:521
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr "Are you sure you wish to grant the permission %(title_suffix)s?"
#: views.py:190 views.py:531
#: views.py:188 views.py:523
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr "Are you sure you wish to grant the permissions %(title_suffix)s?"
#: views.py:197 views.py:538
#: views.py:195 views.py:530
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
#: views.py:203 views.py:544
#: views.py:201 views.py:536
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
@@ -188,60 +185,65 @@ msgstr ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
#: views.py:278 views.py:605
#: views.py:274 views.py:595
#, python-format
msgid " from %s"
msgstr " from %s"
#: views.py:281 views.py:608
#: views.py:277 views.py:598
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr "Are you sure you wish to revoke the permission %(title_suffix)s?"
#: views.py:283 views.py:610
#: views.py:279 views.py:600
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr "Are you sure you wish to revoke the permissions %(title_suffix)s?"
#: views.py:290 views.py:617
#: views.py:286 views.py:607
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#: views.py:296 views.py:623
#: views.py:292 views.py:613
#, python-format
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."
#: views.py:352
#: views.py:346
#, python-format
msgid "add new holder for: %s"
msgstr "add new holder for: %s"
msgid "Add new holder for: %s"
msgstr ""
#: views.py:353 views.py:485
#: views.py:347 views.py:477
msgid "Select"
msgstr "Select"
#: views.py:385
msgid "classes"
msgstr "classes"
#: views.py:381
msgid "Class"
msgstr ""
#: views.py:387
msgid "class"
msgstr "class"
#: views.py:406
#: views.py:400
#, python-format
msgid "default access control lists for class: %s"
msgstr "default access control lists for class: %s"
msgid "Default access control lists for class: %s"
msgstr ""
#: views.py:434
#: views.py:428
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr "permissions available to: %(actor)s for class %(class)s"
msgid "Permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:483
#: views.py:475
#, python-format
msgid "add new holder for class: %s"
msgstr "add new holder for class: %s"
msgid "Add new holder for class: %s"
msgstr ""
#~ msgid "List of classes"
#~ msgstr "List of classes"
#~ msgid "permission"
#~ msgstr "permission"
#~ msgid "creator"
#~ msgstr "creator"

View File

@@ -3,15 +3,17 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Iliya Georgiev <ikgeorgiev@gmail.com>, 2012
# Pavlin Koldamov <pkoldamov@gmail.com>, 2012
# Pavlin Koldamov <pkoldamov@gmail.com>, 2012
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-07-31 19:51-0400\n"
"PO-Revision-Date: 2012-10-15 10:27+0000\n"
"Last-Translator: Pavlin Koldamov <pkoldamov@gmail.com>\n"
"POT-Creation-Date: 2015-02-06 20:44-0400\n"
"PO-Revision-Date: 2014-10-25 06:47+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bulgarian (http://www.transifex.com/projects/p/mayan-edms/"
"language/bg/)\n"
"Language: bg\n"
@@ -20,7 +22,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:25 links.py:10 links.py:16
#: forms.py:25 links.py:13 links.py:19
msgid "New holder"
msgstr "Нов притежател"
@@ -40,31 +42,31 @@ msgstr "Роли"
msgid "Special"
msgstr ""
#: links.py:6
#: links.py:9
msgid "ACLs"
msgstr "Контролни списъци за достъп"
#: links.py:7 links.py:15
msgid "details"
msgstr "детайли"
#: links.py:10 links.py:18
msgid "Details"
msgstr ""
#: links.py:8 links.py:17
msgid "grant"
msgstr "предоставяне"
#: links.py:11 links.py:20
msgid "Grant"
msgstr ""
#: links.py:9 links.py:18
msgid "revoke"
msgstr "отменя"
#: links.py:12 links.py:21
msgid "Revoke"
msgstr ""
#: links.py:12
#: links.py:15
msgid "Default ACLs"
msgstr "Контролни списъци за достъп по подразбиране"
#: links.py:13
msgid "List of classes"
msgstr "Списък на класовете"
#: links.py:16 views.py:379
msgid "Classes"
msgstr ""
#: links.py:14
#: links.py:17
msgid "ACLs for class"
msgstr "Контролни списъци за клас"
@@ -72,34 +74,30 @@ msgstr "Контролни списъци за клас"
msgid "Insufficient access."
msgstr "Недостатъчен достъп."
#: models.py:26 models.py:68
msgid "permission"
msgstr "разрешение"
#: models.py:25 models.py:67
msgid "Permission"
msgstr ""
#: models.py:51
msgid "Access entry"
msgstr ""
#: models.py:52
msgid "access entry"
msgstr "достъп за влизане"
msgid "Access entries"
msgstr ""
#: models.py:53
msgid "access entries"
msgstr "достъп вписвания"
#: models.py:88
msgid "Default access entry"
msgstr ""
#: models.py:89
msgid "default access entry"
msgid "Default access entries"
msgstr ""
#: models.py:90
msgid "default access entries"
msgstr ""
#: models.py:109
#: models.py:108 models.py:111 models.py:112
msgid "Creator"
msgstr ""
#: models.py:112 models.py:113
msgid "creator"
msgstr ""
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Контролни списъци за достъп"
@@ -120,127 +118,132 @@ msgstr ""
msgid "View class default ACLs"
msgstr ""
#: views.py:46
#: views.py:48
#, python-format
msgid "access control lists for: %s"
msgid "Access control lists for: %s"
msgstr ""
#: views.py:48 views.py:408
msgid "holder"
#: views.py:50 views.py:402
msgid "Holder"
msgstr ""
#: views.py:49 views.py:409
msgid "permissions"
msgstr "разрешения"
#: views.py:51 views.py:403
msgid "Permissions"
msgstr ""
#: views.py:96
#: views.py:98
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgid "Permissions available to: %(actor)s for %(obj)s"
msgstr ""
#: views.py:103 views.py:441
msgid "namespace"
#: views.py:105 views.py:434
msgid "Namespace"
msgstr ""
#: views.py:104 views.py:442
msgid "label"
#: views.py:106 views.py:435
msgid "Label"
msgstr ""
#: views.py:106 views.py:444
msgid "has permission"
#: views.py:108 views.py:437
msgid "Has permission"
msgstr ""
#: views.py:183 views.py:276 views.py:524 views.py:603
#: views.py:181 views.py:272 views.py:516 views.py:593
msgid ", "
msgstr ""
#: views.py:184 views.py:277 views.py:525 views.py:604
#: views.py:182 views.py:273 views.py:517 views.py:594
#, python-format
msgid " for %s"
msgstr " за %s"
#: views.py:185 views.py:526
#: views.py:183 views.py:518
#, python-format
msgid " to %s"
msgstr " към %s"
#: views.py:188 views.py:529
#: views.py:186 views.py:521
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr "Сигурни ли сте, че искате да дадете разрешение за %(title_suffix)s?"
#: views.py:190 views.py:531
#: views.py:188 views.py:523
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr "Сигурни ли сте, че искате да дадете разрешения за %(title_suffix)s?"
#: views.py:197 views.py:538
#: views.py:195 views.py:530
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr ""
#: views.py:203 views.py:544
#: views.py:201 views.py:536
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
#: views.py:278 views.py:605
#: views.py:274 views.py:595
#, python-format
msgid " from %s"
msgstr " от %s"
#: views.py:281 views.py:608
#: views.py:277 views.py:598
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr ""
"Сигурни ли сте, че искате да отнемете разрешението за %(title_suffix)s?"
#: views.py:283 views.py:610
#: views.py:279 views.py:600
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
"Сигурни ли сте, че искате да отнемете разрешенията за %(title_suffix)s?"
#: views.py:290 views.py:617
#: views.py:286 views.py:607
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
#: views.py:296 views.py:623
#: views.py:292 views.py:613
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr ""
#: views.py:352
#: views.py:346
#, python-format
msgid "add new holder for: %s"
msgid "Add new holder for: %s"
msgstr ""
#: views.py:353 views.py:485
#: views.py:347 views.py:477
msgid "Select"
msgstr ""
#: views.py:385
msgid "classes"
msgstr "класове"
#: views.py:387
msgid "class"
msgstr "клас"
#: views.py:406
#, python-format
msgid "default access control lists for class: %s"
msgstr "правила за достъп по подразбиране за клас: %s"
#: views.py:434
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
#: views.py:381
msgid "Class"
msgstr ""
#: views.py:483
#: views.py:400
#, python-format
msgid "add new holder for class: %s"
msgid "Default access control lists for class: %s"
msgstr ""
#: views.py:428
#, python-format
msgid "Permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:475
#, python-format
msgid "Add new holder for class: %s"
msgstr ""
#~ msgid "List of classes"
#~ msgstr "List of classes"
#~ msgid "permission"
#~ msgstr "permission"
#~ msgid "creator"
#~ msgstr "creator"

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