# HG changeset patch # User Sylvain Thénault # Date 1253871059 -7200 # Node ID 9c07e6c48e35517cb79ebfb529ef248542ad0475 # Parent 020fc867f7b27dfdcde1edcf247bb2ee4c789a3c [forms] drop FormMixIn deprecated in 3.2 diff -r 020fc867f7b2 -r 9c07e6c48e35 web/form.py --- a/web/form.py Fri Sep 25 11:27:26 2009 +0200 +++ b/web/form.py Fri Sep 25 11:30:59 2009 +0200 @@ -34,11 +34,37 @@ return False -# XXX should disappear -class FormMixIn(object): - """abstract form mix-in - XXX: you should inherit from this FIRST (obscure pb with super call) +class metafieldsform(type): + """metaclass for FieldsForm to retrieve fields defined as class attributes + and put them into a single ordered list: '_fields_'. """ + def __new__(mcs, name, bases, classdict): + allfields = [] + for base in bases: + if hasattr(base, '_fields_'): + allfields += base._fields_ + clsfields = (item for item in classdict.items() + if isinstance(item[1], formfields.Field)) + for fieldname, field in sorted(clsfields, key=lambda x: x[1].creation_rank): + if not field.name: + field.set_name(fieldname) + allfields.append(field) + classdict['_fields_'] = allfields + return super(metafieldsform, mcs).__new__(mcs, name, bases, classdict) + + +class FieldNotFound(Exception): + """raised by field_by_name when a field with the given name has not been + found + """ + +class Form(AppObject): + __metaclass__ = metafieldsform + __registry__ = 'forms' + + def __init__(self, req, rset, **kwargs): + super(Form, self).__init__(req, rset=rset, **kwargs) + self.restore_previous_post(self.session_key()) def session_key(self): """return the key that may be used to store / retreive data about a @@ -46,10 +72,6 @@ """ return '%s#%s' % (self._cw.url(), self.domid) - def __init__(self, req, rset, **kwargs): - super(FormMixIn, self).__init__(req, rset=rset, **kwargs) - self.restore_previous_post(self.session_key()) - def restore_previous_post(self, sessionkey): # get validation session data which may have been previously set. # deleting validation errors here breaks form reloading (errors are @@ -73,133 +95,3 @@ else: self.form_previous_values = {} self.form_valerror = None - - # XXX deprecated with new form system. Should disappear - - domid = 'entityForm' - category = 'form' - http_cache_manager = httpcache.NoHTTPCacheManager - add_to_breadcrumbs = False - - def html_headers(self): - """return a list of html headers (eg something to be inserted between - and of the returned page - - by default forms are neither indexed nor followed - """ - return [NOINDEX, NOFOLLOW] - - def linkable(self): - """override since forms are usually linked by an action, - so we don't want them to be listed by appli.possible_views - """ - return False - - - def button(self, label, klass='validateButton', tabindex=None, **kwargs): - if tabindex is None: - tabindex = self._cw.next_tabindex() - return tags.input(value=label, klass=klass, **kwargs) - - def action_button(self, label, onclick=None, __action=None, **kwargs): - if onclick is None: - onclick = "postForm('__action_%s', \'%s\', \'%s\')" % ( - __action, label, self.domid) - return self.button(label, onclick=onclick, **kwargs) - - def button_ok(self, label=None, type='submit', name='defaultsubmit', - **kwargs): - label = self._cw._(label or stdmsgs.BUTTON_OK).capitalize() - return self.button(label, name=name, type=type, **kwargs) - - def button_apply(self, label=None, type='button', **kwargs): - label = self._cw._(label or stdmsgs.BUTTON_APPLY).capitalize() - return self.action_button(label, __action='apply', type=type, **kwargs) - - def button_delete(self, label=None, type='button', **kwargs): - label = self._cw._(label or stdmsgs.BUTTON_DELETE).capitalize() - return self.action_button(label, __action='delete', type=type, **kwargs) - - def button_cancel(self, label=None, type='button', **kwargs): - label = self._cw._(label or stdmsgs.BUTTON_CANCEL).capitalize() - return self.action_button(label, __action='cancel', type=type, **kwargs) - - def button_reset(self, label=None, type='reset', name='__action_cancel', - **kwargs): - label = self._cw._(label or stdmsgs.BUTTON_CANCEL).capitalize() - return self.button(label, type=type, **kwargs) - - def need_multipart(self, entity, categories=('primary', 'secondary')): - """return a boolean indicating if form's enctype should be multipart - """ - for rschema, _, x in entity.relations_by_category(categories): - if entity.get_widget(rschema, x).need_multipart: - return True - # let's find if any of our inlined entities needs multipart - for rschema, targettypes, x in entity.relations_by_category('inlineview'): - assert len(targettypes) == 1, \ - "I'm not able to deal with several targets and inlineview" - ttype = targettypes[0] - inlined_entity = self.vreg.etype_class(ttype)(self._cw, None, None) - for irschema, _, x in inlined_entity.relations_by_category(categories): - if inlined_entity.get_widget(irschema, x).need_multipart: - return True - return False - - def error_message(self): - """return formatted error message - - This method should be called once inlined field errors has been consumed - """ - errex = self._cw.data.get('formerrors') or self.form_valerror - # get extra errors - if errex is not None: - errormsg = self._cw._('please correct the following errors:') - displayed = self._cw.data.get('displayederrors') or self.form_displayed_errors - errors = sorted((field, err) for field, err in errex.errors.items() - if not field in displayed) - if errors: - if len(errors) > 1: - templstr = '
  • %s
  • \n' - else: - templstr = ' %s\n' - for field, err in errors: - if field is None: - errormsg += templstr % err - else: - errormsg += templstr % '%s: %s' % (self._cw._(field), err) - if len(errors) > 1: - errormsg = '' % errormsg - return u'
    %s
    ' % errormsg - return u'' - - -############################################################################### - -class metafieldsform(type): - """metaclass for FieldsForm to retrieve fields defined as class attributes - and put them into a single ordered list: '_fields_'. - """ - def __new__(mcs, name, bases, classdict): - allfields = [] - for base in bases: - if hasattr(base, '_fields_'): - allfields += base._fields_ - clsfields = (item for item in classdict.items() - if isinstance(item[1], formfields.Field)) - for fieldname, field in sorted(clsfields, key=lambda x: x[1].creation_rank): - if not field.name: - field.set_name(fieldname) - allfields.append(field) - classdict['_fields_'] = allfields - return super(metafieldsform, mcs).__new__(mcs, name, bases, classdict) - - -class FieldNotFound(Exception): - """raised by field_by_name when a field with the given name has not been - found - """ - -class Form(FormMixIn, AppObject): - __metaclass__ = metafieldsform - __registry__ = 'forms'