)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"7401c7d5710ce42e0fcedae783689e411d4a877c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":31,"id":"3714154e_cdd95af4","updated":"2026-05-25 21:21:11.000000000","message":"@dcu995@gmail.com well.. Please add release note..","commit_id":"12121195b2e86002ea3b6205a04abdd56460875a"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"e342a996f8fe5336f9623d80f9e3a788dd0605e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"6e8e6843_f7f359c5","updated":"2026-05-25 21:22:19.000000000","message":"@mangust404@gmail.com old code updated, please look it.","commit_id":"12121195b2e86002ea3b6205a04abdd56460875a"},{"author":{"_account_id":37632,"name":"Dmitriy Chubinidze","email":"dcu995@gmail.com","username":"chubinidzedr"},"change_message_id":"1aecc9032e14dfb05a858ec609e4021a00cdc8ef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"c6cdac7e_fa3413c9","in_reply_to":"3714154e_cdd95af4","updated":"2026-05-25 21:39:37.000000000","message":"Done","commit_id":"12121195b2e86002ea3b6205a04abdd56460875a"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"1173ce212a6684924fde996ba86d27053de942e5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":32,"id":"32a28caf_6ab80e49","updated":"2026-07-07 19:29:33.000000000","message":"@dcu995@gmail.com may be rename this function in more friendly?","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"5cb948967d925eb287517dc79bb11ab5fb895af2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"f9fb8a90_3267c4ac","updated":"2026-08-18 11:22:15.000000000","message":"@hiwkby@yahoo.com Hello, please look it, I think code ready for merge.","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"cbcbfe52ade5bf101091092cdec2e3bead378382","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"67754a3b_97860799","updated":"2026-08-27 06:00:29.000000000","message":"One more thing: this change uses `InstancesManager.upgrade()`, which was introduced in python-troveclient `2.4.0`, while `requirements.txt` still allows `\u003e\u003d1.2.0`.\n\nP.S. I’m not a core reviewer, so I would only be able to leave a +1 🙁","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"8f7818fc9d1d2fe10d407574434eaa18f21b3eab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"4f7a22da_f0ec65d9","in_reply_to":"32a28caf_6ab80e49","updated":"2026-07-10 03:47:17.000000000","message":"Done","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"7e9ac650b7ed5abdbf5ff8a9e9d78b5d4728b394","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"b6567af3_dcfbb8b1","in_reply_to":"67754a3b_97860799","updated":"2026-08-27 08:29:21.000000000","message":"Hello, thank you, done.","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"64baf614c65901fd3e8956784d05481276d1c7eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"a7a41a18_a7bf76f4","updated":"2026-08-30 20:27:51.000000000","message":"@wchy1001@gmail.com Hello Wu, please look it, I think, time to merge it in this release, from first patchset 10 years ;))","commit_id":"d8b2ee400c1a0bf99a2eb95f9729cf085716b4be"},{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"4386ffd70ec35d6aa60c81f1d8a1ed5723ea76f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"314608b6_c32a4263","updated":"2026-08-31 03:34:40.000000000","message":"Thanks, LGTM","commit_id":"69f636907c8b3d24d89862e4ace28a08d79d5d87"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"erkin.mussurmankulov@ps.kz","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"12dde996ab0c20ec2a7188de5b61eff0711c28a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"8f4d2595_a41d0936","updated":"2026-09-01 12:03:40.000000000","message":"@lazekteam@gmail.com @dcu995@gmail.com @olessya.khussainova@ps.kz\nHello guys! Please take a look at the slightly modified version.\n\nWe may show all datastore versions here because Trove supports upgrading to the same version now.\n\nAlso, some small fixes were added, and most importantly, the essential upgrade warnings for the users on the upgrade form.\nNot sure that I did it correctly, though.\n\nThe rest LGTM.","commit_id":"806f4b5514a4bd0f07a0d87cb1ef3b6257fb3986"},{"author":{"_account_id":37632,"name":"Dmitriy Chubinidze","email":"dcu995@gmail.com","username":"chubinidzedr"},"change_message_id":"4c42de0a60230f4347aaeb048cf3831a7c9eab09","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"b8e5e49e_f204d09d","updated":"2026-09-01 12:46:29.000000000","message":"LGTM, thanks!","commit_id":"806f4b5514a4bd0f07a0d87cb1ef3b6257fb3986"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"321d36fce032773a6dd8faa227199e9ee888736a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"954e385d_29e256bc","updated":"2026-09-01 12:13:02.000000000","message":"LGTM, time to merge it, first version ;))","commit_id":"806f4b5514a4bd0f07a0d87cb1ef3b6257fb3986"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"erkin.mussurmankulov@ps.kz","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"9e25cb34683e2a32f0a6248fcc47f02a1c14f55b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"ef4b334c_c929d037","updated":"2026-09-01 13:20:28.000000000","message":"Let\u0027s merge it then, finally after 10 long years 😄","commit_id":"806f4b5514a4bd0f07a0d87cb1ef3b6257fb3986"}],"trove_dashboard/content/databases/upgrade/forms.py":[{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"cbcbfe52ade5bf101091092cdec2e3bead378382","unresolved":true,"context_lines":[{"line_number":58,"context_line":"        except Exception as e:"},{"line_number":59,"context_line":"            redirect \u003d reverse(\"horizon:project:databases:index\")"},{"line_number":60,"context_line":"            exceptions.handle(request, _(\u0027Unable to upgrade instance. %s\u0027) %"},{"line_number":61,"context_line":"                              e.message, redirect\u003dredirect)"},{"line_number":62,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":32,"id":"1b04d7e6_e7657910","line":61,"updated":"2026-08-27 06:00:29.000000000","message":"`exception.message` is not available in Python 3, so if the upgrade request fails, this error handler would raise `AttributeError` and return `HTTP 500`.\n\nIt would be safer to use `str(e)` here and add a small test for the failure case.","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"7e9ac650b7ed5abdbf5ff8a9e9d78b5d4728b394","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        except Exception as e:"},{"line_number":59,"context_line":"            redirect \u003d reverse(\"horizon:project:databases:index\")"},{"line_number":60,"context_line":"            exceptions.handle(request, _(\u0027Unable to upgrade instance. %s\u0027) %"},{"line_number":61,"context_line":"                              e.message, redirect\u003dredirect)"},{"line_number":62,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":32,"id":"64a8eb91_fc5dad85","line":61,"in_reply_to":"1b04d7e6_e7657910","updated":"2026-08-27 08:29:21.000000000","message":"Done","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"}],"trove_dashboard/content/databases/upgrade/tables.py":[{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"cbcbfe52ade5bf101091092cdec2e3bead378382","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    verbose_name \u003d _(\"Upgrade Instance\")"},{"line_number":27,"context_line":"    url \u003d \"horizon:project:databases:upgrade:upgrade_instance\""},{"line_number":28,"context_line":"    classes \u003d (\"ajax-modal\",)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def allowed(self, request, instance):"},{"line_number":31,"context_line":"        if instance.status in databases.tables.ACTIVE_STATES:"},{"line_number":32,"context_line":"            datastore_version_list \u003d api.trove.datastore_version_list("}],"source_content_type":"text/x-python","patch_set":32,"id":"919f8537_8bdaaf07","line":29,"updated":"2026-08-27 06:00:29.000000000","message":"IMO, `policy_rules \u003d ((\"database\", \"instance:update\"))` is missing. Without it, this action may be shown to users who are not allowed to perform the update and would only fail on the backend.","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"7e9ac650b7ed5abdbf5ff8a9e9d78b5d4728b394","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    verbose_name \u003d _(\"Upgrade Instance\")"},{"line_number":27,"context_line":"    url \u003d \"horizon:project:databases:upgrade:upgrade_instance\""},{"line_number":28,"context_line":"    classes \u003d (\"ajax-modal\",)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def allowed(self, request, instance):"},{"line_number":31,"context_line":"        if instance.status in databases.tables.ACTIVE_STATES:"},{"line_number":32,"context_line":"            datastore_version_list \u003d api.trove.datastore_version_list("}],"source_content_type":"text/x-python","patch_set":32,"id":"b32a0ca2_3ec776b0","line":29,"in_reply_to":"919f8537_8bdaaf07","updated":"2026-08-27 08:29:21.000000000","message":"Done.","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"cbcbfe52ade5bf101091092cdec2e3bead378382","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def allowed(self, request, instance):"},{"line_number":31,"context_line":"        if instance.status in databases.tables.ACTIVE_STATES:"},{"line_number":32,"context_line":"            datastore_version_list \u003d api.trove.datastore_version_list("},{"line_number":33,"context_line":"                request, instance.datastore[\u0027type\u0027])"},{"line_number":34,"context_line":"            if datastore_version_list:"},{"line_number":35,"context_line":"                for dsv in datastore_version_list:"}],"source_content_type":"text/x-python","patch_set":32,"id":"3f31504e_e387c33b","line":32,"updated":"2026-08-27 06:00:29.000000000","message":"`allowed()` is evaluated for every table row, so this introduces one synchronous Trove API call per active instance. With many instances, this could noticeably slow down the page.\n\nMaybe datastore versions could be cached once per datastore for the duration of the request or this check could be moved to the modal.","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"7e9ac650b7ed5abdbf5ff8a9e9d78b5d4728b394","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def allowed(self, request, instance):"},{"line_number":31,"context_line":"        if instance.status in databases.tables.ACTIVE_STATES:"},{"line_number":32,"context_line":"            datastore_version_list \u003d api.trove.datastore_version_list("},{"line_number":33,"context_line":"                request, instance.datastore[\u0027type\u0027])"},{"line_number":34,"context_line":"            if datastore_version_list:"},{"line_number":35,"context_line":"                for dsv in datastore_version_list:"}],"source_content_type":"text/x-python","patch_set":32,"id":"8e88e3e9_a9276dce","line":32,"in_reply_to":"3f31504e_e387c33b","updated":"2026-08-27 08:29:21.000000000","message":"Well, done.","commit_id":"9af2494abae47ae6ece94043cc721a0d56c7b038"},{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"420b2a9fe53f826ea222df8d78b971499da1ab5f","unresolved":true,"context_lines":[{"line_number":47,"context_line":"                dsv.name for dsv in versions"},{"line_number":48,"context_line":"            }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        return ("},{"line_number":51,"context_line":"            instance.datastore[\u0027version\u0027]"},{"line_number":52,"context_line":"            not in datastore_versions[datastore_type]"},{"line_number":53,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":38,"id":"a46a8f5c_c87ca496","line":50,"updated":"2026-08-28 06:18:11.000000000","message":"Hello Ivan!\n\nLooks like this condition is inverted. `datastore_versions[datastore_type]` contains all datastore versions (including the current one), so this would normally return `False` and hide the upgrade action even when another version is available.\n\nPerhaps it should check whether there is at least one version different from the current one, for example:\n\n```\nreturn any(\n    version !\u003d instance.datastore[\u0027version\u0027]\n    for version in datastore_versions[datastore_type]\n)\n```","commit_id":"ea0c19f6383630db91951c49e7d6e4a57d6db97d"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"ca61727ca0c45f807afb5ed35a15ccf6c9397bbf","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                dsv.name for dsv in versions"},{"line_number":48,"context_line":"            }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        return ("},{"line_number":51,"context_line":"            instance.datastore[\u0027version\u0027]"},{"line_number":52,"context_line":"            not in datastore_versions[datastore_type]"},{"line_number":53,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":38,"id":"814d7776_f14f4350","line":50,"in_reply_to":"a46a8f5c_c87ca496","updated":"2026-08-30 20:26:02.000000000","message":"Hello Olessya\n\nHmm, yes, you\u0027re right, I little update this code.","commit_id":"ea0c19f6383630db91951c49e7d6e4a57d6db97d"}],"trove_dashboard/content/databases/upgrade/urls.py":[{"author":{"_account_id":24739,"name":"Yao Wang","email":"wangyao@cmss.chinamobile.com","username":"wangyao"},"change_message_id":"43478eb2de5521b9b6c4588c49c0ee5eeef44ed3","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from django.conf.urls import patterns"},{"line_number":16,"context_line":"from django.conf.urls import url"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from trove_dashboard.content.databases.upgrade import views"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_7cf6a7d9","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":37},"updated":"2018-02-13 03:08:03.000000000","message":"please check this.","commit_id":"af13e5ff3b4c30f29b78b81be9fc6521440e1eb4"}]}
