Package easyform
[hide private]
[frames] | no frames]

Source Code for Package easyform

  1  #coding: utf8; 
  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   
15 -def _attributes(attrs):
16 return " ".join([ '%s="%s"'%(name,value) for name,value in attrs.items()])
17 18 srenoalpha = re.compile(r"[\W_]+") 19
20 -def title(name):
21 return srenoalpha.sub(" ",name.title())
22
23 -class Entity:
24 EDITSUBMIT = """<tr><td>%(markup)s</td></tr>""" 25 VIEWSUBMIT = """<tr><td>&nbsp;</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&ntilde;o[4]-mes[2]-d&iacute;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
81 - def _createoptions(self, options):
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
93 - def _markup(self):
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
159 - def __str__(self):
160 self._markup() 161 return self.template%self.__dict__
162
163 - def getdictentry(self):
164 return """'%s' : %s"""%(self.name, repr(self.value))
165
166 -class EntityString:
167 - def __init__(self, string, name):
168 self.string = string 169 self.name = name 170 self.group = None 171 self.language = None
172
173 - def __str__(self):
174 return string
175
176 - def getdictentry(self):
177 return None
178
179 -class Group:
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
198 - def __delitem__(self, name):
199 del self.entitiesdict[name] 200 self.entities.remove(name) # It is efficient when group has few entities
201
202 - def __getitem__(self, name):
203 return self.entitiesdict[name]
204
205 - def __iter__(self):
206 return iter([ self.entitiesdict[name] for name in self.entities ])
207
208 - def keys(self):
209 return self.entities
210
211 - def values(self):
212 return self.entitiesdict.values()
213
214 - def items(self):
215 return self.entitiesdict.items()
216
217 - def append(self, entity):
218 self.entitiesdict[entity.name] = entity 219 self.entities.append(entity.name) 220 entity.group = self.name 221 entity.language = self.language
222
223 - def settemplate(self, template):
224 self._template = template
225
226 - def gettemplate(self):
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
244 - def __str__(self):
245 # print self.gettemplate() 246 return self.gettemplate()%self.entitiesdict
247
248 -class PythonContainer:
249 - def __init__(self):
250 self.forms = []
251
252 - def begin(self):
253 pass
254
255 - def append(self,name,group):
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