Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. import copy
  2.  
  3. from shipit_signoff.util import is_key_present_in_list_of_dicts
  4.  
  5.  
  6. class UnauthorizedUserError(Exception):
  7. def __init__(self, email, group_name, policy):
  8. super().__init__(
  9. '{} (in group "{}") is not allowed to sign off policy {}'.format(
  10. email, group_name, policy))
  11.  
  12.  
  13. class NoSignoffLeftError(Exception):
  14. def __init__(self, email, group_name, policy, missing_signoffs):
  15. super().__init__(
  16. '{} (in group "{}") cannot signoff policy {}. Missing signoff are: {}'.
  17. format(email, group_name, policy, missing_signoffs))
  18.  
  19.  
  20. def check_whether_policy_can_be_signed(email, group_name, policy,
  21. existing_signatures):
  22. is_user_allowed_to_sign = any((_is_group_defined_in_policy(
  23. group_name, policy), _is_email_defined_in_policy(email, policy)))
  24.  
  25. if not is_user_allowed_to_sign:
  26. raise UnauthorizedUserError(email, group_name, policy)
  27.  
  28. can_user_still_sign = any((_are_there_signoffs_left_for_group(
  29. group_name, policy, existing_signatures),
  30. _are_there_signoffs_left_for_email(
  31. email, policy, existing_signatures), ))
  32.  
  33. if not can_user_still_sign:
  34. missing_signoffs = _calculate_missing_signoffs(policy,
  35. existing_signatures)
  36. raise NoSignoffLeftError(email, group_name, policy, missing_signoffs)
  37.  
  38.  
  39. def _is_group_defined_in_policy(group_name, policy):
  40. return is_key_present_in_list_of_dicts(
  41. key=group_name, list_of_dicts=policy)
  42.  
  43.  
  44. def _is_email_defined_in_policy(email, policy):
  45. return is_key_present_in_list_of_dicts(key=email, list_of_dicts=policy)
  46.  
  47.  
  48. def _are_there_signoffs_left_for_group(group_name, policy,
  49. existing_signatures):
  50. return _are_there_signoffs_left_for_key(
  51. key=group_name, policy=policy, existing_signatures=existing_signatures)
  52.  
  53.  
  54. def _are_there_signoffs_left_for_email(email, policy, existing_signatures):
  55. return _are_there_signoffs_left_for_key(
  56. key=email, policy=policy, existing_signatures=existing_signatures)
  57.  
  58.  
  59. def _are_there_signoffs_left_for_key(key, policy, existing_signatures):
  60. missing_signoffs = _calculate_missing_signoffs(policy, existing_signatures)
  61. return any(
  62. signoff_condition.get(key, -1) > 0
  63. for signoff_condition in missing_signoffs)
  64.  
  65.  
  66. def is_sign_off_policy_met(policy, existing_signatures):
  67. missing_signoffs = _calculate_missing_signoffs(policy, existing_signatures)
  68. return any(
  69. _is_signoff_condition_met(condition) for condition in missing_signoffs)
  70.  
  71.  
  72. def _is_signoff_condition_met(signoff_condition):
  73. return all(number_of_signoffs == 0
  74. for number_of_signoffs in signoff_condition.values())
  75.  
  76.  
  77. def _calculate_missing_signoffs(policy, existing_signatures):
  78. missing_signoffs = copy.deepcopy(policy)
  79.  
  80. for signature in existing_signatures:
  81. for email_or_group in (signature.group, signature.email):
  82. for signoff_condition in missing_signoffs:
  83. number_of_signoffs = signoff_condition.get(
  84. email_or_group, None)
  85. if number_of_signoffs is not None:
  86. if number_of_signoffs <= 0:
  87. # TODO use finer error
  88. raise Exception('Too many decrement!')
  89. signoff_condition[email_or_group] = number_of_signoffs - 1
  90.  
  91. return missing_signoffs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement