9 """ |
9 """ |
10 __docformat__ = "restructuredtext en" |
10 __docformat__ = "restructuredtext en" |
11 |
11 |
12 import types |
12 import types |
13 from logging import getLogger |
13 from logging import getLogger |
14 from datetime import datetime, timedelta |
|
15 |
14 |
16 from logilab.common.decorators import classproperty |
15 from logilab.common.decorators import classproperty |
17 from logilab.common.deprecation import deprecated |
16 from logilab.common.deprecation import deprecated |
18 from logilab.common.logging_ext import set_log_methods |
17 from logilab.common.logging_ext import set_log_methods |
19 |
18 |
20 from cubicweb import Unauthorized, NoSelectableObject |
19 from cubicweb import Unauthorized, NoSelectableObject |
21 from cubicweb.utils import UStringIO |
|
22 |
|
23 ONESECOND = timedelta(0, 1, 0) |
|
24 CACHE_REGISTRY = {} |
|
25 |
|
26 |
|
27 class Cache(dict): |
|
28 def __init__(self): |
|
29 super(Cache, self).__init__() |
|
30 _now = datetime.now() |
|
31 self.cache_creation_date = _now |
|
32 self.latest_cache_lookup = _now |
|
33 |
20 |
34 |
21 |
35 # selector base classes and operations ######################################## |
22 # selector base classes and operations ######################################## |
36 |
23 |
37 def objectify_selector(selector_func): |
24 def objectify_selector(selector_func): |
328 self.rset = rset |
315 self.rset = rset |
329 self.row = row |
316 self.row = row |
330 self.col = col |
317 self.col = col |
331 self.extra_kwargs = extra |
318 self.extra_kwargs = extra |
332 |
319 |
333 def get_cache(self, cachename): |
|
334 """ |
|
335 NOTE: cachename should be dotted names as in : |
|
336 - cubicweb.mycache |
|
337 - cubes.blog.mycache |
|
338 - etc. |
|
339 """ |
|
340 if cachename in CACHE_REGISTRY: |
|
341 cache = CACHE_REGISTRY[cachename] |
|
342 else: |
|
343 cache = CACHE_REGISTRY[cachename] = Cache() |
|
344 _now = datetime.now() |
|
345 if _now > cache.latest_cache_lookup + ONESECOND: |
|
346 ecache = self.req.execute('Any C,T WHERE C is CWCache, C name %(name)s, C timestamp T', |
|
347 {'name':cachename}).get_entity(0,0) |
|
348 cache.latest_cache_lookup = _now |
|
349 if not ecache.valid(cache.cache_creation_date): |
|
350 cache.clear() |
|
351 cache.cache_creation_date = _now |
|
352 return cache |
|
353 |
|
354 def propval(self, propid): |
320 def propval(self, propid): |
355 assert self.req |
321 assert self.req |
356 return self.req.property_value(self.propkey(propid)) |
322 return self.req.property_value(self.propkey(propid)) |
357 |
323 |
358 def view(self, __vid, rset=None, __fallback_oid=None, __registry='views', |
324 def view(self, __vid, rset=None, __fallback_oid=None, __registry='views', |
410 |
376 |
411 @deprecated('[3.5] use req.varmaker') |
377 @deprecated('[3.5] use req.varmaker') |
412 def initialize_varmaker(self): |
378 def initialize_varmaker(self): |
413 self.varmaker = self.req.varmaker |
379 self.varmaker = self.req.varmaker |
414 |
380 |
|
381 @deprecated('[3.5] use req.get_cache') |
|
382 def get_cache(self, cachename): |
|
383 return self.req.get_cache(cachename) |
|
384 |
415 @deprecated('[3.5] use rset.limited_rql') |
385 @deprecated('[3.5] use rset.limited_rql') |
416 def limited_rql(self): |
386 def limited_rql(self): |
417 return self.rset.limited_rql() |
387 return self.rset.limited_rql() |
418 |
388 |
419 @deprecated('[3.5] use self.rset.complete_entity(row,col) instead') |
389 @deprecated('[3.5] use self.rset.complete_entity(row,col) instead') |