)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"da331256c5a697a7fc3db63146e2069f6d3186da","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2ddbe679_b0d16764","updated":"2026-07-03 10:31:05.000000000","message":"I have one more question, just to be sure.\n\nI though that those tests are implemented mainly because of de-angularization process. To be sure that metadata still works properly in new Django implementation after we switch from angular version.\nBut when I am looking closely at it, are you sure that those tests will be compatible with de-angularized (Django) implementation? I mean specifically the xpaths.\nBecause I can find ```CSS_SELECTOR, \u0027input[name\u003d\"customItem\"]\u0027``` or ```input[ng-model\u003d\"ctrl.filterText.existing\"]``` in angular version of UI  but I can not find those elements in Django implementation (when I set ```ANGULAR_FEATURES \u003d {\u0027images_panel\u0027 :  False}```)\n\nSo if I am not missing something, then this tests are useful only for angular implementation. In the moment when we switch to Django code version (which I guess, should be soon as we are quite far in de-angularization process) all those tests will need to be fixed to more universal or Django UI elements/xpaths.\n\nAm I wrong?","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"5466d656e14ac97aa5fd8e2cbdb5a2f7f31cd374","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"80154e8b_27dc8581","in_reply_to":"2ddbe679_b0d16764","updated":"2026-07-03 12:11:29.000000000","message":"As AI would say, you are perfectly right. I was hoping I would be able to write the tests in a way that would work the same both for the angular and python versions, but when I tried to do this, I quickly realized that I would have to rely on complicated and fragile selectors based on the html structure, because the angular version lacks ids and classes that would let me easily refer to the elements I need. As such, we will need to amend those tests when we make the python version the default. Hopefully, selectors would be the only part that needs changing.\n\nAlternatively, we could make those tests always test the angular version, by forcing the relevant setting at the beginning of the test. Then we would need to write separate tests for the python version, forcing the setting to the opposite in them. This would be desirable if we wanted to keep both versions working for some time.","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"05e11f996d8fd36ffcf9161c004cc569b6e48dfd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5de720cc_aa71be0c","in_reply_to":"80154e8b_27dc8581","updated":"2026-07-07 12:30:13.000000000","message":"Understandable. Then I am fine with the current implementation.\nI am not very sure if we want to have separated tests for python version and separated tests for angular version but it probably depends on if/how we plan to maintain/support angular version after we officially switch to python.\n\nSo let\u0027s merge the tests in the version that they are now and let\u0027s wait with the discussion about the second part to the point when we will switch to python permanently.","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},"change_message_id":"12cdc9640c2e50d211645167e7180ae061dc6108","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f04bfe42_7f253d0e","updated":"2026-07-09 15:08:16.000000000","message":"LGTM, thank you!","commit_id":"cf8d58303ad57d14ece8cf70d3a26e71b255af59"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"05e11f996d8fd36ffcf9161c004cc569b6e48dfd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d40d7195_0e796497","updated":"2026-07-07 12:30:13.000000000","message":"LGTM, thanks!","commit_id":"cf8d58303ad57d14ece8cf70d3a26e71b255af59"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"e00dbb8e1108f29f1844b3ce51db4c21b4688264","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ecc7fe5e_94fd8bc5","updated":"2026-07-06 07:31:20.000000000","message":"recheck","commit_id":"cf8d58303ad57d14ece8cf70d3a26e71b255af59"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"0749f759c7675f77e3ae277dfe652964cfdbaa35","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e49f957b_f89880ad","updated":"2026-07-06 10:26:33.000000000","message":"recheck random failure","commit_id":"cf8d58303ad57d14ece8cf70d3a26e71b255af59"}],"openstack_dashboard/test/selenium/ui/test_images_metadata.py":[{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"f978542a36aee9839a262707220e8b6bbe9dd10d","unresolved":true,"context_lines":[{"line_number":20,"context_line":"from openstack_dashboard.test.selenium import widgets"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@contextmanager"},{"line_number":24,"context_line":"def no_wait(driver, config):"},{"line_number":25,"context_line":"    driver.implicitly_wait(0)"},{"line_number":26,"context_line":"    try:"},{"line_number":27,"context_line":"        yield"},{"line_number":28,"context_line":"    finally:"},{"line_number":29,"context_line":"        driver.implicitly_wait(config.selenium.implicit_wait)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"@pytest.fixture()"}],"source_content_type":"text/x-python","patch_set":4,"id":"cb6b44ca_04c70ad2","line":29,"range":{"start_line":23,"start_character":0,"end_line":29,"end_character":61},"updated":"2026-07-03 09:17:43.000000000","message":"Already used in ```.../selenium/widgets.py``` can we use it from there?","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"370b41a5e4816bb1036463615821b31ae2fecee2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from openstack_dashboard.test.selenium import widgets"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@contextmanager"},{"line_number":24,"context_line":"def no_wait(driver, config):"},{"line_number":25,"context_line":"    driver.implicitly_wait(0)"},{"line_number":26,"context_line":"    try:"},{"line_number":27,"context_line":"        yield"},{"line_number":28,"context_line":"    finally:"},{"line_number":29,"context_line":"        driver.implicitly_wait(config.selenium.implicit_wait)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"@pytest.fixture()"}],"source_content_type":"text/x-python","patch_set":4,"id":"cdfd0a0a_3101946a","line":29,"range":{"start_line":23,"start_character":0,"end_line":29,"end_character":61},"in_reply_to":"0aba3a46_ba051b20","updated":"2026-07-03 12:12:48.000000000","message":"Done","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"5466d656e14ac97aa5fd8e2cbdb5a2f7f31cd374","unresolved":true,"context_lines":[{"line_number":20,"context_line":"from openstack_dashboard.test.selenium import widgets"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@contextmanager"},{"line_number":24,"context_line":"def no_wait(driver, config):"},{"line_number":25,"context_line":"    driver.implicitly_wait(0)"},{"line_number":26,"context_line":"    try:"},{"line_number":27,"context_line":"        yield"},{"line_number":28,"context_line":"    finally:"},{"line_number":29,"context_line":"        driver.implicitly_wait(config.selenium.implicit_wait)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"@pytest.fixture()"}],"source_content_type":"text/x-python","patch_set":4,"id":"0aba3a46_ba051b20","line":29,"range":{"start_line":23,"start_character":0,"end_line":29,"end_character":61},"in_reply_to":"cb6b44ca_04c70ad2","updated":"2026-07-03 12:11:29.000000000","message":"Good point, it wasn\u0027t there yet when I first started writing this.","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"f978542a36aee9839a262707220e8b6bbe9dd10d","unresolved":true,"context_lines":[{"line_number":80,"context_line":"    assert len(labels) \u003d\u003d 0"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def test_image_metdadata_tree_property(driver, config, metadata_modal):"},{"line_number":84,"context_line":"    \"\"\"Navigate the tree of properties and add and remove one of them.\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    uls \u003d metadata_modal.find_elements(By.CSS_SELECTOR,"}],"source_content_type":"text/x-python","patch_set":4,"id":"6d9d2bd7_6ee48a45","line":83,"range":{"start_line":83,"start_character":15,"end_line":83,"end_character":24},"updated":"2026-07-03 09:17:43.000000000","message":"typo ```metdadata```-\u003e ```metadata```","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"5466d656e14ac97aa5fd8e2cbdb5a2f7f31cd374","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    assert len(labels) \u003d\u003d 0"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def test_image_metdadata_tree_property(driver, config, metadata_modal):"},{"line_number":84,"context_line":"    \"\"\"Navigate the tree of properties and add and remove one of them.\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    uls \u003d metadata_modal.find_elements(By.CSS_SELECTOR,"}],"source_content_type":"text/x-python","patch_set":4,"id":"70ef68f9_067ebb65","line":83,"range":{"start_line":83,"start_character":15,"end_line":83,"end_character":24},"in_reply_to":"6d9d2bd7_6ee48a45","updated":"2026-07-03 12:11:29.000000000","message":"Done","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"f978542a36aee9839a262707220e8b6bbe9dd10d","unresolved":true,"context_lines":[{"line_number":104,"context_line":"    assert len(labels) \u003d\u003d 0"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def test_image_metdadata_available_filter(driver, config, metadata_modal):"},{"line_number":108,"context_line":"    \"\"\"Filter the list of available properties.\"\"\""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    filter_input \u003d metadata_modal.find_element(By.CSS_SELECTOR,"}],"source_content_type":"text/x-python","patch_set":4,"id":"994d1f31_c7bba21a","line":107,"range":{"start_line":107,"start_character":15,"end_line":107,"end_character":24},"updated":"2026-07-03 09:17:43.000000000","message":"typo ```metdadata```-\u003e ```metadata```","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"5466d656e14ac97aa5fd8e2cbdb5a2f7f31cd374","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    assert len(labels) \u003d\u003d 0"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def test_image_metdadata_available_filter(driver, config, metadata_modal):"},{"line_number":108,"context_line":"    \"\"\"Filter the list of available properties.\"\"\""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    filter_input \u003d metadata_modal.find_element(By.CSS_SELECTOR,"}],"source_content_type":"text/x-python","patch_set":4,"id":"977d6544_deda10da","line":107,"range":{"start_line":107,"start_character":15,"end_line":107,"end_character":24},"in_reply_to":"994d1f31_c7bba21a","updated":"2026-07-03 12:11:29.000000000","message":"Done","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f69704a2f2dcf81b2ec5142a636a77a77e05ed48","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    \"\"\"Filter the list of available properties.\"\"\""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    filter_input \u003d metadata_modal.find_element(By.CSS_SELECTOR,"},{"line_number":111,"context_line":"        \u0027input[ng-model\u003d\"ctrl.filterText.available\"]\u0027)"},{"line_number":112,"context_line":"    filter_input.click()"},{"line_number":113,"context_line":"    filter_input.send_keys(\"cpu\")"},{"line_number":114,"context_line":"    uls \u003d metadata_modal.find_elements(By.CSS_SELECTOR,"}],"source_content_type":"text/x-python","patch_set":4,"id":"a75a9b74_0a3fb00f","line":111,"updated":"2026-07-02 16:32:29.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"change_message_id":"f978542a36aee9839a262707220e8b6bbe9dd10d","unresolved":true,"context_lines":[{"line_number":121,"context_line":"    assert len(props) \u003d\u003d 1"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def test_image_metdadata_active_filter(driver, config, metadata_modal):"},{"line_number":125,"context_line":"    \"\"\"Filter the list of active properties.\"\"\""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    filter_input \u003d metadata_modal.find_element(By.CSS_SELECTOR,"}],"source_content_type":"text/x-python","patch_set":4,"id":"b52655cb_cd00eb4b","line":124,"range":{"start_line":124,"start_character":15,"end_line":124,"end_character":24},"updated":"2026-07-03 09:17:43.000000000","message":"typo ```metdadata```-\u003e ```metadata```","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"5466d656e14ac97aa5fd8e2cbdb5a2f7f31cd374","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    assert len(props) \u003d\u003d 1"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def test_image_metdadata_active_filter(driver, config, metadata_modal):"},{"line_number":125,"context_line":"    \"\"\"Filter the list of active properties.\"\"\""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    filter_input \u003d metadata_modal.find_element(By.CSS_SELECTOR,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1dbee518_1f5d6672","line":124,"range":{"start_line":124,"start_character":15,"end_line":124,"end_character":24},"in_reply_to":"b52655cb_cd00eb4b","updated":"2026-07-03 12:11:29.000000000","message":"Done","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f69704a2f2dcf81b2ec5142a636a77a77e05ed48","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    \"\"\"Filter the list of active properties.\"\"\""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    filter_input \u003d metadata_modal.find_element(By.CSS_SELECTOR,"},{"line_number":128,"context_line":"        \u0027input[ng-model\u003d\"ctrl.filterText.existing\"]\u0027)"},{"line_number":129,"context_line":"    filter_input.click()"},{"line_number":130,"context_line":"    filter_input.send_keys(\"test\")"},{"line_number":131,"context_line":"    uls \u003d metadata_modal.find_elements(By.CSS_SELECTOR,"}],"source_content_type":"text/x-python","patch_set":4,"id":"e4cfddb9_eb287938","line":128,"updated":"2026-07-02 16:32:29.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f69704a2f2dcf81b2ec5142a636a77a77e05ed48","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                                       \u0027ul.metadata-list-group\u0027)"},{"line_number":133,"context_line":"    active_props_ul \u003d uls[1]"},{"line_number":134,"context_line":"    props \u003d active_props_ul.find_elements(By.CSS_SELECTOR,"},{"line_number":135,"context_line":"        \u0027li:not(.ng-hide) span.input-group-addon\u0027)"},{"line_number":136,"context_line":"    assert len(props) \u003d\u003d 1"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"e1759388_3db45f23","line":135,"updated":"2026-07-02 16:32:29.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f69704a2f2dcf81b2ec5142a636a77a77e05ed48","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    props \u003d active_props_ul.find_elements(By.CSS_SELECTOR,"},{"line_number":135,"context_line":"        \u0027li:not(.ng-hide) span.input-group-addon\u0027)"},{"line_number":136,"context_line":"    assert len(props) \u003d\u003d 1"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"6f81921c_e5b48af2","line":137,"updated":"2026-07-02 16:32:29.000000000","message":"pep8: W391 blank line at end of file","commit_id":"7cf1872fbfd53f4aa807e1a46cc3b1a6d27f437a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e9c6efb9a5093f9fc2d879db13c3356b75486e47","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from contextlib import contextmanager"},{"line_number":14,"context_line":"from unittest import mock"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import pytest"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a75c48c_8c35bc23","line":13,"updated":"2026-07-03 13:32:50.000000000","message":"pep8: F401 \u0027contextlib.contextmanager\u0027 imported but unused","commit_id":"e3b237fecd66220d16fb2fe7f94b237c481f98ff"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e9c6efb9a5093f9fc2d879db13c3356b75486e47","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    input_field \u003d label.parent.find_element(By.CSS_SELECTOR, \u0027input\u0027)"},{"line_number":90,"context_line":"    input_field.send_keys(\"123\")"},{"line_number":91,"context_line":"    label.parent.find_element(By.CSS_SELECTOR, \u0027a.btn\u0027).click()"},{"line_number":92,"context_line":"    with wifgets.no_wait(driver, config):"},{"line_number":93,"context_line":"        labels \u003d active_props_ul.find_elements("},{"line_number":94,"context_line":"            By.XPATH, \u0027.//span[normalize-space()\u003d\"cpu_mock:mock\"]\u0027)"},{"line_number":95,"context_line":"    assert len(labels) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":5,"id":"e2959b0a_8434155b","line":92,"updated":"2026-07-03 13:32:50.000000000","message":"pep8: F821 undefined name \u0027wifgets\u0027","commit_id":"e3b237fecd66220d16fb2fe7f94b237c481f98ff"}]}
