Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8974bf07a2 | ||
|
|
3beb07c373 | ||
|
|
766df7f38b | ||
|
|
ae48d80624 | ||
|
|
059dff02f3 | ||
|
|
18ae37228a | ||
|
|
8298f50334 | ||
|
|
7941cd83a0 | ||
|
|
b1c573dbcf | ||
|
|
e6750d3777 | ||
|
|
2b5943f15e | ||
|
|
6f324c4e00 | ||
|
|
352fcbae6e | ||
|
|
bf1aea0157 | ||
|
|
eda6d65184 | ||
|
|
d8525383f5 | ||
|
|
8ea22f3b3b | ||
|
|
1f6afd5629 | ||
|
|
c7ed8ca09c | ||
|
|
ee44435e47 | ||
|
|
600d674cb0 | ||
|
|
9cdbe77f54 | ||
|
|
0cbbcda2e7 | ||
|
|
bfe0096cc9 | ||
|
|
f061e32f00 | ||
|
|
6d946db0c8 | ||
|
|
a823bdc6be | ||
|
|
7bb53958de | ||
|
|
e7ba91fbaf | ||
|
|
121063ae00 | ||
|
|
af027acaa5 | ||
|
|
2fb8691028 | ||
|
|
cd6f503d68 | ||
|
|
1354fc6893 | ||
|
|
d0d9bd0365 | ||
|
|
8f777fd39b | ||
|
|
39863ab095 | ||
|
|
dabd76bc04 | ||
|
|
fedebac7c7 | ||
|
|
46072b8c4c | ||
|
|
387322faa2 | ||
|
|
afeef2dd02 | ||
|
|
d0c08fa32d | ||
|
|
0a57907a51 | ||
|
|
3ef608599b | ||
|
|
ae082ce52e | ||
|
|
19d268ce58 | ||
|
|
bd01ef489d | ||
|
|
072a883cdd | ||
|
|
bc0a539301 | ||
|
|
bdef1d817d | ||
|
|
f649b49f42 | ||
|
|
4dd56492dd | ||
|
|
38bc67a329 | ||
|
|
9b4186cabe | ||
|
|
321058a610 | ||
|
|
c7814f45ed | ||
|
|
86d349f18b | ||
|
|
60bfe94528 | ||
|
|
05883260f7 | ||
|
|
e9a0749edf | ||
|
|
456a3c55e3 | ||
|
|
e2d8e01f27 | ||
|
|
f565b99990 | ||
|
|
341b52655c | ||
|
|
ae6a481e82 | ||
|
|
f6d2468a88 | ||
|
|
046761bff0 | ||
|
|
0e7e546807 | ||
|
|
cbd5485301 | ||
|
|
c61542c433 | ||
|
|
9c5e6cc8c9 | ||
|
|
d680335ca9 | ||
|
|
ed95d0ff1e | ||
|
|
554d31a736 | ||
|
|
a247c63b9e | ||
|
|
6fab169290 | ||
|
|
58e1acacbb | ||
|
|
8c0633959b | ||
|
|
3b9fecb593 | ||
|
|
47e88b8e95 | ||
|
|
fb22f07436 | ||
|
|
163f4fa24f | ||
|
|
99129ead90 | ||
|
|
67da7d897d | ||
|
|
eb9056f332 | ||
|
|
766fd144b4 | ||
|
|
d6e0b6889a | ||
|
|
6e1230f554 | ||
|
|
96bb01fd7a | ||
|
|
3eb85afa17 | ||
|
|
2d3c1953e0 | ||
|
|
2f5bc98601 | ||
|
|
3f62a3a09a | ||
|
|
2ddbfc224f | ||
|
|
741919ad90 | ||
|
|
ffcc033c40 | ||
|
|
1ab72f6902 | ||
|
|
3cee2cdebb | ||
|
|
2d45f7ce5f | ||
|
|
de0c9afa18 |
-17
@@ -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
@@ -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
|
||||
@@ -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)
|
||||
@@ -1,51 +0,0 @@
|
||||

|
||||
|
||||
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=<Your MySQL root password>" > ~/.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=<Your MySQL root password>" > ~/.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.
|
||||
|
||||
@@ -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])
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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'
|
||||
@@ -1,8 +0,0 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
from .models import AccessEntry, DefaultAccessEntry
|
||||
|
||||
|
||||
def cleanup():
|
||||
AccessEntry.objects.all().delete()
|
||||
DefaultAccessEntry.objects.all().delete()
|
||||
@@ -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()]
|
||||
@@ -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)
|
||||
@@ -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])
|
||||
@@ -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.
@@ -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.
@@ -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.
@@ -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.
@@ -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.
@@ -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.
@@ -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.
@@ -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.
@@ -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 ""
|
||||
@@ -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)]
|
||||
@@ -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']
|
||||
@@ -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')
|
||||
@@ -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'))
|
||||
@@ -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 |
@@ -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())
|
||||
@@ -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'),
|
||||
|
||||
)
|
||||
@@ -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()
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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)))
|
||||
@@ -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()
|
||||
@@ -1,6 +0,0 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
from icons.literals import PLUGIN
|
||||
from icons import Icon
|
||||
|
||||
icon_app = Icon(PLUGIN)
|
||||
@@ -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']
|
||||
@@ -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']
|
||||
@@ -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']
|
||||
@@ -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']
|
||||
@@ -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')
|
||||
@@ -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 |
@@ -1,5 +0,0 @@
|
||||
from django.conf.urls.defaults import patterns, url
|
||||
|
||||
urlpatterns = patterns('app_registry.views',
|
||||
url(r'^list/$', 'app_list', (), 'app_list'),
|
||||
)
|
||||
@@ -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))
|
||||
@@ -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()])
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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 +0,0 @@
|
||||
BACKUP_JOB_QUEUE_NAME = 'backups_queue'
|
||||
@@ -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
|
||||
"""
|
||||
@@ -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'))
|
||||
@@ -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'),
|
||||
)
|
||||
@@ -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 +0,0 @@
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
from django.contrib import admin
|
||||
|
||||
from .models import BootstrapSetup
|
||||
|
||||
admin.site.register(BootstrapSetup)
|
||||
@@ -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:])
|
||||
@@ -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
|
||||
@@ -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'),
|
||||
)
|
||||
@@ -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)
|
||||
@@ -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]}
|
||||
@@ -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
Reference in New Issue
Block a user