This repository has been archived by the owner on Jul 29, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
/
extra_urls.py
90 lines (71 loc) · 2.82 KB
/
extra_urls.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from itertools import chain
import re
from django import template
from django.contrib.admin.templatetags.admin_urls import admin_urlname
from django.core.urlresolvers import reverse
from django.template import Node, TemplateSyntaxError
register = template.Library()
@register.assignment_tag(takes_context=True)
def has_permission(context, perm_name):
if not perm_name:
return True
request = context['request']
return request.user.has_perm(perm_name)
class NewlinelessNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
def render(self, context):
return self.remove_newlines(self.nodelist.render(context).strip())
def remove_newlines(self, value):
value = re.sub(r'\n', ' ', value)
value = re.sub(r'\s+', ' ', value)
return value
@register.tag
def nlless(parser, token):
"""
Remove all whitespace except for one space from content
"""
nodelist = parser.parse(('endnlless',))
parser.delete_first_token()
return NewlinelessNode(nodelist)
class ExtraUrlNode(Node):
def __init__(self, methodname, varname, target):
self.methodname = methodname
self.varname = varname
self.object = target
def render(self, context):
methodname = template.Variable(self.methodname).resolve(context)
target = template.Variable(self.object).resolve(context)
model_admin = context['adminform'].model_admin
for name, options in chain(model_admin.extra_detail_buttons, model_admin.extra_buttons):
if name == methodname:
opts = options._asdict()
if target:
opts['href'] = reverse(admin_urlname(target._meta, methodname),
args=[target.pk])
context[self.varname] = opts
return ''
raise TemplateSyntaxError("'%s' is not a valid extra url name" % target)
@register.tag
def extraurl(parser, token):
"""
Usages:
{% extraurl 'transitions' as options for adminform.form.instance %}
<li><a href="{{ options.href }}" class="{{ options.css_class }}"><i
class="{{ options.icon }} icon-alpha75"></i>{{ options.label }}</a>
</li>
:param parser:
:param token:
:return:
"""
bits = token.contents.split()
target = None
if len(bits) not in [4, 6]:
raise TemplateSyntaxError("extraurl require five or six arguments. %s passed" % len(bits))
if bits[2] != 'as':
raise TemplateSyntaxError("third argument to the extraurl tag must be 'as'")
if len(bits) == 6:
if bits[4] != 'for':
raise TemplateSyntaxError("fifth argument to the extraurl tag must be 'for'. (not '%s'" % bits[5])
target = bits[5]
return ExtraUrlNode(bits[1], bits[3], target)