src/pyams_utils/session.py
changeset 380 c062ab4db6cd
parent 292 b338586588ad
child 408 cf2304af0fab
equal deleted inserted replaced
379:07fe5bb08599 380:c062ab4db6cd
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 
    12 
       
    13 """PyAMS_utils session module
       
    14 
       
    15 This helper module is used to add a "session_property" method decorator, which can be used to
       
    16 store method result into user's session.
       
    17 
       
    18 It also adds to function to get and set session data.
       
    19 """
       
    20 
    13 __docformat__ = 'restructuredtext'
    21 __docformat__ = 'restructuredtext'
    14 
    22 
    15 
       
    16 # import standard library
       
    17 
       
    18 # import interfaces
       
    19 
       
    20 # import packages
       
    21 from pyams_utils.request import check_request
    23 from pyams_utils.request import check_request
    22 
       
    23 
       
    24 _marker = object()
       
    25 
       
    26 
       
    27 def session_property(app, key=None, prefix=None):
       
    28     """Define a method decorator used to store result into request's session
       
    29 
       
    30     If no request is currently running, a new one is created.
       
    31 
       
    32     :param str app: application identifier used to prefix session keys
       
    33     :param str key: session's value key; if *None*, the key will be the method's object; if *key* is a callable
       
    34         object, il will be called to get the actual session key
       
    35     :param prefix: str; prefix to use for session key; if *None*, the prefix will be the property name
       
    36     """
       
    37 
       
    38     def session_decorator(func):
       
    39 
       
    40         def wrapper(obj, app, key, *args, **kwargs):
       
    41             request = check_request()
       
    42             if callable(key):
       
    43                 key = key(obj, *args, **kwargs)
       
    44             if not key:
       
    45                 key = '{1}::{0!r}'.format(obj, prefix or func.__name__)
       
    46             data = get_session_data(request, app, key, _marker)
       
    47             if data is _marker:
       
    48                 data = func
       
    49                 if callable(data):
       
    50                     data = data(obj, *args, **kwargs)
       
    51                 set_session_data(request, app, key, data)
       
    52             return data
       
    53 
       
    54         return lambda x, *args, **kwargs: wrapper(x, app, key, *args, **kwargs)
       
    55 
       
    56     return session_decorator
       
    57 
    24 
    58 
    25 
    59 def get_session_data(request, app, key, default=None):
    26 def get_session_data(request, app, key, default=None):
    60     """Get data associated with current user session
    27     """Get data associated with current user session
    61 
    28 
    95             value = {'key1': 'value1', 'key2': 'value2'}
    62             value = {'key1': 'value1', 'key2': 'value2'}
    96             set_session_data(request, APPLICATION_KEY, SESSION_KEY, value)
    63             set_session_data(request, APPLICATION_KEY, SESSION_KEY, value)
    97     """
    64     """
    98     session = request.session
    65     session = request.session
    99     session['{0}::{1}'.format(app, key)] = value
    66     session['{0}::{1}'.format(app, key)] = value
       
    67 
       
    68 
       
    69 _marker = object()
       
    70 
       
    71 
       
    72 def session_property(app, key=None, prefix=None):
       
    73     """Define a method decorator used to store result into request's session
       
    74 
       
    75     If no request is currently running, a new one is created.
       
    76 
       
    77     :param str app: application identifier used to prefix session keys
       
    78     :param str key: session's value key; if *None*, the key will be the method's object; if *key*
       
    79         is a callable object, il will be called to get the actual session key
       
    80     :param prefix: str; prefix to use for session key; if *None*, the prefix will be the property
       
    81         name
       
    82     """
       
    83 
       
    84     def session_decorator(func):
       
    85 
       
    86         def wrapper(obj, app, key, *args, **kwargs):
       
    87             request = check_request()
       
    88             if callable(key):
       
    89                 key = key(obj, *args, **kwargs)
       
    90             if not key:
       
    91                 key = '{1}::{0!r}'.format(obj, prefix or func.__name__)
       
    92             data = get_session_data(request, app, key, _marker)
       
    93             if data is _marker:
       
    94                 data = func
       
    95                 if callable(data):
       
    96                     data = data(obj, *args, **kwargs)
       
    97                 set_session_data(request, app, key, data)
       
    98             return data
       
    99 
       
   100         return lambda x, *args, **kwargs: wrapper(x, app, key, *args, **kwargs)
       
   101 
       
   102     return session_decorator