)]}'
{"keystone/common/controller.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            V2Controller.filter_domain_id(ref)"},{"line_number":279,"context_line":"            V2Controller.filter_project_parent_id(ref)"},{"line_number":280,"context_line":"            V2Controller.filter_is_domain(ref)"},{"line_number":281,"context_line":"            ref.pop(\u0027tags\u0027, None)"},{"line_number":282,"context_line":"            return ref"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        if isinstance(ref, dict):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_e96c999d","line":281,"range":{"start_line":281,"start_character":12,"end_line":281,"end_character":33},"updated":"2017-10-06 17:58:58.000000000","message":"V2Controller.filter_tags(ref)\n\nthis is exactly with the calls above do, let\u0027s do it consistently","commit_id":"1ce3b58726dd68494eeda5e3093371fbf30b3857"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            V2Controller.filter_domain_id(ref)"},{"line_number":279,"context_line":"            V2Controller.filter_project_parent_id(ref)"},{"line_number":280,"context_line":"            V2Controller.filter_is_domain(ref)"},{"line_number":281,"context_line":"            ref.pop(\u0027tags\u0027, None)"},{"line_number":282,"context_line":"            return ref"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        if isinstance(ref, dict):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_3edee46c","line":281,"range":{"start_line":281,"start_character":12,"end_line":281,"end_character":33},"updated":"2017-09-28 20:37:59.000000000","message":"We should rebase this patch on master because I don\u0027t think is needed anymore now that we\u0027ve removed the v2.0 resource APIs.","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"}],"keystone/resource/backends/base.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    @abc.abstractmethod"},{"line_number":266,"context_line":"    def list_projects_by_tags(self, tags, operator):"},{"line_number":267,"context_line":"        \"\"\"Filter for projects by tags."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        :param tags:"},{"line_number":270,"context_line":"        :param operator:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_e90139b1","line":267,"range":{"start_line":267,"start_character":11,"end_line":267,"end_character":21},"updated":"2017-10-06 17:58:58.000000000","message":"List ?","commit_id":"1ce3b58726dd68494eeda5e3093371fbf30b3857"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    def list_projects_by_tags(self, tags, operator):"},{"line_number":267,"context_line":"        \"\"\"Filter for projects by tags."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        :param tags:"},{"line_number":270,"context_line":"        :param operator:"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        :returns: a list of filtered project IDs"},{"line_number":273,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_a92d7147","line":270,"range":{"start_line":269,"start_character":0,"end_line":270,"end_character":24},"updated":"2017-10-06 17:58:58.000000000","message":"add a description for these?","commit_id":"1ce3b58726dd68494eeda5e3093371fbf30b3857"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    def list_projects_by_tags(self, tags, operator):"},{"line_number":267,"context_line":"        \"\"\"Filter for projects by tags."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        :param tags:"},{"line_number":270,"context_line":"        :param operator:"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        :returns: a list of filtered project IDs"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_bed3f45f","line":269,"range":{"start_line":269,"start_character":15,"end_line":269,"end_character":19},"updated":"2017-09-28 20:37:59.000000000","message":"We should fill in the type here.","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        \"\"\"Filter for projects by tags."},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        :param tags:"},{"line_number":270,"context_line":"        :param operator:"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        :returns: a list of filtered project IDs"},{"line_number":273,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_7ec9fca9","line":270,"range":{"start_line":270,"start_character":15,"end_line":270,"end_character":23},"updated":"2017-09-28 20:37:59.000000000","message":"What is the type/purpose of the operator here?","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"}],"keystone/resource/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                project \u003d parent_project"},{"line_number":175,"context_line":"            return parents"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def filter_tags(self, ids, tags, session):"},{"line_number":178,"context_line":"        filtered_ids \u003d []"},{"line_number":179,"context_line":"        for pid in ids:"},{"line_number":180,"context_line":"            query \u003d session.query(ProjectTag)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_3ec70499","line":177,"range":{"start_line":177,"start_character":8,"end_line":177,"end_character":19},"updated":"2017-09-28 20:37:59.000000000","message":"nit: we could make these private methods since they are not defined in the interface.","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                filtered_ids.append(pid)"},{"line_number":185,"context_line":"        return filtered_ids"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def filter_tags_any(self, ids, tags, session):"},{"line_number":188,"context_line":"        return ids"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def filter_not_tags(self, ids, tags, session):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_1ec44890","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":23},"updated":"2017-09-28 20:37:59.000000000","message":"same comment here.","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    def filter_tags_any(self, ids, tags, session):"},{"line_number":188,"context_line":"        return ids"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def filter_not_tags(self, ids, tags, session):"},{"line_number":191,"context_line":"        blacklist_ids \u003d self.filter_tags(ids, tags, session)"},{"line_number":192,"context_line":"        return self.filter_not_tags_any(blacklist_ids, tags, session)"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_febccc06","line":190,"range":{"start_line":190,"start_character":8,"end_line":190,"end_character":23},"updated":"2017-09-28 20:37:59.000000000","message":"same comment here.","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        blacklist_ids \u003d self.filter_tags(ids, tags, session)"},{"line_number":192,"context_line":"        return self.filter_not_tags_any(blacklist_ids, tags, session)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def filter_not_tags_any(self, ids, tags, session):"},{"line_number":195,"context_line":"        filtered_ids \u003d []"},{"line_number":196,"context_line":"        query \u003d session.query(Project)"},{"line_number":197,"context_line":"        for q in query:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_deb91015","line":194,"range":{"start_line":194,"start_character":8,"end_line":194,"end_character":27},"updated":"2017-09-28 20:37:59.000000000","message":"same comment here.","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        new_tag_ref.name \u003d value"},{"line_number":334,"context_line":"        self._tags.append(new_tag_ref)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    def _remove_old_tags(self):"},{"line_number":337,"context_line":"        old_tags \u003d list(self._tags)"},{"line_number":338,"context_line":"        for tag in old_tags:"},{"line_number":339,"context_line":"            self._tags.remove(tag)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_3ee824e0","line":336,"range":{"start_line":336,"start_character":8,"end_line":336,"end_character":24},"updated":"2017-09-28 20:37:59.000000000","message":"nit: For some reason the naming of this method makes me think there is some sort of time limit associated to a tag. I had to read what it does to realize this should only be invoked when doing a PUT (right?). Maybe something like `_overwrite_tags` would be more descriptive?","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                filtered_ids.append(pid)"},{"line_number":185,"context_line":"        return filtered_ids"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _filter_tags_any(self, ids, tags, session):"},{"line_number":188,"context_line":"        return ids"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _filter_not_tags(self, ids, tags, session):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_83acaa35","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":24},"updated":"2017-10-06 17:58:58.000000000","message":"is this noop?","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"803b7771eab9d62f5bd8559a67f063c606cfa25f","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                filtered_ids.append(pid)"},{"line_number":185,"context_line":"        return filtered_ids"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _filter_tags_any(self, ids, tags, session):"},{"line_number":188,"context_line":"        return ids"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _filter_not_tags(self, ids, tags, session):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_1a601ba5","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":24},"in_reply_to":"7f515b1d_83acaa35","updated":"2017-10-06 20:47:15.000000000","message":"This gets passed in from the controller, I\u0027ll check out your comment there about moving it to the manager.","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            query \u003d session.query(ProjectTag)"},{"line_number":207,"context_line":"            query \u003d query.filter(ProjectTag.name.in_(ref[\u0027tags\u0027]))"},{"line_number":208,"context_line":"            query \u003d query.distinct("},{"line_number":209,"context_line":"                ProjectTag.project_id).group_by(ProjectTag.project_id)"},{"line_number":210,"context_line":"            for q in query:"},{"line_number":211,"context_line":"                project_ids.append(q[\u0027project_id\u0027])"},{"line_number":212,"context_line":"            pids \u003d operator(project_ids, ref[\u0027tags\u0027], session)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_c3baa26c","line":209,"range":{"start_line":209,"start_character":38,"end_line":209,"end_character":70},"updated":"2017-10-06 17:58:58.000000000","message":"do we need to group?","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"3ec7b499a0de5f3eee1aca935826f539f6f12a54","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            query \u003d session.query(ProjectTag)"},{"line_number":207,"context_line":"            query \u003d query.filter(ProjectTag.name.in_(ref[\u0027tags\u0027]))"},{"line_number":208,"context_line":"            query \u003d query.distinct("},{"line_number":209,"context_line":"                ProjectTag.project_id).group_by(ProjectTag.project_id)"},{"line_number":210,"context_line":"            for q in query:"},{"line_number":211,"context_line":"                project_ids.append(q[\u0027project_id\u0027])"},{"line_number":212,"context_line":"            pids \u003d operator(project_ids, ref[\u0027tags\u0027], session)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f4e5783_0ad6b2f2","line":209,"range":{"start_line":209,"start_character":38,"end_line":209,"end_character":70},"in_reply_to":"7f515b1d_c3baa26c","updated":"2017-10-11 23:11:29.000000000","message":"Don\u0027t think so","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        lazy\u003d\u0027subquery\u0027,"},{"line_number":303,"context_line":"        cascade\u003d\u0027all,delete-orphan\u0027,"},{"line_number":304,"context_line":"        backref\u003d\u0027project\u0027,"},{"line_number":305,"context_line":"        primaryjoin\u003d\u0027and_(ProjectTag.project_id\u003d\u003dProject.id)\u0027"},{"line_number":306,"context_line":"    )"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    # Unique constraint across two columns to create the separation"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_6392cef8","line":305,"range":{"start_line":305,"start_character":8,"end_line":305,"end_character":61},"updated":"2017-10-06 17:58:58.000000000","message":"I don\u0027t think this is necessary, does it? but being explicit doesn\u0027t hurt.","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":312,"context_line":"    @hybrid_property"},{"line_number":313,"context_line":"    def tags(self):"},{"line_number":314,"context_line":"        if self._tags:"},{"line_number":315,"context_line":"            project_tags \u003d []"},{"line_number":316,"context_line":"            for tag in self._tags:"},{"line_number":317,"context_line":"                project_tags.append(tag.name)"},{"line_number":318,"context_line":"            return project_tags"},{"line_number":319,"context_line":"        return []"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    @tags.setter"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_c35e2275","line":318,"range":{"start_line":315,"start_character":12,"end_line":318,"end_character":31},"updated":"2017-10-06 17:58:58.000000000","message":"we could simply do:\n\n    return [tag.name for tag in self._tags]","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"3ec7b499a0de5f3eee1aca935826f539f6f12a54","unresolved":false,"context_lines":[{"line_number":312,"context_line":"    @hybrid_property"},{"line_number":313,"context_line":"    def tags(self):"},{"line_number":314,"context_line":"        if self._tags:"},{"line_number":315,"context_line":"            project_tags \u003d []"},{"line_number":316,"context_line":"            for tag in self._tags:"},{"line_number":317,"context_line":"                project_tags.append(tag.name)"},{"line_number":318,"context_line":"            return project_tags"},{"line_number":319,"context_line":"        return []"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    @tags.setter"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f4e5783_ca09ba95","line":318,"range":{"start_line":315,"start_character":12,"end_line":318,"end_character":31},"in_reply_to":"7f515b1d_c35e2275","updated":"2017-10-11 23:11:29.000000000","message":"Done","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        new_tag_ref.name \u003d value"},{"line_number":335,"context_line":"        self._tags.append(new_tag_ref)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def _overwrite_tags(self):"},{"line_number":338,"context_line":"        tags \u003d list(self._tags)"},{"line_number":339,"context_line":"        for tag in tags:"},{"line_number":340,"context_line":"            self._tags.remove(tag)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_a3032642","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":23},"updated":"2017-10-06 17:58:58.000000000","message":"_reset_tags ? or something like that?\n\n_overwrite_tags seems to me like we were receiving the new tags to override the existing ones, but this is just deleting the current tags","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"3ec7b499a0de5f3eee1aca935826f539f6f12a54","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        new_tag_ref.name \u003d value"},{"line_number":335,"context_line":"        self._tags.append(new_tag_ref)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def _overwrite_tags(self):"},{"line_number":338,"context_line":"        tags \u003d list(self._tags)"},{"line_number":339,"context_line":"        for tag in tags:"},{"line_number":340,"context_line":"            self._tags.remove(tag)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f4e5783_6afac675","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":23},"in_reply_to":"7f515b1d_7a0dcf33","updated":"2017-10-11 23:11:29.000000000","message":"Cleaned this up","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e63191853ac2869320329f1d7460d59901d9a0c2","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        new_tag_ref.name \u003d value"},{"line_number":335,"context_line":"        self._tags.append(new_tag_ref)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def _overwrite_tags(self):"},{"line_number":338,"context_line":"        tags \u003d list(self._tags)"},{"line_number":339,"context_line":"        for tag in tags:"},{"line_number":340,"context_line":"            self._tags.remove(tag)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_7a0dcf33","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":23},"in_reply_to":"7f515b1d_a3032642","updated":"2017-10-06 20:38:20.000000000","message":"This was my fault. I was under the assumption the original implementation of this method accepted a list of tags, removed the originals, and set the new tags (not sure why I thought that was the case). But that\u0027s the reason why I felt compelled to suggest a new name in Patch Set 4.\n\nIf it\u0027s more appropriate to rename it back to what it was, I retract my previous comment. Sorry for the confusion on my part!","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":337,"context_line":"    def _overwrite_tags(self):"},{"line_number":338,"context_line":"        tags \u003d list(self._tags)"},{"line_number":339,"context_line":"        for tag in tags:"},{"line_number":340,"context_line":"            self._tags.remove(tag)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"class ProjectTag(sql.ModelBase, sql.ModelDictMixin):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_c3a18248","line":340,"range":{"start_line":340,"start_character":23,"end_line":340,"end_character":29},"updated":"2017-10-06 17:58:58.000000000","message":"removing from the list means the tags will be deleted, since we\u0027re using cascade\u003d\u0027delete-orphan\u0027, correct? we should have a test for this","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1c6358bc20b81c4c2fb9f1da9f13fb7c95a37dca","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        sql.String(64), sql.ForeignKey(\u0027project.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":353,"context_line":"        nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":354,"context_line":"    name \u003d sql.Column(sql.Unicode(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":355,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_a388c6c5","line":355,"range":{"start_line":355,"start_character":4,"end_line":355,"end_character":66},"updated":"2017-10-06 17:58:58.000000000","message":"if both are primary keys, doesn\u0027t it mean they are unique already?","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e63191853ac2869320329f1d7460d59901d9a0c2","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        sql.String(64), sql.ForeignKey(\u0027project.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":353,"context_line":"        nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":354,"context_line":"    name \u003d sql.Column(sql.Unicode(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":355,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_1a76dba5","line":355,"range":{"start_line":355,"start_character":4,"end_line":355,"end_character":66},"in_reply_to":"7f515b1d_a388c6c5","updated":"2017-10-06 20:38:20.000000000","message":"I think what this is doing is saying a unique constraint exists between the project_id and name attributes of the tag.","commit_id":"f12bcc5dea24d05f83b5b3c264d545bd8e43105f"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"79542f21dec73b06a6e72594ea7b6706cf2fa4ee","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                project \u003d parent_project"},{"line_number":185,"context_line":"            return parents"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _filter_projects_by_tags(self, session, refs, filters):"},{"line_number":188,"context_line":"        pids \u003d [p[\u0027id\u0027] for p in refs]"},{"line_number":189,"context_line":"        filtered_ids \u003d []"},{"line_number":190,"context_line":"        query \u003d session.query(ProjectTag)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f4e5783_ce5b5752","line":187,"range":{"start_line":187,"start_character":0,"end_line":187,"end_character":63},"updated":"2017-10-10 03:49:43.000000000","message":"This entire method is ugly and can probably be cleaned up a bit.","commit_id":"e18d960d7b36ad876b685013775e87d4dbe7115e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f0b09b14a88df2f2f1b5b49014e73ab70c26f99b","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    def tags(cls):"},{"line_number":353,"context_line":"        return ProjectTag.name"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def _add_single_tag(self, value):"},{"line_number":356,"context_line":"        new_tag_ref \u003d ProjectTag()"},{"line_number":357,"context_line":"        new_tag_ref.project_id \u003d self.id"},{"line_number":358,"context_line":"        new_tag_ref.name \u003d value"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f4e5783_ae06db1f","line":355,"range":{"start_line":355,"start_character":8,"end_line":355,"end_character":23},"updated":"2017-10-10 03:53:15.000000000","message":"Could rename \"_add_tag\"","commit_id":"e18d960d7b36ad876b685013775e87d4dbe7115e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f0b09b14a88df2f2f1b5b49014e73ab70c26f99b","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        new_tag_ref.name \u003d value"},{"line_number":359,"context_line":"        self._tags.append(new_tag_ref)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def _overwrite_tags(self):"},{"line_number":362,"context_line":"        tags \u003d list(self._tags)"},{"line_number":363,"context_line":"        for tag in tags:"},{"line_number":364,"context_line":"            self._tags.remove(tag)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f4e5783_4e1e4771","line":361,"range":{"start_line":361,"start_character":9,"end_line":361,"end_character":23},"updated":"2017-10-10 03:53:15.000000000","message":"rename this","commit_id":"e18d960d7b36ad876b685013775e87d4dbe7115e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"ac5f5f5590948fc395c27d2ac2a1b82a37ff360e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                hints.filters.remove(f)"},{"line_number":95,"context_line":"        with sql.session_for_read() as session:"},{"line_number":96,"context_line":"            query \u003d session.query(Project)"},{"line_number":97,"context_line":"            if tag_filters:"},{"line_number":98,"context_line":"                project_refs \u003d self._filter_projects_by_tags(session,"},{"line_number":99,"context_line":"                                                             tag_filters)"},{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                project_refs \u003d sql.filter_limit_query(Project, query, hints)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            return [ref.to_dict() for ref in project_refs if not"},{"line_number":104,"context_line":"                    self._is_hidden_ref(ref)]"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_24e16c2b","line":101,"range":{"start_line":97,"start_character":12,"end_line":101,"end_character":76},"updated":"2017-10-13 15:24:20.000000000","message":"Ran into an issue here where I couldn\u0027t figure out how to differentiate between making a call with just a tags query vs a call with something like /projects?name\u003dfoo\u0026tags\u003dbar. For now it defaults to querying on tags before other values.","commit_id":"dcf1cc1c1ba80093f10847dd509775d8ca5cbcda"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1e532f9b32e785e7a1f2d5bd35ab4c83555cb510","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                hints.filters.remove(f)"},{"line_number":95,"context_line":"        with sql.session_for_read() as session:"},{"line_number":96,"context_line":"            query \u003d session.query(Project)"},{"line_number":97,"context_line":"            if tag_filters:"},{"line_number":98,"context_line":"                project_refs \u003d self._filter_projects_by_tags(session,"},{"line_number":99,"context_line":"                                                             tag_filters)"},{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                project_refs \u003d sql.filter_limit_query(Project, query, hints)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            return [ref.to_dict() for ref in project_refs if not"},{"line_number":104,"context_line":"                    self._is_hidden_ref(ref)]"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_afa7750b","line":101,"range":{"start_line":97,"start_character":12,"end_line":101,"end_character":76},"in_reply_to":"5f4e5783_24e16c2b","updated":"2017-10-13 15:51:00.000000000","message":"What if this is moved up to the manager? Is is possible to mix querys with other attributes and tags in nova?","commit_id":"dcf1cc1c1ba80093f10847dd509775d8ca5cbcda"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f77d7c4278de0af2ceba4935cf11fac858ed972e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                hints.filters.remove(f)"},{"line_number":95,"context_line":"        with sql.session_for_read() as session:"},{"line_number":96,"context_line":"            query \u003d session.query(Project)"},{"line_number":97,"context_line":"            if tag_filters:"},{"line_number":98,"context_line":"                project_refs \u003d self._filter_projects_by_tags(session,"},{"line_number":99,"context_line":"                                                             tag_filters)"},{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                project_refs \u003d sql.filter_limit_query(Project, query, hints)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            return [ref.to_dict() for ref in project_refs if not"},{"line_number":104,"context_line":"                    self._is_hidden_ref(ref)]"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_34fd19b1","line":101,"range":{"start_line":97,"start_character":12,"end_line":101,"end_character":76},"in_reply_to":"5f4e5783_8f4cb942","updated":"2017-10-13 18:33:52.000000000","message":"Done","commit_id":"dcf1cc1c1ba80093f10847dd509775d8ca5cbcda"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9c29a01a8fd4effbd70022f60370fc8440716dc7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                hints.filters.remove(f)"},{"line_number":95,"context_line":"        with sql.session_for_read() as session:"},{"line_number":96,"context_line":"            query \u003d session.query(Project)"},{"line_number":97,"context_line":"            if tag_filters:"},{"line_number":98,"context_line":"                project_refs \u003d self._filter_projects_by_tags(session,"},{"line_number":99,"context_line":"                                                             tag_filters)"},{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                project_refs \u003d sql.filter_limit_query(Project, query, hints)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            return [ref.to_dict() for ref in project_refs if not"},{"line_number":104,"context_line":"                    self._is_hidden_ref(ref)]"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f4e5783_8f4cb942","line":101,"range":{"start_line":97,"start_character":12,"end_line":101,"end_character":76},"in_reply_to":"5f4e5783_afa7750b","updated":"2017-10-13 15:53:51.000000000","message":"If you pull this into the manager you should just be dealing with super and subsets. The manager might have to ask for a couple sets from the backend, but it should have all the information in the right place to filter thinks down how it needs to. It should also keep more complexity out of the backend.","commit_id":"dcf1cc1c1ba80093f10847dd509775d8ca5cbcda"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c652760c6e42473cedfec2931b29f2b023f1a4dc","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystone import exception"},{"line_number":21,"context_line":"from keystone.resource.backends import base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"TAG_SEARCH_FILTERS \u003d (\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f4e5783_f7ef831b","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":18},"updated":"2017-10-13 19:05:05.000000000","message":"This looks like it can be removed since it\u0027s not used in this module.","commit_id":"00f14147b163cdd41b44e65f0499e06db15a0cb0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"fa20c560f6d8df12ec80fef16f3d8643df927170","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystone import exception"},{"line_number":21,"context_line":"from keystone.resource.backends import base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"TAG_SEARCH_FILTERS \u003d (\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f4e5783_e0364e03","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":18},"in_reply_to":"5f4e5783_c9574358","updated":"2017-10-17 16:31:33.000000000","message":"Done","commit_id":"00f14147b163cdd41b44e65f0499e06db15a0cb0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"281a5af822330052599db75047e39de4ea36253f","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystone import exception"},{"line_number":21,"context_line":"from keystone.resource.backends import base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"TAG_SEARCH_FILTERS \u003d (\u0027tags\u0027, \u0027tags-any\u0027, \u0027not-tags\u0027, \u0027not-tags-any\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f4e5783_c9574358","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":18},"in_reply_to":"5f4e5783_f7ef831b","updated":"2017-10-14 03:04:38.000000000","message":"Ah, yeah this was moved to the manager","commit_id":"00f14147b163cdd41b44e65f0499e06db15a0cb0"}],"keystone/tests/unit/default_fixtures.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"df5001b2a4c700e604c325226dfe097dff3ad4f6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027enabled\u0027: True,"},{"line_number":35,"context_line":"        \u0027parent_id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":36,"context_line":"        \u0027is_domain\u0027: False,"},{"line_number":37,"context_line":"        \u0027tags\u0027: []"},{"line_number":38,"context_line":"    }, {"},{"line_number":39,"context_line":"        \u0027id\u0027: BAZ_TENANT_ID,"},{"line_number":40,"context_line":"        \u0027name\u0027: \u0027BAZ\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_1e93285d","line":37,"range":{"start_line":37,"start_character":9,"end_line":37,"end_character":13},"updated":"2017-09-28 20:37:59.000000000","message":"The TENANTS list here might be removed with the removal of the v2.0 testing stuff. A rebase might make these changes unnecessary.","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"580d3fbfa670444aac5d9e395722fda2151de697","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027enabled\u0027: True,"},{"line_number":35,"context_line":"        \u0027parent_id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":36,"context_line":"        \u0027is_domain\u0027: False,"},{"line_number":37,"context_line":"        \u0027tags\u0027: []"},{"line_number":38,"context_line":"    }, {"},{"line_number":39,"context_line":"        \u0027id\u0027: BAZ_TENANT_ID,"},{"line_number":40,"context_line":"        \u0027name\u0027: \u0027BAZ\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f515b1d_9934d294","line":37,"range":{"start_line":37,"start_character":9,"end_line":37,"end_character":13},"in_reply_to":"7f515b1d_1e93285d","updated":"2017-09-28 21:11:41.000000000","message":"This is used by the base test class[0]. Should rename it to PROJECTS imo.\n\n[0] https://github.com/openstack/keystone/blob/master/keystone/tests/unit/core.py#L716","commit_id":"8beefa7d7e6bd7333cb99f32b7f118a14996d012"}]}
