web/request.py
changeset 5223 6abd6e3599f4
parent 5155 1dea6e0fdfc1
child 5244 5467674ad101
equal deleted inserted replaced
5216:4f4369e63f5e 5223:6abd6e3599f4
   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
   234     # web state helpers #######################################################
   235     # web state helpers #######################################################
   235 
   236 
   236     @property
   237     @property
   237     def message(self):
   238     def message(self):
   238         try:
   239         try:
   239             return self.get_session_data(self._msgid, default=u'', pop=True)
   240             return self.session.data.pop(self._msgid, '')
   240         except AttributeError:
   241         except AttributeError:
   241             try:
   242             try:
   242                 return self._msg
   243                 return self._msg
   243             except AttributeError:
   244             except AttributeError:
   244                 return None
   245                 return None
   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):