################################################## # SPYCE - Python-based HTML Scripting # Copyright (c) 2002 Rimon Barr. # # Refer to spyce.py ################################################## __doc__ = '''Spyce tags for create data-populated forms.''' from spyceTag import spyceTagLibrary, spyceTagPlus, spyceTagSyntaxException from _formhelper import * import spyceUtil, spyceConfig import string, urllib, re class form_form(spyceTagPlus): name = 'form' mustend = 1 def syntax(self): self.syntaxPairOnly() def begin(self, method='POST', action=None, **kwargs): if self.getParent('form'): raise 'Nested form tags are not allowed' id = self._context['_current_form_id'] err = self._context.get('_validation_error', None) if err and id in err: invokeSingleton(self._api, spyceConfig.validation_render, err=err[id]) method = string.upper(method) if method not in ['GET', 'POST']: raise 'invalid method attribute value: '+method if action is None: action = self.getModule('request').uri_path() self.getOut().write('
') class form_submit(spyceTagPlus): name = 'submit' handlers = {} # non-None so spyceCompile will handle handler attr def syntax(self): self.syntaxSingleOnly() def begin(self, with='button', **kwargs): self.parentRequired('form') if 'name' in kwargs: raise "invalid submit tag attribute 'name' (use handlers to set different actions for different submit buttons)" id = '_submit' + self.getFullId() if with == 'button': html = '' % (id, id, formatArgs(kwargs),) else: # *** confirm needs work js = kwargs['onclick'] js += '' # *** create hidden element w/ submit ID if 'value' in kwargs: v = kwargs['value'] else: v = 'Submit' html = '%s' % (id, js, v) self.getOut().write(html) class form_hidden(spyceTagPlus): name = 'hidden' def syntax(self): self.syntaxSingleOnly() def begin(self, name, value=None, default=None, _input=None, **kwargs): if not _input: _input = self.name if value is None: value = self.getModule('request').getpost1(name, default) or '' self.getOut().write('' % ( _input, name, name, escape_dq(value), formatArgs(kwargs)) ) class form_text(form_hidden): name = 'text' def begin(self, name, value=None, default=None, label=None, **kwargs): maybe_emit_label(self, name, label) form_hidden.begin(self, name, value, default, **kwargs) class form_password(form_text): name = 'password' date_img = 0 class form_date(form_text): name='date' def begin(self, name, value=None, default=None, size=0, format='MM/dd/yyyy', label=None, **kwargs): maybe_emit_label(self, name, label) if not hasattr(self.getModule('request'), '_calendarjs'): self.getOut().write(''' ''') self.getModule('request')._calendarjs = True # textbox, leveraging form_hidden if not size: size = len(format) kwargs['maxlength'] = len(format) kwargs['size'] = size form_hidden.begin(self, name, value, default, 'text', **kwargs) # thread safety isn't a concern here, this is only used clientside global date_img i = date_img date_img += 1 # calendar icon self.getOut().write('''
''' % locals())
class form_textarea(spyceTagPlus):
name = 'textarea'
buffer = 1
def syntax(self):
# TODO fix this
self.syntaxPairOnly()
def begin(self, name, default=None, value=None, rows=None, cols=None, label=None, **kwargs):
maybe_emit_label(self, name, label)
self._name = name
if value is None:
if default is not None:
value = default
else:
value = self.getModule('request').getpost1(self._name)
self._value = value or ''
if rows!=None:
kwargs['rows'] = rows
if cols!=None:
kwargs['cols'] = cols
self._args = kwargs
def body(self, _contents):
self.getOut().write('' % (
self._name, self._name, formatArgs(self._args), self._value, _contents))
class form_radio(spyceTagPlus):
name = 'radio'
def syntax(self):
self.syntaxSingleOnly()
def begin(self, name, value, checked=0, default=0, label=None, **kwargs):
if checked is None: checked=1
if default is None: default=1
if not checked:
checkedValues = self.getModule('request').getpost(name)
if checkedValues is not None:
checked = value in checkedValues
else:
checked = default
tag_id = 'id' in kwargs and kwargs['id'] or name
self.getOut().write(render_radio(self.name, name, label, value, checked, tag_id, kwargs=kwargs))
class form_checkbox(form_radio):
name = 'checkbox'
class form_radiolist(spyceTagPlus):
name = 'radiolist'
def syntax(self):
self.syntaxSingleOnly()
def begin(self, name, data, selected=None, default=None, **kwargs):
radiotype = self.name[:-4] # strip off "list"
selected = find_selected(self, name, selected, default)
self.getOut().write('%s
' % render_radio(radiotype, name, option_text, option_value, sel, name + str(i))) self.getOut().write('