Renamed permissions template tags

This commit is contained in:
Jannis Leidel 2009-06-12 00:54:48 +02:00
parent 5c6fcfe884
commit 9e666d9099

View file

@ -1,174 +0,0 @@
from django import template
from django.db.models import get_app
from django.utils.importlib import import_module
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse
from django.template import Library, Node, Variable
from authority import permissions
from authority.views import add_url_for_obj
from authority.models import Permission
from authority.forms import UserPermissionForm
register = template.Library()
class ComparisonNode(template.Node):
"""
Implements a node to provide an "if user/group has permission on object"
"""
def __init__(self, user, permission, nodelist_true, nodelist_false, *objs):
self.user = user
self.objs = objs
# poll_permission.can_change
self.perm_label, self.check_name = permission.strip('"').split('.')
self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
def render(self, context):
try:
user = template.Variable(self.user).resolve(context)
if self.objs:
objs = []
for obj in self.objs:
if obj is not None:
objs.append(
template.Variable(obj).resolve(context))
else:
objs = None
# get permission set first
perm_cls = permissions.get_permission_by_label(self.perm_label)
if perm_cls is not None:
# create a permission instance
perm_instance = perm_cls(user)
# and try to find the correct check method
check = getattr(perm_instance, self.check_name, None)
if check is not None:
# check
if check(*objs):
# profit
return self.nodelist_true.render(context)
# If the app couldn't be found
except (ImproperlyConfigured, ImportError):
return ''
# If either variable fails to resolve, return nothing.
except template.VariableDoesNotExist:
return ''
# If the types don't permit comparison, return nothing.
except (TypeError, AttributeError):
return ''
return self.nodelist_false.render(context)
@register.tag('ifhasperm')
def do_if_has_perm(parser, token):
"""
This function provides funcitonality for the 'ifhasperm' template tag
{% ifhasperm [permission_label].[check_name] [user] [*objs] %}
lalala
{% else %}
meh
{% endifhasperm %}
{% if hasperm poll_permission.can_change request.user %}
lalala
{% else %}
meh
{% endifhasperm %}
"""
bits = token.contents.split()
if 5 < len(bits) < 3:
raise template.TemplateSyntaxError("'%s' tag takes three,\
four or five arguments" % bits[0])
end_tag = 'endifhasperm'
nodelist_true = parser.parse(('else', end_tag))
token = parser.next_token()
if token.contents == 'else': # there is an 'else' clause in the tag
nodelist_false = parser.parse((end_tag,))
parser.delete_first_token()
else:
nodelist_false = template.NodeList()
if len(bits) == 3: # this tag requires at most 2 objects . None is given
objs = (None, None)
elif len(bits) == 4:# one is given
objs = (bits[3], None)
else: #two are given
objs = (bits[3], bits[4])
return ComparisonNode(bits[2], bits[1], nodelist_true, nodelist_false, *objs)
@register.inclusion_tag('authority/permission_delete_link.html', takes_context=True)
def permission_delete_link(context, perm):
"""
Renders a html link to the delete view of the given permission. Returns
no content if the request-user has no permission to delete foreign
permissions.
"""
if context['request'].user.has_perm('delete_foreign_permissions') \
or context['request'].user == perm.creator:
return {
'next': context['request'].build_absolute_uri(),
'delete_url': reverse('authority-delete-permission', kwargs={
'permission_pk': perm.pk})
}
return {'delete_url': None}
@register.inclusion_tag('authority/permission_form.html', takes_context=True)
def permission_form(context, obj, perm):
"""
Renders an "add permissions" form
{% permission_form [obj] add_lesson %}
{% permission_form lesson add_lesson %}
"""
if context['request'].user.is_authenticated():
return {
'form': UserPermissionForm(perm, initial={'codename': perm}),
'form_url': add_url_for_obj(obj),
'next': context['request'].build_absolute_uri(),
}
return {'form': None}
class PermissionForObjectNode(Node):
def __init__(self, obj, var_name):
self.obj = obj
self.var_name = var_name
def resolve(self, var, context):
"""Resolves a variable out of context if it's not in quotes"""
if var[0] in ('"', "'") and var[-1] == var[0]:
return var[1:-1]
else:
return Variable(var).resolve(context)
def render(self, context):
obj = self.resolve(self.obj, context)
var_name = self.resolve(self.var_name, context)
#check = permissions.BasePermission(user=user)
perms = Permission.objects.permissions_for_object(obj)
context[var_name] = perms
return ''
@register.tag
def get_permissions_for(parser, token):
"""
Syntax::
{% get_permissions_for obj %}
{% for perm in permissions %}
{{ perm }}
{% endfor %}
{% get_permissions_for obj as "my_permissions" %}
"""
def next_bit_for(bits, key, if_none=None):
try:
return bits[bits.index(key)+1]
except ValueError:
return if_none
bits = token.contents.split()
kwargs = {
'obj': next_bit_for(bits, 'get_permissions_for'),
'var_name': next_bit_for(bits, 'as', '"permissions"'),
}
return PermissionForObjectNode(**kwargs)