################################################## # 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('
' % ( method, action, formatArgs(kwargs)) ) def end(self): 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('
' % (name, formatArgs(kwargs))) for i, (option_text, option_value) in enumerate(self.eval(data)): sel = option_value in selected self.getOut().write('

%s

' % render_radio(radiotype, name, option_text, option_value, sel, name + str(i))) self.getOut().write('
') class form_checkboxlist(form_radiolist): name = 'checkboxlist' class form_select(spyceTagPlus): name = 'select' def begin(self, name, multiple=0, data=None, selected=None, default=None, label=None, **kwargs): maybe_emit_label(self, name, label) self.varname = name selected = find_selected(self, name, selected, default) if multiple is None: multiple = 1 multiplestr = multiple and ' MULTIPLE' or '' self.getOut().write('') class form_option(spyceTagPlus): name = 'option' def begin(self, text=None, value=None, selected=None, default=None, **kwargs): self.text = text if value is None: valuestr = '' else: valuestr = ' value="%s"' % escape_dq(value) selectTag = self.parentRequired('select') if value and not selected: selectedValues = self.getModule('request').getpost(selectTag.varname) if selectedValues is not None: selected = value in selectedValues else: selected = default selectedstr = selected and ' SELECTED' or '' self.getOut().write('') class form(spyceTagLibrary): tags = [ form_form, form_submit, form_hidden, form_text, form_password, form_textarea, form_radio, form_checkbox, form_select, form_option, form_date, form_checkboxlist, form_radiolist ]