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 |