web/views/editforms.py
branchstable
changeset 2371 76bf522c27be
parent 2365 9f5e911eab07
child 2372 cca71dcbeb70
equal deleted inserted replaced
2369:5a2b8ed266ca 2371:76bf522c27be
   102                                entity.schema.rschema(rtype),
   102                                entity.schema.rschema(rtype),
   103                                role) in '+*':
   103                                role) in '+*':
   104             return self._many_rvid
   104             return self._many_rvid
   105         return self._one_rvid
   105         return self._one_rvid
   106 
   106 
       
   107     def _build_landing_zone(self, lzone):
       
   108         return lzone or self._defaultlandingzone % {'msg' : self.req._(self._landingzonemsg)}
       
   109 
       
   110     def _build_renderer(self, entity, rtype, role):
       
   111         return self.vreg.select_object('formrenderers', 'base', self.req,
       
   112                                        entity=entity,
       
   113                                        display_label=False, display_help=False,
       
   114                                        display_fields=[(rtype, role)],
       
   115                                        table_class='', button_bar_class='buttonbar',
       
   116                                        display_progress_div=False)
       
   117 
   107     def cell_call(self, row, col, rtype=None, role='subject',
   118     def cell_call(self, row, col, rtype=None, role='subject',
   108                   reload=False,      # controls reloading the whole page after change
   119                   reload=False,      # controls reloading the whole page after change
   109                   rvid=None,         # vid to be applied to other side of rtype
   120                   rvid=None,         # vid to be applied to other side of rtype
   110                   default=None,      # default value
   121                   default=None,      # default value
   111                   landing_zone=None  # prepend value with a separate html element to click onto
   122                   landing_zone=None  # prepend value with a separate html element to click onto
   112                                      # (esp. needed when values are links)
   123                                      # (esp. needed when values are links)
   113                   ):
   124                   ):
   114         """display field to edit entity's `rtype` relation on double-click"""
   125         """display field to edit entity's `rtype` relation on click"""
   115         assert rtype
   126         assert rtype
       
   127         assert role in ('subject', 'object')
       
   128         if default is None:
       
   129             default = xml_escape(self.req._('<no value>'))
   116         entity = self.entity(row, col)
   130         entity = self.entity(row, col)
   117         rschema = entity.schema.rschema(rtype)
   131         rschema = entity.schema.rschema(rtype)
   118         if not default:
       
   119             default = xml_escape(self.req._('<no value>'))
       
   120         # compute value, checking perms, build form
   132         # compute value, checking perms, build form
   121         if rschema.is_final():
   133         if rschema.is_final():
   122             value = entity.printable_value(rtype) or default
   134             value = entity.printable_value(rtype) or default
   123             if not entity.has_perm('update'):
   135             if not entity.has_perm('update'):
   124                 self.w(value)
   136                 self.w(value)
   125                 return
   137                 return
   126             form = self._build_attribute_form(entity, value, rtype, role, reload,
   138             self._attribute_form(entity, value, rtype, role, reload,
   127                                               row, col, default, landing_zone)
   139                                  row, col, default, landing_zone)
   128         else:
   140         else:
   129             if rvid is None:
   141             if rvid is None:
   130                 rvid = self._compute_best_vid(entity, rtype, role)
   142                 rvid = self._compute_best_vid(entity, rtype, role)
   131             rset = entity.related(rtype, role)
   143             rset = entity.related(rtype, role)
   132             candidate = self.view(rvid, rset, 'null')
   144             candidate = self.view(rvid, rset, 'null')
   133             value = candidate or default
   145             value = candidate or default
   134             if role == 'subject'and not rschema.has_perm(self.req, 'add',
   146             if role == 'subject' and not rschema.has_perm(self.req, 'add',
   135                                                          fromeid=entity.eid):
   147                                                           fromeid=entity.eid):
   136                 return self.w(value)
   148                 return self.w(value)
   137             elif role == 'object' and not rschema.has_perm(self.req, 'add',
   149             elif role == 'object' and not rschema.has_perm(self.req, 'add',
   138                                                            toeid=entity.eid):
   150                                                            toeid=entity.eid):
   139                 return self.w(value)
   151                 return self.w(value)
   140             elif get_schema_property(entity.e_schema,
   152             elif get_schema_property(entity.e_schema, rschema,
   141                                      entity.schema.rschema(rtype),
       
   142                                      role, 'composite') == role:
   153                                      role, 'composite') == role:
   143                 return self.w(value)
   154                 return self.w(value)
   144             form = self._build_relation_form(entity, value, rtype, role, reload, row, col,
   155             self._relation_form(entity, value, rtype, role, reload, row, col,
   145                                              rvid, default, landing_zone)
   156                                 rvid, default, landing_zone)
   146         renderer = self.vreg.select_object('formrenderers', 'base', self.req,
   157 
   147                                       entity=entity,
   158 
   148                                       display_label=False, display_help=False,
   159     def _relation_form(self, entity, value, rtype, role, row, col, reload, rvid, default, lzone):
   149                                       display_fields=[(rtype, role)],
       
   150                                       table_class='', button_bar_class='buttonbar',
       
   151                                       display_progress_div=False)
       
   152         self.w(form.form_render(renderer=renderer))
       
   153 
       
   154     def _build_landing_zone(self, lzone):
       
   155         return lzone or self._defaultlandingzone % {'msg' : self.req._(self._landingzonemsg)}
       
   156 
       
   157     def _build_relation_form(self, entity, value, rtype, role, row, col, reload, rvid,
       
   158                              default, lzone):
       
   159         lzone = self._build_landing_zone(lzone)
   160         lzone = self._build_landing_zone(lzone)
   160         value = lzone + value
   161         value = lzone + value
   161         divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid))
   162         divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid))
   162         event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid,
   163         event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid,
   163                       'reload' : reload, 'default' : default, 'role' : role,
   164                       'reload' : reload, 'default' : default, 'role' : role,
   164                       'lzone' : lzone}
   165                       'lzone' : lzone}
   165         onsubmit = ("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', "
   166         onsubmit = ("return inlineValidateRelationForm('%(rtype)s', '%(role)s', '%(eid)s', "
   166                     "'%(role)s', '%(eid)s', '%(divid)s', %(reload)s, '%(vid)s', "
   167                     "'%(divid)s', %(reload)s, '%(vid)s', '%(default)s', '%(lzone)s');"
   167                     "'%(default)s', '%(lzone)s');"
       
   168                     % event_data)
   168                     % event_data)
   169         cancelclick = "cancelInlineEdit(%s,\'%s\',\'%s\')" % (
   169         cancelclick = "hideInlineEdit(%s,\'%s\',\'%s\')" % (
   170             entity.eid, rtype, divid)
   170             entity.eid, rtype, divid)
   171         form = self.vreg.select_object('forms', 'base', self.req, entity=entity,
   171         form = self.vreg.select_object('forms', 'base', self.req, entity=entity,
   172                                        domid='%s-form' % divid, cssstyle='display: none',
   172                                        domid='%s-form' % divid, cssstyle='display: none',
   173                                        onsubmit=onsubmit, action='#',
   173                                        onsubmit=onsubmit, action='#',
   174                                        form_buttons=[SubmitButton(),
   174                                        form_buttons=[SubmitButton(),
   175                                                      Button(stdmsgs.BUTTON_CANCEL,
   175                                                      Button(stdmsgs.BUTTON_CANCEL,
   176                                                        onclick=cancelclick)])
   176                                                             onclick=cancelclick)])
   177         field = guess_field(entity.e_schema, entity.schema.rschema(rtype), role)
   177         field = guess_field(entity.e_schema, entity.schema.rschema(rtype), role)
   178         form.append_field(field)
   178         form.append_field(field)
       
   179         self.w(u'<div id="%s-reledit" class="field">' % divid)
   179         self.w(tags.div(value, klass='editableField', id=divid,
   180         self.w(tags.div(value, klass='editableField', id=divid,
   180                         onclick=self._onclick % event_data))
   181                         onclick=self._onclick % event_data))
   181         return form
   182         renderer = self._build_renderer(entity, rtype, role)
   182 
   183         self.w(form.form_render(renderer=renderer))
   183     def _build_attribute_form(self, entity, value, rtype, role, reload, row, col, default, lzone):
   184         self.w(u'</div>')
       
   185 
       
   186     def _attribute_form(self, entity, value, rtype, role, reload, row, col, default, lzone):
   184         eid = entity.eid
   187         eid = entity.eid
   185         divid = 'd%s' % make_uid('%s-%s' % (rtype, eid))
   188         divid = 'd%s' % make_uid('%s-%s' % (rtype, eid))
   186         event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype,
   189         event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype,
   187                       'reload' : dumps(reload), 'default' : default, 'lzone' : lzone}
   190                       'reload' : dumps(reload), 'default' : default, 'lzone' : lzone}
   188         onsubmit = ("return inlineValidateAttributeForm('%(divid)s-form', '%(rtype)s', "
   191         onsubmit = ("return inlineValidateAttributeForm('%(rtype)s', '%(eid)s', '%(divid)s', "
   189                     "'%(eid)s', '%(divid)s', %(reload)s, '%(default)s', '%(lzone)s');")
   192                     "%(reload)s, '%(default)s', '%(lzone)s');")
   190         buttons = [SubmitButton(stdmsgs.BUTTON_OK),
   193         buttons = [SubmitButton(stdmsgs.BUTTON_OK),
   191                    Button(stdmsgs.BUTTON_CANCEL,
   194                    Button(stdmsgs.BUTTON_CANCEL,
   192                           onclick="cancelInlineEdit(%s,\'%s\',\'%s\')" % (
   195                           onclick="hideInlineEdit(%s,\'%s\',\'%s\')" % (
   193                               eid, rtype, divid))]
   196                               eid, rtype, divid))]
   194         form = self.vreg.select_object('forms', 'edition', self.req, self.rset,
   197         form = self.vreg.select_object('forms', 'edition', self.req, self.rset,
   195                                        row=row, col=col, form_buttons=buttons,
   198                                        row=row, col=col, form_buttons=buttons,
   196                                        domid='%s-form' % divid, action='#',
   199                                        domid='%s-form' % divid, action='#',
   197                                        cssstyle='display: none',
   200                                        cssstyle='display: none',
   198                                        onsubmit=onsubmit % event_data)
   201                                        onsubmit=onsubmit % event_data)
   199         self.w(tags.div(value, klass='editableField', id=divid,
   202         self.w(tags.div(value, klass='editableField', id=divid,
   200                         onclick=self._onclick % event_data))
   203                         onclick=self._onclick % event_data))
   201         return form
   204         renderer = self._build_renderer(entity, rtype, role)
       
   205         self.w(form.form_render(renderer=renderer))
   202 
   206 
   203 
   207 
   204 class EditionFormView(FormViewMixIn, EntityView):
   208 class EditionFormView(FormViewMixIn, EntityView):
   205     """display primary entity edition form"""
   209     """display primary entity edition form"""
   206     id = 'edition'
   210     id = 'edition'