)]}'
{".zuul.yaml":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"263e4ae4dab536624bd6505a7e962651f72b5c8c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        PLAYWRIGHT_TRACE: retain-on-failure"},{"line_number":36,"context_line":"        PLAYWRIGHT_HEADLESS: true"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"- job:"},{"line_number":39,"context_line":"    name: watcher-dashboard-integration-tests-playwright-i18n"},{"line_number":40,"context_line":"    description: |"},{"line_number":41,"context_line":"      Run the i18n-tagged Playwright integration tests against a devstack"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"d3f3f36f_7f42bf06","line":38,"updated":"2026-11-02 15:20:13.000000000","message":"The new Zuul job enables Spanish in Horizon only through devstack_localrc, while the test reads the language from the tox process environment, where tox.ini falls back to a hard-coded default of \u0027es\u0027. The deployment language and the language under test are therefore configured in independent places and match only because both defaults happen to be \u0027es\u0027. If someone changes the job\u0027s language (for example to \u0027fr\u0027) without also editing the tox default, the test still sets the \u0027es\u0027 cookie, which is no longer in the deployment\u0027s LANGUAGES, Django falls back to English, and the content-language assertion fails with a confusing \u0027es\u0027 !\u003d \u0027en\u0027 message instead of exercising the requested language. This undercuts the commit\u0027s stated goal that \"any language can be exercised\" through the WATCHER_DASHBOARD_LANGUAGE variable.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: The invariant \"deployment language \u003d\u003d language under test\" is owned by three independent defaults (.zuul.yaml devstack_localrc, tox.ini setenv fallback, playwright_config fallback). Changing one location without the others produces a misleading CI failure that reports the wrong language rather than testing the intended language, making the job\u0027s advertised flexibility easy to break on first use.\n\n**Recommendation**:\nAdd WATCHER_DASHBOARD_LANGUAGE to the job\u0027s tox_environment alongside devstack_localrc (tox_environment: WATCHER_DASHBOARD_LANGUAGE: \"es\") so the deployment language and the language under test are declared together in one job; the tox {env:...} fallback then only serves local runs where the variable is exported manually.","commit_id":"55d8263bb01ff28f6661a051977eb82cb615cad3"}],"/COMMIT_MSG":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"3940222a5ea0dedff78949b6765763763942a3c5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     8a42e0fe (Merge \"Add Playwright tests for audit template scope validation\")"},{"line_number":2,"context_line":"Author:     Chandan \u003cchkumar@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2026-10-29 19:37:57 +0530"},{"line_number":4,"context_line":"Commit:     Chandan \u003cchkumar@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"f23bd6a7_7309b426","line":1,"updated":"2026-10-29 14:20:52.000000000","message":"The commit subject claims the change reproduces openstack-cyborg bug 2172447, but the diff adds a watcher-dashboard Playwright regression test for rendering the Audits table when the UI language is Spanish, and the test docstring cites bug 2167806. The message therefore contradicts the implemented behavior and omits any footer linking the bug the change actually addresses (e.g. \u0027Related-Bug: #2167806\u0027), so the permanent history cannot be traced from the bug report to this test or vice versa.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If this change is ever merged, the permanent change history points reviewers and future auditors of the Spanish-audits regression to an unrelated cyborg project bug, and no footer links watcher-dashboard bug 2167806, so the regression test cannot be traced back to the defect it guards, weakening future triage and backport decisions.\n\n**Suggestion**:\nBefore this is merged (i.e. in the follow-up that drops the [DNM] marker), retitle the commit to describe the added regression test (e.g. \u0027Add Playwright test for audits page in Spanish\u0027) and reference the actual bug with a \u0027Related-Bug: #2167806\u0027 footer; remove the unrelated openstack-cyborg URL.","commit_id":"32b2c267a70446ec328027592383cd1bbca0e466"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"0010f4b2b194ed0149bfd8bc8f6f07fd900c7184","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"67d697bb_a2ab28b0","updated":"2026-10-30 12:30:47.000000000","message":"On patchset2, I can reproduce the bug. Here is the screenshot https://ecffb7398a438013b0f8-8d72ee182e57c670f5674b29a29e8a6b.ssl.cf5.rackcdn.com/openstack/54e88e8725a44606b5b467e54e986302/controller/logs/playwright/screenshots/watcher_dashboard.test.integration.test_playwright_audit_workflow.AuditWorkflowTests.test_audits_page_loads_in_spanish/009_audits_page_in_spanish.png","commit_id":"a99fd027f50838b7e3e0445ea562daff55857b27"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"8b3d476d11a6d28a7533f7e485334f7030bbfff2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f1c4170c_a299c50d","updated":"2026-11-02 14:05:56.000000000","message":"https://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_0bf/openstack/0bf3783732b74823856fd72fd2b56cf5/testr_results.html is failing with\n```\nft1.2: watcher_dashboard.test.integration.test_playwright_audit_workflow.AuditWorkflowTests.test_audits_page_loads_in_spanishtesttools.testresult.real._StringException: Traceback (most recent call last):\n  File \"/home/zuul/src/opendev.org/openstack/watcher-dashboard/watcher_dashboard/test/integration/test_playwright_audit_workflow.py\", line 94, in test_audits_page_loads_in_spanish\n    self.assertEqual(200, response.status)\n  File \"/home/zuul/src/opendev.org/openstack/watcher-dashboard/.tox/integration-playwright/lib/python3.11/site-packages/testtools/testcase.py\", line 513, in assertEqual\n    self.assertThat(observed, matcher, message)\n  File \"/home/zuul/src/opendev.org/openstack/watcher-dashboard/.tox/integration-playwright/lib/python3.11/site-packages/testtools/testcase.py\", line 704, in assertThat\n    raise mismatch_error\ntesttools.matchers._impl.MismatchError: 200 !\u003d 500\n```","commit_id":"15f90aee10b0ebeb1ca065ddb64048427ab59d99"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"81464ef8bd03c5e2b839cbe318c2ac170484bad9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e6863abb_4789d812","updated":"2026-11-11 10:54:40.000000000","message":"the new tests works well https://storage.bhs.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_7f5/openstack/7f54842af9094bdf9ba6ea2d68f8dc73/testr_results.html","commit_id":"70f5efe48735280472a32c3da336994b11262c36"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b0a4f877913e940a3b9e2832c45ce7303412c1fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ea184e86_b248ad24","updated":"2026-11-12 09:43:37.000000000","message":"change looks good, adds a test to catch any possible regression","commit_id":"a842b5b1045dafdafb84f5143c51ba9133e46a5e"}],"tox.ini":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"81464ef8bd03c5e2b839cbe318c2ac170484bad9","unresolved":true,"context_lines":[{"line_number":98,"context_line":"  rm -rf {toxinidir}/playwright"},{"line_number":99,"context_line":"  # Browser binaries are installed by playbooks/playwright/pre.yaml, not tox."},{"line_number":100,"context_line":"  # For local runs: python -m playwright install webkit"},{"line_number":101,"context_line":"  i18n: stestr run --concurrency 1 {posargs:test_playwright_i18n}"},{"line_number":102,"context_line":"  !i18n: stestr run --concurrency 1 {posargs:--exclude-regex test_playwright_i18n}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"[testenv:venv]"}],"source_content_type":"text/x-properties","patch_set":5,"id":"b0669133_3e29dcf3","line":101,"updated":"2026-11-11 10:54:40.000000000","message":"TIL I did not know about conditional factors in tox https://tox.wiki/en/stable/reference/config.html#format-comparison very neat","commit_id":"70f5efe48735280472a32c3da336994b11262c36"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b0a4f877913e940a3b9e2832c45ce7303412c1fc","unresolved":false,"context_lines":[{"line_number":98,"context_line":"  rm -rf {toxinidir}/playwright"},{"line_number":99,"context_line":"  # Browser binaries are installed by playbooks/playwright/pre.yaml, not tox."},{"line_number":100,"context_line":"  # For local runs: python -m playwright install webkit"},{"line_number":101,"context_line":"  i18n: stestr run --concurrency 1 {posargs:test_playwright_i18n}"},{"line_number":102,"context_line":"  !i18n: stestr run --concurrency 1 {posargs:--exclude-regex test_playwright_i18n}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"[testenv:venv]"}],"source_content_type":"text/x-properties","patch_set":5,"id":"d5f846be_99a6a2f1","line":101,"in_reply_to":"b0669133_3e29dcf3","updated":"2026-11-12 09:43:37.000000000","message":"Acknowledged","commit_id":"70f5efe48735280472a32c3da336994b11262c36"}],"watcher_dashboard/content/audits/tables.py":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"81464ef8bd03c5e2b839cbe318c2ac170484bad9","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class CancelAudits(horizon.tables.BatchAction):"},{"line_number":103,"context_line":"    # NOTE: ``name`` is a machine-readable slug used to register the"},{"line_number":104,"context_line":"    # action in ``base_actions`` and to build its POST parameter"},{"line_number":105,"context_line":"    # (``{{ table.name }}__{{ action.name }}``) and must never be"},{"line_number":106,"context_line":"    # translated: a lazy translation proxy is resolved in the active"}],"source_content_type":"text/x-python","patch_set":5,"id":"c6ffe537_3700f85d","line":103,"updated":"2026-11-11 10:54:40.000000000","message":"I have a question: we have several other occurrences of the `name` variable set to a translatable string https://github.com/search?q\u003drepo%3Aopenstack%2Fwatcher-dashboard+%22+name+%3D+_%28%22\u0026type\u003dcode should we also change those? Or those would not be affected since they have a dedicated `slug` variable defined?","commit_id":"70f5efe48735280472a32c3da336994b11262c36"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"541a3f10a3477159557592d3c0753bb32db432de","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class CancelAudits(horizon.tables.BatchAction):"},{"line_number":103,"context_line":"    # NOTE: ``name`` is a machine-readable slug used to register the"},{"line_number":104,"context_line":"    # action in ``base_actions`` and to build its POST parameter"},{"line_number":105,"context_line":"    # (``{{ table.name }}__{{ action.name }}``) and must never be"},{"line_number":106,"context_line":"    # translated: a lazy translation proxy is resolved in the active"}],"source_content_type":"text/x-python","patch_set":5,"id":"f43bff3a_87d4f89d","line":103,"in_reply_to":"c6ffe537_3700f85d","updated":"2026-11-12 03:49:14.000000000","message":"Good question — these don\u0027t need changing, and your reasoning is correct.\n\nAll the hits in that search are Panel.name and Tab.name. \n\nBoth classes have a dedicated slug, which is the identifier the code uses: for a panel it\u0027s the URL segment (\u003chorizon\u003e/admin/audits/, where audits is the slug), for a tab it\u0027s the HTML element id of the content block. \n\nname is only the string shown on screen — the sidebar entry or the tab label — so translating it there is correct.\n\nTable actisn don\u0027t have a slug, so name has to play that role. \n\n\nHorizon registers the action under it and builds the submitted value from it (audits__cancel_audit__\u003cid\u003e). The user-facing string for an action is verbose_name. \n\nTranslting name meant the action was registered as Cancel but rendered as Cancelar in Spanish, so the lokup failed and the page returned a 500.\n\nI hope it clears the confusion. I have also updated the same in commit message and comment here.","commit_id":"70f5efe48735280472a32c3da336994b11262c36"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b0a4f877913e940a3b9e2832c45ce7303412c1fc","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class CancelAudits(horizon.tables.BatchAction):"},{"line_number":103,"context_line":"    # NOTE: ``name`` is a machine-readable slug used to register the"},{"line_number":104,"context_line":"    # action in ``base_actions`` and to build its POST parameter"},{"line_number":105,"context_line":"    # (``{{ table.name }}__{{ action.name }}``) and must never be"},{"line_number":106,"context_line":"    # translated: a lazy translation proxy is resolved in the active"}],"source_content_type":"text/x-python","patch_set":5,"id":"4400e59f_b6a5152b","line":103,"in_reply_to":"f43bff3a_87d4f89d","updated":"2026-11-12 09:43:37.000000000","message":"I suspected that, but wanted to double check since I don\u0027t have any experience with the horizon plugin, thanks Chandan!","commit_id":"70f5efe48735280472a32c3da336994b11262c36"}]}
