diff --git a/apps/common/templates/404.html b/apps/common/templates/404.html
index a3e4254cab..3b629ecd0d 100755
--- a/apps/common/templates/404.html
+++ b/apps/common/templates/404.html
@@ -1,9 +1,12 @@
{% extends "base.html" %}
-
+{% load i18n %}
{% block title %}Page not found{% endblock %}
{% block content %}
-
Sorry, but the requested page could not be found.
+
+
{% blocktrans %}Page not found or insufficient permissions.{% endblocktrans %}
+
+
{% blocktrans %}Sorry, but the requested page could not be found.{% endblocktrans %}
+
+
{% endblock %}
diff --git a/apps/common/templatetags/navigation.py b/apps/common/templatetags/navigation.py
index 982dbbb60d..b8f2689615 100755
--- a/apps/common/templatetags/navigation.py
+++ b/apps/common/templatetags/navigation.py
@@ -227,6 +227,7 @@ def get_object_navigation_links(parser, token):
def object_navigation_template(context):
return {
+ 'request':context['request'],
'horizontal':True,
'object_navigation_links':_get_object_navigation_links(context)
}
diff --git a/apps/permissions/__init__.py b/apps/permissions/__init__.py
index 567cb34554..1a899077c0 100644
--- a/apps/permissions/__init__.py
+++ b/apps/permissions/__init__.py
@@ -9,15 +9,33 @@ from common.api import register_links, register_menu, \
from permissions.conf.settings import DEFAULT_ROLES
from models import Role
+from api import register_permissions
-role_list = {'text':_(u'roles'), 'view':'role_list', 'famfam':'medal_gold_1'}#, 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}}
-role_view = {'text':_(u'role details'), 'view':'role_view', 'args':'object.id', 'famfam':'medal_gold_1'}#, 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}}
-role_create = {'text':_(u'create new role'), 'view':'role_create', 'famfam':'medal_gold_add'}#, 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}}
-role_delete = {'text':_(u'delete'), 'view':'role_delete', 'args':'object.id', 'famfam':'medal_gold_delete'}#, 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}}
+PERMISSION_ROLE_VIEW = 'role_view'
+PERMISSION_ROLE_EDIT = 'role_edit'
+PERMISSION_ROLE_CREATE = 'role_create'
+PERMISSION_ROLE_DELETE = 'role_delete'
+PERMISSION_PERMISSION_GRANT = 'permission_grant'
+PERMISSION_PERMISSION_REVOKE = 'permission_revoke'
-register_links(Role, [role_view], menu_name='sidebar')
-register_links(Role, [role_delete])
-register_links(['role_list', 'role_view', 'role_create', 'role_delete'], [role_create], menu_name='sidebar')
+register_permissions('permissions', [
+ {'name':PERMISSION_ROLE_VIEW, 'label':_(u'View roles')},
+ {'name':PERMISSION_ROLE_EDIT, 'label':_(u'Edit roles')},
+ {'name':PERMISSION_ROLE_CREATE, 'label':_(u'Create roles')},
+ {'name':PERMISSION_ROLE_DELETE, 'label':_(u'Delete roles')},
+ {'name':PERMISSION_PERMISSION_GRANT, 'label':_(u'Grant permissions')},
+ {'name':PERMISSION_PERMISSION_REVOKE, 'label':_(u'Revoke permissions')},
+])
+
+
+role_list = {'text':_(u'roles'), 'view':'role_list', 'famfam':'medal_gold_1', 'permissions':{'namespace':'permissions', 'permissions':[PERMISSION_ROLE_VIEW]}}
+role_create = {'text':_(u'create new role'), 'view':'role_create', 'famfam':'medal_gold_add', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_ROLE_CREATE]}}
+role_edit = {'text':_(u'edit'), 'view':'role_edit', 'args':'object.id', 'famfam':'medal_gold_1', 'permissions':{'namespace':'permissions', 'permissions':[PERMISSION_ROLE_EDIT]}}
+role_permissions = {'text':_(u'role permissions'), 'view':'role_permissions', 'args':'object.id', 'famfam':'key_go', 'permissions':{'namespace':'permissions', 'permissions':[PERMISSION_PERMISSION_GRANT, PERMISSION_PERMISSION_REVOKE]}}
+role_delete = {'text':_(u'delete'), 'view':'role_delete', 'args':'object.id', 'famfam':'medal_gold_delete', 'permissions':{'namespace':'permissions', 'permissions':[PERMISSION_ROLE_DELETE]}}
+
+register_links(Role, [role_permissions, role_edit, role_delete])
+register_links(['role_list', 'role_view', 'role_create', 'role_edit', 'role_permissions', 'role_delete'], [role_create], menu_name='sidebar')
def user_post_save(sender, instance, **kwargs):
diff --git a/apps/permissions/forms.py b/apps/permissions/forms.py
index 08c062e837..40bec56fe8 100644
--- a/apps/permissions/forms.py
+++ b/apps/permissions/forms.py
@@ -1,13 +1,6 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
-#from django.http import HttpResponseRedirect
-#from django.utils.http import urlencode
-#from django.core.urlresolvers import reverse
-#from django.utils.safestring import mark_safe
-#from django.forms.formsets import formset_factory
-#from common.wizard import BoundFormWizard
-#from common.utils import urlquote
from common.forms import DetailForm
from models import Role
diff --git a/apps/permissions/models.py b/apps/permissions/models.py
index bddcdb3bc5..06c5549c04 100644
--- a/apps/permissions/models.py
+++ b/apps/permissions/models.py
@@ -4,17 +4,24 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
+class PermissionManager(models.Manager):
+ def get_for_holder(self, holder):
+ ct = ContentType.objects.get_for_model(holder)
+ return [Permission.objects.get(id=id) for id in PermissionHolder.objects.filter(holder_type=ct,holder_id=holder.id).values_list('permission_id', flat=True)]
+
class Permission(models.Model):
namespace = models.CharField(max_length=64, verbose_name=_(u'namespace'))
name = models.CharField(max_length=64, verbose_name=_(u'name'))
label = models.CharField(max_length=64, verbose_name=_(u'label'))
+ objects = PermissionManager()
+
class Meta:
+ ordering = ('namespace', 'label')
unique_together = ('namespace', 'name')
verbose_name = _(u'permission')
verbose_name_plural = _(u'permissions')
-
def __unicode__(self):
return self.label
@@ -38,7 +45,7 @@ class PermissionHolder(models.Model):
class Role(models.Model):
name = models.CharField(max_length=64, unique=True)
label = models.CharField(max_length=64, unique=True, verbose_name=_(u'label'))
-
+
class Meta:
ordering = ('label',)
verbose_name = _(u'role')
@@ -52,17 +59,17 @@ class Role(models.Model):
def __unicode__(self):
return self.label
-
+
@models.permalink
def get_absolute_url(self):
- return ('role_view', [self.id])
+ return ('role_list',)
class RoleMember(models.Model):
role = models.ForeignKey(Role, verbose_name=_(u'role'))
member_type = models.ForeignKey(ContentType,
related_name='role_member',
- limit_choices_to = {'model__in': ('user', 'group', 'role')})
+ limit_choices_to = {'model__in': ('user', 'group')})
member_id = models.PositiveIntegerField()
member_object = generic.GenericForeignKey(ct_field='member_type', fk_field='member_id')
diff --git a/apps/permissions/urls.py b/apps/permissions/urls.py
index 464da525e7..76bb2af84e 100644
--- a/apps/permissions/urls.py
+++ b/apps/permissions/urls.py
@@ -1,23 +1,12 @@
from django.conf.urls.defaults import *
-#from django.utils.translation import ugettext_lazy as _
-#from django.views.generic.create_update import create_object, update_object
urlpatterns = patterns('permissions.views',
url(r'^role/list/$', 'role_list', (), 'role_list'),
- url(r'^role/(?P