1
2
3 __doc__ = """ The easyform creator """
4
5 import mx
6 import mx.DateTime
7 from mx.DateTime import Parser as dateparser
8 import re
9 import os, sys
10 import warn
11 import md5
12 import random
13 import template3k
14
16 return " ".join([ '%s="%s"'%(name,value) for name,value in attrs.items()])
17
18 srenoalpha = re.compile(r"[\W_]+")
19
22
24 EDITSUBMIT = """<tr><td>%(markup)s</td></tr>"""
25 VIEWSUBMIT = """<tr><td> </td></tr>"""
26
27 EDIT = """<tr><td>%(display)s: </td><td>%(markup)s</td></tr>"""
28 VIEW = """<tr><td>%(display)s: </td><td>%(value)s</td></tr>"""
29 Locale = {
30 'es' : {
31 'list_month': ( 'Enero','Febrero','Marzo','Abril',
32 'Mayo','Junio','Julio','Agosto','Septiembre'
33 'Octubre','Noviembre','Diciembre'),
34 'name_time' : '(hora:min:seg)',
35 'name_date' : '(año[4]-mes[2]-día[2])',
36 'name_submit' : 'Enviar',
37 'true' : 'Verdadero',
38 'false' : 'Falso',
39 'edit' : 'Editar',
40 },
41 'en' : {
42 'list_month': ( 'January', 'February','March', 'April', 'May','June','July','August',
43 'September', 'October', 'November', 'December'),
44 'name_time' : '(hour:min:second)',
45 'name_date' : '(year[4]-mon[2]-day[2])',
46 'name_submit' : 'Send',
47 'true' : 'True',
48 'false' : 'False',
49 'edit' : 'Edit',
50 }
51 }
52
53 - def locale(self, name, lang=None):
54 if lang is None: lang = self.language
55 return self.Locale[lang][name]
56
57 - def __init__(self, name, display=None, type='string', value='', constraints=(), hidden=False,
58 attributes=None, template=None, markuptemplate=None, getoptions=None, group=None,
59 language='en'):
60 self.name = name
61 if display is None:
62 display = title(name)
63 self.display = display
64 self.type = type
65 self.value = value
66 self.hidden = hidden
67 if attributes is None: attributes = {}
68 self.attributes = attributes
69 self.getoptions = getoptions
70 self.constraints = constraints
71 if template is None:
72 if type == 'submit':
73 template = Entity.EDITSUBMIT
74 else:
75 template = Entity.EDIT
76 self.template = template
77 self.markuptemplate = markuptemplate
78 self.group = group
79 self.language = language
80
82 ops = []
83 default = str(self.value)
84 for value,display in options:
85 value = str(value)
86 if default == value:
87 selected = 'selected="selected"'
88 else:
89 selected = ''
90 ops.append('<option value="%s" %s>%s</option>'%(value, selected, display))
91 return "\n".join(ops)
92
94 type = t = self.type
95 if t in ('string','int','float'):
96 try:
97 self.attributes['size']
98 except KeyError:
99 self.attributes['size'] = '40'
100
101 attrs = _attributes(self.attributes)
102 self.attrs = attrs
103 name = self.name
104 value = '%%(%s)s'%self.name
105 group = self.group
106 constraints = ":".join(self.constraints)
107
108 if self.markuptemplate:
109 self.markup = self.markuptemplate%locals()
110 elif t == 'hidden':
111 self.markup = '<input name="%s:hidden:%s" type="hidden" value="%s" />'%(name, constraints, value)
112 elif t == 'text':
113 self.markup = '<textarea cols="40" rows="12" name="%s:text:%s" %s>%s</textarea>'%(name, constraints, attrs, value)
114 elif t in ('string','int','float'):
115 self.markup = '<input name="%s:%s:%s" type="text" value="%s" %s />'%(name, t, constraints, value, attrs)
116 elif t == 'date':
117 name_date = self.locale('name_date')
118 self.markup = """
119 %(name_date)s
120 <input type="text" name="%(name)s:date:%(constraints)s" value="%(value)s" onclick="Easyform_frameReadDate(DOM3K_readInput(this), DOM3K_updateInput, this, event.clientY, event.clientX)" %(attrs)s />
121 """%locals()
122 elif t == 'time':
123 name_time = self.locale('name_time')
124 self.markup = """
125 %(name_time)s
126 <input type="text" name="%(name)s:time:%(constraints)s" value="%(value)s" onclick="Easyform_frameReadTime(DOM3K_readInput(this), DOM3K_updateInput, this, event.clientY, event.clientX)" %(attrs)s />
127 """%locals()
128 elif t == 'datetime':
129 name_time = self.locale('name_time')
130 name_date = self.locale('name_date')
131 self.markup = """
132 %(name_date)s
133 <input type="text" name="%(name)s:datetime:%(constraints)s" value="%(value)s" onclick="Easyform_frameReadDatetime(DOM3K_readInput(this), DOM3K_updateInput, this, event.clientY, event.clientX)" %(attrs)s />
134 """%locals()
135 elif t == 'boolean':
136 if value == 't':
137 tval = 'selected="true"'
138 fval = ''
139 else:
140 tval = ''
141 fval = 'selected="true"'
142 self.markup = """
143 <select name="%s:boolean:%s">
144 <option value="t" %s>%s</option>
145 <option value="f" %s>%s</option>
146 </select>
147 """%(name, constraints, tval, self.locale('true'), fval, self.locale('false'))
148 elif t == 'list':
149 if self.getoptions:
150 options = self._createoptions(self.getoptions(name))
151 else:
152 options = ""
153 self.markup = '<select name="%s:list:%s">\n%s\n</select>'%(name,constraints,options)
154 elif t == 'submit':
155 self.markup = '<input type="submit" name="%s:submit" value="%s" />'%(name,value)
156 else:
157 raise "Unsupported Entity type"
158
160 self._markup()
161 return self.template%self.__dict__
162
163 - def getdictentry(self):
164 return """'%s' : %s"""%(self.name, repr(self.value))
165
168 self.string = string
169 self.name = name
170 self.group = None
171 self.language = None
172
175
176 - def getdictentry(self):
178
180 - def __init__(self, name, action = None, display = None, attributes = None, language = 'en', onsubmit=None, internal_fields = None):
181 self.name = name
182 if action is None:
183 action = 'javascript: void(0);'
184 self.action = action
185 if display is None: display = "<strong>" + title(name) + "</strong>"
186 self.display = display
187 if attributes is None: attributes = {}
188 self.attributes = attributes
189 self.entities = []
190 self.entitiesdict = {}
191 self._template = None
192 self.language = language
193 if onsubmit is None: onsubmit = ''
194 self.onsubmit = onsubmit
195 if internal_fields is None: internal_fields = []
196 self.internal_fields = internal_fields
197
199 del self.entitiesdict[name]
200 self.entities.remove(name)
201
203 return self.entitiesdict[name]
204
206 return iter([ self.entitiesdict[name] for name in self.entities ])
207
210
212 return self.entitiesdict.values()
213
215 return self.entitiesdict.items()
216
218 self.entitiesdict[entity.name] = entity
219 self.entities.append(entity.name)
220 entity.group = self.name
221 entity.language = self.language
222
224 self._template = template
225
227 if self._template is None:
228 ents = []
229 for name in self.entities:
230 if name in self.internal_fields: continue
231 ents.append( "%%(%s)s"%name )
232 ents = "\n".join(ents)
233 attrs = _attributes(self.attributes)
234 self._template = """
235 %s
236 <form method="POST" enctype="multipart/form-data" id="%s" action="%s" onsubmit="%s" name="%s" %s>
237 <table><tbody>
238 """%(self.display, self.name, self.action, self.onsubmit, self.name, attrs) + ents + """
239 </tbody></table>
240 </form>
241 """
242 return self._template
243
247
251
254
256 self.forms.append((name,group))
257
258 - def end(self,config):
259 D = {}
260 schema = config['dbschema']
261 D['QuotedDbname'] = repr(config['dbname'])
262 D['QuotedDbuser'] = repr(config['dbuser'])
263 D['QuotedDbpass'] = repr(config['dbpass'])
264 D['QuotedDbhost'] = repr(config['dbhost'])
265 D['Objname'] = config['fullobjname']
266 D['QuotedObjname'] = repr(config['fullobjname'])
267 D['Title'] = repr(config['fullobjname'].title())
268 res = []
269 res.append("\n")
270 res.append(" res = []\n")
271 for x,group in self.forms:
272 res.append(""" res.append(('%s',list_%s(),'%s'))\n"""%(title(x),x,x))
273 res.append(""" return res\n""")
274 D['ListFormsShowPage'] = "".join(res)
275 output = file(config['fullobjpath'] + ".py","w")
276 output.write(template3k.get_template("templates/newobject.py").merge(D))
277 for x,group in self.forms:
278 try:
279 D['Display'] = repr(group.entities[1])
280 if D['Display'] == '': raise IndexError,"Fake"
281 except IndexError:
282 D['Display'] = repr(group.entities[0])
283 if schema is None or schema == 'public':
284 tabname = x
285 else:
286 tabname = "%s.%s"%(schema,x)
287 D['Tabname'] = tabname
288 D['QuotedTabname'] = repr(tabname)
289 D['InternalFields'] = repr(group.internal_fields)
290 D['DictDefault'] = ",".join(filter(None,map(Entity.getdictentry, group.values())))
291 D['FormElement'] = str(group).replace('"""',"'''")
292 D['ListFields'] = repr(filter(lambda x:'' != x,group.keys()))
293 output.write(template3k.get_template("templates/newtable.py").merge(D))
294 output.close()
295