web/views/basecontrollers.py
changeset 2650 18aec79ec3a3
parent 2559 46859078c866
child 2680 66472d85d548
equal deleted inserted replaced
2649:5d4a943695d1 2650:18aec79ec3a3
    98         """publish a request, returning an encoded string"""
    98         """publish a request, returning an encoded string"""
    99         view, rset = self._select_view_and_rset(rset)
    99         view, rset = self._select_view_and_rset(rset)
   100         self.add_to_breadcrumbs(view)
   100         self.add_to_breadcrumbs(view)
   101         self.validate_cache(view)
   101         self.validate_cache(view)
   102         template = self.appli.main_template_id(self.req)
   102         template = self.appli.main_template_id(self.req)
   103         return self.vreg.main_template(self.req, template, rset=rset, view=view)
   103         return self.vreg['views'].main_template(self.req, template,
       
   104                                                 rset=rset, view=view)
   104 
   105 
   105     def _select_view_and_rset(self, rset):
   106     def _select_view_and_rset(self, rset):
   106         req = self.req
   107         req = self.req
   107         if rset is None and not hasattr(req, '_rql_processed'):
   108         if rset is None and not hasattr(req, '_rql_processed'):
   108             req._rql_processed = True
   109             req._rql_processed = True
   117             except Exception, ex:
   118             except Exception, ex:
   118                 self.exception('while handling __method')
   119                 self.exception('while handling __method')
   119                 req.set_message(req._("error while handling __method: %s") % req._(ex))
   120                 req.set_message(req._("error while handling __method: %s") % req._(ex))
   120         vid = req.form.get('vid') or vid_from_rset(req, rset, self.schema)
   121         vid = req.form.get('vid') or vid_from_rset(req, rset, self.schema)
   121         try:
   122         try:
   122             view = self.vreg.select('views', vid, req, rset=rset)
   123             view = self.vreg['views'].select(vid, req, rset=rset)
   123         except ObjectNotFound:
   124         except ObjectNotFound:
   124             self.warning("the view %s could not be found", vid)
   125             self.warning("the view %s could not be found", vid)
   125             req.set_message(req._("The view %s could not be found") % vid)
   126             req.set_message(req._("The view %s could not be found") % vid)
   126             vid = vid_from_rset(req, rset, self.schema)
   127             vid = vid_from_rset(req, rset, self.schema)
   127             view = self.vreg.select('views', vid, req, rset=rset)
   128             view = self.vreg['views'].select(vid, req, rset=rset)
   128         except NoSelectableObject:
   129         except NoSelectableObject:
   129             if rset:
   130             if rset:
   130                 req.set_message(req._("The view %s can not be applied to this query") % vid)
   131                 req.set_message(req._("The view %s can not be applied to this query") % vid)
   131             else:
   132             else:
   132                 req.set_message(req._("You have no access to this view or it's not applyable to current data"))
   133                 req.set_message(req._("You have no access to this view or it's not applyable to current data"))
   133             self.warning("the view %s can not be applied to this query", vid)
   134             self.warning("the view %s can not be applied to this query", vid)
   134             vid = vid_from_rset(req, rset, self.schema)
   135             vid = vid_from_rset(req, rset, self.schema)
   135             view = self.vreg.select('views', vid, req, rset=rset)
   136             view = self.vreg['views'].select(vid, req, rset=rset)
   136         return view, rset
   137         return view, rset
   137 
   138 
   138     def add_to_breadcrumbs(self, view):
   139     def add_to_breadcrumbs(self, view):
   139         # update breadcrumps **before** validating cache, unless the view
   140         # update breadcrumps **before** validating cache, unless the view
   140         # specifies explicitly it should not be added to breadcrumb or the
   141         # specifies explicitly it should not be added to breadcrumb or the
   181     return (foreid, ex.errors)
   182     return (foreid, ex.errors)
   182 
   183 
   183 def _validate_form(req, vreg):
   184 def _validate_form(req, vreg):
   184     # XXX should use the `RemoteCallFailed` mechanism
   185     # XXX should use the `RemoteCallFailed` mechanism
   185     try:
   186     try:
   186         ctrl = vreg.select('controllers', 'edit', req=req)
   187         ctrl = vreg['controllers'].select('edit', req=req)
   187     except NoSelectableObject:
   188     except NoSelectableObject:
   188         return (False, {None: req._('not authorized')})
   189         return (False, {None: req._('not authorized')})
   189     try:
   190     try:
   190         ctrl.publish(None)
   191         ctrl.publish(None)
   191     except ValidationError, ex:
   192     except ValidationError, ex:
   307             rset = self._exec(rql)
   308             rset = self._exec(rql)
   308         else:
   309         else:
   309             rset = None
   310             rset = None
   310         vid = req.form.get('vid') or vid_from_rset(req, rset, self.schema)
   311         vid = req.form.get('vid') or vid_from_rset(req, rset, self.schema)
   311         try:
   312         try:
   312             view = self.vreg.select('views', vid, req, rset=rset)
   313             view = self.vreg['views'].select(vid, req, rset=rset)
   313         except NoSelectableObject:
   314         except NoSelectableObject:
   314             vid = req.form.get('fallbackvid', 'noresult')
   315             vid = req.form.get('fallbackvid', 'noresult')
   315             view = self.vreg.select('views', vid, req, rset=rset)
   316             view = self.vreg['views'].select(vid, req, rset=rset)
   316         divid = req.form.get('divid', 'pageContent')
   317         divid = req.form.get('divid', 'pageContent')
   317         # we need to call pagination before with the stream set
   318         # we need to call pagination before with the stream set
   318         stream = view.set_stream()
   319         stream = view.set_stream()
   319         if req.form.get('paginate'):
   320         if req.form.get('paginate'):
   320             if divid == 'pageContent':
   321             if divid == 'pageContent':
   337         return stream.getvalue()
   338         return stream.getvalue()
   338 
   339 
   339     @xhtmlize
   340     @xhtmlize
   340     def js_prop_widget(self, propkey, varname, tabindex=None):
   341     def js_prop_widget(self, propkey, varname, tabindex=None):
   341         """specific method for CWProperty handling"""
   342         """specific method for CWProperty handling"""
   342         entity = self.vreg.etype_class('CWProperty')(self.req, None, None)
   343         entity = self.vreg['etypes'].etype_class('CWProperty')(self.req)
   343         entity.eid = varname
   344         entity.eid = varname
   344         entity['pkey'] = propkey
   345         entity['pkey'] = propkey
   345         form = self.vreg.select('forms', 'edition', self.req, entity=entity)
   346         form = self.vreg['forms'].select('edition', self.req, entity=entity)
   346         form.form_build_context()
   347         form.form_build_context()
   347         vfield = form.field_by_name('value')
   348         vfield = form.field_by_name('value')
   348         renderer = FormRenderer(self.req)
   349         renderer = FormRenderer(self.req)
   349         return vfield.render(form, renderer, tabindex=tabindex) \
   350         return vfield.render(form, renderer, tabindex=tabindex) \
   350                + renderer.render_help(form, vfield)
   351                + renderer.render_help(form, vfield)
   353     def js_component(self, compid, rql, registry='components', extraargs=None):
   354     def js_component(self, compid, rql, registry='components', extraargs=None):
   354         if rql:
   355         if rql:
   355             rset = self._exec(rql)
   356             rset = self._exec(rql)
   356         else:
   357         else:
   357             rset = None
   358             rset = None
   358         comp = self.vreg.select(registry, compid, self.req, rset=rset)
   359         comp = self.vreg[registry].select(compid, self.req, rset=rset)
   359         if extraargs is None:
   360         if extraargs is None:
   360             extraargs = {}
   361             extraargs = {}
   361         else: # we receive unicode keys which is not supported by the **syntax
   362         else: # we receive unicode keys which is not supported by the **syntax
   362             extraargs = dict((str(key), value)
   363             extraargs = dict((str(key), value)
   363                              for key, value in extraargs.items())
   364                              for key, value in extraargs.items())
   365         return comp.render(**extraargs)
   366         return comp.render(**extraargs)
   366 
   367 
   367     @check_pageid
   368     @check_pageid
   368     @xhtmlize
   369     @xhtmlize
   369     def js_inline_creation_form(self, peid, ttype, rtype, role):
   370     def js_inline_creation_form(self, peid, ttype, rtype, role):
   370         view = self.vreg.select('views', 'inline-creation', self.req,
   371         view = self.vreg['views'].select('inline-creation', self.req,
   371                                 etype=ttype, peid=peid, rtype=rtype, role=role)
   372                                          etype=ttype, peid=peid, rtype=rtype,
       
   373                                          role=role)
   372         return view.render(etype=ttype, peid=peid, rtype=rtype, role=role)
   374         return view.render(etype=ttype, peid=peid, rtype=rtype, role=role)
   373 
   375 
   374     @jsonize
   376     @jsonize
   375     def js_validate_form(self, action, names, values):
   377     def js_validate_form(self, action, names, values):
   376         return self.validate_form(action, names, values)
   378         return self.validate_form(action, names, values)