web.user.userdecorators

Package web :: Package user :: Module userdecorators |
[hide private]
[frames] | no frames]

# Source Code for Module web.user.userdecorators

     1  import web
     2  from decorators import i18n
     3  from model import User, Action
     4  import types
     5
     6 -def has_permissions(actions=None):
     7      '''
     8      Checks whether the current user (which may well be the anonymous user) has been granted
     9      permission to execute a task related to a given list of actions. The argument can be either
    10      a string with a single action name or a list of strings of action identifiers.
    11
    12      To check these permissions, we retrieve all the roles to which the current user belongs,
    13      and then check if the roles grant the user permissions for the given actions.
    14
    15      Note that if any of the given action names is not defined in the database, an exception will
    16      be raised, because it's a bug that the develop should fix: actions are managed by the plugin
    17      developer and the usage of this decorator.
    18      '''
    19      if actions == None:
    20          actions = []
    21      elif type(actions) is types.StringType:
    22          actions = [actions]
    23      elif type(actions) is not types.ListType:
    24          raise TypeError(_("actions argument must be a string or a list of strings"))
    25
    26      def decorator(actions, f):
    27          def df(*args, **kwargs):
    28              roles = set(User.current().roles)
    29              has_perms = True
    30              for action_name in actions:
    31                  action_obj = web.ctx.orm.query(Action).filter_by(name = action_name).first()
    32                  action_roles = set(action_obj.roles)
    33                  if not action_roles.intersection(roles):
    34                      has_perms = False
    35                      break
    36              if has_perms:
    37                  return f(*args, **kwargs)
    38              else:
    39                  raise web.seeother('/user/login')
    40          return df
    41      return lambda f: decorator(actions, f)
    42
    43
    44 -def authenticated(function):
    45      '''
    46      If the user is authenticated it allows access to the resource, else ir redirect to login page
    47      '''
    48      def decorated(*args, **kwargs):
    49          if web.ctx.session.has_key('loggedin'):
    50              return function(*args, **kwargs)
    51          else:
    52              raise web.seeother('/user/login?next=%s' % web.ctx.path)
    53      return decorated
    54