)]}'
{"keystone/resource/core.py":[{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dfebc0b9a8ab6cc137ad39d8f576db41472103d1","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        # NOTE(rodrigods): for the current implementation we only allow to"},{"line_number":281,"context_line":"        # disable a project if all projects below it in the hierarchy are"},{"line_number":282,"context_line":"        # already disabled. This also means that we can not enable a"},{"line_number":283,"context_line":"        # project that has disabled parents."},{"line_number":284,"context_line":"        original_tenant_enabled \u003d original_tenant.get(\u0027enabled\u0027, True)"},{"line_number":285,"context_line":"        tenant_enabled \u003d tenant.get(\u0027enabled\u0027, True)"},{"line_number":286,"context_line":"        if not original_tenant_enabled and tenant_enabled:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_69b63e3f","side":"PARENT","line":283,"updated":"2015-12-03 18:16:26.000000000","message":"Why this note is not valid anymore? i think that we are not changing this behavior here.","commit_id":"cdaa4b65ec5ad47954c8795bde6076bf93c1818a"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"4658042e14ac493115acd8ef4079082c3976d82e","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        # NOTE(rodrigods): for the current implementation we only allow to"},{"line_number":281,"context_line":"        # disable a project if all projects below it in the hierarchy are"},{"line_number":282,"context_line":"        # already disabled. This also means that we can not enable a"},{"line_number":283,"context_line":"        # project that has disabled parents."},{"line_number":284,"context_line":"        original_tenant_enabled \u003d original_tenant.get(\u0027enabled\u0027, True)"},{"line_number":285,"context_line":"        tenant_enabled \u003d tenant.get(\u0027enabled\u0027, True)"},{"line_number":286,"context_line":"        if not original_tenant_enabled and tenant_enabled:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_fa942ee9","side":"PARENT","line":283,"in_reply_to":"7a740942_3a55d6c5","updated":"2015-12-03 18:49:02.000000000","message":"True but we are not changing the previous behavior, this is just a new API call. So, I suggest add something explaining it instead of remove the whole note.","commit_id":"cdaa4b65ec5ad47954c8795bde6076bf93c1818a"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"47f101dc72a340d059f959025ebf280683466edb","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        # NOTE(rodrigods): for the current implementation we only allow to"},{"line_number":281,"context_line":"        # disable a project if all projects below it in the hierarchy are"},{"line_number":282,"context_line":"        # already disabled. This also means that we can not enable a"},{"line_number":283,"context_line":"        # project that has disabled parents."},{"line_number":284,"context_line":"        original_tenant_enabled \u003d original_tenant.get(\u0027enabled\u0027, True)"},{"line_number":285,"context_line":"        tenant_enabled \u003d tenant.get(\u0027enabled\u0027, True)"},{"line_number":286,"context_line":"        if not original_tenant_enabled and tenant_enabled:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_3a55d6c5","side":"PARENT","line":283,"in_reply_to":"7a740942_69b63e3f","updated":"2015-12-03 18:38:57.000000000","message":"because now we are able to disable a project with projects below not disabled, by using cascade.","commit_id":"cdaa4b65ec5ad47954c8795bde6076bf93c1818a"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dfebc0b9a8ab6cc137ad39d8f576db41472103d1","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            # compatibility with the existing domain behaviour, we allow a"},{"line_number":292,"context_line":"            # project acting as a domain to be disabled irrespective of the"},{"line_number":293,"context_line":"            # state of its children. Disabling a project acting as domain"},{"line_number":294,"context_line":"            # effectively disables its children."},{"line_number":295,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":296,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":297,"context_line":"            self._disable_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_29527614","side":"PARENT","line":294,"updated":"2015-12-03 18:16:26.000000000","message":"ditto","commit_id":"cdaa4b65ec5ad47954c8795bde6076bf93c1818a"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"47f101dc72a340d059f959025ebf280683466edb","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            # compatibility with the existing domain behaviour, we allow a"},{"line_number":292,"context_line":"            # project acting as a domain to be disabled irrespective of the"},{"line_number":293,"context_line":"            # state of its children. Disabling a project acting as domain"},{"line_number":294,"context_line":"            # effectively disables its children."},{"line_number":295,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":296,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":297,"context_line":"            self._disable_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_ba0ea6e3","side":"PARENT","line":294,"in_reply_to":"7a740942_29527614","updated":"2015-12-03 18:38:57.000000000","message":"we can disable regular projects via cascade. The comments aren\u0027t valid anymore","commit_id":"cdaa4b65ec5ad47954c8795bde6076bf93c1818a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2635920538b73fab9dc6318667badd55b018358c","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                             \u0027its subtree contains enabled \u0027"},{"line_number":276,"context_line":"                             \u0027projects\u0027) % project_id)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def update_project(self, tenant_id, tenant, initiator\u003dNone, cascade\u003dFalse):"},{"line_number":279,"context_line":"        original_tenant \u003d self.driver.get_project(tenant_id)"},{"line_number":280,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_38d5471b","line":278,"updated":"2016-01-05 21:35:21.000000000","message":"This should have had docstrings already, but we should take the opportunity to add them now, since we are changing the method signature.","commit_id":"a2ac62935d39954f7304e2c3c4b9fee749db0431"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2635920538b73fab9dc6318667badd55b018358c","unresolved":false,"context_lines":[{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def _check_updates_only_enabled(self, tenant, original_tenant):"},{"line_number":321,"context_line":"        for attr in tenant:"},{"line_number":322,"context_line":"            if not attr \u003d\u003d \u0027enabled\u0027:"},{"line_number":323,"context_line":"                if tenant.get(attr) !\u003d original_tenant.get(attr):"},{"line_number":324,"context_line":"                    raise exception.ValidationError("},{"line_number":325,"context_line":"                        message\u003d_(\u0027Cascade update is only allowed for \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_588fdb29","line":322,"range":{"start_line":322,"start_character":15,"end_line":322,"end_character":18},"updated":"2016-01-05 21:35:21.000000000","message":"shouldn\u0027t this be: \n\n    if attr \u003d\u003d \u0027enabled\u0027:\n\nat least how the method name reads. That logic makes it so that we check every attribute except \u0027enabled\u0027, right?","commit_id":"a2ac62935d39954f7304e2c3c4b9fee749db0431"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15dbd849d61a2876634688666f4436eb212010e3","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                             \u0027its subtree contains enabled \u0027"},{"line_number":276,"context_line":"                             \u0027projects\u0027) % project_id)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def update_project(self, tenant_id, tenant, initiator\u003dNone, cascade\u003dFalse):"},{"line_number":279,"context_line":"        # Use the driver directly to prevent using old cached value."},{"line_number":280,"context_line":"        original_tenant \u003d self.driver.get_project(tenant_id)"},{"line_number":281,"context_line":"        tenant \u003d tenant.copy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a68dd71_714931d0","line":278,"range":{"start_line":278,"start_character":3,"end_line":278,"end_character":79},"updated":"2016-01-20 20:01:54.000000000","message":"This should have a docstring - https://www.python.org/dev/peps/pep-0257/#multi-line-docstrings","commit_id":"fd7e0a25cbeaeaac2fb3b172e93b7fc7ea2af1bb"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"39eae38b43e9789e1364cd364712f21a3ea99ecf","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                             \u0027its subtree contains enabled \u0027"},{"line_number":276,"context_line":"                             \u0027projects\u0027) % project_id)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def update_project(self, tenant_id, tenant, initiator\u003dNone, cascade\u003dFalse):"},{"line_number":279,"context_line":"        # Use the driver directly to prevent using old cached value."},{"line_number":280,"context_line":"        original_tenant \u003d self.driver.get_project(tenant_id)"},{"line_number":281,"context_line":"        tenant \u003d tenant.copy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a68dd71_002dc545","line":278,"range":{"start_line":278,"start_character":3,"end_line":278,"end_character":79},"in_reply_to":"9a68dd71_714931d0","updated":"2016-01-21 18:37:00.000000000","message":"ok. I can do that in a follow-up patch","commit_id":"fd7e0a25cbeaeaac2fb3b172e93b7fc7ea2af1bb"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"39eae38b43e9789e1364cd364712f21a3ea99ecf","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":309,"context_line":"            self._disable_project(tenant_id)"},{"line_number":310,"context_line":"        if cascade:"},{"line_number":311,"context_line":"            self._check_updates_only_enabled(tenant, original_tenant)"},{"line_number":312,"context_line":"            self._update_project_enabled_cascade(tenant_id, tenant_enabled)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        ret \u003d self.driver.update_project(tenant_id, tenant)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a68dd71_40f2ddd3","line":311,"range":{"start_line":311,"start_character":17,"end_line":311,"end_character":44},"updated":"2016-01-21 18:37:00.000000000","message":"need to change here too","commit_id":"fd7e0a25cbeaeaac2fb3b172e93b7fc7ea2af1bb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15dbd849d61a2876634688666f4436eb212010e3","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                                            original_tenant[\u0027domain_id\u0027])"},{"line_number":319,"context_line":"        return ret"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _check_updates_only_enabled(self, tenant, original_tenant):"},{"line_number":322,"context_line":"        for attr in tenant:"},{"line_number":323,"context_line":"            if attr !\u003d \u0027enabled\u0027:"},{"line_number":324,"context_line":"                if tenant.get(attr) !\u003d original_tenant.get(attr):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a68dd71_ac41903b","line":321,"range":{"start_line":321,"start_character":8,"end_line":321,"end_character":35},"updated":"2016-01-20 20:01:54.000000000","message":"nit: possible method name improvement\n\n    def _only_allow_enabled_to_update_cascade()","commit_id":"fd7e0a25cbeaeaac2fb3b172e93b7fc7ea2af1bb"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"39eae38b43e9789e1364cd364712f21a3ea99ecf","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                                            original_tenant[\u0027domain_id\u0027])"},{"line_number":319,"context_line":"        return ret"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _check_updates_only_enabled(self, tenant, original_tenant):"},{"line_number":322,"context_line":"        for attr in tenant:"},{"line_number":323,"context_line":"            if attr !\u003d \u0027enabled\u0027:"},{"line_number":324,"context_line":"                if tenant.get(attr) !\u003d original_tenant.get(attr):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a68dd71_601601f3","line":321,"range":{"start_line":321,"start_character":8,"end_line":321,"end_character":35},"in_reply_to":"9a68dd71_ac41903b","updated":"2016-01-21 18:37:00.000000000","message":"nice suggestion","commit_id":"fd7e0a25cbeaeaac2fb3b172e93b7fc7ea2af1bb"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"44e0c666d5644197becb0da955c75e44db6f7481","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        if not original_tenant_enabled and tenant_enabled:"},{"line_number":305,"context_line":"            self._assert_all_parents_are_enabled(tenant_id)"},{"line_number":306,"context_line":"        if original_tenant_enabled and not tenant_enabled:"},{"line_number":307,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027) and not cascade:"},{"line_number":308,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":309,"context_line":"            self._disable_project(tenant_id)"},{"line_number":310,"context_line":"        if cascade:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_347399b3","line":307,"updated":"2016-01-28 16:10:53.000000000","message":"It needs a comment explaining what does this case actually catches.","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":15742,"name":"Paulo Ewerton Gomes Fragoso","email":"pauloewerton@lsd.ufcg.edu.br","username":"pauloewerton"},"change_message_id":"b3371713afacb61fc0ae857a6659d91b1ee9ee4d","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        if not original_tenant_enabled and tenant_enabled:"},{"line_number":305,"context_line":"            self._assert_all_parents_are_enabled(tenant_id)"},{"line_number":306,"context_line":"        if original_tenant_enabled and not tenant_enabled:"},{"line_number":307,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027) and not cascade:"},{"line_number":308,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":309,"context_line":"            self._disable_project(tenant_id)"},{"line_number":310,"context_line":"        if cascade:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_12675b26","line":307,"in_reply_to":"7a5de9d1_347399b3","updated":"2016-01-28 20:21:12.000000000","message":"sure, maybe adapting the previously removed comment would suffice?","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c78948533d6a899c0f17aad790e4f6e1272d6937","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        return ret"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def _only_allow_enabled_to_update_cascade(self, project, original_project):"},{"line_number":349,"context_line":"        for attr in project:"},{"line_number":350,"context_line":"            if attr !\u003d \u0027enabled\u0027:"},{"line_number":351,"context_line":"                if project.get(attr) !\u003d original_project.get(attr):"},{"line_number":352,"context_line":"                    raise exception.ValidationError("},{"line_number":353,"context_line":"                        message\u003d_(\u0027Cascade update is only allowed for \u0027"},{"line_number":354,"context_line":"                                  \u0027enabled attribute.\u0027))"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def _update_project_enabled_cascade(self, project_id, enabled):"},{"line_number":357,"context_line":"        subtree \u003d self.list_projects_in_subtree(project_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_303c362f","line":354,"range":{"start_line":349,"start_character":8,"end_line":354,"end_character":56},"updated":"2016-02-14 07:50:57.000000000","message":"how about:\n\nif \u0027enabled\u0027 not in project:\n  raise exception.ValidationError(\n    message\u003d_(\u0027Cascade update is only allowed for enabled attribute.\u0027))\n\n?\n\nalso, i don\u0027t agree with checking the original_project.... \n\nregardless of the state of my parent project, i want to cascade it down to the children. if parent is enabled already, but some children aren\u0027t, then i want to cascade the enable to all my subprojects, regardless of my status.","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"0ae74510bf5a6b26ec6aefc997a185bfa2099768","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        return ret"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def _only_allow_enabled_to_update_cascade(self, project, original_project):"},{"line_number":349,"context_line":"        for attr in project:"},{"line_number":350,"context_line":"            if attr !\u003d \u0027enabled\u0027:"},{"line_number":351,"context_line":"                if project.get(attr) !\u003d original_project.get(attr):"},{"line_number":352,"context_line":"                    raise exception.ValidationError("},{"line_number":353,"context_line":"                        message\u003d_(\u0027Cascade update is only allowed for \u0027"},{"line_number":354,"context_line":"                                  \u0027enabled attribute.\u0027))"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def _update_project_enabled_cascade(self, project_id, enabled):"},{"line_number":357,"context_line":"        subtree \u003d self.list_projects_in_subtree(project_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_86ca07a0","line":354,"range":{"start_line":349,"start_character":8,"end_line":354,"end_character":56},"in_reply_to":"dae33548_303c362f","updated":"2016-02-15 14:10:02.000000000","message":"actually, what we are doing is checking if other attribute than \u0027enabled\u0027 was provided and is being updated. See that we only compare with the original if the attribute is NOT the \u0027enabled\u0027.  The enabled attribute of the children is updated regardless of the parent status.","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c78948533d6a899c0f17aad790e4f6e1272d6937","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            child[\u0027enabled\u0027] \u003d enabled"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            if not enabled:"},{"line_number":365,"context_line":"                self._disable_project(child[\u0027id\u0027])"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"            self.driver.update_project(child[\u0027id\u0027], child)"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_9020a2f9","line":365,"range":{"start_line":365,"start_character":16,"end_line":365,"end_character":50},"updated":"2016-02-14 07:50:57.000000000","message":"may want to add a comment that all this does is emit a notification / call back, and doesn\u0027t actually update the project","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"0ae74510bf5a6b26ec6aefc997a185bfa2099768","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            child[\u0027enabled\u0027] \u003d enabled"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            if not enabled:"},{"line_number":365,"context_line":"                self._disable_project(child[\u0027id\u0027])"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"            self.driver.update_project(child[\u0027id\u0027], child)"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_c6c40f94","line":365,"range":{"start_line":365,"start_character":16,"end_line":365,"end_character":50},"in_reply_to":"dae33548_9020a2f9","updated":"2016-02-15 14:10:02.000000000","message":"Done","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"}],"keystone/tests/unit/test_backend.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2635920538b73fab9dc6318667badd55b018358c","unresolved":false,"context_lines":[{"line_number":2660,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2661,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2662,"context_line":"        project2 \u003d projects_hierarchy[1]"},{"line_number":2663,"context_line":"        project3 \u003d unit.new_project_ref(parent_id\u003dproject2[\u0027id\u0027],"},{"line_number":2664,"context_line":"                                        domain_id\u003dDEFAULT_DOMAIN_ID)"},{"line_number":2665,"context_line":"        self.resource_api.create_project(project3[\u0027id\u0027], project3)"},{"line_number":2666,"context_line":"        # Disable in project1 disables the whole subtree"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_580b5b8e","line":2663,"updated":"2016-01-05 21:35:21.000000000","message":"why do we have to create project3 manually when the hierarchy_size above is 3? Should we technically have 3 projects in our `projects_hierarchy` list?","commit_id":"a2ac62935d39954f7304e2c3c4b9fee749db0431"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2635920538b73fab9dc6318667badd55b018358c","unresolved":false,"context_lines":[{"line_number":2696,"context_line":"                                         project1,"},{"line_number":2697,"context_line":"                                         cascade\u003dTrue)"},{"line_number":2698,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(project1[\u0027id\u0027])"},{"line_number":2699,"context_line":"        self.assertFalse(subtree[0][\u0027enabled\u0027])"},{"line_number":2700,"context_line":""},{"line_number":2701,"context_line":"        project2[\u0027enabled\u0027] \u003d True"},{"line_number":2702,"context_line":"        self.assertRaises(exception.ForbiddenAction,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_78f09f91","line":2699,"updated":"2016-01-05 21:35:21.000000000","message":"here we could also make the assertion that `subtree[0]` is in-fact the same project as `project2`.","commit_id":"a2ac62935d39954f7304e2c3c4b9fee749db0431"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2635920538b73fab9dc6318667badd55b018358c","unresolved":false,"context_lines":[{"line_number":2698,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(project1[\u0027id\u0027])"},{"line_number":2699,"context_line":"        self.assertFalse(subtree[0][\u0027enabled\u0027])"},{"line_number":2700,"context_line":""},{"line_number":2701,"context_line":"        project2[\u0027enabled\u0027] \u003d True"},{"line_number":2702,"context_line":"        self.assertRaises(exception.ForbiddenAction,"},{"line_number":2703,"context_line":"                          self.resource_api.update_project,"},{"line_number":2704,"context_line":"                          project2[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_387b07f7","line":2701,"updated":"2016-01-05 21:35:21.000000000","message":"project2 doesn\u0027t have a subtree, does it? we should maybe add a project3 under project2 so that we know it has a subtree.","commit_id":"a2ac62935d39954f7304e2c3c4b9fee749db0431"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"f28c5c8abb7e658f97042d87fec37a10f7d367b2","unresolved":false,"context_lines":[{"line_number":2656,"context_line":"        parents \u003d self.resource_api.list_project_parents(project1[\u0027id\u0027])"},{"line_number":2657,"context_line":"        self.assertEqual(0, len(parents))"},{"line_number":2658,"context_line":""},{"line_number":2659,"context_line":"    def test_update_project_enabled_cascade(self):"},{"line_number":2660,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2661,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2662,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_dcb31ce8","line":2659,"updated":"2016-01-28 18:25:34.000000000","message":"maybe you could toss in here a docstring on what the hierarchy will look like in your test.","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":15742,"name":"Paulo Ewerton Gomes Fragoso","email":"pauloewerton@lsd.ufcg.edu.br","username":"pauloewerton"},"change_message_id":"b3371713afacb61fc0ae857a6659d91b1ee9ee4d","unresolved":false,"context_lines":[{"line_number":2656,"context_line":"        parents \u003d self.resource_api.list_project_parents(project1[\u0027id\u0027])"},{"line_number":2657,"context_line":"        self.assertEqual(0, len(parents))"},{"line_number":2658,"context_line":""},{"line_number":2659,"context_line":"    def test_update_project_enabled_cascade(self):"},{"line_number":2660,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2661,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2662,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_6d55904e","line":2659,"in_reply_to":"7a5de9d1_dcb31ce8","updated":"2016-01-28 20:21:12.000000000","message":"Done","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"44e0c666d5644197becb0da955c75e44db6f7481","unresolved":false,"context_lines":[{"line_number":2658,"context_line":""},{"line_number":2659,"context_line":"    def test_update_project_enabled_cascade(self):"},{"line_number":2660,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2661,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2662,"context_line":""},{"line_number":2663,"context_line":"        # Disable in project1 disables the whole subtree"},{"line_number":2664,"context_line":"        project1[\u0027enabled\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_b41d49bf","line":2661,"range":{"start_line":2661,"start_character":8,"end_line":2661,"end_character":16},"updated":"2016-01-28 16:10:53.000000000","message":"grandparent/parent/parent_project would make it easier to understand","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":15742,"name":"Paulo Ewerton Gomes Fragoso","email":"pauloewerton@lsd.ufcg.edu.br","username":"pauloewerton"},"change_message_id":"b3371713afacb61fc0ae857a6659d91b1ee9ee4d","unresolved":false,"context_lines":[{"line_number":2658,"context_line":""},{"line_number":2659,"context_line":"    def test_update_project_enabled_cascade(self):"},{"line_number":2660,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2661,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2662,"context_line":""},{"line_number":2663,"context_line":"        # Disable in project1 disables the whole subtree"},{"line_number":2664,"context_line":"        project1[\u0027enabled\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_92734be7","line":2661,"range":{"start_line":2661,"start_character":8,"end_line":2661,"end_character":16},"in_reply_to":"7a5de9d1_b41d49bf","updated":"2016-01-28 20:21:12.000000000","message":"Done","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"44e0c666d5644197becb0da955c75e44db6f7481","unresolved":false,"context_lines":[{"line_number":2684,"context_line":""},{"line_number":2685,"context_line":"    def test_cannot_enable_cascade_with_parent_disabled(self):"},{"line_number":2686,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2687,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2688,"context_line":"        project2 \u003d projects_hierarchy[1]"},{"line_number":2689,"context_line":""},{"line_number":2690,"context_line":"        project1[\u0027enabled\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_7c78f32b","line":2687,"range":{"start_line":2687,"start_character":8,"end_line":2687,"end_character":16},"updated":"2016-01-28 16:10:53.000000000","message":"grandparent ?","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":15742,"name":"Paulo Ewerton Gomes Fragoso","email":"pauloewerton@lsd.ufcg.edu.br","username":"pauloewerton"},"change_message_id":"b3371713afacb61fc0ae857a6659d91b1ee9ee4d","unresolved":false,"context_lines":[{"line_number":2684,"context_line":""},{"line_number":2685,"context_line":"    def test_cannot_enable_cascade_with_parent_disabled(self):"},{"line_number":2686,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2687,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2688,"context_line":"        project2 \u003d projects_hierarchy[1]"},{"line_number":2689,"context_line":""},{"line_number":2690,"context_line":"        project1[\u0027enabled\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_527dd3af","line":2687,"range":{"start_line":2687,"start_character":8,"end_line":2687,"end_character":16},"in_reply_to":"7a5de9d1_7c78f32b","updated":"2016-01-28 20:21:12.000000000","message":"Done","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"44e0c666d5644197becb0da955c75e44db6f7481","unresolved":false,"context_lines":[{"line_number":2685,"context_line":"    def test_cannot_enable_cascade_with_parent_disabled(self):"},{"line_number":2686,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2687,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2688,"context_line":"        project2 \u003d projects_hierarchy[1]"},{"line_number":2689,"context_line":""},{"line_number":2690,"context_line":"        project1[\u0027enabled\u0027] \u003d False"},{"line_number":2691,"context_line":"        self.resource_api.update_project(project1[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_9c992f71","line":2688,"range":{"start_line":2688,"start_character":8,"end_line":2688,"end_character":16},"updated":"2016-01-28 16:10:53.000000000","message":"parent ?","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":15742,"name":"Paulo Ewerton Gomes Fragoso","email":"pauloewerton@lsd.ufcg.edu.br","username":"pauloewerton"},"change_message_id":"b3371713afacb61fc0ae857a6659d91b1ee9ee4d","unresolved":false,"context_lines":[{"line_number":2685,"context_line":"    def test_cannot_enable_cascade_with_parent_disabled(self):"},{"line_number":2686,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"},{"line_number":2687,"context_line":"        project1 \u003d projects_hierarchy[0]"},{"line_number":2688,"context_line":"        project2 \u003d projects_hierarchy[1]"},{"line_number":2689,"context_line":""},{"line_number":2690,"context_line":"        project1[\u0027enabled\u0027] \u003d False"},{"line_number":2691,"context_line":"        self.resource_api.update_project(project1[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_f24abf82","line":2688,"range":{"start_line":2688,"start_character":8,"end_line":2688,"end_character":16},"in_reply_to":"7a5de9d1_9c992f71","updated":"2016-01-28 20:21:12.000000000","message":"Done","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"44e0c666d5644197becb0da955c75e44db6f7481","unresolved":false,"context_lines":[{"line_number":2692,"context_line":"                                         project1,"},{"line_number":2693,"context_line":"                                         cascade\u003dTrue)"},{"line_number":2694,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(project2[\u0027id\u0027])"},{"line_number":2695,"context_line":"        self.assertFalse(subtree[0][\u0027enabled\u0027])"},{"line_number":2696,"context_line":""},{"line_number":2697,"context_line":"        project2[\u0027enabled\u0027] \u003d True"},{"line_number":2698,"context_line":"        self.assertRaises(exception.ForbiddenAction,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_1fbf71fc","line":2695,"updated":"2016-01-28 16:10:53.000000000","message":"Calling project2 as parent will also make it easier to understand subtree[0] is the grandchild.","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":15742,"name":"Paulo Ewerton Gomes Fragoso","email":"pauloewerton@lsd.ufcg.edu.br","username":"pauloewerton"},"change_message_id":"b3371713afacb61fc0ae857a6659d91b1ee9ee4d","unresolved":false,"context_lines":[{"line_number":2692,"context_line":"                                         project1,"},{"line_number":2693,"context_line":"                                         cascade\u003dTrue)"},{"line_number":2694,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(project2[\u0027id\u0027])"},{"line_number":2695,"context_line":"        self.assertFalse(subtree[0][\u0027enabled\u0027])"},{"line_number":2696,"context_line":""},{"line_number":2697,"context_line":"        project2[\u0027enabled\u0027] \u003d True"},{"line_number":2698,"context_line":"        self.assertRaises(exception.ForbiddenAction,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a5de9d1_124e7b96","line":2695,"in_reply_to":"7a5de9d1_1fbf71fc","updated":"2016-01-28 20:21:12.000000000","message":"Done","commit_id":"19eebba36451c494486785d8912d098fb26674b2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"22fa0887134ff8d75319cbefc745ea67c04598ce","unresolved":false,"context_lines":[{"line_number":2699,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(parent[\u0027id\u0027])"},{"line_number":2700,"context_line":"        self.assertEqual(2, len(subtree))"},{"line_number":2701,"context_line":"        self.assertFalse(subtree[0][\u0027enabled\u0027])"},{"line_number":2702,"context_line":"        self.assertFalse(subtree[1][\u0027enabled\u0027])"},{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"        # Enable in parent project enables the whole subtree"},{"line_number":2705,"context_line":"        parent[\u0027enabled\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a57f1b5_f0e490ac","line":2702,"updated":"2016-02-12 19:47:11.000000000","message":"check the parent has been disabled too","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"0ae74510bf5a6b26ec6aefc997a185bfa2099768","unresolved":false,"context_lines":[{"line_number":2699,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(parent[\u0027id\u0027])"},{"line_number":2700,"context_line":"        self.assertEqual(2, len(subtree))"},{"line_number":2701,"context_line":"        self.assertFalse(subtree[0][\u0027enabled\u0027])"},{"line_number":2702,"context_line":"        self.assertFalse(subtree[1][\u0027enabled\u0027])"},{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"        # Enable in parent project enables the whole subtree"},{"line_number":2705,"context_line":"        parent[\u0027enabled\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_e6ef93ae","line":2702,"in_reply_to":"3a57f1b5_560b1c2a","updated":"2016-02-15 14:10:02.000000000","message":"Done","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"019ca10dd4a545b6838299f24d982782ae567253","unresolved":false,"context_lines":[{"line_number":2699,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(parent[\u0027id\u0027])"},{"line_number":2700,"context_line":"        self.assertEqual(2, len(subtree))"},{"line_number":2701,"context_line":"        self.assertFalse(subtree[0][\u0027enabled\u0027])"},{"line_number":2702,"context_line":"        self.assertFalse(subtree[1][\u0027enabled\u0027])"},{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"        # Enable in parent project enables the whole subtree"},{"line_number":2705,"context_line":"        parent[\u0027enabled\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a57f1b5_560b1c2a","line":2702,"in_reply_to":"3a57f1b5_56c31c89","updated":"2016-02-12 20:03:48.000000000","message":"yeah, so make L2695:\n\n    parent \u003d self.resource_api.update_project(parent[\u0027id\u0027],...)\n\nand add this here:\n\n    self.assertFalse(parent[\u0027enabled\u0027])","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"590fcb82e91485aee1f2d88a54bf560473899f90","unresolved":false,"context_lines":[{"line_number":2699,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(parent[\u0027id\u0027])"},{"line_number":2700,"context_line":"        self.assertEqual(2, len(subtree))"},{"line_number":2701,"context_line":"        self.assertFalse(subtree[0][\u0027enabled\u0027])"},{"line_number":2702,"context_line":"        self.assertFalse(subtree[1][\u0027enabled\u0027])"},{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"        # Enable in parent project enables the whole subtree"},{"line_number":2705,"context_line":"        parent[\u0027enabled\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a57f1b5_56c31c89","line":2702,"in_reply_to":"3a57f1b5_f0e490ac","updated":"2016-02-12 19:48:52.000000000","message":"the project[0] it\u0027s the parent","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"22fa0887134ff8d75319cbefc745ea67c04598ce","unresolved":false,"context_lines":[{"line_number":2710,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(parent[\u0027id\u0027])"},{"line_number":2711,"context_line":"        self.assertEqual(2, len(subtree))"},{"line_number":2712,"context_line":"        self.assertTrue(subtree[0][\u0027enabled\u0027])"},{"line_number":2713,"context_line":"        self.assertTrue(subtree[1][\u0027enabled\u0027])"},{"line_number":2714,"context_line":""},{"line_number":2715,"context_line":"    def test_cannot_enable_cascade_with_parent_disabled(self):"},{"line_number":2716,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a57f1b5_70e740ac","line":2713,"updated":"2016-02-12 19:47:11.000000000","message":"same here","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"0ae74510bf5a6b26ec6aefc997a185bfa2099768","unresolved":false,"context_lines":[{"line_number":2710,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(parent[\u0027id\u0027])"},{"line_number":2711,"context_line":"        self.assertEqual(2, len(subtree))"},{"line_number":2712,"context_line":"        self.assertTrue(subtree[0][\u0027enabled\u0027])"},{"line_number":2713,"context_line":"        self.assertTrue(subtree[1][\u0027enabled\u0027])"},{"line_number":2714,"context_line":""},{"line_number":2715,"context_line":"    def test_cannot_enable_cascade_with_parent_disabled(self):"},{"line_number":2716,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_a63c6b30","line":2713,"in_reply_to":"3a57f1b5_16b92415","updated":"2016-02-15 14:10:02.000000000","message":"Done","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"590fcb82e91485aee1f2d88a54bf560473899f90","unresolved":false,"context_lines":[{"line_number":2710,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(parent[\u0027id\u0027])"},{"line_number":2711,"context_line":"        self.assertEqual(2, len(subtree))"},{"line_number":2712,"context_line":"        self.assertTrue(subtree[0][\u0027enabled\u0027])"},{"line_number":2713,"context_line":"        self.assertTrue(subtree[1][\u0027enabled\u0027])"},{"line_number":2714,"context_line":""},{"line_number":2715,"context_line":"    def test_cannot_enable_cascade_with_parent_disabled(self):"},{"line_number":2716,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(hierarchy_size\u003d3)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a57f1b5_16b92415","line":2713,"in_reply_to":"3a57f1b5_70e740ac","updated":"2016-02-12 19:48:52.000000000","message":"same here","commit_id":"3daa1f7dabf9d0b10b2225df545ab9261003762d"}]}
