annotate roundup/template_funcs.py @ 934:fdcf16b444a9

Use a real parser for templates. Rewrite htmltemplate to use the parser (hack, hack). Move the "do_XXX" methods to template_funcs.py. Redo the funcion tests (but not Template tests - they're hopeless). Simplified query form in cgi_client. Ability to delete msgs, files, queries. Ability to edit the metadata on files.
author Gordon B. McMillan <gmcm@users.sourceforge.net>
date Tue, 13 Aug 2002 20:16:10 +0000
parents
children 57d09949380e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
934
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
1 import hyperdb, date, password
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
2 from i18n import _
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
3 import htmltemplate
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
4 import cgi, os, StringIO, urllib, types
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
5
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
6
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
7 def do_plain(client, classname, cl, props, nodeid, filterspec, property, escape=0, lookup=1):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
8 ''' display a String property directly;
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
9
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
10 display a Date property in a specified time zone with an option to
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
11 omit the time from the date stamp;
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
12
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
13 for a Link or Multilink property, display the key strings of the
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
14 linked nodes (or the ids if the linked class has no key property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
15 when the lookup argument is true, otherwise just return the
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
16 linked ids
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
17 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
18 if not nodeid and client.form is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
19 return _('[Field: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
20 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
21 value = determine_value(cl, props, nodeid, filterspec, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
22
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
23 if isinstance(propclass, hyperdb.Password):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
24 value = _('*encrypted*')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
25 elif isinstance(propclass, hyperdb.Boolean):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
26 value = value and "Yes" or "No"
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
27 elif isinstance(propclass, hyperdb.Link):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
28 if value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
29 if lookup:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
30 linkcl = client.db.classes[propclass.classname]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
31 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
32 value = linkcl.get(value, k)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
33 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
34 value = _('[unselected]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
35 elif isinstance(propclass, hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
36 if value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
37 if lookup:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
38 linkcl = client.db.classes[propclass.classname]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
39 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
40 labels = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
41 for v in value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
42 labels.append(linkcl.get(v, k))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
43 value = ', '.join(labels)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
44 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
45 value = ', '.join(value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
46 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
47 value = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
48 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
49 value = str(value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
50
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
51 if escape:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
52 value = cgi.escape(value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
53 return value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
54
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
55 def do_stext(client, classname, cl, props, nodeid, filterspec, property, escape=0):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
56 '''Render as structured text using the StructuredText module
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
57 (see above for details)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
58 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
59 s = do_plain(client, classname, cl, props, nodeid, filterspec, property, escape=escape)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
60 if not StructuredText:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
61 return s
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
62 return StructuredText(s,level=1,header=0)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
63
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
64 def determine_value(cl, props, nodeid, filterspec, property):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
65 '''determine the value of a property using the node, form or
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
66 filterspec
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
67 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
68 if nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
69 value = cl.get(nodeid, property, None)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
70 if value is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
71 if isinstance(props[property], hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
72 return []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
73 return ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
74 return value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
75 elif filterspec is not None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
76 if isinstance(props[property], hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
77 return filterspec.get(property, [])
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
78 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
79 return filterspec.get(property, '')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
80 # TODO: pull the value from the form
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
81 if isinstance(props[property], hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
82 return []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
83 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
84 return ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
85
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
86 def make_sort_function(client, filterspec, classname):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
87 '''Make a sort function for a given class
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
88 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
89 linkcl = client.db.getclass(classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
90 if linkcl.getprops().has_key('order'):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
91 sort_on = 'order'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
92 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
93 sort_on = linkcl.labelprop()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
94 def sortfunc(a, b, linkcl=linkcl, sort_on=sort_on):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
95 return cmp(linkcl.get(a, sort_on), linkcl.get(b, sort_on))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
96 return sortfunc
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
97
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
98 def do_field(client, classname, cl, props, nodeid, filterspec, property, size=None, showid=0):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
99 ''' display a property like the plain displayer, but in a text field
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
100 to be edited
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
101
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
102 Note: if you would prefer an option list style display for
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
103 link or multilink editing, use menu().
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
104 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
105 if not nodeid and client.form is None and filterspec is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
106 return _('[Field: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
107 if size is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
108 size = 30
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
109
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
110 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
111
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
112 # get the value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
113 value = determine_value(cl, props, nodeid, filterspec, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
114 # now display
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
115 if (isinstance(propclass, hyperdb.String) or
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
116 isinstance(propclass, hyperdb.Date) or
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
117 isinstance(propclass, hyperdb.Interval)):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
118 if value is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
119 value = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
120 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
121 value = cgi.escape(str(value))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
122 value = '&quot;'.join(value.split('"'))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
123 s = '<input name="%s" value="%s" size="%s">'%(property, value, size)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
124 elif isinstance(propclass, hyperdb.Boolean):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
125 checked = value and "checked" or ""
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
126 s = '<input type="radio" name="%s" value="yes" %s>Yes'%(property, checked)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
127 if checked:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
128 checked = ""
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
129 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
130 checked = "checked"
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
131 s += '<input type="radio" name="%s" value="no" %s>No'%(property, checked)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
132 elif isinstance(propclass, hyperdb.Number):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
133 s = '<input name="%s" value="%s" size="%s">'%(property, value, size)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
134 elif isinstance(propclass, hyperdb.Password):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
135 s = '<input type="password" name="%s" size="%s">'%(property, size)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
136 elif isinstance(propclass, hyperdb.Link):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
137 linkcl = client.db.getclass(propclass.classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
138 if linkcl.getprops().has_key('order'):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
139 sort_on = 'order'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
140 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
141 sort_on = linkcl.labelprop()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
142 options = linkcl.filter(None, {}, [sort_on], [])
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
143 # TODO: make this a field display, not a menu one!
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
144 l = ['<select name="%s">'%property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
145 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
146 if value is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
147 s = 'selected '
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
148 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
149 s = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
150 l.append(_('<option %svalue="-1">- no selection -</option>')%s)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
151 for optionid in options:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
152 option = linkcl.get(optionid, k)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
153 s = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
154 if optionid == value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
155 s = 'selected '
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
156 if showid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
157 lab = '%s%s: %s'%(propclass.classname, optionid, option)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
158 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
159 lab = option
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
160 if size is not None and len(lab) > size:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
161 lab = lab[:size-3] + '...'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
162 lab = cgi.escape(lab)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
163 l.append('<option %svalue="%s">%s</option>'%(s, optionid, lab))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
164 l.append('</select>')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
165 s = '\n'.join(l)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
166 elif isinstance(propclass, hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
167 sortfunc = make_sort_function(client, filterspec, propclass.classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
168 linkcl = client.db.getclass(propclass.classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
169 if value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
170 value.sort(sortfunc)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
171 # map the id to the label property
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
172 if not showid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
173 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
174 value = [linkcl.get(v, k) for v in value]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
175 value = cgi.escape(','.join(value))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
176 s = '<input name="%s" size="%s" value="%s">'%(property, size, value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
177 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
178 s = _('Plain: bad propclass "%(propclass)s"')%locals()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
179 return s
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
180
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
181 def do_multiline(client, classname, cl, props, nodeid, filterspec, property, rows=5, cols=40):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
182 ''' display a string property in a multiline text edit field
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
183 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
184 if not nodeid and client.form is None and filterspec is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
185 return _('[Multiline: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
186
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
187 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
188
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
189 # make sure this is a link property
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
190 if not isinstance(propclass, hyperdb.String):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
191 return _('[Multiline: not a string]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
192
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
193 # get the value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
194 value = determine_value(cl, props, nodeid, filterspec, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
195 if value is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
196 value = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
197
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
198 # display
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
199 return '<textarea name="%s" rows="%s" cols="%s">%s</textarea>'%(
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
200 property, rows, cols, value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
201
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
202 def do_menu(client, classname, cl, props, nodeid, filterspec, property, size=None, height=None, showid=0,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
203 additional=[], **conditions):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
204 ''' For a Link/Multilink property, display a menu of the available
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
205 choices
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
206
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
207 If the additional properties are specified, they will be
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
208 included in the text of each option in (brackets, with, commas).
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
209 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
210 if not nodeid and client.form is None and filterspec is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
211 return _('[Field: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
212
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
213 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
214
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
215 # make sure this is a link property
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
216 if not (isinstance(propclass, hyperdb.Link) or
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
217 isinstance(propclass, hyperdb.Multilink)):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
218 return _('[Menu: not a link]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
219
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
220 # sort function
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
221 sortfunc = make_sort_function(client, filterspec, propclass.classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
222
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
223 # get the value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
224 value = determine_value(cl, props, nodeid, filterspec, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
225
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
226 # display
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
227 if isinstance(propclass, hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
228 linkcl = client.db.getclass(propclass.classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
229 if linkcl.getprops().has_key('order'):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
230 sort_on = 'order'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
231 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
232 sort_on = linkcl.labelprop()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
233 options = linkcl.filter(None, conditions, [sort_on], [])
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
234 height = height or min(len(options), 7)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
235 l = ['<select multiple name="%s" size="%s">'%(property, height)]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
236 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
237 for optionid in options:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
238 option = linkcl.get(optionid, k)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
239 s = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
240 if optionid in value or option in value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
241 s = 'selected '
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
242 if showid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
243 lab = '%s%s: %s'%(propclass.classname, optionid, option)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
244 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
245 lab = option
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
246 if size is not None and len(lab) > size:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
247 lab = lab[:size-3] + '...'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
248 if additional:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
249 m = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
250 for propname in additional:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
251 m.append(linkcl.get(optionid, propname))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
252 lab = lab + ' (%s)'%', '.join(m)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
253 lab = cgi.escape(lab)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
254 l.append('<option %svalue="%s">%s</option>'%(s, optionid,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
255 lab))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
256 l.append('</select>')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
257 return '\n'.join(l)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
258 if isinstance(propclass, hyperdb.Link):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
259 # force the value to be a single choice
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
260 if type(value) is types.ListType:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
261 value = value[0]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
262 linkcl = client.db.getclass(propclass.classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
263 l = ['<select name="%s">'%property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
264 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
265 s = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
266 if value is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
267 s = 'selected '
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
268 l.append(_('<option %svalue="-1">- no selection -</option>')%s)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
269 if linkcl.getprops().has_key('order'):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
270 sort_on = 'order'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
271 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
272 sort_on = linkcl.labelprop()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
273 options = linkcl.filter(None, conditions, [sort_on], [])
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
274 for optionid in options:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
275 option = linkcl.get(optionid, k)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
276 s = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
277 if value in [optionid, option]:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
278 s = 'selected '
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
279 if showid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
280 lab = '%s%s: %s'%(propclass.classname, optionid, option)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
281 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
282 lab = option
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
283 if size is not None and len(lab) > size:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
284 lab = lab[:size-3] + '...'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
285 if additional:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
286 m = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
287 for propname in additional:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
288 m.append(linkcl.get(optionid, propname))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
289 lab = lab + ' (%s)'%', '.join(map(str, m))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
290 lab = cgi.escape(lab)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
291 l.append('<option %svalue="%s">%s</option>'%(s, optionid, lab))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
292 l.append('</select>')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
293 return '\n'.join(l)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
294 return _('[Menu: not a link]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
295
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
296 #XXX deviates from spec
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
297 def do_link(client, classname, cl, props, nodeid, filterspec, property=None, is_download=0, showid=0):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
298 '''For a Link or Multilink property, display the names of the linked
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
299 nodes, hyperlinked to the item views on those nodes.
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
300 For other properties, link to this node with the property as the
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
301 text.
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
302
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
303 If is_download is true, append the property value to the generated
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
304 URL so that the link may be used as a download link and the
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
305 downloaded file name is correct.
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
306 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
307 if not nodeid and client.form is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
308 return _('[Link: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
309
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
310 # get the value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
311 value = determine_value(cl, props, nodeid, filterspec, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
312 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
313 if isinstance(propclass, hyperdb.Boolean):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
314 value = value and "Yes" or "No"
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
315 elif isinstance(propclass, hyperdb.Link):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
316 if value in ('', None, []):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
317 return _('[no %(propname)s]')%{'propname':property.capitalize()}
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
318 linkname = propclass.classname
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
319 linkcl = client.db.getclass(linkname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
320 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
321 linkvalue = cgi.escape(str(linkcl.get(value, k)))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
322 if showid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
323 label = value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
324 title = ' title="%s"'%linkvalue
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
325 # note ... this should be urllib.quote(linkcl.get(value, k))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
326 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
327 label = linkvalue
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
328 title = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
329 if is_download:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
330 return '<a href="%s%s/%s"%s>%s</a>'%(linkname, value,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
331 linkvalue, title, label)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
332 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
333 return '<a href="%s%s"%s>%s</a>'%(linkname, value, title, label)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
334 elif isinstance(propclass, hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
335 if value in ('', None, []):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
336 return _('[no %(propname)s]')%{'propname':property.capitalize()}
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
337 linkname = propclass.classname
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
338 linkcl = client.db.getclass(linkname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
339 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
340 l = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
341 for value in value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
342 linkvalue = cgi.escape(str(linkcl.get(value, k)))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
343 if showid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
344 label = value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
345 title = ' title="%s"'%linkvalue
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
346 # note ... this should be urllib.quote(linkcl.get(value, k))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
347 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
348 label = linkvalue
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
349 title = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
350 if is_download:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
351 l.append('<a href="%s%s/%s"%s>%s</a>'%(linkname, value,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
352 linkvalue, title, label))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
353 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
354 l.append('<a href="%s%s"%s>%s</a>'%(linkname, value,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
355 title, label))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
356 return ', '.join(l)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
357 if is_download:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
358 if value in ('', None, []):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
359 return _('[no %(propname)s]')%{'propname':property.capitalize()}
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
360 return '<a href="%s%s/%s">%s</a>'%(classname, nodeid,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
361 value, value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
362 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
363 if value in ('', None, []):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
364 value = _('[no %(propname)s]')%{'propname':property.capitalize()}
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
365 return '<a href="%s%s">%s</a>'%(classname, nodeid, value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
366
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
367 def do_count(client, classname, cl, props, nodeid, filterspec, property, **args):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
368 ''' for a Multilink property, display a count of the number of links in
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
369 the list
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
370 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
371 if not nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
372 return _('[Count: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
373
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
374 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
375 if not isinstance(propclass, hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
376 return _('[Count: not a Multilink]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
377
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
378 # figure the length then...
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
379 value = cl.get(nodeid, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
380 return str(len(value))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
381
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
382 # XXX pretty is definitely new ;)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
383 def do_reldate(client, classname, cl, props, nodeid, filterspec, property, pretty=0):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
384 ''' display a Date property in terms of an interval relative to the
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
385 current date (e.g. "+ 3w", "- 2d").
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
386
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
387 with the 'pretty' flag, make it pretty
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
388 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
389 if not nodeid and client.form is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
390 return _('[Reldate: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
391
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
392 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
393 if not isinstance(propclass, hyperdb.Date):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
394 return _('[Reldate: not a Date]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
395
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
396 if nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
397 value = cl.get(nodeid, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
398 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
399 return ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
400 if not value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
401 return ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
402
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
403 # figure the interval
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
404 interval = date.Date('.') - value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
405 if pretty:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
406 if not nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
407 return _('now')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
408 return interval.pretty()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
409 return str(interval)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
410
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
411 def do_download(client, classname, cl, props, nodeid, filterspec, property, **args):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
412 ''' show a Link("file") or Multilink("file") property using links that
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
413 allow you to download files
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
414 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
415 if not nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
416 return _('[Download: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
417 return do_link(client, classname, cl, props, nodeid, filterspec, property, is_download=1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
418
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
419
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
420 def do_checklist(client, classname, cl, props, nodeid, filterspec, property, sortby=None):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
421 ''' for a Link or Multilink property, display checkboxes for the
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
422 available choices to permit filtering
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
423
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
424 sort the checklist by the argument (+/- property name)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
425 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
426 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
427 if (not isinstance(propclass, hyperdb.Link) and not
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
428 isinstance(propclass, hyperdb.Multilink)):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
429 return _('[Checklist: not a link]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
430
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
431 # get our current checkbox state
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
432 if nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
433 # get the info from the node - make sure it's a list
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
434 if isinstance(propclass, hyperdb.Link):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
435 value = [cl.get(nodeid, property)]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
436 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
437 value = cl.get(nodeid, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
438 elif filterspec is not None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
439 # get the state from the filter specification (always a list)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
440 value = filterspec.get(property, [])
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
441 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
442 # it's a new node, so there's no state
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
443 value = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
444
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
445 # so we can map to the linked node's "lable" property
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
446 linkcl = client.db.getclass(propclass.classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
447 l = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
448 k = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
449
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
450 # build list of options and then sort it, either
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
451 # by id + label or <sortby>-value + label;
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
452 # a minus reverses the sort order, while + or no
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
453 # prefix sort in increasing order
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
454 reversed = 0
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
455 if sortby:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
456 if sortby[0] == '-':
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
457 reversed = 1
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
458 sortby = sortby[1:]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
459 elif sortby[0] == '+':
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
460 sortby = sortby[1:]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
461 options = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
462 for optionid in linkcl.list():
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
463 if sortby:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
464 sortval = linkcl.get(optionid, sortby)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
465 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
466 sortval = int(optionid)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
467 option = cgi.escape(str(linkcl.get(optionid, k)))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
468 options.append((sortval, option, optionid))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
469 options.sort()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
470 if reversed:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
471 options.reverse()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
472
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
473 # build checkboxes
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
474 for sortval, option, optionid in options:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
475 if optionid in value or option in value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
476 checked = 'checked'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
477 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
478 checked = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
479 l.append('%s:<input type="checkbox" %s name="%s" value="%s">'%(
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
480 option, checked, property, option))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
481
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
482 # for Links, allow the "unselected" option too
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
483 if isinstance(propclass, hyperdb.Link):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
484 if value is None or '-1' in value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
485 checked = 'checked'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
486 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
487 checked = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
488 l.append(_('[unselected]:<input type="checkbox" %s name="%s" '
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
489 'value="-1">')%(checked, property))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
490 return '\n'.join(l)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
491
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
492 def do_note(client, classname, cl, props, nodeid, filterspec, rows=5, cols=80):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
493 ''' display a "note" field, which is a text area for entering a note to
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
494 go along with a change.
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
495 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
496 # TODO: pull the value from the form
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
497 return '<textarea name="__note" wrap="hard" rows=%s cols=%s>'\
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
498 '</textarea>'%(rows, cols)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
499
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
500 # XXX new function
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
501 def do_list(client, classname, cl, props, nodeid, filterspec, property, reverse=0, xtracols=None):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
502 ''' list the items specified by property using the standard index for
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
503 the class
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
504 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
505 propcl = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
506 if not isinstance(propcl, hyperdb.Multilink):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
507 return _('[List: not a Multilink]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
508
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
509 value = determine_value(cl, props, nodeid, filterspec, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
510 if not value:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
511 return ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
512
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
513 # sort, possibly revers and then re-stringify
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
514 value = map(int, value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
515 value.sort()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
516 if reverse:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
517 value.reverse()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
518 value = map(str, value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
519
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
520 # render the sub-index into a string
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
521 fp = StringIO.StringIO()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
522 try:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
523 write_save = client.write
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
524 client.write = fp.write
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
525 client.listcontext = ('%s%s' % (classname, nodeid), property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
526 index = htmltemplate.IndexTemplate(client, client.instance.TEMPLATES, propcl.classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
527 index.render(nodeids=value, show_display_form=0, xtracols=xtracols)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
528 finally:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
529 client.listcontext = None
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
530 client.write = write_save
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
531
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
532 return fp.getvalue()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
533
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
534 # XXX new function
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
535 def do_history(client, classname, cl, props, nodeid, filterspec, direction='descending'):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
536 ''' list the history of the item
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
537
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
538 If "direction" is 'descending' then the most recent event will
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
539 be displayed first. If it is 'ascending' then the oldest event
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
540 will be displayed first.
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
541 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
542 if nodeid is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
543 return _("[History: node doesn't exist]")
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
544
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
545 l = ['<table width=100% border=0 cellspacing=0 cellpadding=2>',
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
546 '<tr class="list-header">',
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
547 _('<th align=left><span class="list-item">Date</span></th>'),
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
548 _('<th align=left><span class="list-item">User</span></th>'),
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
549 _('<th align=left><span class="list-item">Action</span></th>'),
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
550 _('<th align=left><span class="list-item">Args</span></th>'),
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
551 '</tr>']
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
552 comments = {}
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
553 history = cl.history(nodeid)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
554 history.sort()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
555 if direction == 'descending':
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
556 history.reverse()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
557 for id, evt_date, user, action, args in history:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
558 date_s = str(evt_date).replace("."," ")
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
559 arg_s = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
560 if action == 'link' and type(args) == type(()):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
561 if len(args) == 3:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
562 linkcl, linkid, key = args
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
563 arg_s += '<a href="%s%s">%s%s %s</a>'%(linkcl, linkid,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
564 linkcl, linkid, key)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
565 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
566 arg_s = str(args)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
567
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
568 elif action == 'unlink' and type(args) == type(()):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
569 if len(args) == 3:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
570 linkcl, linkid, key = args
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
571 arg_s += '<a href="%s%s">%s%s %s</a>'%(linkcl, linkid,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
572 linkcl, linkid, key)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
573 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
574 arg_s = str(args)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
575
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
576 elif type(args) == type({}):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
577 cell = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
578 for k in args.keys():
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
579 # try to get the relevant property and treat it
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
580 # specially
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
581 try:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
582 prop = props[k]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
583 except:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
584 prop = None
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
585 if prop is not None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
586 if args[k] and (isinstance(prop, hyperdb.Multilink) or
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
587 isinstance(prop, hyperdb.Link)):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
588 # figure what the link class is
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
589 classname = prop.classname
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
590 try:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
591 linkcl = client.db.getclass(classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
592 except KeyError:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
593 labelprop = None
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
594 comments[classname] = _('''The linked class
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
595 %(classname)s no longer exists''')%locals()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
596 labelprop = linkcl.labelprop(1)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
597 hrefable = os.path.exists(
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
598 os.path.join(client.instance.TEMPLATES, classname+'.item'))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
599
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
600 if isinstance(prop, hyperdb.Multilink) and \
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
601 len(args[k]) > 0:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
602 ml = []
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
603 for linkid in args[k]:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
604 label = classname + linkid
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
605 # if we have a label property, try to use it
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
606 # TODO: test for node existence even when
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
607 # there's no labelprop!
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
608 try:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
609 if labelprop is not None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
610 label = linkcl.get(linkid, labelprop)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
611 except IndexError:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
612 comments['no_link'] = _('''<strike>The
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
613 linked node no longer
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
614 exists</strike>''')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
615 ml.append('<strike>%s</strike>'%label)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
616 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
617 if hrefable:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
618 ml.append('<a href="%s%s">%s</a>'%(
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
619 classname, linkid, label))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
620 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
621 ml.append(label)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
622 cell.append('%s:\n %s'%(k, ',\n '.join(ml)))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
623 elif isinstance(prop, hyperdb.Link) and args[k]:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
624 label = classname + args[k]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
625 # if we have a label property, try to use it
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
626 # TODO: test for node existence even when
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
627 # there's no labelprop!
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
628 if labelprop is not None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
629 try:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
630 label = linkcl.get(args[k], labelprop)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
631 except IndexError:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
632 comments['no_link'] = _('''<strike>The
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
633 linked node no longer
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
634 exists</strike>''')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
635 cell.append(' <strike>%s</strike>,\n'%label)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
636 # "flag" this is done .... euwww
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
637 label = None
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
638 if label is not None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
639 if hrefable:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
640 cell.append('%s: <a href="%s%s">%s</a>\n'%(k,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
641 classname, args[k], label))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
642 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
643 cell.append('%s: %s' % (k,label))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
644
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
645 elif isinstance(prop, hyperdb.Date) and args[k]:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
646 d = date.Date(args[k])
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
647 cell.append('%s: %s'%(k, str(d)))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
648
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
649 elif isinstance(prop, hyperdb.Interval) and args[k]:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
650 d = date.Interval(args[k])
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
651 cell.append('%s: %s'%(k, str(d)))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
652
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
653 elif isinstance(prop, hyperdb.String) and args[k]:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
654 cell.append('%s: %s'%(k, cgi.escape(args[k])))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
655
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
656 elif not args[k]:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
657 cell.append('%s: (no value)\n'%k)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
658
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
659 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
660 cell.append('%s: %s\n'%(k, str(args[k])))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
661 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
662 # property no longer exists
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
663 comments['no_exist'] = _('''<em>The indicated property
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
664 no longer exists</em>''')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
665 cell.append('<em>%s: %s</em>\n'%(k, str(args[k])))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
666 arg_s = '<br />'.join(cell)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
667 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
668 # unkown event!!
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
669 comments['unknown'] = _('''<strong><em>This event is not
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
670 handled by the history display!</em></strong>''')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
671 arg_s = '<strong><em>' + str(args) + '</em></strong>'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
672 date_s = date_s.replace(' ', '&nbsp;')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
673 l.append('<tr><td nowrap valign=top>%s</td><td valign=top>%s</td>'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
674 '<td valign=top>%s</td><td valign=top>%s</td></tr>'%(date_s,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
675 user, action, arg_s))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
676 if comments:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
677 l.append(_('<tr><td colspan=4><strong>Note:</strong></td></tr>'))
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
678 for entry in comments.values():
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
679 l.append('<tr><td colspan=4>%s</td></tr>'%entry)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
680 l.append('</table>')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
681 return '\n'.join(l)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
682
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
683 # XXX new function
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
684 def do_submit(client, classname, cl, props, nodeid, filterspec, value=None):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
685 ''' add a submit button for the item
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
686 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
687 if value is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
688 if nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
689 value = "Submit Changes"
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
690 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
691 value = "Submit New Entry"
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
692 if nodeid or client.form is not None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
693 return _('<input type="submit" name="submit" value="%s">' % value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
694 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
695 return _('[Submit: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
696
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
697 def do_classhelp(client, classname, cl, props, nodeid, filterspec, clname, properties, label='?', width='400',
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
698 height='400'):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
699 '''pop up a javascript window with class help
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
700
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
701 This generates a link to a popup window which displays the
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
702 properties indicated by "properties" of the class named by
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
703 "classname". The "properties" should be a comma-separated list
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
704 (eg. 'id,name,description').
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
705
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
706 You may optionally override the label displayed, the width and
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
707 height. The popup window will be resizable and scrollable.
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
708 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
709 return '<a href="javascript:help_window(\'classhelp?classname=%s&' \
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
710 'properties=%s\', \'%s\', \'%s\')"><b>(%s)</b></a>'%(clname,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
711 properties, width, height, label)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
712
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
713 def do_email(client, classname, cl, props, nodeid, filterspec, property, escape=0):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
714 '''display the property as one or more "fudged" email addrs
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
715 '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
716
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
717 if not nodeid and client.form is None:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
718 return _('[Email: not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
719 propclass = props[property]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
720 if nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
721 # get the value for this property
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
722 try:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
723 value = cl.get(nodeid, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
724 except KeyError:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
725 # a KeyError here means that the node doesn't have a value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
726 # for the specified property
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
727 value = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
728 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
729 value = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
730 if isinstance(propclass, hyperdb.String):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
731 if value is None: value = ''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
732 else: value = str(value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
733 value = value.replace('@', ' at ')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
734 value = value.replace('.', ' ')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
735 else:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
736 value = _('[Email: not a string]')%locals()
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
737 if escape:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
738 value = cgi.escape(value)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
739 return value
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
740
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
741 def do_filterspec(client, classname, cl, props, nodeid, filterspec, classprop, urlprop):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
742 qs = cl.get(nodeid, urlprop)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
743 classname = cl.get(nodeid, classprop)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
744 filterspec = {}
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
745 query = cgi.parse_qs(qs)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
746 for k,v in query.items():
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
747 query[k] = v[0].split(',')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
748 pagesize = query.get(':pagesize',['25'])[0]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
749 search_text = query.get('search_text', [''])[0]
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
750 search_text = urllib.unquote(search_text)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
751 for k,v in query.items():
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
752 if k[0] != ':':
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
753 filterspec[k] = v
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
754 ixtmplt = htmltemplate.IndexTemplate(client, client.instance.TEMPLATES, classname)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
755 qform = '<form onSubmit="return submit_once()" action="%s%s">\n'%(
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
756 classname,nodeid)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
757 qform += ixtmplt.filter_form(search_text,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
758 query.get(':filter', []),
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
759 query.get(':columns', []),
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
760 query.get(':group', []),
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
761 [],
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
762 query.get(':sort',[]),
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
763 filterspec,
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
764 pagesize)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
765 return qform + '</table>\n'
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
766
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
767 def do_href(client, classname, cl, props, nodeid, filterspec, property, prefix='', suffix='', label=''):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
768 value = determine_value(cl, props, nodeid, filterspec, property)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
769 return '<a href="%s%s%s">%s</a>' % (prefix, value, suffix, label)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
770
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
771 def do_remove(client, classname, cl, props, nodeid, filterspec):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
772 ''' put a remove href for an item in a list '''
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
773 if not nodeid:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
774 return _('[Remove not called from item]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
775 try:
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
776 parentdesignator, mlprop = client.listcontext
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
777 except (AttributeError, TypeError):
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
778 return _('[Remove not called form listing of multilink]')
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
779 return '<a href="remove?:target=%s%s&:multilink=%s:%s">[Remove]</a>' % (classname, nodeid, parentdesignator, mlprop)
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
780
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
781
fdcf16b444a9 Use a real parser for templates.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents:
diff changeset
782

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