Merge branch 'feature/two_level_acl_view_support' into development

This commit is contained in:
Roberto Rosario
2012-01-09 06:43:04 -04:00
16 changed files with 66 additions and 104 deletions

View File

@@ -5,7 +5,8 @@ from django.utils.translation import ugettext_lazy as _
from navigation.api import register_links, register_multi_item_links
from project_setup.api import register_setup
from .classes import AccessHolder, AccessObjectClass, ClassAccessHolder
from .classes import (AccessHolder, AccessObjectClass, ClassAccessHolder,
AccessObject)
from .permissions import (ACLS_EDIT_ACL, ACLS_VIEW_ACL,
ACLS_CLASS_EDIT_ACL, ACLS_CLASS_VIEW_ACL)
@@ -14,6 +15,7 @@ acl_list = {'text': _(u'ACLs'), 'view': 'acl_list', 'famfam': 'lock', 'permissio
acl_detail = {'text': _(u'details'), 'view': 'acl_detail', 'args': ['access_object.gid', 'object.gid'], 'famfam': 'key_go', 'permissions': [ACLS_VIEW_ACL]}
acl_grant = {'text': _(u'grant'), 'view': 'acl_multiple_grant', 'famfam': 'key_add', 'permissions': [ACLS_EDIT_ACL]}
acl_revoke = {'text': _(u'revoke'), 'view': 'acl_multiple_revoke', 'famfam': 'key_delete', 'permissions': [ACLS_EDIT_ACL]}
acl_holder_new = {'text': _(u'New holder'), 'view': 'acl_holder_new', 'args': 'access_object.gid', 'famfam': 'user', 'permissions': [ACLS_EDIT_ACL]}
acl_setup_valid_classes = {'text': _(u'Default ACLs'), 'view': 'acl_setup_valid_classes', 'icon': 'lock.png', 'permissions': [ACLS_CLASS_VIEW_ACL]}
acl_class_list = {'text': _(u'List of classes'), 'view': 'acl_setup_valid_classes', 'famfam': 'package', 'permissions': [ACLS_CLASS_VIEW_ACL]}
@@ -26,6 +28,8 @@ acl_class_revoke = {'text': _(u'revoke'), 'view': 'acl_class_multiple_revoke', '
register_links(AccessHolder, [acl_detail])
register_multi_item_links(['acl_detail'], [acl_grant, acl_revoke])
register_links([AccessObject], [acl_holder_new], menu_name='sidebar')
register_setup(acl_setup_valid_classes)
register_links(['acl_setup_valid_classes', 'acl_class_acl_list', 'acl_class_new_holder_for', 'acl_class_acl_detail'], [acl_class_list], menu_name='secondary_menu')

View File

@@ -4,6 +4,7 @@ urlpatterns = patterns('acls.views',
url(r'^new_holder_for/(?P<app_label>[-\w]+)/(?P<model_name>[-\w]+)/(?P<object_id>\d+)/$', 'acl_new_holder_for', (), 'acl_new_holder_for'),
url(r'^list_for/(?P<app_label>[-\w]+)/(?P<model_name>[-\w]+)/(?P<object_id>\d+)/$', 'acl_list', (), 'acl_list'),
url(r'^details/(?P<access_object_gid>[.\w]+)/holder/(?P<holder_object_gid>[.\w]+)/$', 'acl_detail', (), 'acl_detail'),
url(r'^holder/new/(?P<access_object_gid>[.\w]+)/$', 'acl_holder_new', (), 'acl_holder_new'),
url(r'^multiple/grant/$', 'acl_grant', (), 'acl_multiple_grant'),
url(r'^multiple/revoke/$', 'acl_revoke', (), 'acl_multiple_revoke'),

View File

@@ -55,7 +55,12 @@ def acl_list_for(request, obj, extra_context=None):
{'name': _(u'permissions'), 'attribute': encapsulate(lambda x: _permission_titles(AccessEntry.objects.get_holder_permissions_for(obj, x.source_object)))},
],
'hide_object': True,
'access_object': AccessObject.encapsulate(obj)
'access_object': AccessObject.encapsulate(obj),
'object': obj,
'navigation_object_list': [
{'object': 'object'},
{'object': 'access_object'}
],
}
if extra_context:
@@ -78,12 +83,10 @@ def acl_detail(request, access_object_gid, holder_object_gid):
except ObjectDoesNotExist:
raise Http404
navigation_object = request.GET.get('navigation_object')
logger.debug('navigation_object: %s' % navigation_object)
return acl_detail_for(request, holder.source_object, access_object.source_object, navigation_object)
return acl_detail_for(request, holder.source_object, access_object.source_object)
def acl_detail_for(request, actor, obj, navigation_object=None):
def acl_detail_for(request, actor, obj):
try:
Permission.objects.check_permissions(request.user, [ACLS_VIEW_ACL])
except PermissionDenied:
@@ -123,15 +126,13 @@ def acl_detail_for(request, actor, obj, navigation_object=None):
'permission_pk': lambda x: x.pk,
'holder_gid': lambda x: AccessHolder(actor).gid,
'object_gid': lambda x: AccessObject(obj).gid,
}
},
'access_object': AccessObject.encapsulate(obj),
'navigation_object_list': [
{'object': 'object'},
{'object': 'access_object'}
],
}
if navigation_object:
context.update(
{
navigation_object: obj
}
)
return render_to_response(
'generic_detail.html',
@@ -359,13 +360,28 @@ def acl_new_holder_for(request, obj, extra_context=None, navigation_object=None)
'title': _(u'add new holder for: %s') % obj,
'submit_label': _(u'Select'),
'submit_icon_famfam': 'tick',
'object': obj,
'access_object': AccessObject.encapsulate(obj),
'navigation_object_list': [
{'object': 'object'},
{'object': 'access_object'},
],
}
if extra_context:
context.update(extra_context)
return render_to_response('generic_form.html', context,
context_instance=RequestContext(request))
context_instance=RequestContext(request))
def acl_holder_new(request, access_object_gid):
try:
access_object = AccessObject.get(gid=access_object_gid)
except ObjectDoesNotExist:
raise Http404
return acl_new_holder_for(request, access_object.source_object)#, extra_context={'access_object': access_object})
# Setup views
@@ -435,7 +451,6 @@ def acl_class_acl_detail(request, access_object_class_gid, holder_object_gid):
'attribute': encapsulate(lambda x: two_state_template(DefaultAccessEntry.objects.has_access(x, actor.source_object, access_object_class.source_object)))
},
],
#'hide_link': True,
'hide_object': True,
}
},

