src/pyams_form/security.py
changeset 227 2ff78f851351
parent 204 c435de184bda
equal deleted inserted replaced
226:89e80c486d52 227:2ff78f851351
    19 from pyams_form.interfaces.form import IFormContextPermissionChecker, IFormSecurityContext
    19 from pyams_form.interfaces.form import IFormContextPermissionChecker, IFormSecurityContext
    20 
    20 
    21 __docformat__ = 'restructuredtext'
    21 __docformat__ = 'restructuredtext'
    22 
    22 
    23 
    23 
    24 def get_edit_permission(request, context=None):
    24 def get_checker(request, context=None, view=None, action=''):
    25     """Get required edit permission"""
    25     """Get permission checker"""
       
    26     registry = request.registry
    26     if context is None:
    27     if context is None:
    27         context = request.context
    28         context = request.context
    28     registry = request.registry
    29     checker = registry.queryMultiAdapter((context, request, view),
    29     checker = registry.queryMultiAdapter((context, request), IFormContextPermissionChecker)
    30                                          IFormContextPermissionChecker,
       
    31                                          name=action) if view is not None else None
    30     if checker is None:
    32     if checker is None:
    31         checker = registry.queryAdapter(context, IFormContextPermissionChecker)
    33         checker = registry.queryMultiAdapter((context, request),
       
    34                                              IFormContextPermissionChecker,
       
    35                                              name=action)
       
    36     if checker is None:
       
    37         checker = registry.queryAdapter(context, IFormContextPermissionChecker,
       
    38                                         name=action)
       
    39     return checker
       
    40 
       
    41 
       
    42 def get_edit_permission(request, context=None, action=''):
       
    43     """Get required edit permission"""
       
    44     checker = get_checker(request, context, action=action)
       
    45     if action and (checker is None):
       
    46         checker = get_checker(request, context, action='')
    32     if checker is not None:
    47     if checker is not None:
    33         return checker.edit_permission
    48         return checker.edit_permission
    34     return None
    49     return None
    35 
    50 
    36 
    51 
    48 
    63 
    49     This class is a form mixin class which should be used for forms protected by a
    64     This class is a form mixin class which should be used for forms protected by a
    50     security context.
    65     security context.
    51     """
    66     """
    52 
    67 
       
    68     action_type = ''  # default action
       
    69 
    53     @reify
    70     @reify
    54     def permission(self):
    71     def permission(self):
    55         """This permission is required to be able to edit the form context"""
    72         """This permission is required to be able to edit the form context"""
    56         request = self.request  # pylint: disable=no-member
    73         request = self.request  # pylint: disable=no-member
    57         registry = request.registry
       
    58         checker = None
       
    59         context = IFormSecurityContext(self, None)
    74         context = IFormSecurityContext(self, None)
    60         if context is None:
    75         if context is None:
    61             context = self.context  # pylint: disable=no-member
    76             context = self.context  # pylint: disable=no-member
    62         view = getattr(self, '__parent__', None) or \
    77         view = getattr(self, '__parent__', None) or \
    63             getattr(self, 'view', None) or \
    78             getattr(self, 'view', None) or \
    64             getattr(self, 'table', None)
    79             getattr(self, 'table', None)
    65         if view is not None:
    80         checker = get_checker(request, context, view, action=self.action_type)
    66             checker = registry.queryMultiAdapter((context, request, view),
    81         if (checker is None) and self.action_type:
    67                                                  IFormContextPermissionChecker)
    82             checker = get_checker(request, context, action='')
    68         if checker is None:
       
    69             checker = registry.queryAdapter(context, IFormContextPermissionChecker)
       
    70         if checker is not None:
    83         if checker is not None:
    71             return checker.edit_permission
    84             return checker.edit_permission
    72         return None
    85         return None