web/request.py
changeset 9063 383d45cf61fa
parent 9041 753a159c8822
child 9071 46885bfa4150
equal deleted inserted replaced
9062:fa5bc8aef7ed 9063:383d45cf61fa
    37 
    37 
    38 from logilab.common.decorators import cached
    38 from logilab.common.decorators import cached
    39 from logilab.common.deprecation import deprecated
    39 from logilab.common.deprecation import deprecated
    40 from logilab.mtconverter import xml_escape
    40 from logilab.mtconverter import xml_escape
    41 
    41 
       
    42 from cubicweb.req import RequestSessionBase
    42 from cubicweb.dbapi import DBAPIRequest
    43 from cubicweb.dbapi import DBAPIRequest
    43 from cubicweb.uilib import remove_html_tags, js
    44 from cubicweb.uilib import remove_html_tags, js
    44 from cubicweb.utils import SizeConstrainedList, HTMLHead, make_uid
    45 from cubicweb.utils import SizeConstrainedList, HTMLHead, make_uid
    45 from cubicweb.view import TRANSITIONAL_DOCTYPE_NOEXT
    46 from cubicweb.view import TRANSITIONAL_DOCTYPE_NOEXT
    46 from cubicweb.web import (INTERNAL_FIELD_VALUE, LOGGER, NothingToEdit,
    47 from cubicweb.web import (INTERNAL_FIELD_VALUE, LOGGER, NothingToEdit,
    80         value = [value]
    81         value = [value]
    81     return [v for v in value if v != INTERNAL_FIELD_VALUE]
    82     return [v for v in value if v != INTERNAL_FIELD_VALUE]
    82 
    83 
    83 
    84 
    84 
    85 
    85 class CubicWebRequestBase(DBAPIRequest):
    86 class _CubicWebRequestBase(RequestSessionBase):
    86     """abstract HTTP request, should be extended according to the HTTP backend
    87     """abstract HTTP request, should be extended according to the HTTP backend
    87     Immutable attributes that describe the received query and generic configuration
    88     Immutable attributes that describe the received query and generic configuration
    88     """
    89     """
    89     ajax_request = False # to be set to True by ajax controllers
    90     ajax_request = False # to be set to True by ajax controllers
    90 
    91 
    92         """
    93         """
    93         :vreg: Vregistry,
    94         :vreg: Vregistry,
    94         :https: boolean, s this a https request
    95         :https: boolean, s this a https request
    95         :form: Forms value
    96         :form: Forms value
    96         """
    97         """
    97         super(CubicWebRequestBase, self).__init__(vreg)
    98         super(_CubicWebRequestBase, self).__init__(vreg)
    98         #: (Boolean) Is this an https request.
    99         #: (Boolean) Is this an https request.
    99         self.https = https
   100         self.https = https
   100         #: User interface property (vary with https) (see :ref:`uiprops`)
   101         #: User interface property (vary with https) (see :ref:`uiprops`)
   101         self.uiprops = None
   102         self.uiprops = None
   102         #: url for serving datadir (vary with https) (see :ref:`resources`)
   103         #: url for serving datadir (vary with https) (see :ref:`resources`)
   180             secure = self.https
   181             secure = self.https
   181         base_url = None
   182         base_url = None
   182         if secure:
   183         if secure:
   183             base_url = self.vreg.config.get('https-url')
   184             base_url = self.vreg.config.get('https-url')
   184         if base_url is None:
   185         if base_url is None:
   185             base_url = super(CubicWebRequestBase, self).base_url()
   186             base_url = super(_CubicWebRequestBase, self).base_url()
   186         return base_url
   187         return base_url
   187 
   188 
   188     @property
   189     @property
   189     def authmode(self):
   190     def authmode(self):
   190         """Authentification mode of the instance
   191         """Authentification mode of the instance
   216         varmaker = self.get_page_data('rql_varmaker')
   217         varmaker = self.get_page_data('rql_varmaker')
   217         if varmaker is None:
   218         if varmaker is None:
   218             varmaker = rqlvar_maker()
   219             varmaker = rqlvar_maker()
   219             self.set_page_data('rql_varmaker', varmaker)
   220             self.set_page_data('rql_varmaker', varmaker)
   220         return varmaker
   221         return varmaker
   221 
       
   222     def set_session(self, session):
       
   223         """method called by the session handler when the user is authenticated
       
   224         or an anonymous connection is open
       
   225         """
       
   226         super(CubicWebRequestBase, self).set_session(session)
       
   227         # set request language
       
   228         user_lang = self.user.properties.get('ui.language')
       
   229         if user_lang is not None:
       
   230             lang = self.vreg.typed_value('ui.language', user_lang)
       
   231             self.set_language(lang)
       
   232 
   222 
   233     # input form parameters management ########################################
   223     # input form parameters management ########################################
   234 
   224 
   235     # common form parameters which should be protected against html values
   225     # common form parameters which should be protected against html values
   236     # XXX can't add 'eid' for instance since it may be multivalued
   226     # XXX can't add 'eid' for instance since it may be multivalued
   734             method = 'view'
   724             method = 'view'
   735             if (self.from_controller() == 'view'
   725             if (self.from_controller() == 'view'
   736                 and not '_restpath' in kwargs):
   726                 and not '_restpath' in kwargs):
   737                 method = self.relative_path(includeparams=False) or 'view'
   727                 method = self.relative_path(includeparams=False) or 'view'
   738             args = (method,)
   728             args = (method,)
   739         return super(CubicWebRequestBase, self).build_url(*args, **kwargs)
   729         return super(_CubicWebRequestBase, self).build_url(*args, **kwargs)
   740 
   730 
   741     def url(self, includeparams=True):
   731     def url(self, includeparams=True):
   742         """return currently accessed url"""
   732         """return currently accessed url"""
   743         return self.base_url() + self.relative_path(includeparams)
   733         return self.base_url() + self.relative_path(includeparams)
   744 
   734 
   991         except KeyError:
   981         except KeyError:
   992             if default is _MARKER:
   982             if default is _MARKER:
   993                 raise
   983                 raise
   994             return default
   984             return default
   995 
   985 
       
   986 class DBAPICubicWebRequestBase(_CubicWebRequestBase, DBAPIRequest):
       
   987 
       
   988     def set_session(self, session):
       
   989         """method called by the session handler when the user is authenticated
       
   990         or an anonymous connection is open
       
   991         """
       
   992         super(CubicWebRequestBase, self).set_session(session)
       
   993         # set request language
       
   994         user_lang = self.user.properties.get('ui.language')
       
   995         if user_lang is not None:
       
   996             lang = self.vreg.typed_value('ui.language', user_lang)
       
   997             self.set_language(lang)
       
   998 
       
   999 
       
  1000 
       
  1001 def _cnx_func(name):
       
  1002     def proxy(req, *args, **kwargs):
       
  1003         return getattr(req.cnx, name)(*args, **kwargs)
       
  1004     return proxy
       
  1005 
       
  1006 
       
  1007 class ConnectionCubicWebRequestBase(_CubicWebRequestBase):
       
  1008 
       
  1009     def __init__(self, vreg, https=False, form=None, headers={}):
       
  1010         """"""
       
  1011         self.cnx = None
       
  1012         self.session = None
       
  1013         self.vreg = vreg
       
  1014         try:
       
  1015             # no vreg or config which doesn't handle translations
       
  1016             self.translations = vreg.config.translations
       
  1017         except AttributeError:
       
  1018             self.translations = {}
       
  1019         super(ConnectionCubicWebRequestBase, self).__init__(vreg, https=https,
       
  1020                                                        form=form, headers=headers)
       
  1021         from cubicweb.dbapi import DBAPISession, _NeedAuthAccessMock
       
  1022         self.session = DBAPISession(None)
       
  1023         self.cnx = self.user = _NeedAuthAccessMock()
       
  1024         #: cache entities built during the request
       
  1025         self._eid_cache = {}
       
  1026 
       
  1027     def set_cnx(self, cnx):
       
  1028         self.cnx = cnx
       
  1029         self.session = cnx._session
       
  1030         self._set_user(cnx.user)
       
  1031         # set user language
       
  1032         user_lang = self.user.properties.get('ui.language')
       
  1033         if user_lang is not None:
       
  1034             lang = self.vreg.typed_value('ui.language', user_lang)
       
  1035             self.set_language(lang)
       
  1036 
       
  1037 
       
  1038     def execute(self, *args, **kwargs):
       
  1039         rset = self.cnx.execute(*args, **kwargs)
       
  1040         rset.req = self
       
  1041         return rset
       
  1042 
       
  1043     def set_default_language(self, vreg):
       
  1044         # XXX copy from dbapi
       
  1045         try:
       
  1046             lang = vreg.property_value('ui.language')
       
  1047         except Exception: # property may not be registered
       
  1048             lang = 'en'
       
  1049         try:
       
  1050             self.set_language(lang)
       
  1051         except KeyError:
       
  1052             # this occurs usually during test execution
       
  1053             self._ = self.__ = unicode
       
  1054             self.pgettext = lambda x, y: unicode(y)
       
  1055 
       
  1056     describe = _cnx_func('describe')
       
  1057     source_defs = _cnx_func('source_defs')
       
  1058     get_shared_data = _cnx_func('get_shared_data')
       
  1059     set_shared_data = _cnx_func('set_shared_data')
       
  1060 
       
  1061     # server-side service call #################################################
       
  1062 
       
  1063     def call_service(self, regid, **kwargs):
       
  1064         return self.cnx.call_service(regid, **kwargs)
       
  1065 
       
  1066     # entities cache management ###############################################
       
  1067 
       
  1068     def entity_cache(self, eid):
       
  1069         return self._eid_cache[eid]
       
  1070 
       
  1071     def set_entity_cache(self, entity):
       
  1072         self._eid_cache[entity.eid] = entity
       
  1073 
       
  1074     def cached_entities(self):
       
  1075         return self._eid_cache.values()
       
  1076 
       
  1077     def drop_entity_cache(self, eid=None):
       
  1078         if eid is None:
       
  1079             self._eid_cache = {}
       
  1080         else:
       
  1081             del self._eid_cache[eid]
       
  1082 
       
  1083 
       
  1084 
       
  1085 CubicWebRequestBase = DBAPICubicWebRequestBase
   996 
  1086 
   997 
  1087 
   998 ## HTTP-accept parsers / utilies ##############################################
  1088 ## HTTP-accept parsers / utilies ##############################################
   999 def _mimetype_sort_key(accept_info):
  1089 def _mimetype_sort_key(accept_info):
  1000     """accepted mimetypes must be sorted by :
  1090     """accepted mimetypes must be sorted by :
  1089     'accept': (_mimetype_parser, _mimetype_sort_key),
  1179     'accept': (_mimetype_parser, _mimetype_sort_key),
  1090     'accept-charset': (None, _charset_sort_key),
  1180     'accept-charset': (None, _charset_sort_key),
  1091     }
  1181     }
  1092 
  1182 
  1093 from cubicweb import set_log_methods
  1183 from cubicweb import set_log_methods
  1094 set_log_methods(CubicWebRequestBase, LOGGER)
  1184 set_log_methods(_CubicWebRequestBase, LOGGER)