Compare commits

..
101 Commits
Author SHA1 Message Date
Roberto Rosario 8974bf07a2 One step redirection to the new site 2012-09-02 02:00:43 -04:00
Roberto Rosario 3beb07c373 Redirect all old pages to new website 2012-08-31 02:20:00 -04:00
Roberto Rosario 766df7f38b Merge remote-tracking branch 'github/gh-pages' into gh-pages
Conflicts:
	index.html
	news.html
2012-08-30 03:23:58 -04:00
Roberto Rosario ae48d80624 Add news item about web site redesign 2012-08-30 03:20:08 -04:00
Roberto Rosario 059dff02f3 Update list of compliant providers and users 2012-08-30 03:19:40 -04:00
Roberto Rosario 18ae37228a Leasons learned... So far... 2012-08-29 11:38:40 -03:00
Roberto Rosario 8298f50334 Leasons learned... So far... 2012-08-29 11:36:55 -03:00
Roberto Rosario 7941cd83a0 More intents to comply, won't keep updating the total number 2012-08-28 20:53:25 -04:00
Roberto Rosario b1c573dbcf Second GPL update 2012-08-28 19:48:54 -04:00
Roberto Rosario e6750d3777 Fixed another typo 2012-08-28 02:37:57 -04:00
Roberto Rosario 2b5943f15e Fix typo 2012-08-28 02:30:50 -04:00
Roberto Rosario 6f324c4e00 Style tweak, typo fix 2012-08-28 02:24:50 -04:00
Roberto Rosario 352fcbae6e GPL violations update 2012-08-28 02:20:04 -04:00
Roberto Rosario bf1aea0157 Add appsembler button 2012-08-27 03:15:30 -04:00
Roberto Rosario eda6d65184 Add GPL violations news and page 2012-08-27 03:02:05 -04:00
Roberto Rosario d8525383f5 Fix typo 2012-08-07 13:21:11 -04:00
Roberto Rosario 8ea22f3b3b Add JTP net to support providers 2012-08-07 13:11:41 -04:00
Roberto Rosario 1f6afd5629 Update news 2012-08-07 13:11:28 -04:00
Roberto Rosario c7ed8ca09c Add Django links link 2012-06-30 04:28:50 -04:00
Roberto Rosario ee44435e47 Add release 0.12.2 news 2012-06-30 04:28:36 -04:00
Roberto Rosario 600d674cb0 Add new web references 2012-06-17 01:43:18 -04:00
Roberto Rosario 9cdbe77f54 Update news 2012-06-14 03:50:27 -04:00
Roberto Rosario 0cbbcda2e7 Add barquin as user 2012-06-14 03:40:13 -04:00
Roberto Rosario bfe0096cc9 Add easywork to the list of support providers 2012-06-04 13:49:14 -04:00
Roberto Rosario f061e32f00 Add new users 2012-06-04 13:49:05 -04:00
Roberto Rosario 6d946db0c8 Remove old news to make room 2012-06-04 13:12:30 -04:00
Roberto Rosario a823bdc6be Mayan 0.12.1 release posting 2012-06-04 13:11:44 -04:00
Roberto Rosario 7bb53958de Add new reference to Mayan EDMS from the web 2012-06-04 13:11:17 -04:00
Roberto Rosario e7ba91fbaf Add entities that use Mayan EDMS 2012-05-28 05:27:58 -04:00
Roberto Rosario 121063ae00 Add survey link to main page 2012-05-28 05:01:10 -04:00
Roberto Rosario af027acaa5 Add survey link to index and news pages 2012-05-24 16:54:52 -04:00
Roberto Rosario 2fb8691028 Added link "Sistema de Gestión Documental: Mayan EDMS" 2012-05-14 02:34:54 -03:00
Roberto Rosario cd6f503d68 Add news link to front page 2012-05-01 02:32:38 -04:00
Roberto Rosario 1354fc6893 Add Techstars Appsembler video 2012-05-01 02:32:23 -04:00
Roberto Rosario d0d9bd0365 Add other web site referencing Mayan EDMS 2012-05-01 02:31:58 -04:00
Roberto Rosario 8f777fd39b SEO optiminzation 2012-03-13 12:50:28 -04:00
Roberto Rosario 39863ab095 Update news page with .13 development and hang out info 2012-03-13 12:12:00 -04:00
Roberto Rosario dabd76bc04 Update google verification tag 2012-03-01 16:12:28 -04:00
Roberto Rosario fedebac7c7 Add google confirmation meta tag 2012-03-01 16:02:42 -04:00
Roberto Rosario 46072b8c4c Added google confirmation html 2012-03-01 16:00:02 -04:00
Roberto Rosario 387322faa2 Mayan EDMS version 0.12 release news 2012-02-27 16:23:05 -04:00
Roberto Rosario afeef2dd02 Add Quinta Group Mayan Info page 2012-02-26 05:03:26 -04:00
Roberto Rosario d0c08fa32d Fix typo 2012-02-26 05:02:17 -04:00
Roberto Rosario 0a57907a51 Add Quinta Group info 2012-02-26 04:58:05 -04:00
Roberto Rosario 3ef608599b Fix links typos 2012-02-26 01:19:06 -04:00
Roberto Rosario ae082ce52e Added more 3rd party links 2012-02-26 01:17:35 -04:00
Roberto Rosario 19d268ce58 Add g+ button to blog page 2012-01-14 02:46:49 -04:00
Roberto Rosario bd01ef489d Add anontation got g+ button 2012-01-14 02:44:26 -04:00
Roberto Rosario 072a883cdd Add missing g+ JS code 2012-01-14 02:42:02 -04:00
Roberto Rosario bc0a539301 Add google plus button 2012-01-14 02:39:07 -04:00
Roberto Rosario bdef1d817d Google group links added 2012-01-13 01:16:12 -04:00
Roberto Rosario f649b49f42 Add Barry Rowlingson's Mayan EDMS blog post 2012-01-03 00:36:28 -04:00
Roberto Rosario 4dd56492dd Add missing query string argument 2011-12-19 20:48:44 -04:00
Roberto Rosario 38bc67a329 Add fancybox wrapping to the introduction video 2011-12-19 20:46:34 -04:00
Roberto Rosario 9b4186cabe Reduce list margins 2011-12-19 19:59:06 -04:00
Roberto Rosario 321058a610 Add margin to support list 2011-12-19 19:58:03 -04:00
Roberto Rosario c7814f45ed Update CSS, cleanup HTML add improved screenshots, update news 2011-12-19 19:52:12 -04:00
Roberto Rosario 86d349f18b Add updated screenshots 2011-12-19 18:02:06 -04:00
Roberto Rosario 60bfe94528 Add fancybox support to the screenshot images 2011-12-19 17:54:09 -04:00
Roberto Rosario 05883260f7 Add fancybox and enable it for the news screenshots 2011-12-19 17:42:03 -04:00
Roberto Rosario e9a0749edf Added 'on the web' page 2011-12-14 11:07:20 -04:00
Roberto Rosario 456a3c55e3 Fix typo 2011-12-13 12:38:07 -04:00
Roberto Rosario e2d8e01f27 Fix again the SeeOpen.IT link 2011-12-13 12:36:46 -04:00
Roberto Rosario f565b99990 Fix SeeOpenIt link 2011-12-13 12:35:59 -04:00
Roberto Rosario 341b52655c Add Italian translation news 2011-12-13 12:33:42 -04:00
Roberto Rosario ae6a481e82 Add SeeOpen it to the support providers 2011-12-12 10:51:06 -04:00
Roberto Rosario f6d2468a88 typo fix 2011-12-08 16:10:18 -04:00
Roberto Rosario 046761bff0 Add new lines 2011-12-08 16:02:16 -04:00
Roberto Rosario 0e7e546807 add info about v0.11.1 bugfix release 2011-12-08 16:01:00 -04:00
Roberto Rosario cbd5485301 Feature update 2011-12-08 08:47:55 -04:00
Roberto Rosario c61542c433 email update 2011-12-08 08:46:43 -04:00
Roberto Rosario 9c5e6cc8c9 email update 2011-12-08 08:34:13 -04:00
Roberto Rosario d680335ca9 email update 2011-12-08 08:33:24 -04:00
Roberto Rosario ed95d0ff1e email change 2011-12-08 08:32:43 -04:00
Roberto Rosario 554d31a736 Update email address 2011-12-07 19:12:19 -04:00
Roberto Rosario a247c63b9e Update email to mayan-edms domaain 2011-12-07 19:09:57 -04:00
Roberto Rosario 6fab169290 Add version 0.11 announcement 2011-12-06 03:50:11 -04:00
Roberto Rosario 58e1acacbb Add creat1va to the list of support providers 2011-12-05 07:11:17 -04:00
Roberto Rosario 8c0633959b Don't use hand pointer in steps 2011-12-05 07:10:47 -04:00
Roberto Rosario 3b9fecb593 Add support and news areas 2011-12-04 07:30:18 -04:00
Roberto Rosario 47e88b8e95 Changed contact text 2011-11-22 10:25:51 -04:00
Roberto Rosario fb22f07436 Added Portuguese and Russian to the supported UI language list 2011-11-22 10:24:36 -04:00
Roberto Rosario 163f4fa24f Update index.html 2011-11-18 18:14:36 -04:00
Roberto Rosario 99129ead90 Update index.html 2011-11-18 18:13:23 -04:00
Roberto Rosario 67da7d897d Update index.html 2011-11-18 18:12:22 -04:00
Roberto Rosario eb9056f332 Update index.html 2011-11-18 18:10:14 -04:00
Roberto Rosario 766fd144b4 Updated online documentation url 2011-08-19 23:32:45 -04:00
Roberto Rosario d6e0b6889a Updated email address 2011-08-19 23:28:53 -04:00
Roberto Rosario 6e1230f554 Added links to the video and to the online documentation 2011-08-19 23:23:41 -04:00
Roberto Rosario 96bb01fd7a Removed installation instructions 2011-08-19 23:23:13 -04:00
Roberto Rosario 3eb85afa17 Removed the forke banner from the index and screenshot pages 2011-08-19 22:41:45 -04:00
Roberto Rosario 2d3c1953e0 Added donate link 2011-08-10 05:12:30 -04:00
Roberto Rosario 2f5bc98601 Updated latest release link and installation instructions 2011-05-01 18:23:22 -04:00
Roberto Rosario 3f62a3a09a Cleanup 2011-04-29 01:13:51 -04:00
Roberto Rosario 2ddbfc224f Added Google Analytics code 2011-04-29 01:05:25 -04:00
Roberto Rosario 741919ad90 New website version using a free template 2011-04-29 01:02:38 -04:00
Roberto Rosario ffcc033c40 touched html to force re-generation 2011-04-27 09:48:40 -04:00
Roberto Rosario 1ab72f6902 Added two more screenshots 2011-04-20 06:04:44 -04:00
Roberto Rosario 3cee2cdebb Added 2 more screenshots 2011-04-20 05:56:18 -04:00
Roberto Rosario 2d45f7ce5f Updated to include features and screenshots 2011-04-20 05:46:41 -04:00
Roberto Rosario de0c9afa18 github generated gh-pages branch 2011-04-20 02:25:33 -07:00
6883 changed files with 2531 additions and 163631 deletions
-17
View File
@@ -1,17 +0,0 @@
*.orig
*.pyc
*.pyo
*.sql
*.sqlite
/settings_local.py
/celerybeat-schedule
/document_storage/
/misc/mayan.geany
/image_cache/
build/
_build/
/gpg_home/
/static/
/whoosh_index/
/fabfile_install
/server_config.yaml
-218
View File
@@ -1,218 +0,0 @@
[main]
host = https://www.transifex.net
[mayan-edms.apps-acls]
file_filter = apps/acls/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/acls/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-bootstrap]
file_filter = apps/bootstrap/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/bootstrap/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-converter]
file_filter = apps/converter/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/converter/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-common]
file_filter = apps/common/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/common/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-checkouts]
file_filter = apps/checkouts/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/checkouts/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-clustering]
file_filter = apps/clustering/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/clustering/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-django_gpg]
file_filter = apps/django_gpg/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/django_gpg/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-diagnostics]
file_filter = apps/diagnostics/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/diagnostics/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-documents]
file_filter = apps/documents/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/documents/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-document_comments]
file_filter = apps/document_comments/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/document_comments/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-document_indexing]
file_filter = apps/document_indexing/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/document_indexing/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-document_signatures]
file_filter = apps/document_signatures/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/document_signatures/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-dynamic_search]
file_filter = apps/dynamic_search/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/dynamic_search/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-folders]
file_filter = apps/folders/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/folders/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-history]
file_filter = apps/history/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/history/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-installation]
file_filter = apps/installation/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/installation/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-job_processor]
file_filter = apps/job_processor/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/job_processor/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-linking]
file_filter = apps/linking/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/linking/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-lock_manager]
file_filter = apps/lock_manager/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/lock_manager/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-main]
file_filter = apps/main/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/main/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-maintenance]
file_filter = apps/maintenance/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/maintenance/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-metadata]
file_filter = apps/metadata/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/metadata/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-navigation]
file_filter = apps/navigation/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/navigation/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-ocr]
file_filter = apps/ocr/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/ocr/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-permissions]
file_filter = apps/permissions/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/permissions/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-project_setup]
file_filter = apps/project_setup/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/project_setup/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-project_tools]
file_filter = apps/project_tools/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/project_tools/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-registration]
file_filter = apps/registration/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/registration/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-scheduler]
file_filter = apps/scheduler/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/scheduler/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-smart_settings]
file_filter = apps/smart_settings/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/smart_settings/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-sources]
file_filter = apps/sources/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/sources/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-statistics]
file_filter = apps/statistics/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/statistics/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-tags]
file_filter = apps/tags/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/tags/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-trash]
file_filter = apps/trash/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/trash/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-user_management]
file_filter = apps/user_management/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/user_management/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.apps-web_theme]
file_filter = apps/web_theme/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = apps/web_theme/locale/en/LC_MESSAGES/django.po
type = PO
-43
View File
@@ -1,43 +0,0 @@
from django.conf import settings
from django.utils.importlib import import_module
import mimetypes
PREPARE_UPLOAD_BACKEND = getattr(settings,
'PREPARE_UPLOAD_BACKEND',
'filetransfers.backends.default.prepare_upload')
SERVE_FILE_BACKEND = getattr(settings,
'SERVE_FILE_BACKEND',
'filetransfers.backends.default.serve_file')
PUBLIC_DOWNLOAD_URL_BACKEND = getattr(settings,
'PUBLIC_DOWNLOAD_URL_BACKEND',
'filetransfers.backends.default.public_download_url')
_backends_cache = {}
# Public API
def prepare_upload(request, url, private=False, backend=None):
handler = _load_backend(backend, PREPARE_UPLOAD_BACKEND)
return handler(request, url, private=private)
def serve_file(request, file, backend=None, save_as=False, content_type=None):
# Backends are responsible for handling range requests.
handler = _load_backend(backend, SERVE_FILE_BACKEND)
filename = file.name.rsplit('/')[-1]
if save_as is True:
save_as = filename
if not content_type:
content_type = mimetypes.guess_type(filename)[0]
return handler(request, file, save_as=save_as, content_type=content_type)
def public_download_url(file, backend=None):
handler = _load_backend(backend, PUBLIC_DOWNLOAD_URL_BACKEND)
return handler(file)
# Internal utilities
def _load_backend(backend, default_backend):
if backend is None:
backend = default_backend
if backend not in _backends_cache:
module_name, func_name = backend.rsplit('.', 1)
_backends_cache[backend] = getattr(import_module(module_name), func_name)
return _backends_cache[backend]
@@ -1,7 +0,0 @@
from django.conf import settings
def public_download_url(file, **kwargs):
"""
Directs downloads to a handler at settings.PUBLIC_DOWNLOADS_URL_BASE
"""
return settings.PUBLIC_DOWNLOADS_URL_BASE + file.name
@@ -1,30 +0,0 @@
from django.http import HttpResponse
from django.utils.encoding import smart_str
def prepare_upload(request, url, **kwargs):
"""Directly uploads to the given URL"""
return url, {}
def serve_file(request, file, save_as, content_type, **kwargs):
"""
Serves the file in chunks for efficiency reasons, but the transfer still
goes through Django itself, so it's much worse than using the web server,
but at least it works with all configurations.
"""
response = HttpResponse(ChunkedFile(file), content_type=content_type)
if save_as:
response['Content-Disposition'] = smart_str(u'attachment; filename=%s' % save_as)
if file.size is not None:
response['Content-Length'] = file.size
return response
def public_download_url(file, **kwargs):
"""No public download URL"""
return None
class ChunkedFile(object):
def __init__(self, file):
self.file = file
def __iter__(self):
return self.file.chunks()
@@ -1,11 +0,0 @@
from django.conf import settings
from filetransfers.api import prepare_upload as delegate
def prepare_upload(*args, **kwargs):
"""Delegates uploads to other backends based on private=False or True"""
if kwargs['private']:
kwargs['backend'] = settings.PRIVATE_PREPARE_UPLOAD_BACKEND
else:
kwargs['backend'] = settings.PUBLIC_PREPARE_UPLOAD_BACKEND
return delegate(*args, **kwargs)
@@ -1,10 +0,0 @@
from django.http import HttpResponseRedirect
from django.utils.encoding import smart_str
def serve_file(request, file, **kwargs):
"""Serves files by redirecting to file.url (e.g., useful for Amazon S3)"""
return HttpResponseRedirect(smart_str(file.url))
def public_download_url(file, **kwargs):
"""Directs downloads to file.url (useful for normal file system storage)"""
return file.url
@@ -1,12 +0,0 @@
from django.http import HttpResponse
from django.utils.encoding import smart_str
def serve_file(request, file, save_as, content_type, **kwargs):
"""Lets the web server serve the file using the X-Sendfile extension"""
response = HttpResponse(content_type=content_type)
response['X-Sendfile'] = file.path
if save_as:
response['Content-Disposition'] = smart_str(u'attachment; filename=%s' % save_as)
if file.size is not None:
response['Content-Length'] = file.size
return response
@@ -1,17 +0,0 @@
from django.template import Library
from django.utils.safestring import mark_safe
from ..api import public_download_url
register = Library()
_hidden_data_field = '<input type="hidden" name="%s" value="%s" />'
@register.simple_tag
def render_upload_data(data):
inputs = ''.join(_hidden_data_field % item for item in data.items())
if inputs:
return mark_safe('<div style="display:none">%s</div>' % inputs)
return ''
register.filter(public_download_url)
-51
View File
@@ -1,51 +0,0 @@
![Logo](https://github.com/rosarior/mayan/raw/master/docs/_static/mayan_logo_landscape_black.jpg)
Mayan EDMS
==========
Open source, Django based document management system with custom metadata
indexing, file serving integration, tagging, digital signature verification,
text parsing and OCR capabilities.
[Website](http://www.mayan-edms.com)
[Video demostration](http://bit.ly/pADNXv)
[Documentation](http://readthedocs.org/docs/mayan/en/latest/)
[Translations](https://www.transifex.net/projects/p/mayan-edms/)
[Mailing list (via Google Groups)](http://groups.google.com/group/mayan-edms)
Quick install
-------------
To bootstrap **Mayan EDMS** via the fabfile without having to clone the
entire repository, run the following command, replacing the part that
reads: <Your MySQL root password> with your current MySQL root password
or the MySQL root password you plan to assign to it, during the MySQL
installation when executing the fabfile.
- Debian or Ubuntu:
cd /tmp && sudo apt-get install -y fabric wget tar gzip && wget https://github.com/rosarior/mayan/raw/master/contrib/fabfile.tar.gz -O - | tar -xvzf - && echo "database_manager_admin_password=&lt;Your MySQL root password&gt;" > ~/.fabricrc && fab -H localhost install
- Fedora:
cd /tmp && sudo yum install -y fabric wget tar gzip && wget https://github.com/rosarior/mayan/raw/master/contrib/fabfile.tar.gz -O - | tar -xvzf - && echo "database_manager_admin_password=&lt;Your MySQL root password&gt;" > ~/.fabricrc && fab -H localhost install
License
-------
This project is open sourced under [GNU GPL Version 3](http://www.gnu.org/licenses/gpl-3.0.html).
Author
------
Roberto Rosario - [Twitter](http://twitter.com/#siloraptor) [E-mail](mailto://roberto.rosario@mayan-edms.com)
Donations
---------
Please [donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W6LMMZHTNUJ6L) if you are willing to support the further development of this project.
View File
-18
View File
@@ -1,18 +0,0 @@
from __future__ import absolute_import
from navigation.api import bind_links, register_multi_item_links
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)
bind_links([AccessHolder], [acl_detail])
register_multi_item_links(['acl_detail'], [acl_grant, acl_revoke])
bind_links([AccessObject], [acl_holder_new], menu_name='sidebar')
bind_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')
bind_links([ClassAccessHolder], [acl_class_acl_detail])
bind_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])
-23
View File
@@ -1,23 +0,0 @@
from __future__ import absolute_import
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):
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)
-28
View File
@@ -1,28 +0,0 @@
from __future__ import absolute_import
from django.contrib.contenttypes.models import ContentType
_class_permissions = {}
def class_permissions(cls, permission_list):
"""
Associate a permissions list to a class
"""
stored_permissions = _class_permissions.setdefault(cls, [])
stored_permissions.extend(permission_list)
def get_class_permissions_for(obj):
"""
Return a list of permissions associated with a content type
"""
content_type = ContentType.objects.get_for_model(obj)
return _class_permissions.get(content_type.model_class(), [])
def get_classes():
"""
Return a list of encapsulated classes that have been registered
"""
return _class_permissions.keys()
-17
View File
@@ -1,17 +0,0 @@
from common.classes import EncapsulatedObject
class AccessHolder(EncapsulatedObject):
source_object_name = u'holder_object'
class AccessObject(EncapsulatedObject):
source_object_name = u'obj'
class AccessObjectClass(EncapsulatedObject):
source_object_name = u'cls'
class ClassAccessHolder(EncapsulatedObject):
source_object_name = u'class_holder'
-8
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()
-58
View File
@@ -1,58 +0,0 @@
from __future__ import absolute_import
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User, Group
from permissions.models import Role
from common.utils import get_object_name
from common.models import AnonymousUserSingleton
from .classes import AccessHolder
from .models import CreatorSingleton
def _as_choice_list(holders):
return sorted([(AccessHolder.encapsulate(holder).gid, get_object_name(holder, display_object_type=False)) for holder in holders], key=lambda x: x[1])
class BaseHolderSelectionForm(forms.Form):
holder_gid = forms.ChoiceField(
label=_(u'New holder')
)
def __init__(self, *args, **kwargs):
current_holders = kwargs.pop('current_holders', [])
if current_holders:
current_holders = [holder.source_object for holder in current_holders]
staff_users = User.objects.filter(is_staff=True)
super_users = User.objects.filter(is_superuser=True)
users = set(User.objects.filter(is_active=True)) - set(staff_users) - set(super_users) - set(current_holders)
roles = set(Role.objects.all()) - set(current_holders)
groups = set(Group.objects.all()) - set(current_holders)
special = set(self.special_holders) - set(current_holders)
non_holder_list = []
if users:
non_holder_list.append((_(u'Users'), _as_choice_list(list(users))))
if groups:
non_holder_list.append((_(u'Groups'), _as_choice_list(list(groups))))
if roles:
non_holder_list.append((_(u'Roles'), _as_choice_list(list(roles))))
if special:
non_holder_list.append((_(u'Special'), _as_choice_list(list(special))))
super(BaseHolderSelectionForm, self).__init__(*args, **kwargs)
self.fields['holder_gid'].choices = non_holder_list
class HolderSelectionForm(BaseHolderSelectionForm):
special_holders = [AnonymousUserSingleton.objects.get()]
class ClassHolderSelectionForm(BaseHolderSelectionForm):
special_holders = [AnonymousUserSingleton.objects.get(), CreatorSingleton.objects.get()]
-20
View File
@@ -1,20 +0,0 @@
from __future__ import absolute_import
from icons.literals import (KEY, KEY_GO, KEY_ADD, KEY_DELETE, LOCK, USER_ADD,
PACKAGE, LOCK_GO)
from icons import Icon
icon_acl_app = Icon(LOCK)
icon_acls = Icon(KEY)
icon_acl_detail = Icon(KEY_GO)
icon_acl_grant = Icon(KEY_ADD)
icon_acl_revoke = Icon(KEY_DELETE)
icon_acl_holder_new = Icon(USER_ADD)
icon_acl_class_list = Icon(PACKAGE)
icon_acl_class_acl_list = Icon(LOCK_GO)
icon_acl_class_acl_detail = Icon(KEY_GO)
icon_acl_class_new_holder_for = Icon(USER_ADD)
icon_acl_class_grant = Icon(KEY_ADD)
icon_acl_class_revoke = Icon(KEY_DELETE)
-26
View File
@@ -1,26 +0,0 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .permissions import (ACLS_EDIT_ACL, ACLS_VIEW_ACL,
ACLS_CLASS_EDIT_ACL, ACLS_CLASS_VIEW_ACL)
from .icons import (icon_acls, icon_acl_detail, icon_acl_grant, icon_acl_revoke,
icon_acl_holder_new, icon_acl_class_list, icon_acl_class_acl_list,
icon_acl_class_acl_list, icon_acl_class_acl_detail, icon_acl_class_new_holder_for,
icon_acl_class_grant, icon_acl_class_revoke)
acl_list = Link(text=_(u'ACLs'), view='acl_list', icon=icon_acls, permissions=[ACLS_VIEW_ACL])
acl_detail = Link(text=_(u'details'), view='acl_detail', args=['access_object.gid', 'object.gid'], icon=icon_acl_detail, permissions=[ACLS_VIEW_ACL])
acl_grant = Link(text=_(u'grant'), view='acl_multiple_grant', icon=icon_acl_grant, permissions=[ACLS_EDIT_ACL])
acl_revoke = Link(text=_(u'revoke'), view='acl_multiple_revoke', icon=icon_acl_revoke, permissions=[ACLS_EDIT_ACL])
acl_holder_new = Link(text=_(u'New holder'), view='acl_holder_new', args='access_object.gid', icon=icon_acl_holder_new, permissions=[ACLS_EDIT_ACL])
acl_setup_valid_classes = Link(text=_(u'Default ACLs'), view='acl_setup_valid_classes', icon=icon_acl_class_list, permissions=[ACLS_CLASS_VIEW_ACL]) # 'children_view_regex=[r'^acl_class', r'^acl_setup']}
acl_class_list = Link(text=_(u'List of classes'), view='acl_setup_valid_classes', icon=icon_acl_class_list, permissions=[ACLS_CLASS_VIEW_ACL])
acl_class_acl_list = Link(text=_(u'ACLs for class'), view='acl_class_acl_list', args='object.gid', icon=icon_acl_class_acl_list, permissions=[ACLS_CLASS_VIEW_ACL])
acl_class_acl_detail = Link(text=_(u'details'), view='acl_class_acl_detail', args=['access_object_class.gid', 'object.gid'], icon=icon_acl_class_acl_detail, permissions=[ACLS_CLASS_VIEW_ACL])
acl_class_new_holder_for = Link(text=_(u'New holder'), view='acl_class_new_holder_for', args='object.gid', icon=icon_acl_class_new_holder_for, permissions=[ACLS_CLASS_EDIT_ACL])
acl_class_grant = Link(text=_(u'grant'), view='acl_class_multiple_grant', icon=icon_acl_class_grant, permissions=[ACLS_CLASS_EDIT_ACL])
acl_class_revoke = Link(text=_(u'revoke'), view='acl_class_multiple_revoke', icon=icon_acl_class_revoke, permissions=[ACLS_CLASS_EDIT_ACL])
-13
View File
@@ -1,13 +0,0 @@
# Content type <-> fam fam icon mapping
CONTENT_TYPE_ICON_MAP = {
'auth.user': 'user',
'auth.group': 'group',
'documents.document': 'page',
'permissions.role': 'medal_gold_1',
'folders.folder': 'folder',
'taggit.tag': 'tag_blue',
'linking.smartlink': 'page_link',
'common.anonymoususersingleton': 'user',
'acls.creatorsingleton': 'user',
}
Binary file not shown.
-255
View File
@@ -1,255 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Iliya Georgiev <ikgeorgiev@gmail.com>, 2012.
# <pkoldamov@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-10-15 10:27+0000\n"
"Last-Translator: Pavlin Koldamov <pkoldamov@gmail.com>\n"
"Language-Team: Bulgarian (http://www.transifex.com/projects/p/mayan-edms/"
"language/bg/)\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr "Нов притежател"
#: forms.py:38
msgid "Users"
msgstr "Потребители"
#: forms.py:41
msgid "Groups"
msgstr "Групи"
#: forms.py:44
msgid "Roles"
msgstr "Роли"
#: forms.py:47
msgid "Special"
msgstr ""
#: links.py:14
msgid "ACLs"
msgstr "Контролни списъци за достъп"
#: links.py:15 links.py:23
msgid "details"
msgstr "детайли"
#: links.py:16 links.py:25
msgid "grant"
msgstr "предоставяне"
#: links.py:17 links.py:26
msgid "revoke"
msgstr "отменя"
#: links.py:20
msgid "Default ACLs"
msgstr "Контролни списъци за достъп по подразбиране"
#: links.py:21
msgid "List of classes"
msgstr "Списък на класовете"
#: links.py:22
msgid "ACLs for class"
msgstr "Контролни списъци за клас"
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr "Недостатъчен достъп."
#: models.py:25 models.py:67
msgid "permission"
msgstr "разрешение"
#: models.py:51
msgid "access entry"
msgstr "достъп за влизане"
#: models.py:52
msgid "access entries"
msgstr "достъп вписвания"
#: models.py:88
msgid "default access entry"
msgstr ""
#: models.py:89
msgid "default access entries"
msgstr ""
#: models.py:108
msgid "Creator"
msgstr ""
#: models.py:111 models.py:112
msgid "creator"
msgstr ""
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Контролни списъци за достъп"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
#: permissions.py:11
msgid "View ACLs"
msgstr ""
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr ""
#: permissions.py:14
msgid "View class default ACLs"
msgstr ""
#: registry.py:10
#, fuzzy
msgid "ACL"
msgstr "Контролни списъци за достъп"
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr ""
#: views.py:49 views.py:409
msgid "holder"
msgstr ""
#: views.py:50 views.py:410
msgid "permissions"
msgstr "разрешения"
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr ""
#: views.py:104 views.py:442
msgid "namespace"
msgstr ""
#: views.py:105 views.py:443
msgid "label"
msgstr ""
#: views.py:107 views.py:445
msgid "has permission"
msgstr ""
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ""
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr " за %s"
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr " към %s"
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr "Сигурни ли сте, че искате да дадете разрешение за %(title_suffix)s?"
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr "Сигурни ли сте, че искате да дадете разрешения за %(title_suffix)s?"
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr ""
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr " от %s"
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr ""
"Сигурни ли сте, че искате да отнемете разрешението за %(title_suffix)s?"
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
"Сигурни ли сте, че искате да отнемете разрешенията за %(title_suffix)s?"
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr ""
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr ""
#: views.py:354 views.py:486
msgid "Select"
msgstr ""
#: views.py:386
msgid "classes"
msgstr "класове"
#: views.py:388
msgid "class"
msgstr "клас"
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr "правила за достъп по подразбиране за клас: %s"
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr ""
Binary file not shown.
@@ -1,261 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# <sl@suchreflex.de>, 2012.
# <tilmann.sittig@web.de>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-09-20 07:40+0000\n"
"Last-Translator: Manticor <sl@suchreflex.de>\n"
"Language-Team: German (Germany) (http://www.transifex.com/projects/p/mayan-"
"edms/language/de_DE/)\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr "Neuer Berechtigter"
#: forms.py:38
msgid "Users"
msgstr "Benutzer"
#: forms.py:41
msgid "Groups"
msgstr "Gruppen"
#: forms.py:44
msgid "Roles"
msgstr "Rollen"
#: forms.py:47
msgid "Special"
msgstr ""
#: links.py:14
msgid "ACLs"
msgstr "ACLs"
#: links.py:15 links.py:23
msgid "details"
msgstr "Details"
#: links.py:16 links.py:25
msgid "grant"
msgstr "Erlauben"
#: links.py:17 links.py:26
msgid "revoke"
msgstr "Entziehen"
#: links.py:20
msgid "Default ACLs"
msgstr "Standard-ACLs"
#: links.py:21
msgid "List of classes"
msgstr "Liste der Klassen"
#: links.py:22
msgid "ACLs for class"
msgstr "ACLs für Klasse"
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr "Unzureichender Zugriff."
#: models.py:25 models.py:67
msgid "permission"
msgstr "Berechtigung"
#: models.py:51
msgid "access entry"
msgstr "Zugriffsberechtigungseintrag"
#: models.py:52
msgid "access entries"
msgstr "Zugriffsberechtigungseinträge"
#: models.py:88
msgid "default access entry"
msgstr "Standard-Zugriffsberechtigungseintrag"
#: models.py:89
msgid "default access entries"
msgstr "Standard-Zugriffsberechtigungseinträge"
#: models.py:108
msgid "Creator"
msgstr ""
#: models.py:111 models.py:112
msgid "creator"
msgstr ""
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Zugriffsberechtigungslisten (ACLs)"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "ACLs bearbeiten"
#: permissions.py:11
msgid "View ACLs"
msgstr "ACLs anzeigen"
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr "Standard-ACLs für Klasse bearbeiten"
#: permissions.py:14
msgid "View class default ACLs"
msgstr "Standard-ACLs für Klasse anzeigen"
#: registry.py:10
#, fuzzy
msgid "ACL"
msgstr "ACLs"
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr "Zugriffberechtigungsliste für: %s"
#: views.py:49 views.py:409
msgid "holder"
msgstr "Berechtigter"
#: views.py:50 views.py:410
msgid "permissions"
msgstr "Berechtigungen"
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr "verfügbare Berechtigungen: %(actor)s für %(obj)s "
#: views.py:104 views.py:442
msgid "namespace"
msgstr "Namensraum"
#: views.py:105 views.py:443
msgid "label"
msgstr "Bezeichner"
#: views.py:107 views.py:445
msgid "has permission"
msgstr "hat die Berechtigung"
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ""
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr "für %s"
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr "zu %s"
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr ""
"Sind Sie sicher, dass Sie die Berechtigung %(title_suffix)s erteilen "
"möchten?"
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr ""
"Sind Sie sicher, dass Sie die Berechtigungen %(title_suffix)s erteilen "
"möchten?"
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr ""
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr "von %s"
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr ""
"Sind Sie sicher, dass Sie die Berechtigung %(title_suffix)s enziehen "
"möchten?"
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
"Sind Sie sicher, dass Sie die Berechtigungen %(title_suffix)s enziehen "
"möchten?"
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr ""
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr "neuen Berechtigten für %s hinzufügen"
#: views.py:354 views.py:486
msgid "Select"
msgstr ""
#: views.py:386
msgid "classes"
msgstr "Klassen"
#: views.py:388
msgid "class"
msgstr "Klasse"
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr ""
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr ""
Binary file not shown.
-249
View File
@@ -1,249 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr ""
#: forms.py:38
msgid "Users"
msgstr ""
#: forms.py:41
msgid "Groups"
msgstr ""
#: forms.py:44
msgid "Roles"
msgstr ""
#: forms.py:47
msgid "Special"
msgstr ""
#: links.py:14
msgid "ACLs"
msgstr ""
#: links.py:15 links.py:23
msgid "details"
msgstr ""
#: links.py:16 links.py:25
msgid "grant"
msgstr ""
#: links.py:17 links.py:26
msgid "revoke"
msgstr ""
#: links.py:20
msgid "Default ACLs"
msgstr ""
#: links.py:21
msgid "List of classes"
msgstr ""
#: links.py:22
msgid "ACLs for class"
msgstr ""
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr ""
#: models.py:25 models.py:67
msgid "permission"
msgstr ""
#: models.py:51
msgid "access entry"
msgstr ""
#: models.py:52
msgid "access entries"
msgstr ""
#: models.py:88
msgid "default access entry"
msgstr ""
#: models.py:89
msgid "default access entries"
msgstr ""
#: models.py:108
msgid "Creator"
msgstr ""
#: models.py:111 models.py:112
msgid "creator"
msgstr ""
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
#: permissions.py:11
msgid "View ACLs"
msgstr ""
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr ""
#: permissions.py:14
msgid "View class default ACLs"
msgstr ""
#: registry.py:10
msgid "ACL"
msgstr ""
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr ""
#: views.py:49 views.py:409
msgid "holder"
msgstr ""
#: views.py:50 views.py:410
msgid "permissions"
msgstr ""
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr ""
#: views.py:104 views.py:442
msgid "namespace"
msgstr ""
#: views.py:105 views.py:443
msgid "label"
msgstr ""
#: views.py:107 views.py:445
msgid "has permission"
msgstr ""
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ""
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr ""
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr ""
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr ""
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr ""
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr ""
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr ""
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr ""
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr ""
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr ""
#: views.py:354 views.py:486
msgid "Select"
msgstr ""
#: views.py:386
msgid "classes"
msgstr ""
#: views.py:388
msgid "class"
msgstr ""
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr ""
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr ""
Binary file not shown.
-253
View File
@@ -1,253 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Roberto Rosario <roberto.rosario.gonzalez@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-02-12 00:16+0000\n"
"Last-Translator: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/mayan-edms/"
"language/es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr "Nuevo titular"
#: forms.py:38
msgid "Users"
msgstr "Usuarios"
#: forms.py:41
msgid "Groups"
msgstr "Grupos"
#: forms.py:44
msgid "Roles"
msgstr "Funciones"
#: forms.py:47
msgid "Special"
msgstr "Especial"
#: links.py:14
msgid "ACLs"
msgstr "LCA"
#: links.py:15 links.py:23
msgid "details"
msgstr "detalles"
#: links.py:16 links.py:25
msgid "grant"
msgstr "otorgar"
#: links.py:17 links.py:26
msgid "revoke"
msgstr "revocar"
#: links.py:20
msgid "Default ACLs"
msgstr "LCA por defecto"
#: links.py:21
msgid "List of classes"
msgstr "Lista de clases"
#: links.py:22
msgid "ACLs for class"
msgstr "LCA para la clase"
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr "Acceso insuficiente."
#: models.py:25 models.py:67
msgid "permission"
msgstr "permiso"
#: models.py:51
msgid "access entry"
msgstr "entrada de acceso"
#: models.py:52
msgid "access entries"
msgstr "entradas de acceso"
#: models.py:88
msgid "default access entry"
msgstr "entrada de acceso por defecto"
#: models.py:89
msgid "default access entries"
msgstr "entradas de acceso por defecto"
#: models.py:108
msgid "Creator"
msgstr "Creador"
#: models.py:111 models.py:112
msgid "creator"
msgstr "creador"
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Listas de control de acceso"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editar LCA"
#: permissions.py:11
msgid "View ACLs"
msgstr "Ver LCA"
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr "Editar LCA por defecto de la clase"
#: permissions.py:14
msgid "View class default ACLs"
msgstr "Ver LCA por defecto de la clase"
#: registry.py:10
#, fuzzy
msgid "ACL"
msgstr "LCA"
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr "listas de control de acceso para: %s"
#: views.py:49 views.py:409
msgid "holder"
msgstr "titular"
#: views.py:50 views.py:410
msgid "permissions"
msgstr "permisos"
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr "permisos disponibles a: %(actor)s para %(obj)s "
#: views.py:104 views.py:442
msgid "namespace"
msgstr "espacio de nombres"
#: views.py:105 views.py:443
msgid "label"
msgstr "etiqueta"
#: views.py:107 views.py:445
msgid "has permission"
msgstr "tiene permiso"
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ", "
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr " para %s"
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr " a %s"
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr "¿Está seguro que desea conceder el permiso %(title_suffix)s?"
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr "¿Está seguro que desea conceder los permisos de %(title_suffix)s?"
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr "Permiso \"%(permission)s\" otorgado a %(actor)s para %(object)s."
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
"%(actor)s, ya tenía el permiso \"%(permission)s\", otorgado para %(object)s."
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr " de %s"
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr "¿Está seguro que desea revocar el permiso %(title_suffix)s?"
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr "¿Está seguro de querer revocar los permisos %(title_suffix)s?"
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr "Permiso \"%(permission)s\" revocado del %(actor)s para %(object)s."
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr "%(actor)s, no tenía el permiso \"%(permission)s\" para %(object)s."
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr "añadir nuevo titular para: %s"
#: views.py:354 views.py:486
msgid "Select"
msgstr "Seleccionar"
#: views.py:386
msgid "classes"
msgstr "clases"
#: views.py:388
msgid "class"
msgstr "clase"
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr "listas de control de acceso por defecto para la clase: %s"
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr "permisos disponibles para: %(actor)s para la clase %(class)s "
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr "añadir nuevo titular para la clase: %s"
Binary file not shown.
-258
View File
@@ -1,258 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Pierre Lhoste <peter.cathbad.host@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-07-28 15:20+0000\n"
"Last-Translator: Pierre Lhoste <peter.cathbad.host@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/projects/p/mayan-edms/"
"language/fr/)\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr "Nouveau détenteur"
#: forms.py:38
msgid "Users"
msgstr "Utilisateurs"
#: forms.py:41
msgid "Groups"
msgstr "Groupes"
#: forms.py:44
msgid "Roles"
msgstr "Rôles"
#: forms.py:47
msgid "Special"
msgstr "Spécial"
#: links.py:14
msgid "ACLs"
msgstr "ACLs"
#: links.py:15 links.py:23
msgid "details"
msgstr "détails"
#: links.py:16 links.py:25
msgid "grant"
msgstr "autoriser"
#: links.py:17 links.py:26
msgid "revoke"
msgstr "révoquer"
#: links.py:20
msgid "Default ACLs"
msgstr "ACLs par défaut"
#: links.py:21
msgid "List of classes"
msgstr "Liste des classes"
#: links.py:22
msgid "ACLs for class"
msgstr "ACLs pour la classe"
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr "Autorisations insuffisantes."
#: models.py:25 models.py:67
msgid "permission"
msgstr "autorisation"
#: models.py:51
msgid "access entry"
msgstr "autorisation d'accès"
#: models.py:52
msgid "access entries"
msgstr "autorisations d'accès"
#: models.py:88
msgid "default access entry"
msgstr "autorisation d'accès par défaut"
#: models.py:89
msgid "default access entries"
msgstr "autorisations d'accès par défaut"
#: models.py:108
msgid "Creator"
msgstr "Créateur"
#: models.py:111 models.py:112
msgid "creator"
msgstr "créateur"
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Listes de contrôle d'accès (ACL)"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Modifier ACLs"
#: permissions.py:11
msgid "View ACLs"
msgstr "Afficher ACLs"
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr "Modifier ACLs par défaut"
#: permissions.py:14
msgid "View class default ACLs"
msgstr "Afficher ACLs par défaut pour la classe"
#: registry.py:10
#, fuzzy
msgid "ACL"
msgstr "ACLs"
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr "Liste de contrôle d'accès (ACL) pour: %s"
#: views.py:49 views.py:409
msgid "holder"
msgstr "détenteur"
#: views.py:50 views.py:410
msgid "permissions"
msgstr "autorisations"
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr "autorisations pour: %(actor)s for %(obj)s"
#: views.py:104 views.py:442
msgid "namespace"
msgstr "espace de nommage"
#: views.py:105 views.py:443
msgid "label"
msgstr "label"
#: views.py:107 views.py:445
msgid "has permission"
msgstr "autorisation accordée "
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ","
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr "à %s"
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr "sur %s"
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr ""
"Êtes vous certain de vouloir attribuer l'autorisation %(title_suffix)s?"
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr ""
"Êtes vous certain de vouloir attribuer les autorisations %(title_suffix)s?"
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr "Autorisation \"%(permission)s\" accordée à %(actor)s sur %(object)s."
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
"%(actor)s, dispose déjà de l'autorisation \"%(permission)s\" accordée sur "
"%(object)s."
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr "de %s"
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr "Êtes vous certain de vouloir révoquer l'autorisation %(title_suffix)s?"
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
"Êtes vous certain de vouloir révoquer les autorisations %(title_suffix)s?"
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
"Autorisation \"%(permission)s\" révoquée pour %(actor)s sur %(object)s."
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr "%(actor)s, n'a pas l'autorisation \"%(permission)s\" sur %(object)s."
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr "ajouter un nouveau détenteur pour: %s"
#: views.py:354 views.py:486
msgid "Select"
msgstr "Sélectionner"
#: views.py:386
msgid "classes"
msgstr "classes"
#: views.py:388
msgid "class"
msgstr "classe"
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr "liste de contrôle d'accès (ACL) par défaut pour: %s"
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr "autorisations attribuées à: %(actor)s sur la classe %(class)s"
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr "ajouter un nouveau détenteur sur la classe: %s"
Binary file not shown.
-254
View File
@@ -1,254 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Carlo Zanatto <>, 2012.
# Pierpaolo Baldan <pierpaolo.baldan@gmail.com>, 2012.
# Roberto Rosario <roberto.rosario.gonzalez@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-06-08 07:20+0000\n"
"Last-Translator: Carlo Zanatto <>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/mayan-edms/"
"language/it/)\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr "Nuovo titolare"
#: forms.py:38
msgid "Users"
msgstr "Utenti"
#: forms.py:41
msgid "Groups"
msgstr "Gruppi"
#: forms.py:44
msgid "Roles"
msgstr "Ruoli"
#: forms.py:47
msgid "Special"
msgstr "Speciale"
#: links.py:14
msgid "ACLs"
msgstr "ACL"
#: links.py:15 links.py:23
msgid "details"
msgstr "dettagli"
#: links.py:16 links.py:25
msgid "grant"
msgstr "permetti"
#: links.py:17 links.py:26
msgid "revoke"
msgstr "revocare"
#: links.py:20
msgid "Default ACLs"
msgstr "Default ACL"
#: links.py:21
msgid "List of classes"
msgstr "Elenco delle classi"
#: links.py:22
msgid "ACLs for class"
msgstr "ACL per la classe"
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr "Accesso insufficiente."
#: models.py:25 models.py:67
msgid "permission"
msgstr "autorizzazione"
#: models.py:51
msgid "access entry"
msgstr "voce di accesso"
#: models.py:52
msgid "access entries"
msgstr "voci di accesso"
#: models.py:88
msgid "default access entry"
msgstr "accesso voce predefinita"
#: models.py:89
msgid "default access entries"
msgstr "voci di accesso predefinite "
#: models.py:108
msgid "Creator"
msgstr "Creatore"
#: models.py:111 models.py:112
msgid "creator"
msgstr "creatore"
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Liste di controllo accessi"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Modifica ACL"
#: permissions.py:11
msgid "View ACLs"
msgstr "Visualizza ACL"
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr "Modifica ACL predefiniti di classe"
#: permissions.py:14
msgid "View class default ACLs"
msgstr "Visualizza classi ACL predefinite"
#: registry.py:10
#, fuzzy
msgid "ACL"
msgstr "ACL"
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr "lista controllo accessi per: %s"
#: views.py:49 views.py:409
msgid "holder"
msgstr "titolare"
#: views.py:50 views.py:410
msgid "permissions"
msgstr "le autorizzazioni"
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr "autorizzazioni disponibili per: %(actor)s per %(obj)s "
#: views.py:104 views.py:442
msgid "namespace"
msgstr "namespace"
#: views.py:105 views.py:443
msgid "label"
msgstr "etichetta"
#: views.py:107 views.py:445
msgid "has permission"
msgstr "ha l'autorizzazione"
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ", "
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr "per %s"
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr "a %s"
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr "Sei sicuro di voler concedere l'autorizzazione %(title_suffix)s?"
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr "Sei sicuro di voler concedere permessi %(title_suffix)s?"
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr "Permesso \"%(permission)s\" concesso%(actor)s per %(object)s."
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr "%(actor)s, ha già i permessi\"%(permission)s\" concessi per%(object)s."
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr "da %s"
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr "Sei sicuro di voler revocare l'autorizzazione %(title_suffix)s?"
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr "Sei sicuro di voler revocare permessi %(title_suffix)s?"
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr "Permessi \"%(permission)s\" revocati al %(actor)s per %(object)s."
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr "%(actor)s, non ha i permessi\"%(permission)s\" per %(object)s."
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr "aggiungi nuovo titolare per: %s"
#: views.py:354 views.py:486
msgid "Select"
msgstr "Selezionare"
#: views.py:386
msgid "classes"
msgstr "classi"
#: views.py:388
msgid "class"
msgstr "classe"
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr "lista di default per il controllo accessi per la classe: %s"
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr "permessi disponibili per: %(actor)s per la classe %(class)s"
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr "aggiungi un nuovo titolare per la calsse: %s"
Binary file not shown.
@@ -1,250 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-01-02 09:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/"
"mayan-edms/language/nl_NL/)\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr ""
#: forms.py:38
msgid "Users"
msgstr ""
#: forms.py:41
msgid "Groups"
msgstr ""
#: forms.py:44
msgid "Roles"
msgstr ""
#: forms.py:47
msgid "Special"
msgstr ""
#: links.py:14
msgid "ACLs"
msgstr ""
#: links.py:15 links.py:23
msgid "details"
msgstr ""
#: links.py:16 links.py:25
msgid "grant"
msgstr ""
#: links.py:17 links.py:26
msgid "revoke"
msgstr ""
#: links.py:20
msgid "Default ACLs"
msgstr ""
#: links.py:21
msgid "List of classes"
msgstr ""
#: links.py:22
msgid "ACLs for class"
msgstr ""
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr ""
#: models.py:25 models.py:67
msgid "permission"
msgstr ""
#: models.py:51
msgid "access entry"
msgstr ""
#: models.py:52
msgid "access entries"
msgstr ""
#: models.py:88
msgid "default access entry"
msgstr ""
#: models.py:89
msgid "default access entries"
msgstr ""
#: models.py:108
msgid "Creator"
msgstr ""
#: models.py:111 models.py:112
msgid "creator"
msgstr ""
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
#: permissions.py:11
msgid "View ACLs"
msgstr ""
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr ""
#: permissions.py:14
msgid "View class default ACLs"
msgstr ""
#: registry.py:10
msgid "ACL"
msgstr ""
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr ""
#: views.py:49 views.py:409
msgid "holder"
msgstr ""
#: views.py:50 views.py:410
msgid "permissions"
msgstr ""
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr ""
#: views.py:104 views.py:442
msgid "namespace"
msgstr ""
#: views.py:105 views.py:443
msgid "label"
msgstr ""
#: views.py:107 views.py:445
msgid "has permission"
msgstr ""
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ""
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr ""
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr ""
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr ""
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr ""
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr ""
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr ""
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr ""
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr ""
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr ""
#: views.py:354 views.py:486
msgid "Select"
msgstr ""
#: views.py:386
msgid "classes"
msgstr ""
#: views.py:388
msgid "class"
msgstr ""
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr ""
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr ""
Binary file not shown.
-251
View File
@@ -1,251 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-01-02 09:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/mayan-edms/"
"language/pl/)\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr ""
#: forms.py:38
msgid "Users"
msgstr ""
#: forms.py:41
msgid "Groups"
msgstr ""
#: forms.py:44
msgid "Roles"
msgstr ""
#: forms.py:47
msgid "Special"
msgstr ""
#: links.py:14
msgid "ACLs"
msgstr ""
#: links.py:15 links.py:23
msgid "details"
msgstr ""
#: links.py:16 links.py:25
msgid "grant"
msgstr ""
#: links.py:17 links.py:26
msgid "revoke"
msgstr ""
#: links.py:20
msgid "Default ACLs"
msgstr ""
#: links.py:21
msgid "List of classes"
msgstr ""
#: links.py:22
msgid "ACLs for class"
msgstr ""
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr ""
#: models.py:25 models.py:67
msgid "permission"
msgstr ""
#: models.py:51
msgid "access entry"
msgstr ""
#: models.py:52
msgid "access entries"
msgstr ""
#: models.py:88
msgid "default access entry"
msgstr ""
#: models.py:89
msgid "default access entries"
msgstr ""
#: models.py:108
msgid "Creator"
msgstr ""
#: models.py:111 models.py:112
msgid "creator"
msgstr ""
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
#: permissions.py:11
msgid "View ACLs"
msgstr ""
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr ""
#: permissions.py:14
msgid "View class default ACLs"
msgstr ""
#: registry.py:10
msgid "ACL"
msgstr ""
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr ""
#: views.py:49 views.py:409
msgid "holder"
msgstr ""
#: views.py:50 views.py:410
msgid "permissions"
msgstr ""
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr ""
#: views.py:104 views.py:442
msgid "namespace"
msgstr ""
#: views.py:105 views.py:443
msgid "label"
msgstr ""
#: views.py:107 views.py:445
msgid "has permission"
msgstr ""
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ""
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr ""
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr ""
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr ""
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr ""
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr ""
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr ""
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr ""
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr ""
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr ""
#: views.py:354 views.py:486
msgid "Select"
msgstr ""
#: views.py:386
msgid "classes"
msgstr ""
#: views.py:388
msgid "class"
msgstr ""
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr ""
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr ""
Binary file not shown.
-252
View File
@@ -1,252 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Vítor Figueiró <vfigueiro@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-07-03 19:01+0000\n"
"Last-Translator: Vítor Figueiró <vfigueiro@gmail.com>\n"
"Language-Team: Portuguese (http://www.transifex.com/projects/p/mayan-edms/"
"language/pt/)\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr "Novo detentor"
#: forms.py:38
msgid "Users"
msgstr "Utilizadores"
#: forms.py:41
msgid "Groups"
msgstr "Grupos"
#: forms.py:44
msgid "Roles"
msgstr "Funções"
#: forms.py:47
msgid "Special"
msgstr "Especial"
#: links.py:14
msgid "ACLs"
msgstr "ACL's"
#: links.py:15 links.py:23
msgid "details"
msgstr "detalhes"
#: links.py:16 links.py:25
msgid "grant"
msgstr "conceder"
#: links.py:17 links.py:26
msgid "revoke"
msgstr "revogar"
#: links.py:20
msgid "Default ACLs"
msgstr "ACL's padrão"
#: links.py:21
msgid "List of classes"
msgstr "Lista de classes"
#: links.py:22
msgid "ACLs for class"
msgstr "ACL's para a classe"
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr "Acesso insuficiente."
#: models.py:25 models.py:67
msgid "permission"
msgstr "permissão"
#: models.py:51
msgid "access entry"
msgstr "entrada de acesso"
#: models.py:52
msgid "access entries"
msgstr "entradas de acesso"
#: models.py:88
msgid "default access entry"
msgstr "entrada de acesso padrão"
#: models.py:89
msgid "default access entries"
msgstr "entradas de acesso padrão"
#: models.py:108
msgid "Creator"
msgstr "Criador"
#: models.py:111 models.py:112
msgid "creator"
msgstr "criador"
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Listas de controlo de acesso"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Editar ACL's"
#: permissions.py:11
msgid "View ACLs"
msgstr "Ver ACL's"
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr "Editar os ACL's padrão da classe"
#: permissions.py:14
msgid "View class default ACLs"
msgstr "Ver os ACL's padrão da classe"
#: registry.py:10
#, fuzzy
msgid "ACL"
msgstr "ACL's"
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr "listas de controlo de acesso para: %s"
#: views.py:49 views.py:409
msgid "holder"
msgstr "detentor"
#: views.py:50 views.py:410
msgid "permissions"
msgstr "permissões"
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr "permissões disponíveis para: %(actor)s para %(obj)s"
#: views.py:104 views.py:442
msgid "namespace"
msgstr "escopo"
#: views.py:105 views.py:443
msgid "label"
msgstr "rótulo"
#: views.py:107 views.py:445
msgid "has permission"
msgstr "tem a permissão"
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ", "
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr " para %s"
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr " a %s"
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr "Tem a certeza de que pretende conceder a permissão %(title_suffix)s?"
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr "Tem a certeza de que pretende conceder as permissões %(title_suffix)s?"
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr "Permissão \"%(permission)s\" concedida a %(actor)s para %(object)s."
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr "%(actor)s, já possuia a permissão \"%(permission)s\" para %(object)s."
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr " de %s"
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr "Tem a certeza de que pretende revogar a permissão %(title_suffix)s?"
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr "Tem a certeza de que pretende revogar as permissões %(title_suffix)s?"
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr "Permissão \"%(permission)s\" revogada para %(actor)s para %(object)s."
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr "%(actor)s, não tinha a permissão \"%(permission)s\" para %(object)s."
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr "adicionar novo detentor para: %s"
#: views.py:354 views.py:486
msgid "Select"
msgstr "Selecionar"
#: views.py:386
msgid "classes"
msgstr "classes"
#: views.py:388
msgid "class"
msgstr "classe"
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr "Listas de controlo de acesso padrão para a classe: %s"
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr "permissões disponíveis para: %(actor)s para a classe %(class)s"
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr "adicionar novo detentor para a classe: %s"
Binary file not shown.
@@ -1,250 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-01-02 09:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/"
"mayan-edms/language/pt_BR/)\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr ""
#: forms.py:38
msgid "Users"
msgstr ""
#: forms.py:41
msgid "Groups"
msgstr ""
#: forms.py:44
msgid "Roles"
msgstr ""
#: forms.py:47
msgid "Special"
msgstr ""
#: links.py:14
msgid "ACLs"
msgstr ""
#: links.py:15 links.py:23
msgid "details"
msgstr ""
#: links.py:16 links.py:25
msgid "grant"
msgstr ""
#: links.py:17 links.py:26
msgid "revoke"
msgstr ""
#: links.py:20
msgid "Default ACLs"
msgstr ""
#: links.py:21
msgid "List of classes"
msgstr ""
#: links.py:22
msgid "ACLs for class"
msgstr ""
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr ""
#: models.py:25 models.py:67
msgid "permission"
msgstr ""
#: models.py:51
msgid "access entry"
msgstr ""
#: models.py:52
msgid "access entries"
msgstr ""
#: models.py:88
msgid "default access entry"
msgstr ""
#: models.py:89
msgid "default access entries"
msgstr ""
#: models.py:108
msgid "Creator"
msgstr ""
#: models.py:111 models.py:112
msgid "creator"
msgstr ""
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
#: permissions.py:11
msgid "View ACLs"
msgstr ""
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr ""
#: permissions.py:14
msgid "View class default ACLs"
msgstr ""
#: registry.py:10
msgid "ACL"
msgstr ""
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr ""
#: views.py:49 views.py:409
msgid "holder"
msgstr ""
#: views.py:50 views.py:410
msgid "permissions"
msgstr ""
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr ""
#: views.py:104 views.py:442
msgid "namespace"
msgstr ""
#: views.py:105 views.py:443
msgid "label"
msgstr ""
#: views.py:107 views.py:445
msgid "has permission"
msgstr ""
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ""
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr ""
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr ""
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr ""
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr ""
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr ""
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr ""
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr ""
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr ""
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr ""
#: views.py:354 views.py:486
msgid "Select"
msgstr ""
#: views.py:386
msgid "classes"
msgstr ""
#: views.py:388
msgid "class"
msgstr ""
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr ""
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr ""
Binary file not shown.
-253
View File
@@ -1,253 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Sergey Glita <gsv70@mail.ru>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-02-27 04:26+0000\n"
"Last-Translator: Sergey Glita <gsv70@mail.ru>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/mayan-edms/"
"language/ru/)\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: forms.py:21 links.py:18 links.py:24
msgid "New holder"
msgstr "Новый владелец"
#: forms.py:38
msgid "Users"
msgstr "Пользователи"
#: forms.py:41
msgid "Groups"
msgstr "Группы"
#: forms.py:44
msgid "Roles"
msgstr "Роли"
#: forms.py:47
msgid "Special"
msgstr "Специальный"
#: links.py:14
msgid "ACLs"
msgstr "Списки ACL"
#: links.py:15 links.py:23
msgid "details"
msgstr "детали"
#: links.py:16 links.py:25
msgid "grant"
msgstr "предоставить"
#: links.py:17 links.py:26
msgid "revoke"
msgstr "отозвать"
#: links.py:20
msgid "Default ACLs"
msgstr "ACL по умолчанию"
#: links.py:21
msgid "List of classes"
msgstr "Список классов"
#: links.py:22
msgid "ACLs for class"
msgstr "ACL для класса"
#: managers.py:119 managers.py:131
msgid "Insufficient access."
msgstr "Недостаточный доступ."
#: models.py:25 models.py:67
msgid "permission"
msgstr "разрешение"
#: models.py:51
msgid "access entry"
msgstr "запись доступа"
#: models.py:52
msgid "access entries"
msgstr "записи доступа"
#: models.py:88
msgid "default access entry"
msgstr "запись доступа по умолчанию"
#: models.py:89
msgid "default access entries"
msgstr "записи доступа по умолчанию"
#: models.py:108
msgid "Creator"
msgstr "Создатель"
#: models.py:111 models.py:112
msgid "creator"
msgstr "создатель"
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr "Списки контроля доступа"
#: permissions.py:10
msgid "Edit ACLs"
msgstr "Редактировать списки ACL"
#: permissions.py:11
msgid "View ACLs"
msgstr "Просмотр списков ACL"
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr "Редактировать списки ACL класса по умолчанию"
#: permissions.py:14
msgid "View class default ACLs"
msgstr "Просмотр списков ACL класса по умолчанию"
#: registry.py:10
#, fuzzy
msgid "ACL"
msgstr "Списки ACL"
#: registry.py:11
msgid "Handles object level access control."
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr "списки контроля доступа для %s"
#: views.py:49 views.py:409
msgid "holder"
msgstr "владелец"
#: views.py:50 views.py:410
msgid "permissions"
msgstr "разрешения"
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr "разрешения, доступные %(actor)s для %(obj)s"
#: views.py:104 views.py:442
msgid "namespace"
msgstr "пространство имен"
#: views.py:105 views.py:443
msgid "label"
msgstr "этикетка"
#: views.py:107 views.py:445
msgid "has permission"
msgstr "имеет разрешение"
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ","
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr "для %s"
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr "до %s"
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr "Вы действительно хотите предоставить разрешение %(title_suffix)s?"
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr "Вы уверены, что хотите предоставить разрешения %(title_suffix)s?"
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr "Право \"%(permission)s\" проедоставлено %(actor)s для %(object)s."
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr "%(actor)s, уже имеет право \"%(permission)s\" для %(object)s."
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr "от%s"
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr "Вы уверены, что хотите отменить разрешение %(title_suffix)s?"
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr "Вы уверены, что хотите отменить разрешение %(title_suffix)s?"
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr "Право \"%(permission)s\" для %(object)s отозвано у %(actor)s."
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr "%(actor)s не имеет права \"%(permission)s\" для %(object)s."
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr "добавить нового владельца для %s"
#: views.py:354 views.py:486
msgid "Select"
msgstr "Выбор"
#: views.py:386
msgid "classes"
msgstr "классы"
#: views.py:388
msgid "class"
msgstr "класс"
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr "списки контроля доступа умолчанию для класса %s"
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr "разрешения доступные %(actor)s для класса %(class)s"
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr "добавить нового владельца для класса %s"
@@ -1,241 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: http://github.com/rosarior/mayan/issues\n"
"POT-Creation-Date: 2012-12-12 01:48-0400\n"
"PO-Revision-Date: 2012-01-02 09:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/mayan-edms/language/sl_SI/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sl_SI\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
#: __init__.py:14
msgid "ACLs"
msgstr ""
#: __init__.py:15 __init__.py:23
msgid "details"
msgstr ""
#: __init__.py:16 __init__.py:25
msgid "grant"
msgstr ""
#: __init__.py:17 __init__.py:26
msgid "revoke"
msgstr ""
#: __init__.py:18 __init__.py:24 forms.py:21
msgid "New holder"
msgstr ""
#: __init__.py:20
msgid "Default ACLs"
msgstr ""
#: __init__.py:21
msgid "List of classes"
msgstr ""
#: __init__.py:22
msgid "ACLs for class"
msgstr ""
#: forms.py:38
msgid "Users"
msgstr ""
#: forms.py:41
msgid "Groups"
msgstr ""
#: forms.py:44
msgid "Roles"
msgstr ""
#: forms.py:47
msgid "Special"
msgstr ""
#: managers.py:118 managers.py:130
msgid "Insufficient access."
msgstr ""
#: models.py:25 models.py:67
msgid "permission"
msgstr ""
#: models.py:51
msgid "access entry"
msgstr ""
#: models.py:52
msgid "access entries"
msgstr ""
#: models.py:88
msgid "default access entry"
msgstr ""
#: models.py:89
msgid "default access entries"
msgstr ""
#: models.py:108
msgid "Creator"
msgstr ""
#: models.py:111 models.py:112
msgid "creator"
msgstr ""
#: permissions.py:7 permissions.py:8
msgid "Access control lists"
msgstr ""
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
#: permissions.py:11
msgid "View ACLs"
msgstr ""
#: permissions.py:13
msgid "Edit class default ACLs"
msgstr ""
#: permissions.py:14
msgid "View class default ACLs"
msgstr ""
#: views.py:47
#, python-format
msgid "access control lists for: %s"
msgstr ""
#: views.py:49 views.py:409
msgid "holder"
msgstr ""
#: views.py:50 views.py:410
msgid "permissions"
msgstr ""
#: views.py:97
#, python-format
msgid "permissions available to: %(actor)s for %(obj)s"
msgstr ""
#: views.py:104 views.py:442
msgid "namespace"
msgstr ""
#: views.py:105 views.py:443
msgid "label"
msgstr ""
#: views.py:107 views.py:445
msgid "has permission"
msgstr ""
#: views.py:184 views.py:277 views.py:525 views.py:604
msgid ", "
msgstr ""
#: views.py:185 views.py:278 views.py:526 views.py:605
#, python-format
msgid " for %s"
msgstr ""
#: views.py:186 views.py:527
#, python-format
msgid " to %s"
msgstr ""
#: views.py:189 views.py:530
#, python-format
msgid "Are you sure you wish to grant the permission %(title_suffix)s?"
msgstr ""
#: views.py:191 views.py:532
#, python-format
msgid "Are you sure you wish to grant the permissions %(title_suffix)s?"
msgstr ""
#: views.py:198 views.py:539
#, python-format
msgid "Permission \"%(permission)s\" granted to %(actor)s for %(object)s."
msgstr ""
#: views.py:204 views.py:545
#, python-format
msgid ""
"%(actor)s, already had the permission \"%(permission)s\" granted for "
"%(object)s."
msgstr ""
#: views.py:279 views.py:606
#, python-format
msgid " from %s"
msgstr ""
#: views.py:282 views.py:609
#, python-format
msgid "Are you sure you wish to revoke the permission %(title_suffix)s?"
msgstr ""
#: views.py:284 views.py:611
#, python-format
msgid "Are you sure you wish to revoke the permissions %(title_suffix)s?"
msgstr ""
#: views.py:291 views.py:618
#, python-format
msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
msgstr ""
#: views.py:297 views.py:624
#, python-format
msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
msgstr ""
#: views.py:353
#, python-format
msgid "add new holder for: %s"
msgstr ""
#: views.py:354 views.py:486
msgid "Select"
msgstr ""
#: views.py:386
msgid "classes"
msgstr ""
#: views.py:388
msgid "class"
msgstr ""
#: views.py:407
#, python-format
msgid "default access control lists for class: %s"
msgstr ""
#: views.py:435
#, python-format
msgid "permissions available to: %(actor)s for class %(class)s"
msgstr ""
#: views.py:484
#, python-format
msgid "add new holder for class: %s"
msgstr ""
-331
View File
@@ -1,331 +0,0 @@
from __future__ import absolute_import
import logging
from django.db import models
from django.utils.translation import ugettext
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
from django.db.models import Q
from common.models import AnonymousUserSingleton
from common.classes import get_source_object
from permissions.models import Permission, RoleMember
from .classes import AccessHolder, ClassAccessHolder
logger = logging.getLogger(__name__)
class AccessEntryManager(models.Manager):
"""
Implement a 3 tier permission system, involving a permissions, an actor
and an object
"""
def grant(self, permission, actor, obj):
"""
Grant a permission (what), (to) an actor, (on) a specific object
"""
obj = get_source_object(obj)
actor = get_source_object(actor)
access_entry, created = self.model.objects.get_or_create(
permission=permission,
holder_type=ContentType.objects.get_for_model(actor),
holder_id=actor.pk,
content_type=ContentType.objects.get_for_model(obj),
object_id=obj.pk
)
return created
def revoke(self, permission, actor, obj):
"""
Revoke a permission (what), (from) an actor, (on) a specific object
"""
obj = get_source_object(obj)
actor = get_source_object(actor)
try:
access_entry = self.model.objects.get(
permission=permission,
holder_type=ContentType.objects.get_for_model(actor),
holder_id=actor.pk,
content_type=ContentType.objects.get_for_model(obj),
object_id=obj.pk
)
except self.model.DoesNotExist:
return False
else:
access_entry.delete()
return True
def has_access(self, permission, actor, obj, db_only=False):
"""
Returns whether an actor has a specific permission for an object
"""
obj = get_source_object(obj)
actor = get_source_object(actor)
if isinstance(actor, User) and db_only == False:
# db_only causes the return of only the stored permissions
# and not the perceived permissions for an actor
if actor.is_superuser or actor.is_staff:
return True
actor = AnonymousUserSingleton.objects.passthru_check(actor)
try:
content_type = ContentType.objects.get_for_model(obj)
except AttributeError:
# Object doesn't have a content type, therefore allow access
return True
try:
self.model.objects.get(
permission=permission.get_stored_permission(),
holder_type=ContentType.objects.get_for_model(actor),
holder_id=actor.pk,
content_type=content_type,
object_id=obj.pk
)
except self.model.DoesNotExist:
# If not check if the actor's memberships is one of
# the access's holder?
roles = RoleMember.objects.get_roles_for_member(actor)
if isinstance(actor, User):
groups = actor.groups.all()
else:
groups = []
for membership in list(set(roles) | set(groups)):
if self.has_access(permission, membership, obj, db_only):
return True
logger.debug('Fallthru')
return False
else:
return True
def check_access(self, permission, actor, obj):
# TODO: Merge with has_access
obj = get_source_object(obj)
actor = get_source_object(actor)
if self.has_access(permission, actor, obj):
return True
else:
raise PermissionDenied(ugettext(u'Insufficient access.'))
def check_accesses(self, permission_list, actor, obj):
"""
Returns whether an actor has at least one of a list of permissions for an object
"""
obj = get_source_object(obj)
actor = get_source_object(actor)
for permission in permission_list:
if self.has_access(permission, actor, obj):
return True
raise PermissionDenied(ugettext(u'Insufficient access.'))
def get_allowed_class_objects(self, permission, actor, cls, related=None):
logger.debug('related: %s' % related)
actor = AnonymousUserSingleton.objects.passthru_check(actor)
actor_type = ContentType.objects.get_for_model(actor)
content_type = ContentType.objects.get_for_model(cls)
# Calculate actor role membership ACL query
total_queries = Q()
for role in RoleMember.objects.get_roles_for_member(actor):
role_type = ContentType.objects.get_for_model(role)
if related:
query = Q(holder_type=role_type, holder_id=role.pk, permission=permission.get_stored_permission)
else:
query = Q(holder_type=role_type, holder_id=role.pk, content_type=content_type, permission=permission.get_stored_permission)
if not total_queries:
total_queries = query
else:
total_queries = total_queries | query
# Calculate actor group membership ACL query
if isinstance(actor, User):
groups = actor.groups.all()
else:
groups = []
for group in groups:
group_type = ContentType.objects.get_for_model(group)
if related:
query = Q(holder_type=group_type, holder_id=group.pk, permission=permission.get_stored_permission)
else:
query = Q(holder_type=group_type, holder_id=group.pk, content_type=content_type, permission=permission.get_stored_permission)
if not total_queries:
total_queries = query
else:
total_queries = total_queries | query
if related:
actor_query = Q(holder_type=actor_type, holder_id=actor.pk, permission=permission.get_stored_permission)
master_list = [obj.content_object for obj in self.model.objects.select_related().filter(actor_query | total_queries)]
logger.debug('master_list: %s' % master_list)
# TODO: update to use Q objects and check performance diff
# kwargs = {'%s__in' % related: master_list}
# Q(**kwargs)
return (obj for obj in cls.objects.all() if getattr(obj, related) in master_list)
else:
actor_query = Q(holder_type=actor_type, holder_id=actor.pk, content_type=content_type, permission=permission.get_stored_permission)
return (obj.content_object for obj in self.model.objects.filter(actor_query | total_queries))
def get_acl_url(self, obj):
content_type = ContentType.objects.get_for_model(obj)
return reverse('acl_list', args=[content_type.app_label, content_type.model, obj.pk])
def get_new_holder_url(self, obj):
content_type = ContentType.objects.get_for_model(obj)
return reverse('acl_new_holder_for', args=[content_type.app_label, content_type.model, obj.pk])
def get_holders_for(self, obj):
content_type = ContentType.objects.get_for_model(obj)
holder_list = []
for access_entry in self.model.objects.filter(content_type=content_type, object_id=obj.pk):
if access_entry.holder_object:
# Don't add references to non existant content type objects
entry = AccessHolder.encapsulate(access_entry.holder_object)
if entry not in holder_list:
holder_list.append(entry)
return holder_list
def get_holder_permissions_for(self, obj, actor, db_only=False):
"""
Returns a list of actors that hold at least one permission for
a specific object
"""
logger.debug('obj: %s' % obj)
logger.debug('actor: %s' % actor)
if isinstance(actor, User) and db_only == False:
if actor.is_superuser or actor.is_staff:
return Permission.objects.all()
actor_type = ContentType.objects.get_for_model(actor)
content_type = ContentType.objects.get_for_model(obj)
return (access.permission for access in self.model.objects.filter(content_type=content_type, object_id=obj.pk, holder_type=actor_type, holder_id=actor.pk))
def filter_objects_by_access(self, permission, actor, object_list, exception_on_empty=False, related=None):
"""
Filter a list of objects or a QuerySet elements depending on
whether the actor holds the specified permission
"""
logger.debug('exception_on_empty: %s' % exception_on_empty)
logger.debug('object_list: %s' % object_list)
if isinstance(actor, User):
if actor.is_superuser or actor.is_staff:
return object_list
try:
if object_list.count() == 0:
return object_list
except TypeError:
# object_list is not a queryset
if len(object_list) == 0:
return object_list
try:
# Try to process as a QuerySet
qs = object_list.filter(pk__in=[obj.pk for obj in self.get_allowed_class_objects(permission, actor, object_list[0].__class__, related)])
logger.debug('qs: %s' % qs)
if qs.count() == 0 and exception_on_empty == True:
raise PermissionDenied
return qs
except AttributeError:
# Fallback to a filtered list
object_list = list(set(object_list) & set(self.get_allowed_class_objects(permission, actor, object_list[0].__class__, related)))
logger.debug('object_list: %s' % object_list)
if len(object_list) == 0 and exception_on_empty == True:
raise PermissionDenied
return object_list
class DefaultAccessEntryManager(models.Manager):
"""
Implement a 3 tier permission system, involving a permission, an actor
and a class or content type. This model keeps track of the access
control lists that will be added when an instance of the recorded
content type is created.
"""
def get_holders_for(self, cls):
cls = get_source_object(cls)
content_type = ContentType.objects.get_for_model(cls)
holder_list = []
for access_entry in self.model.objects.filter(content_type=content_type):
if access_entry.holder_object:
# Don't add references to non existant content type objects
entry = ClassAccessHolder.encapsulate(access_entry.holder_object)
if entry not in holder_list:
holder_list.append(entry)
return holder_list
def has_access(self, permission, actor, cls):
if isinstance(actor, User):
if actor.is_superuser or actor.is_staff:
return True
try:
self.model.objects.get(
permission=permission.get_stored_permission(),
holder_type=ContentType.objects.get_for_model(actor),
holder_id=actor.pk,
content_type=ContentType.objects.get_for_model(cls),
)
except self.model.DoesNotExist:
return False
else:
return True
def grant(self, permission, actor, cls):
"""
Grant a permission (what), (to) an actor, (on) a specific class
"""
access_entry, created = self.model.objects.get_or_create(
permission=permission,
holder_type=ContentType.objects.get_for_model(actor),
holder_id=actor.pk,
content_type=ContentType.objects.get_for_model(cls),
)
return created
def revoke(self, permission, actor, cls):
"""
Revoke a permission (what), (from) an actor, (on) a specific class
"""
try:
access_entry = self.model.objects.get(
permission=permission,
holder_type=ContentType.objects.get_for_model(actor),
holder_id=actor.pk,
content_type=ContentType.objects.get_for_model(cls),
)
access_entry.delete()
return True
except self.model.DoesNotExist:
return False
def get_holder_permissions_for(self, cls, actor):
if isinstance(actor, User):
if actor.is_superuser or actor.is_staff:
return Permission.objects.all()
actor_type = ContentType.objects.get_for_model(actor)
content_type = ContentType.objects.get_for_model(cls)
return [access.permission for access in self.model.objects.filter(content_type=content_type, holder_type=actor_type, holder_id=actor.pk)]
-89
View File
@@ -1,89 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'AccessEntry'
db.create_table('acls_accessentry', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('permission', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['permissions.StoredPermission'])),
('holder_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='access_holder', to=orm['contenttypes.ContentType'])),
('holder_id', self.gf('django.db.models.fields.PositiveIntegerField')()),
('content_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='object_content_type', to=orm['contenttypes.ContentType'])),
('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()),
))
db.send_create_signal('acls', ['AccessEntry'])
# Adding model 'DefaultAccessEntry'
db.create_table('acls_defaultaccessentry', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('permission', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['permissions.StoredPermission'])),
('holder_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='default_access_entry_holder', to=orm['contenttypes.ContentType'])),
('holder_id', self.gf('django.db.models.fields.PositiveIntegerField')()),
('content_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='default_access_entry_class', to=orm['contenttypes.ContentType'])),
))
db.send_create_signal('acls', ['DefaultAccessEntry'])
# Adding model 'CreatorSingleton'
db.create_table('acls_creatorsingleton', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('lock_id', self.gf('django.db.models.fields.CharField')(default=1, unique=True, max_length=1)),
))
db.send_create_signal('acls', ['CreatorSingleton'])
def backwards(self, orm):
# Deleting model 'AccessEntry'
db.delete_table('acls_accessentry')
# Deleting model 'DefaultAccessEntry'
db.delete_table('acls_defaultaccessentry')
# Deleting model 'CreatorSingleton'
db.delete_table('acls_creatorsingleton')
models = {
'acls.accessentry': {
'Meta': {'object_name': 'AccessEntry'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'object_content_type'", 'to': "orm['contenttypes.ContentType']"}),
'holder_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'holder_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'access_holder'", 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.StoredPermission']"})
},
'acls.creatorsingleton': {
'Meta': {'object_name': 'CreatorSingleton'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'lock_id': ('django.db.models.fields.CharField', [], {'default': '1', 'unique': 'True', 'max_length': '1'})
},
'acls.defaultaccessentry': {
'Meta': {'object_name': 'DefaultAccessEntry'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'default_access_entry_class'", 'to': "orm['contenttypes.ContentType']"}),
'holder_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'holder_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'default_access_entry_holder'", 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.StoredPermission']"})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'permissions.storedpermission': {
'Meta': {'ordering': "('namespace',)", 'unique_together': "(('namespace', 'name'),)", 'object_name': 'StoredPermission'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'namespace': ('django.db.models.fields.CharField', [], {'max_length': '64'})
}
}
complete_apps = ['acls']
View File
-112
View File
@@ -1,112 +0,0 @@
from __future__ import absolute_import
import logging
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from permissions.models import StoredPermission
from common.models import Singleton, SingletonManager
from .managers import AccessEntryManager, DefaultAccessEntryManager
from .classes import AccessObjectClass
from .api import get_classes
logger = logging.getLogger(__name__)
class AccessEntry(models.Model):
"""
Model that hold the permission, object, actor relationship
"""
permission = models.ForeignKey(StoredPermission, verbose_name=_(u'permission'))
holder_type = models.ForeignKey(
ContentType,
related_name='access_holder',
limit_choices_to={'model__in': ('user', 'group', 'role')}
)
holder_id = models.PositiveIntegerField()
holder_object = generic.GenericForeignKey(
ct_field='holder_type',
fk_field='holder_id'
)
content_type = models.ForeignKey(
ContentType,
related_name='object_content_type'
)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey(
ct_field='content_type',
fk_field='object_id'
)
objects = AccessEntryManager()
class Meta:
verbose_name = _(u'access entry')
verbose_name_plural = _(u'access entries')
def __unicode__(self):
return u'%s: %s' % (self.content_type, self.content_object)
class DefaultAccessEntry(models.Model):
"""
Model that holds the permission, class, actor relationship, that will
be added upon the creation of an instance of said class
"""
@classmethod
def get_classes(cls):
return [AccessObjectClass.encapsulate(cls) for cls in get_classes()]
permission = models.ForeignKey(StoredPermission, verbose_name=_(u'permission'))
holder_type = models.ForeignKey(
ContentType,
limit_choices_to={'model__in': ('user', 'group', 'role')},
related_name='default_access_entry_holder'
)
holder_id = models.PositiveIntegerField()
holder_object = generic.GenericForeignKey(
ct_field='holder_type',
fk_field='holder_id'
)
content_type = models.ForeignKey(
ContentType,
related_name='default_access_entry_class'
)
objects = DefaultAccessEntryManager()
class Meta:
verbose_name = _(u'default access entry')
verbose_name_plural = _(u'default access entries')
def __unicode__(self):
return u'%s: %s' % (self.content_type, self.content_object)
class CreatorSingletonManager(SingletonManager):
def passthru_check(self, holder, creator=None):
if isinstance(holder, self.model):
# TODO: raise explicit error if is instance and creator=None
return creator
else:
return holder
class CreatorSingleton(Singleton):
objects = CreatorSingletonManager()
def __unicode__(self):
return ugettext('Creator')
class Meta:
verbose_name = _(u'creator')
verbose_name_plural = _(u'creator')
-14
View File
@@ -1,14 +0,0 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from permissions.models import PermissionNamespace, Permission
acls_namespace = PermissionNamespace('acls', _(u'Access control lists'))
acls_setup_namespace = PermissionNamespace('acls_setup', _(u'Access control lists'))
ACLS_EDIT_ACL = Permission.objects.register(acls_namespace, 'acl_edit', _(u'Edit ACLs'))
ACLS_VIEW_ACL = Permission.objects.register(acls_namespace, 'acl_view', _(u'View ACLs'))
ACLS_CLASS_EDIT_ACL = Permission.objects.register(acls_setup_namespace, 'acl_class_edit', _(u'Edit class default ACLs'))
ACLS_CLASS_VIEW_ACL = Permission.objects.register(acls_setup_namespace, 'acl_class_view', _(u'View class default ACLs'))
-20
View File
@@ -1,20 +0,0 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from .cleanup import cleanup
from .icons import icon_acl_app
from .links import acl_setup_valid_classes
name = 'acls'
label = _(u'ACL')
description = _(u'Handles object level access control.')
icon = icon_acl_app
setup_links = [acl_setup_valid_classes]
dependencies = ['app_registry', 'permissions', 'navigation']
bootstrap_models = [
{
'name': 'defaultaccessentry',
},
]
cleanup_functions = [cleanup]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File
-71
View File
@@ -1,71 +0,0 @@
import logging
from django.core.exceptions import PermissionDenied
from django.template import (TemplateSyntaxError, Library,
Node, Variable, VariableDoesNotExist)
from acls.models import AccessEntry
register = Library()
logger = logging.getLogger(__name__)
class CheckAccessNode(Node):
def __init__(self, permission_list=None, requester=None, obj=None, *args, **kwargs):
self.requester = requester
self.permission_list = permission_list
self.obj = obj
def render(self, context):
permission_list = Variable(self.permission_list).resolve(context)
logger.debug('permission_list: %s' % u','.join([unicode(p) for p in permission_list]))
try:
# Check access_object, useful for document_page views
obj = Variable('access_object').resolve(context)
logger.debug('access_object: %s' % obj)
except VariableDoesNotExist:
try:
obj = Variable(self.obj).resolve(context)
logger.debug('obj: %s' % obj)
except VariableDoesNotExist:
context[u'access'] = False
logger.debug('no obj, access False')
return u''
if not permission_list:
# There is no permissions list to check against which means
# this link is available for all
context[u'access'] = True
return u''
requester = Variable(self.requester).resolve(context)
logger.debug('requester: %s' % requester)
if obj:
try:
AccessEntry.objects.check_accesses(permission_list, requester, obj)
except PermissionDenied:
context[u'access'] = False
logger.debug('access: False')
return u''
else:
context[u'access'] = True
logger.debug('access: True')
return u''
else:
context[u'access'] = False
logger.debug('No object, access: False')
return u''
@register.tag
def check_access(parser, token):
try:
# Splitting by None == splitting by spaces.
tag_name, args = token.contents.split(None, 1)
except ValueError:
raise TemplateSyntaxError(u'%r tag requires arguments' % token.contents.split()[0])
return CheckAccessNode(*args.split())
-20
View File
@@ -1,20 +0,0 @@
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('acls.views',
url(r'^new_holder_for/(?P<app_label>[-\w]+)/(?P<model_name>[-\w]+)/(?P<object_id>\d+)/$', 'acl_new_holder_for', (), 'acl_new_holder_for'),
url(r'^list_for/(?P<app_label>[-\w]+)/(?P<model_name>[-\w]+)/(?P<object_id>\d+)/$', 'acl_list', (), 'acl_list'),
url(r'^details/(?P<access_object_gid>[.\w]+)/holder/(?P<holder_object_gid>[.\w]+)/$', 'acl_detail', (), 'acl_detail'),
url(r'^holder/new/(?P<access_object_gid>[.\w]+)/$', 'acl_holder_new', (), 'acl_holder_new'),
url(r'^multiple/grant/$', 'acl_grant', (), 'acl_multiple_grant'),
url(r'^multiple/revoke/$', 'acl_revoke', (), 'acl_multiple_revoke'),
url(r'^class/$', 'acl_setup_valid_classes', (), 'acl_setup_valid_classes'),
url(r'^class/details/(?P<access_object_class_gid>[.\w]+)/holder/(?P<holder_object_gid>[.\w]+)/$', 'acl_class_acl_detail', (), 'acl_class_acl_detail'),
url(r'^class/list_for/(?P<access_object_class_gid>[.\w]+)/$', 'acl_class_acl_list', (), 'acl_class_acl_list'),
url(r'^class/holder/new/(?P<access_object_class_gid>[.\w]+)/$', 'acl_class_new_holder_for', (), 'acl_class_new_holder_for'),
url(r'^class/multiple/grant/$', 'acl_class_multiple_grant', (), 'acl_class_multiple_grant'),
url(r'^class/multiple/revoke/$', 'acl_class_multiple_revoke', (), 'acl_class_multiple_revoke'),
)
-34
View File
@@ -1,34 +0,0 @@
from __future__ import absolute_import
import logging
from django.contrib.contenttypes.models import ContentType
from common.classes import get_source_object
from common.models import AnonymousUserSingleton
from .models import AccessEntry, DefaultAccessEntry, CreatorSingleton
logger = logging.getLogger(__name__)
def apply_default_acls(obj, actor=None):
logger.debug('actor, init: %s' % actor)
obj = get_source_object(obj)
if actor:
actor = AnonymousUserSingleton.objects.passthru_check(actor)
content_type = ContentType.objects.get_for_model(obj)
for default_acl in DefaultAccessEntry.objects.filter(content_type=content_type):
holder = CreatorSingleton.objects.passthru_check(default_acl.holder_object, actor)
if holder:
# When the creator is admin
access_entry = AccessEntry(
permission=default_acl.permission,
holder_object=holder,
content_object=obj,
)
access_entry.save()
-649
View File
File diff suppressed because it is too large Load Diff
-27
View File
@@ -1,27 +0,0 @@
from __future__ import absolute_import
from django.utils.safestring import mark_safe
from django.contrib.contenttypes.models import ContentType
from django.db.models.base import ModelBase
from django.template.defaultfilters import capfirst
from .literals import CONTENT_TYPE_ICON_MAP
def content_type_icon(content_type):
return mark_safe(u'<span class="famfam active famfam-%s"></span>' % CONTENT_TYPE_ICON_MAP.get('%s.%s' % (content_type.app_label, content_type.model), 'help'))
def object_w_content_type_icon(obj):
content_type = ContentType.objects.get_for_model(obj)
ct_fullname = '%s.%s' % (content_type.app_label, content_type.name)
if isinstance(obj, ModelBase):
label = getattr(obj._meta, 'verbose_name_plural', unicode(content_type))
else:
if ct_fullname == 'auth.user':
label = obj.get_full_name()
else:
label = unicode(obj)
return mark_safe('%s<span>%s</span>' % (content_type_icon(content_type), capfirst(label)))
-23
View File
@@ -1,23 +0,0 @@
from __future__ import absolute_import
import logging
from django.conf import settings
from django.utils.importlib import import_module
from .models import App
logger = logging.getLogger(__name__)
def register_apps():
for app_name in settings.INSTALLED_APPS:
logger.debug('registering: %s' % app_name)
App.register(app_name)
try:
post_init = import_module('%s.post_init' % app_name)
except ImportError:
logger.debug('Unable to import post_init module from: %s' % app_name)
register_apps()
-6
View File
@@ -1,6 +0,0 @@
from __future__ import absolute_import
from icons.literals import PLUGIN
from icons import Icon
icon_app = Icon(PLUGIN)
-10
View File
@@ -1,10 +0,0 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .icons import icon_app
app_registry_tool_link = Link(text=_(u'Apps'), view='app_list', icon=icon_app)#, permissions=[PERMISSION_BACKUP_JOB_VIEW])
app_list = Link(text=_(u'app list'), view='app_list', icon=icon_app)#, permissions=[PERMISSION_BACKUP_JOB_VIEW])
@@ -1,32 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'App'
db.create_table('app_registry_app', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
))
db.send_create_signal('app_registry', ['App'])
def backwards(self, orm):
# Deleting model 'App'
db.delete_table('app_registry_app')
models = {
'app_registry.app': {
'Meta': {'ordering': "('name',)", 'object_name': 'App'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'})
}
}
complete_apps = ['app_registry']
@@ -1,37 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'App.icon'
db.add_column('app_registry_app', 'icon',
self.gf('django.db.models.fields.CharField')(default='', max_length=64, blank=True),
keep_default=False)
# Adding unique constraint on 'App', fields ['name']
db.create_unique('app_registry_app', ['name'])
def backwards(self, orm):
# Removing unique constraint on 'App', fields ['name']
db.delete_unique('app_registry_app', ['name'])
# Deleting field 'App.icon'
db.delete_column('app_registry_app', 'icon')
models = {
'app_registry.app': {
'Meta': {'ordering': "('name',)", 'object_name': 'App'},
'icon': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
}
}
complete_apps = ['app_registry']
@@ -1,58 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'BackupJob'
db.create_table('app_registry_backupjob', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
('enabled', self.gf('django.db.models.fields.BooleanField')(default=True)),
('begin_datetime', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2012, 8, 18, 0, 0))),
('storage_module_name', self.gf('django.db.models.fields.CharField')(max_length=32)),
('storage_arguments_json', self.gf('django.db.models.fields.TextField')(blank=True)),
))
db.send_create_signal('app_registry', ['BackupJob'])
# Adding M2M table for field apps on 'BackupJob'
db.create_table('app_registry_backupjob_apps', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('backupjob', models.ForeignKey(orm['app_registry.backupjob'], null=False)),
('app', models.ForeignKey(orm['app_registry.app'], null=False))
))
db.create_unique('app_registry_backupjob_apps', ['backupjob_id', 'app_id'])
def backwards(self, orm):
# Deleting model 'BackupJob'
db.delete_table('app_registry_backupjob')
# Removing M2M table for field apps on 'BackupJob'
db.delete_table('app_registry_backupjob_apps')
models = {
'app_registry.app': {
'Meta': {'ordering': "('name',)", 'object_name': 'App'},
'icon': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
},
'app_registry.backupjob': {
'Meta': {'object_name': 'BackupJob'},
'apps': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['app_registry.App']", 'symmetrical': 'False'}),
'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 18, 0, 0)'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'storage_arguments_json': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'storage_module_name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
}
}
complete_apps = ['app_registry']
-45
View File
@@ -1,45 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding M2M table for field dependencies on 'App'
db.create_table('app_registry_app_dependencies', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('from_app', models.ForeignKey(orm['app_registry.app'], null=False)),
('to_app', models.ForeignKey(orm['app_registry.app'], null=False))
))
db.create_unique('app_registry_app_dependencies', ['from_app_id', 'to_app_id'])
def backwards(self, orm):
# Removing M2M table for field dependencies on 'App'
db.delete_table('app_registry_app_dependencies')
models = {
'app_registry.app': {
'Meta': {'ordering': "('name',)", 'object_name': 'App'},
'dependencies': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'dependencies_rel_+'", 'null': 'True', 'to': "orm['app_registry.App']"}),
'icon': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
},
'app_registry.backupjob': {
'Meta': {'object_name': 'BackupJob'},
'apps': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['app_registry.App']", 'symmetrical': 'False'}),
'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 18, 0, 0)'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'storage_arguments_json': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'storage_module_name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
}
}
complete_apps = ['app_registry']
-44
View File
@@ -1,44 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Removing M2M table for field dependencies on 'App'
db.delete_table('app_registry_app_dependencies')
def backwards(self, orm):
# Adding M2M table for field dependencies on 'App'
db.create_table('app_registry_app_dependencies', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('from_app', models.ForeignKey(orm['app_registry.app'], null=False)),
('to_app', models.ForeignKey(orm['app_registry.app'], null=False))
))
db.create_unique('app_registry_app_dependencies', ['from_app_id', 'to_app_id'])
models = {
'app_registry.app': {
'Meta': {'ordering': "('name',)", 'object_name': 'App'},
'icon': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
},
'app_registry.backupjob': {
'Meta': {'object_name': 'BackupJob'},
'apps': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['app_registry.App']", 'symmetrical': 'False'}),
'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 18, 0, 0)'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'storage_arguments_json': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'storage_module_name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
}
}
complete_apps = ['app_registry']
-45
View File
@@ -1,45 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding M2M table for field dependencies on 'App'
db.create_table('app_registry_app_dependencies', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('from_app', models.ForeignKey(orm['app_registry.app'], null=False)),
('to_app', models.ForeignKey(orm['app_registry.app'], null=False))
))
db.create_unique('app_registry_app_dependencies', ['from_app_id', 'to_app_id'])
def backwards(self, orm):
# Removing M2M table for field dependencies on 'App'
db.delete_table('app_registry_app_dependencies')
models = {
'app_registry.app': {
'Meta': {'ordering': "('name',)", 'object_name': 'App'},
'dependencies': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['app_registry.App']", 'null': 'True', 'blank': 'True'}),
'icon': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
},
'app_registry.backupjob': {
'Meta': {'object_name': 'BackupJob'},
'apps': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['app_registry.App']", 'symmetrical': 'False'}),
'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 18, 0, 0)'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'storage_arguments_json': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'storage_module_name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
}
}
complete_apps = ['app_registry']
@@ -1,56 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting model 'BackupJob'
db.delete_table('app_registry_backupjob')
# Removing M2M table for field apps on 'BackupJob'
db.delete_table('app_registry_backupjob_apps')
# Deleting field 'App.icon'
db.delete_column('app_registry_app', 'icon')
def backwards(self, orm):
# Adding model 'BackupJob'
db.create_table('app_registry_backupjob', (
('storage_arguments_json', self.gf('django.db.models.fields.TextField')(blank=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
('storage_module_name', self.gf('django.db.models.fields.CharField')(max_length=32)),
('begin_datetime', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2012, 8, 18, 0, 0))),
('enabled', self.gf('django.db.models.fields.BooleanField')(default=True)),
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
))
db.send_create_signal('app_registry', ['BackupJob'])
# Adding M2M table for field apps on 'BackupJob'
db.create_table('app_registry_backupjob_apps', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('backupjob', models.ForeignKey(orm['app_registry.backupjob'], null=False)),
('app', models.ForeignKey(orm['app_registry.app'], null=False))
))
db.create_unique('app_registry_backupjob_apps', ['backupjob_id', 'app_id'])
# Adding field 'App.icon'
db.add_column('app_registry_app', 'icon',
self.gf('django.db.models.fields.CharField')(default='', max_length=64, blank=True),
keep_default=False)
models = {
'app_registry.app': {
'Meta': {'ordering': "('name',)", 'object_name': 'App'},
'dependencies': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['app_registry.App']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
}
}
complete_apps = ['app_registry']
-115
View File
@@ -1,115 +0,0 @@
from __future__ import absolute_import
import logging
import imp
import sys
from django.db import models
from django.db import DatabaseError, transaction
from django.utils.translation import ugettext_lazy as _
from django.utils.importlib import import_module
from common.models import TranslatableLabelMixin, LiveObjectMixin
from smart_settings import SettingsNamespace
from project_setup.api import register_setup
from project_tools.api import register_tool
from statistics.api import register_statistics
from navigation.api import register_top_menu
from bootstrap.classes import Cleanup, BootstrapModel
#from .classes import AppBackup, StorageModuleBase, Setting
logger = logging.getLogger(__name__)
class App(TranslatableLabelMixin, LiveObjectMixin, models.Model):
translatables = ['label', 'description', 'icon']
#class UnableToRegister(Exception):
# pass
name = models.CharField(max_length=64, verbose_name=_(u'name'), unique=True)
dependencies = models.ManyToManyField('self', verbose_name=_(u'dependencies'), symmetrical=False, blank=True, null=True)
#version
#top_urls
#namespace
@classmethod
@transaction.commit_on_success
def register(cls, app_name):
logger.debug('Trying to import: %s' % app_name)
try:
app_module = import_module(app_name)
except ImportError:
transaction.rollback
logger.debug('Unable to import app: %s' % app_name)
else:
logger.debug('Trying to import registry from: %s' % app_name)
try:
registration = import_module('%s.registry' % app_name)
except ImportError:
transaction.rollback
logger.debug('Unable to import registry for app: %s' % app_name)
else:
if not getattr(registration, 'disabled', False):
try:
app, created = App.objects.get_or_create(name=app_name)
except DatabaseError:
transaction.rollback()
# If database is not ready create a memory only app instance
app = App()
app.label = getattr(registration, 'label', app_name)
app.description = getattr(registration, 'description', u'')
else:
# If there are not error go ahead with the stored app instance
app.label = getattr(registration, 'label', app_name)
app.description = getattr(registration, 'description', u'')
app.dependencies.clear()
app.save()
for dependency_name in getattr(registration, 'dependencies', []):
dependency, created = App.objects.get_or_create(name=dependency_name)
app.dependencies.add(dependency)
app.icon = getattr(registration, 'icon', None)
settings = getattr(registration, 'settings', None)
if settings:
logger.debug('settings: %s' % settings)
settings_module = imp.new_module('settings')
setattr(app_module, 'settings', settings_module)
sys.modules['%s.settings' % app_name] = settings_module
settings_namespace = SettingsNamespace(app_name, app.label, '%s.settings' % app_name)
for setting in settings:
settings_namespace.add_setting(**setting)
for link in getattr(registration, 'setup_links', []):
logger.debug('setup link: %s' % link)
register_setup(link)
for link in getattr(registration, 'tool_links', []):
logger.debug('tool link: %s' % link)
register_tool(link)
for statistic in getattr(registration, 'statistics', []):
logger.debug('statistic: %s' % statistic)
register_statistics(statistic)
for index, link in enumerate(getattr(registration, 'menu_links', [])):
logger.debug('menu_link: %s' % link)
register_top_menu(name='%s.%s' % (app_name, index), link=link)
for cleanup_function in getattr(registration, 'cleanup_functions', []):
logger.debug('cleanup_function: %s' % cleanup_function)
Cleanup(cleanup_function)
for bootstrap_model in getattr(registration, 'bootstrap_models', []):
logger.debug('bootstrap_model: %s' % bootstrap_model)
BootstrapModel(model_name=bootstrap_model.get('name'), app_name=app_name, sanitize=bootstrap_model.get('sanitize', True), dependencies=bootstrap_model.get('dependencies'))
def __unicode__(self):
return unicode(self.label)
class Meta:
ordering = ('name', )
verbose_name = _(u'app')
verbose_name_plural = _(u'apps')
-13
View File
@@ -1,13 +0,0 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from .icons import icon_app
from .links import app_registry_tool_link
name = 'app_registry'
label = _(u'App registry')
description = _(u'Handles the registration of apps in a project.')
icon = icon_app
tool_links = [app_registry_tool_link]
dependencies = ['navigation']
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

