--- a/web/views/editforms.py Fri Jul 02 14:47:44 2010 +0200
+++ b/web/views/editforms.py Fri Jul 02 15:26:59 2010 +0200
@@ -26,6 +26,7 @@
from logilab.mtconverter import xml_escape
from logilab.common.decorators import cached
+from logilab.common.deprecation import class_moved
from cubicweb import tags
from cubicweb.selectors import (match_kwargs, one_line_rset, non_final_entity,
@@ -35,7 +36,7 @@
from cubicweb.web import uicfg, stdmsgs, eid_param, dumps, \
formfields as ff, formwidgets as fw
from cubicweb.web.form import FormViewMixIn, FieldNotFound
-from cubicweb.web.views import forms
+from cubicweb.web.views import forms, reledit
_pvdc = uicfg.primaryview_display_ctrl
@@ -260,215 +261,5 @@
# click and edit handling ('reledit') ##########################################
-class DummyForm(object):
- __slots__ = ('event_args',)
- def form_render(self, **_args):
- return u''
- def render(self, **_args):
- return u''
- def append_field(self, *args):
- pass
- def field_by_name(self, rtype, role, eschema=None):
- return None
-
-
-class ClickAndEditFormView(FormViewMixIn, EntityView):
- """form used to permit ajax edition of a relation or attribute of an entity
- in a view, if logged user have the permission to edit it.
-
- (double-click on the field to see an appropriate edition widget).
- """
- __regid__ = 'doreledit'
- __select__ = non_final_entity() & match_kwargs('rtype')
- # FIXME editableField class could be toggleable from userprefs
-
- _onclick = u"showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')"
- _onsubmit = ("return inlineValidateRelationFormOptions('%(rtype)s', '%(eid)s', "
- "'%(divid)s', %(options)s);")
- _cancelclick = "hideInlineEdit(%s,\'%s\',\'%s\')"
- _defaultlandingzone = (u'<img title="%(msg)s" src="data/pen_icon.png" '
- 'alt="%(msg)s"/>')
- _landingzonemsg = _('click to edit this field')
- # default relation vids according to cardinality
- _one_rvid = 'incontext'
- _many_rvid = 'csv'
-
-
- def cell_call(self, row, col, rtype=None, role='subject',
- reload=False, # controls reloading the whole page after change
- rvid=None, # vid to be applied to other side of rtype (non final relations only)
- default=None, # default value
- landing_zone=None # prepend value with a separate html element to click onto
- # (esp. needed when values are links)
- ):
- """display field to edit entity's `rtype` relation on click"""
- assert rtype
- assert role in ('subject', 'object'), '%s is not an acceptable role value' % role
- self._cw.add_js('cubicweb.edition.js')
- self._cw.add_css('cubicweb.form.css')
- if default is None:
- default = xml_escape(self._cw._('<%s not specified>')
- % display_name(self._cw, rtype, role))
- schema = self._cw.vreg.schema
- entity = self.cw_rset.get_entity(row, col)
- rschema = schema.rschema(rtype)
- lzone = self._build_landing_zone(landing_zone)
- # compute value, checking perms, build form
- if rschema.final:
- form = self._build_form(entity, rtype, role, 'base', default, reload, lzone)
- if not self.should_edit_attribute(entity, rschema, form):
- self.w(entity.printable_value(rtype))
- return
- value = entity.printable_value(rtype) or default
- else:
- rvid = self._compute_best_vid(entity.e_schema, rschema, role)
- rset = entity.related(rtype, role)
- if rset:
- value = self._cw.view(rvid, rset)
- else:
- value = default
- if not self.should_edit_relation(entity, rschema, role, rvid):
- if rset:
- self.w(value)
- return
- # XXX do we really have to give lzone twice?
- form = self._build_form(entity, rtype, role, 'base', default, reload, lzone,
- dict(vid=rvid, lzone=lzone))
- field = form.field_by_name(rtype, role, entity.e_schema)
- form.append_field(field)
- self.relation_form(lzone, value, form,
- self._build_renderer(entity, rtype, role))
-
- def should_edit_attribute(self, entity, rschema, form):
- if not entity.cw_has_perm('update'):
- return False
- rdef = entity.e_schema.rdef(rschema)
- if not rdef.has_perm(self._cw, 'update', eid=entity.eid):
- return False
- try:
- form.field_by_name(str(rschema), 'subject', entity.e_schema)
- except FieldNotFound:
- return False
- return True
-
- def should_edit_relation(self, entity, rschema, role, rvid):
- if ((role == 'subject' and not rschema.has_perm(self._cw, 'add',
- fromeid=entity.eid))
- or
- (role == 'object' and not rschema.has_perm(self._cw, 'add',
- toeid=entity.eid))):
- return False
- return True
-
- def relation_form(self, lzone, value, form, renderer):
- """xxx-reledit div (class=field)
- +-xxx div (class="editableField")
- | +-landing zone
- +-xxx-value div
- +-xxx-form div
- """
- w = self.w
- divid = form.event_args['divid']
- w(u'<div id="%s-reledit" class="field" '
- u'onmouseout="jQuery(\'#%s\').addClass(\'hidden\')" '
- u'onmouseover="jQuery(\'#%s\').removeClass(\'hidden\')">'
- % (divid, divid, divid))
- w(u'<div id="%s-value" class="editableFieldValue">%s</div>' % (divid, value))
- w(form.render(renderer=renderer))
- w(u'<div id="%s" class="editableField hidden" onclick="%s" title="%s">' % (
- divid, xml_escape(self._onclick % form.event_args),
- self._cw._(self._landingzonemsg)))
- w(lzone)
- w(u'</div>')
- w(u'</div>')
-
- def _compute_best_vid(self, eschema, rschema, role):
- dispctrl = _pvdc.etype_get(eschema, rschema, role)
- if dispctrl.get('rvid'):
- return dispctrl['rvid']
- if eschema.rdef(rschema, role).role_cardinality(role) in '+*':
- return self._many_rvid
- return self._one_rvid
-
- def _build_landing_zone(self, lzone):
- return lzone or self._defaultlandingzone % {
- 'msg': xml_escape(self._cw._(self._landingzonemsg))}
-
- def _build_renderer(self, entity, rtype, role):
- return self._cw.vreg['formrenderers'].select(
- 'base', self._cw, entity=entity, display_label=False,
- display_help=False, table_class='',
- button_bar_class='buttonbar', display_progress_div=False)
-
- def _build_args(self, entity, rtype, role, formid, default, reload, lzone,
- extradata=None):
- divid = '%s-%s-%s' % (rtype, role, entity.eid)
- options = {'reload' : reload, 'default_value' : default,
- 'role' : role, 'vid' : '',
- 'lzone' : lzone}
- event_args = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype,
- 'options' : dumps(options)}
- if extradata:
- event_args.update(extradata)
- return divid, event_args
-
- def _build_form(self, entity, rtype, role, formid, default, reload, lzone,
- extradata=None, **formargs):
- divid, event_args = self._build_args(entity, rtype, role, formid, default,
- reload, lzone, extradata)
- onsubmit = self._onsubmit % event_args
- cancelclick = self._cancelclick % (entity.eid, rtype, divid)
- form = self._cw.vreg['forms'].select(
- formid, self._cw, entity=entity, domid='%s-form' % divid,
- cssstyle='display: none', onsubmit=onsubmit, action='#',
- form_buttons=[fw.SubmitButton(),
- fw.Button(stdmsgs.BUTTON_CANCEL, onclick=cancelclick)],
- **formargs)
- form.event_args = event_args
- return form
-
-
-class AutoClickAndEditFormView(ClickAndEditFormView):
- """same as ClickAndEditFormView but checking if the view *should* be applied
- by checking uicfg configuration and composite relation property.
- """
- __regid__ = 'reledit'
- _onclick = (u"loadInlineEditionFormOptions(%(eid)s, '%(rtype)s', "
- "'%(divid)s', %(options)s);")
-
- def should_edit_attribute(self, entity, rschema, form):
- rdef = entity.e_schema.rdef(rschema)
- afs = uicfg.autoform_section.etype_get(
- entity.__regid__, rschema, 'subject', rdef.object)
- if 'main_hidden' in afs:
- return False
- return super(AutoClickAndEditFormView, self).should_edit_attribute(
- entity, rschema, form)
-
- def should_edit_relation(self, entity, rschema, role, rvid):
- eschema = entity.e_schema
- dispctrl = _pvdc.etype_get(eschema, rschema, role)
- vid = dispctrl.get('vid', 'reledit')
- if vid != 'reledit': # reledit explicitly disabled
- return False
- rdef = eschema.rdef(rschema, role)
- if rdef.composite == role:
- return False
- afs = uicfg.autoform_section.etype_get(
- entity.__regid__, rschema, role, rdef.object)
- if 'main_hidden' in afs:
- return False
- return super(AutoClickAndEditFormView, self).should_edit_relation(
- entity, rschema, role, rvid)
-
- def _build_form(self, entity, rtype, role, formid, default, reload, lzone,
- extradata=None, **formargs):
- _divid, event_args = self._build_args(entity, rtype, role, formid, default,
- reload, lzone, extradata)
- form = DummyForm()
- form.event_args = event_args
- return form
-
- def _build_renderer(self, entity, rtype, role):
- pass
-
+ClickAndEditFormView = class_moved(reledit.ClickAndEditFormView)
+AutoClickAndEditFormView = class_moved(reledit.AutoClickAndEditFormView)