web/views/basecontrollers.py
changeset 1889 874a055c373b
parent 1827 93840d187f26
parent 1868 af1ae863606d
child 1971 5e6799e86088
child 1977 606923dff11b
equal deleted inserted replaced
1888:f36d43f00f32 1889:874a055c373b
    16 from logilab.common.decorators import cached
    16 from logilab.common.decorators import cached
    17 
    17 
    18 from cubicweb import NoSelectableObject, ValidationError, ObjectNotFound, typed_eid
    18 from cubicweb import NoSelectableObject, ValidationError, ObjectNotFound, typed_eid
    19 from cubicweb.utils import strptime
    19 from cubicweb.utils import strptime
    20 from cubicweb.selectors import yes, match_user_groups
    20 from cubicweb.selectors import yes, match_user_groups
    21 from cubicweb.view import STRICT_DOCTYPE
    21 from cubicweb.view import STRICT_DOCTYPE, STRICT_DOCTYPE_NOEXT
    22 from cubicweb.common.mail import format_mail
    22 from cubicweb.common.mail import format_mail
    23 from cubicweb.web import ExplicitLogin, Redirect, RemoteCallFailed, json_dumps
    23 from cubicweb.web import ExplicitLogin, Redirect, RemoteCallFailed, json_dumps
    24 from cubicweb.web.formrenderers import FormRenderer
    24 from cubicweb.web.formrenderers import FormRenderer
    25 from cubicweb.web.controller import Controller
    25 from cubicweb.web.controller import Controller
    26 from cubicweb.web.views import vid_from_rset
    26 from cubicweb.web.views import vid_from_rset
    30     HAS_SEARCH_RESTRICTION = True
    30     HAS_SEARCH_RESTRICTION = True
    31 except ImportError: # gae
    31 except ImportError: # gae
    32     HAS_SEARCH_RESTRICTION = False
    32     HAS_SEARCH_RESTRICTION = False
    33 
    33 
    34 
    34 
    35 def xhtml_wrap(source):
    35 def xhtml_wrap(self, source):
    36     head = u'<?xml version="1.0"?>\n' + STRICT_DOCTYPE
    36     # XXX factor out, watch view.py ~ Maintemplate.doctype
       
    37     if self.req.xhtml_browser():
       
    38         dt = STRICT_DOCTYPE
       
    39     else:
       
    40         dt = STRICT_DOCTYPE_NOEXT
       
    41     head = u'<?xml version="1.0"?>\n' + dt
    37     return head + u'<div xmlns="http://www.w3.org/1999/xhtml" xmlns:cubicweb="http://www.logilab.org/2008/cubicweb">%s</div>' % source.strip()
    42     return head + u'<div xmlns="http://www.w3.org/1999/xhtml" xmlns:cubicweb="http://www.logilab.org/2008/cubicweb">%s</div>' % source.strip()
    38 
    43 
    39 def jsonize(func):
    44 def jsonize(func):
    40     """decorator to sets correct content_type and calls `simplejson.dumps` on
    45     """decorator to sets correct content_type and calls `simplejson.dumps` on
    41     results
    46     results
    49 def xhtmlize(func):
    54 def xhtmlize(func):
    50     """decorator to sets correct content_type and calls `xmlize` on results"""
    55     """decorator to sets correct content_type and calls `xmlize` on results"""
    51     def wrapper(self, *args, **kwargs):
    56     def wrapper(self, *args, **kwargs):
    52         self.req.set_content_type(self.req.html_content_type())
    57         self.req.set_content_type(self.req.html_content_type())
    53         result = func(self, *args, **kwargs)
    58         result = func(self, *args, **kwargs)
    54         return xhtml_wrap(result)
    59         return xhtml_wrap(self, result)
    55     wrapper.__name__ = func.__name__
    60     wrapper.__name__ = func.__name__
    56     return wrapper
    61     return wrapper
    57 
    62 
    58 def check_pageid(func):
    63 def check_pageid(func):
    59     """decorator which checks the given pageid is found in the
    64     """decorator which checks the given pageid is found in the
   203             else:
   208             else:
   204                 status, args = (False, '???')
   209                 status, args = (False, '???')
   205         self.req.set_content_type('text/html')
   210         self.req.set_content_type('text/html')
   206         jsarg = simplejson.dumps( (status, args) )
   211         jsarg = simplejson.dumps( (status, args) )
   207         return """<script type="text/javascript">
   212         return """<script type="text/javascript">
   208  window.parent.handleFormValidationResponse('entityForm', null, %s);
   213  window.parent.handleFormValidationResponse('entityForm', null, null, %s);
   209 </script>""" %  simplejson.dumps( (status, args) )
   214 </script>""" %  simplejson.dumps( (status, args) )
   210 
   215 
   211     def validation_error(self, err):
   216     def validation_error(self, err):
   212         self.req.cnx.rollback()
   217         self.req.cnx.rollback()
   213         try:
   218         try:
   377             return (False, {None: self.req._('not authorized')})
   382             return (False, {None: self.req._('not authorized')})
   378         try:
   383         try:
   379             ctrl.publish(None, fromjson=True)
   384             ctrl.publish(None, fromjson=True)
   380         except ValidationError, err:
   385         except ValidationError, err:
   381             self.req.cnx.rollback()
   386             self.req.cnx.rollback()
   382             if not err.entity or isinstance(err.entity, (long, int)):
   387             return (False, (err.entity, err.errors))
   383                 eid = err.entity
       
   384             else:
       
   385                 eid = err.entity.eid
       
   386             return (False, (eid, err.errors))
       
   387         except Redirect, redir:
   388         except Redirect, redir:
   388             return (True, redir.location)
   389             return (True, redir.location)
   389         except Exception, err:
   390         except Exception, err:
   390             self.req.cnx.rollback()
   391             self.req.cnx.rollback()
   391             self.exception('unexpected error in js_validateform')
   392             self.exception('unexpected error in js_validateform')
   482 
   483 
   483     def js_delete_bookmark(self, beid):
   484     def js_delete_bookmark(self, beid):
   484         rql = 'DELETE B bookmarked_by U WHERE B eid %(b)s, U eid %(u)s'
   485         rql = 'DELETE B bookmarked_by U WHERE B eid %(b)s, U eid %(u)s'
   485         self.req.execute(rql, {'b': typed_eid(beid), 'u' : self.req.user.eid})
   486         self.req.execute(rql, {'b': typed_eid(beid), 'u' : self.req.user.eid})
   486 
   487 
       
   488     def js_node_clicked(self, treeid, nodeeid):
       
   489         """add/remove eid in treestate cookie"""
       
   490         from cubicweb.web.views.treeview import treecookiename
       
   491         cookies = self.req.get_cookie()
       
   492         statename = treecookiename(treeid)
       
   493         treestate = cookies.get(statename)
       
   494         if treestate is None:
       
   495             cookies[statename] = nodeeid
       
   496             self.req.set_cookie(cookies, statename)
       
   497         else:
       
   498             marked = set(filter(None, treestate.value.split(';')))
       
   499             if nodeeid in marked:
       
   500                 marked.remove(nodeeid)
       
   501             else:
       
   502                 marked.add(nodeeid)
       
   503             cookies[statename] = ';'.join(marked)
       
   504             self.req.set_cookie(cookies, statename)
       
   505 
   487     def js_set_cookie(self, cookiename, cookievalue):
   506     def js_set_cookie(self, cookiename, cookievalue):
   488         # XXX we should consider jQuery.Cookie
   507         # XXX we should consider jQuery.Cookie
   489         cookiename, cookievalue = str(cookiename), str(cookievalue)
   508         cookiename, cookievalue = str(cookiename), str(cookievalue)
   490         cookies = self.req.get_cookie()
   509         cookies = self.req.get_cookie()
   491         cookies[cookiename] = cookievalue
   510         cookies[cookiename] = cookievalue