annotate doc/templating.txt @ 2119:cc4667ef3f12

Added the ability to toggle where error messages go. They either go to the user (default, for backwards compatibility), the dispatcher, or both. These are able to be toggled via settings in config.py. Please refer to upgrading.txt for more details. (And Richard, let me know if I've done anything wrong with this checkin. :))
author Eddie Parker <eparker@users.sourceforge.net>
date Thu, 25 Mar 2004 19:27:15 +0000
parents 43ab730ee194
children 6535aa11418a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ==========================
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 HTML Templating Mechanisms
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 ==========================
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4
1089
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
5 :Version: $Revision: 1.14 $
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 Current Situation and Issues
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 ============================
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 Syntax
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 ------
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 Roundup currently uses an element-based HTML-tag-alike templating syntax::
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 <display call="checklist('status')">
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 The templates were initially parsed using recursive regular expression
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
18 parsing, and since no template tag could encapsulate itself, the parser
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 worked just fine. Then we got the ``<require>`` tag, which could have other
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 ``<require>`` tags inside. This forced us to move towards a more complete
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 parser, using the standard python sgmllib/htmllib parser. The downside of this
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 switch is that constructs of the form::
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 <tr class="row-<display call="plain('status')">">
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
26 don't parse as we'd hope. We can modify the parser to work, but that doesn't
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
27 another couple of issues that have arisen:
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
956
Richard Jones <richard@users.sourceforge.net>
parents: 955
diff changeset
29 1. the template syntax is not well-formed, and therefore is a pain to parse
Richard Jones <richard@users.sourceforge.net>
parents: 955
diff changeset
30 and doesn't play well with other tools, and
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 2. user requirements generally have to be anticipated and accounted for in
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 templating functions (like ``plain()`` and ``checklist()`` above), and
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 we are therefore artificially restrictive.
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 Arguments for switching templating systems:
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 *Pros*
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 - more flexibility in templating control and content
956
Richard Jones <richard@users.sourceforge.net>
parents: 955
diff changeset
40 - we can be well-formed
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 *Cons*
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 - installed user base (though they'd have to edit their templates with the
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 next release anyway)
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 - current templating system is pretty trivial, and a more flexible system
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 is likely to be more complex
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 Templates
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 ---------
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52
957
Richard Jones <richard@users.sourceforge.net>
parents: 956
diff changeset
53 We should also take this opportunity to open up the flexibility of the
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 templates through:
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55
1089
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
56 1. allowing the tracker to define a "page" template, which holds the overall
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 page structure, including header and footer
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 Possible approaches
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 ===================
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 Zope's PageTemplates
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 --------------------
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 Using Zope's PageTemplates seems to be the best approach of the lot.
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 In my opinion, it's the peak of HTML templating technology at present. With
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 appropriate infrastructure, the above two examples would read:
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 <span tal:replace="item/status/checklist">status checklist</span>
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 <tr tal:attributes="class string:row-${item/status/name}">
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 ... which doesn't look that much more complicated... honest...
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 Other fun can be had when you start playing with stuff like:
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 <table>
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 <tr tal:repeat="message item/msg/list">
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 <td tal:define="from message/from">
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 <a href="" tal:attributes="href string:mailto:${from/address}"
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 tal:content="from/name">mailto link</a>
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 </td>
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 <td tal:content="message/title">subject</td>
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 <td tal:content="message/created">received date</td>
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 </tr>
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 </table>
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
90 Note: even if we don't switch templating as a whole, this document may be
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
91 applied to the ZRoundup frontend.
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
92
960
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
93 PageTemplates in a Nutshell
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
94 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
95
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
96 PageTemplates consist of three technologies:
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
97
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
98 TAL - Template Attribute Language
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
99 This is the syntax which is woven into the HTML using the ``tal:`` tag
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
100 attributes. A TAL parser pulls out the TAL commands from the attributes
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
101 runs them using some expression engine.
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
102
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
103 TALES - TAL Expression Syntax
960
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
104 The expression engine used in this case is TALES, which runs the expressions
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
105 that form the tag attribute values. TALES expressions come in three
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
106 flavours:
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
107
961
7d68f88f0642 more useful example
Richard Jones <richard@users.sourceforge.net>
parents: 960
diff changeset
108 Path Expressions - eg. ``item/status/checklist``
960
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
109 These are object attribute / item accesses. Roughly speaking, the path
961
7d68f88f0642 more useful example
Richard Jones <richard@users.sourceforge.net>
parents: 960
diff changeset
110 ``item/status/checklist`` is broken into parts ``item``, ``status``
7d68f88f0642 more useful example
Richard Jones <richard@users.sourceforge.net>
parents: 960
diff changeset
111 and ``checklist``. The ``item`` part is the root of the expression.
7d68f88f0642 more useful example
Richard Jones <richard@users.sourceforge.net>
parents: 960
diff changeset
112 We then look for a ``status`` attribute on ``item``, or failing that, a
7d68f88f0642 more useful example
Richard Jones <richard@users.sourceforge.net>
parents: 960
diff changeset
113 ``status`` item (as in ``item['status']``). If that
960
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
114 fails, the path expression fails. When we get to the end, the object we're
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
115 left with is evaluated to get a string - methods are called, objects are
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
116 stringified. Path expressions may have an optional ``path:`` prefix, though
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
117 they are the default expression type, so it's not necessary.
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
118
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
119 String Expressions - eg. ``string:hello ${user/name}``
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
120 These expressions are simple string interpolations (though they can be just
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
121 plain strings with no interpolation if you want. The expression in the
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
122 ``${ ... }`` is just a path expression as above.
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
123
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
124 Python Expressions - eg. ``python: 1+1``
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
125 These expressions give the full power of Python. All the "root level"
961
7d68f88f0642 more useful example
Richard Jones <richard@users.sourceforge.net>
parents: 960
diff changeset
126 variables are available, so ``python:item.status.checklist()`` would be
7d68f88f0642 more useful example
Richard Jones <richard@users.sourceforge.net>
parents: 960
diff changeset
127 equivalent to ``item/status/checklist``, assuming that ``checklist`` is
7d68f88f0642 more useful example
Richard Jones <richard@users.sourceforge.net>
parents: 960
diff changeset
128 a method.
960
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
129
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
130 PageTemplates
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
131 The PageTemplates module glues together TAL and TALES.
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
132
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 Implementation
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 ~~~~~~~~~~~~~~
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 I'm envisaging an infrastructure layer where each template has the following
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
138 "root level" (that is, directly accessible in the TALES namespace) variables
960
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
139 defined:
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140
991
79129f013153 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 978
diff changeset
141 *klass*
1089
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
142 The current class of item being displayed as an HTMLClass instance. Name is
991
79129f013153 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 978
diff changeset
143 mangled so it can be used in Python expressions.
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
144
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 *item*
1089
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
146 The current item from the database, if we're viewing a specific item, as an
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
147 HTMLItem instance. If it doesn't exist, then we're on a new item page.
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
148
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 (*classname*)
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
150 this is one of two things:
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
151
1089
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
152 1. the *item* is also available under its classname, so a *user* item
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
153 would also be available under the name *user*. This is also an HTMLItem
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
154 instance.
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
155 2. if there's no *item* then the current class is available through this
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
156 name, thus "user/name" and "user/name/menu" will still work - the latter
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
157 will pull information from the form if it can.
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
158
978
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
159 this is a dangerous attribute, and may cause us pain the long run (its name
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
160 may clash with other top-level variables ... it already clashed with the
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
161 proposed *user* variable). It might be safer to go with just *class* and
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
162 *item*, actually...
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
163
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 *form*
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
165 The current CGI form information as a mapping of form argument name to value
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
166
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
167 *request*
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
168 Includes information about the current request, including:
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
169 - the url
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
170 - the current index information (``filterspec``, ``filter`` args,
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
171 ``properties``, etc) parsed out of the form.
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
172 - methods for easy filterspec link generation
1089
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
173 - *user*, the current user item as an HTMLItem instance
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
174
1089
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
175 *tracker*
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
176 The current tracker
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
177
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 *db*
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
179 The current open database
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
180
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181 *config*
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
182 The current instance config
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
183
960
6b6be8818bdd more info
Richard Jones <richard@users.sourceforge.net>
parents: 959
diff changeset
184 *modules*
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
185 python modules made available (XXX: not sure what's actually in there tho)
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
186
991
79129f013153 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 978
diff changeset
187 Accesses through a class (either through *klass* or *db.<classname>*)::
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
188
959
Richard Jones <richard@users.sourceforge.net>
parents: 958
diff changeset
189 class HTMLClass:
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
190 def __getattr__(self, attr):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
191 ''' return an HTMLItem instance '''
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
192 def classhelp(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
193 def list(self, ...)
966
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
194 def filter(self):
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
195 ''' Return a list of items from this class, filtered and sorted
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
196 by the current requested filterspec/filter/sort/group args
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
197 '''
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
199 Accesses through an *item*::
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
200
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
201 class HTMLItem:
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
202 def __getattr__(self, attr):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
203 ''' return an HTMLItem instance '''
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
204 def history(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
205 def remove(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
207 Note: the above could cause problems if someone wants to have properties
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
208 called "history" or "remove"...
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
209
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 String, Number, Date, Interval HTMLProperty
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 a wrapper object which may be stringified for the current plain() behaviour
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 and has methods emulating all the current display functions, so
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 ``item/name/plain`` would emulate the current ``call="plain()``". Also,
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 ``python:item.name.plain(name=value)`` would work just fine::
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
216 class HTMLProperty:
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
217 def __init__(self, instance, db, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
218 def __str__(self):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
219 return self.plain()
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
221 class StringHTMLProperty(HTLProperty):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
222 def plain(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
223 def field(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
224 def stext(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
225 def multiline(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
226 def email(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
228 class NumberHTMLProperty(HTMLProperty):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
229 def plain(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
230 def field(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
232 class BooleanHTMLProperty(HTMLProperty):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
233 def plain(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
234 def field(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
236 class DateHTMLProperty(HTMLProperty):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
237 def plain(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
238 def field(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
239 def reldate(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
241 class IntervalHTMLProperty(HTMLProperty):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
242 def plain(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
243 def field(self, ...)
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
244 def pretty(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 Link HTMLProperty
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 the wrapper object would include the above as well as being able to access
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 the class information. Stringifying the object itself would result in the
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249 value from the item being displayed. Accessing attributes of this object
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 would result in the appropriate entry from the class being queried for the
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 property accessed (so item/assignedto/name would look up the user entry
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 identified by the assignedto property on item, and then the name property of
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253 that user)::
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
255 class LinkHTMLProperty(HTMLProperty):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
256 ''' Be a HTMLItem too '''
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
257 def __getattr__(self, attr):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
258 ''' return a new HTMLProperty '''
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
259 def download(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
260 def checklist(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 Multilink HTMLProperty
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263 the wrapper would also be iterable, returning a wrapper object like the Link
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 case for each entry in the multilink::
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
266 class MultilinkHTMLProperty(HTMLProperty):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
267 def __len__(self):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
268 ''' length of the multilink '''
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
269 def __getitem(self, num):
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
270 ''' return a new HTMLItem '''
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
271 def checklist(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
272 def list(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
274 *request*
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
275 the request object will handle::
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276
963
Richard Jones <richard@users.sourceforge.net>
parents: 961
diff changeset
277 class Request:
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
278 def __init__(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
279 def filterspec(self, ...)
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280
978
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
281 Accesses through the *user* attribute of *request*::
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
282
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
283 class HTMLUser(HTMLItem):
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
284 def hasPermission(self, ...)
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
285
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
286 (note that the other permission check implemented by the security module may
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
287 be implemented easily in a tal:condition, so isn't needed here)
Richard Jones <richard@users.sourceforge.net>
parents: 977
diff changeset
288
966
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
289 Template files
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
290 ~~~~~~~~~~~~~~
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
291
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
292 Each instance will have the opportunity to supply the following templates:
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293
966
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
294 page
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
295 This is the overall page look template, and includes at some point a TAL
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
296 command that includes the variable "content". This variable causes the actual
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
297 page content to be generated.
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
299 [classname].[template type]
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
300 Templates that have this form are applied to item data. There are three forms
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
301 of special template types:
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
302
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
303 [classname].index
1089
43ab730ee194 instance -> tracker, node -> item
Richard Jones <richard@users.sourceforge.net>
parents: 991
diff changeset
304 This template is used when the URL specifies only the class, and not an item
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
305 designator. It displays a list of [classname] items from the database, and
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
306 a "filter refinement" form.
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
307 Would perform a TAL ``repeat`` command using the list supplied by
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
308 ``class/filter``. This deviates from the current situation in that currently
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
309 the index template specifies a single row, and the filter part is
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
310 automatically generated.
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
311
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
312 [classname].item
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
313 This template is used when the URL specifies an item designator. It's the
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
314 default template used (when no template is explicitly given). It displays
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
315 a single item from the database using the *classname* variable (that
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
316 is, the variable of the same name as the class being displayed. If
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
317
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
318 These two special template types may be overridden by the :template CGI
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
319 variable.
966
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
320
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
321 Note that the "newitem" template doesn't exist any more because the item
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
322 templates may determine whether the page has an existing item to render. The
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
323 new item page would be accessed by "/tracker/url/issue?:template=item".
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
324 The old "filter" template has been subsumed by the index template.
955
84281f7f2900 templating redesign
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
325
958
Richard Jones <richard@users.sourceforge.net>
parents: 957
diff changeset
326
966
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
327 Integrating Code
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
328 ~~~~~~~~~~~~~~~~
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
329
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
330 We will install PageTemplates, TAL and ZTUtils in site-packages. If there is a
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
331 local Zope installation, it will use its own PageTemplates code (Zope modifies
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
332 the module search path to give precedence to its own module library).
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
333
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
334 We will then install the trivial MultiMapping and ComputedAttribute modules in
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
335 the Roundup package, and have some import trickery that determines whether
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
336 they are required, and if so they will be imported as if they were at the
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
337 "top level" of the module namespace.
cc8f9193bf2f more tweaks
Richard Jones <richard@users.sourceforge.net>
parents: 963
diff changeset
338
977
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
339 New CGI client structure
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
340 ~~~~~~~~~~~~~~~~~~~~~~~~
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
341
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
342 Handling of a request in the CGI client will take three phases:
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
343
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
344 1. Determine user, pre-set "content" to authorisation page if necessary
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
345 2. Render main page, with callback to "content"
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
346 3. Render content - if not pre-set, then determine which content to render
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
347
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
348
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
349 Use Cases
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
350 ~~~~~~~~~
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
351
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
352 Meta/parent bug
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
353 Can be done with addition to the schema and then the actual parent heirarchy
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
354 may be displayed with a new template page ":dependencies" or something.
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
355
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
356 Submission wizard
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
357 Can be done using new templates ":page1", ":page2", etc and some additional
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
358 actions on the CGI Client class in the instance.
22e6707a993a More tweaks to the design.
Richard Jones <richard@users.sourceforge.net>
parents: 966
diff changeset
359

Roundup Issue Tracker: http://roundup-tracker.org/