Created
April 24, 2017 18:12
-
-
Save zidarsk8/8bc363b96b8f0c8aff7ff3c36cb4fce8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/ggrc/access_control/roleable.py b/src/ggrc/access_control/roleable.py | |
index 0cfcab6f5..d25ec631f 100644 | |
--- a/src/ggrc/access_control/roleable.py | |
+++ b/src/ggrc/access_control/roleable.py | |
@@ -42,28 +42,6 @@ class Roleable(object): | |
def access_control_list(self): | |
return self._access_control_list | |
- def _remove_existing(self, existing, values): | |
- """Helper function for removing existing items in acl""" | |
- for value in values: | |
- acr_id = value['ac_role_id'] | |
- person_id = value['person']['id'] | |
- if existing.ac_role_id == acr_id and existing.person_id == person_id: | |
- return | |
- self.access_control_list.remove(existing) | |
- | |
- def _set_value(self, value): | |
- """Helper function for setting value of acl""" | |
- for itm in self.access_control_list: | |
- acr_id = value['ac_role_id'] | |
- person_id = value['person']['id'] | |
- if itm.ac_role_id == acr_id and itm.person_id == person_id: | |
- return | |
- AccessControlList( | |
- object=self, | |
- person_id=value.get('person').get('id'), | |
- ac_role_id=value.get('ac_role_id') | |
- ) | |
- | |
@access_control_list.setter | |
def access_control_list(self, values): | |
"""Setter function for access control list. | |
@@ -74,10 +52,35 @@ class Roleable(object): | |
""" | |
if values is None: | |
return | |
- for existing in self.access_control_list: | |
- self._remove_existing(existing, values) | |
+ | |
+ new_values = { | |
+ (value['ac_role_id'], value['person']['id']) | |
+ for value in values | |
+ } | |
+ old_values = { | |
+ (acl.ac_role_id, acl.person_id) | |
+ for acl in self.access_control_list | |
+ } | |
+ | |
+ self._remove_values(old_values - new_values) | |
+ self._add_values(new_values - old_values) | |
+ | |
+ def _add_values(self, values): | |
+ for ac_role_id, person_id in values: | |
+ AccessControlList( | |
+ object=self, | |
+ person_id=person_id, | |
+ ac_role_id=ac_role_id | |
+ ) | |
+ | |
+ def _remove_values(self, values): | |
+ """""" | |
+ values_map = { | |
+ (acl.ac_role_id, acl.person_id): acl | |
+ for acl in self.access_control_list | |
+ } | |
for value in values: | |
- self._set_value(value) | |
+ self._access_control_list.remove(values_map[value]) | |
@classmethod | |
def eager_query(cls): |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment