)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e4b4732a16431b41077e4828707de16a12030ecc","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Timofey Durakov \u003ctdurakov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-01-20 01:30:38 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Make all datastamps formats equal"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to this patch notifications for instance"},{"line_number":10,"context_line":"uses different format for datetime fields"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5a3905b3_66309902","line":7,"updated":"2017-01-20 13:23:49.000000000","message":"I think you mean \"timestamps\" not \"datastamps\"? :) Or maybe \"datetimes\"?","commit_id":"7082b769aed88c1e74abf4c040e2502a737b38d6"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"622739a75e7fa7388c88970ec586ead3772c6a3a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Timofey Durakov \u003ctdurakov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-01-20 01:30:38 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Make all datastamps formats equal"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to this patch notifications for instance"},{"line_number":10,"context_line":"uses different format for datetime fields"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5a3905b3_c12f773c","line":7,"in_reply_to":"5a3905b3_66309902","updated":"2017-01-20 13:30:04.000000000","message":"it\u0027s a brand new data format type:-D","commit_id":"7082b769aed88c1e74abf4c040e2502a737b38d6"}],"nova/notifications/base.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aece50101beed1a0764b5835aafc482a3364a825","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        # terminated and not deleted is a transient state), so include"},{"line_number":454,"context_line":"        # both and let the recipient decide which they want to use."},{"line_number":455,"context_line":"        terminated_at\u003dutils.null_safe_isotime("},{"line_number":456,"context_line":"            getattr(instance, \u0027terminated_at\u0027, None)),"},{"line_number":457,"context_line":"        deleted_at\u003dutils.null_safe_isotime("},{"line_number":458,"context_line":"            getattr(instance, \u0027deleted_at\u0027, None)),"},{"line_number":459,"context_line":"        launched_at\u003dutils.null_safe_isotime("}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_abca6e9f","line":456,"range":{"start_line":456,"start_character":12,"end_line":456,"end_character":54},"updated":"2017-01-19 21:31:55.000000000","message":"Why did this need to change from get to getattr?","commit_id":"b9eb5fd982d43de0e0168d309df5bb29ff65d693"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"802bb6a99923824e054aa5596edff73cf5e1b8b0","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        # terminated and not deleted is a transient state), so include"},{"line_number":454,"context_line":"        # both and let the recipient decide which they want to use."},{"line_number":455,"context_line":"        terminated_at\u003dutils.null_safe_isotime("},{"line_number":456,"context_line":"            getattr(instance, \u0027terminated_at\u0027, None)),"},{"line_number":457,"context_line":"        deleted_at\u003dutils.null_safe_isotime("},{"line_number":458,"context_line":"            getattr(instance, \u0027deleted_at\u0027, None)),"},{"line_number":459,"context_line":"        launched_at\u003dutils.null_safe_isotime("}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_2b211efc","line":456,"range":{"start_line":456,"start_character":12,"end_line":456,"end_character":54},"in_reply_to":"5a3905b3_abca6e9f","updated":"2017-01-19 21:40:32.000000000","message":"I saw https://github.com/openstack/nova/blob/master/nova/objects/instance.py#L103 this todo for NovaObjectDictCompat removal, so the idea was to do be sure it will not fail, once someone address that todo","commit_id":"b9eb5fd982d43de0e0168d309df5bb29ff65d693"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a36d56bd6a42a2b62e6290df79f4fbafca54174a","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    # add audit fields:"},{"line_number":237,"context_line":"    (audit_start, audit_end) \u003d audit_period_bounds(current_period\u003dTrue)"},{"line_number":238,"context_line":"    payload[\"audit_period_beginning\"] \u003d null_safe_isotime(audit_start)"},{"line_number":239,"context_line":"    payload[\"audit_period_ending\"] \u003d null_safe_isotime(audit_end)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    # add bw usage info:"},{"line_number":242,"context_line":"    bw \u003d bandwidth_usage(instance, audit_start)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bff0334d_85e33da4","line":239,"range":{"start_line":238,"start_character":0,"end_line":239,"end_character":65},"updated":"2017-04-11 17:20:47.000000000","message":"These don\u0027t look like they could work, as the methods are defined internally in info_from_instance below.\n\nPerhaps best to take the actual bug fix parts out of https://review.openstack.org/#/c/455778/ and rebase this one on top of it?","commit_id":"496e10a2ec22594d502632479a7e87d510d3cb45"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5eaa3bf41b3c17d9ae138f596b99c63f1fefd682","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    # add audit fields:"},{"line_number":237,"context_line":"    (audit_start, audit_end) \u003d audit_period_bounds(current_period\u003dTrue)"},{"line_number":238,"context_line":"    payload[\"audit_period_beginning\"] \u003d null_safe_isotime(audit_start)"},{"line_number":239,"context_line":"    payload[\"audit_period_ending\"] \u003d null_safe_isotime(audit_end)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    # add bw usage info:"},{"line_number":242,"context_line":"    bw \u003d bandwidth_usage(instance, audit_start)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_d6e36833","line":239,"range":{"start_line":238,"start_character":0,"end_line":239,"end_character":65},"in_reply_to":"7ffa3b31_5541d50a","updated":"2017-05-11 12:06:14.000000000","message":"Done","commit_id":"496e10a2ec22594d502632479a7e87d510d3cb45"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"85af9e9c1b7424cb5f2e23c98201f0361243fa5a","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    # add audit fields:"},{"line_number":237,"context_line":"    (audit_start, audit_end) \u003d audit_period_bounds(current_period\u003dTrue)"},{"line_number":238,"context_line":"    payload[\"audit_period_beginning\"] \u003d null_safe_isotime(audit_start)"},{"line_number":239,"context_line":"    payload[\"audit_period_ending\"] \u003d null_safe_isotime(audit_end)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    # add bw usage info:"},{"line_number":242,"context_line":"    bw \u003d bandwidth_usage(instance, audit_start)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7ffa3b31_5541d50a","line":239,"range":{"start_line":238,"start_character":0,"end_line":239,"end_character":65},"in_reply_to":"bff0334d_85e33da4","updated":"2017-05-02 07:32:59.000000000","message":"You are right. This should not work. Which also means we have 0 test coverage on this code path. Also this means that we anyhow needs to move the the helper functions first and then start using there here.","commit_id":"496e10a2ec22594d502632479a7e87d510d3cb45"}],"nova/utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e00a5bd518ce748764056f055d556c5514315c93","unresolved":false,"context_lines":[{"line_number":1435,"context_line":""},{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"def null_safe_int(s):"},{"line_number":1438,"context_line":"    return int(s) if s else \u0027\u0027"},{"line_number":1439,"context_line":""},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"def null_safe_isotime(s):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_2b47a51e","line":1438,"updated":"2017-03-06 16:31:12.000000000","message":"else 0?","commit_id":"3b0d725d95efe719f50b13f1975ff984900c9509"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"88e796f9d8549e152faffc466fec36fec364e56f","unresolved":false,"context_lines":[{"line_number":1435,"context_line":""},{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"def null_safe_int(s):"},{"line_number":1438,"context_line":"    return int(s) if s else \u0027\u0027"},{"line_number":1439,"context_line":""},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"def null_safe_isotime(s):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bff0334d_32ef151f","line":1438,"in_reply_to":"1a1ced50_bf10fe4f","updated":"2017-04-11 16:44:00.000000000","message":"Fixed in a separate patch [1] as requested.\n\n[1]https://review.openstack.org/#/c/455778/","commit_id":"3b0d725d95efe719f50b13f1975ff984900c9509"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c5d6f1a4db048255983b50e43fec66fbbc22a241","unresolved":false,"context_lines":[{"line_number":1435,"context_line":""},{"line_number":1436,"context_line":""},{"line_number":1437,"context_line":"def null_safe_int(s):"},{"line_number":1438,"context_line":"    return int(s) if s else \u0027\u0027"},{"line_number":1439,"context_line":""},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"def null_safe_isotime(s):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_bf10fe4f","line":1438,"in_reply_to":"ba2be162_2b47a51e","updated":"2017-03-17 17:09:56.000000000","message":"Also, the above will return \u0027\u0027 for s \u003d\u003d 0:\n\n\u003e\u003e\u003e def null_safe_int(s):\n...     return int(s) if s else \u0027\u0027\n... \n\u003e\u003e\u003e null_safe_int(0)\n\u0027\u0027","commit_id":"3b0d725d95efe719f50b13f1975ff984900c9509"}]}
