)]}'
{"keystone/assignment/backends/sql.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e8c272e31d34f7a326eff9539c475ed3610e6da6","unresolved":false,"context_lines":[{"line_number":416,"context_line":"    def _get_group_project_roles(self, session, groups, project_id,"},{"line_number":417,"context_line":"                                 project_domain_id):"},{"line_number":418,"context_line":"        sql_constraints \u003d sqlalchemy.and_("},{"line_number":419,"context_line":"            RoleAssignment.type \u003d\u003d AssignmentType.GROUP_PROJECT,"},{"line_number":420,"context_line":"            RoleAssignment.target_id \u003d\u003d project_id)"},{"line_number":421,"context_line":"        if CONF.os_inherit.enabled:"},{"line_number":422,"context_line":"            sql_constraints \u003d sqlalchemy.or_("}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_6eddf413","line":419,"updated":"2014-12-03 17:04:23.000000000","message":"I think you need to make this constraint as \"inherited \u003d false()\"....otherwise you will include all the projects that have a group inherited role (which should only apply to their children)","commit_id":"d059891db1c136d267c6719d328dd7e9ea2dcd3c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c0ec743389a93ef103f58a1e55ae0186f068eff9","unresolved":false,"context_lines":[{"line_number":415,"context_line":""},{"line_number":416,"context_line":"    def _get_group_project_roles(self, session, groups, project_id,"},{"line_number":417,"context_line":"                                 project_domain_id):"},{"line_number":418,"context_line":"        # NOTE(rodrigods): we can\u0027t include roles from inherited assignments"},{"line_number":419,"context_line":"        sql_constraints \u003d sqlalchemy.and_("},{"line_number":420,"context_line":"            RoleAssignment.type \u003d\u003d AssignmentType.GROUP_PROJECT,"},{"line_number":421,"context_line":"            RoleAssignment.inherited \u003d\u003d false(),"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_2e9c686a","line":418,"updated":"2014-12-05 18:51:54.000000000","message":"Ok, so I know what you are trying to say, but it sounds a bit confusing. It looks like you are making this comment for the whole method (where really you mean this first constraints clause).  Maybe something like:\n\n\"First,  we always include projects with non-inherited assignments\"","commit_id":"da530b47bca537f494d70064d9ccf122ecc488f4"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8c9bf4fc3232b085b8830885cd951d8f89551ea4","unresolved":false,"context_lines":[{"line_number":415,"context_line":""},{"line_number":416,"context_line":"    def _get_group_project_roles(self, session, groups, project_id,"},{"line_number":417,"context_line":"                                 project_domain_id):"},{"line_number":418,"context_line":"        # NOTE(rodrigods): we can\u0027t include roles from inherited assignments"},{"line_number":419,"context_line":"        sql_constraints \u003d sqlalchemy.and_("},{"line_number":420,"context_line":"            RoleAssignment.type \u003d\u003d AssignmentType.GROUP_PROJECT,"},{"line_number":421,"context_line":"            RoleAssignment.inherited \u003d\u003d false(),"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_097166de","line":418,"in_reply_to":"5a890539_2e9c686a","updated":"2014-12-05 19:01:23.000000000","message":"makes sense, will update the comment. Thanks!","commit_id":"da530b47bca537f494d70064d9ccf122ecc488f4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a9908ab5663c129f0160bb9124a98ce88ba97290","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            project_ids \u003d set()"},{"line_number":259,"context_line":"            for assignment in assignments:"},{"line_number":260,"context_line":"                if (assignment.type \u003d\u003d AssignmentType.USER_PROJECT or"},{"line_number":261,"context_line":"                        assignment.type \u003d\u003d AssignmentType.GROUP_PROJECT):"},{"line_number":262,"context_line":"                    project_ids.add(assignment.target_id)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"            if not CONF.os_inherit.enabled:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_b1f236d0","line":261,"updated":"2014-12-10 07:18:15.000000000","message":"I think that maybe we need to test to make sure the assignment is non-inherited here....now that projects can have inheritance.\n\nIf so, I also think that maybe we are not testing some of these methods the way we should - since our unit tests are not finding this kind of error (and the ones I found in the previous version of this patch).  We test list_role_assignments well - as well as getting a token, but we should ensure that any of the methods that now are effected by inheritance (due to projects) are testing to make sure the correct roles are returned.","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b08c7af1defd6581e88bdfe4120f1d793431167b","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            project_ids \u003d set()"},{"line_number":259,"context_line":"            for assignment in assignments:"},{"line_number":260,"context_line":"                if (assignment.type \u003d\u003d AssignmentType.USER_PROJECT or"},{"line_number":261,"context_line":"                        assignment.type \u003d\u003d AssignmentType.GROUP_PROJECT):"},{"line_number":262,"context_line":"                    project_ids.add(assignment.target_id)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"            if not CONF.os_inherit.enabled:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_d9d1a058","line":261,"in_reply_to":"3a961159_b1f236d0","updated":"2014-12-10 13:55:12.000000000","message":"I *think* we had this check here, but it was breaking some tests not directly related to this change. Will investigate whats wrong.","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"05896c9374f7c671cf4c6d55b091b51cbe894cb8","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            project_ids \u003d set()"},{"line_number":259,"context_line":"            for assignment in assignments:"},{"line_number":260,"context_line":"                if (assignment.type \u003d\u003d AssignmentType.USER_PROJECT or"},{"line_number":261,"context_line":"                        assignment.type \u003d\u003d AssignmentType.GROUP_PROJECT):"},{"line_number":262,"context_line":"                    project_ids.add(assignment.target_id)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"            if not CONF.os_inherit.enabled:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_94827d92","line":261,"in_reply_to":"3a961159_d9d1a058","updated":"2014-12-10 14:06:38.000000000","message":"We need a test in test_backend to call this method and verify this case. Will add it.","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a9908ab5663c129f0160bb9124a98ce88ba97290","unresolved":false,"context_lines":[{"line_number":416,"context_line":"    def _get_group_project_roles(self, session, groups, project_id,"},{"line_number":417,"context_line":"                                 project_domain_id):"},{"line_number":418,"context_line":"        # NOTE(rodrigods): First, we always include projects with"},{"line_number":419,"context_line":"        # non-inherited assignments"},{"line_number":420,"context_line":"        sql_constraints \u003d sqlalchemy.and_("},{"line_number":421,"context_line":"            RoleAssignment.type \u003d\u003d AssignmentType.GROUP_PROJECT,"},{"line_number":422,"context_line":"            RoleAssignment.inherited \u003d\u003d false(),"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_d1ffc2a8","line":419,"updated":"2014-12-10 07:18:15.000000000","message":"nice comment","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"20cb71e6fe9274a568133ae058e6326491b7ea4d","unresolved":false,"context_lines":[{"line_number":420,"context_line":"                                 project_domain_id):"},{"line_number":421,"context_line":"        # NOTE(rodrigods): First, we always include projects with"},{"line_number":422,"context_line":"        # non-inherited assignments"},{"line_number":423,"context_line":"        sql_constraints \u003d sqlalchemy.and_("},{"line_number":424,"context_line":"            RoleAssignment.type \u003d\u003d AssignmentType.GROUP_PROJECT,"},{"line_number":425,"context_line":"            RoleAssignment.inherited \u003d\u003d false(),"},{"line_number":426,"context_line":"            RoleAssignment.target_id \u003d\u003d project_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_72b877c8","line":423,"updated":"2014-12-12 10:05:36.000000000","message":"\u0027sql_constraints\u0027 will be rewritten if inherit enabled so it can be moved to \u0027else:\u0027 section for \u0027if CONF.os_inherit.enabled\u0027 below.","commit_id":"ac5a118e1abe1fc0fd9f676f30436959c8cb1847"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5dfac1b9a45eff1e57dd2c5a159dd78c1e14101e","unresolved":false,"context_lines":[{"line_number":420,"context_line":"                                 project_domain_id):"},{"line_number":421,"context_line":"        # NOTE(rodrigods): First, we always include projects with"},{"line_number":422,"context_line":"        # non-inherited assignments"},{"line_number":423,"context_line":"        sql_constraints \u003d sqlalchemy.and_("},{"line_number":424,"context_line":"            RoleAssignment.type \u003d\u003d AssignmentType.GROUP_PROJECT,"},{"line_number":425,"context_line":"            RoleAssignment.inherited \u003d\u003d false(),"},{"line_number":426,"context_line":"            RoleAssignment.target_id \u003d\u003d project_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_d4f1146c","line":423,"in_reply_to":"3a961159_68eb2a13","updated":"2014-12-12 13:06:05.000000000","message":"+1 henry","commit_id":"ac5a118e1abe1fc0fd9f676f30436959c8cb1847"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1f8be0ff75cb323d666221b79c349f204bfd2089","unresolved":false,"context_lines":[{"line_number":420,"context_line":"                                 project_domain_id):"},{"line_number":421,"context_line":"        # NOTE(rodrigods): First, we always include projects with"},{"line_number":422,"context_line":"        # non-inherited assignments"},{"line_number":423,"context_line":"        sql_constraints \u003d sqlalchemy.and_("},{"line_number":424,"context_line":"            RoleAssignment.type \u003d\u003d AssignmentType.GROUP_PROJECT,"},{"line_number":425,"context_line":"            RoleAssignment.inherited \u003d\u003d false(),"},{"line_number":426,"context_line":"            RoleAssignment.target_id \u003d\u003d project_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_68eb2a13","line":423,"in_reply_to":"3a961159_72b877c8","updated":"2014-12-12 10:52:25.000000000","message":"I don\u0027t think so.....the sqlconstraints will be updated...note that the statements after the if CONF include these initial constants and _or_ the extra constraints to it","commit_id":"ac5a118e1abe1fc0fd9f676f30436959c8cb1847"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"4e585b6e64e9c1d4c13539c28229a02eb6673f66","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        if CONF.os_inherit.enabled:"},{"line_number":428,"context_line":"            # Inherited roles from domains"},{"line_number":429,"context_line":"            sql_constraints \u003d sqlalchemy.or_("},{"line_number":430,"context_line":"                sql_constraints,"},{"line_number":431,"context_line":"                sqlalchemy.and_("},{"line_number":432,"context_line":"                    RoleAssignment.type \u003d\u003d AssignmentType.GROUP_DOMAIN,"},{"line_number":433,"context_line":"                    RoleAssignment.inherited,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_97614ed5","line":430,"updated":"2014-12-12 13:12:54.000000000","message":"Pardon me, didn\u0027t notice it here","commit_id":"ac5a118e1abe1fc0fd9f676f30436959c8cb1847"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b81549ffc246057c8fba06331278e5131e4abad6","unresolved":false,"context_lines":[{"line_number":720,"context_line":"                # The group is missing, which should not happen since"},{"line_number":721,"context_line":"                # group deletion should remove any related assignments, so"},{"line_number":722,"context_line":"                # log a warning"},{"line_number":723,"context_line":"                if \u0027domain\u0027 in ref:"},{"line_number":724,"context_line":"                    target \u003d \u0027Domain: %s\u0027 % ref[\u0027domain\u0027].get(\u0027domain_id\u0027)"},{"line_number":725,"context_line":"                elif \u0027project\u0027 in ref:"},{"line_number":726,"context_line":"                    target \u003d \u0027Project: %s\u0027 % ref[\u0027project\u0027].get(\u0027project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_7a6a371b","line":723,"updated":"2014-12-02 22:26:45.000000000","message":"Maybe I missed something, but isn\u0027t this a formatted ref...so will there ever be \u0027domain\u0027 in ref?","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"eeabea452eca1ac48281f7d15691bca31d1eb8a9","unresolved":false,"context_lines":[{"line_number":720,"context_line":"                # The group is missing, which should not happen since"},{"line_number":721,"context_line":"                # group deletion should remove any related assignments, so"},{"line_number":722,"context_line":"                # log a warning"},{"line_number":723,"context_line":"                if \u0027domain\u0027 in ref:"},{"line_number":724,"context_line":"                    target \u003d \u0027Domain: %s\u0027 % ref[\u0027domain\u0027].get(\u0027domain_id\u0027)"},{"line_number":725,"context_line":"                elif \u0027project\u0027 in ref:"},{"line_number":726,"context_line":"                    target \u003d \u0027Project: %s\u0027 % ref[\u0027project\u0027].get(\u0027project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_6fc17b4d","line":723,"in_reply_to":"5a890539_7a6a371b","updated":"2014-12-03 14:40:15.000000000","message":"you\u0027re right... actually this method don\u0027t have a new logic IMO... Will undo the changes","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b81549ffc246057c8fba06331278e5131e4abad6","unresolved":false,"context_lines":[{"line_number":816,"context_line":"            if \u0027OS-INHERIT:inherited_to\u0027 in r[\u0027scope\u0027]:"},{"line_number":817,"context_line":"                # It\u0027s an inherited domain role - so get the list of projects"},{"line_number":818,"context_line":"                # owned by this domain. A domain scope is guaranteed since we"},{"line_number":819,"context_line":"                # checked this when we built the refs list"},{"line_number":820,"context_line":""},{"line_number":821,"context_line":"                if \u0027domain\u0027 in r[\u0027scope\u0027]:"},{"line_number":822,"context_line":"                    project_ids \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_9affe3aa","line":819,"updated":"2014-12-02 22:26:45.000000000","message":"not sure the comment is still accurate","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"eeabea452eca1ac48281f7d15691bca31d1eb8a9","unresolved":false,"context_lines":[{"line_number":816,"context_line":"            if \u0027OS-INHERIT:inherited_to\u0027 in r[\u0027scope\u0027]:"},{"line_number":817,"context_line":"                # It\u0027s an inherited domain role - so get the list of projects"},{"line_number":818,"context_line":"                # owned by this domain. A domain scope is guaranteed since we"},{"line_number":819,"context_line":"                # checked this when we built the refs list"},{"line_number":820,"context_line":""},{"line_number":821,"context_line":"                if \u0027domain\u0027 in r[\u0027scope\u0027]:"},{"line_number":822,"context_line":"                    project_ids \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_725b2422","line":819,"in_reply_to":"5a890539_9affe3aa","updated":"2014-12-03 14:40:15.000000000","message":"thanks, updated the comment","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1ec2c333f1f74c6d383dd3a3f740549706c455d9","unresolved":false,"context_lines":[{"line_number":914,"context_line":"            \u0027scope.OS-INHERIT:inherited_to\u0027 in query_string and"},{"line_number":915,"context_line":"                query_string[\u0027scope.OS-INHERIT:inherited_to\u0027] \u003d\u003d \u0027projects\u0027):"},{"line_number":916,"context_line":"            # Remove any role assignments with project scope and"},{"line_number":917,"context_line":"            # inherited_to_projects flag"},{"line_number":918,"context_line":"            formatted_refs \u003d ("},{"line_number":919,"context_line":"                [x for x in formatted_refs"},{"line_number":920,"context_line":"                    if not (\u0027project\u0027 in x[\u0027scope\u0027] and"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_1a44451a","line":917,"updated":"2014-12-05 20:21:34.000000000","message":"I\u0027m not quite sure why we are removing these.  If we are not in effective mode...don\u0027t we just pass back the actually assignments (and I\u0027d have thought we treat domain and project inheritance exactly the same way)?","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b31394acbfe1aafa4c64459917a0f68dad0bb7e9","unresolved":false,"context_lines":[{"line_number":914,"context_line":"            \u0027scope.OS-INHERIT:inherited_to\u0027 in query_string and"},{"line_number":915,"context_line":"                query_string[\u0027scope.OS-INHERIT:inherited_to\u0027] \u003d\u003d \u0027projects\u0027):"},{"line_number":916,"context_line":"            # Remove any role assignments with project scope and"},{"line_number":917,"context_line":"            # inherited_to_projects flag"},{"line_number":918,"context_line":"            formatted_refs \u003d ("},{"line_number":919,"context_line":"                [x for x in formatted_refs"},{"line_number":920,"context_line":"                    if not (\u0027project\u0027 in x[\u0027scope\u0027] and"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_3a23c107","line":917,"in_reply_to":"5a890539_1a44451a","updated":"2014-12-05 20:30:43.000000000","message":"thought we would return the inherited assignment only with if user requested with this flag. If we have a role assignment with the inherited to projects flag, what should be return for the following requests?\n\n GET /role_assignments\n GET /role_assignments?scope.OS-INHERIT:inherited_to\u003dprojects","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9a9abce9c55cf980b88477e18d92e82655bcdf4b","unresolved":false,"context_lines":[{"line_number":914,"context_line":"            \u0027scope.OS-INHERIT:inherited_to\u0027 in query_string and"},{"line_number":915,"context_line":"                query_string[\u0027scope.OS-INHERIT:inherited_to\u0027] \u003d\u003d \u0027projects\u0027):"},{"line_number":916,"context_line":"            # Remove any role assignments with project scope and"},{"line_number":917,"context_line":"            # inherited_to_projects flag"},{"line_number":918,"context_line":"            formatted_refs \u003d ("},{"line_number":919,"context_line":"                [x for x in formatted_refs"},{"line_number":920,"context_line":"                    if not (\u0027project\u0027 in x[\u0027scope\u0027] and"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_65392a3f","line":917,"in_reply_to":"5a890539_3a23c107","updated":"2014-12-05 21:17:01.000000000","message":"no...pretty sure we always return whatever assignments are in place when we are listing in non-effective mode.  The request:\n\nGET /role_assignments?scope.OS-INHERIT:inherited_to\u003dprojects\n\nis a filter to the list to ONLY return those assignments that are inherited to projects","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"221edb1c505529a87c895b1bedf6eb1a0135ee2d","unresolved":false,"context_lines":[{"line_number":914,"context_line":"            \u0027scope.OS-INHERIT:inherited_to\u0027 in query_string and"},{"line_number":915,"context_line":"                query_string[\u0027scope.OS-INHERIT:inherited_to\u0027] \u003d\u003d \u0027projects\u0027):"},{"line_number":916,"context_line":"            # Remove any role assignments with project scope and"},{"line_number":917,"context_line":"            # inherited_to_projects flag"},{"line_number":918,"context_line":"            formatted_refs \u003d ("},{"line_number":919,"context_line":"                [x for x in formatted_refs"},{"line_number":920,"context_line":"                    if not (\u0027project\u0027 in x[\u0027scope\u0027] and"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_4e71a6dd","line":917,"in_reply_to":"5a890539_65392a3f","updated":"2014-12-06 11:38:42.000000000","message":"thanks! will fix this and the respective test.","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"efc7606e34998dce7ba6f3b8875ac135d10744f1","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"        \"\"\""},{"line_number":707,"context_line":"        def _get_group_members(ref):"},{"line_number":708,"context_line":"            \"\"\"Get a list of group members."},{"line_number":709,"context_line":"            Get the list of group members.  If this fails with"},{"line_number":710,"context_line":"            GroupNotFound, then log this as a warning, but allow"},{"line_number":711,"context_line":"            overall processing to continue."}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_5a5674d3","line":708,"updated":"2014-12-10 18:24:08.000000000","message":"is there a reason for removing these blank lines?  Seems to break the guidelines for docstrings.","commit_id":"79c26fa1e533d24191d87cd162d553cb1b73cdaf"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1eacaeebfdd9ddcd712c69c11eff19b6f794d3b5","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"        \"\"\""},{"line_number":707,"context_line":"        def _get_group_members(ref):"},{"line_number":708,"context_line":"            \"\"\"Get a list of group members."},{"line_number":709,"context_line":"            Get the list of group members.  If this fails with"},{"line_number":710,"context_line":"            GroupNotFound, then log this as a warning, but allow"},{"line_number":711,"context_line":"            overall processing to continue."}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_b5512910","line":708,"in_reply_to":"3a961159_5a5674d3","updated":"2014-12-11 17:50:23.000000000","message":"not at all, will add them back.","commit_id":"79c26fa1e533d24191d87cd162d553cb1b73cdaf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2dcee0c631085f64131dbd866cf76ee20612440d","unresolved":false,"context_lines":[{"line_number":885,"context_line":"    def _filter_inherited(self, entry):"},{"line_number":886,"context_line":"        if (\u0027inherited_to_projects\u0027 in entry and"},{"line_number":887,"context_line":"                not CONF.os_inherit.enabled):"},{"line_number":888,"context_line":"                return False"},{"line_number":889,"context_line":"        else:"},{"line_number":890,"context_line":"            return True"},{"line_number":891,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_4f2e8d44","line":888,"updated":"2014-12-11 18:20:16.000000000","message":"(nit) I think really this return statement could be even less indented (since the second line of the if clause has been (correctly) over indented)...but this change isn\u0027t part of this patch...so really should be no change at all here...","commit_id":"47866bf4a8c70a39daaec2b498ae4d6989928a4b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bffb50c76e76f0e8152a719cbc3b65417062fe08","unresolved":false,"context_lines":[{"line_number":885,"context_line":"    def _filter_inherited(self, entry):"},{"line_number":886,"context_line":"        if (\u0027inherited_to_projects\u0027 in entry and"},{"line_number":887,"context_line":"                not CONF.os_inherit.enabled):"},{"line_number":888,"context_line":"                return False"},{"line_number":889,"context_line":"        else:"},{"line_number":890,"context_line":"            return True"},{"line_number":891,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_9556c2cc","line":888,"in_reply_to":"3a961159_4f2e8d44","updated":"2014-12-11 19:26:35.000000000","message":"Done","commit_id":"47866bf4a8c70a39daaec2b498ae4d6989928a4b"}],"keystone/assignment/core.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b81549ffc246057c8fba06331278e5131e4abad6","unresolved":false,"context_lines":[{"line_number":240,"context_line":"            # from a parent project. There is no need to support it on"},{"line_number":241,"context_line":"            # other backend because get_roles_for_user_and_project will"},{"line_number":242,"context_line":"            # be replaced by list_role_assignments filtered by user and"},{"line_number":243,"context_line":"            # user in effective mode."},{"line_number":244,"context_line":"            return self.driver.get_group_project_roles("},{"line_number":245,"context_line":"                group_ids,"},{"line_number":246,"context_line":"                project_ref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_7a095730","line":243,"updated":"2014-12-02 22:26:45.000000000","message":"maybe reword this - I think what you means is that inherited roles re not currently supported on other backends....and the plan for adding that support is by a future improvement to list_role_assignments?  If so, maybe make that bit a TODO.","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"eeabea452eca1ac48281f7d15691bca31d1eb8a9","unresolved":false,"context_lines":[{"line_number":240,"context_line":"            # from a parent project. There is no need to support it on"},{"line_number":241,"context_line":"            # other backend because get_roles_for_user_and_project will"},{"line_number":242,"context_line":"            # be replaced by list_role_assignments filtered by user and"},{"line_number":243,"context_line":"            # user in effective mode."},{"line_number":244,"context_line":"            return self.driver.get_group_project_roles("},{"line_number":245,"context_line":"                group_ids,"},{"line_number":246,"context_line":"                project_ref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_f2b554ed","line":243,"in_reply_to":"5a890539_7a095730","updated":"2014-12-03 14:40:15.000000000","message":"makes sense, will keep just the first sentence since this code is being changed right now in other patches.","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b81549ffc246057c8fba06331278e5131e4abad6","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                                              tenant_id\u003dproject_id)"},{"line_number":252,"context_line":"            role_list \u003d self._roles_from_role_dicts("},{"line_number":253,"context_line":"                metadata_ref.get(\u0027roles\u0027, {}), False)"},{"line_number":254,"context_line":"            # Inherited roles are also considered for projects"},{"line_number":255,"context_line":"            role_list +\u003d self._roles_from_role_dicts("},{"line_number":256,"context_line":"                metadata_ref.get(\u0027roles\u0027, {}), True)"},{"line_number":257,"context_line":"            return role_list"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_1a413363","line":254,"updated":"2014-12-02 22:26:45.000000000","message":"not sure about this...surely an inhered role is not valid on the project itself...only its children? (if we are keeping with the same rules as existing inherited roles on domains)","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"22b5b8679d2c50b929f11ce3148edb8447a5ad31","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                                              tenant_id\u003dproject_id)"},{"line_number":252,"context_line":"            role_list \u003d self._roles_from_role_dicts("},{"line_number":253,"context_line":"                metadata_ref.get(\u0027roles\u0027, {}), False)"},{"line_number":254,"context_line":"            # Inherited roles are also considered for projects"},{"line_number":255,"context_line":"            role_list +\u003d self._roles_from_role_dicts("},{"line_number":256,"context_line":"                metadata_ref.get(\u0027roles\u0027, {}), True)"},{"line_number":257,"context_line":"            return role_list"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_71c79912","line":254,"in_reply_to":"5a890539_0ed8f0ed","updated":"2014-12-03 17:17:10.000000000","message":"yeah, this can definely break the initial design and we might expect the same behaviour as for domains.\n\nwill check if there is a use case to not change this.","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"eeabea452eca1ac48281f7d15691bca31d1eb8a9","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                                              tenant_id\u003dproject_id)"},{"line_number":252,"context_line":"            role_list \u003d self._roles_from_role_dicts("},{"line_number":253,"context_line":"                metadata_ref.get(\u0027roles\u0027, {}), False)"},{"line_number":254,"context_line":"            # Inherited roles are also considered for projects"},{"line_number":255,"context_line":"            role_list +\u003d self._roles_from_role_dicts("},{"line_number":256,"context_line":"                metadata_ref.get(\u0027roles\u0027, {}), True)"},{"line_number":257,"context_line":"            return role_list"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_f29ab460","line":254,"in_reply_to":"5a890539_1a413363","updated":"2014-12-03 14:40:15.000000000","message":"actually, a inhereted role is considered for the project itself diferently from what happens with domains. Do you have any objections about this?","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a90d24984f967e48f1230c02c96b19aa7328473d","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                                              tenant_id\u003dproject_id)"},{"line_number":252,"context_line":"            role_list \u003d self._roles_from_role_dicts("},{"line_number":253,"context_line":"                metadata_ref.get(\u0027roles\u0027, {}), False)"},{"line_number":254,"context_line":"            # Inherited roles are also considered for projects"},{"line_number":255,"context_line":"            role_list +\u003d self._roles_from_role_dicts("},{"line_number":256,"context_line":"                metadata_ref.get(\u0027roles\u0027, {}), True)"},{"line_number":257,"context_line":"            return role_list"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_0ed8f0ed","line":254,"in_reply_to":"5a890539_f29ab460","updated":"2014-12-03 17:04:29.000000000","message":"Oh boy! OK, we need to discuss that.  Not sure how confusing that will be....or how appropriate it will be once we make domains into projects.  This sounds like a change from the original design.","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cf40fa884411e08f7411d0ba17c25bf9e03ccad2","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        def _get_user_project_roles(user_id, project_ref):"},{"line_number":257,"context_line":"            role_list \u003d []"},{"line_number":258,"context_line":"            try:"},{"line_number":259,"context_line":"                role_list \u003d _user_project_roles(user_id, project_ref[\u0027id\u0027])"},{"line_number":260,"context_line":"            except exception.MetadataNotFound:"},{"line_number":261,"context_line":"                pass"},{"line_number":262,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_e507dac7","line":259,"updated":"2014-12-05 21:15:12.000000000","message":"(nit) It seems a bit strange that you have broken this functionality out as a method, yet left almost exactly the same type of functionality below in the inherited case.","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"221edb1c505529a87c895b1bedf6eb1a0135ee2d","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        def _get_user_project_roles(user_id, project_ref):"},{"line_number":257,"context_line":"            role_list \u003d []"},{"line_number":258,"context_line":"            try:"},{"line_number":259,"context_line":"                role_list \u003d _user_project_roles(user_id, project_ref[\u0027id\u0027])"},{"line_number":260,"context_line":"            except exception.MetadataNotFound:"},{"line_number":261,"context_line":"                pass"},{"line_number":262,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_ce4cb6a0","line":259,"in_reply_to":"5a890539_e507dac7","updated":"2014-12-06 11:38:42.000000000","message":"you are right, we had an additional call to _roles_from_role_dict() because of the past behaviour which was including the project with the inherited_role flag in the effective assignments. Will undo this change.","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a9908ab5663c129f0160bb9124a98ce88ba97290","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        def _get_group_project_roles(user_id, project_ref):"},{"line_number":241,"context_line":"            group_ids \u003d self._get_group_ids_for_user_id(user_id)"},{"line_number":242,"context_line":"            # NOTE(samuelmz): Only SQL backend returns roles inherited"},{"line_number":243,"context_line":"            # from a parent project."},{"line_number":244,"context_line":"            return self.driver.get_group_project_roles("},{"line_number":245,"context_line":"                group_ids,"},{"line_number":246,"context_line":"                project_ref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_71736e80","line":243,"updated":"2014-12-10 07:18:15.000000000","message":"I\u0027m not  really sure this comment belongs here....I don\u0027t think knowing this fact helps me understand any of the methods in core.py.  I\u0027d leave it to the methods in the drivers to say whether they support this or not.","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b08c7af1defd6581e88bdfe4120f1d793431167b","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        def _get_group_project_roles(user_id, project_ref):"},{"line_number":241,"context_line":"            group_ids \u003d self._get_group_ids_for_user_id(user_id)"},{"line_number":242,"context_line":"            # NOTE(samuelmz): Only SQL backend returns roles inherited"},{"line_number":243,"context_line":"            # from a parent project."},{"line_number":244,"context_line":"            return self.driver.get_group_project_roles("},{"line_number":245,"context_line":"                group_ids,"},{"line_number":246,"context_line":"                project_ref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_99c5583e","line":243,"in_reply_to":"3a961159_71736e80","updated":"2014-12-10 13:55:12.000000000","message":"makes sense, will remove it.","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a9908ab5663c129f0160bb9124a98ce88ba97290","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                project_ref[\u0027id\u0027],"},{"line_number":247,"context_line":"                project_ref[\u0027domain_id\u0027])"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        def _user_project_roles(user_id, project_id):"},{"line_number":250,"context_line":"            metadata_ref \u003d self._get_metadata(user_id\u003duser_id,"},{"line_number":251,"context_line":"                                              tenant_id\u003dproject_id)"},{"line_number":252,"context_line":"            role_list \u003d self._roles_from_role_dicts("}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_5114b2f4","line":249,"updated":"2014-12-10 07:18:15.000000000","message":"do we still need this method?","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b08c7af1defd6581e88bdfe4120f1d793431167b","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                project_ref[\u0027id\u0027],"},{"line_number":247,"context_line":"                project_ref[\u0027domain_id\u0027])"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        def _user_project_roles(user_id, project_id):"},{"line_number":250,"context_line":"            metadata_ref \u003d self._get_metadata(user_id\u003duser_id,"},{"line_number":251,"context_line":"                                              tenant_id\u003dproject_id)"},{"line_number":252,"context_line":"            role_list \u003d self._roles_from_role_dicts("}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_b9c0542b","line":249,"in_reply_to":"3a961159_5114b2f4","updated":"2014-12-10 13:55:12.000000000","message":"nope, will remove it :)","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"86a6dcde86b9793520a282b423f638be7f47d61a","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                    p_roles \u003d self.list_grants("},{"line_number":269,"context_line":"                        user_id\u003duser_id, project_id\u003dp[\u0027id\u0027],"},{"line_number":270,"context_line":"                        inherited_to_projects\u003dTrue)"},{"line_number":271,"context_line":"                    role_list +\u003d [x[\u0027id\u0027] for x in p_roles]"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"            return role_list"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_ba5d6d7b","line":271,"updated":"2014-12-11 19:06:47.000000000","message":"We may want to pre-calculate this with something cacheable (memoized) in the future. i\u0027m concerned this is going to get expensive.","commit_id":"47866bf4a8c70a39daaec2b498ae4d6989928a4b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"953dd8452ad15605af378157185271f80588b79a","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                        metadata_ref.get(\u0027roles\u0027, {}), True)"},{"line_number":264,"context_line":"                except (exception.MetadataNotFound, exception.NotImplemented):"},{"line_number":265,"context_line":"                    pass"},{"line_number":266,"context_line":"                # As well inherited roles from parent projects"},{"line_number":267,"context_line":"                for p in self.list_project_parents(project_ref[\u0027id\u0027]):"},{"line_number":268,"context_line":"                    p_roles \u003d self.list_grants("},{"line_number":269,"context_line":"                        user_id\u003duser_id, project_id\u003dp[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_a93423fc","line":266,"updated":"2014-12-12 21:20:06.000000000","message":"nit: as well as*?","commit_id":"ac5a118e1abe1fc0fd9f676f30436959c8cb1847"}],"keystone/assignment/routers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b81549ffc246057c8fba06331278e5131e4abad6","unresolved":false,"context_lines":[{"line_number":260,"context_line":"                    \u0027project_id\u0027: json_home.Parameters.PROJECT_ID,"},{"line_number":261,"context_line":"                    \u0027group_id\u0027: json_home.Parameters.GROUP_ID,"},{"line_number":262,"context_line":"                    \u0027role_id\u0027: json_home.Parameters.ROLE_ID,"},{"line_number":263,"context_line":"                })"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_256b30ba","line":263,"updated":"2014-12-02 22:26:45.000000000","message":"are there no list routes for the new API?","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a90d24984f967e48f1230c02c96b19aa7328473d","unresolved":false,"context_lines":[{"line_number":260,"context_line":"                    \u0027project_id\u0027: json_home.Parameters.PROJECT_ID,"},{"line_number":261,"context_line":"                    \u0027group_id\u0027: json_home.Parameters.GROUP_ID,"},{"line_number":262,"context_line":"                    \u0027role_id\u0027: json_home.Parameters.ROLE_ID,"},{"line_number":263,"context_line":"                })"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_4eff5802","line":263,"in_reply_to":"5a890539_123f4026","updated":"2014-12-03 17:04:29.000000000","message":"OK....might seem a bit odd without it (since this does exist for inherited domain roles)","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"eeabea452eca1ac48281f7d15691bca31d1eb8a9","unresolved":false,"context_lines":[{"line_number":260,"context_line":"                    \u0027project_id\u0027: json_home.Parameters.PROJECT_ID,"},{"line_number":261,"context_line":"                    \u0027group_id\u0027: json_home.Parameters.GROUP_ID,"},{"line_number":262,"context_line":"                    \u0027role_id\u0027: json_home.Parameters.ROLE_ID,"},{"line_number":263,"context_line":"                })"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_123f4026","line":263,"in_reply_to":"5a890539_256b30ba","updated":"2014-12-03 14:40:15.000000000","message":"no... it was decided that list_grants() wouldn\u0027t be covered, since the idea was to move this semantic to list_role_assignments()","commit_id":"fd90990eb4dc471e40abbd9115717ac077de8335"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"efc7606e34998dce7ba6f3b8875ac135d10744f1","unresolved":false,"context_lines":[{"line_number":5048,"context_line":"        - Enable OS-INHERIT extension"},{"line_number":5049,"context_line":"        - Create a hierarchy of projects with one root and one leaf project"},{"line_number":5050,"context_line":"        - Assign an inherited user role on the root project"},{"line_number":5051,"context_line":"        - Get a list of projects for user, should return only the leaf project"},{"line_number":5052,"context_line":""},{"line_number":5053,"context_line":"        \"\"\""},{"line_number":5054,"context_line":"        self.config_fixture.config(group\u003d\u0027os_inherit\u0027, enabled\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_7a7df0b0","line":5051,"updated":"2014-12-10 18:24:08.000000000","message":"I\u0027d like to suggest a slightly more complicated test which has both inherited and non-inherited roles at each level.  Then you should issue the list command both with and without os_inherit enabled, making sure that the right set of assignments are returned in each case (and do a listing for both the root and the leaf).  This will catch the recent bugs you fixed to do with whether inherited\u003d\u003dfalse() was included or not with os_inherit off.","commit_id":"79c26fa1e533d24191d87cd162d553cb1b73cdaf"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1eacaeebfdd9ddcd712c69c11eff19b6f794d3b5","unresolved":false,"context_lines":[{"line_number":5048,"context_line":"        - Enable OS-INHERIT extension"},{"line_number":5049,"context_line":"        - Create a hierarchy of projects with one root and one leaf project"},{"line_number":5050,"context_line":"        - Assign an inherited user role on the root project"},{"line_number":5051,"context_line":"        - Get a list of projects for user, should return only the leaf project"},{"line_number":5052,"context_line":""},{"line_number":5053,"context_line":"        \"\"\""},{"line_number":5054,"context_line":"        self.config_fixture.config(group\u003d\u0027os_inherit\u0027, enabled\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_54b8e0c7","line":5051,"in_reply_to":"3a961159_7a7df0b0","updated":"2014-12-11 17:50:23.000000000","message":"Ok, agreed that we should have a slightly complex test case. Will go with the following plan:\n- enable os-inherit ext\n- inherited role and non-inherited role for root_project\n- list_projects_for_user() returns 2 projects (root and leaf)\n- disable os-inherit ext\n- list_projects_for_user() returns 1 project (root)\n\nWill submit a new patch with this test. If you have suggestions, or think this still a too simple testcase, please let me know :)","commit_id":"79c26fa1e533d24191d87cd162d553cb1b73cdaf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"efc7606e34998dce7ba6f3b8875ac135d10744f1","unresolved":false,"context_lines":[{"line_number":5154,"context_line":"        - Create a hierarchy of projects with one root and one leaf project"},{"line_number":5155,"context_line":"        - Assign an inherited group role on the root project"},{"line_number":5156,"context_line":"        - Add a user to the group with inherited group role"},{"line_number":5157,"context_line":"        - Get a list of projects for user, should return only the leaf project"},{"line_number":5158,"context_line":""},{"line_number":5159,"context_line":"        \"\"\""},{"line_number":5160,"context_line":"        self.config_fixture.config(group\u003d\u0027os_inherit\u0027, enabled\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_ba4e7894","line":5157,"updated":"2014-12-10 18:24:08.000000000","message":"and probably the same here...","commit_id":"79c26fa1e533d24191d87cd162d553cb1b73cdaf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"efc7606e34998dce7ba6f3b8875ac135d10744f1","unresolved":false,"context_lines":[{"line_number":5190,"context_line":"        user_projects \u003d self.assignment_api.list_projects_for_user(user[\u0027id\u0027])"},{"line_number":5191,"context_line":"        self.assertEqual(1, len(user_projects))"},{"line_number":5192,"context_line":"        self.assertIn(leaf_project, user_projects)"},{"line_number":5193,"context_line":""},{"line_number":5194,"context_line":""},{"line_number":5195,"context_line":"class FilterTests(filtering.FilterTests):"},{"line_number":5196,"context_line":"    def test_list_users_filtered(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_5a7834f2","line":5193,"updated":"2014-12-10 18:24:08.000000000","message":"same here","commit_id":"79c26fa1e533d24191d87cd162d553cb1b73cdaf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2dcee0c631085f64131dbd866cf76ee20612440d","unresolved":false,"context_lines":[{"line_number":5051,"context_line":"        - Assign a non-inherited user role on root project"},{"line_number":5052,"context_line":"        - Get a list of projects for user, should return both projects"},{"line_number":5053,"context_line":"        - Disable OS-INHERIT extension"},{"line_number":5054,"context_line":"        - Get a list of projects for user, should return only root project"},{"line_number":5055,"context_line":""},{"line_number":5056,"context_line":"        \"\"\""},{"line_number":5057,"context_line":"        # Enable OS-INHERIT extension"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_0f6ac580","line":5054,"updated":"2014-12-11 18:20:16.000000000","message":"nice","commit_id":"47866bf4a8c70a39daaec2b498ae4d6989928a4b"}],"keystone/tests/test_backend_ldap.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"86a6dcde86b9793520a282b423f638be7f47d61a","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        self.skipTest(\u0027N/A: LDAP does not support multiple domains\u0027)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_inherited_grant_for_user_on_project_crud(self):"},{"line_number":261,"context_line":"        self.skipTest(\u0027N/A: LDAP does not support multiple domains\u0027)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def test_inherited_grant_for_group_on_project_crud(self):"},{"line_number":264,"context_line":"        self.skipTest(\u0027N/A: LDAP does not support multiple domains\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_3ae09d95","line":261,"updated":"2014-12-11 19:06:47.000000000","message":"Again, please look for the actual result (even if this is a NotImplemented) not a skip test - this *needs* to be at least in a followup patch.","commit_id":"47866bf4a8c70a39daaec2b498ae4d6989928a4b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bffb50c76e76f0e8152a719cbc3b65417062fe08","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        self.skipTest(\u0027N/A: LDAP does not support multiple domains\u0027)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_inherited_grant_for_user_on_project_crud(self):"},{"line_number":261,"context_line":"        self.skipTest(\u0027N/A: LDAP does not support multiple domains\u0027)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def test_inherited_grant_for_group_on_project_crud(self):"},{"line_number":264,"context_line":"        self.skipTest(\u0027N/A: LDAP does not support multiple domains\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_f57aa622","line":261,"in_reply_to":"3a961159_3ae09d95","updated":"2014-12-11 19:26:35.000000000","message":"Those tests are not necessary here, seems to be result from an old rebase. Thanks for the feedback.","commit_id":"47866bf4a8c70a39daaec2b498ae4d6989928a4b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"86a6dcde86b9793520a282b423f638be7f47d61a","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        self.skipTest(\u0027N/A: LDAP does not support multiple domains\u0027)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def test_inherited_grant_for_group_on_project_crud(self):"},{"line_number":264,"context_line":"        self.skipTest(\u0027N/A: LDAP does not support multiple domains\u0027)"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def test_list_projects_for_user(self):"},{"line_number":267,"context_line":"        domain \u003d self._get_domain_fixture()"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_9ae6f1ae","line":264,"updated":"2014-12-11 19:06:47.000000000","message":"same as above.","commit_id":"47866bf4a8c70a39daaec2b498ae4d6989928a4b"}],"keystone/tests/test_v3_assignment.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f50f5a8355e19c5e7a717f8c3b7a13c23cdebe63","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"        self.assertRoleAssignmentInListResponse(r, non_inher_up_entity,"},{"line_number":2110,"context_line":"                                                non_inher_up_url)"},{"line_number":2111,"context_line":""},{"line_number":2112,"context_line":"        # Assert that the user has inherited role on root project"},{"line_number":2113,"context_line":"        self.assertRoleAssignmentInListResponse(r, inher_up_entity,"},{"line_number":2114,"context_line":"                                                inher_up_url)"},{"line_number":2115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_93412d0c","line":2112,"updated":"2014-12-04 22:24:55.000000000","message":"user *does not have*","commit_id":"8d3224dae700971590c4eb961d0968418db9d235"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cf40fa884411e08f7411d0ba17c25bf9e03ccad2","unresolved":false,"context_lines":[{"line_number":1962,"context_line":"        self.assignment_api.create_project(leaf[\u0027id\u0027], leaf)"},{"line_number":1963,"context_line":""},{"line_number":1964,"context_line":"        # Create \u0027non-inherited\u0027 and \u0027inherited\u0027 roles"},{"line_number":1965,"context_line":"        non_inherited_role \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: \u0027non-inherited\u0027}"},{"line_number":1966,"context_line":"        self.assignment_api.create_role(non_inherited_role[\u0027id\u0027],"},{"line_number":1967,"context_line":"                                        non_inherited_role)"},{"line_number":1968,"context_line":"        inherited_role \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: \u0027inherited\u0027}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_65e12afc","line":1965,"updated":"2014-12-05 21:15:12.000000000","message":"is there a particular reason to use a human readable string here?  We tend not to do that to avoid any potential clashes with other tests","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"221edb1c505529a87c895b1bedf6eb1a0135ee2d","unresolved":false,"context_lines":[{"line_number":1962,"context_line":"        self.assignment_api.create_project(leaf[\u0027id\u0027], leaf)"},{"line_number":1963,"context_line":""},{"line_number":1964,"context_line":"        # Create \u0027non-inherited\u0027 and \u0027inherited\u0027 roles"},{"line_number":1965,"context_line":"        non_inherited_role \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: \u0027non-inherited\u0027}"},{"line_number":1966,"context_line":"        self.assignment_api.create_role(non_inherited_role[\u0027id\u0027],"},{"line_number":1967,"context_line":"                                        non_inherited_role)"},{"line_number":1968,"context_line":"        inherited_role \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: \u0027inherited\u0027}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_2e5b7a56","line":1965,"in_reply_to":"5a890539_65e12afc","updated":"2014-12-06 11:38:42.000000000","message":"yes, it was easier to debug the results with such name since we have not so trivial combinations of filters, etc.","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cf40fa884411e08f7411d0ba17c25bf9e03ccad2","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"        self.assertRoleAssignmentInListResponse(r, non_inher_up_entity,"},{"line_number":2110,"context_line":"                                                non_inher_up_url)"},{"line_number":2111,"context_line":""},{"line_number":2112,"context_line":"        # Assert that the user does not have inherited role on root project"},{"line_number":2113,"context_line":"        self.assertRoleAssignmentNotInListResponse(r, inher_up_entity,"},{"line_number":2114,"context_line":"                                                   inher_up_url)"},{"line_number":2115,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_8573764d","line":2112,"updated":"2014-12-05 21:15:12.000000000","message":"As per my comment in the actual code, in non-effective mode, you should still see this role","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"221edb1c505529a87c895b1bedf6eb1a0135ee2d","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"        self.assertRoleAssignmentInListResponse(r, non_inher_up_entity,"},{"line_number":2110,"context_line":"                                                non_inher_up_url)"},{"line_number":2111,"context_line":""},{"line_number":2112,"context_line":"        # Assert that the user does not have inherited role on root project"},{"line_number":2113,"context_line":"        self.assertRoleAssignmentNotInListResponse(r, inher_up_entity,"},{"line_number":2114,"context_line":"                                                   inher_up_url)"},{"line_number":2115,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_4e58c657","line":2112,"in_reply_to":"5a890539_8573764d","updated":"2014-12-06 11:38:42.000000000","message":"++","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cf40fa884411e08f7411d0ba17c25bf9e03ccad2","unresolved":false,"context_lines":[{"line_number":2113,"context_line":"        self.assertRoleAssignmentNotInListResponse(r, inher_up_entity,"},{"line_number":2114,"context_line":"                                                   inher_up_url)"},{"line_number":2115,"context_line":""},{"line_number":2116,"context_line":"        # Assert that the user does not have non-inherited role on leaf project"},{"line_number":2117,"context_line":"        non_inher_up_url \u003d (\u0027/projects/%s/users/%s/roles/%s\u0027 %"},{"line_number":2118,"context_line":"                            (leaf_id, self.user[\u0027id\u0027], non_inherited_role_id))"},{"line_number":2119,"context_line":"        non_inher_up_entity[\u0027scope\u0027][\u0027project\u0027][\u0027id\u0027] \u003d leaf_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_05e5c6db","line":2116,"updated":"2014-12-05 21:15:12.000000000","message":"It\u0027s kind of hard to work out what *should* be expected here.  I\u0027d suggest we need a paragraph a bit further up as to what we expect to find an why","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"221edb1c505529a87c895b1bedf6eb1a0135ee2d","unresolved":false,"context_lines":[{"line_number":2113,"context_line":"        self.assertRoleAssignmentNotInListResponse(r, inher_up_entity,"},{"line_number":2114,"context_line":"                                                   inher_up_url)"},{"line_number":2115,"context_line":""},{"line_number":2116,"context_line":"        # Assert that the user does not have non-inherited role on leaf project"},{"line_number":2117,"context_line":"        non_inher_up_url \u003d (\u0027/projects/%s/users/%s/roles/%s\u0027 %"},{"line_number":2118,"context_line":"                            (leaf_id, self.user[\u0027id\u0027], non_inherited_role_id))"},{"line_number":2119,"context_line":"        non_inher_up_entity[\u0027scope\u0027][\u0027project\u0027][\u0027id\u0027] \u003d leaf_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_6e55821d","line":2116,"in_reply_to":"5a890539_05e5c6db","updated":"2014-12-06 11:38:42.000000000","message":"docstring explaining the test plan?","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"66e187fd7d979db78f35f19adb93395ee64d98c3","unresolved":false,"context_lines":[{"line_number":2113,"context_line":"        self.assertRoleAssignmentNotInListResponse(r, inher_up_entity,"},{"line_number":2114,"context_line":"                                                   inher_up_url)"},{"line_number":2115,"context_line":""},{"line_number":2116,"context_line":"        # Assert that the user does not have non-inherited role on leaf project"},{"line_number":2117,"context_line":"        non_inher_up_url \u003d (\u0027/projects/%s/users/%s/roles/%s\u0027 %"},{"line_number":2118,"context_line":"                            (leaf_id, self.user[\u0027id\u0027], non_inherited_role_id))"},{"line_number":2119,"context_line":"        non_inher_up_entity[\u0027scope\u0027][\u0027project\u0027][\u0027id\u0027] \u003d leaf_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_842e0f8b","line":2116,"in_reply_to":"5a890539_6e55821d","updated":"2014-12-06 15:39:54.000000000","message":"yep, something like that would be great","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cf40fa884411e08f7411d0ba17c25bf9e03ccad2","unresolved":false,"context_lines":[{"line_number":2148,"context_line":"        r \u003d self.get(collection_url)"},{"line_number":2149,"context_line":"        self.assertValidRoleAssignmentListResponse(r,"},{"line_number":2150,"context_line":"                                                   resource_url\u003dcollection_url)"},{"line_number":2151,"context_line":""},{"line_number":2152,"context_line":"        # Assert that the user has non-inherited role on root project"},{"line_number":2153,"context_line":"        self.assertRoleAssignmentInListResponse(r, non_inher_up_entity,"},{"line_number":2154,"context_line":"                                                non_inher_up_url)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_85d8d61f","line":2151,"updated":"2014-12-05 21:15:12.000000000","message":"and same here","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cf40fa884411e08f7411d0ba17c25bf9e03ccad2","unresolved":false,"context_lines":[{"line_number":2193,"context_line":"        r \u003d self.get(collection_url)"},{"line_number":2194,"context_line":"        self.assertValidRoleAssignmentListResponse(r,"},{"line_number":2195,"context_line":"                                                   resource_url\u003dcollection_url)"},{"line_number":2196,"context_line":""},{"line_number":2197,"context_line":"        # Assert that the user does not have non-inherited role on root project"},{"line_number":2198,"context_line":"        self.assertRoleAssignmentNotInListResponse(r, non_inher_up_entity,"},{"line_number":2199,"context_line":"                                                   non_inher_up_url)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_c501fe6e","line":2196,"updated":"2014-12-05 21:15:12.000000000","message":"ditto","commit_id":"2e941fd90e390af73737684434422534277b209b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a9908ab5663c129f0160bb9124a98ce88ba97290","unresolved":false,"context_lines":[{"line_number":1948,"context_line":""},{"line_number":1949,"context_line":"    def _setup_hierarchical_projects_scenario(self):"},{"line_number":1950,"context_line":"        \"\"\"Creates basic hierarchical projects scenario: a root and a leaf"},{"line_number":1951,"context_line":"        project and non-inherited and inherited roles as well."},{"line_number":1952,"context_line":""},{"line_number":1953,"context_line":"        \"\"\""},{"line_number":1954,"context_line":"        # Create project hierarchy"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_8e5a7b4e","line":1951,"updated":"2014-12-10 07:18:15.000000000","message":"I think our guidelines are that the doctoring title should only be one line, followed by a blank line, followed by more details.","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b08c7af1defd6581e88bdfe4120f1d793431167b","unresolved":false,"context_lines":[{"line_number":1948,"context_line":""},{"line_number":1949,"context_line":"    def _setup_hierarchical_projects_scenario(self):"},{"line_number":1950,"context_line":"        \"\"\"Creates basic hierarchical projects scenario: a root and a leaf"},{"line_number":1951,"context_line":"        project and non-inherited and inherited roles as well."},{"line_number":1952,"context_line":""},{"line_number":1953,"context_line":"        \"\"\""},{"line_number":1954,"context_line":"        # Create project hierarchy"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_79cd0c5d","line":1951,"in_reply_to":"3a961159_8e5a7b4e","updated":"2014-12-10 13:55:12.000000000","message":"ok, will fix it.","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f76be58bfac0b88728db2b197b5e7a61318a00af","unresolved":false,"context_lines":[{"line_number":2085,"context_line":"        Test Plan:"},{"line_number":2086,"context_line":""},{"line_number":2087,"context_line":"        - Create 2 roles"},{"line_number":2088,"context_line":"        - Create a hierarchy of projects with one root e one leaf project"},{"line_number":2089,"context_line":"        - Issue the URL to add a non-inherited user role to the root project"},{"line_number":2090,"context_line":"        - Issue the URL to add an inherited user role to the root project"},{"line_number":2091,"context_line":"        - Issue the URL to get all role assignments - this should return just"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_8bcef781","line":2088,"updated":"2014-12-09 21:29:39.000000000","message":"(nit)....\"root and one leaf project\" ?","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a9908ab5663c129f0160bb9124a98ce88ba97290","unresolved":false,"context_lines":[{"line_number":2138,"context_line":"    def test_get_effective_role_assignments_for_project_hierarchy(self):"},{"line_number":2139,"context_line":"        \"\"\"Call ``GET /role_assignments?effective``."},{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"        Test Plan:"},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        - Create 2 roles"},{"line_number":2144,"context_line":"        - Create a hierarchy of projects with one root e one leaf project"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_31a7260e","line":2141,"updated":"2014-12-10 07:18:15.000000000","message":"nice!","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f76be58bfac0b88728db2b197b5e7a61318a00af","unresolved":false,"context_lines":[{"line_number":2141,"context_line":"        Test Plan:"},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        - Create 2 roles"},{"line_number":2144,"context_line":"        - Create a hierarchy of projects with one root e one leaf project"},{"line_number":2145,"context_line":"        - Issue the URL to add a non-inherited user role to the root project"},{"line_number":2146,"context_line":"        - Issue the URL to add an inherited user role to the root project"},{"line_number":2147,"context_line":"        - Issue the URL to get effective role assignments - this should return"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_ebc3fb54","line":2144,"updated":"2014-12-09 21:29:39.000000000","message":"ditto","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f76be58bfac0b88728db2b197b5e7a61318a00af","unresolved":false,"context_lines":[{"line_number":2198,"context_line":"        Test Plan:"},{"line_number":2199,"context_line":""},{"line_number":2200,"context_line":"        - Create 2 roles"},{"line_number":2201,"context_line":"        - Create a hierarchy of projects with one root e one leaf project"},{"line_number":2202,"context_line":"        - Issue the URL to add a non-inherited user role to the root project"},{"line_number":2203,"context_line":"        - Issue the URL to add an inherited user role to the root project"},{"line_number":2204,"context_line":"        - Issue the URL to filter inherited to projects role assignments - this"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_0ba207ae","line":2201,"updated":"2014-12-09 21:29:39.000000000","message":"ditto","commit_id":"fdb257490cced6f4772bc3f4fda19a64a23d202c"}]}