View File

@@ -7,12 +7,9 @@ from acls import ACLS_VIEW_ACL, ACLS_EDIT_ACL
from acls.api import class_permissions
acl_list = {'text': _(u'ACLs'), 'view': 'document_acl_list', 'args': 'object.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]}
document_new_holder = {'text': _(u'New holder'), 'view': 'document_new_holder', 'args': 'object.pk', 'famfam': 'user', 'permissions': [ACLS_VIEW_ACL]}
register_links(Document, [acl_list], menu_name='form_header')
register_links(['document_acl_list', 'document_new_holder'], [document_new_holder], menu_name='sidebar')
class_permissions(Document, [
ACLS_VIEW_ACL,
ACLS_EDIT_ACL

View File

@@ -2,5 +2,4 @@ from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('document_acls.views',
url(r'^list_for/document/(?P<document_id>\d+)/$', 'document_acl_list', (), 'document_acl_list'),
url(r'^new_holder_for/document/(?P<document_id>\d+)/$', 'document_new_holder', (), 'document_new_holder'),
)

View File

@@ -2,7 +2,7 @@ from django.shortcuts import render_to_response, get_object_or_404
from django.utils.translation import ugettext_lazy as _
from documents.models import Document
from acls.views import acl_list_for, acl_new_holder_for
from acls.views import acl_list_for
from acls.models import AccessEntry
@@ -15,14 +15,3 @@ def document_acl_list(request, document_id):
'object': document,
}
)
def document_new_holder(request, document_id):
document = get_object_or_404(Document, pk=document_id)
return acl_new_holder_for(
request,
document,
extra_context={
'object': document,
}
)

View File

@@ -25,14 +25,11 @@ folder_add_document = {'text': _('add to a folder'), 'view': 'folder_add_documen
document_folder_list = {'text': _(u'folders'), 'view': 'document_folder_list', 'args': 'object.pk', 'famfam': 'folder_user', 'permissions': [PERMISSION_DOCUMENT_VIEW], 'children_view_regex': [r'folder']}
folder_acl_list = {'text': _(u'ACLs'), 'view': 'folder_acl_list', 'args': 'object.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]}
folder_new_holder = {'text': _(u'New holder'), 'view': 'folder_new_holder', 'args': 'object.pk', 'famfam': 'user', 'permissions': [ACLS_VIEW_ACL]}
register_multi_item_links(['folder_view'], [folder_document_multiple_remove])
register_links(Folder, [folder_view, folder_edit, folder_delete, folder_acl_list])
register_links(['folder_acl_list', 'folder_new_holder'], [folder_new_holder], menu_name='sidebar')
register_links([Folder, 'folder_list', 'folder_create'], [folder_list, folder_create], menu_name='secondary_menu')
register_top_menu(name='folders', link={'text': _('folders'), 'famfam': 'folder_user', 'view': 'folder_list'}, children_views=['folder_list', 'folder_create', 'folder_edit', 'folder_delete', 'folder_view', 'folder_document_multiple_remove'])

View File

@@ -13,5 +13,4 @@ urlpatterns = patterns('folders.views',
url(r'^document/(?P<document_id>\d+)/folder/list/$', 'document_folder_list', (), 'document_folder_list'),
url(r'^(?P<folder_pk>\d+)/acl/list/$', 'folder_acl_list', (), 'folder_acl_list'),
url(r'^(?P<folder_pk>\d+)/acl/holder/new/$', 'folder_new_holder', (), 'folder_new_holder'),
)

View File

@@ -17,7 +17,7 @@ from documents.views import document_list
from permissions import Permission
from common.utils import encapsulate
from acls.models import AccessEntry
from acls.views import acl_list_for, acl_new_holder_for
from acls.views import acl_list_for
from .models import Folder, FolderDocument
from .forms import FolderForm, FolderListForm
@@ -291,17 +291,3 @@ def folder_acl_list(request, folder_pk):
'object': folder,
}
)
def folder_new_holder(request, folder_pk):
folder = get_object_or_404(Folder, pk=folder_pk)
return acl_new_holder_for(
request,
folder,
extra_context={
'folder': folder,
'submit_label': _(u'Select'),
'submit_icon_famfam': 'tick',
'object': folder,
}
)

View File

@@ -20,18 +20,15 @@ smart_link_instances_for_document = {'text': _(u'smart links'), 'view': 'smart_l
smart_link_setup = {'text': _(u'smart links'), 'view': 'smart_link_list', 'icon': 'link.png', 'permissions': [PERMISSION_SMART_LINK_CREATE]}
smart_link_list = {'text': _(u'smart links list'), 'view': 'smart_link_list', 'famfam': 'link', 'permissions': [PERMISSION_SMART_LINK_CREATE]}
smart_link_create = {'text': _(u'create new smart link'), 'view': 'smart_link_create', 'famfam': 'link_add', 'permissions': [PERMISSION_SMART_LINK_CREATE]}
smart_link_edit = {'text': _(u'edit'), 'view': 'smart_link_edit', 'args': 'smart_link.pk', 'famfam': 'link_edit', 'permissions': [PERMISSION_SMART_LINK_EDIT]}
smart_link_delete = {'text': _(u'delete'), 'view': 'smart_link_delete', 'args': 'smart_link.pk', 'famfam': 'link_delete', 'permissions': [PERMISSION_SMART_LINK_DELETE]}
smart_link_edit = {'text': _(u'edit'), 'view': 'smart_link_edit', 'args': 'object.pk', 'famfam': 'link_edit', 'permissions': [PERMISSION_SMART_LINK_EDIT]}
smart_link_delete = {'text': _(u'delete'), 'view': 'smart_link_delete', 'args': 'object.pk', 'famfam': 'link_delete', 'permissions': [PERMISSION_SMART_LINK_DELETE]}
smart_link_condition_list = {'text': _(u'conditions'), 'view': 'smart_link_condition_list', 'args': 'smart_link.pk', 'famfam': 'cog', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_CREATE]}
smart_link_condition_create = {'text': _(u'create condition'), 'view': 'smart_link_condition_create', 'args': 'smart_link.pk', 'famfam': 'cog_add', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]}
smart_link_condition_list = {'text': _(u'conditions'), 'view': 'smart_link_condition_list', 'args': 'object.pk', 'famfam': 'cog', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_CREATE]}
smart_link_condition_create = {'text': _(u'create condition'), 'view': 'smart_link_condition_create', 'args': 'object.pk', 'famfam': 'cog_add', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]}
smart_link_condition_edit = {'text': _(u'edit'), 'view': 'smart_link_condition_edit', 'args': 'condition.pk', 'famfam': 'cog_edit', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]}
smart_link_condition_delete = {'text': _(u'delete'), 'view': 'smart_link_condition_delete', 'args': 'condition.pk', 'famfam': 'cog_delete', 'permissions': [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT]}
smart_link_acl_list = {'text': _(u'ACLs'), 'view': 'smart_link_acl_list', 'args': 'smart_link.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]}
smart_link_new_holder = {'text': _(u'New holder'), 'view': 'smart_link_new_holder', 'args': 'smart_link.pk', 'famfam': 'user', 'permissions': [ACLS_VIEW_ACL]}
register_links(['smart_link_acl_list', 'smart_link_new_holder'], [smart_link_new_holder], menu_name='sidebar')
smart_link_acl_list = {'text': _(u'ACLs'), 'view': 'smart_link_acl_list', 'args': 'object.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]}
register_links(Document, [smart_link_instances_for_document], menu_name='form_header')

View File

@@ -16,5 +16,4 @@ urlpatterns = patterns('linking.views',
url(r'^setup/smart_link/condition/(?P<smart_link_condition_pk>\d+)/delete/$', 'smart_link_condition_delete', (), 'smart_link_condition_delete'),
url(r'^(?P<smart_link_pk>\d+)/acl/list/$', 'smart_link_acl_list', (), 'smart_link_acl_list'),
url(r'^(?P<smart_link_pk>\d+)/acl/holder/new/$', 'smart_link_new_holder', (), 'smart_link_new_holder'),
)

View File

@@ -15,7 +15,7 @@ from documents.models import Document
from documents.views import document_list
from documents.permissions import PERMISSION_DOCUMENT_VIEW
from permissions.models import Permission
from acls.views import acl_new_holder_for, acl_list_for, acl_detail_for
from acls.views import acl_list_for
from acls.models import AccessEntry, PermissionDenied
from .models import SmartLink, SmartLinkCondition
@@ -176,8 +176,8 @@ def smart_link_edit(request, smart_link_pk):
form = SmartLinkForm(instance=smart_link)
return render_to_response('generic_form.html', {
'navigation_object_name': 'smart_link',
'smart_link': smart_link,
#'navigation_object_name': 'smart_link',
'object': smart_link,
'form': form,
'title': _(u'Edit smart link: %s') % smart_link
}, context_instance=RequestContext(request))
@@ -207,8 +207,7 @@ def smart_link_delete(request, smart_link_pk):
return render_to_response('generic_confirm.html', {
'delete_view': True,
'navigation_object_name': 'smart_link',
'smart_link': smart_link,
'object': smart_link,
'title': _(u'Are you sure you wish to delete smart link: %s?') % smart_link,
'next': next,
'previous': previous,
@@ -231,8 +230,7 @@ def smart_link_condition_list(request, smart_link_pk):
{'name': _(u'enabled'), 'attribute': encapsulate(lambda x: two_state_template(x.enabled))},
],
'hide_link': True,
'smart_link': smart_link,
'navigation_object_name': 'smart_link',
'object': smart_link,
'list_object_variable_name': 'condition',
}, context_instance=RequestContext(request))
@@ -259,8 +257,7 @@ def smart_link_condition_create(request, smart_link_pk):
return render_to_response('generic_form.html', {
'form': form,
'title': _(u'Add new conditions to smart link: "%s"') % smart_link,
'navigation_object_name': 'smart_link',
'smart_link': smart_link,
'object': smart_link,
}, context_instance=RequestContext(request))
@@ -292,9 +289,9 @@ def smart_link_condition_edit(request, smart_link_condition_pk):
'next': next,
'previous': previous,
'condition': smart_link_condition,
'smart_link': smart_link_condition.smart_link,
'object': smart_link_condition.smart_link,
'navigation_object_list': [
{'object': 'smart_link', 'name': _(u'smart link')},
{'object': 'object', 'name': _(u'smart link')},
{'object': 'condition', 'name': _(u'condition')}
],
@@ -326,9 +323,9 @@ def smart_link_condition_delete(request, smart_link_condition_pk):
return render_to_response('generic_confirm.html', {
'delete_view': True,
'condition': smart_link_condition,
'smart_link': smart_link_condition.smart_link,
'object': smart_link_condition.smart_link,
'navigation_object_list': [
{'object': 'smart_link', 'name': _(u'smart link')},
{'object': 'object', 'name': _(u'smart link')},
{'object': 'condition', 'name': _(u'condition')}
],
'title': _(u'Are you sure you wish to delete smart link condition: "%s"?') % smart_link_condition,
@@ -350,16 +347,3 @@ def smart_link_acl_list(request, smart_link_pk):
'smart_link': smart_link,
}
)
def smart_link_new_holder(request, smart_link_pk):
smart_link = get_object_or_404(SmartLink, pk=smart_link_pk)
return acl_new_holder_for(
request,
smart_link,
extra_context={
'smart_link': smart_link,
'object': smart_link,
},
navigation_object=u'smart_link',
)

View File

@@ -278,7 +278,7 @@
{% endwith %}
{% endwith %}
{% endif %}
{% get_object_navigation_links "secondary_menu" as object_navigation_links %}
{% if object_navigation_links %}
<div class="block">
@@ -290,7 +290,6 @@
</ul>
</div>
{% endif %}
{% if navigation_object_list %}
{% for navigation_object_dict in navigation_object_list %}
{% copy_variable navigation_object_dict.object as "navigation_object_name" %}
@@ -324,6 +323,17 @@
</ul>
</div>
{% endif %}
{% get_object_navigation_links "sidebar" as object_navigation_links %}
{% if object_navigation_links %}
<div class="block">
<h3>{% trans "Other available actions" %}</h3>
<ul class="navigation">
{% with "true" as as_li %}
{% include "generic_navigation.html" %}
{% endwith %}
</ul>
</div>
{% endif %}
{% endfor %}
{% else %}
{% get_object_navigation_links as object_navigation_links %}

View File

@@ -29,7 +29,6 @@ tag_edit = {'text': _(u'edit'), 'view': 'tag_edit', 'args': 'object.id', 'famfam
tag_tagged_item_list = {'text': _(u'tagged documents'), 'view': 'tag_tagged_item_list', 'args': 'object.id', 'famfam': 'page'}
tag_multiple_delete = {'text': _(u'delete'), 'view': 'tag_multiple_delete', 'famfam': 'tag_blue_delete', 'permissions': [PERMISSION_TAG_DELETE]}
tag_acl_list = {'text': _(u'ACLs'), 'view': 'tag_acl_list', 'args': 'object.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]}
tag_new_holder = {'text': _(u'New holder'), 'view': 'tag_new_holder', 'args': 'object.pk', 'famfam': 'user', 'permissions': [ACLS_VIEW_ACL]}
register_model_list_columns(Tag, [
{
@@ -56,7 +55,6 @@ register_links(Tag, [tag_tagged_item_list, tag_edit, tag_delete, tag_acl_list])
register_multi_item_links(['tag_list'], [tag_multiple_delete])
register_links([Tag, 'tag_list', 'tag_create'], [tag_list, tag_create], menu_name='secondary_menu')
register_top_menu('tags', link={'text': _(u'tags'), 'view': 'tag_list', 'famfam': 'tag_blue'}, children_path_regex=[r'^tags/[^d]'])#TODO: change to children view regex or list
register_links(['tag_acl_list', 'tag_new_holder'], [tag_new_holder], menu_name='sidebar')
register_links(Document, [tag_document_list], menu_name='form_header')
register_links(['document_tags', 'tag_remove', 'tag_multiple_remove', 'tag_attach'], [tag_attach], menu_name='sidebar')

View File

@@ -14,5 +14,4 @@ urlpatterns = patterns('tags.views',
url(r'^document/(?P<document_id>\d+)/list/$', 'document_tags', (), 'document_tags'),
url(r'^(?P<tag_pk>\d+)/acl/list/$', 'tag_acl_list', (), 'tag_acl_list'),
url(r'^(?P<tag_pk>\d+)/acl/holder/new/$', 'tag_new_holder', (), 'tag_new_holder'),
)

View File

@@ -301,15 +301,3 @@ def tag_acl_list(request, tag_pk):
'object': tag,
}
)
def tag_new_holder(request, tag_pk):
tag = get_object_or_404(Tag, pk=tag_pk)
return acl_new_holder_for(
request,
tag,
extra_context={
#'tag': tag,
'object': tag,
}
)