)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"a6c096ffc1ae7114631601867c1b3de733c795a9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"of manager methods related to effective assignments to"},{"line_number":27,"context_line":"simply call this one rather than duplicate the algorithms"},{"line_number":28,"context_line":"around the assignment backend. In order to ensure those"},{"line_number":29,"context_line":"different usage patterns are tested, a seperate series"},{"line_number":30,"context_line":"of patches follow this to add manager-level testing of"},{"line_number":31,"context_line":"this new assignment listing capabiliy."},{"line_number":32,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":44,"id":"1a4dcd0f_2adf0c0e","line":29,"updated":"2015-08-06 13:50:18.000000000","message":"^separate","commit_id":"45ff66993c9a1af8a21b206deb587c8f368b4abe"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fef645fcdd439a9214a6ab982653a7608b95f5d4","unresolved":false,"context_lines":[{"line_number":26,"context_line":"of manager methods related to effective assignments to"},{"line_number":27,"context_line":"simply call this one rather than duplicate the algorithms"},{"line_number":28,"context_line":"around the assignment backend. In order to ensure those"},{"line_number":29,"context_line":"different usage patterns are tested, a seperate series"},{"line_number":30,"context_line":"of patches follow this to add manager-level testing of"},{"line_number":31,"context_line":"this new assignment listing capabiliy."},{"line_number":32,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":44,"id":"1a4dcd0f_6fd0b4c9","line":29,"in_reply_to":"1a4dcd0f_2adf0c0e","updated":"2015-08-06 17:53:40.000000000","message":"Done","commit_id":"45ff66993c9a1af8a21b206deb587c8f368b4abe"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"a6c096ffc1ae7114631601867c1b3de733c795a9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"around the assignment backend. In order to ensure those"},{"line_number":29,"context_line":"different usage patterns are tested, a seperate series"},{"line_number":30,"context_line":"of patches follow this to add manager-level testing of"},{"line_number":31,"context_line":"this new assignment listing capabiliy."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Co-Authored-By: Henry Nash \u003chenryn@linux.vnet.ibm.com\u003e"},{"line_number":34,"context_line":"Co-Authored-By: Rodrigo Duarte \u003crodrigods@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":44,"id":"1a4dcd0f_8a1bc0c9","line":31,"updated":"2015-08-06 13:50:18.000000000","message":"^capability","commit_id":"45ff66993c9a1af8a21b206deb587c8f368b4abe"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fef645fcdd439a9214a6ab982653a7608b95f5d4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"around the assignment backend. In order to ensure those"},{"line_number":29,"context_line":"different usage patterns are tested, a seperate series"},{"line_number":30,"context_line":"of patches follow this to add manager-level testing of"},{"line_number":31,"context_line":"this new assignment listing capabiliy."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Co-Authored-By: Henry Nash \u003chenryn@linux.vnet.ibm.com\u003e"},{"line_number":34,"context_line":"Co-Authored-By: Rodrigo Duarte \u003crodrigods@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":44,"id":"1a4dcd0f_8fd3c0d4","line":31,"in_reply_to":"1a4dcd0f_8a1bc0c9","updated":"2015-08-06 17:53:40.000000000","message":"Done","commit_id":"45ff66993c9a1af8a21b206deb587c8f368b4abe"}],"keystone/assignment/backends/ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1c0437503b2ff3cad0ce1dd0ff7ce198e2e0cc39","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                        \u0027group_id\u0027: self.group._dn_to_id(a.group_dn),"},{"line_number":297,"context_line":"                        \u0027project_id\u0027: self.project._dn_to_id(a.project_dn)}"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"                if role_id and assignment[\u0027role_id\u0027] !\u003d role_id:"},{"line_number":300,"context_line":"                    continue"},{"line_number":301,"context_line":"                if user_id and assignment.get(\u0027user_id\u0027) !\u003d user_id:"},{"line_number":302,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_bb2f6a3d","line":299,"updated":"2015-03-02 17:52:11.000000000","message":"How come this doesn\u0027t have \n\n    assignment.get(\u0027role_id\u0027) \n\nlike the other calls?","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cf6c62d8eb71e058e2e8a4ffe201e9903347c023","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                        \u0027group_id\u0027: self.group._dn_to_id(a.group_dn),"},{"line_number":297,"context_line":"                        \u0027project_id\u0027: self.project._dn_to_id(a.project_dn)}"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"                if role_id and assignment[\u0027role_id\u0027] !\u003d role_id:"},{"line_number":300,"context_line":"                    continue"},{"line_number":301,"context_line":"                if user_id and assignment.get(\u0027user_id\u0027) !\u003d user_id:"},{"line_number":302,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_874d9d40","line":299,"in_reply_to":"ba7be1f8_bb2f6a3d","updated":"2015-03-04 01:06:17.000000000","message":"A role assignment always contain i) a \u0027role_id\u0027, ii) \u0027user_id\u0027 or \u0027group_id\u0027 (since we are not sure which one will be in there, we do .get()) and iii) a \u0027domain_id\u0027 or \u0027project_id\u0027 (we know there is a \u0027project_id\u0027 since we don\u0027t have domain_id inside the if statement starting at L286).","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1c0437503b2ff3cad0ce1dd0ff7ce198e2e0cc39","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                    continue"},{"line_number":303,"context_line":"                if group_ids and assignment.get(\u0027group_id\u0027) not in group_ids:"},{"line_number":304,"context_line":"                    continue"},{"line_number":305,"context_line":"                if project_ids and assignment[\u0027project_id\u0027] not in project_ids:"},{"line_number":306,"context_line":"                    continue"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"                role_assignments.append(assignment)"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_7b15f2e3","line":305,"updated":"2015-03-02 17:52:11.000000000","message":"same comment here","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cf6c62d8eb71e058e2e8a4ffe201e9903347c023","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                    continue"},{"line_number":303,"context_line":"                if group_ids and assignment.get(\u0027group_id\u0027) not in group_ids:"},{"line_number":304,"context_line":"                    continue"},{"line_number":305,"context_line":"                if project_ids and assignment[\u0027project_id\u0027] not in project_ids:"},{"line_number":306,"context_line":"                    continue"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"                role_assignments.append(assignment)"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_a748e12d","line":305,"in_reply_to":"ba7be1f8_7b15f2e3","updated":"2015-03-04 01:06:17.000000000","message":"ditto","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1c0437503b2ff3cad0ce1dd0ff7ce198e2e0cc39","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                if group_ids and assignment.get(\u0027group_id\u0027) not in group_ids:"},{"line_number":304,"context_line":"                    continue"},{"line_number":305,"context_line":"                if project_ids and assignment[\u0027project_id\u0027] not in project_ids:"},{"line_number":306,"context_line":"                    continue"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"                role_assignments.append(assignment)"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_dbb41ef4","line":306,"updated":"2015-03-02 17:52:11.000000000","message":"Should this raise any exceptions if certain values don\u0027t get populated in the assignment dictionary?","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cf6c62d8eb71e058e2e8a4ffe201e9903347c023","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                if group_ids and assignment.get(\u0027group_id\u0027) not in group_ids:"},{"line_number":304,"context_line":"                    continue"},{"line_number":305,"context_line":"                if project_ids and assignment[\u0027project_id\u0027] not in project_ids:"},{"line_number":306,"context_line":"                    continue"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"                role_assignments.append(assignment)"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_c70155b0","line":306,"in_reply_to":"ba7be1f8_dbb41ef4","updated":"2015-03-04 01:06:17.000000000","message":"We do not do this in the original implementation.\nHere we are just adding filtering by provided values.","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"5c70cb7050d5ee6acc7d6a7a2ee1b20d1a204878","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                        \u0027group_id\u0027: self.group._dn_to_id(a.group_dn),"},{"line_number":297,"context_line":"                        \u0027project_id\u0027: self.project._dn_to_id(a.project_dn)}"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"                if role_id and assignment[\u0027role_id\u0027] !\u003d role_id:"},{"line_number":300,"context_line":"                    continue"},{"line_number":301,"context_line":"                if user_id and assignment.get(\u0027user_id\u0027) !\u003d user_id:"},{"line_number":302,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a80dd14_f463ca17","line":299,"updated":"2015-03-12 09:01:47.000000000","message":"Did I miss something: why not use LDAP filter?\n\nhttps://confluence.atlassian.com/display/DEV/How+to+Write+LDAP+Search+Filters","commit_id":"05655992679211869d348ebf0887766c6a13ad90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"581feaa1bed11712c4a14d7bc7d3dae73ad182f5","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                        \u0027group_id\u0027: self.group._dn_to_id(a.group_dn),"},{"line_number":297,"context_line":"                        \u0027project_id\u0027: self.project._dn_to_id(a.project_dn)}"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"                if role_id and assignment[\u0027role_id\u0027] !\u003d role_id:"},{"line_number":300,"context_line":"                    continue"},{"line_number":301,"context_line":"                if user_id and assignment.get(\u0027user_id\u0027) !\u003d user_id:"},{"line_number":302,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":32,"id":"da9b358b_e0ee8a8a","line":299,"in_reply_to":"9a80dd14_f463ca17","updated":"2015-03-30 19:22:38.000000000","message":"I think that\u0027s  reasonable suggestion, although perhaps one to consider in a follow on patch....especially as we (I think) are deprecating the ldap support of assignments...","commit_id":"05655992679211869d348ebf0887766c6a13ad90"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"50db4414b4bb72d20ce73e3c7b24b436f046ef42","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                        \u0027group_id\u0027: self.group._dn_to_id(a.group_dn),"},{"line_number":297,"context_line":"                        \u0027project_id\u0027: self.project._dn_to_id(a.project_dn)}"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"                if role_id and assignment[\u0027role_id\u0027] !\u003d role_id:"},{"line_number":300,"context_line":"                    continue"},{"line_number":301,"context_line":"                if user_id and assignment.get(\u0027user_id\u0027) !\u003d user_id:"},{"line_number":302,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_3bdcc445","line":299,"in_reply_to":"da9b358b_e0ee8a8a","updated":"2015-05-26 21:47:00.000000000","message":"I agree it should go in a separate patch, if we are going to fix this.\n\nAnd yes, as far as I know, we are deprecating assignment LDAP support in Liberty.","commit_id":"05655992679211869d348ebf0887766c6a13ad90"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8a119b4969e9f5e850285df6a893c9a3e6fa5b16","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                              inherited_to_projects\u003dNone):"},{"line_number":284,"context_line":"        role_assignments \u003d []"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if not domain_id:"},{"line_number":287,"context_line":"            for a in self.role.list_role_assignments(self.project.tree_dn):"},{"line_number":288,"context_line":"                if isinstance(a, UserRoleAssociation):"},{"line_number":289,"context_line":"                    assignment \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"1a4dcd0f_22b7a8d9","line":286,"updated":"2015-08-04 14:55:55.000000000","message":"It\u0027s better to comment here that LDAP does not support multiple domains, domain id is not supported for assignment filtering.","commit_id":"f4b18d9d8d68e8f9e057e8b332e369a87bcb0fa0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bf8e3498dd941a571e7ee9bd8452a1050ac50cec","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                              inherited_to_projects\u003dNone):"},{"line_number":284,"context_line":"        role_assignments \u003d []"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if not domain_id:"},{"line_number":287,"context_line":"            for a in self.role.list_role_assignments(self.project.tree_dn):"},{"line_number":288,"context_line":"                if isinstance(a, UserRoleAssociation):"},{"line_number":289,"context_line":"                    assignment \u003d {"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a4dcd0f_88d2165b","line":286,"updated":"2015-08-05 17:02:05.000000000","message":"So if you provide a domain_id the expected behavior is the return an empty list?","commit_id":"063faa6e0560e4705f871d2d9fa99f67f00bc631"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"97de836539fb93240ab6b86ec6278edd40f032fa","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                              inherited_to_projects\u003dNone):"},{"line_number":284,"context_line":"        role_assignments \u003d []"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if not domain_id:"},{"line_number":287,"context_line":"            for a in self.role.list_role_assignments(self.project.tree_dn):"},{"line_number":288,"context_line":"                if isinstance(a, UserRoleAssociation):"},{"line_number":289,"context_line":"                    assignment \u003d {"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a4dcd0f_7d3966d6","line":286,"in_reply_to":"1a4dcd0f_51433b42","updated":"2015-08-06 09:43:45.000000000","message":"but why not add some note or comments here?","commit_id":"063faa6e0560e4705f871d2d9fa99f67f00bc631"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3b4b7402bb54dbb4f0949833b67a5af305ea7b56","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                              inherited_to_projects\u003dNone):"},{"line_number":284,"context_line":"        role_assignments \u003d []"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if not domain_id:"},{"line_number":287,"context_line":"            for a in self.role.list_role_assignments(self.project.tree_dn):"},{"line_number":288,"context_line":"                if isinstance(a, UserRoleAssociation):"},{"line_number":289,"context_line":"                    assignment \u003d {"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a4dcd0f_0197a03a","line":286,"in_reply_to":"1a4dcd0f_7d3966d6","updated":"2015-08-06 10:13:37.000000000","message":"Done","commit_id":"063faa6e0560e4705f871d2d9fa99f67f00bc631"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"eb9ddeb50fdb4b792e813a85c9a00ad3d9442665","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                              inherited_to_projects\u003dNone):"},{"line_number":284,"context_line":"        role_assignments \u003d []"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if not domain_id:"},{"line_number":287,"context_line":"            for a in self.role.list_role_assignments(self.project.tree_dn):"},{"line_number":288,"context_line":"                if isinstance(a, UserRoleAssociation):"},{"line_number":289,"context_line":"                    assignment \u003d {"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a4dcd0f_51433b42","line":286,"in_reply_to":"1a4dcd0f_88d2165b","updated":"2015-08-06 08:32:43.000000000","message":"That\u0027s probably the best answer, since domain role assignments are not supported at all in the LDAP backend.","commit_id":"063faa6e0560e4705f871d2d9fa99f67f00bc631"}],"keystone/assignment/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1c0437503b2ff3cad0ce1dd0ff7ce198e2e0cc39","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        actor_types \u003d []"},{"line_number":353,"context_line":"        if user:"},{"line_number":354,"context_line":"            actor_types \u003d self._get_user_assignment_types()"},{"line_number":355,"context_line":"        elif group:"},{"line_number":356,"context_line":"            actor_types \u003d self._get_group_assignment_types()"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        target_types \u003d []"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_bb2e8af8","line":355,"updated":"2015-03-02 17:52:11.000000000","message":"is there another assignment type we can have here, or will it always be either user or group? Do we need an elif here or could it just be else?","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cf6c62d8eb71e058e2e8a4ffe201e9903347c023","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        actor_types \u003d []"},{"line_number":353,"context_line":"        if user:"},{"line_number":354,"context_line":"            actor_types \u003d self._get_user_assignment_types()"},{"line_number":355,"context_line":"        elif group:"},{"line_number":356,"context_line":"            actor_types \u003d self._get_group_assignment_types()"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        target_types \u003d []"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_e78c99d9","line":355,"in_reply_to":"ba7be1f8_bb2e8af8","updated":"2015-03-04 01:06:17.000000000","message":"If no group, user, project or domain is provided, this method will return an empty list, which will be ignored as a filter at lines 421, 422.\n\nSo we cannot just make it as an else statement.","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1c0437503b2ff3cad0ce1dd0ff7ce198e2e0cc39","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        target_types \u003d []"},{"line_number":359,"context_line":"        if project:"},{"line_number":360,"context_line":"            target_types \u003d self._get_project_assignment_types()"},{"line_number":361,"context_line":"        elif domain:"},{"line_number":362,"context_line":"            target_types \u003d self._get_domain_assignment_types()"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        if actor_types and target_types:"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_3b3a9a34","line":361,"updated":"2015-03-02 17:52:11.000000000","message":"same comment here","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cf6c62d8eb71e058e2e8a4ffe201e9903347c023","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        target_types \u003d []"},{"line_number":359,"context_line":"        if project:"},{"line_number":360,"context_line":"            target_types \u003d self._get_project_assignment_types()"},{"line_number":361,"context_line":"        elif domain:"},{"line_number":362,"context_line":"            target_types \u003d self._get_domain_assignment_types()"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        if actor_types and target_types:"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_07bfed61","line":361,"in_reply_to":"ba7be1f8_3b3a9a34","updated":"2015-03-04 01:06:17.000000000","message":"ditto","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1c0437503b2ff3cad0ce1dd0ff7ce198e2e0cc39","unresolved":false,"context_lines":[{"line_number":401,"context_line":"            targets \u003d None"},{"line_number":402,"context_line":"            if project_ids:"},{"line_number":403,"context_line":"                targets \u003d project_ids"},{"line_number":404,"context_line":"            elif domain_id:"},{"line_number":405,"context_line":"                targets \u003d [domain_id]"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"            actors \u003d None"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_fbd482be","line":404,"updated":"2015-03-02 17:52:11.000000000","message":"same comment here","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cf6c62d8eb71e058e2e8a4ffe201e9903347c023","unresolved":false,"context_lines":[{"line_number":401,"context_line":"            targets \u003d None"},{"line_number":402,"context_line":"            if project_ids:"},{"line_number":403,"context_line":"                targets \u003d project_ids"},{"line_number":404,"context_line":"            elif domain_id:"},{"line_number":405,"context_line":"                targets \u003d [domain_id]"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"            actors \u003d None"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_a77461cf","line":404,"in_reply_to":"ba7be1f8_fbd482be","updated":"2015-03-04 01:06:17.000000000","message":"Same explanation as above. If no project_ids or domain_id is provided, targets will be None and then ignored as a filter at lines 417 and 418.","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1c0437503b2ff3cad0ce1dd0ff7ce198e2e0cc39","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            actors \u003d None"},{"line_number":408,"context_line":"            if group_ids:"},{"line_number":409,"context_line":"                actors \u003d group_ids"},{"line_number":410,"context_line":"            elif user_id:"},{"line_number":411,"context_line":"                actors \u003d [user_id]"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"            query \u003d session.query(RoleAssignment)"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_dbd17ece","line":410,"updated":"2015-03-02 17:52:11.000000000","message":"same comment here","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cf6c62d8eb71e058e2e8a4ffe201e9903347c023","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            actors \u003d None"},{"line_number":408,"context_line":"            if group_ids:"},{"line_number":409,"context_line":"                actors \u003d group_ids"},{"line_number":410,"context_line":"            elif user_id:"},{"line_number":411,"context_line":"                actors \u003d [user_id]"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"            query \u003d session.query(RoleAssignment)"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_e77ad9b8","line":410,"in_reply_to":"ba7be1f8_dbd17ece","updated":"2015-03-04 01:06:17.000000000","message":"ditto","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8a119b4969e9f5e850285df6a893c9a3e6fa5b16","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        assignment type for that specific pair of actor and target."},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        If only an actor or target is provided, the list will contain the"},{"line_number":358,"context_line":"        role assignment types that satisfy the speficied entity."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        For example, if user and project are provided, the return will be:"},{"line_number":361,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"1a4dcd0f_272d7a46","line":358,"updated":"2015-08-04 14:55:55.000000000","message":"nits: s/speficied/specified","commit_id":"f4b18d9d8d68e8f9e057e8b332e369a87bcb0fa0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bf8e3498dd941a571e7ee9bd8452a1050ac50cec","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def _get_assignment_types(self, user, group, project, domain):"},{"line_number":351,"context_line":"        \"\"\"Returns a list of role assignment types based on provided entities"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        If an actor and target are provided, the list will contain the role"},{"line_number":354,"context_line":"        assignment type for that specific pair of actor and target."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        If only an actor or target is provided, the list will contain the"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a4dcd0f_68b78af5","line":353,"updated":"2015-08-05 17:02:05.000000000","message":"Using the actor/target terminology here seems wrong. The method signature doesn\u0027t contain those terms so I think the generated documentation would be confusing.","commit_id":"063faa6e0560e4705f871d2d9fa99f67f00bc631"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"eb9ddeb50fdb4b792e813a85c9a00ad3d9442665","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def _get_assignment_types(self, user, group, project, domain):"},{"line_number":351,"context_line":"        \"\"\"Returns a list of role assignment types based on provided entities"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        If an actor and target are provided, the list will contain the role"},{"line_number":354,"context_line":"        assignment type for that specific pair of actor and target."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        If only an actor or target is provided, the list will contain the"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a4dcd0f_3b50ced3","line":353,"in_reply_to":"1a4dcd0f_68b78af5","updated":"2015-08-06 08:32:43.000000000","message":"Done - explained what actor/target is to ensure the sentences don\u0027t become unweildy","commit_id":"063faa6e0560e4705f871d2d9fa99f67f00bc631"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bf8e3498dd941a571e7ee9bd8452a1050ac50cec","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        \"\"\""},{"line_number":368,"context_line":"        actor_types \u003d []"},{"line_number":369,"context_line":"        if user:"},{"line_number":370,"context_line":"            actor_types \u003d self._get_user_assignment_types()"},{"line_number":371,"context_line":"        elif group:"},{"line_number":372,"context_line":"            actor_types \u003d self._get_group_assignment_types()"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a4dcd0f_28d182fa","line":369,"updated":"2015-08-05 17:02:05.000000000","message":"You may want to mention in the docs that it is possible for user and group to both have a value and in that case user wins because it\u0027s more specific. Same thing for project/domain too.","commit_id":"063faa6e0560e4705f871d2d9fa99f67f00bc631"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"eb9ddeb50fdb4b792e813a85c9a00ad3d9442665","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        \"\"\""},{"line_number":368,"context_line":"        actor_types \u003d []"},{"line_number":369,"context_line":"        if user:"},{"line_number":370,"context_line":"            actor_types \u003d self._get_user_assignment_types()"},{"line_number":371,"context_line":"        elif group:"},{"line_number":372,"context_line":"            actor_types \u003d self._get_group_assignment_types()"}],"source_content_type":"text/x-python","patch_set":41,"id":"1a4dcd0f_fb9b4616","line":369,"in_reply_to":"1a4dcd0f_28d182fa","updated":"2015-08-06 08:32:43.000000000","message":"I don\u0027t think it is possible for user/group to both have a value in the way that this method is called....although I you comment is accurate as to what would happen if it were.","commit_id":"063faa6e0560e4705f871d2d9fa99f67f00bc631"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"9b63dd87c02d4ecf0cd57a44d5a12e97428bebf2","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def _get_assignment_types(self, user, group, project, domain):"},{"line_number":351,"context_line":"        \"\"\"Returns a list of role assignment types based on provided entities"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        If one of user or group (the \"actor\") as well as one of project or"},{"line_number":354,"context_line":"        domain (the \"target\") are provided, the list will contain the role"},{"line_number":355,"context_line":"        assignment type for that specific pair of actor and target."},{"line_number":356,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"1a4dcd0f_2262c30a","line":353,"updated":"2015-08-07 17:05:15.000000000","message":"nice!","commit_id":"329474a091e0a2185099fb8137836df88899fad6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d806389cf8eb18c6eaeee4953576aefc916c0f00","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            target_types \u003d self._get_domain_assignment_types()"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        if actor_types and target_types:"},{"line_number":386,"context_line":"            return list(set(actor_types).intersection(target_types))"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        return actor_types or target_types"},{"line_number":389,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"1a4dcd0f_9141080e","line":386,"updated":"2015-08-11 07:07:46.000000000","message":"missing a second set here?\n\n  return list(set(actor_types).intersection(set(target_types)))\n\nupdate: apparently you don\u0027t need to, but maybe change it in a follow-on patch?","commit_id":"a415908d670364d3a396ae7a65aa695cb7f9edb5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d806389cf8eb18c6eaeee4953576aefc916c0f00","unresolved":false,"context_lines":[{"line_number":419,"context_line":"            assignment_types \u003d self._get_assignment_types("},{"line_number":420,"context_line":"                user_id, group_ids, project_ids, domain_id)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"            targets \u003d None"},{"line_number":423,"context_line":"            if project_ids:"},{"line_number":424,"context_line":"                targets \u003d project_ids"},{"line_number":425,"context_line":"            elif domain_id:"}],"source_content_type":"text/x-python","patch_set":46,"id":"1a4dcd0f_31c4b45d","line":422,"updated":"2015-08-11 07:07:46.000000000","message":"nit: this could be shorter\n\n  targets \u003d project_ids if project_ids else [domain_id]","commit_id":"a415908d670364d3a396ae7a65aa695cb7f9edb5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d806389cf8eb18c6eaeee4953576aefc916c0f00","unresolved":false,"context_lines":[{"line_number":425,"context_line":"            elif domain_id:"},{"line_number":426,"context_line":"                targets \u003d [domain_id]"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"            actors \u003d None"},{"line_number":429,"context_line":"            if group_ids:"},{"line_number":430,"context_line":"                actors \u003d group_ids"},{"line_number":431,"context_line":"            elif user_id:"}],"source_content_type":"text/x-python","patch_set":46,"id":"1a4dcd0f_f1a40cba","line":428,"updated":"2015-08-11 07:07:46.000000000","message":"nit: this could be shorter:\n\n  actors \u003d group_ids if group_ids else [user_id]","commit_id":"a415908d670364d3a396ae7a65aa695cb7f9edb5"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a6c1b6a24c63567bf69ef0974b97088f450e2b9d","unresolved":false,"context_lines":[{"line_number":711,"context_line":"                    \u0027result in an empty list.\u0027)"},{"line_number":712,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":713,"context_line":""},{"line_number":714,"context_line":"        if inherited and domain:"},{"line_number":715,"context_line":"            msg \u003d _(\u0027Combining effective, domain and inherited filters will \u0027"},{"line_number":716,"context_line":"                    \u0027always result in an empty list.\u0027)"},{"line_number":717,"context_line":"            raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_ca20ea4b","line":714,"updated":"2015-01-29 09:29:45.000000000","message":"is domain relevant here?  Isn\u0027t it just effective and inherited that you can\u0027t have together?","commit_id":"66d252050cf5205a47e3e2c9e8f41f4f97db1b1d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a6c1b6a24c63567bf69ef0974b97088f450e2b9d","unresolved":false,"context_lines":[{"line_number":724,"context_line":""},{"line_number":725,"context_line":"        Return a list of all existing role assignments in the system. Effective"},{"line_number":726,"context_line":"        option and filters on assignment attributes may be applied to the"},{"line_number":727,"context_line":"        resultant list."},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        If effective option is used and OS-INHERIT extension is enabled, the"},{"line_number":730,"context_line":"        following functions will be applied:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_2a47c64c","line":727,"updated":"2015-01-29 09:29:45.000000000","message":"we may want to reword this comment, since the first sentence sounds like we are going to get them all anyway, which isn\u0027t the case.","commit_id":"66d252050cf5205a47e3e2c9e8f41f4f97db1b1d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a6c1b6a24c63567bf69ef0974b97088f450e2b9d","unresolved":false,"context_lines":[{"line_number":735,"context_line":"        it by a set of role assignments for that actor on every project under"},{"line_number":736,"context_line":"        that target."},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"        It means that, if effective mode is used, no domain, group or"},{"line_number":739,"context_line":"        inherited (on the target it was originally applied) assignments will be"},{"line_number":740,"context_line":"        present in the resultant list. Thus, combining effective with one of"},{"line_number":741,"context_line":"        them is invalid."}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_0aba0223","line":738,"updated":"2015-01-29 09:29:45.000000000","message":"remove the domain from this sentence - since we do return (direct assignments on) these in effective mode.","commit_id":"66d252050cf5205a47e3e2c9e8f41f4f97db1b1d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"475c28b83847343635cb6ce1f80cf3fe07498add","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        actor (e.g. user or group), target (e.g. domain or project) and role."},{"line_number":452,"context_line":"        If it is an inherited role, then this is also indicated. Examples:"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        For a non-inherited expanded assignment from group membership:"},{"line_number":455,"context_line":"        {"},{"line_number":456,"context_line":"            \u0027user_id\u0027: user_id,"},{"line_number":457,"context_line":"            \u0027project_id\u0027: project_id,"}],"source_content_type":"text/x-python","patch_set":32,"id":"da9b358b_9904d415","line":454,"updated":"2015-03-30 23:24:40.000000000","message":"What do these formatting changes have to do with the performance improvements?","commit_id":"05655992679211869d348ebf0887766c6a13ad90"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"50db4414b4bb72d20ce73e3c7b24b436f046ef42","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        actor (e.g. user or group), target (e.g. domain or project) and role."},{"line_number":452,"context_line":"        If it is an inherited role, then this is also indicated. Examples:"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        For a non-inherited expanded assignment from group membership:"},{"line_number":455,"context_line":"        {"},{"line_number":456,"context_line":"            \u0027user_id\u0027: user_id,"},{"line_number":457,"context_line":"            \u0027project_id\u0027: project_id,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_fb7bcc27","line":454,"in_reply_to":"da9b358b_9904d415","updated":"2015-05-26 21:47:00.000000000","message":"Actually, this includes the performance improvement by passing the filters directly to drivers.\n\nAlso, it puts the business logic (expanding inherited and group role assignments) at the correct level, i.e, the manager.\n\nOnce we have that logic at the manager level, it needs to have a way to represent expanded role assignments to the controller level, which is responsible for formatting the results.\n\nSo this formatting changes are implied by the refactoring being done here.","commit_id":"05655992679211869d348ebf0887766c6a13ad90"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"2a4dca183befc488de0f729b0618e02a624ca9c1","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        actor (e.g. user or group), target (e.g. domain or project) and role."},{"line_number":452,"context_line":"        If it is an inherited role, then this is also indicated. Examples:"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        For a non-inherited expanded assignment from group membership:"},{"line_number":455,"context_line":"        {"},{"line_number":456,"context_line":"            \u0027user_id\u0027: user_id,"},{"line_number":457,"context_line":"            \u0027project_id\u0027: project_id,"}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_c22d4947","line":454,"in_reply_to":"da9b358b_9904d415","updated":"2015-07-08 17:08:07.000000000","message":"Done","commit_id":"05655992679211869d348ebf0887766c6a13ad90"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d806389cf8eb18c6eaeee4953576aefc916c0f00","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        \"\"\""},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        formatted_entity \u003d {\u0027links\u0027: {}}"},{"line_number":508,"context_line":"        inherited_assignment \u003d entity.get(\u0027inherited_to_projects\u0027)"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        if \u0027project_id\u0027 in entity:"},{"line_number":511,"context_line":"            formatted_entity[\u0027scope\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":46,"id":"1a4dcd0f_23030944","line":508,"updated":"2015-08-11 07:07:46.000000000","message":"its weird that this is assigned and then stomped on without checking it\u0027s value on line 515 and 519","commit_id":"a415908d670364d3a396ae7a65aa695cb7f9edb5"}],"keystone/assignment/core.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4dae5f5f0bba2b683459447421e3cd7dc0357a30","unresolved":false,"context_lines":[{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def list_role_assignments_for_role(self, role_id\u003dNone):"},{"line_number":636,"context_line":"        # NOTE(samueldmq): Calls to this method should be replaced by directly"},{"line_number":637,"context_line":"        # calls to list_role_assignments(role_id\u003drole_id)"},{"line_number":638,"context_line":"        return self.list_role_assignments(role_id\u003drole_id)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_d569fcf8","line":637,"updated":"2015-01-16 12:47:59.000000000","message":"is this comment saying that there is more to do in the future....or that we are now calling the right thing? Do we need any comment here at all if it is the later?","commit_id":"8002584aea3b436118ec3e854fc49d5ee38e26fa"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"aecb57bba7697e9e93da054bfe4cb20a9cc5b5b1","unresolved":false,"context_lines":[{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def list_role_assignments_for_role(self, role_id\u003dNone):"},{"line_number":636,"context_line":"        # NOTE(samueldmq): Calls to this method should be replaced by directly"},{"line_number":637,"context_line":"        # calls to list_role_assignments(role_id\u003drole_id)"},{"line_number":638,"context_line":"        return self.list_role_assignments(role_id\u003drole_id)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_f240c360","line":637,"in_reply_to":"3a961159_03da6b4a","updated":"2015-01-16 17:23:28.000000000","message":"++","commit_id":"8002584aea3b436118ec3e854fc49d5ee38e26fa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e03ffa5bff301ef8e372f6ea4cc4e6e36ab5d121","unresolved":false,"context_lines":[{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def list_role_assignments_for_role(self, role_id\u003dNone):"},{"line_number":636,"context_line":"        # NOTE(samueldmq): Calls to this method should be replaced by directly"},{"line_number":637,"context_line":"        # calls to list_role_assignments(role_id\u003drole_id)"},{"line_number":638,"context_line":"        return self.list_role_assignments(role_id\u003drole_id)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_03da6b4a","line":637,"in_reply_to":"3a961159_20412039","updated":"2015-01-16 15:24:09.000000000","message":"aah, right - got you....maybe a slight wording might help to clarify, e.g.:\n\nThis method should be deleted and calls should simply be made to \"list_role_assignments(role_id\u003drole_id) directly.\"","commit_id":"8002584aea3b436118ec3e854fc49d5ee38e26fa"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"896838136e8786dfe7d2cf1257285685061d5695","unresolved":false,"context_lines":[{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def list_role_assignments_for_role(self, role_id\u003dNone):"},{"line_number":636,"context_line":"        # NOTE(samueldmq): Calls to this method should be replaced by directly"},{"line_number":637,"context_line":"        # calls to list_role_assignments(role_id\u003drole_id)"},{"line_number":638,"context_line":"        return self.list_role_assignments(role_id\u003drole_id)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_20412039","line":637,"in_reply_to":"3a961159_d569fcf8","updated":"2015-01-16 12:56:17.000000000","message":"It should be a TODO, I think we have no need to keep a method that just make one call repassing all received params.\n\nWill address in a follow on patch.","commit_id":"8002584aea3b436118ec3e854fc49d5ee38e26fa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fc12fa2783243cc53fb89c8a565a2b01a979df0b","unresolved":false,"context_lines":[{"line_number":515,"context_line":"         \u0027project_id\u0027: subproject_id,"},{"line_number":516,"context_line":"         \u0027parent_id\u0027: parent_id,"},{"line_number":517,"context_line":"         \u0027role_id\u0027: role_id,"},{"line_number":518,"context_line":"         \u0027inherited_to_projects\u0027: True}"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        Returned list will be formatted by the Controller, which will deduce a"},{"line_number":521,"context_line":"        role assignment came from group membership if it has both \u0027user_id\u0027 and"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_3e061ecf","line":518,"updated":"2015-01-22 21:18:26.000000000","message":"So the more I\u0027ve played with calling this API from tests I have been experimenting with, the less I\u0027m sure this is the right structure (as I think you were alluding to me).  Maybe it might be better to just have something like an \u0027indirect\u0027 key which contained details of how this indirect role was obtained (inherited from project, or domain...or from a group membership etc.) e.g.:\n\n{ \u0027user_id\u0027: user_id,\n  \u0027project_id\u0027: project_id,\n  \u0027role_id\u0027: role_id,\n  \u0027indirect\u0027: {\n      \u0027inherited_from_project\u0027: project_id\n  }\n}\n\nalternatives would be:\n\n \u0027inherited_from_domain\u0027: domain_id\n \u0027inherited_from_group\u0027 .....\n etc. etc.\n\nSuch a structure would also allow us, if we wanted to in the future, to indicate multiple places an indirect assignment may have been obtained from.\n\nNothing in the above is suggesting we change the current public API...just the internal manager\u003c-\u003econtroller data structures.","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"ca15868d1ded8ca90fb8bd13479eed18c256fcb5","unresolved":false,"context_lines":[{"line_number":515,"context_line":"         \u0027project_id\u0027: subproject_id,"},{"line_number":516,"context_line":"         \u0027parent_id\u0027: parent_id,"},{"line_number":517,"context_line":"         \u0027role_id\u0027: role_id,"},{"line_number":518,"context_line":"         \u0027inherited_to_projects\u0027: True}"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        Returned list will be formatted by the Controller, which will deduce a"},{"line_number":521,"context_line":"        role assignment came from group membership if it has both \u0027user_id\u0027 and"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_75226f02","line":518,"in_reply_to":"1a930d6b_3e061ecf","updated":"2015-01-23 12:35:18.000000000","message":"I liked the idea of the indirect key :-)\n\nWhat about:\n\nFor user domain inheritance:\n\n\u0027indirect\u0027: {\n      \u0027domain_id\u0027: domain_id\n}\n\nFor user project inheritance:\n\n\u0027indirect\u0027: {\n      \u0027project_id\u0027: project_id\n}\n\nFor group domain/project inheritance, add group_id in \u0027indirect\u0027 key on the examples above.","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"04be24efb4ce4714cc17f83ec8ace5ad9c24024c","unresolved":false,"context_lines":[{"line_number":515,"context_line":"         \u0027project_id\u0027: subproject_id,"},{"line_number":516,"context_line":"         \u0027parent_id\u0027: parent_id,"},{"line_number":517,"context_line":"         \u0027role_id\u0027: role_id,"},{"line_number":518,"context_line":"         \u0027inherited_to_projects\u0027: True}"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        Returned list will be formatted by the Controller, which will deduce a"},{"line_number":521,"context_line":"        role assignment came from group membership if it has both \u0027user_id\u0027 and"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_a202da08","line":518,"in_reply_to":"1a930d6b_75226f02","updated":"2015-01-23 14:29:27.000000000","message":"yes, I like that....I think that would work...so:\n\n- if you just had group_id in indirect that would mean it was from a group assignment direct to the project\n- if you had group_id and domain_id it would be from a group assignment on the domain\n- fi you had group_id and project_id it would be from a group assignment for a project in the parent hierarchy\n\ndo you think that\u0027s right?","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b2ea9cbfe090a9f2b9aab4d43a4a327231e87894","unresolved":false,"context_lines":[{"line_number":515,"context_line":"         \u0027project_id\u0027: subproject_id,"},{"line_number":516,"context_line":"         \u0027parent_id\u0027: parent_id,"},{"line_number":517,"context_line":"         \u0027role_id\u0027: role_id,"},{"line_number":518,"context_line":"         \u0027inherited_to_projects\u0027: True}"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        Returned list will be formatted by the Controller, which will deduce a"},{"line_number":521,"context_line":"        role assignment came from group membership if it has both \u0027user_id\u0027 and"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_cd64774b","line":518,"in_reply_to":"1a930d6b_8de34f32","updated":"2015-01-23 14:49:52.000000000","message":"..yes, agreed.","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"76263d22d6c34d9110de37ff26341915ea89b38a","unresolved":false,"context_lines":[{"line_number":515,"context_line":"         \u0027project_id\u0027: subproject_id,"},{"line_number":516,"context_line":"         \u0027parent_id\u0027: parent_id,"},{"line_number":517,"context_line":"         \u0027role_id\u0027: role_id,"},{"line_number":518,"context_line":"         \u0027inherited_to_projects\u0027: True}"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        Returned list will be formatted by the Controller, which will deduce a"},{"line_number":521,"context_line":"        role assignment came from group membership if it has both \u0027user_id\u0027 and"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_8de34f32","line":518,"in_reply_to":"1a930d6b_a202da08","updated":"2015-01-23 14:35:02.000000000","message":"Exactly. Just for your first point:\n\n* if you just had group_id in indirect that would mean it was from a group assignment direct to the project **or domain**","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"28acbba5c4c6b87bfba96ba6c97e4611ec63edc6","unresolved":false,"context_lines":[{"line_number":515,"context_line":"         \u0027project_id\u0027: subproject_id,"},{"line_number":516,"context_line":"         \u0027parent_id\u0027: parent_id,"},{"line_number":517,"context_line":"         \u0027role_id\u0027: role_id,"},{"line_number":518,"context_line":"         \u0027inherited_to_projects\u0027: True}"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        Returned list will be formatted by the Controller, which will deduce a"},{"line_number":521,"context_line":"        role assignment came from group membership if it has both \u0027user_id\u0027 and"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_848ebcce","line":518,"in_reply_to":"1a930d6b_cd64774b","updated":"2015-01-23 20:40:30.000000000","message":"Great!","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"7b7d754558d85c316416f1c452bf7d3c728b9c6d","unresolved":false,"context_lines":[{"line_number":621,"context_line":"    def _list_effective_assignments_for_user(self, role_id, user_id):"},{"line_number":622,"context_line":"        # List user role assignments"},{"line_number":623,"context_line":"        user_refs \u003d self.driver.list_role_assignments("},{"line_number":624,"context_line":"            role_id\u003drole_id, user_id\u003duser_id)"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"        # As well as those from the user\u0027s groups"},{"line_number":627,"context_line":"        group_refs \u003d []"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_09b83c75","line":624,"updated":"2015-01-23 10:48:55.000000000","message":"What about the case where effective\u003dTrue but os-inherit\u003dFalse?  I think this causes us to include inherited roles in the resulting output.","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"28acbba5c4c6b87bfba96ba6c97e4611ec63edc6","unresolved":false,"context_lines":[{"line_number":621,"context_line":"    def _list_effective_assignments_for_user(self, role_id, user_id):"},{"line_number":622,"context_line":"        # List user role assignments"},{"line_number":623,"context_line":"        user_refs \u003d self.driver.list_role_assignments("},{"line_number":624,"context_line":"            role_id\u003drole_id, user_id\u003duser_id)"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"        # As well as those from the user\u0027s groups"},{"line_number":627,"context_line":"        group_refs \u003d []"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_448854c5","line":624,"in_reply_to":"1a930d6b_09b83c75","updated":"2015-01-23 20:40:30.000000000","message":"No on calls from controller, because inherit calculation takes in account os-inherit cofig. Take a look at lines 731-732 of controller.\nIf it\u0027s false, this code won\u0027t be executed, look at line 718 of this file.\n\nHowever, I agree that needs to be evaluated here at manager level. I\u0027ll change this.","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"8b35a38084fae8edcaa57055fc91c0f32fc6bfb8","unresolved":false,"context_lines":[{"line_number":621,"context_line":"    def _list_effective_assignments_for_user(self, role_id, user_id):"},{"line_number":622,"context_line":"        # List user role assignments"},{"line_number":623,"context_line":"        user_refs \u003d self.driver.list_role_assignments("},{"line_number":624,"context_line":"            role_id\u003drole_id, user_id\u003duser_id)"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"        # As well as those from the user\u0027s groups"},{"line_number":627,"context_line":"        group_refs \u003d []"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_af2e3141","line":624,"in_reply_to":"1a930d6b_448854c5","updated":"2015-01-23 20:55:56.000000000","message":"Maybe this is not true. That case for inherited flag. I need to consider os-inherit config for efffective as well.\nWill add this. thanks for pointing this out,","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"820c7737be6b5c54e74cd3b0d0eace3326b67ab3","unresolved":false,"context_lines":[{"line_number":686,"context_line":"        if user_id and project_id:"},{"line_number":687,"context_line":"            refs \u003d self._list_effective_assignments_for_user_and_project("},{"line_number":688,"context_line":"                role_id\u003drole_id, user_id\u003duser_id, project_id\u003dproject_id)"},{"line_number":689,"context_line":"        elif user_id:"},{"line_number":690,"context_line":"            refs \u003d self._list_effective_assignments_for_user(role_id\u003drole_id,"},{"line_number":691,"context_line":"                                                             user_id\u003duser_id)"},{"line_number":692,"context_line":"        elif project_id:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_a3b6ae3b","line":689,"updated":"2015-01-21 17:04:02.000000000","message":"I don\u0027t think this is right...what about if we are looking for effective roles that are for a user and domain?","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"28acbba5c4c6b87bfba96ba6c97e4611ec63edc6","unresolved":false,"context_lines":[{"line_number":686,"context_line":"        if user_id and project_id:"},{"line_number":687,"context_line":"            refs \u003d self._list_effective_assignments_for_user_and_project("},{"line_number":688,"context_line":"                role_id\u003drole_id, user_id\u003duser_id, project_id\u003dproject_id)"},{"line_number":689,"context_line":"        elif user_id:"},{"line_number":690,"context_line":"            refs \u003d self._list_effective_assignments_for_user(role_id\u003drole_id,"},{"line_number":691,"context_line":"                                                             user_id\u003duser_id)"},{"line_number":692,"context_line":"        elif project_id:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_6491d0f0","line":689,"in_reply_to":"1a930d6b_1e5ec212","updated":"2015-01-23 20:40:30.000000000","message":"Done","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"32282073d65a888eab4921f232fb738005668412","unresolved":false,"context_lines":[{"line_number":686,"context_line":"        if user_id and project_id:"},{"line_number":687,"context_line":"            refs \u003d self._list_effective_assignments_for_user_and_project("},{"line_number":688,"context_line":"                role_id\u003drole_id, user_id\u003duser_id, project_id\u003dproject_id)"},{"line_number":689,"context_line":"        elif user_id:"},{"line_number":690,"context_line":"            refs \u003d self._list_effective_assignments_for_user(role_id\u003drole_id,"},{"line_number":691,"context_line":"                                                             user_id\u003duser_id)"},{"line_number":692,"context_line":"        elif project_id:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_c4bca06f","line":689,"in_reply_to":"1a930d6b_a3b6ae3b","updated":"2015-01-21 18:35:58.000000000","message":"So, as decided on the channel, this behavior is not allowed taking in account the existing behavior of this method.\n\nA followon patch will make it possible.\nIn this case, direct roles on domain and those that come from group membership on that domain (non inherited as well) will be returned.","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fc12fa2783243cc53fb89c8a565a2b01a979df0b","unresolved":false,"context_lines":[{"line_number":686,"context_line":"        if user_id and project_id:"},{"line_number":687,"context_line":"            refs \u003d self._list_effective_assignments_for_user_and_project("},{"line_number":688,"context_line":"                role_id\u003drole_id, user_id\u003duser_id, project_id\u003dproject_id)"},{"line_number":689,"context_line":"        elif user_id:"},{"line_number":690,"context_line":"            refs \u003d self._list_effective_assignments_for_user(role_id\u003drole_id,"},{"line_number":691,"context_line":"                                                             user_id\u003duser_id)"},{"line_number":692,"context_line":"        elif project_id:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a930d6b_1e5ec212","line":689,"in_reply_to":"1a930d6b_c4bca06f","updated":"2015-01-22 21:18:26.000000000","message":"as we further discussed - I think the current code DOES support this, so we need to fix it here.","commit_id":"af49c4ba534ba944b0ed60cee09c18e0be59a57d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2f2bbf7ee9e9e2cb5f9c9ec069f81a0155d417f8","unresolved":false,"context_lines":[{"line_number":596,"context_line":"            {"},{"line_number":597,"context_line":"                \u0027user_id\u0027: user_id,"},{"line_number":598,"context_line":"                \u0027project_id\u0027: project_id,"},{"line_number":599,"context_line":"                \u0027role_id\u0027: role_id,"},{"line_number":600,"context_line":"                \u0027indirect\u0027 : {"},{"line_number":601,"context_line":"                    \u0027group_id\u0027: group_id"},{"line_number":602,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa81d914_2052d3dd","line":599,"updated":"2015-01-28 00:39:11.000000000","message":"in reality, we are still also inserting:\n\n\u0027inhertited_to_projects\u0027: \u0027projects\u0027,\n\ninto this dict as well...is that really necessary?","commit_id":"05afec952604e0f8a8ab9ff8f2111fc1707f353c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2f2bbf7ee9e9e2cb5f9c9ec069f81a0155d417f8","unresolved":false,"context_lines":[{"line_number":754,"context_line":"        if not CONF.os_inherit.enabled:"},{"line_number":755,"context_line":"            if inherited:"},{"line_number":756,"context_line":"                return []"},{"line_number":757,"context_line":"            inherited \u003d False"},{"line_number":758,"context_line":""},{"line_number":759,"context_line":"        f \u003d (list_effective_assignments"},{"line_number":760,"context_line":"             if effective else list_direct_assignments)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a930d6b_6bec0bf4","line":757,"updated":"2015-01-28 00:39:11.000000000","message":"do we need this line?","commit_id":"05afec952604e0f8a8ab9ff8f2111fc1707f353c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3a7d345f314353515a4f9ad697b5dfd7549e4e5d","unresolved":false,"context_lines":[{"line_number":726,"context_line":"                    role_id\u003drole_id, user_id\u003duser_id,"},{"line_number":727,"context_line":"                    project_id\u003dproject_id, inherited\u003dinherited)"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"            return self._list_effective_assignments_for_user("},{"line_number":730,"context_line":"                role_id\u003drole_id, user_id\u003duser_id, inherited\u003dinherited)"},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"        if project_id:"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa81d914_ddb61d3d","line":729,"updated":"2015-01-28 17:06:44.000000000","message":"I\u0027m not sure calling this in the case when you have user_id and domain_id set will give you the right answer. W.g. won\u0027t you end up returning all the project non-inherited assignments?","commit_id":"316c31a7b5dd6b819bbe0238c79e6353eb1327d5"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"35bf079404648ab633722d60d68750ca6e81e718","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        return [assignment]"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    def _list_effective_assignments_for_user_and_project("},{"line_number":631,"context_line":"            self, role_id, user_id, project_id, inherited):"},{"line_number":632,"context_line":"        # List expanded assignments from direct user\u0027s assignments"},{"line_number":633,"context_line":"        direct_assignments \u003d self._list_effective_assignments_for_project("},{"line_number":634,"context_line":"            role_id\u003drole_id, project_id\u003dproject_id, user_id\u003duser_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_6eb27995","line":631,"updated":"2015-01-30 11:17:03.000000000","message":"I think it might be easier to review if this method (and the other _list_effective_assignments_for_xxxxx) had doc strings that describe the circumstances when they are called and what they need to do to satisfy the requirements.","commit_id":"66d252050cf5205a47e3e2c9e8f41f4f97db1b1d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a6c1b6a24c63567bf69ef0974b97088f450e2b9d","unresolved":false,"context_lines":[{"line_number":719,"context_line":"            refs +\u003d self._expand_indirect_assignment(ref)"},{"line_number":720,"context_line":"        return refs"},{"line_number":721,"context_line":""},{"line_number":722,"context_line":"    def _list_effective_assignments(self, role_id, user_id, group_id,"},{"line_number":723,"context_line":"                                    domain_id, project_id, inherited):"},{"line_number":724,"context_line":"        \"\"\"List assignments in effective mode."},{"line_number":725,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_277d3fb2","line":722,"updated":"2015-01-29 09:29:45.000000000","message":"we don\u0027t use group_id here - since I think we convinced ourselves that you can\u0027t filter on group in effective mode...so I would suggest we don\u0027t pass it in to make that clear.","commit_id":"66d252050cf5205a47e3e2c9e8f41f4f97db1b1d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"50ddbb2e8d3af05b28bea8c3aa4ca89d8052412a","unresolved":false,"context_lines":[{"line_number":716,"context_line":"        project_ids \u003d [project_id] if project_id else None"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        project_refs \u003d []"},{"line_number":719,"context_line":"        if not inherited:"},{"line_number":720,"context_line":"            project_refs \u003d self.driver.list_role_assignments("},{"line_number":721,"context_line":"                role_id\u003drole_id, project_ids\u003dproject_ids, user_id\u003duser_id,"},{"line_number":722,"context_line":"                group_ids\u003dgroup_ids, inherited_to_projects\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_2e2e618c","line":719,"updated":"2015-02-06 22:53:45.000000000","message":"this check and the one below on inherited look the opposite of each other....or is there more subtlety involved here I.e. if inherited is None then we do one thing...if it is False do another....\n\nIt would probably better to be explicit and/or combine this tests if appropriate.","commit_id":"53d3423067fd8e9caf3672d6f33824ccb8fb98e9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"50ddbb2e8d3af05b28bea8c3aa4ca89d8052412a","unresolved":false,"context_lines":[{"line_number":779,"context_line":"        \"\"\""},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        # No group nor inherited domain assignment can be in the expanded list"},{"line_number":782,"context_line":"        if group_id or (domain_id and inherited is not False):"},{"line_number":783,"context_line":"            return []"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"        if domain_id:"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_e6c9b77a","line":782,"updated":"2015-02-06 22:53:45.000000000","message":"I don\u0027t think the second part of this check is correct.  If I call\n\nlist_role_assignments(user_id\u003dx, domain_id\u003dy, effective\u003dTrue) \n\nthen this clause will always return an empty list....since I think inherited will be passed in as None here.....don\u0027t you mean:\n\nif group_id or (domain_id and inherited is True):  ??","commit_id":"53d3423067fd8e9caf3672d6f33824ccb8fb98e9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9195312eb68a8deb19c7515e41dc2d1edb8ca9c0","unresolved":false,"context_lines":[{"line_number":779,"context_line":"        \"\"\""},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        # No group nor inherited domain assignment can be in the expanded list"},{"line_number":782,"context_line":"        if group_id or (domain_id and inherited is not False):"},{"line_number":783,"context_line":"            return []"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"        if domain_id:"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_c53f37d5","line":782,"in_reply_to":"da86d52c_e6c9b77a","updated":"2015-02-08 22:20:47.000000000","message":"See tests in https://review.openstack.org/#/c/151623/ that fail because of this.","commit_id":"53d3423067fd8e9caf3672d6f33824ccb8fb98e9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"50ddbb2e8d3af05b28bea8c3aa4ca89d8052412a","unresolved":false,"context_lines":[{"line_number":1140,"context_line":"        \"\"\"Returns a list of role assignments for actors on targets."},{"line_number":1141,"context_line":""},{"line_number":1142,"context_line":"        Supports the ``OS-INHERIT`` role inheritance from the project\u0027s parent"},{"line_number":1143,"context_line":"        or domain if supported by the assignment driver."},{"line_number":1144,"context_line":""},{"line_number":1145,"context_line":"        Available parameters represent values in which the returned role"},{"line_number":1146,"context_line":"        assignments attributes need to be filtered on."}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_ab3de3de","line":1143,"updated":"2015-02-06 22:53:45.000000000","message":"not sure this comment is relevant for driver calls now - since is this logic now not in the manager?","commit_id":"53d3423067fd8e9caf3672d6f33824ccb8fb98e9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e614c1df88e18d46b145a4a46b1956fe1b57b28f","unresolved":false,"context_lines":[{"line_number":577,"context_line":"    # increase McCabe complexitiy, that should be kept as it is in order to"},{"line_number":578,"context_line":"    # detect unnecessarily complex code, which is not this case."},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    def _expand_non_inherited_assignment(self, ref, user_id):"},{"line_number":581,"context_line":"        \"\"\"Expands non-inherited role assignments."},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"        For any group role assignment on a target, it is replaced by a set"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_bc688688","line":580,"updated":"2015-02-09 18:11:32.000000000","message":"maybe this would be better just called:\n\n_expand_group_assignment()\n\nsince otherwise people spend time trying to work out what a non-inherited assignment is....","commit_id":"7f6fbb36b0dbc8d48eaeb22404543a88c776ea84"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e614c1df88e18d46b145a4a46b1956fe1b57b28f","unresolved":false,"context_lines":[{"line_number":578,"context_line":"    # detect unnecessarily complex code, which is not this case."},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    def _expand_non_inherited_assignment(self, ref, user_id):"},{"line_number":581,"context_line":"        \"\"\"Expands non-inherited role assignments."},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"        For any group role assignment on a target, it is replaced by a set"},{"line_number":584,"context_line":"        of role assignments containing one for each user of that group on"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_3cb9f6e9","line":581,"updated":"2015-02-09 18:11:32.000000000","message":"we should explain what user_id is as a parameter....I assume that it is the optional user filter?","commit_id":"7f6fbb36b0dbc8d48eaeb22404543a88c776ea84"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e614c1df88e18d46b145a4a46b1956fe1b57b28f","unresolved":false,"context_lines":[{"line_number":761,"context_line":""},{"line_number":762,"context_line":"        assignments \u003d self.driver.list_role_assignments("},{"line_number":763,"context_line":"            role_id\u003drole_id, user_id\u003duser_id, domain_id\u003ddomain_id,"},{"line_number":764,"context_line":"            inherited_to_projects\u003dFalse)"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        refs \u003d []"},{"line_number":767,"context_line":"        for ref in assignments:"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_3a2f2d8a","line":764,"updated":"2015-02-09 18:11:32.000000000","message":"I don\u0027t think this is right for the case when we are filtering for a user, but there are group assignments.  This list won\u0027t contain them, and then _expand_indirect_assignment won\u0027t either because the\u0027ll be no group assignments in the refs we pass it...\n\nSee latest version of https://review.openstack.org/#/c/151962/7 that contains a test that exposes this issue.","commit_id":"7f6fbb36b0dbc8d48eaeb22404543a88c776ea84"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4eb78f5daa6bf34e8446975bc2f4baa2be5b05f8","unresolved":false,"context_lines":[{"line_number":761,"context_line":""},{"line_number":762,"context_line":"        assignments \u003d self.driver.list_role_assignments("},{"line_number":763,"context_line":"            role_id\u003drole_id, user_id\u003duser_id, domain_id\u003ddomain_id,"},{"line_number":764,"context_line":"            inherited_to_projects\u003dFalse)"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        refs \u003d []"},{"line_number":767,"context_line":"        for ref in assignments:"}],"source_content_type":"text/x-python","patch_set":27,"id":"da86d52c_88b9a17b","line":764,"in_reply_to":"da86d52c_3a2f2d8a","updated":"2015-02-10 01:07:15.000000000","message":"As an aside, the tests I mentioned have now been moved to: https://review.openstack.org/#/c/154302/","commit_id":"7f6fbb36b0dbc8d48eaeb22404543a88c776ea84"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0d05c05d5859b852046334183772521931b31058","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        ones that come from grouping or inheritance are retrieved."},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"        Attributes of role assignments in the resultant list match the provided"},{"line_number":640,"context_line":"        filters."},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_afc0b07c","line":640,"updated":"2015-02-19 10:42:20.000000000","message":"The way this sentence is written sounds a bit odd...maybe:\n\n\"The resulting list of assignments will be filtered by the parameters provided.\"","commit_id":"0354721e69164cc986993c53e152ff27ee08553d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5d7e0f4c70553a765ca8f47286ebc1dfe5f9cb45","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        ones that come from grouping or inheritance are retrieved."},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"        Attributes of role assignments in the resultant list match the provided"},{"line_number":640,"context_line":"        filters."},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_121004ff","line":640,"in_reply_to":"da86d52c_afc0b07c","updated":"2015-02-19 11:53:02.000000000","message":"Done","commit_id":"0354721e69164cc986993c53e152ff27ee08553d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0d05c05d5859b852046334183772521931b31058","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        Attributes of role assignments in the resultant list match the provided"},{"line_number":640,"context_line":"        filters."},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        def list_role_assignments_for_actor("},{"line_number":645,"context_line":"                role_id, inherited, user_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_cf5fa40d","line":642,"updated":"2015-02-19 10:42:20.000000000","message":"This is much easier to understand than previous versions of this patch. Nice.","commit_id":"0354721e69164cc986993c53e152ff27ee08553d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5d7e0f4c70553a765ca8f47286ebc1dfe5f9cb45","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        Attributes of role assignments in the resultant list match the provided"},{"line_number":640,"context_line":"        filters."},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        \"\"\""},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        def list_role_assignments_for_actor("},{"line_number":645,"context_line":"                role_id, inherited, user_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_52f51cc9","line":642,"in_reply_to":"da86d52c_cf5fa40d","updated":"2015-02-19 11:53:02.000000000","message":"Thanks :)","commit_id":"0354721e69164cc986993c53e152ff27ee08553d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0d05c05d5859b852046334183772521931b31058","unresolved":false,"context_lines":[{"line_number":666,"context_line":"                    group_ids\u003dgroup_ids, inherited_to_projects\u003dFalse)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"            inherited_refs \u003d []"},{"line_number":669,"context_line":"            # None means to get both non-inherited and inherited assignments"},{"line_number":670,"context_line":"            if inherited is True or inherited is None:"},{"line_number":671,"context_line":"                if project_id:"},{"line_number":672,"context_line":"                    # List inherited assignments from the project\u0027s domain"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_8f73ec7e","line":669,"updated":"2015-02-19 10:42:20.000000000","message":"maybe say \"If inherited is None, then this means....\"","commit_id":"0354721e69164cc986993c53e152ff27ee08553d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5d7e0f4c70553a765ca8f47286ebc1dfe5f9cb45","unresolved":false,"context_lines":[{"line_number":666,"context_line":"                    group_ids\u003dgroup_ids, inherited_to_projects\u003dFalse)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"            inherited_refs \u003d []"},{"line_number":669,"context_line":"            # None means to get both non-inherited and inherited assignments"},{"line_number":670,"context_line":"            if inherited is True or inherited is None:"},{"line_number":671,"context_line":"                if project_id:"},{"line_number":672,"context_line":"                    # List inherited assignments from the project\u0027s domain"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_3221884d","line":669,"in_reply_to":"da86d52c_8f73ec7e","updated":"2015-02-19 11:53:02.000000000","message":"Done","commit_id":"0354721e69164cc986993c53e152ff27ee08553d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0d05c05d5859b852046334183772521931b31058","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        # If filtering by domain, consider only non-inherited assignments"},{"line_number":699,"context_line":"        inherited \u003d False if domain_id else inherited"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"        # List inherited and non-inherited direct assignments"},{"line_number":702,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":703,"context_line":"            role_id\u003drole_id, user_id\u003duser_id, project_id\u003dproject_id,"},{"line_number":704,"context_line":"            domain_id\u003ddomain_id, inherited\u003dinherited)"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_4f1e5460","line":701,"updated":"2015-02-19 10:42:20.000000000","message":"well, that comment isn\u0027t necessarily correct...it depends on the state on \"inherited\"","commit_id":"0354721e69164cc986993c53e152ff27ee08553d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5d7e0f4c70553a765ca8f47286ebc1dfe5f9cb45","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        # If filtering by domain, consider only non-inherited assignments"},{"line_number":699,"context_line":"        inherited \u003d False if domain_id else inherited"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"        # List inherited and non-inherited direct assignments"},{"line_number":702,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":703,"context_line":"            role_id\u003drole_id, user_id\u003duser_id, project_id\u003dproject_id,"},{"line_number":704,"context_line":"            domain_id\u003ddomain_id, inherited\u003dinherited)"}],"source_content_type":"text/x-python","patch_set":30,"id":"da86d52c_52ca7c6e","line":701,"in_reply_to":"da86d52c_4f1e5460","updated":"2015-02-19 11:53:02.000000000","message":"I agree, \u0027inherited and non-inherited\u0027 is the bad part of this sentence. It was from previous versions.\n\nI will replace it by:\n\n# List direct assignments","commit_id":"0354721e69164cc986993c53e152ff27ee08553d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1c0437503b2ff3cad0ce1dd0ff7ce198e2e0cc39","unresolved":false,"context_lines":[{"line_number":580,"context_line":"            main body of the dict and \u0027parent_id\u0027 in the \u0027indirect\u0027 subdict."},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"            \"\"\""},{"line_number":583,"context_line":"            def create_inherited_assignment(base_ref, project_id):"},{"line_number":584,"context_line":"                \"\"\"Creates a project assignment from the provided ref.\"\"\""},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"                ref \u003d copy.deepcopy(base_ref)"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_7e188075","line":583,"updated":"2015-03-02 17:52:11.000000000","message":"nit: not that it really matters much, but should this be private?","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"cf6c62d8eb71e058e2e8a4ffe201e9903347c023","unresolved":false,"context_lines":[{"line_number":580,"context_line":"            main body of the dict and \u0027parent_id\u0027 in the \u0027indirect\u0027 subdict."},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"            \"\"\""},{"line_number":583,"context_line":"            def create_inherited_assignment(base_ref, project_id):"},{"line_number":584,"context_line":"                \"\"\"Creates a project assignment from the provided ref.\"\"\""},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"                ref \u003d copy.deepcopy(base_ref)"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba7be1f8_c7c23533","line":583,"in_reply_to":"ba7be1f8_7e188075","updated":"2015-03-04 01:06:17.000000000","message":"In fact I think we don\u0027t need to add _ at the beginning of inner methods, as we have for this one and for the inner method of _list_effective_role_assignments.\n\nTo keep consistency, I\u0027ll remove _ from _expand_inherited_assignment, _expand_group_assignment and _create_group_assignment.","commit_id":"b20b00b5f9f46345c0f5a6aae3662d5b7942959f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ca2c4f1830e249b68f8ce7b00ca039e127426b36","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from keystone import notifications"},{"line_number":31,"context_line":"from keystone.openstack.common import versionutils"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"import copy"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":32,"id":"7a016987_f671a178","line":33,"updated":"2015-05-26 22:21:05.000000000","message":"This also has to be moved up since it\u0027s a stdlib import.","commit_id":"05655992679211869d348ebf0887766c6a13ad90"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"2a4dca183befc488de0f729b0618e02a624ca9c1","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from keystone import notifications"},{"line_number":31,"context_line":"from keystone.openstack.common import versionutils"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"import copy"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_42fb79c1","line":33,"in_reply_to":"7a016987_f671a178","updated":"2015-07-08 17:08:07.000000000","message":"Done","commit_id":"05655992679211869d348ebf0887766c6a13ad90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c601741b31971ff07a8afd416473882236a084b1","unresolved":false,"context_lines":[{"line_number":709,"context_line":"            project_ids \u003d [project_id] if project_id else None"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"            non_inherited_refs \u003d []"},{"line_number":712,"context_line":"            # None means to get both non-inherited and inherited assignments"},{"line_number":713,"context_line":"            if inherited is False or inherited is None:"},{"line_number":714,"context_line":"                non_inherited_refs \u003d self.driver.list_role_assignments("},{"line_number":715,"context_line":"                    role_id\u003drole_id, domain_id\u003ddomain_id,"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a41bdd9_c6fdb43c","line":712,"updated":"2015-07-17 20:20:50.000000000","message":"This line and the duplicate of it in the next block is confusing since they are worded slightly different....maybe just have one (more detailed) paragraph here (or maybe in the docstring above):\n\n\"Inherited\" can have three values:\n\n True - List those assignments marked as inherited\n False - List those assignments not marked as inherited\n Non - List all the assignments, irrespective of inheritance","commit_id":"3e1e82077db89b6e005d9bf5bbbcc1c006f2d2b2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"308dc161c1ad8af452636bdf068d3d1c793889c6","unresolved":false,"context_lines":[{"line_number":709,"context_line":"            project_ids \u003d [project_id] if project_id else None"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"            non_inherited_refs \u003d []"},{"line_number":712,"context_line":"            # None means to get both non-inherited and inherited assignments"},{"line_number":713,"context_line":"            if inherited is False or inherited is None:"},{"line_number":714,"context_line":"                non_inherited_refs \u003d self.driver.list_role_assignments("},{"line_number":715,"context_line":"                    role_id\u003drole_id, domain_id\u003ddomain_id,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3a50d1a3_b9f2ddd0","line":712,"in_reply_to":"9a41bdd9_c6fdb43c","updated":"2015-07-21 17:51:31.000000000","message":"Done","commit_id":"3e1e82077db89b6e005d9bf5bbbcc1c006f2d2b2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c601741b31971ff07a8afd416473882236a084b1","unresolved":false,"context_lines":[{"line_number":743,"context_line":""},{"line_number":744,"context_line":"            return non_inherited_refs + inherited_refs"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":"        # No group nor inherited domain assignment can be in the expanded list"},{"line_number":747,"context_line":"        if group_id or (domain_id and inherited):"},{"line_number":748,"context_line":"            return []"},{"line_number":749,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"9a41bdd9_4f9bf0c9","line":746,"updated":"2015-07-17 20:20:50.000000000","message":"I think we should explain this in more detail, i.e.:\n\nWhen we expand out inherited roles, group assignments will turn into user assignments and inherited assignments on a domain will turn into project assignments - so if we are filtering explicitly on either of these two types of entity, the list is guaranteed to be empty.","commit_id":"3e1e82077db89b6e005d9bf5bbbcc1c006f2d2b2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"308dc161c1ad8af452636bdf068d3d1c793889c6","unresolved":false,"context_lines":[{"line_number":743,"context_line":""},{"line_number":744,"context_line":"            return non_inherited_refs + inherited_refs"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":"        # No group nor inherited domain assignment can be in the expanded list"},{"line_number":747,"context_line":"        if group_id or (domain_id and inherited):"},{"line_number":748,"context_line":"            return []"},{"line_number":749,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3a50d1a3_79bbf5e5","line":746,"in_reply_to":"9a41bdd9_4f9bf0c9","updated":"2015-07-21 17:51:31.000000000","message":"Done","commit_id":"3e1e82077db89b6e005d9bf5bbbcc1c006f2d2b2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c601741b31971ff07a8afd416473882236a084b1","unresolved":false,"context_lines":[{"line_number":750,"context_line":"        # If filtering by domain, consider only non-inherited assignments"},{"line_number":751,"context_line":"        inherited \u003d False if domain_id else inherited"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        # List direct assignments"},{"line_number":754,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":755,"context_line":"            role_id\u003drole_id, user_id\u003duser_id, project_id\u003dproject_id,"},{"line_number":756,"context_line":"            domain_id\u003ddomain_id, inherited\u003dinherited)"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a41bdd9_6fa4b4b8","line":753,"updated":"2015-07-17 20:20:50.000000000","message":"maybe s/direct/user/\n\nsince direct might be thought of as distinct from inherited","commit_id":"3e1e82077db89b6e005d9bf5bbbcc1c006f2d2b2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"308dc161c1ad8af452636bdf068d3d1c793889c6","unresolved":false,"context_lines":[{"line_number":750,"context_line":"        # If filtering by domain, consider only non-inherited assignments"},{"line_number":751,"context_line":"        inherited \u003d False if domain_id else inherited"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        # List direct assignments"},{"line_number":754,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":755,"context_line":"            role_id\u003drole_id, user_id\u003duser_id, project_id\u003dproject_id,"},{"line_number":756,"context_line":"            domain_id\u003ddomain_id, inherited\u003dinherited)"}],"source_content_type":"text/x-python","patch_set":34,"id":"3a50d1a3_99be01d3","line":753,"in_reply_to":"9a41bdd9_6fa4b4b8","updated":"2015-07-21 17:51:31.000000000","message":"Done","commit_id":"3e1e82077db89b6e005d9bf5bbbcc1c006f2d2b2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c601741b31971ff07a8afd416473882236a084b1","unresolved":false,"context_lines":[{"line_number":814,"context_line":"        f \u003d (self._list_effective_role_assignments"},{"line_number":815,"context_line":"             if effective else self._list_direct_role_assignments)"},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"        return f(role_id, user_id, group_id, domain_id, project_id, inherited)"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"    def delete_tokens_for_role_assignments(self, role_id):"},{"line_number":820,"context_line":"        assignments \u003d self.list_role_assignments_for_role(role_id\u003drole_id)"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a41bdd9_067f1c67","line":817,"updated":"2015-07-17 20:20:50.000000000","message":"(opinion): I find this use of f() most confusing than we are gaining here.","commit_id":"3e1e82077db89b6e005d9bf5bbbcc1c006f2d2b2"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8a119b4969e9f5e850285df6a893c9a3e6fa5b16","unresolved":false,"context_lines":[{"line_number":524,"context_line":"    # The methods _expand_indirect_assignment, _list_direct_role_assignments"},{"line_number":525,"context_line":"    # and _list_effective_role_assignments below are only used on"},{"line_number":526,"context_line":"    # list_role_assignments, but they are not in its scope as nested functions"},{"line_number":527,"context_line":"    # since it would significantly increase McCabe complexitiy, that should be"},{"line_number":528,"context_line":"    # kept as it is in order to detect unnecessarily complex code, which is not"},{"line_number":529,"context_line":"    # this case."},{"line_number":530,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"1a4dcd0f_04bc0104","line":527,"updated":"2015-08-04 14:55:55.000000000","message":"nits: s/complexitiy/complexity","commit_id":"f4b18d9d8d68e8f9e057e8b332e369a87bcb0fa0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8a119b4969e9f5e850285df6a893c9a3e6fa5b16","unresolved":false,"context_lines":[{"line_number":689,"context_line":"        be expanded."},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        The resulting list of assignments will be filtered by the provided"},{"line_number":692,"context_line":"        parameters, although since we are in effective mode, group can never"},{"line_number":693,"context_line":"        act as a filter (since group assignments are expanded into user roles)"},{"line_number":694,"context_line":"        and domain can only be filter if we want non-inherited assignments,"},{"line_number":695,"context_line":"        since domains can\u0027t inherit assignments."}],"source_content_type":"text/x-python","patch_set":40,"id":"1a4dcd0f_d21d89be","line":692,"updated":"2015-08-04 14:55:55.000000000","message":"nits: del/although","commit_id":"f4b18d9d8d68e8f9e057e8b332e369a87bcb0fa0"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d806389cf8eb18c6eaeee4953576aefc916c0f00","unresolved":false,"context_lines":[{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        \"\"\""},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        if not CONF.os_inherit.enabled:"},{"line_number":862,"context_line":"            if inherited:"},{"line_number":863,"context_line":"                return []"},{"line_number":864,"context_line":"            inherited \u003d False"}],"source_content_type":"text/x-python","patch_set":46,"id":"1a4dcd0f_2355494f","line":861,"updated":"2015-08-11 07:07:46.000000000","message":"i\u0027d add a comment here, it\u0027s not super clear what the reasoning behind this is (even it\u0027s somewhat explained in lines 856-857)","commit_id":"a415908d670364d3a396ae7a65aa695cb7f9edb5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d806389cf8eb18c6eaeee4953576aefc916c0f00","unresolved":false,"context_lines":[{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        if not CONF.os_inherit.enabled:"},{"line_number":862,"context_line":"            if inherited:"},{"line_number":863,"context_line":"                return []"},{"line_number":864,"context_line":"            inherited \u003d False"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        if effective:"}],"source_content_type":"text/x-python","patch_set":46,"id":"1a4dcd0f_c392654b","line":863,"updated":"2015-08-11 07:07:46.000000000","message":"a comment here about why/when we return an empty list would be helpful","commit_id":"a415908d670364d3a396ae7a65aa695cb7f9edb5"}]}
