120 if varmaker is None: |
120 if varmaker is None: |
121 varmaker = rqlvar_maker() |
121 varmaker = rqlvar_maker() |
122 self.set_page_data('rql_varmaker', varmaker) |
122 self.set_page_data('rql_varmaker', varmaker) |
123 return varmaker |
123 return varmaker |
124 |
124 |
125 def set_connection(self, cnx, user=None): |
125 def set_session(self, session, user=None): |
126 """method called by the session handler when the user is authenticated |
126 """method called by the session handler when the user is authenticated |
127 or an anonymous connection is open |
127 or an anonymous connection is open |
128 """ |
128 """ |
129 super(CubicWebRequestBase, self).set_connection(cnx, user) |
129 super(CubicWebRequestBase, self).set_session(session, user) |
130 # set request language |
130 # set request language |
131 vreg = self.vreg |
131 vreg = self.vreg |
132 if self.user: |
132 if self.user: |
133 try: |
133 try: |
134 # 1. user specified language |
134 # 1. user specified language |
149 |
149 |
150 def set_language(self, lang): |
150 def set_language(self, lang): |
151 gettext, self.pgettext = self.translations[lang] |
151 gettext, self.pgettext = self.translations[lang] |
152 self._ = self.__ = gettext |
152 self._ = self.__ = gettext |
153 self.lang = lang |
153 self.lang = lang |
154 self.cnx.set_session_props(lang=lang) |
|
155 self.debug('request language: %s', lang) |
154 self.debug('request language: %s', lang) |
|
155 if self.cnx is not None: |
|
156 self.cnx.set_session_props(lang=lang) |
156 |
157 |
157 # input form parameters management ######################################## |
158 # input form parameters management ######################################## |
158 |
159 |
159 # common form parameters which should be protected against html values |
160 # common form parameters which should be protected against html values |
160 # XXX can't add 'eid' for instance since it may be multivalued |
161 # XXX can't add 'eid' for instance since it may be multivalued |
255 return make_uid() |
256 return make_uid() |
256 |
257 |
257 def set_redirect_message(self, msg): |
258 def set_redirect_message(self, msg): |
258 assert isinstance(msg, unicode) |
259 assert isinstance(msg, unicode) |
259 msgid = self.redirect_message_id() |
260 msgid = self.redirect_message_id() |
260 self.set_session_data(msgid, msg) |
261 self.session.data[msgid] = msg |
261 return msgid |
262 return msgid |
262 |
263 |
263 def append_to_redirect_message(self, msg): |
264 def append_to_redirect_message(self, msg): |
264 msgid = self.redirect_message_id() |
265 msgid = self.redirect_message_id() |
265 currentmsg = self.get_session_data(msgid) |
266 currentmsg = self.session.data.get(msgid) |
266 if currentmsg is not None: |
267 if currentmsg is not None: |
267 currentmsg = '%s %s' % (currentmsg, msg) |
268 currentmsg = '%s %s' % (currentmsg, msg) |
268 else: |
269 else: |
269 currentmsg = msg |
270 currentmsg = msg |
270 self.set_session_data(msgid, currentmsg) |
271 self.session.data[msgid] = currentmsg |
271 return msgid |
272 return msgid |
272 |
273 |
273 def reset_message(self): |
274 def reset_message(self): |
274 if hasattr(self, '_msg'): |
275 if hasattr(self, '_msg'): |
275 del self._msg |
276 del self._msg |
278 |
279 |
279 def update_search_state(self): |
280 def update_search_state(self): |
280 """update the current search state""" |
281 """update the current search state""" |
281 searchstate = self.form.get('__mode') |
282 searchstate = self.form.get('__mode') |
282 if not searchstate and self.cnx is not None: |
283 if not searchstate and self.cnx is not None: |
283 searchstate = self.get_session_data('search_state', 'normal') |
284 searchstate = self.session.data.get('search_state', 'normal') |
284 self.set_search_state(searchstate) |
285 self.set_search_state(searchstate) |
285 |
286 |
286 def set_search_state(self, searchstate): |
287 def set_search_state(self, searchstate): |
287 """set a new search state""" |
288 """set a new search state""" |
288 if searchstate is None or searchstate == 'normal': |
289 if searchstate is None or searchstate == 'normal': |
289 self.search_state = (searchstate or 'normal',) |
290 self.search_state = (searchstate or 'normal',) |
290 else: |
291 else: |
291 self.search_state = ('linksearch', searchstate.split(':')) |
292 self.search_state = ('linksearch', searchstate.split(':')) |
292 assert len(self.search_state[-1]) == 4 |
293 assert len(self.search_state[-1]) == 4 |
293 if self.cnx is not None: |
294 if self.cnx is not None: |
294 self.set_session_data('search_state', searchstate) |
295 self.session.data['search_state'] = searchstate |
295 |
296 |
296 def match_search_state(self, rset): |
297 def match_search_state(self, rset): |
297 """when searching an entity to create a relation, return True if entities in |
298 """when searching an entity to create a relation, return True if entities in |
298 the given rset may be used as relation end |
299 the given rset may be used as relation end |
299 """ |
300 """ |
306 return False |
307 return False |
307 return True |
308 return True |
308 |
309 |
309 def update_breadcrumbs(self): |
310 def update_breadcrumbs(self): |
310 """stores the last visisted page in session data""" |
311 """stores the last visisted page in session data""" |
311 searchstate = self.get_session_data('search_state') |
312 searchstate = self.session.data.get('search_state') |
312 if searchstate == 'normal': |
313 if searchstate == 'normal': |
313 breadcrumbs = self.get_session_data('breadcrumbs', None) |
314 breadcrumbs = self.session.data.get('breadcrumbs') |
314 if breadcrumbs is None: |
315 if breadcrumbs is None: |
315 breadcrumbs = SizeConstrainedList(10) |
316 breadcrumbs = SizeConstrainedList(10) |
316 self.set_session_data('breadcrumbs', breadcrumbs) |
317 self.session.data['breadcrumbs'] = breadcrumbs |
317 breadcrumbs.append(self.url()) |
318 breadcrumbs.append(self.url()) |
318 else: |
319 else: |
319 url = self.url() |
320 url = self.url() |
320 if breadcrumbs and breadcrumbs[-1] != url: |
321 if breadcrumbs and breadcrumbs[-1] != url: |
321 breadcrumbs.append(url) |
322 breadcrumbs.append(url) |
322 |
323 |
323 def last_visited_page(self): |
324 def last_visited_page(self): |
324 breadcrumbs = self.get_session_data('breadcrumbs', None) |
325 breadcrumbs = self.session.data.get('breadcrumbs') |
325 if breadcrumbs: |
326 if breadcrumbs: |
326 return breadcrumbs.pop() |
327 return breadcrumbs.pop() |
327 return self.base_url() |
328 return self.base_url() |
328 |
329 |
329 def user_rql_callback(self, args, msg=None): |
330 def user_rql_callback(self, args, msg=None): |
366 assert cbname.startswith('cb_') |
367 assert cbname.startswith('cb_') |
367 self.info('unregistering callback %s for pageid %s', cbname, pageid) |
368 self.info('unregistering callback %s for pageid %s', cbname, pageid) |
368 self.del_page_data(cbname) |
369 self.del_page_data(cbname) |
369 |
370 |
370 def clear_user_callbacks(self): |
371 def clear_user_callbacks(self): |
371 if self.cnx is not None: |
372 if self.session is not None: # XXX |
372 sessdata = self.session_data() |
373 for key in self.session.data.keys(): |
373 callbacks = [key for key in sessdata if key.startswith('cb_')] |
374 if key.startswith('cb_'): |
374 for callback in callbacks: |
375 del self.session.data[key] |
375 self.del_session_data(callback) |
|
376 |
376 |
377 # web edition helpers ##################################################### |
377 # web edition helpers ##################################################### |
378 |
378 |
379 @cached # so it's writed only once |
379 @cached # so it's writed only once |
380 def fckeditor_config(self): |
380 def fckeditor_config(self): |
436 """shortcut to clear req's pending_{delete,insert} entries |
436 """shortcut to clear req's pending_{delete,insert} entries |
437 |
437 |
438 This is needed when the edition is completed (whether it's validated |
438 This is needed when the edition is completed (whether it's validated |
439 or cancelled) |
439 or cancelled) |
440 """ |
440 """ |
441 self.del_session_data('pending_insert') |
441 self.session.data.pop('pending_insert', None) |
442 self.del_session_data('pending_delete') |
442 self.session.data.pop('pending_delete', None) |
443 |
443 |
444 def cancel_edition(self, errorurl): |
444 def cancel_edition(self, errorurl): |
445 """remove pending operations and `errorurl`'s specific stored data |
445 """remove pending operations and `errorurl`'s specific stored data |
446 """ |
446 """ |
447 self.del_session_data(errorurl) |
447 self.session.data.pop(errorurl, None) |
448 self.remove_pending_operations() |
448 self.remove_pending_operations() |
449 |
449 |
450 # high level methods for HTTP headers management ########################## |
450 # high level methods for HTTP headers management ########################## |
451 |
451 |
452 # must be cached since login/password are popped from the form dictionary |
452 # must be cached since login/password are popped from the form dictionary |
743 |
743 |
744 # page data management #################################################### |
744 # page data management #################################################### |
745 |
745 |
746 def get_page_data(self, key, default=None): |
746 def get_page_data(self, key, default=None): |
747 """return value associated to `key` in curernt page data""" |
747 """return value associated to `key` in curernt page data""" |
748 page_data = self.cnx.get_session_data(self.pageid, {}) |
748 page_data = self.session.data.get(self.pageid) |
|
749 if page_data is None: |
|
750 return default |
749 return page_data.get(key, default) |
751 return page_data.get(key, default) |
750 |
752 |
751 def set_page_data(self, key, value): |
753 def set_page_data(self, key, value): |
752 """set value associated to `key` in current page data""" |
754 """set value associated to `key` in current page data""" |
753 self.html_headers.add_unload_pagedata() |
755 self.html_headers.add_unload_pagedata() |
754 page_data = self.cnx.get_session_data(self.pageid, {}) |
756 page_data = self.session.data.setdefault(self.pageid, {}) |
755 page_data[key] = value |
757 page_data[key] = value |
756 return self.cnx.set_session_data(self.pageid, page_data) |
758 self.session.data[self.pageid] = page_data |
757 |
759 |
758 def del_page_data(self, key=None): |
760 def del_page_data(self, key=None): |
759 """remove value associated to `key` in current page data |
761 """remove value associated to `key` in current page data |
760 if `key` is None, all page data will be cleared |
762 if `key` is None, all page data will be cleared |
761 """ |
763 """ |
762 if key is None: |
764 if key is None: |
763 self.cnx.del_session_data(self.pageid) |
765 self.session.data.pop(self.pageid, None) |
764 else: |
766 else: |
765 page_data = self.cnx.get_session_data(self.pageid, {}) |
767 try: |
766 page_data.pop(key, None) |
768 del self.session.data[self.pageid][key] |
767 self.cnx.set_session_data(self.pageid, page_data) |
769 except KeyError: |
|
770 pass |
768 |
771 |
769 # user-agent detection #################################################### |
772 # user-agent detection #################################################### |
770 |
773 |
771 @cached |
774 @cached |
772 def useragent(self): |
775 def useragent(self): |