mirror of
https://github.com/jazzband/django-authority.git
synced 2026-05-17 12:01:07 +00:00
Renamed permissions template tags
This commit is contained in:
parent
5c6fcfe884
commit
9e666d9099
1 changed files with 0 additions and 174 deletions
|
|
@ -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)
|
||||
Loading…
Reference in a new issue