web/views/reledit.py
branchstable
changeset 6111 06c96a79c3c0
parent 6110 7c419cbe9809
child 6246 62e25fac41cd
equal deleted inserted replaced
6110:7c419cbe9809 6111:06c96a79c3c0
    26 from cubicweb.schema import display_name
    26 from cubicweb.schema import display_name
    27 from cubicweb.utils import json_dumps
    27 from cubicweb.utils import json_dumps
    28 from cubicweb.selectors import non_final_entity, match_kwargs
    28 from cubicweb.selectors import non_final_entity, match_kwargs
    29 from cubicweb.view import EntityView
    29 from cubicweb.view import EntityView
    30 from cubicweb.web import uicfg, stdmsgs
    30 from cubicweb.web import uicfg, stdmsgs
    31 from cubicweb.web.form import FormViewMixIn, FieldNotFound
    31 from cubicweb.web.form import FieldNotFound
    32 from cubicweb.web.formwidgets import Button, SubmitButton
    32 from cubicweb.web.formwidgets import Button, SubmitButton
    33 
    33 
    34 class DummyForm(object):
    34 class _DummyForm(object):
    35     __slots__ = ('event_args',)
    35     __slots__ = ('event_args',)
    36     def form_render(self, **_args):
    36     def form_render(self, **_args):
    37         return u''
    37         return u''
    38     def render(self, *_args, **_kwargs):
    38     def render(self, *_args, **_kwargs):
    39         return u''
    39         return u''
    82         self._cw.add_css('cubicweb.form.css')
    82         self._cw.add_css('cubicweb.form.css')
    83         entity = self.cw_rset.get_entity(row, col)
    83         entity = self.cw_rset.get_entity(row, col)
    84         rschema = self._cw.vreg.schema[rtype]
    84         rschema = self._cw.vreg.schema[rtype]
    85         reload = self._compute_reload(entity, rschema, role, reload)
    85         reload = self._compute_reload(entity, rschema, role, reload)
    86         default_value = self._compute_default_value(entity, rschema, role, default_value)
    86         default_value = self._compute_default_value(entity, rschema, role, default_value)
    87         # compute value, checking perms, build & display form
       
    88         divid = self._build_divid(rtype, role, entity.eid)
    87         divid = self._build_divid(rtype, role, entity.eid)
    89         if rschema.final:
    88         if rschema.final:
    90             value = entity.printable_value(rtype)
    89             self._handle_attributes(entity, rschema, role, divid, reload, default_value)
    91             form, renderer = self._build_form(entity, rtype, role, divid, 'base',
    90         else:
    92                                               default_value, reload)
    91             self._handle_relations(entity, rschema, role, divid, reload, default_value, formid)
    93             if not self._should_edit_attribute(entity, rschema, form):
    92 
    94                 self.w(value)
    93     def _handle_attributes(self, entity, rschema, role, divid, reload, default_value):
    95                 return
    94         rtype = rschema.type
    96             value = value or default_value
    95         value = entity.printable_value(rtype)
       
    96         form, renderer = self._build_form(entity, rtype, role, divid, 'base',
       
    97                                           default_value, reload)
       
    98         if not self._should_edit_attribute(entity, rschema, form):
       
    99             self.w(value)
       
   100             return
       
   101         value = value or default_value
       
   102         field = form.field_by_name(rtype, role, entity.e_schema)
       
   103         form.append_field(field)
       
   104         self.view_form(divid, value, form, renderer)
       
   105 
       
   106     def _handle_relations(self, entity, rschema, role, divid, reload, default_value, formid):
       
   107         rtype = rschema.type
       
   108         rvid = self._compute_best_vid(entity.e_schema, rschema, role)
       
   109         related_rset = entity.related(rtype, role)
       
   110         if related_rset:
       
   111             value = self._cw.view(rvid, related_rset)
       
   112         else:
       
   113             value = default_value
       
   114         ttypes = self._compute_ttypes(rschema, role)
       
   115 
       
   116         if not self._should_edit_relation(entity, rschema, role):
       
   117             self.w(value)
       
   118             return
       
   119         # this is for attribute-like composites (1 target type, 1 related entity at most)
       
   120         add_related = self._may_add_related(related_rset, entity, rschema, role, ttypes)
       
   121         edit_related = self._may_edit_related_entity(related_rset, entity, rschema, role, ttypes)
       
   122         delete_related = edit_related and self._may_delete_related(related_rset, entity, rschema, role)
       
   123         # compute formid
       
   124         if len(ttypes) > 1: # redundant safety belt
       
   125             formid = 'base'
       
   126         else:
       
   127             afs = uicfg.autoform_section.etype_get(entity.e_schema, rschema, role, ttypes[0])
       
   128             # is there an afs spec that says we should edit
       
   129             # the rschema as an attribute ?
       
   130             if afs and 'main_attributes' in afs:
       
   131                 formid = 'base'
       
   132 
       
   133         form, renderer = self._build_form(entity, rtype, role, divid, formid, default_value,
       
   134                                           reload, dict(vid=rvid),
       
   135                                           edit_related, add_related and ttypes[0])
       
   136         if formid == 'base':
    97             field = form.field_by_name(rtype, role, entity.e_schema)
   137             field = form.field_by_name(rtype, role, entity.e_schema)
    98             form.append_field(field)
   138             form.append_field(field)
    99             self.view_form(divid, value, form, renderer)
   139         self.view_form(divid, value, form, renderer, edit_related,
   100         else:
   140                        delete_related, add_related)
   101             rvid = self._compute_best_vid(entity.e_schema, rschema, role)
   141 
   102             related_rset = entity.related(rtype, role)
       
   103             if related_rset:
       
   104                 value = self._cw.view(rvid, related_rset)
       
   105             else:
       
   106                 value = default_value
       
   107             ttypes = self._compute_ttypes(rschema, role)
       
   108 
       
   109             if not self._should_edit_relation(entity, rschema, role):
       
   110                 self.w(value)
       
   111                 return
       
   112             # this is for attribute-like composites (1 target type, 1 related entity at most)
       
   113             add_related = self._may_add_related(related_rset, entity, rschema, role, ttypes)
       
   114             edit_related = self._may_edit_related_entity(related_rset, entity, rschema, role, ttypes)
       
   115             delete_related = edit_related and self._may_delete_related(related_rset, entity, rschema, role)
       
   116             # compute formid
       
   117             if len(ttypes) > 1: # redundant safety belt
       
   118                 formid = 'base'
       
   119             else:
       
   120                 afs = uicfg.autoform_section.etype_get(entity.e_schema, rschema, role, ttypes[0])
       
   121                 # is there an afs spec that says we should edit
       
   122                 # the rschema as an attribute ?
       
   123                 if afs and 'main_attributes' in afs:
       
   124                     formid = 'base'
       
   125 
       
   126             form, renderer = self._build_form(entity, rtype, role, divid, formid, default_value,
       
   127                                               reload, dict(vid=rvid),
       
   128                                               edit_related, add_related and ttypes[0])
       
   129             if formid == 'base':
       
   130                 field = form.field_by_name(rtype, role, entity.e_schema)
       
   131                 form.append_field(field)
       
   132             self.view_form(divid, value, form, renderer, edit_related,
       
   133                            delete_related, add_related)
       
   134 
   142 
   135     def _compute_best_vid(self, eschema, rschema, role):
   143     def _compute_best_vid(self, eschema, rschema, role):
   136         if eschema.rdef(rschema, role).role_cardinality(role) in '+*':
   144         if eschema.rdef(rschema, role).role_cardinality(role) in '+*':
   137             return self._many_rvid
   145             return self._many_rvid
   138         return self._one_rvid
   146         return self._one_rvid
   352 
   360 
   353     def _build_form(self, entity, rtype, role, divid, formid, default_value, reload,
   361     def _build_form(self, entity, rtype, role, divid, formid, default_value, reload,
   354                   extradata=None, edit_related=False, add_related=False, **formargs):
   362                   extradata=None, edit_related=False, add_related=False, **formargs):
   355         event_args = self._build_args(entity, rtype, role, 'base', default_value,
   363         event_args = self._build_args(entity, rtype, role, 'base', default_value,
   356                                       reload, extradata)
   364                                       reload, extradata)
   357         form = DummyForm()
   365         form = _DummyForm()
   358         form.event_args = event_args
   366         form.event_args = event_args
   359         return form, None
   367         return form, None