Add ACL support to the linking app, convert import to absolute

This commit is contained in:
Roberto Rosario
2011-12-25 03:22:05 -04:00
parent eb9fb7141d
commit 7e9fbf4f47
8 changed files with 135 additions and 57 deletions

View File

@@ -1,3 +1,5 @@
from __future__ import absolute_import
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from navigation.api import register_links, register_sidebar_template from navigation.api import register_links, register_sidebar_template
@@ -5,8 +7,10 @@ from permissions.models import PermissionNamespace, Permission
from project_setup.api import register_setup from project_setup.api import register_setup
from documents.literals import PERMISSION_DOCUMENT_VIEW from documents.literals import PERMISSION_DOCUMENT_VIEW
from documents.models import Document from documents.models import Document
from acls.models import class_permissions
from acls import ACLS_EDIT_ACL, ACLS_VIEW_ACL
from linking.models import SmartLink, SmartLinkCondition from .models import SmartLink, SmartLinkCondition
linking_namespace = PermissionNamespace('linking', _(u'Smart links')) linking_namespace = PermissionNamespace('linking', _(u'Smart links'))
@@ -29,12 +33,26 @@ smart_link_condition_create = {'text': _(u'create condition'), 'view': 'smart_li
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_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_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')
register_links(Document, [smart_link_instances_for_document], menu_name='form_header') register_links(Document, [smart_link_instances_for_document], menu_name='form_header')
register_links(SmartLink, [smart_link_edit, smart_link_delete, smart_link_condition_list]) register_links(SmartLink, [smart_link_edit, smart_link_delete, smart_link_condition_list, smart_link_acl_list])
register_links([SmartLink, 'smart_link_list', 'smart_link_create'], [smart_link_list, smart_link_create], menu_name='sidebar')
register_links(SmartLinkCondition, [smart_link_condition_edit, smart_link_condition_delete]) register_links(SmartLinkCondition, [smart_link_condition_edit, smart_link_condition_delete])
register_links(['smart_link_list', 'smart_link_create', 'smart_link_edit', 'smart_link_delete', 'smart_link_condition_list', 'smart_link_condition_create', 'smart_link_condition_edit', 'smart_link_condition_delete'], [smart_link_list, smart_link_create], menu_name='sidebar')
register_links(['smart_link_condition_list', 'smart_link_condition_create', 'smart_link_condition_edit', 'smart_link_condition_delete'], [smart_link_condition_create], menu_name='sidebar') register_links(['smart_link_condition_list', 'smart_link_condition_create', 'smart_link_condition_edit', 'smart_link_condition_delete'], [smart_link_condition_create], menu_name='sidebar')
register_setup(smart_link_setup) register_setup(smart_link_setup)
register_sidebar_template(['smart_link_list'], 'smart_links_help.html') register_sidebar_template(['smart_link_list'], 'smart_links_help.html')
class_permissions(SmartLink, [
PERMISSION_SMART_LINK_VIEW,
PERMISSION_SMART_LINK_DELETE,
PERMISSION_SMART_LINK_EDIT,
ACLS_EDIT_ACL,
ACLS_VIEW_ACL
])

View File

@@ -1,6 +1,8 @@
from __future__ import absolute_import
from django.contrib import admin from django.contrib import admin
from linking.models import SmartLink, SmartLinkCondition from .models import SmartLink, SmartLinkCondition
class SmartLinkConditionInline(admin.StackedInline): class SmartLinkConditionInline(admin.StackedInline):

View File

@@ -1,3 +1,5 @@
from __future__ import absolute_import
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext from django.utils.translation import ugettext
@@ -9,7 +11,7 @@ from django.conf import settings
from documents.widgets import document_html_widget from documents.widgets import document_html_widget
from tags.widgets import get_tags_inline_widget from tags.widgets import get_tags_inline_widget
from linking.models import SmartLink, SmartLinkCondition from .models import SmartLink, SmartLinkCondition
class SmartLinkForm(forms.ModelForm): class SmartLinkForm(forms.ModelForm):

View File

@@ -1,10 +1,12 @@
from __future__ import absolute_import
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from metadata.classes import MetadataObject from metadata.classes import MetadataObject
from documents.models import Document from documents.models import Document
from linking.literals import INCLUSION_AND, INCLUSION_OR from .literals import INCLUSION_AND, INCLUSION_OR
class SmartLinkManager(models.Manager): class SmartLinkManager(models.Manager):

View File

@@ -1,8 +1,10 @@
from __future__ import absolute_import
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from linking.managers import SmartLinkManager from .managers import SmartLinkManager
from linking.literals import OPERATOR_CHOICES, INCLUSION_AND, \ from .literals import OPERATOR_CHOICES, INCLUSION_AND, \
INCLUSION_CHOICES INCLUSION_CHOICES

View File

@@ -1,23 +0,0 @@
"""
This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".
Replace these with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.failUnlessEqual(1 + 1, 2)
__test__ = {"doctest": """
Another way to test that 1 + 1 is equal to 2.
>>> 1 + 1 == 2
True
"""}

View File

@@ -14,4 +14,7 @@ urlpatterns = patterns('linking.views',
url(r'^setup/(?P<smart_link_pk>\d+)/condition/create/$', 'smart_link_condition_create', (), 'smart_link_condition_create'), url(r'^setup/(?P<smart_link_pk>\d+)/condition/create/$', 'smart_link_condition_create', (), 'smart_link_condition_create'),
url(r'^setup/smart_link/condition/(?P<smart_link_condition_pk>\d+)/edit/$', 'smart_link_condition_edit', (), 'smart_link_condition_edit'), url(r'^setup/smart_link/condition/(?P<smart_link_condition_pk>\d+)/edit/$', 'smart_link_condition_edit', (), 'smart_link_condition_edit'),
url(r'^setup/smart_link/condition/(?P<smart_link_condition_pk>\d+)/delete/$', 'smart_link_condition_delete', (), 'smart_link_condition_delete'), 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

@@ -1,3 +1,6 @@
from __future__ import absolute_import
import logging
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.contrib import messages from django.contrib import messages
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
@@ -7,24 +10,27 @@ from django.template import RequestContext
from common.utils import generate_choices_w_labels, encapsulate from common.utils import generate_choices_w_labels, encapsulate
from common.widgets import two_state_template from common.widgets import two_state_template
from documents.models import Document from documents.models import Document
from documents.views import document_list from documents.views import document_list
from documents.literals import PERMISSION_DOCUMENT_VIEW
from permissions.models import Permission from permissions.models import Permission
from acls.views import acl_new_holder_for, acl_list_for, acl_detail_for
from acls.models import AccessEntry, PermissionDenied
from linking.models import SmartLink, SmartLinkCondition from .models import SmartLink, SmartLinkCondition
from linking.conf.settings import SHOW_EMPTY_SMART_LINKS from .conf.settings import SHOW_EMPTY_SMART_LINKS
from linking.forms import (SmartLinkInstanceForm, SmartLinkForm, from .forms import (SmartLinkInstanceForm, SmartLinkForm,
SmartLinkConditionForm) SmartLinkConditionForm)
from linking import smart_link_instance_view_link from . import smart_link_instance_view_link
from linking import (PERMISSION_SMART_LINK_VIEW, from . import (PERMISSION_SMART_LINK_VIEW,
PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_DELETE,
PERMISSION_SMART_LINK_EDIT) PERMISSION_SMART_LINK_EDIT)
logger = logging.getLogger(__name__)
def smart_link_action(request): def smart_link_action(request):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_VIEW]) #Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_VIEW])
action = request.GET.get('action', None) action = request.GET.get('action', None)
@@ -36,10 +42,14 @@ def smart_link_action(request):
def smart_link_instance_view(request, document_id, smart_link_pk): def smart_link_instance_view(request, document_id, smart_link_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_VIEW])
document = get_object_or_404(Document, pk=document_id) document = get_object_or_404(Document, pk=document_id)
smart_link = get_object_or_404(SmartLink, pk=smart_link_pk) smart_link = get_object_or_404(SmartLink, pk=smart_link_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_VIEW])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_SMART_LINK_VIEW, request.user, smart_link)
object_list, errors = SmartLink.objects.get_smart_link_instances_for(document, smart_link) object_list, errors = SmartLink.objects.get_smart_link_instances_for(document, smart_link)
return document_list( return document_list(
@@ -55,8 +65,6 @@ def smart_link_instance_view(request, document_id, smart_link_pk):
def smart_link_instances_for_document(request, document_id): def smart_link_instances_for_document(request, document_id):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_VIEW])
subtemplates_list = [] subtemplates_list = []
document = get_object_or_404(Document, pk=document_id) document = get_object_or_404(Document, pk=document_id)
smart_link_instances, errors = SmartLink.objects.get_smart_link_instances_for(document) smart_link_instances, errors = SmartLink.objects.get_smart_link_instances_for(document)
@@ -69,6 +77,17 @@ def smart_link_instances_for_document(request, document_id):
#dictionary #dictionary
smart_link_instances = dict([(group, data) for group, data in smart_link_instances.items() if data['documents']]) smart_link_instances = dict([(group, data) for group, data in smart_link_instances.items() if data['documents']])
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_VIEW])
except PermissionDenied:
smart_link_instances_keys_filtered = AccessEntry.objects.filter_objects_by_access(PERMISSION_SMART_LINK_VIEW, request.user, smart_link_instances.keys())
# Remove smart link instances not found in the new filtered key list
for key, value in smart_link_instances.items():
if key not in smart_link_instances_keys_filtered:
smart_link_instances.pop(key)
value['documents'] = AccessEntry.objects.filter_objects_by_access(PERMISSION_DOCUMENT_VIEW, request.user, value['documents'])
if smart_link_instances: if smart_link_instances:
subtemplates_list = [{ subtemplates_list = [{
'name': 'generic_form_subtemplate.html', 'name': 'generic_form_subtemplate.html',
@@ -99,11 +118,17 @@ def smart_link_instances_for_document(request, document_id):
def smart_link_list(request): def smart_link_list(request):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE]) qs = SmartLink.objects.all()
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_VIEW])
except PermissionDenied:
qs = AccessEntry.objects.filter_objects_by_access(PERMISSION_SMART_LINK_VIEW, request.user, qs)
return render_to_response('generic_list.html', { return render_to_response('generic_list.html', {
'title': _(u'smart links'), 'title': _(u'smart links'),
'object_list': SmartLink.objects.all(), 'object_list': qs,
'extra_columns': [ 'extra_columns': [
{'name': _(u'dynamic title'), 'attribute': 'dynamic_title'}, {'name': _(u'dynamic title'), 'attribute': 'dynamic_title'},
{'name': _(u'enabled'), 'attribute': encapsulate(lambda x: two_state_template(x.enabled))}, {'name': _(u'enabled'), 'attribute': encapsulate(lambda x: two_state_template(x.enabled))},
@@ -133,10 +158,13 @@ def smart_link_create(request):
def smart_link_edit(request, smart_link_pk): def smart_link_edit(request, smart_link_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_EDIT])
smart_link = get_object_or_404(SmartLink, pk=smart_link_pk) smart_link = get_object_or_404(SmartLink, pk=smart_link_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_EDIT])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_SMART_LINK_EDIT, request.user, smart_link)
if request.method == 'POST': if request.method == 'POST':
form = SmartLinkForm(request.POST, instance=smart_link) form = SmartLinkForm(request.POST, instance=smart_link)
if form.is_valid(): if form.is_valid():
@@ -155,10 +183,13 @@ def smart_link_edit(request, smart_link_pk):
def smart_link_delete(request, smart_link_pk): def smart_link_delete(request, smart_link_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_DELETE])
smart_link = get_object_or_404(SmartLink, pk=smart_link_pk) smart_link = get_object_or_404(SmartLink, pk=smart_link_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_DELETE])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_SMART_LINK_DELETE, request.user, smart_link)
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/'))) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/')))
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
@@ -185,10 +216,13 @@ def smart_link_delete(request, smart_link_pk):
def smart_link_condition_list(request, smart_link_pk): def smart_link_condition_list(request, smart_link_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT])
smart_link = get_object_or_404(SmartLink, pk=smart_link_pk) smart_link = get_object_or_404(SmartLink, pk=smart_link_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT])
except PermissionDenied:
AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT], request.user, smart_link)
return render_to_response('generic_list.html', { return render_to_response('generic_list.html', {
'title': _(u'conditions for smart link: %s') % smart_link, 'title': _(u'conditions for smart link: %s') % smart_link,
'object_list': smart_link.smartlinkcondition_set.all(), 'object_list': smart_link.smartlinkcondition_set.all(),
@@ -203,10 +237,13 @@ def smart_link_condition_list(request, smart_link_pk):
def smart_link_condition_create(request, smart_link_pk): def smart_link_condition_create(request, smart_link_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT])
smart_link = get_object_or_404(SmartLink, pk=smart_link_pk) smart_link = get_object_or_404(SmartLink, pk=smart_link_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT])
except PermissionDenied:
AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT], request.user, smart_link)
if request.method == 'POST': if request.method == 'POST':
form = SmartLinkConditionForm(request.POST) form = SmartLinkConditionForm(request.POST)
if form.is_valid(): if form.is_valid():
@@ -227,10 +264,13 @@ def smart_link_condition_create(request, smart_link_pk):
def smart_link_condition_edit(request, smart_link_condition_pk): def smart_link_condition_edit(request, smart_link_condition_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT])
smart_link_condition = get_object_or_404(SmartLinkCondition, pk=smart_link_condition_pk) smart_link_condition = get_object_or_404(SmartLinkCondition, pk=smart_link_condition_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT])
except PermissionDenied:
AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT], request.user, smart_link_condition.smart_link)
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/'))) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/')))
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
@@ -261,10 +301,13 @@ def smart_link_condition_edit(request, smart_link_condition_pk):
def smart_link_condition_delete(request, smart_link_condition_pk): def smart_link_condition_delete(request, smart_link_condition_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT])
smart_link_condition = get_object_or_404(SmartLinkCondition, pk=smart_link_condition_pk) smart_link_condition = get_object_or_404(SmartLinkCondition, pk=smart_link_condition_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT])
except PermissionDenied:
AccessEntry.objects.check_accesses([PERMISSION_SMART_LINK_CREATE, PERMISSION_SMART_LINK_EDIT], request.user, smart_link_condition.smart_link)
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/'))) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/')))
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
@@ -292,3 +335,32 @@ def smart_link_condition_delete(request, smart_link_condition_pk):
'previous': previous, 'previous': previous,
'form_icon': u'cog_delete.png', 'form_icon': u'cog_delete.png',
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
def smart_link_acl_list(request, smart_link_pk):
smart_link = get_object_or_404(SmartLink, pk=smart_link_pk)
logger.debug('smart_link: %s' % smart_link)
return acl_list_for(
request,
smart_link,
extra_context={
'object': smart_link,
'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,
'submit_label': _(u'Select'),
'submit_icon_famfam': 'tick',
'object': smart_link,
},
navigation_object=u'smart_link',
)