)]}'
{"muranodashboard/common/widgets.py":[{"author":{"_account_id":14265,"name":"Filip Blaha","email":"filip.blaha@hpe.com","username":"fblaha"},"change_message_id":"444da028e89342a8bfb47ecd6cf67faf40373d16","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        return dict(map(self.parse_value, values))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class ExtraContextWidgetMixin(object):"},{"line_number":95,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":96,"context_line":"        super(ExtraContextWidgetMixin, self).__init__(*args, **kwargs)"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_74e2d4a1","line":94,"updated":"2015-05-29 13:48:00.000000000","message":"class is not documented and not used in this commit. I think it would be more clear to place it into commit where is used","commit_id":"72d68845500f4cbac301e6b8ef5dc028b132e61b"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"bbbb7fc3cf9a35a1764bc08203f4b3169fbfe9d6","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import itertools as it"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import floppyforms as floppy"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class TriStateCheckboxSelectMultiple(floppy.widgets.Input):"}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_7d99eb78","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":28},"updated":"2016-05-16 13:52:30.000000000","message":"Indeed, this library was never used by openstack and is no longer available in the dashboards requirements","commit_id":"78fbb62472ac1e452cbfff4e696303bf971866d8"},{"author":{"_account_id":14107,"name":"zhurong","email":"aaronzhu1121@gmail.com","username":"zhurong"},"change_message_id":"81a409a0ee815743d62c65a5513d056ae8b25587","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import itertools as it"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import floppyforms as floppy"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class TriStateCheckboxSelectMultiple(floppy.widgets.Input):"}],"source_content_type":"text/x-python","patch_set":11,"id":"dab17558_cd7afc23","line":17,"range":{"start_line":17,"start_character":7,"end_line":17,"end_character":18},"updated":"2016-05-16 07:32:55.000000000","message":"floppyforms is in django-floppyforms but didn\u0027t in requirements.txt,\nshould add to requirements.txt","commit_id":"78fbb62472ac1e452cbfff4e696303bf971866d8"},{"author":{"_account_id":13962,"name":"Victor Ryzhenkin","email":"vryzhenkin@mirantis.com","username":"vryzhenkin"},"change_message_id":"2eeae3c171d5735290ed540caaec71adc7734682","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import itertools as it"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import floppyforms as floppy"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class TriStateCheckboxSelectMultiple(floppy.widgets.Input):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_88236bbc","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":28},"in_reply_to":"dab17558_7d99eb78","updated":"2016-05-23 11:54:34.000000000","message":"So, Andrew, you can try to add this one into openstack-requirements.","commit_id":"78fbb62472ac1e452cbfff4e696303bf971866d8"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"1bb2874120a0cc30dcfefdcc4a290cc881c64af2","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            value \u003d dict(dict.fromkeys(choices, False).items() +"},{"line_number":55,"context_line":"                         value.items())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"}],"source_content_type":"text/x-python","patch_set":18,"id":"1aa78d24_78e171fe","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":57},"updated":"2016-07-08 13:00:46.000000000","message":"please mark this string for translation.","commit_id":"f1472cf8ac5b0aeb023c4e3fdb27719e4d972a30"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"1bb2874120a0cc30dcfefdcc4a290cc881c64af2","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"1aa78d24_38d7e924","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":14},"updated":"2016-07-08 13:00:46.000000000","message":"what\u0027s the point in using assert here? At worst it would cause the user to see 500 error, which is bad UX. I would rather use horizon\u0027s/django\u0027s native error reporting system.","commit_id":"f1472cf8ac5b0aeb023c4e3fdb27719e4d972a30"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"2d02512b2a8c8388942d29a92739b28900f2c057","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"1aa78d24_4db1cc8e","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":14},"in_reply_to":"1aa78d24_08d33fd6","updated":"2016-07-12 12:57:36.000000000","message":"assert failure will result in a 500, right? I\u0027m strongly against this behaviour","commit_id":"f1472cf8ac5b0aeb023c4e3fdb27719e4d972a30"},{"author":{"_account_id":14726,"name":"Andrew Pashkin","username":"pashkin"},"change_message_id":"835b791b2d7bf67c4df71a9d47b839cd8480c09c","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"1aa78d24_18814d90","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":14},"in_reply_to":"1aa78d24_38d7e924","updated":"2016-07-08 13:11:14.000000000","message":"\u003e ... horizon\u0027s/django\u0027s native error reporting system.\n\nIt is actually implemented there (line 59):\nhttps://review.openstack.org/#/c/175215/18/muranodashboard/common/fields.py\n\nSo, I\u0027ll just remove this line.","commit_id":"f1472cf8ac5b0aeb023c4e3fdb27719e4d972a30"},{"author":{"_account_id":14726,"name":"Andrew Pashkin","username":"pashkin"},"change_message_id":"94b9723c10ae667d6444d7c8c3534242cf236bea","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"1aa78d24_08d33fd6","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":14},"in_reply_to":"1aa78d24_38d7e924","updated":"2016-07-12 09:14:02.000000000","message":"Actually, I think I will restore the assertions. Because:\n\n1) Check with \"horizon\u0027s/django\u0027s native error reporting\" happens in field. And here, in widget, it is good to have just a guard against inconsistent data, as a defensive programming measure.\n\n2) The string is expected to appear in exception and I think, such string doesn\u0027t require translation.","commit_id":"f1472cf8ac5b0aeb023c4e3fdb27719e4d972a30"},{"author":{"_account_id":14726,"name":"Andrew Pashkin","username":"pashkin"},"change_message_id":"01f43e3c5877ed7b7d50e92fff90c24cec950dd6","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"1aa78d24_5ae97bb6","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":14},"in_reply_to":"1aa78d24_4db1cc8e","updated":"2016-07-12 13:58:41.000000000","message":"Example:\nhttps://github.com/django/django/blob/08ed3cc6d160d0d864ff687db9a62959a86e7372/django/forms/widgets.py#L956","commit_id":"f1472cf8ac5b0aeb023c4e3fdb27719e4d972a30"},{"author":{"_account_id":14726,"name":"Andrew Pashkin","username":"pashkin"},"change_message_id":"bb69c01128e5f5270cd9c08d4ef82a26e6de69cd","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"1aa78d24_d7526634","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":14},"in_reply_to":"1aa78d24_4db1cc8e","updated":"2016-07-12 13:49:00.000000000","message":"Yes. If execution came to the point of rendering the widget and there is some inconsistent data 500 is exactly what should happen.\n\nDjango-validation happens in fields.py and widget is a separate unit, which doesn\u0027t perform validation and at the same time it\u0027s desireable to have some guards in it.","commit_id":"f1472cf8ac5b0aeb023c4e3fdb27719e4d972a30"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"754f9358283fc7b2219b1e11950d0845c82f3abb","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            value \u003d dict(dict.fromkeys(choices, False).items() +"},{"line_number":55,"context_line":"                         value.items())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a98d1f4_80b58432","line":57,"range":{"start_line":57,"start_character":14,"end_line":57,"end_character":57},"updated":"2016-09-29 16:47:14.000000000","message":"please mark all user-visible strings for translation","commit_id":"ffaf164c6487a4767354e96dc60133a12763a7b1"},{"author":{"_account_id":14726,"name":"Andrew Pashkin","username":"pashkin"},"change_message_id":"efba9e63f6d9276cafd62802aaadbc06436ab2c1","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            value \u003d dict(dict.fromkeys(choices, False).items() +"},{"line_number":55,"context_line":"                         value.items())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a98d1f4_b5eb8baf","line":57,"range":{"start_line":57,"start_character":14,"end_line":57,"end_character":57},"in_reply_to":"3a98d1f4_80b58432","updated":"2016-09-30 00:37:39.000000000","message":"Done","commit_id":"ffaf164c6487a4767354e96dc60133a12763a7b1"},{"author":{"_account_id":15168,"name":"Kirill Zaitsev","email":"k.zaitsev@me.com","username":"kzaitsev"},"change_message_id":"754f9358283fc7b2219b1e11950d0845c82f3abb","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":24,"id":"3a98d1f4_e0a56804","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":14},"updated":"2016-09-29 16:47:14.000000000","message":"please remove","commit_id":"ffaf164c6487a4767354e96dc60133a12763a7b1"},{"author":{"_account_id":14726,"name":"Andrew Pashkin","username":"pashkin"},"change_message_id":"efba9e63f6d9276cafd62802aaadbc06436ab2c1","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":24,"id":"3a98d1f4_95e84fb6","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":14},"in_reply_to":"3a98d1f4_e0a56804","updated":"2016-09-30 00:37:39.000000000","message":"Done","commit_id":"ffaf164c6487a4767354e96dc60133a12763a7b1"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"768bbdfb4f27a36d48f62a093a89ad00116693b5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            value \u003d dict(dict.fromkeys(choices, False).items() +"},{"line_number":55,"context_line":"                         value.items())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        msg \u003d \u0027Unexpected values: {}\u0027.format(repr(value))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        assert set(value.keys()) \u003d\u003d set(choices.keys()), msg"},{"line_number":60,"context_line":"        assert set(value.values()) \u003c\u003d set(self.VALUES_MAP.values()), msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        context[\u0027values\u0027] \u003d ["},{"line_number":63,"context_line":"            (choice, label, value[choice])"}],"source_content_type":"text/x-python","patch_set":29,"id":"1a6eadb0_6cefb1b0","line":60,"range":{"start_line":57,"start_character":0,"end_line":60,"end_character":72},"updated":"2016-12-19 17:04:26.000000000","message":"Did you mean to remove these lines? From what I can tell, Kirill asked you to remove this in patchset 24, which you then did in patchset 25, but then it comes back in patchset 26 onward.","commit_id":"9a992d26ea2b53f25455584b90d8c557231dd788"}]}
