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
91
|
from django.template import Library, Node, Variable
from attachments.forms import AttachmentForm
from attachments.views import add_url_for_obj
from django.core.urlresolvers import reverse
from attachments.models import Attachment
register = Library()
@register.inclusion_tag('attachments/add_form.html', takes_context=True)
def attachment_form(context, obj):
"""
Renders a "upload attachment" form
"""
if context['request'].user.is_authenticated():
return {
'form': AttachmentForm(),
'form_url': add_url_for_obj(obj),
'next': context['request'].build_absolute_uri(),
}
else:
return {
'form': None,
}
@register.inclusion_tag('attachments/delete_link.html', takes_context=True)
def attachment_delete_link(context, attachment):
"""
Renders a html link to the delete view of the given attachment. Returns
no content if the request-user has no permission to delete foreign
attachments.
"""
if context['request'].user.has_perm('delete_foreign_attachments') \
or context['request'].user == attachment.creator:
return {
'next': context['request'].build_absolute_uri(),
'delete_url': reverse('delete_attachment', kwargs={'attachment_pk': attachment.pk})
}
return {'delete_url': None,}
class AttachmentsForObjectNode(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)
if self.var_name:
var_name = self.resolve(self.var_name, context)
else:
var_name = 'attachments'
context[var_name] = Attachment.objects.attachments_for_object(obj)
return ''
@register.tag
def get_attachments_for(parser, token):
"""
Resolves attachments that are attached to a given object. You can specify
the variable name in the context the attachments are stored using the `as`
argument. Default context variable name is `attachments`.
Syntax::
{% get_attachments_for obj %}
{% for att in attachments %}
{{ att }}
{% endfor %}
{% get_attachments_for obj as "my_attachments" %}
"""
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()
args = {
'obj': next_bit_for(bits, 'get_attachments_for'),
'var_name': next_bit_for(bits, 'as'),
}
return AttachmentsForObjectNode(**args)
|