Consolidate navigation tags, consolidate setup and tool link

This commit is contained in:
Roberto Rosario
2015-04-03 20:51:02 -04:00
parent 0246068cd0
commit 51ce5ca057
193 changed files with 434 additions and 2074 deletions

View File

@@ -4,16 +4,18 @@ from django import apps
from django.db.models.signals import post_migrate
from django.utils.translation import ugettext_lazy as _
from navigation.api import register_links
from project_setup.api import register_setup
from common.menus import (
menu_multi_item, menu_object, menu_secondary, menu_setup, menu_sidebar
)
from .classes import (
AccessHolder, AccessObject, AccessObjectClass, ClassAccessHolder
)
from .links import (
acl_class_acl_detail, acl_class_acl_list, acl_class_grant, acl_class_list,
acl_class_new_holder_for, acl_class_revoke, acl_detail, acl_grant,
acl_holder_new, acl_revoke, acl_setup_valid_classes
link_acl_class_acl_detail, link_acl_class_acl_list, link_acl_class_grant,
link_acl_class_list, link_acl_class_new_holder_for, link_acl_class_revoke,
link_acl_detail, link_acl_grant, link_acl_holder_new, link_acl_revoke,
link_acl_setup_valid_classes
)
from .models import CreatorSingleton
@@ -28,13 +30,22 @@ class ACLsApp(apps.AppConfig):
verbose_name = _('ACLs')
def ready(self):
register_links([AccessObject], [acl_holder_new], menu_name='sidebar')
register_links(AccessObjectClass, [acl_class_acl_list, acl_class_new_holder_for])
register_links(AccessHolder, [acl_detail])
register_links(['acls:acl_setup_valid_classes', 'acls:acl_class_acl_list', 'acls:acl_class_new_holder_for', 'acls:acl_class_acl_detail', 'acls:acl_class_multiple_grant', 'acls:acl_class_multiple_revoke'], [acl_class_list], menu_name='secondary_menu')
register_links(ClassAccessHolder, [acl_class_acl_detail])
register_links(['acls:acl_detail'], [acl_grant, acl_revoke], menu_name='multi_item_links')
register_links(['acls:acl_class_acl_detail'], [acl_class_grant, acl_class_revoke], menu_name='multi_item_links')
register_setup(acl_setup_valid_classes)
menu_sidebar.bind_links(links=[link_acl_holder_new], sources=[AccessObject])
#register_links(AccessObjectClass, [acl_class_acl_list, acl_class_new_holder_for])
#register_links(AccessHolder, [acl_detail])
#register_links(ClassAccessHolder, [acl_class_acl_detail])
#register_links(['acls:acl_detail'], [acl_grant, acl_revoke], menu_name='multi_item_links')
#register_links(['acls:acl_class_acl_detail'], [acl_class_grant, acl_class_revoke], menu_name='multi_item_links')
menu_setup.bind_links(links=[link_acl_setup_valid_classes])
post_migrate.connect(create_creator_user, dispatch_uid='create_creator_user')
menu_secondary.bind_links(
links=[link_acl_class_list],
sources=[
'acls:acl_setup_valid_classes', 'acls:acl_class_acl_list',
'acls:acl_class_new_holder_for', 'acls:acl_class_acl_detail',
'acls:acl_class_multiple_grant',
'acls:acl_class_multiple_revoke'
],
)

View File

