)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"da95ce5b80e0d9a31fdb441a8c893b8751abb3e9","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7b4c2e22_7e36f42e","updated":"2026-11-06 17:05:48.000000000","message":"Please correct me if I read this wrong?","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"}],"openstack/exceptions.py":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"da95ce5b80e0d9a31fdb441a8c893b8751abb3e9","unresolved":true,"context_lines":[{"line_number":200,"context_line":"        elif obj.get(\u0027faultstring\u0027):"},{"line_number":201,"context_line":"            return str(obj[\u0027faultstring\u0027])"},{"line_number":202,"context_line":"    elif isinstance(obj, list):"},{"line_number":203,"context_line":"        # Placement uses {\"errors\": [{\"detail\": \"...\", ...}]}."},{"line_number":204,"context_line":"        messages \u003d ["},{"line_number":205,"context_line":"            str(error[\u0027detail\u0027])"},{"line_number":206,"context_line":"            for error in obj"}],"source_content_type":"text/x-python","patch_set":1,"id":"055e95a0_ab634fa6","line":203,"updated":"2026-11-06 17:05:48.000000000","message":"I don\u0027t see how you\u0027re matching this here... the whole payload is passed in and it\u0027s gonna be a dict first and then you need to grab the list of errors.","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"34823949142cf97b210d15f16cf8084998d01492","unresolved":true,"context_lines":[{"line_number":200,"context_line":"        elif obj.get(\u0027faultstring\u0027):"},{"line_number":201,"context_line":"            return str(obj[\u0027faultstring\u0027])"},{"line_number":202,"context_line":"    elif isinstance(obj, list):"},{"line_number":203,"context_line":"        # Placement uses {\"errors\": [{\"detail\": \"...\", ...}]}."},{"line_number":204,"context_line":"        messages \u003d ["},{"line_number":205,"context_line":"            str(error[\u0027detail\u0027])"},{"line_number":206,"context_line":"            for error in obj"}],"source_content_type":"text/x-python","patch_set":1,"id":"5709e9af_b2c7d290","line":203,"in_reply_to":"055e95a0_ab634fa6","updated":"2026-11-09 10:31:11.000000000","message":"We iterate through the array below (see my comment) so this will only ever receive one item from that list. The fact that this caught you suggests we should rework this though. Okay to do that in a follow-up?","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"ecf57e4195e11bfb000931313fdfee61de2020c1","unresolved":true,"context_lines":[{"line_number":200,"context_line":"        elif obj.get(\u0027faultstring\u0027):"},{"line_number":201,"context_line":"            return str(obj[\u0027faultstring\u0027])"},{"line_number":202,"context_line":"    elif isinstance(obj, list):"},{"line_number":203,"context_line":"        # Placement uses {\"errors\": [{\"detail\": \"...\", ...}]}."},{"line_number":204,"context_line":"        messages \u003d ["},{"line_number":205,"context_line":"            str(error[\u0027detail\u0027])"},{"line_number":206,"context_line":"            for error in obj"}],"source_content_type":"text/x-python","patch_set":1,"id":"240cf693_904d7b5a","line":203,"in_reply_to":"5709e9af_b2c7d290","updated":"2026-11-09 11:30:34.000000000","message":"\u003e Okay to do that in a follow-up?\n\nOf course","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"da95ce5b80e0d9a31fdb441a8c893b8751abb3e9","unresolved":true,"context_lines":[{"line_number":206,"context_line":"            for error in obj"},{"line_number":207,"context_line":"            if isinstance(error, dict) and error.get(\u0027detail\u0027)"},{"line_number":208,"context_line":"        ]"},{"line_number":209,"context_line":"        return \u0027\\n\u0027.join(messages) or None"},{"line_number":210,"context_line":"    elif isinstance(obj, str):"},{"line_number":211,"context_line":"        # Ironic before Stein has double JSON encoding, nobody remembers why."},{"line_number":212,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"0d054d90_d7bacfec","line":209,"updated":"2026-11-06 17:05:48.000000000","message":"You\u0027ve already got a join down below. I almost wonder if it wouldn\u0027t be better clean this redundancy up?","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"34823949142cf97b210d15f16cf8084998d01492","unresolved":true,"context_lines":[{"line_number":206,"context_line":"            for error in obj"},{"line_number":207,"context_line":"            if isinstance(error, dict) and error.get(\u0027detail\u0027)"},{"line_number":208,"context_line":"        ]"},{"line_number":209,"context_line":"        return \u0027\\n\u0027.join(messages) or None"},{"line_number":210,"context_line":"    elif isinstance(obj, str):"},{"line_number":211,"context_line":"        # Ironic before Stein has double JSON encoding, nobody remembers why."},{"line_number":212,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ef87f8c_8adcd368","line":209,"in_reply_to":"0d054d90_d7bacfec","updated":"2026-11-09 10:31:11.000000000","message":"Yeah, let me rework this in the follow-up","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"ecf57e4195e11bfb000931313fdfee61de2020c1","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            for error in obj"},{"line_number":207,"context_line":"            if isinstance(error, dict) and error.get(\u0027detail\u0027)"},{"line_number":208,"context_line":"        ]"},{"line_number":209,"context_line":"        return \u0027\\n\u0027.join(messages) or None"},{"line_number":210,"context_line":"    elif isinstance(obj, str):"},{"line_number":211,"context_line":"        # Ironic before Stein has double JSON encoding, nobody remembers why."},{"line_number":212,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"4317e9d9_9aa6d4cb","line":209,"in_reply_to":"5ef87f8c_8adcd368","updated":"2026-11-09 11:30:34.000000000","message":"Acknowledged","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"34823949142cf97b210d15f16cf8084998d01492","unresolved":true,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        try:"},{"line_number":252,"context_line":"            content \u003d response.json()"},{"line_number":253,"context_line":"            messages \u003d [_extract_message(obj) for obj in content.values()]"},{"line_number":254,"context_line":"            if not any(messages):"},{"line_number":255,"context_line":"                # Exception dict may be the root dict in projects that use WSME"},{"line_number":256,"context_line":"                messages \u003d [_extract_message(content)]"}],"source_content_type":"text/x-python","patch_set":1,"id":"deb63c00_602f31df","line":253,"updated":"2026-11-09 10:31:11.000000000","message":"Here","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"ecf57e4195e11bfb000931313fdfee61de2020c1","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        try:"},{"line_number":252,"context_line":"            content \u003d response.json()"},{"line_number":253,"context_line":"            messages \u003d [_extract_message(obj) for obj in content.values()]"},{"line_number":254,"context_line":"            if not any(messages):"},{"line_number":255,"context_line":"                # Exception dict may be the root dict in projects that use WSME"},{"line_number":256,"context_line":"                messages \u003d [_extract_message(content)]"}],"source_content_type":"text/x-python","patch_set":1,"id":"60e015e7_9b7c845e","line":253,"in_reply_to":"deb63c00_602f31df","updated":"2026-11-09 11:30:34.000000000","message":"Acknowledged","commit_id":"ce1f2d3ae5647be6ac7ae3454d6f09bcd5922717"}]}
