algebra.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 acls and roles:
  10. raise ValueError(
  11. 'You can not provide both "acls" and "roles" arguments')
  12. if (acls is None) and (roles is None):
  13. raise ValueError(
  14. 'You have to provide either "acls" and "roles" argument')
  15. if roles is not None:
  16. if not key:
  17. raise ValueError('You have to provide "key" argument if '
  18. 'you are passing roles instead of acls')
  19. acls = _roles_acls(key, roles)
  20. for permission, compare in permissions.items():
  21. try:
  22. permission_value = result_acl[permission]
  23. except KeyError:
  24. message = 'Default value for permission "%s" is not provided'
  25. raise ValueError(message % permission)
  26. for acl in acls:
  27. try:
  28. permission_value = compare(permission_value, acl[permission])
  29. except KeyError:
  30. pass
  31. result_acl[permission] = permission_value
  32. return result_acl
  33. # Common comparisions
  34. def greater(a, b):
  35. return a if a > b else b
  36. def greater_or_zero(a, b):
  37. if a == 0:
  38. return a
  39. elif b == 0:
  40. return b
  41. else:
  42. return greater(a, b)
  43. def lower(a, b):
  44. return a if a < b else b
  45. def lower_non_zero(a, b):
  46. if a == 0:
  47. return b
  48. elif b == 0:
  49. return a
  50. else:
  51. return lower(a, b)