req.py
changeset 2796 14d2c69e12c4
parent 2792 135580d15d42
child 2798 9c650701cb17
equal deleted inserted replaced
2795:59965167bef3 2796:14d2c69e12c4
     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