src/ztfy/utils/property.py
branchZTK-1.1
changeset 270 edb444bb5408
parent 186 28ecb13e485c
equal deleted inserted replaced
269:0b0004edfba6 270:edb444bb5408
    67         return result
    67         return result
    68 
    68 
    69 
    69 
    70 _marker = object()
    70 _marker = object()
    71 
    71 
    72 class request_property(object):
    72 def request_property(key):
    73     """Define a request cached property"""
    73     """Define a method decorator used to store result into request's annotations
    74 
    74 
    75     def __init__(self, fget, key=None):
    75     `key` is a required argument; if None, the key will be the method's object
    76         self.fget = fget
    76     """
    77         if key is None:
       
    78             key = "%s.%s" % (fget.__module__, fget.__name__)
       
    79         self.key = key
       
    80 
    77 
    81     def __get__(self, obj, cls):
    78     def request_decorator(func):
    82         if obj is None:
    79         def wrapper(obj, key, *args, **kwargs):
    83             return self
    80             request = queryRequest()
    84         request = queryRequest()
    81             if callable(key):
    85         data = getRequestData(self.key, request, _marker)
    82                 key = key(obj)
    86         if data is _marker:
    83             if not key:
    87             data = self.fget(obj)
    84                 key = '{0!r}'.format(obj)
    88             setRequestData(self.key, data, request)
    85             data = getRequestData(key, request, _marker)
    89         return data
    86             if data is _marker:
       
    87                 data = func
       
    88                 if callable(data):
       
    89                     data = data(obj, *args, **kwargs)
       
    90                 setRequestData(key, data, request)
       
    91             return data
       
    92         return lambda x: wrapper(x, key=key)
       
    93 
       
    94     return request_decorator
    90 
    95 
    91 
    96 
    92 class session_property(object):
    97 class session_property(object):
    93     """Define a property for which computed value is stored into session"""
    98     """Define a property for which computed value is stored into session"""
    94 
    99