algebra.py 1.6 KB

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