web/form.py
branchtls-sprint
changeset 887 51e371245bc5
parent 874 90d98d80af82
child 888 603327e9aef4
equal deleted inserted replaced
886:0b417be91dca 887:51e371245bc5
   377     needs_multipart = False
   377     needs_multipart = False
   378     creation_rank = 0
   378     creation_rank = 0
   379     
   379     
   380     def __init__(self, name=None, id=None, label=None,
   380     def __init__(self, name=None, id=None, label=None,
   381                  widget=None, required=False, initial=None, help=None,
   381                  widget=None, required=False, initial=None, help=None,
   382                  eidparam=True):
   382                  eidparam=False):
   383         self.required = required
   383         self.required = required
   384         if widget is not None:
   384         if widget is not None:
   385             self.widget = widget
   385             self.widget = widget
   386         if isinstance(self.widget, type):
   386         if isinstance(self.widget, type):
   387             self.widget = self.widget()
   387             self.widget = self.widget()
   474             allfields.append(field)
   474             allfields.append(field)
   475         classdict['_fields_'] = allfields
   475         classdict['_fields_'] = allfields
   476         return super(metafieldsform, mcs).__new__(mcs, name, bases, classdict)
   476         return super(metafieldsform, mcs).__new__(mcs, name, bases, classdict)
   477     
   477     
   478 
   478 
   479 class FieldsForm(object):
   479 class FieldsForm(FormMixIn):
   480     __metaclass__ = metafieldsform
   480     __metaclass__ = metafieldsform
   481     
   481     
   482     def __init__(self, req, id=None, title=None, action='edit',
   482     def __init__(self, req, domid=None, title=None, action='edit',
   483                  onsubmit="return freezeFormButtons('%s');",
   483                  onsubmit="return freezeFormButtons('%s');",
   484                  cssclass=None, cssstyle=None, cwtarget=None, buttons=None,
   484                  cssclass=None, cssstyle=None, cwtarget=None, buttons=None,
   485                  redirect_path=None, set_error_url=True, copy_nav_params=False):
   485                  redirect_path=None, set_error_url=True, copy_nav_params=False):
   486         self.req = req
   486         self.req = req
   487         self.id = id or 'form'
   487         self.domid = domid or 'form'
   488         self.title = title
   488         self.title = title
   489         self.action = action
   489         self.action = action
   490         self.onsubmit = onsubmit
   490         self.onsubmit = onsubmit
   491         self.cssclass = cssclass
   491         self.cssclass = cssclass
   492         self.cssstyle = cssstyle
   492         self.cssstyle = cssstyle
   493         self.cwtarget = cwtarget
   493         self.cwtarget = cwtarget
   494         self.redirect_path = None
   494         self.redirect_path = redirect_path
   495         self.fields = list(self.__class__._fields_)
   495         self.fields = list(self.__class__._fields_)
   496         if set_error_url:
   496         if set_error_url:
   497             self.form_add_hidden('__errorurl', req.url())
   497             self.form_add_hidden('__errorurl', req.url())
   498         if copy_nav_params:
   498         if copy_nav_params:
   499             for param in NAV_FORM_PARAMETERS:
   499             for param in NAV_FORM_PARAMETERS:
   550     def form_field_id(self, field):
   550     def form_field_id(self, field):
   551         return field.id
   551         return field.id
   552    
   552    
   553     def form_field_vocabulary(self, field):
   553     def form_field_vocabulary(self, field):
   554         raise NotImplementedError
   554         raise NotImplementedError
   555     
       
   556     BUTTON_STR = u'<input class="validateButton" type="submit" name="%s" value="%s" tabindex="%s"/>'
       
   557     ACTION_SUBMIT_STR = u'<input class="validateButton" type="button" onclick="postForm(\'%s\', \'%s\', \'%s\')" value="%s" tabindex="%s"/>'
       
   558 
       
   559     def button_ok(self, label=None, tabindex=None):
       
   560         label = self.req._(label or stdmsgs.BUTTON_OK).capitalize()
       
   561         return self.BUTTON_STR % ('defaultsubmit', label, tabindex or 2)
       
   562     
       
   563     def button_apply(self, label=None, tabindex=None):
       
   564         label = self.req._(label or stdmsgs.BUTTON_APPLY).capitalize()
       
   565         return self.ACTION_SUBMIT_STR % ('__action_apply', label, self.id, label, tabindex or 3)
       
   566 
       
   567     def button_delete(self, label=None, tabindex=None):
       
   568         label = self.req._(label or stdmsgs.BUTTON_DELETE).capitalize()
       
   569         return self.ACTION_SUBMIT_STR % ('__action_delete', label, self.id, label, tabindex or 3)
       
   570     
       
   571     def button_cancel(self, label=None, tabindex=None):
       
   572         label = self.req._(label or stdmsgs.BUTTON_CANCEL).capitalize()
       
   573         return self.ACTION_SUBMIT_STR % ('__action_cancel', label, self.id, label, tabindex or 4)
       
   574     
       
   575     def button_reset(self, label=None, tabindex=None):
       
   576         label = self.req._(label or stdmsgs.BUTTON_CANCEL).capitalize()
       
   577         return u'<input class="validateButton" type="reset" value="%s" tabindex="%s"/>' % (
       
   578             label, tabindex or 4)
       
   579 
   555 
   580     def form_buttons(self):
   556     def form_buttons(self):
   581         return self.buttons
   557         return self.buttons
   582 
   558 
   583    
   559    
   584 class EntityFieldsForm(FieldsForm):
   560 class EntityFieldsForm(FieldsForm):
   585     def __init__(self, *args, **kwargs):
   561     def __init__(self, *args, **kwargs):
   586         kwargs.setdefault('id', 'entityForm')
   562         kwargs.setdefault('domid', 'entityForm')
   587         self.entity = kwargs.pop('entity', None)
   563         self.entity = kwargs.pop('entity', None)
   588         super(EntityFieldsForm, self).__init__(*args, **kwargs)
   564         super(EntityFieldsForm, self).__init__(*args, **kwargs)
   589         self.form_add_hidden('__type')
   565         self.form_add_hidden('__type', eidparam=True)
   590         self.form_add_hidden('eid', eidparam=False)
   566         self.form_add_hidden('eid')
   591         
   567         
   592     def form_render(self, **values):
   568     def form_render(self, **values):
   593         self.form_add_entity_hiddens(self.entity.e_schema)
   569         self.form_add_entity_hiddens(self.entity.e_schema)
   594         return super(EntityFieldsForm, self).form_render(**values)
   570         return super(EntityFieldsForm, self).form_render(**values)
   595 
   571 
   597         for field in self.fields[:]:
   573         for field in self.fields[:]:
   598             fieldname = field.name
   574             fieldname = field.name
   599             if fieldname != 'eid' and (
   575             if fieldname != 'eid' and (
   600                 (eschema.has_subject_relation(fieldname) or
   576                 (eschema.has_subject_relation(fieldname) or
   601                  eschema.has_object_relation(fieldname))):
   577                  eschema.has_object_relation(fieldname))):
       
   578                 field.eidparam = True
   602                 self.fields.append(self.form_entity_hidden_field(field))
   579                 self.fields.append(self.form_entity_hidden_field(field))
   603 
   580 
   604     def form_entity_hidden_field(self, field):
   581     def form_entity_hidden_field(self, field):
   605         """returns the hidden field which will indicate the value
   582         """returns the hidden field which will indicate the value
   606         before the modification
   583         before the modification
   609         # to describe attribute fields => role is 'subject'
   586         # to describe attribute fields => role is 'subject'
   610         if getattr(field, 'role', 'subject') == 'subject':
   587         if getattr(field, 'role', 'subject') == 'subject':
   611             name = 'edits-%s' % field.name
   588             name = 'edits-%s' % field.name
   612         else:
   589         else:
   613             name = 'edito-%s' % field.name
   590             name = 'edito-%s' % field.name
   614         return HiddenInitialValueField(field, name=name)
   591         return HiddenInitialValueField(field, name=name, eidparam=True)
   615         
   592         
   616     def form_field_value(self, field, values):
   593     def form_field_value(self, field, values):
   617         """look for field's value with the following rules:
   594         """look for field's value with the following rules:
   618         1. handle special __type and eid fields
   595         1. handle special __type and eid fields
   619         2. looks in kw args given to render_form (including previously submitted
   596         2. looks in kw args given to render_form (including previously submitted
   697     
   674     
   698     def render(self, form, values):
   675     def render(self, form, values):
   699         data = []
   676         data = []
   700         w = data.append
   677         w = data.append
   701         # XXX form_needs_multipart
   678         # XXX form_needs_multipart
   702         print 'render', form
       
   703         w(self.open_form(form))
   679         w(self.open_form(form))
   704         w(u'<div id="progress">%s</div>' % _('validating...'))
   680         w(u'<div id="progress">%s</div>' % _('validating...'))
   705         w(u'<fieldset>')
   681         w(u'<fieldset>')
   706         w(tags.input(type='hidden', name='__form_id', value=form.id))
   682         w(tags.input(type='hidden', name='__form_id', value=form.domid))
   707         if form.redirect_path:
   683         if form.redirect_path:
   708             w(tags.input(type='hidden', name='__redirect_path', value=form.redirect_path))
   684             w(tags.input(type='hidden', name='__redirectpath', value=form.redirect_path))
   709         self.render_fields(w, form, values)
   685         self.render_fields(w, form, values)
   710         self.render_buttons(w, form)
   686         self.render_buttons(w, form)
   711         w(u'</fieldset>')
   687         w(u'</fieldset>')
   712         w(u'</form>')
   688         w(u'</form>')
   713         return '\n'.join(data)
   689         return '\n'.join(data)
   715     def open_form(self, form):
   691     def open_form(self, form):
   716         if form.form_needs_multipart:
   692         if form.form_needs_multipart:
   717             enctype = 'multipart/form-data'
   693             enctype = 'multipart/form-data'
   718         else:
   694         else:
   719             enctype = 'application/x-www-form-urlencoded'
   695             enctype = 'application/x-www-form-urlencoded'
   720         tag = ('<form action="%s" method="post" id="%s" enctype="%s"' % (
   696         tag = ('<form action="%s" methody="post" id="%s" enctype="%s"' % (
   721             html_escape(form.req.build_url(form.action)), form.id, enctype))
   697             html_escape(form.action or '#'), form.domid, enctype))
   722         if form.onsubmit:
   698         if form.onsubmit:
   723             tag += ' onsubmit="%s"' % html_escape(form.onsubmit)
   699             tag += ' onsubmit="%s"' % html_escape(form.onsubmit)
   724         if form.cssstyle:
   700         if form.cssstyle:
   725             tag += ' style="%s"' % html_escape(form.cssstyle)
   701             tag += ' style="%s"' % html_escape(form.cssstyle)
   726         if form.cssclass:
   702         if form.cssclass: