Change the deletion behaviour of scope and assignment when deleting an intra-extensio... 10/1510/1
authorasteroide <thomas.duval@orange.com>
Fri, 11 Sep 2015 08:55:17 +0000 (10:55 +0200)
committerasteroide <thomas.duval@orange.com>
Fri, 11 Sep 2015 08:55:17 +0000 (10:55 +0200)
Change-Id: I8451eb583052327e97ff06097e5f6e6baaa7619b

keystone-moon/keystone/contrib/moon/backends/sql.py
keystone-moon/keystone/contrib/moon/core.py

index f08038a..9f4beb6 100644 (file)
@@ -667,9 +667,14 @@ class IntraExtensionConnector(IntraExtensionDriver):
     def del_subject_scope(self, intra_extension_id, subject_category_id, subject_scope_id):
         with sql.transaction() as session:
             query = session.query(SubjectScope)
-            query = query.filter_by(intra_extension_id=intra_extension_id, subject_category_id=subject_category_id, id=subject_scope_id)
-            ref = query.first()
-            session.delete(ref)
+            if not subject_category_id or not subject_scope_id:
+                query = query.filter_by(intra_extension_id=intra_extension_id)
+                for ref in query.all():
+                    session.delete(ref)
+            else:
+                query = query.filter_by(intra_extension_id=intra_extension_id, subject_category_id=subject_category_id, id=subject_scope_id)
+                ref = query.first()
+                session.delete(ref)
 
     # Getter and Setter for object_category_scope
 
@@ -706,9 +711,14 @@ class IntraExtensionConnector(IntraExtensionDriver):
     def del_object_scope(self, intra_extension_id, object_category_id, object_scope_id):
         with sql.transaction() as session:
             query = session.query(ObjectScope)
-            query = query.filter_by(intra_extension_id=intra_extension_id, object_category_id=object_category_id, id=object_scope_id)
-            ref = query.first()
-            session.delete(ref)
+            if not object_category_id or not object_scope_id:
+                query = query.filter_by(intra_extension_id=intra_extension_id)
+                for ref in query.all():
+                    session.delete(ref)
+            else:
+                query = query.filter_by(intra_extension_id=intra_extension_id, object_category_id=object_category_id, id=object_scope_id)
+                ref = query.first()
+                session.delete(ref)
 
     # Getter and Setter for action_scope
  
@@ -745,17 +755,27 @@ class IntraExtensionConnector(IntraExtensionDriver):
     def del_action_scope(self, intra_extension_id, action_category_id, action_scope_id):
         with sql.transaction() as session:
             query = session.query(ActionScope)
-            query = query.filter_by(intra_extension_id=intra_extension_id, action_category_id=action_category_id, id=action_scope_id)
-            ref = query.first()
-            session.delete(ref)
+            if not action_category_id or not action_scope_id:
+                query = query.filter_by(intra_extension_id=intra_extension_id)
+                for ref in query.all():
+                    session.delete(ref)
+            else:
+                query = query.filter_by(intra_extension_id=intra_extension_id, action_category_id=action_category_id, id=action_scope_id)
+                ref = query.first()
+                session.delete(ref)
 
     # Getter and Setter for subject_category_assignment
 
     def get_subject_assignment_list(self, intra_extension_id, subject_id, subject_category_id):
         with sql.transaction() as session:
             query = session.query(SubjectAssignment)
-            query = query.filter_by(intra_extension_id=intra_extension_id, subject_id=subject_id, subject_category_id=subject_category_id)
-            ref = query.first()
+            if not subject_id or not subject_category_id or not subject_category_id:
+                query = query.filter_by(intra_extension_id=intra_extension_id)
+                ref = query.all()
+                return ref
+            else:
+                query = query.filter_by(intra_extension_id=intra_extension_id, subject_id=subject_id, subject_category_id=subject_category_id)
+                ref = query.first()
             if not ref:
                 return list()
             return list(ref.subject_assignment)
@@ -791,6 +811,11 @@ class IntraExtensionConnector(IntraExtensionDriver):
         return self.set_subject_assignment_list(intra_extension_id, subject_id, subject_category_id, new_subject_assignment_list)
 
     def del_subject_assignment(self, intra_extension_id, subject_id, subject_category_id, subject_scope_id):
+        if not subject_id or not subject_category_id or not subject_category_id:
+            with sql.transaction() as session:
+                for ref in self.get_subject_assignment_list(intra_extension_id, None, None):
+                    session.delete(ref)
+                return
         new_subject_assignment_list = self.get_subject_assignment_list(intra_extension_id, subject_id, subject_category_id)
         new_subject_assignment_list.remove(subject_scope_id)
         return self.set_subject_assignment_list(intra_extension_id, subject_id, subject_category_id, new_subject_assignment_list)
@@ -800,8 +825,13 @@ class IntraExtensionConnector(IntraExtensionDriver):
     def get_object_assignment_list(self, intra_extension_id, object_id, object_category_id):
         with sql.transaction() as session:
             query = session.query(ObjectAssignment)
-            query = query.filter_by(intra_extension_id=intra_extension_id, object_id=object_id, object_category_id=object_category_id)
-            ref = query.first()
+            if not object_id or not object_category_id or not object_category_id:
+                query = query.filter_by(intra_extension_id=intra_extension_id)
+                ref = query.all()
+                return ref
+            else:
+                query = query.filter_by(intra_extension_id=intra_extension_id, object_id=object_id, object_category_id=object_category_id)
+                ref = query.first()
             if not ref:
                 return list()
             return list(ref.object_assignment)
@@ -836,6 +866,11 @@ class IntraExtensionConnector(IntraExtensionDriver):
         return self.set_object_assignment_list(intra_extension_id, object_id, object_category_id, new_object_assignment_list)
 
     def del_object_assignment(self, intra_extension_id, object_id, object_category_id, object_scope_id):
+        if not object_id or not object_category_id or not object_category_id:
+            with sql.transaction() as session:
+                for ref in self.get_object_assignment_list(intra_extension_id, None, None):
+                    session.delete(ref)
+                return
         new_object_assignment_list = self.get_object_assignment_list(intra_extension_id, object_id, object_category_id)
         new_object_assignment_list.remove(object_scope_id)
         return self.set_object_assignment_list(intra_extension_id, object_id, object_category_id, new_object_assignment_list)
@@ -845,8 +880,13 @@ class IntraExtensionConnector(IntraExtensionDriver):
     def get_action_assignment_list(self, intra_extension_id, action_id, action_category_id):
         with sql.transaction() as session:
             query = session.query(ActionAssignment)
-            query = query.filter_by(intra_extension_id=intra_extension_id, action_id=action_id, action_category_id=action_category_id)
-            ref = query.first()
+            if not action_id or not action_category_id or not action_category_id:
+                query = query.filter_by(intra_extension_id=intra_extension_id)
+                ref = query.all()
+                return ref
+            else:
+                query = query.filter_by(intra_extension_id=intra_extension_id, action_id=action_id, action_category_id=action_category_id)
+                ref = query.first()
             if not ref:
                 return list()
             return list(ref.action_assignment)
@@ -881,6 +921,11 @@ class IntraExtensionConnector(IntraExtensionDriver):
         return self.set_action_assignment_list(intra_extension_id, action_id, action_category_id, new_action_assignment_list)
 
     def del_action_assignment(self, intra_extension_id, action_id, action_category_id, action_scope_id):
+        if not action_id or not action_category_id or not action_category_id:
+            with sql.transaction() as session:
+                for ref in self.get_action_assignment_list(intra_extension_id, None, None):
+                    session.delete(ref)
+                return
         new_action_assignment_list = self.get_action_assignment_list(intra_extension_id, action_id, action_category_id)
         new_action_assignment_list.remove(action_scope_id)
         return self.set_action_assignment_list(intra_extension_id, action_id, action_category_id, new_action_assignment_list)
@@ -983,12 +1028,13 @@ class IntraExtensionConnector(IntraExtensionDriver):
             )
             if not ref:
                 session.add(new_ref)
+                ref = new_ref
             else:
                 for attr in Rule.attributes:
                     if attr != 'id':
                         setattr(ref, attr, getattr(new_ref, attr))
             session.flush()
-            return {rule_id: self.get_rules_dict(intra_extension_id, sub_meta_rule_id)[rule_id]}
+            return {rule_id: ref.rule}
 
     def del_rule(self, intra_extension_id, sub_meta_rule_id, rule_id):
         with sql.transaction() as session:
index 8916e2b..86aadc8 100644 (file)
@@ -850,6 +850,7 @@ class IntraExtensionManager(manager.Manager):
     @enforce(("read", "write"), "intra_extensions")
     def load_intra_extension_dict(self, user_id, intra_extension_dict):
         ie_dict = dict()
+        LOG.debug("load_intra_extension_dict {}".format(intra_extension_dict))
         ie_dict['id'] = uuid4().hex
         ie_dict["name"] = filter_input(intra_extension_dict["name"])
         ie_dict["model"] = filter_input(intra_extension_dict["model"])
@@ -926,27 +927,27 @@ class IntraExtensionManager(manager.Manager):
             self.driver.del_sub_meta_rule(intra_extension_id, sub_meta_rule_id)
         for aggregation_algorithm_id in self.driver.get_aggregation_algorithm_dict(intra_extension_id):
             self.driver.del_aggregation_algorithm(intra_extension_id, aggregation_algorithm_id)
+        for subject_id in self.driver.get_subjects_dict(intra_extension_id):
+            for subject_category_id in self.driver.get_subject_categories_dict(intra_extension_id):
+                self.driver.del_subject_scope(intra_extension_id, None, None)
+                self.driver.del_subject_assignment(intra_extension_id, None, None, None)
+                self.driver.del_subject_category(intra_extension_id, subject_category_id)
+        for object_id in self.driver.get_objects_dict(intra_extension_id):
+            for object_category_id in self.driver.get_object_categories_dict(intra_extension_id):
+                self.driver.del_object_scope(intra_extension_id, None, None)
+                self.driver.del_object_assignment(intra_extension_id, None, None, None)
+                self.driver.del_object_category(intra_extension_id, object_category_id)
+        for action_id in self.driver.get_actions_dict(intra_extension_id):
+            for action_category_id in self.driver.get_action_categories_dict(intra_extension_id):
+                self.driver.del_action_scope(intra_extension_id, None, None)
+                self.driver.del_action_assignment(intra_extension_id, None, None, None)
+                self.driver.del_action_category(intra_extension_id, action_category_id)
         for subject_id in self.driver.get_subjects_dict(intra_extension_id):
             self.driver.del_subject(intra_extension_id, subject_id)
         for object_id in self.driver.get_objects_dict(intra_extension_id):
             self.driver.del_object(intra_extension_id, object_id)
         for action_id in self.driver.get_actions_dict(intra_extension_id):
             self.driver.del_action(intra_extension_id, action_id)
-        for subject_category_id in self.driver.get_subject_categories_dict(intra_extension_id):
-            for subject_scope_id in self.driver.get_subject_assignment_list(intra_extension_id, subject_id, subject_category_id):
-                self.driver.del_subject_assignment(intra_extension_id, subject_id, subject_category_id, subject_scope_id)
-                self.driver.del_subject_scope(intra_extension_id, subject_category_id, subject_scope_id)
-            self.driver.del_subject_category(intra_extension_id, subject_category_id)
-        for object_category_id in self.driver.get_object_categories_dict(intra_extension_id):
-            for object_scope_id in self.driver.get_object_assignment_list(intra_extension_id, object_id, object_category_id):
-                self.driver.del_object_assignment(intra_extension_id, object_id, object_category_id, object_scope_id)
-                self.driver.del_object_scope(intra_extension_id, object_category_id, object_scope_id)
-            self.driver.del_object_category(intra_extension_id, object_category_id)
-        for action_category_id in self.driver.get_action_categories_dict(intra_extension_id):
-            for action_scope_id in self.driver.get_action_assignment_list(intra_extension_id, action_id, action_category_id):
-                self.driver.del_action_assignment(intra_extension_id, action_id, action_category_id, action_scope_id)
-                self.driver.del_action_scope(intra_extension_id, action_category_id, action_scope_id)
-            self.driver.del_action_category(intra_extension_id, action_category_id)
         return self.driver.del_intra_extension(intra_extension_id)
 
     @enforce(("read", "write"), "intra_extensions")