web/views/editforms.py
branchstable
changeset 2332 b04d80f19075
parent 2331 4c02a761d879
child 2333 1de22d3e985b
equal deleted inserted replaced
2331:4c02a761d879 2332:b04d80f19075
    15 
    15 
    16 from logilab.mtconverter import xml_escape
    16 from logilab.mtconverter import xml_escape
    17 
    17 
    18 from cubicweb.selectors import (match_kwargs, one_line_rset, non_final_entity,
    18 from cubicweb.selectors import (match_kwargs, one_line_rset, non_final_entity,
    19                                 specified_etype_implements, yes)
    19                                 specified_etype_implements, yes)
    20 from cubicweb.utils import make_uid
    20 from cubicweb.utils import make_uid, compute_cardinality
    21 from cubicweb.view import EntityView
    21 from cubicweb.view import EntityView
    22 from cubicweb.common import tags
    22 from cubicweb.common import tags
    23 from cubicweb.web import INTERNAL_FIELD_VALUE, stdmsgs, eid_param
    23 from cubicweb.web import INTERNAL_FIELD_VALUE, stdmsgs, eid_param
    24 from cubicweb.web.form import FormViewMixIn
    24 from cubicweb.web.form import FormViewMixIn
    25 from cubicweb.web.formfields import guess_field
    25 from cubicweb.web.formfields import guess_field
    91     # FIXME editableField class could be toggleable from userprefs
    91     # FIXME editableField class could be toggleable from userprefs
    92 
    92 
    93     _ondblclick = "showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')"
    93     _ondblclick = "showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')"
    94     _defaultlandingzone = u'<img title="%s" class="needsvalidation" src="data/file.gif"/>'
    94     _defaultlandingzone = u'<img title="%s" class="needsvalidation" src="data/file.gif"/>'
    95     _landingzonemsg = _('double click to edit this field')
    95     _landingzonemsg = _('double click to edit this field')
       
    96     # default relation vids according to cardinality
       
    97     _one_rvid = 'incontext'
       
    98     _many_rvid = 'csv'
       
    99 
       
   100     def _compute_best_vid(self, entity, rtype, role):
       
   101         if compute_cardinality(entity.e_schema,
       
   102                                entity.schema.rschema(rtype),
       
   103                                role) in '+*':
       
   104             return self._many_rvid
       
   105         return self._one_rvid
    96 
   106 
    97     def cell_call(self, row, col, rtype=None, role='subject',
   107     def cell_call(self, row, col, rtype=None, role='subject',
    98                   reload=False,             # controls reloading the whole page after change
   108                   reload=False,      # controls reloading the whole page after change
    99                   rvid='textoutofcontext',  # vid to be applied to other side of rtype
   109                   rvid=None,         # vid to be applied to other side of rtype
   100                   escape=True,              # depending on the vid, will xml_escape or not
   110                   escape=True,       # depending on the vid, will xml_escape or not
   101                   default=None,             # default value
   111                   default=None,      # default value
   102                   landing_zone=None         # prepend value with a separate html element to click onto
   112                   landing_zone=None  # prepend value with a separate html element to click onto
   103                                             # (esp. needed when values are links)
   113                                      # (esp. needed when values are links)
   104                   ):
   114                   ):
   105         """display field to edit entity's `rtype` relation on double-click"""
   115         """display field to edit entity's `rtype` relation on double-click"""
   106         assert rtype
   116         assert rtype
   107         rschema = self.schema.rschema(rtype)
       
   108         entity = self.entity(row, col)
   117         entity = self.entity(row, col)
       
   118         rschema = entity.schema.rschema(rtype)
   109         if not default:
   119         if not default:
   110             default = xml_escape(self.req._('<no value>'))
   120             default = xml_escape(self.req._('<no value>'))
   111         if rschema.is_final():
   121         if rschema.is_final():
   112             value = entity.printable_value(rtype) or default
   122             value = entity.printable_value(rtype) or default
   113             if not entity.has_perm('update'):
   123             if not entity.has_perm('update'):
   114                 self.w(value)
   124                 self.w(value)
   115                 return
   125                 return
   116         else:
   126         else:
       
   127             if rvid is None:
       
   128                 rvid = self._compute_best_vid(entity, rtype, role)
   117             rset = entity.related(rtype, role)
   129             rset = entity.related(rtype, role)
   118             candidate = self.view(rvid, rset, 'null')
   130             candidate = self.view(rvid, rset, 'null')
   119             if candidate and escape:
   131             if candidate and escape:
   120                 value = xml_escape(candidate)
   132                 value = xml_escape(candidate)
   121             value = candidate or default
   133             value = candidate or default
   144                                       table_class='', button_bar_class='buttonbar',
   156                                       table_class='', button_bar_class='buttonbar',
   145                                       display_progress_div=False)
   157                                       display_progress_div=False)
   146         self.w(form.form_render(renderer=renderer))
   158         self.w(form.form_render(renderer=renderer))
   147 
   159 
   148     def _build_relation_form(self, entity, value, rtype, role, row, col, rvid, default, escape, lzone):
   160     def _build_relation_form(self, entity, value, rtype, role, row, col, rvid, default, escape, lzone):
       
   161         print 'relation', rvid
   149         divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid))
   162         divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid))
   150         event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid,
   163         event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid,
   151                       'default' : default, 'role' : role, 'escape' : escape, 'lzone' : lzone}
   164                       'default' : default, 'role' : role, 'escape' : escape, 'lzone' : lzone}
   152         onsubmit = ("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', "
   165         onsubmit = ("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', "
   153                     "'%(role)s', '%(eid)s', '%(divid)s', '%(vid)s', '%(default)s', '%(escape)s', '%(lzone)s');"
   166                     "'%(role)s', '%(eid)s', '%(divid)s', '%(vid)s', '%(default)s', '%(escape)s', '%(lzone)s');"