5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
6 :license: Library General Public License version 2 - http://www.gnu.org/licenses |
6 :license: Library General Public License version 2 - http://www.gnu.org/licenses |
7 """ |
7 """ |
8 __docformat__ = "restructuredtext en" |
8 __docformat__ = "restructuredtext en" |
9 |
9 |
10 from datetime import time |
10 from datetime import time, datetime, timedelta |
11 |
11 |
12 from logilab.common.decorators import cached |
12 from logilab.common.decorators import cached |
13 |
13 |
14 from cubicweb import Unauthorized, typed_eid |
14 from cubicweb import Unauthorized, typed_eid |
15 from cubicweb.rset import ResultSet |
15 from cubicweb.rset import ResultSet |
16 from cubicweb.utils import ustrftime, strptime, todate, todatetime |
16 from cubicweb.utils import ustrftime, strptime, todate, todatetime |
|
17 |
|
18 ONESECOND = timedelta(0, 1, 0) |
|
19 CACHE_REGISTRY = {} |
|
20 |
|
21 |
|
22 class Cache(dict): |
|
23 def __init__(self): |
|
24 super(Cache, self).__init__() |
|
25 _now = datetime.now() |
|
26 self.cache_creation_date = _now |
|
27 self.latest_cache_lookup = _now |
|
28 |
17 |
29 |
18 class RequestSessionBase(object): |
30 class RequestSessionBase(object): |
19 """base class containing stuff shared by server session and web request |
31 """base class containing stuff shared by server session and web request |
20 """ |
32 """ |
21 def __init__(self, vreg): |
33 def __init__(self, vreg): |
86 def ensure_ro_rql(self, rql): |
98 def ensure_ro_rql(self, rql): |
87 """raise an exception if the given rql is not a select query""" |
99 """raise an exception if the given rql is not a select query""" |
88 first = rql.split(' ', 1)[0].lower() |
100 first = rql.split(' ', 1)[0].lower() |
89 if first in ('insert', 'set', 'delete'): |
101 if first in ('insert', 'set', 'delete'): |
90 raise Unauthorized(self._('only select queries are authorized')) |
102 raise Unauthorized(self._('only select queries are authorized')) |
|
103 |
|
104 def get_cache(self, cachename): |
|
105 """ |
|
106 NOTE: cachename should be dotted names as in : |
|
107 - cubicweb.mycache |
|
108 - cubes.blog.mycache |
|
109 - etc. |
|
110 """ |
|
111 if cachename in CACHE_REGISTRY: |
|
112 cache = CACHE_REGISTRY[cachename] |
|
113 else: |
|
114 cache = CACHE_REGISTRY[cachename] = Cache() |
|
115 _now = datetime.now() |
|
116 if _now > cache.latest_cache_lookup + ONESECOND: |
|
117 ecache = self.execute( |
|
118 'Any C,T WHERE C is CWCache, C name %(name)s, C timestamp T', |
|
119 {'name':cachename}).get_entity(0,0) |
|
120 cache.latest_cache_lookup = _now |
|
121 if not ecache.valid(cache.cache_creation_date): |
|
122 cache.clear() |
|
123 cache.cache_creation_date = _now |
|
124 return cache |
91 |
125 |
92 # url generation methods ################################################## |
126 # url generation methods ################################################## |
93 |
127 |
94 def build_url(self, *args, **kwargs): |
128 def build_url(self, *args, **kwargs): |
95 """return an absolute URL using params dictionary key/values as URL |
129 """return an absolute URL using params dictionary key/values as URL |