# HG changeset patch # User sylvain.thenault@logilab.fr # Date 1239280292 -7200 # Node ID 50e1a778c5ee7fe3f58bdf0e879eeea44255eca5 # Parent 12dc957a5b55631d874b1fab6877b59b5e804e77 new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore) diff -r 12dc957a5b55 -r 50e1a778c5ee web/form.py --- a/web/form.py Thu Apr 09 13:59:44 2009 +0200 +++ b/web/form.py Thu Apr 09 14:31:32 2009 +0200 @@ -23,25 +23,15 @@ from cubicweb.web.formrenderers import FormRenderer from cubicweb.web import formwidgets as fwdgs - - -# XXX should disappear -class FormMixIn(object): - """abstract form mix-in - XXX: you should inherit from this FIRST (obscure pb with super call)""" +class FormViewMixIn(object): + """abstract form view mix-in""" category = 'form' controller = 'edit' - domid = 'entityForm' - http_cache_manager = NoHTTPCacheManager add_to_breadcrumbs = False - skip_relations = set() def __init__(self, req, rset, **kwargs): - super(FormMixIn, self).__init__(req, rset, **kwargs) - self.maxrelitems = self.req.property_value('navigation.related-limit') - self.maxcomboitems = self.req.property_value('navigation.combobox-limit') - self.force_display = not not req.form.get('__force_display') + super(FormViewMixIn, self).__init__(req, rset, **kwargs) # get validation session data which may have been previously set. # deleting validation errors here breaks form reloading (errors are # no more available), they have to be deleted by application's publish @@ -76,12 +66,13 @@ """ return False - @property - def limit(self): - if self.force_display: - return None - return self.maxrelitems + 1 - + +# XXX should disappear +class FormMixIn(object): + """abstract form mix-in + XXX: you should inherit from this FIRST (obscure pb with super call) + """ + def initialize_varmaker(self): varmaker = self.req.get_page_data('rql_varmaker') if varmaker is None: @@ -89,6 +80,51 @@ self.req.set_page_data('rql_varmaker', varmaker) self.varmaker = varmaker + # XXX deprecated with new form system. Should disappear + + domid = 'entityForm' + category = 'form' + controller = 'edit' + http_cache_manager = NoHTTPCacheManager + add_to_breadcrumbs = False + + def __init__(self, req, rset, **kwargs): + super(FormMixIn, self).__init__(req, rset, **kwargs) + # get validation session data which may have been previously set. + # deleting validation errors here breaks form reloading (errors are + # no more available), they have to be deleted by application's publish + # method on successful commit + formurl = req.url() + forminfo = req.get_session_data(formurl) + if forminfo: + req.data['formvalues'] = forminfo['values'] + req.data['formerrors'] = errex = forminfo['errors'] + req.data['displayederrors'] = set() + # if some validation error occured on entity creation, we have to + # get the original variable name from its attributed eid + foreid = errex.entity + for var, eid in forminfo['eidmap'].items(): + if foreid == eid: + errex.eid = var + break + else: + errex.eid = foreid + + 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.req.next_tabindex() @@ -122,8 +158,6 @@ label = self.req._(label or stdmsgs.BUTTON_CANCEL).capitalize() return self.button(label, type=type, **kwargs) - # XXX deprecated with new form system - def need_multipart(self, entity, categories=('primary', 'secondary')): """return a boolean indicating if form's enctype should be multipart """ diff -r 12dc957a5b55 -r 50e1a778c5ee web/views/baseforms.py --- a/web/views/baseforms.py Thu Apr 09 13:59:44 2009 +0200 +++ b/web/views/baseforms.py Thu Apr 09 14:31:32 2009 +0200 @@ -40,7 +40,7 @@ title = _('edition') controller = 'edit' - skip_relations = FormMixIn.skip_relations.copy() + skip_relations = set() EDITION_BODY = u'''\ %(errormsg)s diff -r 12dc957a5b55 -r 50e1a778c5ee web/views/editforms.py --- a/web/views/editforms.py Thu Apr 09 13:59:44 2009 +0200 +++ b/web/views/editforms.py Thu Apr 09 14:31:32 2009 +0200 @@ -22,7 +22,7 @@ from cubicweb.common import tags from cubicweb.web import INTERNAL_FIELD_VALUE, stdmsgs, uicfg from cubicweb.web.form import (FieldNotFound, CompositeForm, EntityFieldsForm, - FormMixIn) + FormViewMixIn) from cubicweb.web.formfields import guess_field from cubicweb.web.formwidgets import Button, SubmitButton, ResetButton from cubicweb.web.formrenderers import (FormRenderer, EntityFormRenderer, @@ -44,7 +44,7 @@ return u'[%s]' % (js, nodeid, label) -class DeleteConfForm(EntityView): +class DeleteConfForm(FormViewMixIn, EntityView): """form used to confirm deletion of some entities""" id = 'deleteconf' title = _('delete') @@ -79,7 +79,7 @@ w(form.form_render()) -class ClickAndEditForm(FormMixIn, EntityView): +class ClickAndEditFormView(FormViewMixIn, EntityView): """form used to permit ajax edition of an attribute of an entity in a view (double-click on the field to see an appropriate edition widget) @@ -297,6 +297,14 @@ eidparam=True) if field is not None: self.fields.append(field) + self.maxrelitems = self.req.property_value('navigation.related-limit') + self.force_display = not not req.form.get('__force_display') + + @property + def related_limit(self): + if self.force_display: + return None + return self.maxrelitems + 1 def relations_by_category(self, categories=None, permission=None): """return a list of (relation schema, target schemas, role) matching @@ -353,7 +361,7 @@ entity = self.edited_entity pending_deletes = self.req.get_pending_deletes(entity.eid) for label, rschema, role in self.srelations_by_category('generic', 'add'): - relatedrset = entity.related(rschema, role, limit=self.limit) + relatedrset = entity.related(rschema, role, limit=self.related_limit) if rschema.has_perm(self.req, 'delete'): toggable_rel_link_func = toggable_relation_link else: @@ -422,7 +430,7 @@ return not existant or card in '+*' -class EditionFormView(EntityView): +class EditionFormView(FormViewMixIn, EntityView): """display primary entity edition form""" id = 'edition' # add yes() so it takes precedence over deprecated views in baseforms, @@ -430,7 +438,6 @@ __select__ = one_line_rset() & non_final_entity() & yes() title = _('edition') - controller = 'edit' def cell_call(self, row, col, **kwargs): entity = self.complete_entity(row, col) @@ -555,7 +562,7 @@ self.form_add_subform(form) -class TableEditFormView(EntityView): +class TableEditFormView(FormViewMixIn, EntityView): id = 'muledit' __select__ = EntityView.__select__ & yes() title = _('multiple edit') @@ -569,7 +576,7 @@ self.w(form.form_render(renderer=EntityCompositeFormRenderer())) -class InlineEntityEditionFormView(EntityView): +class InlineEntityEditionFormView(FormViewMixIn, EntityView): id = 'inline-edition' __select__ = non_final_entity() & match_kwargs('peid', 'rtype') removejs = "removeInlinedEntity('%s', '%s', '%s')" diff -r 12dc957a5b55 -r 50e1a778c5ee web/views/editviews.py --- a/web/views/editviews.py Thu Apr 09 13:59:44 2009 +0200 +++ b/web/views/editviews.py Thu Apr 09 14:31:32 2009 +0200 @@ -76,12 +76,6 @@ id = 'unrelateddivs' __select__ = match_form_params('relation') - @property - def limit(self): - if self.req.form.get('__force_display'): - return None - return self.req.property_value('navigation.related-limit') + 1 - def cell_call(self, row, col): entity = self.entity(row, col) relname, target = self.req.form.get('relation').rsplit('_', 1) @@ -128,7 +122,8 @@ form = self.vreg.select_object('forms', 'edition', self.req, entity=entity) field = form.field_by_name(rschema, target, entity.__class__) - for eview, reid in form.form_field_vocabulary(field, self.limit): + limit = self.req.property_value('navigation.combobox-limit') + for eview, reid in form.form_field_vocabulary(field, limit): if reid is None: options.append('' % html_escape(eview)) diff -r 12dc957a5b55 -r 50e1a778c5ee web/views/eproperties.py --- a/web/views/eproperties.py Thu Apr 09 13:59:44 2009 +0200 +++ b/web/views/eproperties.py Thu Apr 09 14:31:32 2009 +0200 @@ -15,10 +15,10 @@ match_user_groups, entity_implements) from cubicweb.utils import UStringIO from cubicweb.view import StartupView -from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param +from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param, uicfg from cubicweb.web.views import baseviews from cubicweb.web import stdmsgs -from cubicweb.web.form import FormMixIn, CompositeForm, EntityFieldsForm +from cubicweb.web.form import CompositeForm, EntityFieldsForm, FormViewMixIn from cubicweb.web.formfields import FIELDS, StringField from cubicweb.web.formwidgets import Select, Button, SubmitButton from cubicweb.web.views.editforms import AutomaticEntityForm @@ -50,12 +50,11 @@ skip_none = False -class SystemEPropertiesForm(FormMixIn, StartupView): +class SystemEPropertiesForm(FormViewMixIn, StartupView): id = 'systemepropertiesform' __select__ = none_rset() & match_user_groups('managers') title = _('site configuration') - controller = 'edit' category = 'startupview' def linkable(self): @@ -83,7 +82,7 @@ def call(self, **kwargs): """The default view representing the application's index""" - self.req.add_js(('cubicweb.edition.js', 'cubicweb.preferences.js')) + self.req.add_js('cubicweb.preferences.js') self.req.add_css('cubicweb.preferences.css') vreg = self.vreg values = self.defined_keys @@ -325,7 +324,6 @@ wdg.attrs.setdefault('size', 3) self.widget = wdg -from cubicweb.web import uicfg uicfg.rfields.set_rtag(PropertyKeyField, 'pkey', 'subject', 'EProperty') uicfg.rfields.set_rtag(PropertyValueField, 'value', 'subject', 'EProperty') diff -r 12dc957a5b55 -r 50e1a778c5ee web/views/massmailing.py --- a/web/views/massmailing.py Thu Apr 09 13:59:44 2009 +0200 +++ b/web/views/massmailing.py Thu Apr 09 14:31:32 2009 +0200 @@ -13,7 +13,7 @@ from cubicweb.view import EntityView from cubicweb.web import stdmsgs from cubicweb.web.action import Action -from cubicweb.web.form import FieldsForm, FormRenderer +from cubicweb.web.form import FieldsForm, FormRenderer, FormViewMixIn from cubicweb.web.formfields import StringField from cubicweb.web.formwidgets import CheckBox, TextInput, AjaxWidget, ImgButton @@ -100,7 +100,7 @@ w(u'') -class MassMailingFormView(EntityView): +class MassMailingFormView(FormViewMixIn, EntityView): id = 'massmailing' __select__ = implements(IEmailable) & match_user_groups('managers', 'users') diff -r 12dc957a5b55 -r 50e1a778c5ee web/views/workflow.py --- a/web/views/workflow.py Thu Apr 09 13:59:44 2009 +0200 +++ b/web/views/workflow.py Thu Apr 09 14:31:32 2009 +0200 @@ -17,6 +17,7 @@ relation_possible, match_form_params) from cubicweb.interfaces import IWorkflowable from cubicweb.web import stdmsgs, action, component, form +from cubicweb.web.form import FormViewMixIn from cubicweb.web.formfields import StringField, RichTextField from cubicweb.web.formwidgets import HiddenInput, SubmitButton, Button from cubicweb.web.views import TmpFileViewMixin @@ -42,7 +43,7 @@ Button(stdmsgs.NO, cwaction='cancel')] -class ChangeStateFormView(view.EntityView): +class ChangeStateFormView(FormViewMixIn, view.EntityView): id = 'statuschange' title = _('status change') __select__ = implements(IWorkflowable) & match_form_params('treid')