)]}'
{"horizon/exceptions.py":[{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"0aaf2d00e2c24d43a17934b30f7d7d730bd86a0c","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        if ret:"},{"line_number":346,"context_line":"            return ret"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    six.reraise(exc_type, exc_value, exc_traceback)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_3df9b51b","line":348,"range":{"start_line":348,"start_character":4,"end_line":348,"end_character":51},"updated":"2020-01-15 07:03:36.000000000","message":"you missed this?\nAre you going to cover this[1] in a another patch?\n[1] https://opendev.org/openstack/horizon/search?q\u003dsix.reraise","commit_id":"3a9eff62a140dceca6f816244960800874925fb2"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"f58a6dd93e4cf1be7b9d0365d783f8e508710481","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        if ret:"},{"line_number":346,"context_line":"            return ret"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    six.reraise(exc_type, exc_value, exc_traceback)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4e75d996","line":348,"range":{"start_line":348,"start_character":4,"end_line":348,"end_character":51},"in_reply_to":"3fa7e38b_3df9b51b","updated":"2020-01-15 10:35:56.000000000","message":"Since there is no built-in function in Python 3, I\u0027m going to implement it in oslo.utils. I mentioned it in the commit message","commit_id":"3a9eff62a140dceca6f816244960800874925fb2"}],"horizon/tables/formset.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"b98505fd7e856b91d541cec930b5934021f3c5a4","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            if self.field.errors:"},{"line_number":40,"context_line":"                self.attrs[\u0027class\u0027] \u003d (self.attrs.get(\u0027class\u0027, \u0027\u0027) +"},{"line_number":41,"context_line":"                                       \u0027 error form-group\u0027)"},{"line_number":42,"context_line":"                self.attrs[\u0027title\u0027] \u003d \u0027 \u0027.join(self.field.errors)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class FormsetRow(horizon_tables.Row):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_63fcc03e","line":42,"updated":"2020-01-09 10:43:11.000000000","message":"Is it okay even if we have no string conversion here?\n\nI made similar comment in horizon/workflows/views.py too.","commit_id":"5ebf27d7ab583ac529e50b6b7c7091aa21a1f75c"}],"horizon/templatetags/angular.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"b98505fd7e856b91d541cec930b5934021f3c5a4","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        path \u003d result[-1]"},{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            with open(path, encoding\u003d\u0027utf-8\u0027) as template_file:"},{"line_number":116,"context_line":"                angular_templates[template_static_path] \u003d template_file.\\"},{"line_number":117,"context_line":"                    read()"},{"line_number":118,"context_line":"        except (OSError, IOError):"},{"line_number":119,"context_line":"            # Failed to read template, leave the template dictionary blank"},{"line_number":120,"context_line":"            # If the caller is using this dictionary to pre-populate a cache"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e34c309e","line":117,"range":{"start_line":116,"start_character":16,"end_line":117,"end_character":26},"updated":"2020-01-09 10:43:11.000000000","message":"It can be a single line.","commit_id":"5ebf27d7ab583ac529e50b6b7c7091aa21a1f75c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"61cee2f52c50e7af0080bce0433833ee4aba2b28","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        path \u003d result[-1]"},{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            with open(path, encoding\u003d\u0027utf-8\u0027) as template_file:"},{"line_number":116,"context_line":"                angular_templates[template_static_path] \u003d template_file.\\"},{"line_number":117,"context_line":"                    read()"},{"line_number":118,"context_line":"        except (OSError, IOError):"},{"line_number":119,"context_line":"            # Failed to read template, leave the template dictionary blank"},{"line_number":120,"context_line":"            # If the caller is using this dictionary to pre-populate a cache"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_baa735bb","line":117,"range":{"start_line":116,"start_character":16,"end_line":117,"end_character":26},"in_reply_to":"3fa7e38b_e34c309e","updated":"2020-01-09 15:01:16.000000000","message":"Done","commit_id":"5ebf27d7ab583ac529e50b6b7c7091aa21a1f75c"}],"horizon/workflows/views.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"b98505fd7e856b91d541cec930b5934021f3c5a4","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        for step in workflow.steps[start:end + 1]:"},{"line_number":158,"context_line":"            if not step.action.is_valid():"},{"line_number":159,"context_line":"                errors[step.slug] \u003d dict("},{"line_number":160,"context_line":"                    (field, errors)"},{"line_number":161,"context_line":"                    for (field, errors) in step.action.errors.items())"},{"line_number":162,"context_line":"        return {"},{"line_number":163,"context_line":"            \u0027has_errors\u0027: bool(errors),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_463992d5","line":160,"updated":"2020-01-09 10:43:11.000000000","message":"I am not sure whether \"errors\u0027 always contain string only.\nI found https://opendev.org/openstack/horizon/src/branch/master/horizon/workflows/base.py#L193 so I am not confident that only string is passed to step.action.errors.","commit_id":"5ebf27d7ab583ac529e50b6b7c7091aa21a1f75c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"61cee2f52c50e7af0080bce0433833ee4aba2b28","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        for step in workflow.steps[start:end + 1]:"},{"line_number":158,"context_line":"            if not step.action.is_valid():"},{"line_number":159,"context_line":"                errors[step.slug] \u003d dict("},{"line_number":160,"context_line":"                    (field, errors)"},{"line_number":161,"context_line":"                    for (field, errors) in step.action.errors.items())"},{"line_number":162,"context_line":"        return {"},{"line_number":163,"context_line":"            \u0027has_errors\u0027: bool(errors),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_da9eb167","line":160,"in_reply_to":"3fa7e38b_463992d5","updated":"2020-01-09 15:01:16.000000000","message":"Done","commit_id":"5ebf27d7ab583ac529e50b6b7c7091aa21a1f75c"}]}
