)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10697,"name":"Thiago Paiva Brito","email":"thiagop@lsd.ufcg.edu.br","username":"thiagop","inactive":true},"change_message_id":"4f59cc8689a5ee8597732d77ed50174533c31b9d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"were modified to handle projects hierarchy."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This changes includes:"},{"line_number":13,"context_line":"- Create and update projects with parent_project_id"},{"line_number":14,"context_line":"  field"},{"line_number":15,"context_line":"- Avoid deleting projects that are not leaf in the"},{"line_number":16,"context_line":"  hierarchy"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5a890539_f564504a","line":13,"updated":"2014-12-03 18:55:40.000000000","message":"This shouldn\u0027t be parent_id?","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"}],"keystone/assignment/core.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ef1549b20aaef24b6bb2ebfd96ab1e02a2ab08d0","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        pass"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _check_enable_project(self, project_id):"},{"line_number":158,"context_line":"        parents_list \u003d self.list_project_parents(project_id)"},{"line_number":159,"context_line":"        for project in parents_list:"},{"line_number":160,"context_line":"            if not project.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_65db78ed","line":157,"updated":"2014-12-02 22:54:17.000000000","message":"maybe a slight better name would be something like:\n\n_assert_all_parents_are_enabled()","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ef3667696fcb9b40a5794c511f0126c731505e72","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        pass"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _check_enable_project(self, project_id):"},{"line_number":158,"context_line":"        parents_list \u003d self.list_project_parents(project_id)"},{"line_number":159,"context_line":"        for project in parents_list:"},{"line_number":160,"context_line":"            if not project.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_b06e72fe","line":157,"in_reply_to":"5a890539_65db78ed","updated":"2014-12-03 13:04:49.000000000","message":"Done","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ef1549b20aaef24b6bb2ebfd96ab1e02a2ab08d0","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    action\u003d_(\u0027cannot enable the project %s since it has \u0027"},{"line_number":163,"context_line":"                             \u0027disabled parents\u0027) % project_id)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _check_disable_project(self, project_id):"},{"line_number":166,"context_line":"        subtree_list \u003d self.driver.list_projects_in_subtree(project_id)"},{"line_number":167,"context_line":"        for ref in subtree_list:"},{"line_number":168,"context_line":"            if ref.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_6589b8c9","line":165,"updated":"2014-12-02 22:54:17.000000000","message":"..and maybe here:\n\n_assert_whole_subtree_is_disabled()","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ef3667696fcb9b40a5794c511f0126c731505e72","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    action\u003d_(\u0027cannot enable the project %s since it has \u0027"},{"line_number":163,"context_line":"                             \u0027disabled parents\u0027) % project_id)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _check_disable_project(self, project_id):"},{"line_number":166,"context_line":"        subtree_list \u003d self.driver.list_projects_in_subtree(project_id)"},{"line_number":167,"context_line":"        for ref in subtree_list:"},{"line_number":168,"context_line":"            if ref.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_f0739ae4","line":165,"in_reply_to":"5a890539_6589b8c9","updated":"2014-12-03 13:04:49.000000000","message":"Done","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ef1549b20aaef24b6bb2ebfd96ab1e02a2ab08d0","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                children \u003d [x for x in projects"},{"line_number":518,"context_line":"                            if x[\u0027parent_id\u0027] \u003d\u003d project[\u0027id\u0027]]"},{"line_number":519,"context_line":"                for p in children:"},{"line_number":520,"context_line":"                    _delete_leaf_projects(p, projects)"},{"line_number":521,"context_line":"            try:"},{"line_number":522,"context_line":"                self.delete_project(project[\u0027id\u0027])"},{"line_number":523,"context_line":"            except exception.ProjectNotFound:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_e02676b9","line":520,"updated":"2014-12-02 22:54:17.000000000","message":"...so a little worried that we have no check to ensure we do not have a corrupted hierarchy...and so would loop forever.  Maybe add the same check as we did before about whether we have seen this project before?","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"4443079a2c64a56c9aa8d60c10d28603240a2018","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                children \u003d [x for x in projects"},{"line_number":518,"context_line":"                            if x[\u0027parent_id\u0027] \u003d\u003d project[\u0027id\u0027]]"},{"line_number":519,"context_line":"                for p in children:"},{"line_number":520,"context_line":"                    _delete_leaf_projects(p, projects)"},{"line_number":521,"context_line":"            try:"},{"line_number":522,"context_line":"                self.delete_project(project[\u0027id\u0027])"},{"line_number":523,"context_line":"            except exception.ProjectNotFound:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_ef9acc6d","line":520,"in_reply_to":"5a890539_633d1d8e","updated":"2014-12-03 14:08:02.000000000","message":"refactored this method keeping it recursive. Adding the examined set actually fit well.","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ef3667696fcb9b40a5794c511f0126c731505e72","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                children \u003d [x for x in projects"},{"line_number":518,"context_line":"                            if x[\u0027parent_id\u0027] \u003d\u003d project[\u0027id\u0027]]"},{"line_number":519,"context_line":"                for p in children:"},{"line_number":520,"context_line":"                    _delete_leaf_projects(p, projects)"},{"line_number":521,"context_line":"            try:"},{"line_number":522,"context_line":"                self.delete_project(project[\u0027id\u0027])"},{"line_number":523,"context_line":"            except exception.ProjectNotFound:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_633d1d8e","line":520,"in_reply_to":"5a890539_e02676b9","updated":"2014-12-03 13:04:49.000000000","message":"adding the checking in the current algorithm is problematic (it would recreate the id sets in each recursive call).\n\nwill try to make it iterative so we could check for circular references without passing recursivelly this set.","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ef1549b20aaef24b6bb2ebfd96ab1e02a2ab08d0","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"    @abc.abstractmethod"},{"line_number":1019,"context_line":"    def list_project_parents(self, project_id, user_id\u003dNone):"},{"line_number":1020,"context_line":"        \"\"\"List all parents from a project by its ID."},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"        :param project_id: the driver will list the parents of this"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_a0e38e32","line":1019,"updated":"2014-12-02 22:54:17.000000000","message":"It seems a bit odd that there is no change to the driver to match this in this patch?  Is this fixing a previous oversight?\n\nAlso, not actually sure what it means \"the projects this user has access to\"?  Do you mean has an assignment on?  If, so, that seems an odd mix of API.","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ef3667696fcb9b40a5794c511f0126c731505e72","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"    @abc.abstractmethod"},{"line_number":1019,"context_line":"    def list_project_parents(self, project_id, user_id\u003dNone):"},{"line_number":1020,"context_line":"        \"\"\"List all parents from a project by its ID."},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"        :param project_id: the driver will list the parents of this"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_7b878b61","line":1019,"in_reply_to":"5a890539_a0e38e32","updated":"2014-12-03 13:04:49.000000000","message":"removed the user_id param and improved the docstring explaining if the user_id is in the auth context, the list will be filtered.","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"602bac41163ab0716ae069c18a07042e68081ee1","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def _get_hierarchy_depth(self, parents_list):"},{"line_number":83,"context_line":"        return len(parents_list) + 1"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _assert_max_hierarchy_depth(self, project_id, parents_list\u003dNone):"},{"line_number":86,"context_line":"        if parents_list is None:"},{"line_number":87,"context_line":"            parents_list \u003d self.list_project_parents(project_id)"},{"line_number":88,"context_line":"        max_depth \u003d CONF.max_project_tree_depth"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_d54bd484","line":85,"updated":"2014-12-03 19:07:21.000000000","message":"good name :-)","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"602bac41163ab0716ae069c18a07042e68081ee1","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":109,"context_line":"                        action\u003d_(\u0027cannot create a project within a different \u0027"},{"line_number":110,"context_line":"                                 \u0027domain than its parents.\u0027))"},{"line_number":111,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":112,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":113,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":114,"context_line":"                                 \u0027branch containing a disabled \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_156b9cf1","line":111,"updated":"2014-12-03 19:07:21.000000000","message":"won\u0027t this fail if you are trying to create a project that is initially disabled?","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"4596b42b238006e99eba53c8a8e8fe58d2d0d392","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":109,"context_line":"                        action\u003d_(\u0027cannot create a project within a different \u0027"},{"line_number":110,"context_line":"                                 \u0027domain than its parents.\u0027))"},{"line_number":111,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":112,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":113,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":114,"context_line":"                                 \u0027branch containing a disabled \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_fba51fb5","line":111,"in_reply_to":"5a890539_156b9cf1","updated":"2014-12-03 19:30:58.000000000","message":"this refs only includes the parents, so I think it won\u0027t fail.","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"359ac2d9e5ce28924b7b4b464d1117643125e29d","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":109,"context_line":"                        action\u003d_(\u0027cannot create a project within a different \u0027"},{"line_number":110,"context_line":"                                 \u0027domain than its parents.\u0027))"},{"line_number":111,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":112,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":113,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":114,"context_line":"                                 \u0027branch containing a disabled \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_bb2717c6","line":111,"in_reply_to":"5a890539_1bcf4b2a","updated":"2014-12-03 19:39:11.000000000","message":"yeah, because list_parent_projects returns only the parents, not the project itself. If we use list_project_parents(tenant.get(\u0027parent_id\u0027)), it wouldn\u0027t include the project right above \"tenant\".","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"87bc9da227a829b6e6a7eabad3e751c2e4aed220","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":109,"context_line":"                        action\u003d_(\u0027cannot create a project within a different \u0027"},{"line_number":110,"context_line":"                                 \u0027domain than its parents.\u0027))"},{"line_number":111,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":112,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":113,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":114,"context_line":"                                 \u0027branch containing a disabled \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_5eb0e142","line":111,"in_reply_to":"5a890539_bb2717c6","updated":"2014-12-03 19:43:25.000000000","message":"ahh, and you can\u0027t just do:\n\nparent_list \u003dself.list_project_parents(tenant_id)\n\n..becuase you haven\u0027t created that ID in the backend yet!  Got it! Thx","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3a5d53de24d489082e37bf3cf196e8125589e13","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":109,"context_line":"                        action\u003d_(\u0027cannot create a project within a different \u0027"},{"line_number":110,"context_line":"                                 \u0027domain than its parents.\u0027))"},{"line_number":111,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":112,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":113,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":114,"context_line":"                                 \u0027branch containing a disabled \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_1bcf4b2a","line":111,"in_reply_to":"5a890539_fba51fb5","updated":"2014-12-03 19:36:41.000000000","message":"ahh, sorry, yes you are correct.  Is there a reasons you add the parent_ref as well as the parents of parent_ref separately (in lines 103-105)?  My first thought would be to just do:\n\nparent_list \u003dself.list_project_parents(tenant.get(\u0027parent_id\u0027)","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"602bac41163ab0716ae069c18a07042e68081ee1","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"    def list_project_parents(self, project_id):"},{"line_number":1029,"context_line":"        \"\"\"List all parents from a project by its ID. If a user_id"},{"line_number":1030,"context_line":"        is present in the auth context, this list will be filtered"},{"line_number":1031,"context_line":"        by the projects this user is associated with."},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"        :param project_id: the driver will list the parents of this"},{"line_number":1034,"context_line":"                           project."}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_f8d44548","line":1031,"updated":"2014-12-03 19:07:21.000000000","message":"While I appreciate the comment, if you are going to place it here you need to be clear that it is the caller of this method that will do the filtering.  Otherwise it sounds like this is describing what the driver call will do.  I actually don\u0027t think the comment belongs here - I\u0027d suggest moving it to the manager method","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3a5d53de24d489082e37bf3cf196e8125589e13","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"    def list_project_parents(self, project_id):"},{"line_number":1029,"context_line":"        \"\"\"List all parents from a project by its ID. If a user_id"},{"line_number":1030,"context_line":"        is present in the auth context, this list will be filtered"},{"line_number":1031,"context_line":"        by the projects this user is associated with."},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"        :param project_id: the driver will list the parents of this"},{"line_number":1034,"context_line":"                           project."}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_3bb7a786","line":1031,"in_reply_to":"5a890539_1b802bf6","updated":"2014-12-03 19:36:41.000000000","message":"probably enough...let\u0027s just ditch these two","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"359ac2d9e5ce28924b7b4b464d1117643125e29d","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"    def list_project_parents(self, project_id):"},{"line_number":1029,"context_line":"        \"\"\"List all parents from a project by its ID. If a user_id"},{"line_number":1030,"context_line":"        is present in the auth context, this list will be filtered"},{"line_number":1031,"context_line":"        by the projects this user is associated with."},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"        :param project_id: the driver will list the parents of this"},{"line_number":1034,"context_line":"                           project."}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_3b132766","line":1031,"in_reply_to":"5a890539_3bb7a786","updated":"2014-12-03 19:39:11.000000000","message":"++","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"4596b42b238006e99eba53c8a8e8fe58d2d0d392","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"    def list_project_parents(self, project_id):"},{"line_number":1029,"context_line":"        \"\"\"List all parents from a project by its ID. If a user_id"},{"line_number":1030,"context_line":"        is present in the auth context, this list will be filtered"},{"line_number":1031,"context_line":"        by the projects this user is associated with."},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"        :param project_id: the driver will list the parents of this"},{"line_number":1034,"context_line":"                           project."}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_1b802bf6","line":1031,"in_reply_to":"5a890539_f8d44548","updated":"2014-12-03 19:30:58.000000000","message":"++\n\nwe have a comment (not docstring) in the methods, do you think its enough?","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"602bac41163ab0716ae069c18a07042e68081ee1","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"    def list_projects_in_subtree(self, project_id):"},{"line_number":1044,"context_line":"        \"\"\"List all projects in the subtree below the hierarchy of the"},{"line_number":1045,"context_line":"        given project. If a user_id is present in the auth context, this"},{"line_number":1046,"context_line":"        list will be filtered by the projects this user is associated with."},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"        :param project_id: the driver will get the subtree under"},{"line_number":1049,"context_line":"                           this project."}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_38cb2da5","line":1046,"updated":"2014-12-03 19:07:21.000000000","message":"ditto","commit_id":"35f386b9285dcb329e6039b5ec19ddefe65e4da3"}],"keystone/common/controller.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ef1549b20aaef24b6bb2ebfd96ab1e02a2ab08d0","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        return url"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @classmethod"},{"line_number":336,"context_line":"    def _query_filter_is_true(cls, filter_value):"},{"line_number":337,"context_line":"        \"\"\"Determine if bool query param is \u0027True\u0027."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        We treat this the same way as we do for policy"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_25adf084","line":336,"updated":"2014-12-02 22:54:17.000000000","message":"where is the called from....not the base class?  Should it therefore not start with \u0027_\u0027 ?","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ef3667696fcb9b40a5794c511f0126c731505e72","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        return url"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @classmethod"},{"line_number":336,"context_line":"    def _query_filter_is_true(cls, filter_value):"},{"line_number":337,"context_line":"        \"\"\"Determine if bool query param is \u0027True\u0027."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        We treat this the same way as we do for policy"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_c3ab31d4","line":336,"in_reply_to":"5a890539_25adf084","updated":"2014-12-03 13:04:49.000000000","message":"++ should remove the \u0027_\u0027","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"eb62ede21f6a5ee0bf3b2cc922cab8e55a94b052","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        return url"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @classmethod"},{"line_number":336,"context_line":"    def _query_filter_is_true(cls, filter_value):"},{"line_number":337,"context_line":"        \"\"\"Determine if bool query param is \u0027True\u0027."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        We treat this the same way as we do for policy"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_4f65a043","line":336,"in_reply_to":"5a890539_2f2cd449","updated":"2014-12-03 14:11:47.000000000","message":"now I remember how I put here in the first place, removing \u0027_\u0027 :)","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"4443079a2c64a56c9aa8d60c10d28603240a2018","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        return url"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @classmethod"},{"line_number":336,"context_line":"    def _query_filter_is_true(cls, filter_value):"},{"line_number":337,"context_line":"        \"\"\"Determine if bool query param is \u0027True\u0027."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        We treat this the same way as we do for policy"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_2f2cd449","line":336,"in_reply_to":"5a890539_c3ab31d4","updated":"2014-12-03 14:08:02.000000000","message":"but, for this patch since its not required in another controller, will keep it in the assignment controller","commit_id":"8c48c7974dbea66bc3f6c1ff7c7668f65c58fbf8"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1f07d5775d8699fd0be035b5a71dbe0175f30d43","unresolved":false,"context_lines":[{"line_number":2618,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2619,"context_line":"                        \u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":2620,"context_line":"                        \u0027parent_id\u0027: root_project[\u0027id\u0027]}"},{"line_number":2621,"context_line":"        self.assignment_api.create_project(leaf_project[\u0027id\u0027], leaf_project)"},{"line_number":2622,"context_line":""},{"line_number":2623,"context_line":"        # Disable the domain"},{"line_number":2624,"context_line":"        domain[\u0027enabled\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_a527dbc5","line":2621,"updated":"2014-12-04 07:40:47.000000000","message":"is there a reason we don\u0027t use _create_projects_hierarchy() for this (and most of the tests below).  You could a domain argument to that method (defaulting of DEFAULT_DOMAIN) - and this would cover most of the examples, I think?","commit_id":"efd9733e7fa89a51de9278d3591d18aa33e5e885"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"67454fd904f3ace23ed369e03090e2f4c599a127","unresolved":false,"context_lines":[{"line_number":2618,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2619,"context_line":"                        \u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":2620,"context_line":"                        \u0027parent_id\u0027: root_project[\u0027id\u0027]}"},{"line_number":2621,"context_line":"        self.assignment_api.create_project(leaf_project[\u0027id\u0027], leaf_project)"},{"line_number":2622,"context_line":""},{"line_number":2623,"context_line":"        # Disable the domain"},{"line_number":2624,"context_line":"        domain[\u0027enabled\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_ed20e19b","line":2621,"in_reply_to":"5a890539_a527dbc5","updated":"2014-12-04 12:02:42.000000000","message":"you\u0027re right, will update the test following your suggestion!","commit_id":"efd9733e7fa89a51de9278d3591d18aa33e5e885"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1f07d5775d8699fd0be035b5a71dbe0175f30d43","unresolved":false,"context_lines":[{"line_number":2726,"context_line":"                          leaf_project[\u0027id\u0027],"},{"line_number":2727,"context_line":"                          leaf_project)"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def test_delete_hierarchical_leaf_project(self):"},{"line_number":2730,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy()"},{"line_number":2731,"context_line":"        root_project \u003d projects_hierarchy[0]"},{"line_number":2732,"context_line":"        leaf_project \u003d projects_hierarchy[1]"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_e078f190","line":2729,"updated":"2014-12-04 07:40:47.000000000","message":"the functionality of this seems to be entirely covered by the basic crud tests above...so we should either a) make this more comprehensive if there are other test cases, b) only test a basic version in crud, or c) remove this.","commit_id":"efd9733e7fa89a51de9278d3591d18aa33e5e885"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"67454fd904f3ace23ed369e03090e2f4c599a127","unresolved":false,"context_lines":[{"line_number":2726,"context_line":"                          leaf_project[\u0027id\u0027],"},{"line_number":2727,"context_line":"                          leaf_project)"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def test_delete_hierarchical_leaf_project(self):"},{"line_number":2730,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy()"},{"line_number":2731,"context_line":"        root_project \u003d projects_hierarchy[0]"},{"line_number":2732,"context_line":"        leaf_project \u003d projects_hierarchy[1]"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_ad3b399a","line":2729,"in_reply_to":"5a890539_e078f190","updated":"2014-12-04 12:02:42.000000000","message":"will go with b), think it\u0027s important to have this test here because this behaviour can change in the future.","commit_id":"efd9733e7fa89a51de9278d3591d18aa33e5e885"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1f07d5775d8699fd0be035b5a71dbe0175f30d43","unresolved":false,"context_lines":[{"line_number":2727,"context_line":"                          leaf_project)"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def test_delete_hierarchical_leaf_project(self):"},{"line_number":2730,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy()"},{"line_number":2731,"context_line":"        root_project \u003d projects_hierarchy[0]"},{"line_number":2732,"context_line":"        leaf_project \u003d projects_hierarchy[1]"},{"line_number":2733,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_403b85d0","line":2730,"updated":"2014-12-04 07:40:47.000000000","message":"yep, like this (see previous comment) :-)","commit_id":"efd9733e7fa89a51de9278d3591d18aa33e5e885"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1f07d5775d8699fd0be035b5a71dbe0175f30d43","unresolved":false,"context_lines":[{"line_number":2749,"context_line":"                          self.assignment_api.delete_project,"},{"line_number":2750,"context_line":"                          root_project[\u0027id\u0027])"},{"line_number":2751,"context_line":""},{"line_number":2752,"context_line":"    def test_update_project_parent(self):"},{"line_number":2753,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy()"},{"line_number":2754,"context_line":"        leaf_project \u003d projects_hierarchy[1]"},{"line_number":2755,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_e0ed5126","line":2752,"updated":"2014-12-04 07:40:47.000000000","message":"so this isn\u0027t really just updating project parent, but update_project_with_invalid_parent() ... just like you have a create_project_with_invalid_parent() further up","commit_id":"efd9733e7fa89a51de9278d3591d18aa33e5e885"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e9a92253407e10f4d1feea0da26bcfa8b109a5ca","unresolved":false,"context_lines":[{"line_number":2749,"context_line":"                          self.assignment_api.delete_project,"},{"line_number":2750,"context_line":"                          root_project[\u0027id\u0027])"},{"line_number":2751,"context_line":""},{"line_number":2752,"context_line":"    def test_update_project_parent(self):"},{"line_number":2753,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy()"},{"line_number":2754,"context_line":"        leaf_project \u003d projects_hierarchy[1]"},{"line_number":2755,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_2e365fe7","line":2752,"in_reply_to":"5a890539_0d69adbd","updated":"2014-12-04 13:28:28.000000000","message":"oh, right, I see!  Yes, I think using a valid parent ID would make this clearer...","commit_id":"efd9733e7fa89a51de9278d3591d18aa33e5e885"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"67454fd904f3ace23ed369e03090e2f4c599a127","unresolved":false,"context_lines":[{"line_number":2749,"context_line":"                          self.assignment_api.delete_project,"},{"line_number":2750,"context_line":"                          root_project[\u0027id\u0027])"},{"line_number":2751,"context_line":""},{"line_number":2752,"context_line":"    def test_update_project_parent(self):"},{"line_number":2753,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy()"},{"line_number":2754,"context_line":"        leaf_project \u003d projects_hierarchy[1]"},{"line_number":2755,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_0d69adbd","line":2752,"in_reply_to":"5a890539_e0ed5126","updated":"2014-12-04 12:02:42.000000000","message":"the main idea is to test the update of the parent_id (which is not allowed even if it exists). will update the test so the parent_id used to update is valid but the action will still be not possible.","commit_id":"efd9733e7fa89a51de9278d3591d18aa33e5e885"}],"keystone/tests/test_v3_assignment.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b12d2169515db2997b950d009c0920866321b16b","unresolved":false,"context_lines":[{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def test_create_hierarchical_project(self):"},{"line_number":520,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":521,"context_line":"        self._create_projects_hierarchy()"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def test_get_project(self):"},{"line_number":524,"context_line":"        \"\"\"Call ``GET /projects/{project_id}``.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_42c9a024","line":521,"updated":"2014-12-05 08:08:36.000000000","message":"seems a bit odd this test...we create the hierarchy, but don\u0027t test the projects exist....I agree we test the parents/subtree elsewhere...but maybe we should just check that each project returned in the list does now exist?","commit_id":"11cb0d303388b56b5974c74cd2349ebef3bf1d20"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f5bd1730cfa112ea931e0efe5ad7f6ed588e4b90","unresolved":false,"context_lines":[{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def test_create_hierarchical_project(self):"},{"line_number":520,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":521,"context_line":"        self._create_projects_hierarchy()"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def test_get_project(self):"},{"line_number":524,"context_line":"        \"\"\"Call ``GET /projects/{project_id}``.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_9b55adc4","line":521,"in_reply_to":"5a890539_42c9a024","updated":"2014-12-05 12:43:47.000000000","message":"you\u0027re right, will fix this and ping you on IRC :)","commit_id":"11cb0d303388b56b5974c74cd2349ebef3bf1d20"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9fd9a6502217be327333a09a67e4a764a9737c34","unresolved":false,"context_lines":[{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def test_create_hierarchical_project(self):"},{"line_number":520,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":521,"context_line":"        self._create_projects_hierarchy()"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def test_get_project(self):"},{"line_number":524,"context_line":"        \"\"\"Call ``GET /projects/{project_id}``.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_be433712","line":521,"in_reply_to":"5a890539_9b55adc4","updated":"2014-12-05 13:19:00.000000000","message":"just realized the self.assertValidProjectResponse() does that, since it checks the ref returned from the request. What do you think?","commit_id":"11cb0d303388b56b5974c74cd2349ebef3bf1d20"}]}