@@ -2,20 +2,23 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .permissions import (
ACLS_CLASS_EDIT_ACL, ACLS_CLASS_VIEW_ACL, ACLS_EDIT_ACL, ACLS_VIEW_ACL
)
acl_list = {'text': _('ACLs'), 'view': 'acls:acl_list', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]}
acl_detail = {'text': _('Details'), 'view': 'acls:acl_detail', 'args': ['access_object.gid', 'object.gid'], 'famfam': 'key_go', 'permissions': [ACLS_VIEW_ACL]}
acl_grant = {'text': _('Grant'), 'view': 'acls:acl_multiple_grant', 'famfam': 'key_add', 'permissions': [ACLS_EDIT_ACL]}
acl_revoke = {'text': _('Revoke'), 'view': 'acls:acl_multiple_revoke', 'famfam': 'key_delete', 'permissions': [ACLS_EDIT_ACL]}
acl_holder_new = {'text': _('New holder'), 'view': 'acls:acl_holder_new', 'args': 'access_object.gid', 'famfam': 'user', 'permissions': [ACLS_EDIT_ACL]}
link_acl_list = Link(permissions=[ACLS_VIEW_ACL], text=_('ACLs'), view='acls:acl_list')
acl_setup_valid_classes = {'text': _('Default ACLs'), 'view': 'acls:acl_setup_valid_classes', 'icon': 'fa fa-lock', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_list = {'text': _('Classes'), 'view': 'acls:acl_setup_valid_classes', 'famfam': 'package', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_acl_list = {'text': _('ACLs for class'), 'view': 'acls:acl_class_acl_list', 'args': 'object.gid', 'famfam': 'lock_go', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_acl_detail = {'text': _('Details'), 'view': 'acls:acl_class_acl_detail', 'args': ['access_object_class.gid', 'object.gid'], 'famfam': 'key_go', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_new_holder_for = {'text': _('New holder'), 'view': 'acls:acl_class_new_holder_for', 'args': 'object.gid', 'famfam': 'user', 'permissions': [ACLS_CLASS_EDIT_ACL]}
acl_class_grant = {'text': _('Grant'), 'view': 'acls:acl_class_multiple_grant', 'famfam': 'key_add', 'permissions': [ACLS_CLASS_EDIT_ACL]}
acl_class_revoke = {'text': _('Revoke'), 'view': 'acls:acl_class_multiple_revoke', 'famfam': 'key_delete', 'permissions': [ACLS_CLASS_EDIT_ACL]}
link_acl_detail = Link(permissions=[ACLS_VIEW_ACL], text=_('Details'), view='acls:acl_detail', args=['access_object.gid', 'object.gid'])
link_acl_grant = Link(permissions=[ACLS_EDIT_ACL], text=_('Grant'), view='acls:acl_multiple_grant')
link_acl_revoke = Link(permissions=[ACLS_EDIT_ACL], text=_('Revoke'), view='acls:acl_multiple_revoke')
link_acl_holder_new = Link(permissions=[ACLS_EDIT_ACL], text=_('New holder'), view='acls:acl_holder_new', args='access_object.gid')
link_acl_setup_valid_classes = Link(icon='fa fa-lock', permissions=[ACLS_CLASS_VIEW_ACL], text=_('Default ACLs'), view='acls:acl_setup_valid_classes')
link_acl_class_list = Link(permissions=[ACLS_CLASS_VIEW_ACL], text=_('Classes'), view='acls:acl_setup_valid_classes')
link_acl_class_acl_list = Link(permissions=[ACLS_CLASS_VIEW_ACL], text=_('ACLs for class'), view='acls:acl_class_acl_list', args='object.gid')
link_acl_class_acl_detail = Link(permissions=[ACLS_CLASS_VIEW_ACL], text=_('Details'), view='acls:acl_class_acl_detail', args=['access_object_class.gid', 'object.gid'])
link_acl_class_new_holder_for = Link(permissions=[ACLS_CLASS_EDIT_ACL], text=_('New holder'), view='acls:acl_class_new_holder_for', args='object.gid')
link_acl_class_grant = Link(permissions=[ACLS_CLASS_EDIT_ACL], text=_('Grant'), view='acls:acl_class_multiple_grant')
link_acl_class_revoke = Link(permissions=[ACLS_CLASS_EDIT_ACL], text=_('Revoke'), view='acls:acl_class_multiple_revoke')

View File

@@ -1,73 +0,0 @@
from __future__ import unicode_literals
import logging
from django.core.exceptions import PermissionDenied
from django.template import (
Library, Node, TemplateSyntaxError, Variable, VariableDoesNotExist
)
from acls.models import AccessEntry
logger = logging.getLogger(__name__)
register = Library()
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', ','.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['access'] = False
logger.debug('no obj, access False')
return ''
if not permission_list:
# There is no permissions list to check against which means
# this link is available for all
context['access'] = True
return ''
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['access'] = False
logger.debug('access: False')
return ''
else:
context['access'] = True
logger.debug('access: True')
return ''
else:
context['access'] = False
logger.debug('No object, access: False')
return ''
@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('%r tag requires arguments' % token.contents.split()[0])
return CheckAccessNode(*args.split())

View File

@@ -107,7 +107,7 @@
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
{% get_top_menu_links as menu_links %}
{% get_menu_links 'main menu' as menu_links %}
{% for link in menu_links %}
{% with 'true' as as_li %}
{% with 'true' as hide_active_anchor %}
@@ -158,17 +158,8 @@
{% get_action_links as links %}
{% get_object_facet_links as form_navigation_links %}
{% comment %}
{% if navigation_object_list %}
{% for navigation_object_dict in navigation_object_list %}
{% copy_variable navigation_object_dict.object as "navigation_object_name" %}
{% get_object_navigation_links "form_header" as form_navigation_links %}
{% endfor %}
{% else %}
{% get_object_navigation_links "form_header" as form_navigation_links %}
{% endif %}
{% endcomment %}
{% get_menu_links 'object facet' as form_navigation_links %}
<div class="row">
{% if links or form_navigation_links %}
<div class="col-xs-8 col-sm-8 col-md-10 col-lg-10">

View File

@@ -106,7 +106,7 @@
{% copy_variable list_object_variable_name as "navigation_object_name" %}
{% endif %}
<td class="last">
{% get_object_links as links %}
{% get_menu_links 'object menu' as links %}
{% with links as object_navigation_links %}
{% with 'true' as horizontal %}
{% include 'navigation/generic_navigation.html' %}

View File

@@ -1,20 +1,11 @@
{% load permission_tags %}
{% load navigation_tags %}
{% load acl_tags %}
{% with link.permissions as permissions %}
{% check_permissions request.user permissions %}
{% check_access permissions request.user object %}
{% if permission or access %}
{% if as_li %}
{% if as_li %}
<li class="{% if link.active and li_class_active %}{{ li_class_active }}{% endif %}">
{% endif %}
{% endif %}
{% include link_template|default:'navigation/generic_link_instance.html' %}
{% if as_li %}
{% if as_li %}
</li>
{% endif %}
{% endif %}
{% endwith %}
{% endif %}

View File

@@ -1,7 +1,5 @@
{% load static %}
<div class="{% if div_class %}{{ div_class }}{% else %}col-xs-12 col-sm-6 col-md-4 col-lg-3{% endif %}">
<a class="btn btn-default btn-lg btn-block" href="{% url link.view %}" style="margin-bottom: 5px;">
<a class="btn btn-default btn-lg btn-block" href="{{ link.url }}" style="margin-bottom: 5px;">
<i class="{{ link.icon }} fa-2x"></i><br>
{{ link.text }}
</a>

View File

@@ -6,14 +6,14 @@ from django import apps
from django.utils.translation import ugettext_lazy as _
from acls.api import class_permissions
from common.menus import menu_main
from common.menus import menu_facet, menu_main, menu_sidebar
from documents.models import Document
from mayan.celery import app
from navigation.api import register_links
from rest_api.classes import APIEndPoint
from .links import (
checkin_document, checkout_document, checkout_info, link_checkout_list
link_checkin_document, link_checkout_document, link_checkout_info,
link_checkout_list
)
from .models import DocumentCheckout
from .permissions import (
@@ -50,9 +50,8 @@ class CheckoutsApp(apps.AppConfig):
PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE
])
register_links(Document, [checkout_info], menu_name='form_header')
register_links(['checkouts:checkout_info', 'checkouts:checkout_document', 'checkouts:checkin_document'], [checkout_document, checkin_document], menu_name="sidebar")
menu_facet.bind_links(links=[link_checkout_info], sources=[Document])
menu_main.bind_links(links=[link_checkout_list])
menu_sidebar.bind_links(links=[link_checkout_document, link_checkin_document], sources=['checkouts:checkout_info', 'checkouts:checkout_document', 'checkouts:checkin_document'])
APIEndPoint('checkouts')

View File

@@ -19,6 +19,6 @@ def is_not_checked_out(context):
link_checkout_list = Link(icon='fa fa-shopping-cart', text=_('Checkouts'), view='checkouts:checkout_list')
checkout_document = {'text': _('Check out document'), 'view': 'checkouts:checkout_document', 'args': 'object.pk', 'famfam': 'basket_put', 'condition': is_not_checked_out, 'permissions': [PERMISSION_DOCUMENT_CHECKOUT]}
checkin_document = {'text': _('Check in document'), 'view': 'checkouts:checkin_document', 'args': 'object.pk', 'famfam': 'basket_remove', 'condition': is_checked_out, 'permissions': [PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE]}
checkout_info = {'text': _('Check in/out'), 'view': 'checkouts:checkout_info', 'args': 'object.pk', 'famfam': 'basket', 'permissions': [PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE, PERMISSION_DOCUMENT_CHECKOUT]}
link_checkout_document = Link(condition=is_not_checked_out, permissions=[PERMISSION_DOCUMENT_CHECKOUT], text=_('Check out document'), view='checkouts:checkout_document', args='object.pk')
link_checkin_document = Link(condition=is_checked_out, permissions=[PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE], text=_('Check in document'), view='checkouts:checkin_document', args='object.pk')
link_checkout_info = Link(permissions=[PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE, PERMISSION_DOCUMENT_CHECKOUT], text=_('Check in/out'), view='checkouts:checkout_info', args='object.pk')

View File

@@ -0,0 +1 @@
from .menus import * # NOQA

View File

@@ -12,7 +12,6 @@ from django.db.models.signals import post_migrate, post_save
from django.utils.translation import ugettext_lazy as _
from common import settings as common_settings
from navigation.api import register_links
from .links import (
link_about, link_current_user_details, link_current_user_edit,
@@ -95,10 +94,19 @@ class CommonApp(apps.AppConfig):
def ready(self):
menu_main.bind_links(links=[link_about], position=-1)
menu_secondary.bind_links(links=[link_about, link_license], sources=['common:about_view', 'common:license_view'])
register_links(['common:current_user_details', 'common:current_user_edit', 'common:current_user_locale_profile_details', 'common:current_user_locale_profile_edit', 'common:password_change_view'], [link_current_user_details, link_current_user_edit, link_current_user_locale_profile_details, link_current_user_locale_profile_edit, link_password_change, link_logout], menu_name='secondary_menu')
#register_links(['common:about_view', 'common:license_view'], [link_about, link_license], menu_name='secondary_menu')
menu_secondary.bind_links(
links=[link_about, link_license],
sources=['common:about_view', 'common:license_view']
)
menu_secondary.bind_links(
links=[
link_current_user_details, link_current_user_edit,
link_current_user_locale_profile_details,
link_current_user_locale_profile_edit,
link_password_change, link_logout
],
sources=['common:current_user_details', 'common:current_user_edit', 'common:current_user_locale_profile_details', 'common:current_user_locale_profile_edit', 'common:password_change_view']
)
post_migrate.connect(create_superuser_and_anonymous_user, dispatch_uid='create_superuser_and_anonymous_user')
post_save.connect(auto_admin_account_passwd_change, dispatch_uid='auto_admin_account_passwd_change', sender=User)

View File

@@ -4,18 +4,16 @@ from django.utils.translation import ugettext_lazy as _
from navigation import Link
def has_usable_password(context):
return context['request'].user.has_usable_password
link_about = Link(icon='fa fa-question', text=_('About'), view='common:about_view')
link_current_user_details = Link(icon='fa fa-user', text=_('User details'), view='common:current_user_details')
link_current_user_edit = Link(icon='fa fa-user', text=_('Edit details'), view='common:current_user_edit')
link_current_user_locale_profile_details = Link(icon='fa fa-globe', text=_('Locale profile'), view='common:current_user_locale_profile_details')
link_current_user_locale_profile_edit = Link(icon='fa fa-globe', text=_('Edit locale profile'), view='common:current_user_locale_profile_edit')
link_license = Link(icon='fa fa-book', text=_('License'), view='common:license_view')
link_password_change = {'text': _('Change password'), 'view': 'common:password_change_view', 'icon': 'fa fa-key', 'condition': has_usable_password}
link_current_user_details = {'text': _('User details'), 'view': 'common:current_user_details', 'icon': 'fa fa-user'}
link_current_user_edit = {'text': _('Edit details'), 'view': 'common:current_user_edit', 'icon': 'fa fa-user'}
link_current_user_locale_profile_details = {'text': _('Locale profile'), 'view': 'common:current_user_locale_profile_details', 'icon': 'fa fa-globe'}
link_current_user_locale_profile_edit = {'text': _('Edit locale profile'), 'view': 'common:current_user_locale_profile_edit', 'icon': 'fa fa-globe'}
link_logout = {'text': _('Logout'), 'view': 'common:logout_view', 'icon': 'fa fa-sign-out'}
link_logout = Link(icon='fa fa-sign-out', text=_('Logout'), view='common:logout_view')
link_password_change = Link(condition=has_usable_password, icon='fa fa-key', text=_('Change password'), view='common:password_change_view')

View File

@@ -2,8 +2,16 @@ from __future__ import unicode_literals
from navigation import Menu
__all__ = (
'menu_facet', 'menu_object', 'menu_main', 'menu_multi_item',
'menu_secondary', 'menu_setup', 'menu_sidebar', 'menu_tools'
)
menu_facet = Menu(name='object facet')
menu_object = Menu(name='object menu')
menu_main = Menu(name='main menu')
menu_multi_item = Menu(name='multi item menu')
menu_secondary = Menu(name='secondary menu')
menu_setup = Menu(name='setup menu')
menu_sidebar = Menu(name='sidebar menu')
menu_tools = Menu(name='tools menu')

View File

@@ -5,12 +5,11 @@ from django.utils.translation import ugettext_lazy as _
from hkp import Key as KeyServerKey
from navigation.api import register_links
from project_setup.api import register_setup
from common import menu_setup
from .api import Key
from .links import (
key_delete, key_query, key_receive, key_setup, public_keys
key_delete, key_query, key_receive, link_key_setup, public_keys
)
@@ -19,7 +18,8 @@ class DjangoGPGApp(apps.AppConfig):
verbose_name = _('Django GPG')
def ready(self):
register_links(['django_gpg:key_delete', 'django_gpg:key_public_list', 'django_gpg:key_query'], [public_keys, key_query], menu_name='sidebar')
register_links(Key, [key_delete])
register_links(KeyServerKey, [key_receive])
register_setup(key_setup)
# TODO: convert
#register_links(['django_gpg:key_delete', 'django_gpg:key_public_list', 'django_gpg:key_query'], [public_keys, key_query], menu_name='sidebar')
#register_links(Key, [key_delete])
#register_links(KeyServerKey, [key_receive])
menu_setup.bind_links(links=[link_key_setup])

View File

@@ -2,6 +2,8 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .permissions import (
PERMISSION_KEY_DELETE, PERMISSION_KEY_RECEIVE, PERMISSION_KEY_VIEW,
PERMISSION_KEYSERVER_QUERY
@@ -12,4 +14,4 @@ public_keys = {'text': _('Public keys'), 'view': 'django_gpg:key_public_list', '
key_delete = {'text': _('Delete'), 'view': 'django_gpg:key_delete', 'args': ['object.fingerprint', 'object.type'], 'famfam': 'key_delete', 'permissions': [PERMISSION_KEY_DELETE]}
key_query = {'text': _('Query keyservers'), 'view': 'django_gpg:key_query', 'famfam': 'zoom', 'permissions': [PERMISSION_KEYSERVER_QUERY]}
key_receive = {'text': _('Import'), 'view': 'django_gpg:key_receive', 'args': 'object.keyid', 'famfam': 'key_add', 'keep_query': True, 'permissions': [PERMISSION_KEY_RECEIVE]}
key_setup = {'text': _('Key management'), 'view': 'django_gpg:key_public_list', 'args': 'object.pk', 'icon': 'fa fa-key', 'permissions': [PERMISSION_KEY_VIEW]}
link_key_setup = Link(icon='fa fa-key', permissions=[PERMISSION_KEY_VIEW], text=_('Key management'), view='django_gpg:key_public_list', args='object.pk')

View File

@@ -6,7 +6,6 @@ from django.utils.translation import ugettext_lazy as _
from acls.api import class_permissions
from acls.permissions import ACLS_VIEW_ACL, ACLS_EDIT_ACL
from documents.models import Document
from navigation.api import register_links
from .links import acl_list
@@ -16,7 +15,8 @@ class DocumentACLsApp(apps.AppConfig):
verbose_name = _('Document ACLs')
def ready(self):
register_links(Document, [acl_list], menu_name='form_header')
#TODO: convert
#register_links(Document, [acl_list], menu_name='form_header')
class_permissions(Document, [
ACLS_VIEW_ACL,

View File

@@ -9,7 +9,7 @@ from acls.api import class_permissions
from common.classes import ModelAttribute
from common.utils import encapsulate
from documents.models import Document
from navigation.api import register_links, register_model_list_columns
from navigation.api import register_model_list_columns
from .links import comment_add, comment_delete, comments_for_document
from .permissions import (
@@ -32,7 +32,8 @@ class DocumentCommentsApp(apps.AppConfig):
)
)
class_permissions(Document, [PERMISSION_COMMENT_CREATE,
class_permissions(Document, [
PERMISSION_COMMENT_CREATE,
PERMISSION_COMMENT_DELETE,
PERMISSION_COMMENT_VIEW])
@@ -51,8 +52,9 @@ class DocumentCommentsApp(apps.AppConfig):
}
])
register_links(['comments:comments_for_document', 'comments:comment_add', 'comments:comment_delete', 'comments:comment_multiple_delete'], [comment_add], menu_name='sidebar')
register_links(Comment, [comment_delete])
register_links(Document, [comments_for_document], menu_name='form_header')
# TODO: convert
#register_links(['comments:comments_for_document', 'comments:comment_add', 'comments:comment_delete', 'comments:comment_multiple_delete'], [comment_add], menu_name='sidebar')
#register_links(Comment, [comment_delete])
#register_links(Document, [comments_for_document], menu_name='form_header')
ModelAttribute(Document, label=_('Comments'), name='comments', type_name='related')

View File

@@ -4,17 +4,15 @@ from django import apps
from django.db.models.signals import post_save, post_delete
from django.utils.translation import ugettext_lazy as _
from common.menus import menu_main
from common import menu_main, menu_setup
from documents.models import Document
from main.api import register_maintenance_links
from metadata.models import DocumentMetadata
from navigation.api import register_links
from project_setup.api import register_setup
from rest_api.classes import APIEndPoint
from .links import (
document_index_list, link_index_main_menu, index_parent,
index_setup, index_setup_create, index_setup_document_types,
link_index_setup, index_setup_create, index_setup_document_types,
index_setup_delete, index_setup_edit, index_setup_list, index_setup_view,
link_rebuild_index_instances, template_node_create, template_node_delete,
template_node_edit
@@ -46,13 +44,14 @@ class DocumentIndexingApp(apps.AppConfig):
register_maintenance_links([link_rebuild_index_instances], namespace='document_indexing', title=_('Indexes'))
register_links(Document, [document_index_list], menu_name='form_header')
register_links([Index, 'indexing:index_setup_list', 'indexing:index_setup_create'], [index_setup_list, index_setup_create], menu_name='secondary_menu')
register_links(Index, [index_setup_edit, index_setup_view, index_setup_document_types, index_setup_delete])
register_links(IndexInstanceNode, [index_parent])
register_links(IndexTemplateNode, [template_node_create, template_node_edit, template_node_delete])
# TODO: convert
#register_links(Document, [document_index_list], menu_name='form_header')
#register_links([Index, 'indexing:index_setup_list', 'indexing:index_setup_create'], [index_setup_list, index_setup_create], menu_name='secondary_menu')
#register_links(Index, [index_setup_edit, index_setup_view, index_setup_document_types, index_setup_delete])
#register_links(IndexInstanceNode, [index_parent])
#register_links(IndexTemplateNode, [template_node_create, template_node_edit, template_node_delete])
register_setup(index_setup)
menu_setup.bind_links(links=[link_index_setup])
menu_main.bind_links(links=[link_index_main_menu])

View File

@@ -23,7 +23,7 @@ def is_not_root_node(context):
link_index_main_menu = Link(icon='fa fa-sitemap', text=_('Indexes'), view='indexing:index_list')
index_setup = {'text': _('Indexes'), 'view': 'indexing:index_setup_list', 'icon': 'fa fa-sitemap', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]}
link_index_setup = Link(icon='fa fa-sitemap', permissions=[PERMISSION_DOCUMENT_INDEXING_SETUP], text=_('Indexes'), view='indexing:index_setup_list')
index_setup_list = {'text': _('Indexes'), 'view': 'indexing:index_setup_list', 'famfam': 'tab', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]}
index_setup_create = {'text': _('Create index'), 'view': 'indexing:index_setup_create', 'famfam': 'tab_add', 'permissions': [PERMISSION_DOCUMENT_INDEXING_CREATE]}
index_setup_edit = {'text': _('Edit'), 'view': 'indexing:index_setup_edit', 'args': 'index.pk', 'famfam': 'tab_edit', 'permissions': [PERMISSION_DOCUMENT_INDEXING_EDIT]}

View File

@@ -14,7 +14,6 @@ from acls.api import class_permissions
from django_gpg.exceptions import GPGDecryptionError
from django_gpg.runtime import gpg
from documents.models import Document, DocumentVersion
from navigation.api import register_links
from .links import (
document_signature_delete, document_signature_download,
@@ -58,8 +57,9 @@ class DocumentSignaturesApp(apps.AppConfig):
verbose_name = _('Document signatures')
def ready(self):
register_links(Document, [document_verify], menu_name='form_header')
register_links(['signatures:document_verify', 'signatures:document_signature_upload', 'signatures:document_signature_download', 'signatures:document_signature_delete'], [document_signature_upload, document_signature_download, document_signature_delete], menu_name='sidebar')
# TODO: convert
#register_links(Document, [document_verify], menu_name='form_header')
#register_links(['signatures:document_verify', 'signatures:document_signature_upload', 'signatures:document_signature_download', 'signatures:document_signature_delete'], [document_signature_upload, document_signature_download, document_signature_delete], menu_name='sidebar')
DocumentVersion.register_pre_open_hook(1, document_pre_open_hook)
DocumentVersion.register_post_save_hook(1, document_post_save_hook)

View File

@@ -4,10 +4,10 @@ from django import apps
from django.db.models.signals import post_save
from django.utils.translation import ugettext_lazy as _
from common import menu_setup
from common.utils import encapsulate
from documents.models import Document
from navigation.api import register_links, register_model_list_columns
from project_setup.api import register_setup
from navigation.api import register_model_list_columns
from .models import (
Workflow, WorkflowInstance, WorkflowInstanceLogEntry, WorkflowState,
@@ -37,7 +37,7 @@ class DocumentStatesApp(apps.AppConfig):
def ready(self):
post_save.connect(launch_workflow, dispatch_uid='launch_workflow', sender=Document)
register_setup(link_setup_workflow_list)
menu_setup.bind_links(links=[link_setup_workflow_list])
register_model_list_columns(Workflow, [
{
@@ -102,10 +102,11 @@ class DocumentStatesApp(apps.AppConfig):
},
])
register_links([Document], [link_document_workflow_instance_list], menu_name='form_header')
register_links([WorkflowInstance], [link_workflow_instance_detail, link_workflow_instance_transition])
register_links([Workflow, 'document_states:setup_workflow_create', 'document_states:setup_workflow_list'], [link_setup_workflow_list, link_setup_workflow_create], menu_name='secondary_menu')
register_links([Workflow], [link_setup_workflow_states, link_setup_workflow_transitions, link_setup_workflow_document_types, link_setup_workflow_edit, link_setup_workflow_delete])
register_links([Workflow], [link_setup_workflow_state_create, link_setup_workflow_transition_create], menu_name='sidebar')
register_links([WorkflowState], [link_setup_workflow_state_edit, link_setup_workflow_state_delete])
register_links([WorkflowTransition], [link_setup_workflow_transition_edit, link_setup_workflow_transition_delete])
# TODO: convert
#register_links([Document], [link_document_workflow_instance_list], menu_name='form_header')
#register_links([WorkflowInstance], [link_workflow_instance_detail, link_workflow_instance_transition])
#register_links([Workflow, 'document_states:setup_workflow_create', 'document_states:setup_workflow_list'], [link_setup_workflow_list, link_setup_workflow_create], menu_name='secondary_menu')
#register_links([Workflow], [link_setup_workflow_states, link_setup_workflow_transitions, link_setup_workflow_document_types, link_setup_workflow_edit, link_setup_workflow_delete])
##register_links([Workflow], [link_setup_workflow_state_create, link_setup_workflow_transition_create], menu_name='sidebar')
#register_links([WorkflowState], [link_setup_workflow_state_edit, link_setup_workflow_state_delete])
#register_links([WorkflowTransition], [link_setup_workflow_transition_edit, link_setup_workflow_transition_delete])

View File

@@ -2,7 +2,9 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
link_setup_workflow_list = {'text': _('Workflows'), 'view': 'document_states:setup_workflow_list', 'icon': 'fa fa-table'}
from navigation import Link
link_setup_workflow_list = Link(icon='fa fa-table', text=_('Workflows'), view='document_states:setup_workflow_list')
link_setup_workflow_create = {'text': _('Create'), 'view': 'document_states:setup_workflow_create', 'famfam': 'table_add'}
link_setup_workflow_delete = {'text': _('Delete'), 'view': 'document_states:setup_workflow_delete', 'args': 'object.pk', 'famfam': 'table_delete'}
link_setup_workflow_edit = {'text': _('Edit'), 'view': 'document_states:setup_workflow_edit', 'args': 'object.pk', 'famfam': 'table_edit'}

View File

@@ -9,15 +9,13 @@ from actstream import registry
from acls.api import class_permissions
from common.classes import ModelAttribute
from common.menus import menu_facet, menu_object
from common import menu_facet, menu_object, menu_setup
from common.utils import encapsulate, validate_path
from dynamic_search.classes import SearchModel
from events.permissions import PERMISSION_EVENTS_VIEW
from main import FrontPageButton, MissingItem
from main.api import register_maintenance_links
from navigation.api import register_links, register_model_list_columns
from navigation.links import link_spacer
from project_setup.api import register_setup
from navigation.api import register_model_list_columns
from rest_api.classes import APIEndPoint
from statistics.classes import StatisticNamespace
@@ -26,7 +24,7 @@ from .links import (
link_clear_image_cache, link_document_clear_transformations,
link_document_content, link_document_delete, link_document_document_type_edit,
link_document_events_view, document_multiple_document_type_edit,
link_document_download, link_document_edit, document_list, document_list_recent,
link_document_download, link_document_edit, link_document_list, link_document_list_recent,
document_multiple_delete, document_multiple_clear_transformations,
document_multiple_download, document_multiple_update_page_count,
document_page_edit, document_page_navigation_first,
@@ -40,7 +38,7 @@ from .links import (
link_document_properties, document_type_create, document_type_delete,
document_type_edit, document_type_filename_create,
document_type_filename_delete, document_type_filename_edit,
document_type_filename_list, document_type_list, document_type_setup,
document_type_filename_list, document_type_list, link_document_type_setup,
link_document_update_page_count, document_version_download,
link_document_version_list, document_version_revert
)
@@ -64,11 +62,11 @@ class DocumentsApp(apps.AppConfig):
verbose_name = _('Documents')
def ready(self):
# Register document type links
register_links(DocumentType, [document_type_edit, document_type_filename_list, document_type_delete])
register_links([DocumentType, 'documents:document_type_create', 'documents:document_type_list'], [document_type_list, document_type_create], menu_name='secondary_menu')
register_links(DocumentTypeFilename, [document_type_filename_edit, document_type_filename_delete])
register_links([DocumentTypeFilename, 'documents:document_type_filename_list', 'documents:document_type_filename_create'], [document_type_filename_create], menu_name='sidebar')
# Document type links
#register_links(DocumentType, [document_type_edit, document_type_filename_list, document_type_delete])
#register_links([DocumentType, 'documents:document_type_create', 'documents:document_type_list'], [document_type_list, document_type_create], menu_name='secondary_menu')
#register_links(DocumentTypeFilename, [document_type_filename_edit, document_type_filename_delete])
#register_links([DocumentTypeFilename, 'documents:document_type_filename_list', 'documents:document_type_filename_create'], [document_type_filename_create], menu_name='sidebar')
# Register document facet links
menu_facet.bind_links(links=[link_document_preview], sources=[Document], position=0)
@@ -79,28 +77,28 @@ class DocumentsApp(apps.AppConfig):
# Document actions
menu_object.bind_links(links=[link_document_edit, link_document_document_type_edit, link_document_print, link_document_delete, link_document_download, link_document_clear_transformations, link_document_update_page_count], sources=[Document])
register_links([Document], [document_multiple_clear_transformations, document_multiple_delete, document_multiple_download, document_multiple_update_page_count, document_multiple_document_type_edit, link_spacer], menu_name='multi_item_links')
#register_links([Document], [document_multiple_clear_transformations, document_multiple_delete, document_multiple_download, document_multiple_update_page_count, document_multiple_document_type_edit, link_spacer], menu_name='multi_item_links')
# Document Version links
register_links(DocumentVersion, [document_version_revert, document_version_download])
#register_links(DocumentVersion, [document_version_revert, document_version_download])
# Document page links
register_links(DocumentPage, [
document_page_transformation_list, document_page_view,
document_page_text, document_page_edit,
])
#register_links(DocumentPage, [
# document_page_transformation_list, document_page_view,
# document_page_text, document_page_edit,
#])
# Document page navigation links
register_links(DocumentPage, [
document_page_navigation_first, document_page_navigation_previous,
document_page_navigation_next, document_page_navigation_last
], menu_name='sidebar')
#register_links(DocumentPage, [
# document_page_navigation_first, document_page_navigation_previous,
# document_page_navigation_next, document_page_navigation_last
#], menu_name='sidebar')
register_links(['documents:document_page_view'], [document_page_rotate_left, document_page_rotate_right, document_page_zoom_in, document_page_zoom_out, document_page_view_reset], menu_name='form_header')
register_links(DocumentPageTransformation, [document_page_transformation_edit, document_page_transformation_delete])
register_links('documents:document_page_transformation_list', [document_page_transformation_create], menu_name='sidebar')
register_links('documents:document_page_transformation_create', [document_page_transformation_create], menu_name='sidebar')
register_links(['documents:document_page_transformation_edit', 'documents:document_page_transformation_delete'], [document_page_transformation_create], menu_name='sidebar')
#register_links(['documents:document_page_view'], [document_page_rotate_left, document_page_rotate_right, document_page_zoom_in, document_page_zoom_out, document_page_view_reset], menu_name='form_header')
#register_links(DocumentPageTransformation, [document_page_transformation_edit, document_page_transformation_delete])
#register_links('documents:document_page_transformation_list', [document_page_transformation_create], menu_name='sidebar')
#register_links('documents:document_page_transformation_create', [document_page_transformation_create], menu_name='sidebar')
#register_links(['documents:document_page_transformation_edit', 'documents:document_page_transformation_delete'], [document_page_transformation_create], menu_name='sidebar')
register_maintenance_links([link_clear_image_cache], namespace='documents', title=_('Documents'))
register_model_list_columns(Document, [
@@ -116,7 +114,7 @@ class DocumentsApp(apps.AppConfig):
if (not validate_path(document_settings.CACHE_PATH)) or (not document_settings.CACHE_PATH):
setattr(document_settings, 'CACHE_PATH', tempfile.mkdtemp())
register_setup(document_type_setup)
menu_setup.bind_links(links=[link_document_type_setup])
class_permissions(Document, [
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD,
@@ -147,8 +145,8 @@ class DocumentsApp(apps.AppConfig):
ModelAttribute(Document, label=_('Label'), name='label', type_name='field')
FrontPageButton(link=document_list_recent)
FrontPageButton(link=document_list)
FrontPageButton(link=link_document_list_recent)
FrontPageButton(link=link_document_list)
registry.register(Document)

View File

@@ -55,8 +55,8 @@ link_document_print = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Print
link_document_update_page_count = Link(permissions=[PERMISSION_DOCUMENT_TOOLS], text=_('Reset page count'), view='documents:document_update_page_count', args='object.pk')
# Views
document_list = {'text': _('All documents'), 'view': 'documents:document_list', 'icon': 'fa fa-file'}
document_list_recent = {'text': _('Recent documents'), 'view': 'documents:document_list_recent', 'icon': 'fa fa-clock-o'}
link_document_list = Link(icon='fa fa-file', text=_('All documents'), view='documents:document_list')
link_document_list_recent = Link(icon='fa fa-clock-o', text=_('Recent documents'), view='documents:document_list_recent')
document_multiple_delete = {'text': _('Delete'), 'view': 'documents:document_multiple_delete', 'famfam': 'page_delete', 'permissions': [PERMISSION_DOCUMENT_DELETE]}
document_multiple_document_type_edit = {'text': _('Change type'), 'view': 'documents:document_multiple_document_type_edit', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_PROPERTIES_EDIT]}
document_multiple_download = {'text': _('Download'), 'view': 'documents:document_multiple_download', 'famfam': 'page_save', 'permissions': [PERMISSION_DOCUMENT_DOWNLOAD]}
@@ -95,7 +95,7 @@ document_version_revert = {'text': _('Revert'), 'view': 'documents:document_vers
# Document type related links
document_type_list = {'text': _('Document types'), 'view': 'documents:document_type_list', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_TYPE_VIEW]}
document_type_setup = {'text': _('Document types'), 'view': 'documents:document_type_list', 'icon': 'fa fa-file', 'permissions': [PERMISSION_DOCUMENT_TYPE_VIEW]}
link_document_type_setup = Link(icon='fa fa-file', permissions=[PERMISSION_DOCUMENT_TYPE_VIEW], text=_('Document types'), view='documents:document_type_list')
document_type_edit = {'text': _('Edit'), 'view': 'documents:document_type_edit', 'args': 'document_type.id', 'famfam': 'layout_edit', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]}
document_type_delete = {'text': _('Delete'), 'view': 'documents:document_type_delete', 'args': 'document_type.id', 'famfam': 'layout_delete', 'permissions': [PERMISSION_DOCUMENT_TYPE_DELETE]}
document_type_create = {'text': _('Create document type'), 'view': 'documents:document_type_create', 'famfam': 'layout_add', 'permissions': [PERMISSION_DOCUMENT_TYPE_CREATE]}

View File

@@ -3,10 +3,10 @@ from __future__ import unicode_literals
from django import apps
from django.utils.translation import ugettext_lazy as _
from navigation.api import register_links
from common import menu_facet, menu_sidebar
from rest_api.classes import APIEndPoint
from .links import search, search_advanced, search_again
from .links import link_search, link_search_advanced, link_search_again
class DynamicSearchApp(apps.AppConfig):
@@ -14,7 +14,7 @@ class DynamicSearchApp(apps.AppConfig):
verbose_name = _('Dynamic search')
def ready(self):
register_links(['search:search', 'search:search_advanced', 'search:results'], [search, search_advanced], menu_name='form_header')
register_links(['search:results'], [search_again], menu_name='sidebar')
menu_facet.bind_links(links=[link_search, link_search_advanced], sources=['search:search', 'search:search_advanced', 'search:results'])
menu_sidebar.bind_links(links=[link_search_again], sources=['search:results'])
APIEndPoint('search', app_name='dynamic_search')

View File

@@ -2,6 +2,8 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
search = {'text': _('Search'), 'view': 'search:search', 'famfam': 'zoom'}
search_advanced = {'text': _('Advanced search'), 'view': 'search:search_advanced', 'famfam': 'zoom_in'}
search_again = {'text': _('Search again'), 'view': 'search:search_again', 'famfam': 'arrow_undo'}
from navigation import Link
link_search = Link(text=_('Search'), view='search:search')
link_search_advanced = Link(text=_('Advanced search'), view='search:search_advanced')
link_search_again = Link(text=_('Search again'), view='search:search_again')

View File

@@ -3,9 +3,9 @@ from __future__ import unicode_literals
from django import apps
from django.utils.translation import ugettext_lazy as _
from project_tools.api import register_tool
from common import menu_tools
from .links import events_list
from .links import link_events_list
class EventsApp(apps.AppConfig):
@@ -13,4 +13,4 @@ class EventsApp(apps.AppConfig):
verbose_name = _('Events')
def ready(self):
register_tool(events_list)
menu_tools.bind_links(links=[link_events_list])

View File

@@ -2,4 +2,6 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
events_list = {'text': _('Events'), 'view': 'events:events_list', 'icon': 'fa fa-list-ol'}
from navigation import Link
link_events_list = Link(icon='fa fa-list-ol', text=_('Events'), view='events:events_list')

View File

@@ -5,18 +5,19 @@ from django.utils.translation import ugettext_lazy as _
from acls.api import class_permissions
from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL
from common.menus import menu_secondary, menu_object, menu_main
from common.menus import menu_facet, menu_main, menu_object, menu_secondary, menu_sidebar, menu_multi_item
from common.utils import encapsulate
from documents.models import Document
from navigation.api import register_links, register_model_list_columns
from navigation.links import link_spacer
from navigation.api import register_model_list_columns
from navigation import CombinedSource
from rest_api.classes import APIEndPoint
from .links import (
link_folder_list,
document_folder_list, link_folder_acl_list, folder_add_document,
folder_add_multiple_documents, link_folder_create, link_folder_delete,
folder_document_multiple_remove, link_folder_edit, link_folder_view
link_document_folder_list, link_folder_acl_list, link_folder_add_document,
link_folder_add_multiple_documents, link_folder_create,
link_folder_delete, link_folder_document_multiple_remove,
link_folder_edit, link_folder_view
)
from .models import Folder
from .permissions import (
@@ -31,13 +32,7 @@ class FoldersApp(apps.AppConfig):
verbose_name = _('Folders')
def ready(self):
menu_main.bind_links(links=[link_folder_list])
menu_secondary.bind_links(links=[link_folder_list, link_folder_create], sources=[Folder, 'folders:folder_list', 'folders:folder_create'])
menu_object.bind_links(links=[link_folder_view, link_folder_edit, link_folder_acl_list, link_folder_delete], sources=[Folder])
#register_links(['folders:document_folder_list', 'folders:folder_add_document'], [folder_add_document], menu_name="sidebar")
#register_links(Document, [document_folder_list], menu_name='form_header')
#register_links([Document], [folder_add_multiple_documents, folder_document_multiple_remove, link_spacer], menu_name='multi_item_links')
APIEndPoint('folders')
class_permissions(Folder, [
ACLS_EDIT_ACL, ACLS_VIEW_ACL, PERMISSION_FOLDER_DELETE,
@@ -48,9 +43,15 @@ class FoldersApp(apps.AppConfig):
PERMISSION_FOLDER_ADD_DOCUMENT, PERMISSION_FOLDER_REMOVE_DOCUMENT
])
menu_facet.bind_links(links=[link_document_folder_list], sources=[Document])
menu_main.bind_links(links=[link_folder_list])
menu_multi_item.bind_links(links=[link_folder_add_multiple_documents], sources=[Document])
menu_multi_item.bind_links(links=[link_folder_document_multiple_remove], sources=[CombinedSource(obj=Document, view='folders:folder_view')])
menu_object.bind_links(links=[link_folder_view, link_folder_edit, link_folder_acl_list, link_folder_delete], sources=[Folder])
menu_secondary.bind_links(links=[link_folder_list, link_folder_create], sources=[Folder, 'folders:folder_list', 'folders:folder_create'])
menu_sidebar.bind_links(links=[link_folder_add_document], sources=['folders:document_folder_list', 'folders:folder_add_document'])
register_model_list_columns(Folder, [
{'name': _('Created'), 'attribute': 'datetime_created'},
{'name': _('Documents'), 'attribute': encapsulate(lambda x: x.documents.count())},
])
APIEndPoint('folders')

View File

@@ -20,8 +20,8 @@ link_folder_delete = Link(permissions=[PERMISSION_FOLDER_DELETE], text=_('Delete
link_folder_view = Link(permissions=[PERMISSION_FOLDER_VIEW], text=_('Documents'), view='folders:folder_view', args='object.pk')
link_folder_acl_list = Link(permissions=[ACLS_VIEW_ACL], text=_('ACLs'), view='folders:folder_acl_list', args='object.pk')
folder_document_multiple_remove = {'text': _('Remove from folder'), 'view': 'folders:folder_document_multiple_remove', 'args': 'object.pk', 'famfam': 'folder_delete', 'permissions': [PERMISSION_FOLDER_REMOVE_DOCUMENT]}
folder_add_document = {'text': _('Add to a folder'), 'view': 'folders:folder_add_document', 'args': 'object.pk', 'famfam': 'folder_add', 'permissions': [PERMISSION_FOLDER_ADD_DOCUMENT]}
folder_add_multiple_documents = {'text': _('Add to folder'), 'view': 'folders:folder_add_multiple_documents', 'famfam': 'folder_add'}
document_folder_list = {'text': _('Folders'), 'view': 'folders:document_folder_list', 'args': 'object.pk', 'famfam': 'folder_user', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
link_folder_document_multiple_remove = Link(permissions=[PERMISSION_FOLDER_REMOVE_DOCUMENT], text=_('Remove from folder'), view='folders:folder_document_multiple_remove', args='object.pk')
link_folder_add_document = Link(permissions=[PERMISSION_FOLDER_ADD_DOCUMENT], text=_('Add to a folder'), view='folders:folder_add_document', args='object.pk')
link_folder_add_multiple_documents = Link(text=_('Add to folder'), view='folders:folder_add_multiple_documents')
link_document_folder_list = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Folders'), view='folders:document_folder_list', args='object.pk')

View File

@@ -3,9 +3,9 @@ from __future__ import unicode_literals
from django import apps
from django.utils.translation import ugettext_lazy as _
from common import menu_tools
from common.utils import encapsulate
from navigation.api import register_links, register_model_list_columns
from project_tools.api import register_tool
from navigation.api import register_model_list_columns
from .classes import Property, PropertyNamespace, PIPNotFound, VirtualEnv
from .links import link_menu_link, link_namespace_details, link_namespace_list
@@ -38,9 +38,10 @@ class InstallationApp(apps.AppConfig):
}
])
register_links(PropertyNamespace, [link_namespace_details])
register_links(['installation:namespace_list', PropertyNamespace], [link_namespace_list], menu_name='secondary_menu')
register_tool(link_menu_link)
# TODO: convert
#register_links(PropertyNamespace, [link_namespace_details])
#register_links(['installation:namespace_list', PropertyNamespace], [link_namespace_list], menu_name='secondary_menu')
menu_tools.bind_links(links=[link_menu_link])
# Virtualenv
namespace = PropertyNamespace('venv', _('VirtualEnv'))

View File

@@ -2,8 +2,10 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .permissions import PERMISSION_INSTALLATION_DETAILS
link_menu_link = {'text': _('Installation details'), 'view': 'installation:namespace_list', 'icon': 'fa fa-flag', 'permissions': [PERMISSION_INSTALLATION_DETAILS]}
link_menu_link = Link(icon='fa fa-flag', permissions=[PERMISSION_INSTALLATION_DETAILS], text=_('Installation details'), view='installation:namespace_list')
link_namespace_list = {'text': _('Installation property namespaces'), 'view': 'installation:namespace_list', 'famfam': 'layout', 'permissions': [PERMISSION_INSTALLATION_DETAILS]}
link_namespace_details = {'text': _('Details'), 'view': 'installation:namespace_details', 'args': 'object.id', 'famfam': 'layout_link', 'permissions': [PERMISSION_INSTALLATION_DETAILS]}

View File

@@ -5,9 +5,8 @@ from django.utils.translation import ugettext_lazy as _
from acls.api import class_permissions
from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL
from common import menu_setup
from documents.models import Document
from navigation.api import register_links
from project_setup.api import register_setup
from .classes import ResolvedSmartLink
from .links import (
@@ -15,7 +14,7 @@ from .links import (
smart_link_condition_delete, smart_link_condition_edit,
smart_link_condition_list, smart_link_delete, smart_link_document_types,
smart_link_edit, smart_link_instance_view,
smart_link_instances_for_document, smart_link_list, smart_link_setup
smart_link_instances_for_document, smart_link_list, link_smart_link_setup
)
from .models import SmartLink, SmartLinkCondition
from .permissions import (
@@ -29,14 +28,15 @@ class LinkingApp(apps.AppConfig):
verbose_name = _('Linking')
def ready(self):
register_links(Document, [smart_link_instances_for_document], menu_name='form_header')
register_links(SmartLink, [smart_link_edit, smart_link_document_types, smart_link_condition_list, smart_link_acl_list, smart_link_delete])
register_links([SmartLink, 'linking:smart_link_list', 'linking:smart_link_create'], [smart_link_list, smart_link_create], menu_name='secondary_menu')
register_links(SmartLinkCondition, [smart_link_condition_edit, smart_link_condition_delete])
register_links(ResolvedSmartLink, [smart_link_instance_view])
register_links(['linking:smart_link_condition_list', 'linking:smart_link_condition_create', 'linking:smart_link_condition_edit', 'linking:smart_link_condition_delete'], [smart_link_condition_create], menu_name='sidebar')
# TODO: convert
#register_links(Document, [smart_link_instances_for_document], menu_name='form_header')
#register_links(SmartLink, [smart_link_edit, smart_link_document_types, smart_link_condition_list, smart_link_acl_list, smart_link_delete])
#register_links([SmartLink, 'linking:smart_link_list', 'linking:smart_link_create'], [smart_link_list, smart_link_create], menu_name='secondary_menu')
#register_links(SmartLinkCondition, [smart_link_condition_edit, smart_link_condition_delete])
#register_links(ResolvedSmartLink, [smart_link_instance_view])
#register_links(['linking:smart_link_condition_list', 'linking:smart_link_condition_create', 'linking:smart_link_condition_edit', 'linking:smart_link_condition_delete'], [smart_link_condition_create], menu_name='sidebar')
register_setup(smart_link_setup)
menu_setup.bind_links(links=[link_smart_link_setup])
class_permissions(SmartLink, [
ACLS_EDIT_ACL, ACLS_VIEW_ACL, PERMISSION_SMART_LINK_DELETE,

View File

@@ -4,13 +4,14 @@ from django.utils.translation import ugettext_lazy as _
from acls.permissions import ACLS_VIEW_ACL
from documents.permissions import PERMISSION_DOCUMENT_VIEW
from navigation import Link
from .permissions import (
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
PERMISSION_SMART_LINK_EDIT, PERMISSION_SMART_LINK_VIEW
)
smart_link_setup = {'text': _('Smart links'), 'view': 'linking:smart_link_list', 'icon': 'fa fa-link', 'permissions': [PERMISSION_SMART_LINK_CREATE]}
link_smart_link_setup = Link(icon='fa fa-link', permissions=[PERMISSION_SMART_LINK_CREATE], text=_('Smart links'), view='linking:smart_link_list')
smart_link_list = {'text': _('Smart links'), 'view': 'linking:smart_link_list', 'famfam': 'link', 'permissions': [PERMISSION_SMART_LINK_CREATE]}
smart_link_create = {'text': _('Create new smart link'), 'view': 'linking:smart_link_create', 'famfam': 'link_add', 'permissions': [PERMISSION_SMART_LINK_CREATE]}
smart_link_edit = {'text': _('Edit'), 'view': 'linking:smart_link_edit', 'args': 'object.pk', 'famfam': 'link_edit', 'permissions': [PERMISSION_SMART_LINK_EDIT]}

View File

@@ -4,10 +4,10 @@ from django import apps
from django.utils.translation import ugettext_lazy as _
from acls.api import class_permissions
from common import menu_object
from documents.models import Document
from navigation.api import register_links
from .links import send_document_link, send_document
from .links import link_send_document_link, link_send_document
from .permissions import (
PERMISSION_MAILING_LINK, PERMISSION_MAILING_SEND_DOCUMENT
)
@@ -18,7 +18,7 @@ class MailerApp(apps.AppConfig):
verbose_name = _('Mailer')
def ready(self):
register_links([Document], [send_document_link, send_document])
menu_object.bind_links(links=[link_send_document_link, link_send_document], sources=[Document])
class_permissions(Document, [
PERMISSION_MAILING_LINK, PERMISSION_MAILING_SEND_DOCUMENT

View File

@@ -2,7 +2,9 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .permissions import PERMISSION_MAILING_LINK, PERMISSION_MAILING_SEND_DOCUMENT
send_document_link = {'text': _('Email link'), 'view': 'mailer:send_document_link', 'args': 'object.pk', 'famfam': 'email_link', 'permissions': [PERMISSION_MAILING_LINK]}
send_document = {'text': _('Email document'), 'view': 'mailer:send_document', 'args': 'object.pk', 'famfam': 'email_open', 'permissions': [PERMISSION_MAILING_SEND_DOCUMENT]}
link_send_document_link = Link(permissions=[PERMISSION_MAILING_LINK], text=_('Email link'), view='mailer:send_document_link', args='object.pk')
link_send_document = Link(permissions=[PERMISSION_MAILING_SEND_DOCUMENT], text=_('Email document'), view='mailer:send_document', args='object.pk')

View File

@@ -3,10 +3,12 @@ from __future__ import unicode_literals
from django import apps
from django.utils.translation import ugettext_lazy as _
from project_setup.api import register_setup
from project_tools.api import register_tool
from common import menu_main, menu_setup, menu_tools
from .links import admin_site, maintenance_menu
from .links import (
link_admin_site, link_maintenance_menu, link_tools, link_setup, link_tools
)
class MainApp(apps.AppConfig):
@@ -14,5 +16,7 @@ class MainApp(apps.AppConfig):
verbose_name = _('Main')
def ready(self):
register_setup(admin_site)
register_tool(maintenance_menu)
menu_setup.bind_links(links=[link_admin_site])
menu_tools.bind_links(links=[link_maintenance_menu])
menu_main.bind_links(links=[link_tools], position=-3)
menu_main.bind_links(links=[link_setup], position=-2)

View File

@@ -2,10 +2,14 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from navigation import Link
def is_superuser(context):
return context['request'].user.is_staff or context['request'].user.is_superuser
maintenance_menu = {'text': _('Maintenance'), 'view': 'main:maintenance_menu', 'icon': 'fa fa-wrench'}
admin_site = {'text': _('Admin site'), 'view': 'admin:index', 'icon': 'fa fa-keyboard-o', 'condition': is_superuser}
link_maintenance_menu = Link(icon='fa fa-wrench', text=_('Maintenance'), view='main:maintenance_menu')
link_admin_site = Link(condition=is_superuser, icon='fa fa-keyboard-o', text=_('Admin site'), view='admin:index')
link_setup = Link(icon='fa fa-gear', text=_('Setup'), view='main:setup_list')
link_tools = Link(icon='fa fa-wrench', text=_('Tools'), view='main:tools_list')

View File

@@ -7,6 +7,8 @@ from django.views.generic import RedirectView
urlpatterns = patterns('main.views',
url(r'^$', 'home', (), 'home'),
url(r'^maintenance_menu/$', 'maintenance_menu', (), 'maintenance_menu'),
url(r'^setup/$', 'setup_list', (), 'setup_list'),
url(r'^tools/$', 'tools_list', (), 'tools_list'),
)
urlpatterns += patterns('',

View File

@@ -5,6 +5,7 @@ from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext_lazy as _
from common.menus import menu_setup, menu_tools
from dynamic_search.classes import SearchModel
from permissions.models import Permission
@@ -52,3 +53,23 @@ def maintenance_menu(request):
'blocks': user_tools,
'title': _('Maintenance menu')
}, context_instance=RequestContext(request))
def setup_list(request):
context = {
'object_navigation_links': menu_setup.resolve(context=RequestContext(request)),
'title': _('Setup items'),
}
return render_to_response('appearance/generic_list_horizontal.html', context,
context_instance=RequestContext(request))
def tools_list(request):
context = {
'object_navigation_links': menu_tools.resolve(context=RequestContext(request)),
'title': _('Tools'),
}
return render_to_response('appearance/generic_list_horizontal.html', context,
context_instance=RequestContext(request))

View File

@@ -7,14 +7,12 @@ from django.db.models.signals import post_delete, post_save
from django.utils.translation import ugettext_lazy as _
from acls.api import class_permissions
from common import menu_setup, menu_tools
from common.classes import ModelAttribute
from common.utils import encapsulate
from documents.models import Document, DocumentType
from documents.signals import post_document_type_change
from navigation.api import register_links, register_model_list_columns
from navigation.links import link_spacer
from project_setup.api import register_setup
from project_tools.api import register_tool
from navigation.api import register_model_list_columns
from rest_api.classes import APIEndPoint
from .api import get_metadata_string
@@ -24,7 +22,7 @@ from .links import (
metadata_multiple_remove, metadata_remove, metadata_view,
setup_document_type_metadata, setup_document_type_metadata_required,
setup_metadata_type_create, setup_metadata_type_delete,
setup_metadata_type_edit, setup_metadata_type_list,
setup_metadata_type_edit, link_setup_metadata_type_list,
link_documents_missing_required_metadata
)
from .models import DocumentMetadata, DocumentTypeMetadataType, MetadataType
@@ -72,15 +70,16 @@ class MetadataApp(apps.AppConfig):
Document.add_to_class('metadata_value_of', DocumentMetadataHelper.constructor)
register_links(['metadata:metadata_add', 'metadata:metadata_edit', 'metadata:metadata_remove', 'metadata:metadata_view'], [metadata_add, metadata_edit, metadata_remove], menu_name='sidebar')
register_links(Document, [metadata_view], menu_name='form_header')
register_links([Document], [metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove, link_spacer], menu_name='multi_item_links')
register_links(DocumentType, [setup_document_type_metadata, setup_document_type_metadata_required])
register_links(MetadataType, [setup_metadata_type_edit, setup_metadata_type_delete])
register_links([MetadataType, 'metadata:setup_metadata_type_list', 'metadata:setup_metadata_type_create'], [setup_metadata_type_list, setup_metadata_type_create], menu_name='secondary_menu')
# TODO: convert
#register_links(['metadata:metadata_add', 'metadata:metadata_edit', 'metadata:metadata_remove', 'metadata:metadata_view'], [metadata_add, metadata_edit, metadata_remove], menu_name='sidebar')
#register_links(Document, [metadata_view], menu_name='form_header')
#register_links([Document], [metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove, link_spacer], menu_name='multi_item_links')
#register_links(DocumentType, [setup_document_type_metadata, setup_document_type_metadata_required])
#register_links(MetadataType, [setup_metadata_type_edit, setup_metadata_type_delete])
#register_links([MetadataType, 'metadata:setup_metadata_type_list', 'metadata:setup_metadata_type_create'], [setup_metadata_type_list, setup_metadata_type_create], menu_name='secondary_menu')
register_setup(setup_metadata_type_list)
register_tool(link_documents_missing_required_metadata)
menu_setup.bind_links(links=[link_setup_metadata_type_list])
menu_tools.bind_links(links=[link_documents_missing_required_metadata])
class_permissions(Document, [
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT,

View File

@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT
from navigation import Link
from .permissions import (
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT,
@@ -23,9 +24,9 @@ metadata_multiple_remove = {'text': _('Remove metadata'), 'view': 'metadata:meta
setup_document_type_metadata = {'text': _('Optional metadata'), 'view': 'metadata:setup_document_type_metadata', 'args': 'document_type.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]}
setup_document_type_metadata_required = {'text': _('Required metadata'), 'view': 'metadata:setup_document_type_metadata_required', 'args': 'document_type.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]}
setup_metadata_type_list = {'text': _('Metadata types'), 'view': 'metadata:setup_metadata_type_list', 'icon': 'fa fa-list', 'permissions': [PERMISSION_METADATA_TYPE_VIEW]}
link_setup_metadata_type_list = Link(icon='fa fa-list', permissions=[PERMISSION_METADATA_TYPE_VIEW], text=_('Metadata types'), view='metadata:setup_metadata_type_list')
setup_metadata_type_edit = {'text': _('Edit'), 'view': 'metadata:setup_metadata_type_edit', 'args': 'object.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_METADATA_TYPE_EDIT]}
setup_metadata_type_delete = {'text': _('Delete'), 'view': 'metadata:setup_metadata_type_delete', 'args': 'object.pk', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_TYPE_DELETE]}
setup_metadata_type_create = {'text': _('Create new'), 'view': 'metadata:setup_metadata_type_create', 'famfam': 'xhtml_add', 'permissions': [PERMISSION_METADATA_TYPE_CREATE]}
link_documents_missing_required_metadata = {'text': _('Missing required metadata'), 'view': 'metadata:documents_missing_required_metadata', 'icon': 'fa fa-edit'}
link_documents_missing_required_metadata = Link(icon='fa fa-edit', text=_('Missing required metadata'), view='metadata:documents_missing_required_metadata')

View File

@@ -1 +1 @@
from .classes import Link, Menu # NOQA
from .classes import CombinedSource, Link, Menu # NOQA

View File

@@ -1,32 +1,8 @@
from __future__ import unicode_literals
object_navigation = {}
model_list_columns = {}
def register_links(src, links, menu_name=None, position=None):
"""
Associate a link to a model a view, or an url
"""
object_navigation.setdefault(menu_name, {})
if isinstance(src, list):
for one_src in src:
object_navigation[menu_name].setdefault(one_src, {'links': []})
if position is not None:
for link in reversed(links):
object_navigation[menu_name][one_src]['links'].insert(position, link)
else:
object_navigation[menu_name][one_src]['links'].extend(links)
else:
object_navigation[menu_name].setdefault(src, {'links': []})
if position is not None:
for link in reversed(links):
object_navigation[menu_name][src]['links'].insert(position, link)
else:
object_navigation[menu_name][src]['links'].extend(links)
def register_model_list_columns(model, columns):
"""
Define which columns will be displayed in the generic list template

View File

@@ -54,8 +54,22 @@ class Menu(object):
source_links = self.bound_links.setdefault(None, [])
source_links.extend(links)
def resolve(self, context):
def resolve_for_source(self, context, source):
request = Variable('request').resolve(context)
current_path = request.META['PATH_INFO']
current_view = resolve(current_path).view_name
result = []
for link in self.bound_links.get(CombinedSource(obj=(source), view=current_view), []):
result.append(link.resolve(context))
for link in self.bound_links.get(source, []):
result.append(link.resolve(context))
return result
def resolve(self, context):
request = Variable('request').resolve(context)
current_path = request.META['PATH_INFO']
@@ -63,6 +77,8 @@ class Menu(object):
current_view = resolve(current_path).view_name
resolved_navigation_object_list = []
result = []
navigation_object_list = context.get('navigation_object_list', [{'object': 'object'}])
# Multiple objects
@@ -72,17 +88,28 @@ class Menu(object):
except VariableDoesNotExist:
pass
# Main menu links
for link in self.bound_links.get(None, []):
result.append(link.resolve(context))
for resolved_navigation_object in resolved_navigation_object_list:
for source, links in self.bound_links.iteritems():
if inspect.isclass(source) and isinstance(resolved_navigation_object, source) or Combined(obj=type(resolved_navigation_object), view=current_view) == source:
if inspect.isclass(source) and isinstance(resolved_navigation_object, source) or source == CombinedSource(obj=(resolved_navigation_object), view=current_view):
for link in links:
result.append(link.resolve(context))
resolved_link = link.resolve(context)
if resolved_link:
result.append(resolved_link)
#break # No need for further content object match testing
# View links
for link in self.bound_links.get(current_view, []):
resolved_link = link.resolve(context)
if resolved_link:
result.append(resolved_link)
# Main menu links
for link in self.bound_links.get(None, []):
resolved_link = link.resolve(context)
if resolved_link:
result.append(resolved_link)
return result
@@ -153,6 +180,7 @@ class Link(object):
self.conditional_highlight = conditional_highlight # Used by dynamic sources
def resolve(self, context):
# TODO: Check ACLs
request = Variable('request').resolve(context)
current_path = request.META['PATH_INFO']
current_view = resolve(current_path).view_name
@@ -406,7 +434,7 @@ class ModelListColumn(object):
self.__class__._model_list_columns[model].extend(columns)
class Combined(object):
class CombinedSource(object):
"""
Class that binds a link to a combination of an object and a view.
This is used to show links relating to a specific object type but only

View File

@@ -3,8 +3,6 @@ from __future__ import unicode_literals
from django import forms
from django.utils.translation import ugettext_lazy as _
from .links import link_spacer
class MultiItemForm(forms.Form):
def __init__(self, *args, **kwargs):

View File

@@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
link_spacer = {'text': ('────────────'), 'url': ''}

View File

@@ -15,7 +15,6 @@ from django.utils.text import unescape_string_literal
from common.utils import urlquote
from ..api import object_navigation
from ..classes import Menu
from ..forms import MultiItemForm
@@ -23,17 +22,13 @@ register = Library()
@register.assignment_tag(takes_context=True)
def get_top_menu_links(context):
return Menu.get('main menu').resolve(context=context)
@register.assignment_tag(takes_context=True)
def get_object_facet_links(context):
return Menu.get('object facet').resolve(context=context)
def get_menu_links(context, name):
return Menu.get(name).resolve(context=context)
@register.assignment_tag(takes_context=True)
def get_action_links(context):
# TODO: move this logic to template
result = []
for menu_name in ['object menu', 'sidebar menu', 'secondary menu']:
@@ -46,15 +41,7 @@ def get_action_links(context):
@register.simple_tag(takes_context=True)
def get_multi_item_links_form(context, object_list):
first_object = object_list[0]
actions = []#(link.url, link.text) for link in Menu.get('multi items').resolve(context=context, obj=first_object)]
actions = [(link.url, link.text) for link in Menu.get('multi item menu').resolve_for_source(context=context, source=type(object_list[0]))]
form = MultiItemForm(actions=actions)
context.update({'multi_item_form': form, 'multi_item_actions': actions})
return ''
@register.assignment_tag(takes_context=True)
def get_object_links(context):
return Menu.get('object menu').resolve(context=context)

View File

@@ -8,15 +8,14 @@ from django import apps
from django.utils.translation import ugettext_lazy as _
from acls.api import class_permissions
from common import menu_tools
from common.utils import encapsulate
from documents.models import Document, DocumentVersion
from documents.signals import post_version_upload
from documents.widgets import document_link
from installation import PropertyNamespace
from main.api import register_maintenance_links
from navigation.api import register_links, register_model_list_columns
from navigation.links import link_spacer
from project_tools.api import register_tool
from navigation.api import register_model_list_columns
from rest_api.classes import APIEndPoint
from .links import (
@@ -53,12 +52,12 @@ class OCRApp(apps.AppConfig):
verbose_name = _('OCR')
def ready(self):
register_links(Document, [link_document_submit])
register_links([Document], [link_document_submit_multiple, link_spacer], menu_name='multi_item_links')
register_links([DocumentVersionOCRError], [link_entry_re_queue_multiple, link_entry_delete_multiple], menu_name='multi_item_links')
register_links([DocumentVersionOCRError], [link_entry_re_queue, link_entry_delete])
register_links(['ocr:entry_list', 'ocr:entry_delete_multiple', 'ocr:entry_re_queue_multiple', DocumentVersionOCRError], [link_entry_list], menu_name='secondary_menu')
# TODO: convert
#register_links(Document, [link_document_submit])
#register_links([Document], [link_document_submit_multiple, link_spacer], menu_name='multi_item_links')
#register_links([DocumentVersionOCRError], [link_entry_re_queue_multiple, link_entry_delete_multiple], menu_name='multi_item_links')
#register_links([DocumentVersionOCRError], [link_entry_re_queue, link_entry_delete])
#register_links(['ocr:entry_list', 'ocr:entry_delete_multiple', 'ocr:entry_re_queue_multiple', DocumentVersionOCRError], [link_entry_list], menu_name='secondary_menu')
register_maintenance_links([link_document_all_ocr_cleanup], namespace='ocr', title=_('OCR'))
post_version_upload.connect(post_version_upload_ocr, dispatch_uid='post_version_upload_ocr', sender=DocumentVersion)
@@ -68,7 +67,7 @@ class OCRApp(apps.AppConfig):
class_permissions(Document, [PERMISSION_OCR_DOCUMENT])
register_tool(link_entry_list)
menu_tools.bind_links(links=[link_entry_list])
APIEndPoint('ocr')

View File

@@ -22,4 +22,4 @@ link_document_all_ocr_cleanup = Link(
text=_('Clean up pages content'), view='ocr:document_all_ocr_cleanup'
)
link_entry_list = {'text': _('OCR Errors'), 'view': 'ocr:entry_list', 'icon': 'fa fa-file-text-o', 'permissions': [PERMISSION_OCR_DOCUMENT]}
link_entry_list = Link(icon='fa fa-file-text-o', permissions=[PERMISSION_OCR_DOCUMENT], text=_('OCR Errors'), view='ocr:entry_list')

View File

@@ -6,14 +6,14 @@ from django.core.exceptions import ObjectDoesNotExist
from django.db.models.signals import post_save
from django.utils.translation import ugettext_lazy as _
from navigation.api import register_links
from project_setup.api import register_setup
from common.menus import menu_setup
from rest_api.classes import APIEndPoint
from .models import Role
from .links import (
permission_grant, permission_revoke, role_create, role_delete, role_edit,
role_list, role_members, role_permissions
link_permission_grant, link_permission_revoke, link_role_create,
link_role_delete, link_role_edit, link_role_list, link_role_members,
link_role_permissions
)
from .settings import DEFAULT_ROLES
@@ -38,12 +38,13 @@ class PermissionsApp(apps.AppConfig):
verbose_name = _('Permissions')
def ready(self):
register_links(Role, [role_edit, role_members, role_permissions, role_delete])
register_links([Role, 'permissions:role_create', 'permissions:role_list'], [role_list, role_create], menu_name='secondary_menu')
register_links(['permissions:role_permissions'], [permission_grant, permission_revoke], menu_name='multi_item_links')
# TODO: convert
#register_links(Role, [role_edit, role_members, role_permissions, role_delete])
#register_links([Role, 'permissions:role_create', 'permissions:role_list'], [role_list, role_create], menu_name='secondary_menu')
#register_links(['permissions:role_permissions'], [permission_grant, permission_revoke], menu_name='multi_item_links')
post_save.connect(user_post_save, sender=User)
register_setup(role_list)
menu_setup.bind_links(links=[link_role_list])
APIEndPoint('permissions')

View File

@@ -2,18 +2,19 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from navigation import Link
from .permissions import (
PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE,
PERMISSION_ROLE_CREATE, PERMISSION_ROLE_DELETE, PERMISSION_ROLE_EDIT,
PERMISSION_ROLE_VIEW
)
permission_grant = {'text': _('Grant'), 'view': 'permissions:permission_multiple_grant', 'famfam': 'key_add', 'permissions': [PERMISSION_PERMISSION_GRANT]}
permission_revoke = {'text': _('Revoke'), 'view': 'permissions:permission_multiple_revoke', 'famfam': 'key_delete', 'permissions': [PERMISSION_PERMISSION_REVOKE]}
role_create = {'text': _('Create new role'), 'view': 'permissions:role_create', 'famfam': 'medal_gold_add', 'permissions': [PERMISSION_ROLE_CREATE]}
role_delete = {'text': _('Delete'), 'view': 'permissions:role_delete', 'args': 'object.id', 'famfam': 'medal_gold_delete', 'permissions': [PERMISSION_ROLE_DELETE]}
role_edit = {'text': _('Edit'), 'view': 'permissions:role_edit', 'args': 'object.id', 'famfam': 'medal_gold_1', 'permissions': [PERMISSION_ROLE_EDIT]}
role_list = {'text': _('Roles'), 'view': 'permissions:role_list', 'icon': 'fa fa-child', 'permissions': [PERMISSION_ROLE_VIEW]}
role_members = {'text': _('Members'), 'view': 'permissions:role_members', 'args': 'object.id', 'famfam': 'group_key', 'permissions': [PERMISSION_ROLE_EDIT]}
role_permissions = {'text': _('Role permissions'), 'view': 'permissions:role_permissions', 'args': 'object.id', 'famfam': 'key_go', 'permissions': [PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE]}
link_permission_grant = Link(permissions=[PERMISSION_PERMISSION_GRANT], text=_('Grant'), view='permissions:permission_multiple_grant')
link_permission_revoke = Link(permissions=[PERMISSION_PERMISSION_REVOKE], text=_('Revoke'), view='permissions:permission_multiple_revoke')
link_role_create = {'text': _('Create new role'), 'view': 'permissions:role_create', 'famfam': 'medal_gold_add', 'permissions': [PERMISSION_ROLE_CREATE]}
link_role_delete = {'text': _('Delete'), 'view': 'permissions:role_delete', 'args': 'object.id', 'famfam': 'medal_gold_delete', 'permissions': [PERMISSION_ROLE_DELETE]}
link_role_edit = {'text': _('Edit'), 'view': 'permissions:role_edit', 'args': 'object.id', 'famfam': 'medal_gold_1', 'permissions': [PERMISSION_ROLE_EDIT]}
link_role_list = Link(icon='fa fa-child', permissions=[PERMISSION_ROLE_VIEW], text=_('Roles'), view='permissions:role_list')
link_role_members = {'text': _('Members'), 'view': 'permissions:role_members', 'args': 'object.id', 'famfam': 'group_key', 'permissions': [PERMISSION_ROLE_EDIT]}
link_role_permissions = {'text': _('Role permissions'), 'view': 'permissions:role_permissions', 'args': 'object.id', 'famfam': 'key_go', 'permissions': [PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE]}

View File

@@ -1,41 +0,0 @@
from __future__ import absolute_import, unicode_literals
from django.core.exceptions import PermissionDenied
from django.template import TemplateSyntaxError, Library, Node, Variable
from permissions.models import Permission
register = Library()
class CheckPermissionsNode(Node):
def __init__(self, requester, permission_list=None, *args, **kwargs):
self.requester = requester
self.permission_list = permission_list
def render(self, context):
permission_list = Variable(self.permission_list).resolve(context)
if not permission_list:
# There is no permissions list to check against which means
# this link is available for all
context['permission'] = True
return ''
requester = Variable(self.requester).resolve(context)
try:
Permission.objects.check_permissions(requester, permission_list)
context['permission'] = True
return ''
except PermissionDenied:
context['permission'] = False
return ''
@register.tag
def check_permissions(parser, token):
try:
# Splitting by None == splitting by spaces.
tag_name, args = token.contents.split(None, 1)
except ValueError:
raise TemplateSyntaxError('%r tag requires arguments' % token.contents.split()[0])
return CheckPermissionsNode(*args.split())

View File

@@ -1,5 +0,0 @@
setup_items = []
def register_setup(link):
setup_items.append(link)

View File

@@ -1,16 +0,0 @@
from __future__ import unicode_literals
from django import apps
from django.utils.translation import ugettext_lazy as _
from common.menus import menu_main
from .links import link_setup
class ProjectSetupApp(apps.AppConfig):
name = 'project_setup'
verbose_name = _('Project setup')
def ready(self):
menu_main.bind_links(links=[link_setup], position=-2)

View File

@@ -1,7 +0,0 @@
from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from navigation import Link
link_setup = Link(icon='fa fa-gear', text=_('Setup'), view='project_setup:setup_list')

View File

@@ -1,28 +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:
# Translators:
# Mohammed ALDOUB <voulnet@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/mayan-edms/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
# Pavlin Koldamov <pkoldamov@gmail.com>, 2012
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bulgarian (http://www.transifex.com/projects/p/mayan-edms/language/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
# www.ping.ba <jomer@ping.ba>, 2013
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/projects/p/mayan-edms/language/bs_BA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bs_BA\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
# Mads L. Nielsen <sirlundgaard@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Danish (http://www.transifex.com/projects/p/mayan-edms/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: German (Switzerland) (http://www.transifex.com/projects/p/"
"mayan-edms/language/de_CH/)\n"
"Language: de_CH\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"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,30 +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:
# Translators:
# Mathias Behrle <mbehrle@m9s.biz>, 2014
# tetjarediske <tetja.rediske@googlemail.com>, 2012
# tetjarediske <tetja.rediske@googlemail.com>, 2012
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2015-02-07 00:10+0000\n"
"Last-Translator: Mathias Behrle <mathiasb@m9s.biz>\n"
"Language-Team: German (Germany) (http://www.transifex.com/projects/p/mayan-edms/language/de_DE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: links.py:5
msgid "Setup"
msgstr "Setup"
#: views.py:13
msgid "Setup items"
msgstr "Setupelemente"

View File

@@ -1,29 +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: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2011-09-30 04:42+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: English (http://www.transifex.com/projects/p/mayan-edms/"
"language/en/)\n"
"Language: en\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"
#: links.py:5
#, fuzzy
msgid "Setup"
msgstr "setup"
#: views.py:13
#, fuzzy
msgid "Setup items"
msgstr "setup items"

View File

@@ -1,29 +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:
# Translators:
# Lory977 <helga.carrero@gmail.com>, 2015
# Roberto Rosario, 2011
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2015-01-12 19:29+0000\n"
"Last-Translator: Lory977 <helga.carrero@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/mayan-edms/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: links.py:5
msgid "Setup"
msgstr "Configuración"
#: views.py:13
msgid "Setup items"
msgstr "Elementos de configuración"

View File

@@ -1,29 +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:
# Translators:
# Mehdi Amani <MehdiAmani@toorintan.com>, 2014
# Mohammad Dashtizadeh <mohammad@dashtizadeh.net>, 2013
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-23 06:49+0000\n"
"Last-Translator: Mehdi Amani <MehdiAmani@toorintan.com>\n"
"Language-Team: Persian (http://www.transifex.com/projects/p/mayan-edms/language/fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fa\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: links.py:5
msgid "Setup"
msgstr "نصب"
#: views.py:13
msgid "Setup items"
msgstr "اقلام نصب"

View File

@@ -1,29 +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:
# Translators:
# Christophe kryskool <christophe.chauvet@gmail.com>, 2014
# Pierre Lhoste <inactive+peterhost@transifex.com>, 2012
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-11-02 08:09+0000\n"
"Last-Translator: Christophe kryskool <christophe.chauvet@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/projects/p/mayan-edms/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: links.py:5
msgid "Setup"
msgstr "Configuration"
#: views.py:13
msgid "Setup items"
msgstr "Paramètres de configuration"

View File

@@ -1,27 +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:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/mayan-edms/language/hr_HR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hr_HR\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"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
# Dezső József <dejo60@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Hungarian (http://www.transifex.com/projects/p/mayan-edms/language/hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,27 +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:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Indonesian (http://www.transifex.com/projects/p/mayan-edms/language/id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
# Pierpaolo Baldan <pierpaolo.baldan@gmail.com>, 2011
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/mayan-edms/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,29 +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:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Latvian (http://www.transifex.com/projects/p/mayan-edms/"
"language/lv/)\n"
"Language: lv\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 != 0 ? 1 : "
"2);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/mayan-"
"edms/language/nb/)\n"
"Language: nb\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"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
# Lucas Weel <ljj.weel@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/mayan-edms/language/nl_NL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl_NL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,30 +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:
# Translators:
# mic <diveaway12@gmail.com>, 2012
# mic <winterfall24@gmail.com>, 2012
# mic <winterfall24@gmail.com>, 2012
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/mayan-edms/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,29 +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:
# Translators:
# Emerson Soares <on.emersonsoares@gmail.com>, 2011
# Vítor Figueiró <vfigueiro@gmail.com>, 2012
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Portuguese (http://www.transifex.com/projects/p/mayan-edms/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

View File

@@ -1,28 +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:
# Translators:
# Emerson Soares <on.emersonsoares@gmail.com>, 2011
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-06 16:53-0400\n"
"PO-Revision-Date: 2014-10-08 21:14+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/mayan-edms/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: links.py:5
msgid "Setup"
msgstr ""
#: views.py:13
msgid "Setup items"
msgstr ""

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