algebra.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. def _roles_acls(key_name, roles):
  2. acls = []
  3. for role in roles:
  4. role_permissions = role.permissions.get(key_name)
  5. if role_permissions:
  6. acls.append(role_permissions)
  7. return acls
  8. def sum_acls(result_acl, acls=None, roles=None, key=None, **permissions):
  9. if bool(roles) != bool(key):
  10. if key:
  11. raise ValueError(
  12. 'You have provided "key" but omited "roles" argument')
  13. else:
  14. raise ValueError(
  15. 'You have provided "roles" but omited "key" argument')
  16. if acls and roles:
  17. raise ValueError(
  18. 'You can not provide both "acls" and "roles" arguments')
  19. if roles:
  20. acls = _roles_acls(key, roles)
  21. for permission, compare in permissions.items():
  22. try:
  23. permission_value = result_acl[permission]
  24. except KeyError:
  25. message = 'Default value for permission "%s" is not provided'
  26. raise ValueError(message % permission)
  27. for acl in acls:
  28. try:
  29. permission_value = compare(permission_value, acl[permission])
  30. except KeyError:
  31. pass
  32. result_acl[permission] = permission_value
  33. return result_acl
  34. # Common comparisions
  35. def greater(a, b):
  36. return a if a > b else b
  37. def greater_or_zero(a, b):
  38. if a == 0:
  39. return a
  40. elif b == 0:
  41. return b
  42. else:
  43. return greater(a, b)
  44. def lower(a, b):
  45. return a if a < b else b