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, |
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 : |