src/ztfy/utils/property.py
branchZTK-1.1
changeset 186 28ecb13e485c
parent 148 d3668ecd9137
child 270 edb444bb5408
equal deleted inserted replaced
185:1715bc6df562 186:28ecb13e485c
    21 # import local interfaces
    21 # import local interfaces
    22 
    22 
    23 # import Zope3 packages
    23 # import Zope3 packages
    24 
    24 
    25 # import local packages
    25 # import local packages
       
    26 from ztfy.utils.request import queryRequest, getRequestData, setRequestData
       
    27 from ztfy.utils.session import getSessionData, setSessionData
    26 
    28 
    27 
    29 
    28 class cached(object):
    30 class cached(object):
    29     """Custom property decorator to define a property or function
    31     """Custom property decorator to define a property or function
    30     which is calculated only once
    32     which is calculated only once
    61     def __get__(self, obj, cls):
    63     def __get__(self, obj, cls):
    62         if obj is None:
    64         if obj is None:
    63             return self
    65             return self
    64         obj.__dict__[self.__name__] = result = self.fget(obj)
    66         obj.__dict__[self.__name__] = result = self.fget(obj)
    65         return result
    67         return result
       
    68 
       
    69 
       
    70 _marker = object()
       
    71 
       
    72 class request_property(object):
       
    73     """Define a request cached property"""
       
    74 
       
    75     def __init__(self, fget, key=None):
       
    76         self.fget = fget
       
    77         if key is None:
       
    78             key = "%s.%s" % (fget.__module__, fget.__name__)
       
    79         self.key = key
       
    80 
       
    81     def __get__(self, obj, cls):
       
    82         if obj is None:
       
    83             return self
       
    84         request = queryRequest()
       
    85         data = getRequestData(self.key, request, _marker)
       
    86         if data is _marker:
       
    87             data = self.fget(obj)
       
    88             setRequestData(self.key, data, request)
       
    89         return data
       
    90 
       
    91 
       
    92 class session_property(object):
       
    93     """Define a property for which computed value is stored into session"""
       
    94 
       
    95     def __init__(self, fget, app, key=None):
       
    96         self.fget = fget
       
    97         self.app = app
       
    98         if key is None:
       
    99             key = "%s.%s" % (fget.__module__, fget.__name__)
       
   100         self.key = key
       
   101 
       
   102     def __get__(self, obj, cls):
       
   103         if obj is None:
       
   104             return self
       
   105         request = queryRequest()
       
   106         data = getSessionData(request, self.app, self.key, _marker)
       
   107         if data is _marker:
       
   108             data = self.fget(obj)
       
   109             setSessionData(request, self.app, self.key, data)
       
   110         return data