)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"21da2d414667350b1e493a4b00c1b9381b098b4a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"role:admin)."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Partial-bug: 1346648"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: Id914c478ca7c4dfde3f08028d8b70c623f26b6e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1a930d6b_3baa6885","line":23,"updated":"2015-01-26 08:29:56.000000000","message":"Need to link the BP here later.","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"8371d37bf2d2e1bad6ad1f6043741afa7b9bcb20","unresolved":false,"context_lines":[{"line_number":20,"context_line":"role:admin)."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Partial-bug: 1346648"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: Id914c478ca7c4dfde3f08028d8b70c623f26b6e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1a930d6b_79493730","line":23,"in_reply_to":"1a930d6b_3baa6885","updated":"2015-01-26 22:37:01.000000000","message":"Done","commit_id":"a612abace3f76e862611a024acc8196f272d9949"}],"glance/api/policy.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"21da2d414667350b1e493a4b00c1b9381b098b4a","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    def get_data(self, *args, **kwargs):"},{"line_number":171,"context_line":"        target \u003d Target(self.image)"},{"line_number":172,"context_line":"        self.policy.enforce(self.context, \u0027download_image\u0027,"},{"line_number":173,"context_line":"                            target\u003dtarget)"},{"line_number":174,"context_line":"        return self.image.get_data(*args, **kwargs)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def set_data(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a930d6b_7b223053","line":173,"updated":"2015-01-26 08:29:56.000000000","message":"why don\u0027t use self.target here as well.","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"781268782b8e615797a255649384651428e90c77","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    def get_data(self, *args, **kwargs):"},{"line_number":171,"context_line":"        target \u003d Target(self.image)"},{"line_number":172,"context_line":"        self.policy.enforce(self.context, \u0027download_image\u0027,"},{"line_number":173,"context_line":"                            target\u003dtarget)"},{"line_number":174,"context_line":"        return self.image.get_data(*args, **kwargs)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def set_data(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a930d6b_f650d633","line":173,"in_reply_to":"1a930d6b_7b223053","updated":"2015-01-26 22:32:58.000000000","message":"Good catch. Done.","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"21da2d414667350b1e493a4b00c1b9381b098b4a","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        \"\"\""},{"line_number":378,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        value \u003d getattr(self.target, key, self.SENTINEL)"},{"line_number":381,"context_line":"        if value is self.SENTINEL:"},{"line_number":382,"context_line":"            extra_properties \u003d getattr(self.target, \u0027extra_properties\u0027, None)"},{"line_number":383,"context_line":"            if extra_properties is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a930d6b_dbc32455","line":380,"updated":"2015-01-26 08:29:56.000000000","message":"we really need self.SENTINEL ? \u0027None\u0027 and a check seems enough.","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"803308cbbe0722c638f1216a9ac27e145119188e","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        \"\"\""},{"line_number":378,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        value \u003d getattr(self.target, key, self.SENTINEL)"},{"line_number":381,"context_line":"        if value is self.SENTINEL:"},{"line_number":382,"context_line":"            extra_properties \u003d getattr(self.target, \u0027extra_properties\u0027, None)"},{"line_number":383,"context_line":"            if extra_properties is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa81d914_aa0f8f2d","line":380,"in_reply_to":"1a930d6b_1078fd8e","updated":"2015-01-27 18:33:45.000000000","message":"It could. The oslo.policy enforcer will do an\n\n    ast.literal_eval(leftside)\n\ne.g.,\n\n    ast.literal_eval(\u0027None\u0027)\n\nSo a rule like\n\n    \"None:%(someprop)\"\n\nWould expect to match essentially\n\n    None \u003d\u003d None","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"82543ac803efa4d870acb11c20e069d7c09239c0","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        \"\"\""},{"line_number":378,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        value \u003d getattr(self.target, key, self.SENTINEL)"},{"line_number":381,"context_line":"        if value is self.SENTINEL:"},{"line_number":382,"context_line":"            extra_properties \u003d getattr(self.target, \u0027extra_properties\u0027, None)"},{"line_number":383,"context_line":"            if extra_properties is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a930d6b_1078fd8e","line":380,"in_reply_to":"1a930d6b_5628ca99","updated":"2015-01-27 04:48:54.000000000","message":"can operator uses \"None\" in rule as needed?","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"781268782b8e615797a255649384651428e90c77","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        \"\"\""},{"line_number":378,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        value \u003d getattr(self.target, key, self.SENTINEL)"},{"line_number":381,"context_line":"        if value is self.SENTINEL:"},{"line_number":382,"context_line":"            extra_properties \u003d getattr(self.target, \u0027extra_properties\u0027, None)"},{"line_number":383,"context_line":"            if extra_properties is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a930d6b_5628ca99","line":380,"in_reply_to":"1a930d6b_dbc32455","updated":"2015-01-26 22:32:58.000000000","message":"Don\u0027t nullable columns come back as \"None\"? If the value is actually None, shouldn\u0027t we return that?","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4ac0bb01af217a29cd62c06ca7705de673235262","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        \"\"\""},{"line_number":378,"context_line":"        key \u003d self.key_transforms(key)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        value \u003d getattr(self.target, key, self.SENTINEL)"},{"line_number":381,"context_line":"        if value is self.SENTINEL:"},{"line_number":382,"context_line":"            extra_properties \u003d getattr(self.target, \u0027extra_properties\u0027, None)"},{"line_number":383,"context_line":"            if extra_properties is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_c8ee6b22","line":380,"in_reply_to":"fa81d914_aa0f8f2d","updated":"2015-02-02 05:55:12.000000000","message":"Good to know.","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"21da2d414667350b1e493a4b00c1b9381b098b4a","unresolved":false,"context_lines":[{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def key_transforms(self, key):"},{"line_number":390,"context_line":"        if key \u003d\u003d \u0027id\u0027:"},{"line_number":391,"context_line":"            key \u003d \u0027image_id\u0027"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        return key"},{"line_number":394,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a930d6b_5be1f4fc","line":391,"updated":"2015-01-26 08:29:56.000000000","message":"Probably due to this is still a WIP patch, seems this hard code is not as common as other resource type needed beyond image.","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"781268782b8e615797a255649384651428e90c77","unresolved":false,"context_lines":[{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def key_transforms(self, key):"},{"line_number":390,"context_line":"        if key \u003d\u003d \u0027id\u0027:"},{"line_number":391,"context_line":"            key \u003d \u0027image_id\u0027"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        return key"},{"line_number":394,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a930d6b_b6000e03","line":391,"in_reply_to":"1a930d6b_5be1f4fc","updated":"2015-01-26 22:32:58.000000000","message":"Yeah, I was working towards an abstraction. I forgot git-review removes the -1 on Workflow to indicate this is a WIP. Sorry about this.","commit_id":"a612abace3f76e862611a024acc8196f272d9949"},{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"f56b23ad2e146ec937cc0acece03aa138f7ff5d9","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            image \u003d super(ImageRepoProxy, self).get(image_id)"},{"line_number":116,"context_line":"        except exception.NotFound:"},{"line_number":117,"context_line":"            self.policy.enforce(self.context, \u0027get_image\u0027, {})"},{"line_number":118,"context_line":"            raise"},{"line_number":119,"context_line":"        else:"},{"line_number":120,"context_line":"            self.policy.enforce(self.context, \u0027get_image\u0027, ImageTarget(image))"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_88bce56d","line":117,"updated":"2015-03-19 17:52:27.000000000","message":"Afterthought: I\u0027m struggling to think of an example of when upgrading from a 404 (less privileged) to 403 (more privileged) would ever happen. (I can see it in the other direction -- 403 to 404.) @Ian?","commit_id":"b159aa8b644338360f6e90d34af40a662246fe47"},{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"07f499e26bb4208b7d1099ab1054ab3da2d2144c","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        except exception.NotFound:"},{"line_number":117,"context_line":"            self.policy.enforce(self.context, \u0027get_image\u0027, {})"},{"line_number":118,"context_line":"            raise"},{"line_number":119,"context_line":"        else:"},{"line_number":120,"context_line":"            self.policy.enforce(self.context, \u0027get_image\u0027, ImageTarget(image))"},{"line_number":121,"context_line":"        return image"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_86b13be2","line":119,"updated":"2015-03-19 16:53:23.000000000","message":"Don\u0027t strictly need the else here.\n\nComment around 404 versus 403 logic might be no harm.","commit_id":"b159aa8b644338360f6e90d34af40a662246fe47"}]}