-5
View File
@@ -1,5 +0,0 @@
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('app_registry.views',
url(r'^list/$', 'app_list', (), 'app_list'),
)
-27
View File
@@ -1,27 +0,0 @@
from __future__ import absolute_import
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext as _
from common.utils import encapsulate
from permissions.models import Permission
from .models import App
from .icons import icon_app
def app_list(request):
#order = [i for i,f in sorted(smart_modules.items(), key=lambda k: 'dependencies' in k[1] and k[1]['dependencies'])]
return render_to_response('generic_list.html', {
'object_list': App.live.all(),
'hide_object': True,
'title': _(u'registered apps'),
'extra_columns': [
{'name': _(u'label'), 'attribute': 'label'},
{'name': _(u'icon'), 'attribute': encapsulate(lambda x: (getattr(x, 'icon') or icon_app).display_big())},
{'name': _(u'description'), 'attribute': 'description'},
{'name': _(u'dependencies'), 'attribute': encapsulate(lambda x: u', '.join([unicode(dependency) for dependency in x.dependencies.all()]))},
],
}, context_instance=RequestContext(request))
-63
View File
@@ -1,63 +0,0 @@
from __future__ import absolute_import
import inspect
from django.conf import settings
from django.db import transaction, DatabaseError
from django.utils.translation import ugettext_lazy as _
from django.utils.importlib import import_module
#from common.utils import encapsulate
#from job_processor.exceptions import JobQueuePushError
#from job_processor.models import JobQueue, JobType
#from project_tools.api import register_tool
#from project_setup.api import register_setup
#from navigation.api import bind_links, register_model_list_columns
#from .classes import AppBackup, ModelBackup
#from .links import (app_registry_tool_link, app_list, backup_tool_link,
# restore_tool_link, backup_job_list, backup_job_create, backup_job_edit,
# backup_job_test)
#from .literals import BACKUP_JOB_QUEUE_NAME
#from .models import App
#from . import models
#class UnableToRegister(Exception):
# pass
#apipkg.initpkg(__name__, {
# #'App': _App,
## 'App': 'app_registry.models:App',
# #'App': models.App
#})
#pp = 1
#from .models import App#as _App#, BackupJob as _BackupJob
#@transaction.commit_on_success
#def create_backups_job_queue():
# global backups_job_queue
# try:
# backups_job_queue, created = JobQueue.objects.get_or_create(name=BACKUP_JOB_QUEUE_NAME, defaults={'label': _('Backups'), 'unique_jobs': True})
# except DatabaseError:
# transaction.rollback()
#bind_links(['app_list'], [app_list], menu_name='secondary_menu')
#create_backups_job_queue()
###backup_job_type = JobType('remote_backup', _(u'Remove backup'), do_backup)
#register_setup(backup_tool_link)
#register_tool(restore_tool_link)
#bind_links([BackupJob, 'backup_job_list', 'backup_job_create'], [backup_job_list], menu_name='secondary_menu')
#bind_links([BackupJob, 'backup_job_list', 'backup_job_create'], [backup_job_create], menu_name='sidebar')
#bind_links([BackupJob], [backup_job_edit, backup_job_test])
#register_model_list_columns(BackupJob, [
# {'name':_(u'begin date time'), 'attribute': 'begin_datetime'},
# {'name':_(u'storage module'), 'attribute': 'storage_module.label'},
# {'name':_(u'apps'), 'attribute': encapsulate(lambda x: u', '.join([unicode(app) for app in x.apps.all()]))},
#])
###app.set_backup([ModelBackup()])
-161
View File
@@ -1,161 +0,0 @@
import logging
import os
from django.core.files.base import ContentFile
from django.core.files.storage import FileSystemStorage
from django.core.management.commands.dumpdata import Command
from django.conf import settings
from django.db import router, DEFAULT_DB_ALIAS
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext
from django.utils.importlib import import_module
logger = logging.getLogger(__name__)
# Data types
class ElementDataBase(object):
"""
The basic unit of a backup, a data type
it is produced or consumed by the ElementBackup classes
"""
def make_filename(self, id):
return '%s-%s' % (self.model_backup.app_backup.app.name, id)
def save(self):
"""
Must return a file like object
"""
raise NotImplemented
def load(self, file_object):
"""
Must read a file like object and store content
"""
raise NotImplemented
class Fixture(ElementDataBase):
name = 'fixture'
def __init__(self, model_backup, content):
self.model_backup = model_backup
self.content = content
@property
def filename(self):
return self.make_filename(self.__class__.name)
def save(self):
return ContentFile(name=self.filename, content=self.content)
#def load(self):
# Element backup
class ElementBackupBase(object):
"""
Sub classes must provide at least:
info()
backup()
restore()
"""
label = _(u'Base backup manager')
def info(self):
"""
Must return at least None
"""
return None
def link(self, app_backup):
self.app_backup = app_backup
return self
def __unicode__(self):
return unicode(self.__class__.label)
class ModelBackup(ElementBackupBase):
label = _(u'Model fixtures')
def __init__(self, models=None):
self.model_list = models or []
def info(self):
return _(u'models: %s') % (u', '.join(self.model_list) if self.model_list else _(u'All'))
def backup(self):
"""
"""
#TODO: turn into a generator
command = Command()
if not self.model_list:
result = [self.app_backup.app.name]
else:
result = [u'%s.%s' (self.app_backup.app.name, model) for model in self.model_list]
#TODO: a single Fixture or a list of Fixtures for each model?
#Can't return multiple Fixture until a way to find all of an app's models is found
return [Fixture(
model_backup=self,
content=command.handle(u' '.join(result), format='json', indent=4, using=DEFAULT_DB_ALIAS, exclude=[], user_base_manager=False, use_natural_keys=False)
)]
class FileBackup(ElementBackupBase):
label = _(u'File copy')
def __init__(self, storage_class, filepath=None):
self.storage_class = storage_class
self.filepath = filepath
def info(self):
return _(u'%s from %s') % (self.filepath or _(u'all files'), self.storage_class)
def backup(self):
"""
Fetch a file specified by filepath from the Django storage class
and return a file like object
"""
return None
# App config
class AppBackup(object):
_registry = {}
STATE_BACKING_UP = 'backing_up'
STATE_RESTORING = 'restoring'
STATE_IDLE = 'idle'
STATE_CHOICES = (
(STATE_BACKING_UP, _(u'backing up')),
(STATE_RESTORING, _(u'restoring')),
(STATE_IDLE, _(u'idle')),
)
@classmethod
def get(cls, name):
return cls._registry[name]
@classmethod
def get_all(cls):
return cls._registry.values()
def __init__(self, app, backup_managers):
# app = App instance from app_registry app
self.app = app
self.backup_managers = [manager.link(self) for manager in backup_managers]
self.state = self.__class__.STATE_IDLE
self.__class__._registry[app] = self
def info(self):
results = []
for manager in self.backup_managers:
results.append(u'%s - %s' % (manager, manager.info() or _(u'Nothing')))
return u', '.join(results)
-20
View File
@@ -1,20 +0,0 @@
from __future__ import absolute_import
from django import forms
from common.widgets import ScrollableCheckboxSelectMultiple
#from .classes import AppBackup
#from .models import App, BackupJob
#def valid_app_choices():
# # Return app that exist in the app registry and that have been registered for backup
# return App.live.filter(pk__in=[appbackup.app.pk for appbackup in AppBackup.get_all()])
#class BackupJobForm(forms.ModelForm):
# apps = forms.ModelMultipleChoiceField(queryset=valid_app_choices(), widget=ScrollableCheckboxSelectMultiple())
#
# class Meta:
# model = BackupJob
-17
View File
@@ -1,17 +0,0 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .icons import icon_app
from .permissions import PERMISSION_BACKUP_JOB_VIEW, PERMISSION_BACKUP_JOB_CREATE, PERMISSION_BACKUP_JOB_EDIT, PERMISSION_BACKUP_JOB_DELETE
backup_tool_link = Link(text=_(u'backups'), view='backup_job_list', icon='cd_burn.png', permissions=[PERMISSION_BACKUP_JOB_VIEW])
backup_job_list = Link(text=_(u'backup job list'), view='backup_job_list', sprite='cd_burn', permissions=[PERMISSION_BACKUP_JOB_VIEW])
backup_job_create = Link(text=_(u'create'), view='backup_job_create', sprite='cd_add', permissions=[PERMISSION_BACKUP_JOB_CREATE])
backup_job_edit = Link(text=_(u'edit'), view='backup_job_edit', args='object.pk', sprite='cd_edit', permissions=[PERMISSION_BACKUP_JOB_EDIT])
backup_job_test = Link(text=_(u'test'), view='backup_job_test', args='object.pk', sprite='cd_go')#, permissions=[PERMISSION_BACKUP_JOB_TEST])
backup_job_delete = Link(text=_(u'delete'), view='backup_job_delete', args='object.pk', sprite='cd_delete', permissions=[PERMISSION_BACKUP_JOB_DELETE])
restore_tool_link = Link(text=_(u'restore'), view='restore_view', icon='cd_eject.png')#, permissions=[])
-1
View File
@@ -1 +0,0 @@
BACKUP_JOB_QUEUE_NAME = 'backups_queue'
-58
View File
@@ -1,58 +0,0 @@
from django.db import models
from app_registry.models import App
"""
class BackupJob(models.Model):
name = models.CharField(max_length=64, verbose_name=_(u'name'))
enabled = models.BooleanField(default=True, verbose_name=_(u'enabled'))
apps = models.ManyToManyField(App)
begin_datetime = models.DateTimeField(verbose_name=_(u'begin date and time'), default=lambda: datetime.datetime.now())
# * repetition =
# day - 1 days
# weekly - days of week checkbox
# month - day of month, day of week
# * repetition option field
# * ends
# - never
# - After # ocurrences
# - On date
# * end option field
# * type
# - Full
# - Incremental
storage_module_name = models.CharField(max_length=32, choices=StorageModuleBase.get_as_choices(), verbose_name=_(u'storage module'))
storage_arguments_json = models.TextField(verbose_name=_(u'storage module arguments (in JSON)'), blank=True)
def __unicode__(self):
return self.name
@property
def storage_module(self):
return StorageModuleBase.get(self.storage_module_name)
def backup(self, dry_run=False):
logger.debug('starting: %s', self)
logger.debug('dry_run: %s' % dry_run)
storage_module = self.storage_module
#TODO: loads
for app in self.apps.all():
app_backup = AppBackup.get(app)
app_backup.backup(storage_module(backup_path='/tmp'), dry_run=dry_run)
def save(self, *args, **kwargs):
#dump
super(BackupJob, self).save(*args, **kwargs)
@models.permalink
def get_absolute_url(self):
return ('checkout_info', [self.document.pk])
class Meta:
verbose_name = _(u'document checkout')
verbose_name_plural = _(u'document checkouts')
#class BackupJobLog
"""
-12
View File
@@ -1,12 +0,0 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from permissions.models import PermissionNamespace, Permission
namespace = PermissionNamespace('backups', _(u'Backups'))
PERMISSION_BACKUP_JOB_VIEW = Permission.objects.register(namespace, 'backup_job_view', _(u'View a backup job'))
PERMISSION_BACKUP_JOB_CREATE = Permission.objects.register(namespace, 'backup_job_view', _(u'Create backup jobs'))
PERMISSION_BACKUP_JOB_EDIT = Permission.objects.register(namespace, 'backup_job_edit', _(u'Edit an existing backup jobs'))
PERMISSION_BACKUP_JOB_DELETE = Permission.objects.register(namespace, 'backup_job_delete', _(u'Delete an existing backup jobs'))
-9
View File
@@ -1,9 +0,0 @@
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('backups.views',
#url(r'^jobs/list/$', 'backup_job_list', (), 'backup_job_list'),
#url(r'^jobs/create/$', 'backup_job_create', (), 'backup_job_create'),
#url(r'^jobs/(?P<backup_job_pk>\d+)/edit/$', 'backup_job_edit', (), 'backup_job_edit'),
#url(r'^jobs/(?P<backup_job_pk>\d+)/test/$', 'backup_job_test', (), 'backup_job_test'),
#url(r'^jobs/(?P<backup_job_pk>\d+)/delete/$', 'backup_job_delete', (), 'backup_job_delete'),
)
-126
View File
@@ -1,126 +0,0 @@
from __future__ import absolute_import
from django.conf import settings
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.utils.translation import ugettext as _
from common.utils import encapsulate
from permissions.models import Permission
#from .classes import AppBackup
#from .forms import BackupJobForm
#from .models import App#, BackupJob
from .permissions import PERMISSION_BACKUP_JOB_VIEW, PERMISSION_BACKUP_JOB_CREATE, PERMISSION_BACKUP_JOB_EDIT
def backup_job_list(request):
pre_object_list = BackupJob.objects.all()
try:
Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_VIEW])
except PermissionDenied:
# If user doesn't have global permission, get a list of backup jobs
# for which he/she does have access use it to filter the
# provided object_list
final_object_list = AccessEntry.objects.filter_objects_by_access(PERMISSION_BACKUP_JOB_VIEW, request.user, pre_object_list)
else:
final_object_list = pre_object_list
context = {
'object_list': final_object_list,
'title': _(u'backup jobs'),
'hide_link': True,
#'extra_columns': [
# {'name': _(u'info'), 'attribute': 'info'},
#],
}
return render_to_response('generic_list.html', context,
context_instance=RequestContext(request))
def backup_job_create(request):
Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_CREATE])
if request.method == 'POST':
form = BackupJobForm(data=request.POST)
if form.is_valid():
try:
backup_job = form.save()
except Exception, exc:
messages.error(request, _(u'Error creating backup job; %s') % exc)
else:
messages.success(request, _(u'Backup job "%s" created successfully.') % backup_job)
return HttpResponseRedirect(reverse('backup_job_list'))
else:
form = BackupJobForm()
return render_to_response('generic_form.html', {
'form': form,
'title': _(u'Create backup job')
}, context_instance=RequestContext(request))
def backup_job_edit(request, backup_job_pk):
backup_job = get_object_or_404(BackupJob, pk=backup_job_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_EDIT])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_BACKUP_JOB_EDIT, request.user, backup_job)
if request.method == 'POST':
form = BackupJobForm(data=request.POST, instance=backup_job)
if form.is_valid():
try:
backup_job = form.save()
except Exception, exc:
messages.error(request, _(u'Error editing backup job; %s') % exc)
else:
messages.success(request, _(u'Backup job "%s" edited successfully.') % backup_job)
return HttpResponseRedirect(reverse('backup_job_list'))
else:
form = BackupJobForm(instance=backup_job)
return render_to_response('generic_form.html', {
'form': form,
'object': backup_job,
'title': _(u'Edit backup job: %s') % backup_job
}, context_instance=RequestContext(request))
def backup_job_test(request, backup_job_pk):
backup_job = get_object_or_404(BackupJob, pk=backup_job_pk)
#try:
# Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_EDIT])
#except PermissionDenied:
# AccessEntry.objects.check_access(PERMISSION_BACKUP_JOB_EDIT, request.user, backup_job)
try:
backup_job.backup(dry_run=True)
except Exception, exc:
if settings.DEBUG:
raise
else:
messages.error(request, _(u'Error testing backup job; %s') % exc)
return HttpResponseRedirect(reverse('backup_job_list'))
else:
messages.success(request, _(u'Test for backup job "%s" finished successfully.') % backup_job)
return HttpResponseRedirect(reverse('backup_job_list'))
def backup_view(request):
#Permission.objects.check_permissions(request.user, [])
context = {
'object_list': AppBackup.get_all(),
'title': _(u'registered apps for backup'),
'hide_link': True,
'extra_columns': [
{'name': _(u'info'), 'attribute': 'info'},
],
}
return render_to_response('generic_list.html', context,
context_instance=RequestContext(request))
-1
View File
@@ -1 +0,0 @@
-7
View File
@@ -1,7 +0,0 @@
from __future__ import absolute_import
from django.contrib import admin
from .models import BootstrapSetup
admin.site.register(BootstrapSetup)
-172
View File
@@ -1,172 +0,0 @@
from __future__ import absolute_import
import logging
from itertools import chain
from django.db import models
from django.core import serializers
from django.utils.datastructures import SortedDict
from .exceptions import ExistingData, NotABootstrapSetup
from .literals import (FIXTURE_TYPE_PK_NULLIFIER, FIXTURE_TYPE_MODEL_PROCESS,
FIXTURE_METADATA_REMARK_CHARACTER, BOOTSTRAP_SETUP_MAGIC_NUMBER)
from .utils import toposort2
logger = logging.getLogger(__name__)
class Cleanup(object):
"""
Class to store all the registered cleanup functions in one place.
"""
_registry = {}
@classmethod
def execute_all(cls):
for cleanup in cls._registry.values():
cleanup.function()
def __init__(self, function):
self.function = function
self.__class__._registry[id(self)] = self
class BootstrapModel(object):
"""
Class used to keep track of all the models to be dumped to create a
bootstrap setup from the current setup in use.
"""
_registry = SortedDict()
@classmethod
def get_magic_number(cls):
return '%s %s' % (FIXTURE_METADATA_REMARK_CHARACTER, BOOTSTRAP_SETUP_MAGIC_NUMBER)
@classmethod
def check_magic_number(cls, data):
if not data.startswith(cls.get_magic_number()):
raise NotABootstrapSetup
@classmethod
def check_for_data(cls):
for model in cls.get_all():
model_instance = models.get_model(model.app_name, model.model_name)
if model_instance.objects.all().count():
raise ExistingData
@classmethod
def get_all(cls, sort_by_dependencies=False):
"""
Return all boostrap models, sorted by dependencies optionally.
"""
if not sort_by_dependencies:
return cls._registry.values()
else:
return (cls.get_by_name(name) for name in list(chain.from_iterable(toposort2(cls.get_dependency_dict()))))
@classmethod
def get_dependency_dict(cls):
"""
Return a dictionary where the key is the model name and it's value
is a list of models upon which it depends.
"""
result = {}
for instance in cls.get_all():
result[instance.get_fullname()] = set(instance.dependencies)
logger.debug('result: %s' % result)
return result
@classmethod
def get_by_name(cls, name):
"""
Return a BootstrapModel instance by the fullname of the model it
represents.
"""
return cls._registry[name]
def get_fullname(self):
"""
Return a the full app name + model name of the model represented
by the instance.
"""
return '.'.join([self.app_name, self.model_name])
def get_model_instance(self):
"""
Returns an actual Model class instance of the model.
"""
return models.get_model(self.app_name, self.model_name)
def __init__(self, model_name, app_name=None, sanitize=True, dependencies=None):
app_name_splitted = None
if '.' in model_name:
app_name_splitted, model_name = model_name.split('.')
self.app_name = app_name_splitted or app_name
if not self.app_name:
raise Exception('Pass either a dotted app plus model name or a model name and a separate app name')
self.model_name = model_name
self.sanitize = sanitize
self.dependencies = dependencies if dependencies else []
self.__class__._registry[self.get_fullname()] = self
def dump(self, serialization_format):
result = serializers.serialize(serialization_format, self.get_model_instance().objects.all(), indent=4, use_natural_keys=True)
logger.debug('result: "%s"' % result)
if self.sanitize:
# Remove primary key values
result = FIXTURE_TYPE_PK_NULLIFIER[serialization_format](result)
# Do any clean up required on the fixture
result = FIXTURE_TYPE_MODEL_PROCESS[serialization_format](result)
return result
class FixtureMetadata(object):
"""
Class to automatically create and extract metadata from a bootstrap
fixture.
"""
_registry = SortedDict()
@classmethod
def get_all(cls):
return cls._registry.values()
@classmethod
def generate_all(cls, fixture_instance):
result = []
for fixture_metadata in cls.get_all():
result.append(fixture_metadata.generate(fixture_instance))
return '\n'.join(result)
@classmethod
def read_all(cls, data):
result = {}
for instance in cls.get_all():
single_result = instance.read_value(data)
if single_result:
result[instance.property_name] = single_result
return result
def __init__(self, literal, generate_function, read_function=None, property_name=None):
self.literal = literal
self.generate_function = generate_function
self.property_name = property_name
self.read_function = read_function or (lambda x: x)
self.__class__._registry[id(self)] = self
def get_with_remark(self):
return '%s %s' % (FIXTURE_METADATA_REMARK_CHARACTER, self.literal)
def generate(self, fixture_instance):
return '%s: %s' % (self.get_with_remark(), self.generate_function(fixture_instance))
def read_value(self, fixture_data):
if self.property_name:
for line in fixture_data.splitlines(False):
if line.startswith(self.get_with_remark()):
# TODO: replace the "+ 4" with a space and next character finding algo
return self.read_function(line[len(self.literal) + 4:])
-18
View File
@@ -1,18 +0,0 @@
from __future__ import absolute_import
class ExistingData(Exception):
"""
Raised when an attempt to execute a bootstrap setup is made and there is
existing data that would be corrupted or damaged by the loading the
bootstrap's fixture.
"""
pass
class NotABootstrapSetup(Exception):
"""
Raised when an attempting to import a bootstrap setup without a proper
magic number metadata
"""
pass
-57
View File
@@ -1,57 +0,0 @@
from __future__ import absolute_import
import logging
from django import forms
from django.utils.translation import ugettext_lazy as _
from common.forms import DetailForm
from .models import BootstrapSetup
logger = logging.getLogger(__name__)
class BootstrapSetupForm(forms.ModelForm):
class Meta:
model = BootstrapSetup
widgets = {
'description': forms.widgets.Textarea(attrs={
'rows': 5, 'cols': 80,
}
)
}
class BootstrapSetupForm_view(DetailForm):
class Meta:
model = BootstrapSetup
widgets = {
'description': forms.widgets.Textarea(attrs={
'rows': 5, 'cols': 80,
}
)
}
class BootstrapSetupForm_edit(BootstrapSetupForm):
class Meta(BootstrapSetupForm.Meta):
model = BootstrapSetup
exclude = ('type',)
class BootstrapSetupForm_dump(BootstrapSetupForm):
class Meta(BootstrapSetupForm.Meta):
model = BootstrapSetup
exclude = ('fixture',)
class BootstrapFileImportForm(forms.Form):
file = forms.FileField(
label=_(u'Bootstrap setup file'),
)
class BootstrapURLImportForm(forms.Form):
url = forms.URLField(
label=_(u'Bootstrap setup URL'),
)
-14
View File
@@ -1,14 +0,0 @@
from __future__ import absolute_import
from icons.literals import (WIZARD, LIGHTNING, RADIOACTIVITY, MAGIC_WAND_2,
WIZARD_ADD, WIZARD_EDIT, WIZARD_DELETE, WIZARD_LIGHTNING)
from icons import Icon
icon_bootstrap_setup = Icon(WIZARD)
icon_bootstrap_setup_view = Icon(WIZARD)
icon_bootstrap_setup_create = Icon(WIZARD_ADD)
icon_bootstrap_setup_edit = Icon(WIZARD_EDIT)
icon_bootstrap_setup_delete = Icon(WIZARD_DELETE)
icon_bootstrap_setup_execute = Icon(WIZARD_LIGHTNING)
icon_bootstrap_setup_dump = Icon(MAGIC_WAND_2)
icon_nuke_database = Icon(RADIOACTIVITY)
-30
View File
@@ -1,30 +0,0 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .permissions import (PERMISSION_BOOTSTRAP_VIEW, PERMISSION_BOOTSTRAP_CREATE,
PERMISSION_BOOTSTRAP_EDIT, PERMISSION_BOOTSTRAP_DELETE,
PERMISSION_BOOTSTRAP_EXECUTE, PERMISSION_BOOTSTRAP_DUMP,
PERMISSION_NUKE_DATABASE, PERMISSION_BOOTSTRAP_EXPORT,
PERMISSION_BOOTSTRAP_IMPORT, PERMISSION_BOOTSTRAP_REPOSITORY_SYNC)
from .icons import (icon_bootstrap_setup, icon_bootstrap_setup_execute, icon_bootstrap_setup_create,
icon_bootstrap_setup_edit, icon_bootstrap_setup_delete, icon_bootstrap_setup_view,
icon_bootstrap_setup_dump, icon_nuke_database)
link_bootstrap_setup_tool = Link(text=_(u'bootstrap'), view='bootstrap_setup_list', icon=icon_bootstrap_setup, permissions=[PERMISSION_BOOTSTRAP_VIEW])
link_bootstrap_setup_list = Link(text=_(u'bootstrap setup list'), view='bootstrap_setup_list', icon=icon_bootstrap_setup, permissions=[PERMISSION_BOOTSTRAP_VIEW])
link_bootstrap_setup_create = Link(text=_(u'create new bootstrap setup'), view='bootstrap_setup_create', icon=icon_bootstrap_setup_create, permissions=[PERMISSION_BOOTSTRAP_CREATE])
link_bootstrap_setup_edit = Link(text=_(u'edit'), view='bootstrap_setup_edit', args='object.pk', icon=icon_bootstrap_setup_edit, permissions=[PERMISSION_BOOTSTRAP_EDIT])
link_bootstrap_setup_delete = Link(text=_(u'delete'), view='bootstrap_setup_delete', args='object.pk', icon=icon_bootstrap_setup_delete, permissions=[PERMISSION_BOOTSTRAP_DELETE])
link_bootstrap_setup_view = Link(text=_(u'details'), view='bootstrap_setup_view', args='object.pk', icon=icon_bootstrap_setup_view, permissions=[PERMISSION_BOOTSTRAP_VIEW])
link_bootstrap_setup_execute = Link(text=_(u'execute'), view='bootstrap_setup_execute', args='object.pk', icon=icon_bootstrap_setup_execute, permissions=[PERMISSION_BOOTSTRAP_EXECUTE])
link_bootstrap_setup_dump = Link(text=_(u'dump current setup'), view='bootstrap_setup_dump', icon=icon_bootstrap_setup_dump, permissions=[PERMISSION_BOOTSTRAP_DUMP])
link_erase_database = Link(text=_(u'erase database'), view='erase_database_view', icon=icon_nuke_database, permissions=[PERMISSION_NUKE_DATABASE])
# TODO: convert to Link class and assign icon
link_bootstrap_setup_export = {'text': _(u'export'), 'view': 'bootstrap_setup_export', 'args': 'object.pk', 'famfam': 'disk', 'permissions': [PERMISSION_BOOTSTRAP_EXPORT]}
link_bootstrap_setup_import_from_file = {'text': _(u'import from file'), 'view': 'bootstrap_setup_import_from_file', 'famfam': 'folder', 'permissions': [PERMISSION_BOOTSTRAP_IMPORT]}
link_bootstrap_setup_import_from_url = {'text': _(u'import from URL'), 'view': 'bootstrap_setup_import_from_url', 'famfam': 'world', 'permissions': [PERMISSION_BOOTSTRAP_IMPORT]}
link_bootstrap_setup_repository_sync = {'text': _(u'sync with repository'), 'view': 'bootstrap_setup_repository_sync', 'famfam': 'world', 'permissions': [PERMISSION_BOOTSTRAP_REPOSITORY_SYNC]}
-81
View File
@@ -1,81 +0,0 @@
from __future__ import absolute_import
import re
try:
import yaml
except ImportError:
YAML_AVAILABLE = False
else:
YAML_AVAILABLE = True
from django.utils.translation import ugettext_lazy as _
FIXTURE_TYPE_JSON = 'json'
FIXTURE_TYPE_YAML = 'yaml'
FIXTURE_TYPE_BETTER_YAML = 'better_yaml'
FIXTURE_TYPE_XML = 'xml'
FIXTURE_TYPES_CHOICES = (
(FIXTURE_TYPE_JSON, _(u'JSON')),
# Disabing XML until a way to specify a null pk is found
#(FIXTURE_TYPE_XML, _(u'XML')),
)
FIXTURE_FILE_TYPE = {
FIXTURE_TYPE_JSON: 'json',
FIXTURE_TYPE_YAML: 'yaml',
FIXTURE_TYPE_BETTER_YAML: 'better_yaml',
FIXTURE_TYPE_XML: 'xml',
}
FIXTURE_TYPE_PK_NULLIFIER = {
FIXTURE_TYPE_JSON: lambda x: re.sub('"pk": [0-9]{1,5}', '"pk": null', x),
FIXTURE_TYPE_YAML: lambda x: re.sub('pk: [0-9]{1,5}', 'pk: null', x),
FIXTURE_TYPE_BETTER_YAML: lambda x: re.sub('[0-9]{1,5}:', 'null:', x),
FIXTURE_TYPE_XML: lambda x: re.sub('pk="[0-9]{1,5}"', 'pk=null', x),
}
FIXTURE_TYPE_EMPTY_FIXTURE = {
FIXTURE_TYPE_JSON: lambda x: x.startswith('[]') or x == ',',
FIXTURE_TYPE_YAML: lambda x: x.startswith('[]'),
FIXTURE_TYPE_BETTER_YAML: lambda x: x.startswith('{}'),
FIXTURE_TYPE_XML: lambda x: x,
}
FIXTURE_TYPE_MODEL_PROCESS = {
FIXTURE_TYPE_JSON: lambda x: '%s,' % x[2:-2],
FIXTURE_TYPE_YAML: lambda x: x,
FIXTURE_TYPE_BETTER_YAML: lambda x: x,
FIXTURE_TYPE_XML: lambda x: x,
}
FIXTURE_TYPE_FIXTURE_PROCESS = {
FIXTURE_TYPE_JSON: lambda x: '[\n%s\n]' % x[:-1], # Enclose in [], remove last comma
FIXTURE_TYPE_YAML: lambda x: x,
FIXTURE_TYPE_BETTER_YAML: lambda x: x,
FIXTURE_TYPE_XML: lambda x: x,
}
COMMAND_LOADDATA = 'loaddata'
if YAML_AVAILABLE:
FIXTURE_TYPES_CHOICES += (FIXTURE_TYPE_YAML, _(u'YAML')),
FIXTURE_TYPES_CHOICES += (FIXTURE_TYPE_BETTER_YAML, _(u'Better YAML')),
# better_yaml is not working with natural keys
FIXTURE_METADATA_REMARK_CHARACTER = '#'
DATETIME_STRING_FORMAT = '%a, %d %b %Y %H:%M:%S +0000'
FIXTURE_METADATA_CREATED = 'created'
FIXTURE_METADATA_EDITED = 'edited'
FIXTURE_METADATA_MAYAN_VERSION = 'mayan_edms_version'
FIXTURE_METADATA_FORMAT = 'format'
FIXTURE_METADATA_NAME = 'name'
FIXTURE_METADATA_SLUG = 'slug'
FIXTURE_METADATA_DESCRIPTION = 'description'
BOOTSTRAP_EXTENSION = 'txt'
BOOTSTRAP_SETUP_MAGIC_NUMBER = 'bootstrap setup'
BOOTSTRAP_REPOSITORY_URL = 'http://bootstrap.mayan-edms.com'
BOOTSTRAP_REPOSITORY_INDEX_FILE = '_repo_index.txt'
Binary file not shown.
@@ -1,322 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# <pkoldamov@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-12-12 06:04+0000\n"
"Last-Translator: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>\n"
"Language-Team: Bulgarian (http://www.transifex.com/projects/p/mayan-edms/"
"language/bg/)\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:50
msgid "Bootstrap setup file"
msgstr ""
#: forms.py:56
msgid "Bootstrap setup URL"
msgstr ""
#: links.py:16
msgid "bootstrap"
msgstr ""
#: links.py:17
msgid "bootstrap setup list"
msgstr ""
#: links.py:18
msgid "create new bootstrap setup"
msgstr ""
#: links.py:19
msgid "edit"
msgstr "редактиране"
#: links.py:20
msgid "delete"
msgstr "изтриване"
#: links.py:21
msgid "details"
msgstr "детайли"
#: links.py:22
msgid "execute"
msgstr "изпълнение"
#: links.py:23
msgid "dump current setup"
msgstr "изпринтване на текущата настройка"
#: links.py:24
msgid "erase database"
msgstr "изтриване на база данни"
#: links.py:27
msgid "export"
msgstr ""
#: links.py:28
msgid "import from file"
msgstr ""
#: links.py:29
msgid "import from URL"
msgstr ""
#: links.py:30
msgid "sync with repository"
msgstr ""
#: literals.py:20
msgid "JSON"
msgstr "JSON"
#: literals.py:63
msgid "YAML"
msgstr "YAML"
#: literals.py:64
msgid "Better YAML"
msgstr "Подобрен YAML"
#: models.py:30
msgid "name"
msgstr "име"
#: models.py:31
msgid "slug"
msgstr ""
#: models.py:32 views.py:35
msgid "description"
msgstr "описание"
#: models.py:33
msgid "fixture"
msgstr ""
#: models.py:33
msgid "These are the actual database structure creation instructions."
msgstr ""
"Това са текущите инструкции за създаване на структурата на базата данни."
#: models.py:34 views.py:36
msgid "type"
msgstr "тип"
#: models.py:35
msgid "creation date and time"
msgstr "дата и време на създаване"
#: models.py:104 views.py:91 views.py:120 views.py:145 views.py:173
msgid "bootstrap setup"
msgstr ""
#: models.py:105 views.py:32
msgid "bootstrap setups"
msgstr ""
#: permissions.py:7
msgid "Database bootstrap"
msgstr ""
#: permissions.py:9
msgid "View bootstrap setups"
msgstr ""
#: permissions.py:10
msgid "Create bootstrap setups"
msgstr ""
#: permissions.py:11
msgid "Edit bootstrap setups"
msgstr ""
#: permissions.py:12
msgid "Delete bootstrap setups"
msgstr ""
#: permissions.py:13
msgid "Execute bootstrap setups"
msgstr ""
#: permissions.py:14
msgid "Dump the current project\\s setup into a bootstrap setup"
msgstr ""
#: permissions.py:15
msgid "Export bootstrap setups as files"
msgstr ""
#: permissions.py:16
msgid "Import new bootstrap setups"
msgstr ""
#: permissions.py:17
msgid "Sync the local bootstrap setups with a published repository"
msgstr ""
#: permissions.py:18
msgid "Erase the entire database and document storage"
msgstr "Изтрийте цялата база данни за съхраняване и документното пространство"
#: registry.py:8
msgid "Bootstrap"
msgstr ""
#: registry.py:9
msgid "Provides pre configured setups for indexes, document types, tags, etc."
msgstr ""
#: views.py:51
msgid "Bootstrap setup created successfully"
msgstr ""
#: views.py:54
msgid "Error creating bootstrap setup."
msgstr ""
#: views.py:59
msgid "create bootstrap"
msgstr ""
#: views.py:79
msgid "Bootstrap setup edited successfully"
msgstr ""
#: views.py:82
msgid "Error editing bootstrap setup."
msgstr ""
#: views.py:87
#, python-format
msgid "edit bootstrap setup: %s"
msgstr ""
#: views.py:112
#, python-format
msgid "Bootstrap setup: %s deleted successfully."
msgstr ""
#: views.py:114
#, python-format
msgid "Bootstrap setup: %(bootstrap)s, delete error: %(error)s"
msgstr ""
#: views.py:125
#, python-format
msgid "Are you sure you with to delete the bootstrap setup: %s?"
msgstr ""
#: views.py:165
msgid ""
"Cannot execute bootstrap setup, there is existing data. Erase all data and "
"try again."
msgstr ""
#: views.py:167
#, python-format
msgid "Error executing bootstrap setup; %s"
msgstr ""
#: views.py:169
#, python-format
msgid "Bootstrap setup \"%s\" executed successfully."
msgstr ""
#: views.py:181
#, python-format
msgid ""
"Are you sure you wish to execute the database bootstrap setup named: %s?"
msgstr ""
#: views.py:197
#, python-format
msgid "Error dumping configuration into a bootstrap setup; %s"
msgstr ""
#: views.py:201
msgid "Bootstrap setup created successfully."
msgstr ""
#: views.py:207
#, fuzzy
msgid "dump current setup into a bootstrap setup"
msgstr "изпринтване на текущата настройка"
#: views.py:241 views.py:269
msgid "Bootstrap setup imported successfully."
msgstr ""
#: views.py:244
msgid "File is not a bootstrap setup."
msgstr ""
#: views.py:246
#, python-format
msgid "Error importing bootstrap setup from file; %s."
msgstr ""
#: views.py:252
msgid "Import bootstrap setup from file"
msgstr ""
#: views.py:272
msgid "Data from URL is not a bootstrap setup."
msgstr ""
#: views.py:274
#, python-format
msgid "Error importing bootstrap setup from URL; %s."
msgstr ""
#: views.py:280
msgid "Import bootstrap setup from URL"
msgstr ""
#: views.py:299
#, python-format
msgid "Error erasing database; %s"
msgstr "Грешка при изтриване на база данни; %s"
#: views.py:301
msgid "Database erased successfully."
msgstr "Базата данни е изтрита успешно."
#: views.py:311
msgid ""
"Are you sure you wish to erase the entire database and document storage?"
msgstr ""
"Сигурен ли сте, че искате да изтриете цялата база данни и документното "
"пространство?"
#: views.py:312
msgid ""
"All documents, sources, metadata, metadata types, set, tags, indexes and "
"logs will be lost irreversibly!"
msgstr ""
#: views.py:329
msgid "Bootstrap repository successfully synchronized."
msgstr ""
#: views.py:331
#, python-format
msgid "Bootstrap repository synchronization error: %(error)s"
msgstr ""
#: views.py:338
msgid "Are you sure you wish to synchronize with the bootstrap repository?"
msgstr ""
Binary file not shown.
@@ -1,317 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-12-12 06:04+0000\n"
"Last-Translator: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>\n"
"Language-Team: German (Germany) (http://www.transifex.com/projects/p/mayan-"
"edms/language/de_DE/)\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:50
msgid "Bootstrap setup file"
msgstr ""
#: forms.py:56
msgid "Bootstrap setup URL"
msgstr ""
#: links.py:16
msgid "bootstrap"
msgstr ""
#: links.py:17
msgid "bootstrap setup list"
msgstr ""
#: links.py:18
msgid "create new bootstrap setup"
msgstr ""
#: links.py:19
msgid "edit"
msgstr ""
#: links.py:20
msgid "delete"
msgstr ""
#: links.py:21
msgid "details"
msgstr ""
#: links.py:22
msgid "execute"
msgstr ""
#: links.py:23
msgid "dump current setup"
msgstr ""
#: links.py:24
msgid "erase database"
msgstr ""
#: links.py:27
msgid "export"
msgstr ""
#: links.py:28
msgid "import from file"
msgstr ""
#: links.py:29
msgid "import from URL"
msgstr ""
#: links.py:30
msgid "sync with repository"
msgstr ""
#: literals.py:20
msgid "JSON"
msgstr ""
#: literals.py:63
msgid "YAML"
msgstr ""
#: literals.py:64
msgid "Better YAML"
msgstr ""
#: models.py:30
msgid "name"
msgstr ""
#: models.py:31
msgid "slug"
msgstr ""
#: models.py:32 views.py:35
msgid "description"
msgstr ""
#: models.py:33
msgid "fixture"
msgstr ""
#: models.py:33
msgid "These are the actual database structure creation instructions."
msgstr ""
#: models.py:34 views.py:36
msgid "type"
msgstr ""
#: models.py:35
msgid "creation date and time"
msgstr ""
#: models.py:104 views.py:91 views.py:120 views.py:145 views.py:173
msgid "bootstrap setup"
msgstr ""
#: models.py:105 views.py:32
msgid "bootstrap setups"
msgstr ""
#: permissions.py:7
msgid "Database bootstrap"
msgstr ""
#: permissions.py:9
msgid "View bootstrap setups"
msgstr ""
#: permissions.py:10
msgid "Create bootstrap setups"
msgstr ""
#: permissions.py:11
msgid "Edit bootstrap setups"
msgstr ""
#: permissions.py:12
msgid "Delete bootstrap setups"
msgstr ""
#: permissions.py:13
msgid "Execute bootstrap setups"
msgstr ""
#: permissions.py:14
msgid "Dump the current project\\s setup into a bootstrap setup"
msgstr ""
#: permissions.py:15
msgid "Export bootstrap setups as files"
msgstr ""
#: permissions.py:16
msgid "Import new bootstrap setups"
msgstr ""
#: permissions.py:17
msgid "Sync the local bootstrap setups with a published repository"
msgstr ""
#: permissions.py:18
msgid "Erase the entire database and document storage"
msgstr ""
#: registry.py:8
msgid "Bootstrap"
msgstr ""
#: registry.py:9
msgid "Provides pre configured setups for indexes, document types, tags, etc."
msgstr ""
#: views.py:51
msgid "Bootstrap setup created successfully"
msgstr ""
#: views.py:54
msgid "Error creating bootstrap setup."
msgstr ""
#: views.py:59
msgid "create bootstrap"
msgstr ""
#: views.py:79
msgid "Bootstrap setup edited successfully"
msgstr ""
#: views.py:82
msgid "Error editing bootstrap setup."
msgstr ""
#: views.py:87
#, python-format
msgid "edit bootstrap setup: %s"
msgstr ""
#: views.py:112
#, python-format
msgid "Bootstrap setup: %s deleted successfully."
msgstr ""
#: views.py:114
#, python-format
msgid "Bootstrap setup: %(bootstrap)s, delete error: %(error)s"
msgstr ""
#: views.py:125
#, python-format
msgid "Are you sure you with to delete the bootstrap setup: %s?"
msgstr ""
#: views.py:165
msgid ""
"Cannot execute bootstrap setup, there is existing data. Erase all data and "
"try again."
msgstr ""
#: views.py:167
#, python-format
msgid "Error executing bootstrap setup; %s"
msgstr ""
#: views.py:169
#, python-format
msgid "Bootstrap setup \"%s\" executed successfully."
msgstr ""
#: views.py:181
#, python-format
msgid ""
"Are you sure you wish to execute the database bootstrap setup named: %s?"
msgstr ""
#: views.py:197
#, python-format
msgid "Error dumping configuration into a bootstrap setup; %s"
msgstr ""
#: views.py:201
msgid "Bootstrap setup created successfully."
msgstr ""
#: views.py:207
msgid "dump current setup into a bootstrap setup"
msgstr ""
#: views.py:241 views.py:269
msgid "Bootstrap setup imported successfully."
msgstr ""
#: views.py:244
msgid "File is not a bootstrap setup."
msgstr ""
#: views.py:246
#, python-format
msgid "Error importing bootstrap setup from file; %s."
msgstr ""
#: views.py:252
msgid "Import bootstrap setup from file"
msgstr ""
#: views.py:272
msgid "Data from URL is not a bootstrap setup."
msgstr ""
#: views.py:274
#, python-format
msgid "Error importing bootstrap setup from URL; %s."
msgstr ""
#: views.py:280
msgid "Import bootstrap setup from URL"
msgstr ""
#: views.py:299
#, python-format
msgid "Error erasing database; %s"
msgstr ""
#: views.py:301
msgid "Database erased successfully."
msgstr ""
#: views.py:311
msgid ""
"Are you sure you wish to erase the entire database and document storage?"
msgstr ""
#: views.py:312
msgid ""
"All documents, sources, metadata, metadata types, set, tags, indexes and "
"logs will be lost irreversibly!"
msgstr ""
#: views.py:329
msgid "Bootstrap repository successfully synchronized."
msgstr ""
#: views.py:331
#, python-format
msgid "Bootstrap repository synchronization error: %(error)s"
msgstr ""
#: views.py:338
msgid "Are you sure you wish to synchronize with the bootstrap repository?"
msgstr ""
Binary file not shown.
@@ -1,316 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: forms.py:50
msgid "Bootstrap setup file"
msgstr ""
#: forms.py:56
msgid "Bootstrap setup URL"
msgstr ""
#: links.py:16
msgid "bootstrap"
msgstr ""
#: links.py:17
msgid "bootstrap setup list"
msgstr ""
#: links.py:18
msgid "create new bootstrap setup"
msgstr ""
#: links.py:19
msgid "edit"
msgstr ""
#: links.py:20
msgid "delete"
msgstr ""
#: links.py:21
msgid "details"
msgstr ""
#: links.py:22
msgid "execute"
msgstr ""
#: links.py:23
msgid "dump current setup"
msgstr ""
#: links.py:24
msgid "erase database"
msgstr ""
#: links.py:27
msgid "export"
msgstr ""
#: links.py:28
msgid "import from file"
msgstr ""
#: links.py:29
msgid "import from URL"
msgstr ""
#: links.py:30
msgid "sync with repository"
msgstr ""
#: literals.py:20
msgid "JSON"
msgstr ""
#: literals.py:63
msgid "YAML"
msgstr ""
#: literals.py:64
msgid "Better YAML"
msgstr ""
#: models.py:30
msgid "name"
msgstr ""
#: models.py:31
msgid "slug"
msgstr ""
#: models.py:32 views.py:35
msgid "description"
msgstr ""
#: models.py:33
msgid "fixture"
msgstr ""
#: models.py:33
msgid "These are the actual database structure creation instructions."
msgstr ""
#: models.py:34 views.py:36
msgid "type"
msgstr ""
#: models.py:35
msgid "creation date and time"
msgstr ""
#: models.py:104 views.py:91 views.py:120 views.py:145 views.py:173
msgid "bootstrap setup"
msgstr ""
#: models.py:105 views.py:32
msgid "bootstrap setups"
msgstr ""
#: permissions.py:7
msgid "Database bootstrap"
msgstr ""
#: permissions.py:9
msgid "View bootstrap setups"
msgstr ""
#: permissions.py:10
msgid "Create bootstrap setups"
msgstr ""
#: permissions.py:11
msgid "Edit bootstrap setups"
msgstr ""
#: permissions.py:12
msgid "Delete bootstrap setups"
msgstr ""
#: permissions.py:13
msgid "Execute bootstrap setups"
msgstr ""
#: permissions.py:14
msgid "Dump the current project\\s setup into a bootstrap setup"
msgstr ""
#: permissions.py:15
msgid "Export bootstrap setups as files"
msgstr ""
#: permissions.py:16
msgid "Import new bootstrap setups"
msgstr ""
#: permissions.py:17
msgid "Sync the local bootstrap setups with a published repository"
msgstr ""
#: permissions.py:18
msgid "Erase the entire database and document storage"
msgstr ""
#: registry.py:8
msgid "Bootstrap"
msgstr ""
#: registry.py:9
msgid "Provides pre configured setups for indexes, document types, tags, etc."
msgstr ""
#: views.py:51
msgid "Bootstrap setup created successfully"
msgstr ""
#: views.py:54
msgid "Error creating bootstrap setup."
msgstr ""
#: views.py:59
msgid "create bootstrap"
msgstr ""
#: views.py:79
msgid "Bootstrap setup edited successfully"
msgstr ""
#: views.py:82
msgid "Error editing bootstrap setup."
msgstr ""
#: views.py:87
#, python-format
msgid "edit bootstrap setup: %s"
msgstr ""
#: views.py:112
#, python-format
msgid "Bootstrap setup: %s deleted successfully."
msgstr ""
#: views.py:114
#, python-format
msgid "Bootstrap setup: %(bootstrap)s, delete error: %(error)s"
msgstr ""
#: views.py:125
#, python-format
msgid "Are you sure you with to delete the bootstrap setup: %s?"
msgstr ""
#: views.py:165
msgid ""
"Cannot execute bootstrap setup, there is existing data. Erase all data and "
"try again."
msgstr ""
#: views.py:167
#, python-format
msgid "Error executing bootstrap setup; %s"
msgstr ""
#: views.py:169
#, python-format
msgid "Bootstrap setup \"%s\" executed successfully."
msgstr ""
#: views.py:181
#, python-format
msgid ""
"Are you sure you wish to execute the database bootstrap setup named: %s?"
msgstr ""
#: views.py:197
#, python-format
msgid "Error dumping configuration into a bootstrap setup; %s"
msgstr ""
#: views.py:201
msgid "Bootstrap setup created successfully."
msgstr ""
#: views.py:207
msgid "dump current setup into a bootstrap setup"
msgstr ""
#: views.py:241 views.py:269
msgid "Bootstrap setup imported successfully."
msgstr ""
#: views.py:244
msgid "File is not a bootstrap setup."
msgstr ""
#: views.py:246
#, python-format
msgid "Error importing bootstrap setup from file; %s."
msgstr ""
#: views.py:252
msgid "Import bootstrap setup from file"
msgstr ""
#: views.py:272
msgid "Data from URL is not a bootstrap setup."
msgstr ""
#: views.py:274
#, python-format
msgid "Error importing bootstrap setup from URL; %s."
msgstr ""
#: views.py:280
msgid "Import bootstrap setup from URL"
msgstr ""
#: views.py:299
#, python-format
msgid "Error erasing database; %s"
msgstr ""
#: views.py:301
msgid "Database erased successfully."
msgstr ""
#: views.py:311
msgid ""
"Are you sure you wish to erase the entire database and document storage?"
msgstr ""
#: views.py:312
msgid ""
"All documents, sources, metadata, metadata types, set, tags, indexes and "
"logs will be lost irreversibly!"
msgstr ""
#: views.py:329
msgid "Bootstrap repository successfully synchronized."
msgstr ""
#: views.py:331
#, python-format
msgid "Bootstrap repository synchronization error: %(error)s"
msgstr ""
#: views.py:338
msgid "Are you sure you wish to synchronize with the bootstrap repository?"
msgstr ""
Binary file not shown.
@@ -1,330 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Roberto Rosario <roberto.rosario.gonzalez@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-14 04:18-0400\n"
"PO-Revision-Date: 2012-12-12 07:20+0000\n"
"Last-Translator: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/mayan-edms/"
"language/es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:50
msgid "Bootstrap setup file"
msgstr ""
#: forms.py:56
msgid "Bootstrap setup URL"
msgstr ""
#: links.py:16
msgid "bootstrap"
msgstr "arranque"
#: links.py:17
msgid "bootstrap setup list"
msgstr "list de configuraciones de arranque"
#: links.py:18
msgid "create new bootstrap setup"
msgstr "crear nueva configuración de arranque"
#: links.py:19
msgid "edit"
msgstr "editar"
#: links.py:20
msgid "delete"
msgstr "borrar"
#: links.py:21
msgid "details"
msgstr "detalles"
#: links.py:22
msgid "execute"
msgstr "ejecutar"
#: links.py:23
msgid "dump current setup"
msgstr "grabar la configuración actual"
#: links.py:24
msgid "erase database"
msgstr "borrar la base de datos"
#: links.py:27
msgid "export"
msgstr "exportar"
#: links.py:28
msgid "import from file"
msgstr "importar desde el archivo"
#: links.py:29
msgid "import from URL"
msgstr "importar desde URL"
#: links.py:30
msgid "sync with repository"
msgstr "sincronizar con el repositorio"
#: literals.py:20
msgid "JSON"
msgstr "JSON"
#: literals.py:63
msgid "YAML"
msgstr "YAML"
#: literals.py:64
msgid "Better YAML"
msgstr "Better YAML"
#: models.py:30
msgid "name"
msgstr "nombre"
#: models.py:31
msgid "slug"
msgstr "identificador"
#: models.py:32 views.py:35
msgid "description"
msgstr "descripción"
#: models.py:33
msgid "fixture"
msgstr "código"
#: models.py:33
msgid "These are the actual database structure creation instructions."
msgstr ""
"Estas son la instrucciones reales para la creación de las estructuras de la "
"base de datos."
#: models.py:34 views.py:36
msgid "type"
msgstr "tipo"
#: models.py:35
msgid "creation date and time"
msgstr "fecha y hora de creación"
#: models.py:104 views.py:91 views.py:120 views.py:145 views.py:173
msgid "bootstrap setup"
msgstr "configuración de arranque"
#: models.py:105 views.py:32
msgid "bootstrap setups"
msgstr "configuraciones de arranque"
#: permissions.py:7
msgid "Database bootstrap"
msgstr "Arranque de base de datos"
#: permissions.py:9
msgid "View bootstrap setups"
msgstr "Ver las configuraciones de arranque"
#: permissions.py:10
msgid "Create bootstrap setups"
msgstr "Crear configuraciones de arranque"
#: permissions.py:11
msgid "Edit bootstrap setups"
msgstr "Editar las configuraciones de arranque"
#: permissions.py:12
msgid "Delete bootstrap setups"
msgstr "Eliminar las configuraciones de arranque"
#: permissions.py:13
msgid "Execute bootstrap setups"
msgstr "Ejecutar configuraciones de arranque"
#: permissions.py:14
msgid "Dump the current project\\s setup into a bootstrap setup"
msgstr ""
"Grabar la configuración actual del projecto en una configuración de arranque"
#: permissions.py:15
msgid "Export bootstrap setups as files"
msgstr ""
#: permissions.py:16
msgid "Import new bootstrap setups"
msgstr ""
#: permissions.py:17
msgid "Sync the local bootstrap setups with a published repository"
msgstr ""
#: permissions.py:18
msgid "Erase the entire database and document storage"
msgstr "Borrar toda la base de datos y almacenamiento de documentos"
#: registry.py:8
msgid "Bootstrap"
msgstr "Arranque"
#: registry.py:9
msgid "Provides pre configured setups for indexes, document types, tags, etc."
msgstr ""
"Proporciona configuraciones pre ajustadas para los índices, tipos de "
"documentos, etiquetas, etc"
#: views.py:51
msgid "Bootstrap setup created successfully"
msgstr ""
#: views.py:54
msgid "Error creating bootstrap setup."
msgstr "Error al crear la configuración de arranque."
#: views.py:59
msgid "create bootstrap"
msgstr "crear configuración de arranque"
#: views.py:79
msgid "Bootstrap setup edited successfully"
msgstr "Configuración de arranque editada exitosamente."
#: views.py:82
msgid "Error editing bootstrap setup."
msgstr "Error editando la configuración de arranque."
#: views.py:87
#, python-format
msgid "edit bootstrap setup: %s"
msgstr "editar configuración de arranque: %s"
#: views.py:112
#, python-format
msgid "Bootstrap setup: %s deleted successfully."
msgstr "Configuración de arranque :%s eliminada exitosamente."
#: views.py:114
#, python-format
msgid "Bootstrap setup: %(bootstrap)s, delete error: %(error)s"
msgstr ""
#: views.py:125
#, python-format
msgid "Are you sure you with to delete the bootstrap setup: %s?"
msgstr "¿Seguro que desea borrar la configuración de arranque: %s?"
#: views.py:165
msgid ""
"Cannot execute bootstrap setup, there is existing data. Erase all data and "
"try again."
msgstr ""
#: views.py:167
#, python-format
msgid "Error executing bootstrap setup; %s"
msgstr "Error al ejecutar la configuración de arranque; %s"
#: views.py:169
#, python-format
msgid "Bootstrap setup \"%s\" executed successfully."
msgstr "Configuración de arranque \"%s\" ejecutada exitosamente."
#: views.py:181
#, python-format
msgid ""
"Are you sure you wish to execute the database bootstrap setup named: %s?"
msgstr ""
#: views.py:197
#, python-format
msgid "Error dumping configuration into a bootstrap setup; %s"
msgstr ""
#: views.py:201
msgid "Bootstrap setup created successfully."
msgstr ""
#: views.py:207
#, fuzzy
msgid "dump current setup into a bootstrap setup"
msgstr ""
"Grabar la configuración actual del projecto en una configuración de arranque"
#: views.py:241 views.py:269
msgid "Bootstrap setup imported successfully."
msgstr ""
#: views.py:244
msgid "File is not a bootstrap setup."
msgstr ""
#: views.py:246
#, python-format
msgid "Error importing bootstrap setup from file; %s."
msgstr ""
#: views.py:252
msgid "Import bootstrap setup from file"
msgstr ""
#: views.py:272
msgid "Data from URL is not a bootstrap setup."
msgstr ""
#: views.py:274
#, python-format
msgid "Error importing bootstrap setup from URL; %s."
msgstr ""
#: views.py:280
msgid "Import bootstrap setup from URL"
msgstr ""
#: views.py:299
#, python-format
msgid "Error erasing database; %s"
msgstr "Error borrando la base de datos; %s"
#: views.py:301
msgid "Database erased successfully."
msgstr "Base de datos borrada exitosamente."
#: views.py:311
msgid ""
"Are you sure you wish to erase the entire database and document storage?"
msgstr ""
"¿Está seguro que desea borrar de la base de datos completamente y el "
"almacenamiento de documentos?"
#: views.py:312
msgid ""
"All documents, sources, metadata, metadata types, set, tags, indexes and "
"logs will be lost irreversibly!"
msgstr ""
"¡Todos los documentos, las fuentes, los metadatos, los tipos de metadatos, "
"los conjuntos de metadatos, las etiquetas, los índices y vitacoras se "
"perderán irreversiblemente!"
#: views.py:329
msgid "Bootstrap repository successfully synchronized."
msgstr ""
#: views.py:331
#, python-format
msgid "Bootstrap repository synchronization error: %(error)s"
msgstr ""
#: views.py:338
msgid "Are you sure you wish to synchronize with the bootstrap repository?"
msgstr ""

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