)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"decd84bb6278504568714f17200ff18c8848fc6e","unresolved":true,"context_lines":[{"line_number":12,"context_line":"1. backup-restore"},{"line_number":13,"context_line":"2. backup-delete"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements https://etherpad.opendev.org/p/horizon-feature-gap#91"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I2fea140a972eb4bd4f18ad1c83cfa4df58c23f6c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3ef32a5e_e7bbe5fc","line":15,"updated":"2021-01-31 23:55:27.000000000","message":"This kind of link is too fragile. Please avoid this and file a feature bug or a blueprint.","commit_id":"f67e83fc60607ae9ad12d5814a3d3ba41d97c3f1"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"58d6a268fe49f3283318e78c4ac218fa91feba2e","unresolved":true,"context_lines":[{"line_number":12,"context_line":"1. backup-restore"},{"line_number":13,"context_line":"2. backup-delete"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements https://etherpad.opendev.org/p/horizon-feature-gap#91"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I2fea140a972eb4bd4f18ad1c83cfa4df58c23f6c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3b564d40_82be12e4","line":15,"in_reply_to":"3ef32a5e_e7bbe5fc","updated":"2021-02-01 06:47:56.000000000","message":"Done.\nthanks","commit_id":"f67e83fc60607ae9ad12d5814a3d3ba41d97c3f1"}],"openstack_dashboard/api/cinder.py":[{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"0e63826ddc9a2f2ed45123639ecb33480539169a","unresolved":true,"context_lines":[{"line_number":598,"context_line":"@profiler.trace"},{"line_number":599,"context_line":"def volume_backup_list_paged_with_page_menu(request, page_number\u003d1,"},{"line_number":600,"context_line":"                                            sort_dir\u003d\"desc\","},{"line_number":601,"context_line":"                                            all_tenants\u003d0):"},{"line_number":602,"context_line":"    backups \u003d []"},{"line_number":603,"context_line":"    count \u003d 0"},{"line_number":604,"context_line":"    pages_count \u003d 0"}],"source_content_type":"text/x-python","patch_set":6,"id":"87ef74f9_78f8fe97","line":601,"updated":"2021-03-02 14:08:08.000000000","message":"shouldn\u0027t this be all_tenants\u003dFalse?","commit_id":"ff166257f3f5f280525bd8241969f7c0cd4fc1f5"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"9c556626dda497b9b3924f7add2eaa30104468b3","unresolved":false,"context_lines":[{"line_number":598,"context_line":"@profiler.trace"},{"line_number":599,"context_line":"def volume_backup_list_paged_with_page_menu(request, page_number\u003d1,"},{"line_number":600,"context_line":"                                            sort_dir\u003d\"desc\","},{"line_number":601,"context_line":"                                            all_tenants\u003d0):"},{"line_number":602,"context_line":"    backups \u003d []"},{"line_number":603,"context_line":"    count \u003d 0"},{"line_number":604,"context_line":"    pages_count \u003d 0"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a33da1b_59f449e1","line":601,"in_reply_to":"87ef74f9_78f8fe97","updated":"2021-03-02 16:31:55.000000000","message":"Done.\nthanks.","commit_id":"ff166257f3f5f280525bd8241969f7c0cd4fc1f5"}],"openstack_dashboard/dashboards/admin/backups/forms.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"decd84bb6278504568714f17200ff18c8848fc6e","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from openstack_dashboard import api"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class AdminRestoreBackupForm(forms.SelfHandlingForm):"},{"line_number":26,"context_line":"    volume_id \u003d forms.ThemableChoiceField(label\u003d_(\u0027Select Volume\u0027),"},{"line_number":27,"context_line":"                                          required\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"17f31350_4e4092db","line":24,"updated":"2021-01-31 23:55:27.000000000","message":"This looks like a copy of project.backups.form.py. Why do you need to implement it from scratch? Copying is the last resort and what we should avoid.\n\nI stopped reviewing this commit here so my comment may apply to other files.","commit_id":"f67e83fc60607ae9ad12d5814a3d3ba41d97c3f1"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"58d6a268fe49f3283318e78c4ac218fa91feba2e","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from openstack_dashboard import api"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class AdminRestoreBackupForm(forms.SelfHandlingForm):"},{"line_number":26,"context_line":"    volume_id \u003d forms.ThemableChoiceField(label\u003d_(\u0027Select Volume\u0027),"},{"line_number":27,"context_line":"                                          required\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"d7b3523e_c7ee02c2","line":24,"in_reply_to":"17f31350_4e4092db","updated":"2021-02-01 06:47:56.000000000","message":"Done.\nthanks.","commit_id":"f67e83fc60607ae9ad12d5814a3d3ba41d97c3f1"}],"openstack_dashboard/dashboards/admin/backups/tables.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"53cf435d25daf993209c4f5b57cd35c9c4628b75","unresolved":true,"context_lines":[{"line_number":25,"context_line":"class AdminSnapshotColumn(project_tables.SnapshotColumn):"},{"line_number":26,"context_line":"    def get_link_url(self, backup):"},{"line_number":27,"context_line":"        if backup.snapshot:"},{"line_number":28,"context_line":"            return reverse(\u0027horizon:admin:snapshots:detail\u0027,"},{"line_number":29,"context_line":"                           args\u003d(backup.snapshot_id,))"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f1b264f_dc1bef35","line":28,"updated":"2021-02-18 03:49:15.000000000","message":"This is almost same as the project table implementation. The only difference is the url. I don\u0027t think the current approach is not so good from the point of view of the software engineering. Could you consider using a class attribute? Implementing a mirro of the project panel provides just half values.","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"1597726b366f89c11d7f336fdc3264c9a68985df","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class AdminSnapshotColumn(project_tables.SnapshotColumn):"},{"line_number":26,"context_line":"    def get_link_url(self, backup):"},{"line_number":27,"context_line":"        if backup.snapshot:"},{"line_number":28,"context_line":"            return reverse(\u0027horizon:admin:snapshots:detail\u0027,"},{"line_number":29,"context_line":"                           args\u003d(backup.snapshot_id,))"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"06da53f1_aee0e666","line":28,"in_reply_to":"29c91bc5_af53a414","updated":"2021-02-19 19:16:22.000000000","message":"Done","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"275d86bed497793f67de5d34281209f0bc0d44bc","unresolved":true,"context_lines":[{"line_number":25,"context_line":"class AdminSnapshotColumn(project_tables.SnapshotColumn):"},{"line_number":26,"context_line":"    def get_link_url(self, backup):"},{"line_number":27,"context_line":"        if backup.snapshot:"},{"line_number":28,"context_line":"            return reverse(\u0027horizon:admin:snapshots:detail\u0027,"},{"line_number":29,"context_line":"                           args\u003d(backup.snapshot_id,))"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"29c91bc5_af53a414","line":28,"in_reply_to":"7f1b264f_dc1bef35","updated":"2021-02-18 09:52:27.000000000","message":"Will update it in next P.S.\nthanks","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"53cf435d25daf993209c4f5b57cd35c9c4628b75","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class AdminRestoreBackup(project_tables.RestoreBackup):"},{"line_number":53,"context_line":"    def get_link_url(self, datum):"},{"line_number":54,"context_line":"        backup_id \u003d datum.id"},{"line_number":55,"context_line":"        backup_name \u003d datum.name"},{"line_number":56,"context_line":"        volume_id \u003d getattr(datum, \u0027volume_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"2e1cc93e_078a0c16","line":53,"updated":"2021-02-18 03:49:15.000000000","message":"This is almost same as the project table implementation. The only difference is the url. I don\u0027t think the current approach is not so good from the point of view of the software engineering. Could you consider using a class attribute?","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"275d86bed497793f67de5d34281209f0bc0d44bc","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class AdminRestoreBackup(project_tables.RestoreBackup):"},{"line_number":53,"context_line":"    def get_link_url(self, datum):"},{"line_number":54,"context_line":"        backup_id \u003d datum.id"},{"line_number":55,"context_line":"        backup_name \u003d datum.name"},{"line_number":56,"context_line":"        volume_id \u003d getattr(datum, \u0027volume_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ce4e0585_042a419e","line":53,"in_reply_to":"2e1cc93e_078a0c16","updated":"2021-02-18 09:52:27.000000000","message":"will update it in next P.S.","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"1597726b366f89c11d7f336fdc3264c9a68985df","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class AdminRestoreBackup(project_tables.RestoreBackup):"},{"line_number":53,"context_line":"    def get_link_url(self, datum):"},{"line_number":54,"context_line":"        backup_id \u003d datum.id"},{"line_number":55,"context_line":"        backup_name \u003d datum.name"},{"line_number":56,"context_line":"        volume_id \u003d getattr(datum, \u0027volume_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"c6eaf39b_5fc09d10","line":53,"in_reply_to":"ce4e0585_042a419e","updated":"2021-02-19 19:16:22.000000000","message":"Done","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4b5da85decd910d9b15680a10b076fa9b77d091a","unresolved":true,"context_lines":[{"line_number":80,"context_line":"        status_columns \u003d (\"status\",)"},{"line_number":81,"context_line":"        row_class \u003d UpdateRow"},{"line_number":82,"context_line":"        table_actions \u003d (AdminDeleteBackup,)"},{"line_number":83,"context_line":"        row_actions \u003d (AdminRestoreBackup, AdminDeleteBackup)"},{"line_number":84,"context_line":"        columns \u003d (\u0027project\u0027, \u0027name\u0027, \u0027description\u0027, \u0027size\u0027, \u0027status\u0027,"},{"line_number":85,"context_line":"                   \u0027volume_name\u0027, \u0027snapshot\u0027,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"65f9dfd6_3e48ccb5","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":19},"updated":"2021-02-17 13:17:40.000000000","message":"Let\u0027s implement admin-specific actions https://docs.openstack.org/api-ref/block-storage/v3/index.html#backup-actions-backups-action too","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"1597726b366f89c11d7f336fdc3264c9a68985df","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        status_columns \u003d (\"status\",)"},{"line_number":81,"context_line":"        row_class \u003d UpdateRow"},{"line_number":82,"context_line":"        table_actions \u003d (AdminDeleteBackup,)"},{"line_number":83,"context_line":"        row_actions \u003d (AdminRestoreBackup, AdminDeleteBackup)"},{"line_number":84,"context_line":"        columns \u003d (\u0027project\u0027, \u0027name\u0027, \u0027description\u0027, \u0027size\u0027, \u0027status\u0027,"},{"line_number":85,"context_line":"                   \u0027volume_name\u0027, \u0027snapshot\u0027,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1d130a38_5c87b1e9","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":19},"in_reply_to":"23eedef4_36cb2bb4","updated":"2021-02-19 19:16:22.000000000","message":"Done","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"275d86bed497793f67de5d34281209f0bc0d44bc","unresolved":true,"context_lines":[{"line_number":80,"context_line":"        status_columns \u003d (\"status\",)"},{"line_number":81,"context_line":"        row_class \u003d UpdateRow"},{"line_number":82,"context_line":"        table_actions \u003d (AdminDeleteBackup,)"},{"line_number":83,"context_line":"        row_actions \u003d (AdminRestoreBackup, AdminDeleteBackup)"},{"line_number":84,"context_line":"        columns \u003d (\u0027project\u0027, \u0027name\u0027, \u0027description\u0027, \u0027size\u0027, \u0027status\u0027,"},{"line_number":85,"context_line":"                   \u0027volume_name\u0027, \u0027snapshot\u0027,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"23eedef4_36cb2bb4","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":19},"in_reply_to":"3d3de4df_3802d7f7","updated":"2021-02-18 09:52:27.000000000","message":"+1. one doubt on \u0027Force-delete backup\u0027 action.\nShould I add \n1) Force-delete action only.\n2) Force-delete and normal delete action both\nSorry for asking such silly questions:(","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"53cf435d25daf993209c4f5b57cd35c9c4628b75","unresolved":true,"context_lines":[{"line_number":80,"context_line":"        status_columns \u003d (\"status\",)"},{"line_number":81,"context_line":"        row_class \u003d UpdateRow"},{"line_number":82,"context_line":"        table_actions \u003d (AdminDeleteBackup,)"},{"line_number":83,"context_line":"        row_actions \u003d (AdminRestoreBackup, AdminDeleteBackup)"},{"line_number":84,"context_line":"        columns \u003d (\u0027project\u0027, \u0027name\u0027, \u0027description\u0027, \u0027size\u0027, \u0027status\u0027,"},{"line_number":85,"context_line":"                   \u0027volume_name\u0027, \u0027snapshot\u0027,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3d3de4df_3802d7f7","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":19},"in_reply_to":"4f88b0c4_7dc70946","updated":"2021-02-18 03:49:15.000000000","message":"I second Ivan. The admin specific actions listed in the API refernece is one of the main goal to implement the admin panel.","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"9feae5aa4b8b2349cc3f54971fdd90700d7e66af","unresolved":true,"context_lines":[{"line_number":80,"context_line":"        status_columns \u003d (\"status\",)"},{"line_number":81,"context_line":"        row_class \u003d UpdateRow"},{"line_number":82,"context_line":"        table_actions \u003d (AdminDeleteBackup,)"},{"line_number":83,"context_line":"        row_actions \u003d (AdminRestoreBackup, AdminDeleteBackup)"},{"line_number":84,"context_line":"        columns \u003d (\u0027project\u0027, \u0027name\u0027, \u0027description\u0027, \u0027size\u0027, \u0027status\u0027,"},{"line_number":85,"context_line":"                   \u0027volume_name\u0027, \u0027snapshot\u0027,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"4f88b0c4_7dc70946","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":19},"in_reply_to":"65f9dfd6_3e48ccb5","updated":"2021-02-17 19:26:57.000000000","message":"Do you mean only Reset a backup’s status or more actions?","commit_id":"52454d1e1b0291ce8187ef8d834d5f1e006d6378"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"6f57860302ad517921f98698c1cde008fed77785","unresolved":true,"context_lines":[{"line_number":22,"context_line":"from openstack_dashboard import policy"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Force_DELETABLE_STATES \u003d (\"error_deleting\", \"restoring\", \"creating\")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class AdminSnapshotColumn(project_tables.SnapshotColumn):"}],"source_content_type":"text/x-python","patch_set":8,"id":"c3d99d09_2ee30414","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":22},"updated":"2021-03-04 20:43:19.000000000","message":"FORCE_DELETE_TABLE_STATES","commit_id":"261a5246b886f80689a2b9e44a2159fc702c2673"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"c5c359c6b0edd1bf948daa3b649d3e0bc7eefd46","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from openstack_dashboard import policy"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Force_DELETABLE_STATES \u003d (\"error_deleting\", \"restoring\", \"creating\")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class AdminSnapshotColumn(project_tables.SnapshotColumn):"}],"source_content_type":"text/x-python","patch_set":8,"id":"d06f68f9_f9dd05f1","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":22},"in_reply_to":"c3d99d09_2ee30414","updated":"2021-03-05 00:16:14.000000000","message":"done.","commit_id":"261a5246b886f80689a2b9e44a2159fc702c2673"}],"openstack_dashboard/dashboards/admin/backups/tests.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"439085161d85bde97cefce0133cd155e90959fe1","unresolved":true,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # get first page"},{"line_number":77,"context_line":"        expected_backups \u003d backups[:size]"},{"line_number":78,"context_line":"        res \u003d self._test_backups_index_paginated("},{"line_number":79,"context_line":"            page_number\u003dpage_number, backups\u003dexpected_backups, url\u003dbase_url,"},{"line_number":80,"context_line":"            has_more\u003dTrue, has_prev\u003dFalse, page_size\u003dsize,"},{"line_number":81,"context_line":"            number_of_pages\u003dnumber_of_pages, total_of_entries\u003dnumber_of_pages)"}],"source_content_type":"text/x-python","patch_set":4,"id":"103bcf58_beed39b3","line":78,"updated":"2021-02-22 14:06:44.000000000","message":"You called _test_backups_index_paginated multiple time in a single test, but @create_mocks decorator creates a mock for mocked functions/methods every time the decorator is called. I did not check the detail what happens if mock.patch(.object) is called multiple times for a same function/method. Are you perfectly sure that it works expectedly?\n(At least my suggestion is to ensure to call mock.patch(.object) only once per function/method.)","commit_id":"ee9b662e90c8aa80e7f145ca3c8a79b03e742d1b"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"4c08eb54aa503ad366115ac6564bb07cf93496d1","unresolved":true,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # get first page"},{"line_number":77,"context_line":"        expected_backups \u003d backups[:size]"},{"line_number":78,"context_line":"        res \u003d self._test_backups_index_paginated("},{"line_number":79,"context_line":"            page_number\u003dpage_number, backups\u003dexpected_backups, url\u003dbase_url,"},{"line_number":80,"context_line":"            has_more\u003dTrue, has_prev\u003dFalse, page_size\u003dsize,"},{"line_number":81,"context_line":"            number_of_pages\u003dnumber_of_pages, total_of_entries\u003dnumber_of_pages)"}],"source_content_type":"text/x-python","patch_set":4,"id":"b9844485_c803d979","line":78,"in_reply_to":"103bcf58_beed39b3","updated":"2021-02-22 18:15:20.000000000","message":"hmm it looks fine to me. I have called _test_backups_index_paginated multiple time in this function but everytime it run with different value of each parameter to test pagination because in actual code this function going to call multiple times acc. to number of backups-lists.\n\nAlso it is not the first in horizon code that a function called multiple times in a test. I have seen the same thing done at other places as well [1], [2], [3].\n\n[1] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/admin/volumes/tests.py#L138\n[2] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/admin/instances/tests.py#L547\n[3] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/admin/snapshots/tests.py#L89","commit_id":"ee9b662e90c8aa80e7f145ca3c8a79b03e742d1b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3b41b702280bdb4ba174cc844fcb18dd84858f98","unresolved":true,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # get first page"},{"line_number":77,"context_line":"        expected_backups \u003d backups[:size]"},{"line_number":78,"context_line":"        res \u003d self._test_backups_index_paginated("},{"line_number":79,"context_line":"            page_number\u003dpage_number, backups\u003dexpected_backups, url\u003dbase_url,"},{"line_number":80,"context_line":"            has_more\u003dTrue, has_prev\u003dFalse, page_size\u003dsize,"},{"line_number":81,"context_line":"            number_of_pages\u003dnumber_of_pages, total_of_entries\u003dnumber_of_pages)"}],"source_content_type":"text/x-python","patch_set":4,"id":"f28cd422_dee39c82","line":78,"in_reply_to":"b9844485_c803d979","updated":"2021-02-26 05:33:16.000000000","message":"\u003e hmm it looks fine to me. I have called _test_backups_index_paginated multiple time in this function but everytime it run with different value of each parameter to test pagination because in actual code this function going to call multiple times acc. to number of backups-lists.\n\nIt looks like my point it not understood correctly. My point is that it is not a best practice to mock a same function multiple times at the same time. create_mocks() decorator starts mocking but it does not stop mocking. Thus, for example, there are three ACTIVE mock for api.keystone.tenant_list. Three parallel mocking happens and which mocking is used totally depends on the mock internal. What you are doing is like http://paste.openstack.org/show/803015/. I believe we should have only ONE active mocking for one method/function.\n\n\u003e \n\u003e Also it is not the first in horizon code that a function called multiple times in a test. I have seen the same thing done at other places as well [1], [2], [3].\n\nIt looks like you say we have similar so it is okay. The fact that we already have similar patterns does not necessarily mean that it is a good practice. When we notice what is not a good pattern we should improve/fix it.\n\n\u003e \n\u003e [1] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/admin/volumes/tests.py#L138\n\u003e [2] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/admin/instances/tests.py#L547\n\u003e [3] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/admin/snapshots/tests.py#L89","commit_id":"ee9b662e90c8aa80e7f145ca3c8a79b03e742d1b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e454e7b89de3fcb078c57945fe4b884e9838ef33","unresolved":true,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # get first page"},{"line_number":77,"context_line":"        expected_backups \u003d backups[:size]"},{"line_number":78,"context_line":"        res \u003d self._test_backups_index_paginated("},{"line_number":79,"context_line":"            page_number\u003dpage_number, backups\u003dexpected_backups, url\u003dbase_url,"},{"line_number":80,"context_line":"            has_more\u003dTrue, has_prev\u003dFalse, page_size\u003dsize,"},{"line_number":81,"context_line":"            number_of_pages\u003dnumber_of_pages, total_of_entries\u003dnumber_of_pages)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ac202d52_f4fe0c42","line":78,"in_reply_to":"f28cd422_dee39c82","updated":"2021-02-26 05:34:13.000000000","message":"Perhaps we can improve create_mocks decorator to ensure stopping mocks.","commit_id":"ee9b662e90c8aa80e7f145ca3c8a79b03e742d1b"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"0e63826ddc9a2f2ed45123639ecb33480539169a","unresolved":true,"context_lines":[{"line_number":55,"context_line":"        self.mock_volume_backup_list_paged_with_page_menu.\\"},{"line_number":56,"context_line":"            assert_called_once_with(test.IsHttpRequest(),"},{"line_number":57,"context_line":"                                    page_number\u003dpage_number,"},{"line_number":58,"context_line":"                                    all_tenants\u003d1)"},{"line_number":59,"context_line":"        self.mock_volume_list.assert_called_once_with("},{"line_number":60,"context_line":"            test.IsHttpRequest(), search_opts\u003d{\u0027all_tenants\u0027: 1})"},{"line_number":61,"context_line":"        self.mock_volume_snapshot_list.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":6,"id":"293786d7_ac0fcb19","line":58,"updated":"2021-03-02 14:08:08.000000000","message":"all_tenants\u003dTrue","commit_id":"ff166257f3f5f280525bd8241969f7c0cd4fc1f5"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"9c556626dda497b9b3924f7add2eaa30104468b3","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.mock_volume_backup_list_paged_with_page_menu.\\"},{"line_number":56,"context_line":"            assert_called_once_with(test.IsHttpRequest(),"},{"line_number":57,"context_line":"                                    page_number\u003dpage_number,"},{"line_number":58,"context_line":"                                    all_tenants\u003d1)"},{"line_number":59,"context_line":"        self.mock_volume_list.assert_called_once_with("},{"line_number":60,"context_line":"            test.IsHttpRequest(), search_opts\u003d{\u0027all_tenants\u0027: 1})"},{"line_number":61,"context_line":"        self.mock_volume_snapshot_list.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":6,"id":"a3228aeb_0a0f379a","line":58,"in_reply_to":"293786d7_ac0fcb19","updated":"2021-03-02 16:31:55.000000000","message":"Done.","commit_id":"ff166257f3f5f280525bd8241969f7c0cd4fc1f5"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"0e63826ddc9a2f2ed45123639ecb33480539169a","unresolved":true,"context_lines":[{"line_number":165,"context_line":"        self.mock_volume_backup_list_paged_with_page_menu.\\"},{"line_number":166,"context_line":"            assert_called_once_with(test.IsHttpRequest(),"},{"line_number":167,"context_line":"                                    page_number\u003dpage_number,"},{"line_number":168,"context_line":"                                    all_tenants\u003d1)"},{"line_number":169,"context_line":"        self.mock_volume_list.assert_called_once_with("},{"line_number":170,"context_line":"            test.IsHttpRequest(), search_opts\u003d{\u0027all_tenants\u0027: 1})"},{"line_number":171,"context_line":"        self.mock_volume_snapshot_list.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":6,"id":"5926ec74_92713736","line":168,"updated":"2021-03-02 14:08:08.000000000","message":"all_tenants\u003dTrue","commit_id":"ff166257f3f5f280525bd8241969f7c0cd4fc1f5"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"9c556626dda497b9b3924f7add2eaa30104468b3","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        self.mock_volume_backup_list_paged_with_page_menu.\\"},{"line_number":166,"context_line":"            assert_called_once_with(test.IsHttpRequest(),"},{"line_number":167,"context_line":"                                    page_number\u003dpage_number,"},{"line_number":168,"context_line":"                                    all_tenants\u003d1)"},{"line_number":169,"context_line":"        self.mock_volume_list.assert_called_once_with("},{"line_number":170,"context_line":"            test.IsHttpRequest(), search_opts\u003d{\u0027all_tenants\u0027: 1})"},{"line_number":171,"context_line":"        self.mock_volume_snapshot_list.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":6,"id":"3b63f9ec_ebdfe535","line":168,"in_reply_to":"5926ec74_92713736","updated":"2021-03-02 16:31:55.000000000","message":"Done.","commit_id":"ff166257f3f5f280525bd8241969f7c0cd4fc1f5"}],"openstack_dashboard/dashboards/admin/backups/views.py":[{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"0e63826ddc9a2f2ed45123639ecb33480539169a","unresolved":true,"context_lines":[{"line_number":53,"context_line":"             self._number_of_pages) \u003d \\"},{"line_number":54,"context_line":"                api.cinder.volume_backup_list_paged_with_page_menu("},{"line_number":55,"context_line":"                    self.request, page_number\u003dself._current_page,"},{"line_number":56,"context_line":"                    all_tenants\u003d1)"},{"line_number":57,"context_line":"        except Exception as e:"},{"line_number":58,"context_line":"            LOG.exception(e)"},{"line_number":59,"context_line":"            backups \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fba2d47_2311e92e","line":56,"updated":"2021-03-02 14:08:08.000000000","message":"all_tenants\u003dTrue","commit_id":"ff166257f3f5f280525bd8241969f7c0cd4fc1f5"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"9c556626dda497b9b3924f7add2eaa30104468b3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"             self._number_of_pages) \u003d \\"},{"line_number":54,"context_line":"                api.cinder.volume_backup_list_paged_with_page_menu("},{"line_number":55,"context_line":"                    self.request, page_number\u003dself._current_page,"},{"line_number":56,"context_line":"                    all_tenants\u003d1)"},{"line_number":57,"context_line":"        except Exception as e:"},{"line_number":58,"context_line":"            LOG.exception(e)"},{"line_number":59,"context_line":"            backups \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"79c8993a_98c565bb","line":56,"in_reply_to":"3fba2d47_2311e92e","updated":"2021-03-02 16:31:55.000000000","message":"Done.","commit_id":"ff166257f3f5f280525bd8241969f7c0cd4fc1f5"}],"openstack_dashboard/dashboards/project/backups/tables.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"cc33a44b7fa64b301d900d067bfb023c46602329","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        )"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def delete(self, request, obj_id):"},{"line_number":88,"context_line":"        api.cinder.volume_backup_delete(request, obj_id, force\u003dFalse)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def allowed(self, request, backup\u003dNone):"},{"line_number":91,"context_line":"        if backup:"}],"source_content_type":"text/x-python","patch_set":4,"id":"17be3654_9cc4f969","line":88,"range":{"start_line":88,"start_character":57,"end_line":88,"end_character":69},"updated":"2021-02-22 14:09:39.000000000","message":"Why is this change required?\nI wonder why the project panel impl is changed for the admin panel impl.","commit_id":"ee9b662e90c8aa80e7f145ca3c8a79b03e742d1b"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"4c08eb54aa503ad366115ac6564bb07cf93496d1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        )"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def delete(self, request, obj_id):"},{"line_number":88,"context_line":"        api.cinder.volume_backup_delete(request, obj_id, force\u003dFalse)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def allowed(self, request, backup\u003dNone):"},{"line_number":91,"context_line":"        if backup:"}],"source_content_type":"text/x-python","patch_set":4,"id":"4e8fd465_1a28a8d2","line":88,"range":{"start_line":88,"start_character":57,"end_line":88,"end_character":69},"in_reply_to":"17be3654_9cc4f969","updated":"2021-02-22 18:15:20.000000000","message":"yeah original code also works here.\nDone.","commit_id":"ee9b662e90c8aa80e7f145ca3c8a79b03e742d1b"}]}
