)]}'
{"nova/objects/security_group.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd43fc60e432a3b8cc4dc34892dbe32d7132aea1","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    @staticmethod"},{"line_number":115,"context_line":"    @db_api.pick_context_manager_reader"},{"line_number":116,"context_line":"    def _get_counts_from_db(context, project_id, user_id\u003dNone):"},{"line_number":117,"context_line":"        query \u003d context.session.query(models.SecurityGroup.id).\\"},{"line_number":118,"context_line":"                filter_by(deleted\u003d0).\\"},{"line_number":119,"context_line":"                filter_by(project_id\u003dproject_id)"},{"line_number":120,"context_line":"        counts \u003d {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_21d8fe1b","line":117,"updated":"2017-06-15 20:46:34.000000000","message":"OK I think this is modeled on:\n\nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L4526\n\nWhich is what _sync_security_groups is using.","commit_id":"5df90bdbc4c05f2f21e6a1773f6677feefbc86dc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0716db58e40119c0bb7f78eed36e2686bc8daee1","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    @staticmethod"},{"line_number":115,"context_line":"    @db_api.pick_context_manager_reader"},{"line_number":116,"context_line":"    def _get_counts_from_db(context, project_id, user_id\u003dNone):"},{"line_number":117,"context_line":"        query \u003d context.session.query(models.SecurityGroup.id).\\"},{"line_number":118,"context_line":"                filter_by(deleted\u003d0).\\"},{"line_number":119,"context_line":"                filter_by(project_id\u003dproject_id)"},{"line_number":120,"context_line":"        counts \u003d {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_dfa6c2ab","line":117,"in_reply_to":"7f231b9d_21d8fe1b","updated":"2017-06-16 01:16:31.000000000","message":"Correct. Keep an eye peeled for more similarities to _sync* functions in the series for counting.","commit_id":"5df90bdbc4c05f2f21e6a1773f6677feefbc86dc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd43fc60e432a3b8cc4dc34892dbe32d7132aea1","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                filter_by(project_id\u003dproject_id)"},{"line_number":120,"context_line":"        counts \u003d {}"},{"line_number":121,"context_line":"        counts[\u0027project\u0027] \u003d {\u0027security_groups\u0027: query.count()}"},{"line_number":122,"context_line":"        if user_id:"},{"line_number":123,"context_line":"            query \u003d query.filter_by(user_id\u003duser_id)"},{"line_number":124,"context_line":"            counts[\u0027user\u0027] \u003d {\u0027security_groups\u0027: query.count()}"},{"line_number":125,"context_line":"        return counts"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_0143c2b0","line":124,"range":{"start_line":122,"start_character":8,"end_line":124,"end_character":63},"updated":"2017-06-15 20:46:34.000000000","message":"We don\u0027t have a test where user_id isn\u0027t provided.","commit_id":"5df90bdbc4c05f2f21e6a1773f6677feefbc86dc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0716db58e40119c0bb7f78eed36e2686bc8daee1","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                filter_by(project_id\u003dproject_id)"},{"line_number":120,"context_line":"        counts \u003d {}"},{"line_number":121,"context_line":"        counts[\u0027project\u0027] \u003d {\u0027security_groups\u0027: query.count()}"},{"line_number":122,"context_line":"        if user_id:"},{"line_number":123,"context_line":"            query \u003d query.filter_by(user_id\u003duser_id)"},{"line_number":124,"context_line":"            counts[\u0027user\u0027] \u003d {\u0027security_groups\u0027: query.count()}"},{"line_number":125,"context_line":"        return counts"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_3fd25601","line":124,"range":{"start_line":122,"start_character":8,"end_line":124,"end_character":63},"in_reply_to":"7f231b9d_0143c2b0","updated":"2017-06-16 01:16:31.000000000","message":"Dangit.","commit_id":"5df90bdbc4c05f2f21e6a1773f6677feefbc86dc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd43fc60e432a3b8cc4dc34892dbe32d7132aea1","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @base.remotable_classmethod"},{"line_number":146,"context_line":"    def get_counts(cls, context, project_id, user_id\u003dNone):"},{"line_number":147,"context_line":"        \"\"\"Get the counts of InstanceGroup objects in the database."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        :param context: The request context for database access"},{"line_number":150,"context_line":"        :param project_id: The project_id to count across"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_e12c4603","line":147,"range":{"start_line":147,"start_character":29,"end_line":147,"end_character":42},"updated":"2017-06-15 20:46:34.000000000","message":"SecurityGroup","commit_id":"5df90bdbc4c05f2f21e6a1773f6677feefbc86dc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0716db58e40119c0bb7f78eed36e2686bc8daee1","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @base.remotable_classmethod"},{"line_number":146,"context_line":"    def get_counts(cls, context, project_id, user_id\u003dNone):"},{"line_number":147,"context_line":"        \"\"\"Get the counts of InstanceGroup objects in the database."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        :param context: The request context for database access"},{"line_number":150,"context_line":"        :param project_id: The project_id to count across"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_5fe992b4","line":147,"range":{"start_line":147,"start_character":29,"end_line":147,"end_character":42},"in_reply_to":"7f231b9d_e12c4603","updated":"2017-06-16 01:16:31.000000000","message":"Oops.","commit_id":"5df90bdbc4c05f2f21e6a1773f6677feefbc86dc"}],"nova/tests/functional/db/test_security_group.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd43fc60e432a3b8cc4dc34892dbe32d7132aea1","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self._create_group(name\u003d\u0027b\u0027, project_id\u003d\u0027foo\u0027)"},{"line_number":37,"context_line":"        self._create_group(name\u003d\u0027c\u0027, user_id\u003d\u0027bar\u0027)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        counts \u003d objects.SecurityGroupList.get_counts("},{"line_number":40,"context_line":"            self.context, self.context.project_id,"},{"line_number":41,"context_line":"            user_id\u003dself.context.user_id)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self.assertEqual(2, counts[\u0027project\u0027][\u0027security_groups\u0027])"},{"line_number":44,"context_line":"        self.assertEqual(1, counts[\u0027user\u0027][\u0027security_groups\u0027])"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_e115669d","line":41,"range":{"start_line":39,"start_character":8,"end_line":41,"end_character":41},"updated":"2017-06-15 20:46:34.000000000","message":"Add a wrinkle where user_id isn\u0027t provided.","commit_id":"5df90bdbc4c05f2f21e6a1773f6677feefbc86dc"}]}
