blob: 0052aefc283d28d8c5beca54199e8e7c4d3e418a [file] [log] [blame]
Armin Ronacherf3d6a732008-05-25 12:52:11 +02001# -*- coding: utf-8 -*-
Armin Ronacherf3d6a732008-05-25 12:52:11 +02002from os.path import join
David Lordd177eeb2020-01-09 12:03:07 -08003
4from django import template as django_template_module
Armin Ronacherf3d6a732008-05-25 12:52:11 +02005from django.conf import settings
David Lordd177eeb2020-01-09 12:03:07 -08006from django.template import Context as DjangoContext
7from django.template import loader as django_loader
8from django.template import Node
9from django.template import TokenParser
10from django.template import Variable
11from rwbench import dateformat
12from rwbench import ROOT
13
Armin Ronacherf60232d2010-06-05 14:31:27 +020014settings.configure(
David Lord04c87872020-01-10 07:46:18 -080015 TEMPLATE_DIRS=(join(ROOT, "django"),),
Armin Ronacherf60232d2010-06-05 14:31:27 +020016 TEMPLATE_LOADERS=(
David Lord04c87872020-01-10 07:46:18 -080017 (
18 "django.template.loaders.cached.Loader",
19 ("django.template.loaders.filesystem.Loader",),
20 ),
21 ),
Armin Ronacherf60232d2010-06-05 14:31:27 +020022)
Armin Ronacherf3d6a732008-05-25 12:52:11 +020023
24# for django extensions. We monkey patch our extensions in so that
25# we don't have to initialize a more complex django setup.
26django_extensions = django_template_module.Library()
27django_template_module.builtins.append(django_extensions)
28
Armin Ronacherf3d6a732008-05-25 12:52:11 +020029django_extensions.filter(dateformat)
30
31
32def var_or_none(x):
33 if x is not None:
34 return Variable(x)
35
36
37# and more django extensions
38@django_extensions.tag
39def input_field(parser, token):
40 p = TokenParser(token.contents)
41 args = [p.value()]
42 while p.more():
43 args.append(p.value())
44 return InputFieldNode(*args)
45
46
47@django_extensions.tag
48def textarea(parser, token):
49 p = TokenParser(token.contents)
50 args = [p.value()]
51 while p.more():
52 args.append(p.value())
53 return TextareaNode(*args)
54
55
56@django_extensions.tag
57def form(parser, token):
58 p = TokenParser(token.contents)
59 args = []
60 while p.more():
61 args.append(p.value())
David Lord04c87872020-01-10 07:46:18 -080062 body = parser.parse(("endform",))
Armin Ronacherf3d6a732008-05-25 12:52:11 +020063 parser.delete_first_token()
64 return FormNode(body, *args)
65
66
67class InputFieldNode(Node):
Armin Ronacherf3d6a732008-05-25 12:52:11 +020068 def __init__(self, name, type=None, value=None):
69 self.name = var_or_none(name)
70 self.type = var_or_none(type)
71 self.value = var_or_none(value)
72
73 def render(self, context):
74 name = self.name.resolve(context)
David Lord04c87872020-01-10 07:46:18 -080075 type = "text"
76 value = ""
Armin Ronacherf3d6a732008-05-25 12:52:11 +020077 if self.type is not None:
78 type = self.type.resolve(context)
79 if self.value is not None:
80 value = self.value.resolve(context)
David Lord04c87872020-01-10 07:46:18 -080081 tmpl = django_loader.get_template("_input_field.html")
82 return tmpl.render(DjangoContext({"name": name, "type": type, "value": value}))
Armin Ronacherf3d6a732008-05-25 12:52:11 +020083
84
85class TextareaNode(Node):
Armin Ronacherf3d6a732008-05-25 12:52:11 +020086 def __init__(self, name, rows=None, cols=None, value=None):
87 self.name = var_or_none(name)
88 self.rows = var_or_none(rows)
89 self.cols = var_or_none(cols)
90 self.value = var_or_none(value)
91
92 def render(self, context):
93 name = self.name.resolve(context)
94 rows = 10
95 cols = 40
David Lord04c87872020-01-10 07:46:18 -080096 value = ""
Armin Ronacherf3d6a732008-05-25 12:52:11 +020097 if self.rows is not None:
98 rows = int(self.rows.resolve(context))
99 if self.cols is not None:
100 cols = int(self.cols.resolve(context))
101 if self.value is not None:
102 value = self.value.resolve(context)
David Lord04c87872020-01-10 07:46:18 -0800103 tmpl = django_loader.get_template("_textarea.html")
104 return tmpl.render(
105 DjangoContext({"name": name, "rows": rows, "cols": cols, "value": value})
106 )
Armin Ronacherf3d6a732008-05-25 12:52:11 +0200107
108
109class FormNode(Node):
Armin Ronacherf3d6a732008-05-25 12:52:11 +0200110 def __init__(self, body, action=None, method=None):
111 self.body = body
112 self.action = action
113 self.method = method
114
115 def render(self, context):
116 body = self.body.render(context)
David Lord04c87872020-01-10 07:46:18 -0800117 action = ""
118 method = "post"
Armin Ronacherf3d6a732008-05-25 12:52:11 +0200119 if self.action is not None:
120 action = self.action.resolve(context)
121 if self.method is not None:
122 method = self.method.resolve(context)
David Lord04c87872020-01-10 07:46:18 -0800123 tmpl = django_loader.get_template("_form.html")
124 return tmpl.render(
125 DjangoContext({"body": body, "action": action, "method": method})
126 )