)]}'
{"id":"openstack%2Fwatcher-dashboard~998324","triplet_id":"openstack%2Fwatcher-dashboard~master~I5676316822de9ce9e17c5d762873e8266fd94b26","project":"openstack/watcher-dashboard","branch":"master","attention_set":{"12393":{"account":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"last_update":"2026-07-22 15:15:06.000000000","reason":"Someone else replied on the change"}},"removed_from_attention_set":{},"hashtags":[],"change_id":"I5676316822de9ce9e17c5d762873e8266fd94b26","subject":"Fix babel configs and add translations tox target","status":"NEW","created":"2026-07-22 15:14:59.000000000","updated":"2026-08-06 14:11:32.000000000","submit_type":"MERGE_IF_NECESSARY","mergeable":true,"submittable":false,"total_comment_count":7,"unresolved_comment_count":7,"has_review_started":true,"meta_rev_id":"e34dd2b50c6411c999c900f1d9e43fa9ef7fc66d","_number":998324,"virtual_id_number":998324,"owner":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"actions":{},"labels":{"Verified":{"recommended":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"all":[{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"tag":"autogenerated:zuul:check","value":1,"date":"2026-07-23 06:48:18.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","value":1,"default_value":0,"optional":true},"Code-Review":{"disliked":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"all":[{"value":-1,"date":"2026-08-06 14:11:32.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","value":-1,"default_value":0,"optional":true},"Workflow":{"all":[{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true},"Review-Priority":{"all":[{"value":0,"permitted_voting_range":{"min":0,"max":2},"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"value":0,"permitted_voting_range":{"min":0,"max":1},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{" 0":"Standard Change","+1":"Important Change","+2":"High Priority Change"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"CC":[{"_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"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2026-07-22 15:15:06.000000000","updated_by":{"_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"},"reviewer":{"_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"},"state":"CC"},{"updated":"2026-07-22 15:59:42.000000000","updated_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"reviewer":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"state":"REVIEWER"},{"updated":"2026-08-06 14:11:32.000000000","updated_by":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"reviewer":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"state":"REVIEWER"}],"messages":[{"id":"db434dfd5cfb044c6c78afc301559f538f783e9a","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"date":"2026-07-22 15:14:59.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"a1375a4b36931062b825dd8cd93b10f53dcaeedb","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-07-22 15:15:06.000000000","message":"Patch Set 1:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":1},{"id":"4e17260ea0ea4f4df8bbe622560ff84ab4542d99","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-07-22 15:59:42.000000000","message":"Patch Set 1: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/47ee671ce6c148ffb5eccbc4cfec9c7a\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/88776622458e442894e8e590d79a414f : SUCCESS in 6m 22s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/466d211a5e724c76b02fe889c8dc9841 : SUCCESS in 6m 49s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/00831bcb2c684c9f98c975905f350d64 : SUCCESS in 6m 56s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/770e9aa099904ed49b27fadae3dd37d4 : SUCCESS in 4m 36s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/e3787da5a5284520a8d13e9a768595c7 : SUCCESS in 4m 18s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/fd4f45015d13437b83c36d5bea129640 : SUCCESS in 6m 39s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/bc0bd468d2b64450beca4c14be31928f : SUCCESS in 6m 18s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/c88648dae63b4d1985c541ed9b743d58 : SUCCESS in 7m 56s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/2d77ef38a6e141e1a10ee9512a47fa5b : SUCCESS in 4m 32s\n- watcher-dashboard-integration-tests-playwright https://zuul.opendev.org/t/openstack/build/c7900e631cf24921bcbb5e9d39aa4ab5 : SUCCESS in 35m 00s","accounts_in_message":[],"_revision_number":1},{"id":"1f744b975eda7d2d8fc0766e5f9e35348636ce23","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-07-22 17:14:43.000000000","message":"Patch Set 1:\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/aac3aea855a94cf3a28868999e89e765\n\n- teim-code-review https://zuul.teim.app/t/main/build/ab4f3f22715c463d8c8ad527170309d6 : SUCCESS in 6m 33s","accounts_in_message":[],"_revision_number":1},{"id":"6711d2aa3d578c2cf5df527de6690b10f8ee415e","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"date":"2026-07-23 05:35:07.000000000","message":"Uploaded patch set 2.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":2},{"id":"b403af0e68f700827f657c2757fc486b6e78764c","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-07-23 05:35:14.000000000","message":"Patch Set 2:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":2},{"id":"bb01d64806e7f543dcf94d4ed66db2786212322f","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-07-23 05:44:04.000000000","message":"Patch Set 2:\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/b254c39ccbe84ff9a577e6f6308dbbf3\n\n- teim-code-review https://zuul.teim.app/t/main/build/996882a8e2e24650be9220f19d37ac0e : SUCCESS in 8m 42s","accounts_in_message":[],"_revision_number":2},{"id":"a55d0c5251d27f3f8e340255154a79f3acf2fbfe","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"date":"2026-07-23 05:45:04.000000000","message":"Uploaded patch set 3.","accounts_in_message":[],"_revision_number":3},{"id":"cc79d265312e9accc5a520f619a1dfedbc5b89ef","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-07-23 05:45:11.000000000","message":"Patch Set 3:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":3},{"id":"f1b5b62b44ab8c0180e4ce920a1ea1fad22df147","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-07-23 05:53:16.000000000","message":"Patch Set 3:\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/dee5d1eaee0f44ec9071394c2fde2450\n\n- teim-code-review https://zuul.teim.app/t/main/build/bf292204a5f243779b2d88051b734124 : SUCCESS in 7m 56s","accounts_in_message":[],"_revision_number":3},{"id":"c0f313dd0ecb5af183f3d90132b554012bfdbecf","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-07-23 06:03:05.000000000","message":"Patch Set 3: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/500e05dd3236488fa873c99da9425066\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/bbb97d298f494c4c84917b341d0cdde4 : SUCCESS in 2m 49s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/aa5616165382444a827aea4db2a64c68 : SUCCESS in 2m 37s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/53a29dd3f86f4f87931ea0f7db484dd6 : SUCCESS in 3m 44s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/1e7e537f0e754a75bfc063f0bca7b964 : SUCCESS in 2m 46s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/6b875afb0bab403d97321d549f7344f7 : SUCCESS in 4m 02s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/ac2f689f0ee94866bac79d57c47ea7a4 : SUCCESS in 6m 58s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/d5405956fbd2461791e94c04176264ec : SUCCESS in 3m 08s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/ca9f233ee928481abd47705d023ca5ec : SUCCESS in 7m 02s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/7973521ea68c4862a42b5380122b60af : SUCCESS in 4m 40s\n- watcher-dashboard-integration-tests-playwright https://zuul.opendev.org/t/openstack/build/116456d5b8484860bcd27f8de0575bf7 : SUCCESS in 13m 43s\n- watcher-dashboard-tox-translations https://zuul.opendev.org/t/openstack/build/881bb1c020d14262b4e9a47f1e7c8f7f : SUCCESS in 2m 28s","accounts_in_message":[],"_revision_number":3},{"id":"9c768e5cba190ff5000b75c93202108cc4a1c9c2","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"date":"2026-07-23 06:07:43.000000000","message":"Uploaded patch set 4.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":4},{"id":"87fbf62ab0e0120b2c80e914a9e4515dc329247b","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-07-23 06:07:50.000000000","message":"Patch Set 4:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":4},{"id":"e29336fae4d5003b86a21d0b8a0ed77e95f88cea","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-07-23 06:16:58.000000000","message":"Patch Set 4:\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/8495d03dea4a4cd981b9a26ae4266f06\n\n- teim-code-review https://zuul.teim.app/t/main/build/e469977c0e9f47f382d026756ad2f6cd : SUCCESS in 8m 56s","accounts_in_message":[],"_revision_number":4},{"id":"0c6977974822e94aef517339b2977f3aef10f5a6","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-07-23 06:48:18.000000000","message":"Patch Set 4: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/04601e7acbbc47bfbec92ae8c79f8c84\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/b91bf6a6c44e4822aff6e0420a7ac646 : SUCCESS in 4m 25s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/f9f7c5a697c0444b92d6611f256946f0 : SUCCESS in 6m 37s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/44126ea1a3454ed2a9771fdd741f9ab7 : SUCCESS in 5m 09s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/9c118de261f84d508047f2e32537f3c5 : SUCCESS in 2m 21s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/c4babf8ce7e744ffac4b448c928b05a6 : SUCCESS in 5m 23s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/75cb85812bce4006bc47de2221cc4ce8 : SUCCESS in 4m 15s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/a852563152f9408da4cbf584b398da15 : SUCCESS in 5m 58s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/ca2e5bac28c04f75b4fd0bc02eb6fbea : SUCCESS in 5m 53s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/545bf5b9dedd4692a7b7ec359fec66ca : SUCCESS in 3m 48s\n- watcher-dashboard-integration-tests-playwright https://zuul.opendev.org/t/openstack/build/e12f675beb4a4a7781d1c6b47a81ef26 : SUCCESS in 31m 43s\n- watcher-dashboard-tox-translations https://zuul.opendev.org/t/openstack/build/651a921bc59b43eb939457845a5f03ac : SUCCESS in 2m 55s","accounts_in_message":[],"_revision_number":4},{"id":"e34dd2b50c6411c999c900f1d9e43fa9ef7fc66d","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-08-06 14:11:32.000000000","message":"Patch Set 4: Code-Review-1\n\n(7 comments)","accounts_in_message":[],"_revision_number":4}],"current_revision_number":4,"current_revision":"0cb4fde6ca24874eb43cbbf607fcaf7db1dd9866","revisions":{"b1aa375a0e5ba9ef916f10f291111e231ec7eb51":{"kind":"REWORK","_number":1,"created":"2026-07-22 15:14:59.000000000","uploader":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"ref":"refs/changes/24/998324/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/24/998324/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/1"}}},"commit":{"parents":[{"commit":"6910aba01b27b6d2a6983f79226fdd68e0a78b69","subject":"Merge \"Use ID-based selector for login button\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/6910aba01b27b6d2a6983f79226fdd68e0a78b69"}]}],"author":{"name":"Chandan Kumar (raukadah)","email":"chkumar@redhat.com","date":"2026-07-22 15:14:16.000000000","tz":330},"committer":{"name":"Chandan Kumar (raukadah)","email":"chkumar@redhat.com","date":"2026-07-22 15:14:29.000000000","tz":330},"subject":"Fix babel configs and add translations tox target","message":"Fix babel configs and add translations tox target\n\nThe watcher-dashboard codebase marks user-visible strings for\ntranslation using _() in Python (via gettext_lazy) and\n{% trans %} in Django templates. These markers tell the\ntranslation toolchain which strings need to be translated\ninto other languages.\n\nThe babel config files (babel-django.cfg and babel-djangojs.cfg)\ninstruct pybabel on where to scan for these marked strings and\nhow to extract them into .pot (Portable Object Template) files.\nTranslators then use these .pot files to produce per-language\n.po files containing the actual translations.\n\nThe existing babel configs had two problems:\n\n1. Glob patterns were hardcoded to watcher_dashboard/ prefixes\n   instead of using generic ** globs. The Horizon management\n   command (extract_messages) already passes --input-dirs to\n   scope extraction, so the config-level prefixes were redundant\n   and inconsistent with other Horizon plugins (e.g. manila-ui).\n\n2. babel-django.cfg was missing the .csv template extraction\n   rule that Horizon and other plugins include.\n\nTwo Zuul jobs handle translations for OpenStack projects:\n\n- upstream-translation-update (runs post-merge): extracts\n  strings via pybabel, generates .pot files, and uploads\n  them to the translation platform (translate.openstack.org).\n- propose-translation-update (runs periodically): downloads\n  translated .po files from the platform and proposes a\n  commit back to the repository.\n\nBoth jobs are defined in openstack/project-config and enabled\nfor watcher-dashboard via the translation-jobs-master-stable\ntemplate in project-config/zuul.d/projects.yaml. They were\nalready running but could not extract any UI strings due to\nthe broken babel configs, which is why only release notes\nappear on translate.openstack.org despite 54 languages being\nconfigured.\n\nThis change also:\n- Creates the watcher_dashboard/locale/ directory needed to\n  store extracted .pot files and translated .po files.\n- Adds a [testenv:translations] tox target (matching Horizon\u0027s\n  pattern) to run extraction and compilation locally via:\n  tox -e translations\n- Adds *.pot to .gitignore since .pot files are generated\n  artifacts (matching Horizon\u0027s .gitignore pattern). The\n  *.mo pattern was already present.\n\nGenerated-By: Claude Opus 4.6\nChange-Id: I5676316822de9ce9e17c5d762873e8266fd94b26\nSigned-off-by: Chandan Kumar (raukadah) \u003cchkumar@redhat.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/b1aa375a0e5ba9ef916f10f291111e231ec7eb51"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/b1aa375a0e5ba9ef916f10f291111e231ec7eb51"}]},"branch":"refs/heads/master"},"8f75dc571f47dbd5830db636b6c4eebbdd1b21a2":{"kind":"REWORK","_number":2,"created":"2026-07-23 05:35:07.000000000","uploader":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"ref":"refs/changes/24/998324/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/24/998324/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/2"}}},"commit":{"parents":[{"commit":"6910aba01b27b6d2a6983f79226fdd68e0a78b69","subject":"Merge \"Use ID-based selector for login button\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/6910aba01b27b6d2a6983f79226fdd68e0a78b69"}]}],"author":{"name":"Chandan Kumar (raukadah)","email":"chkumar@redhat.com","date":"2026-07-22 15:14:16.000000000","tz":330},"committer":{"name":"Chandan Kumar (raukadah)","email":"chkumar@redhat.com","date":"2026-07-23 05:34:25.000000000","tz":330},"subject":"Fix babel configs and add translations tox target","message":"Fix babel configs and add translations tox target\n\nThe watcher-dashboard codebase marks user-visible strings for\ntranslation using _() in Python (via gettext_lazy) and\n{% trans %} in Django templates. These markers tell the\ntranslation toolchain which strings need to be translated\ninto other languages.\n\nThe babel config files (babel-django.cfg and babel-djangojs.cfg)\ninstruct pybabel on where to scan for these marked strings and\nhow to extract them into .pot (Portable Object Template) files.\nTranslators then use these .pot files to produce per-language\n.po files containing the actual translations.\n\nThe existing babel configs had two problems:\n\n1. Glob patterns were hardcoded to watcher_dashboard/ prefixes\n   instead of using generic ** globs. The Horizon management\n   command (extract_messages) already passes --input-dirs to\n   scope extraction, so the config-level prefixes were redundant\n   and inconsistent with other Horizon plugins (e.g. manila-ui).\n\n2. babel-django.cfg was missing the .csv template extraction\n   rule that Horizon and other plugins include.\n\nTwo Zuul jobs handle translations for OpenStack projects:\n\n- upstream-translation-update (runs post-merge): extracts\n  strings via pybabel, generates .pot files, and uploads\n  them to the translation platform (translate.openstack.org).\n- propose-translation-update (runs periodically): downloads\n  translated .po files from the platform and proposes a\n  commit back to the repository.\n\nBoth jobs are defined in openstack/project-config and enabled\nfor watcher-dashboard via the translation-jobs-master-stable\ntemplate in project-config/zuul.d/projects.yaml. They were\nalready running but could not extract any UI strings due to\nthe broken babel configs, which is why only release notes\nappear on translate.openstack.org despite 54 languages being\nconfigured.\n\nThis change also:\n- Creates the watcher_dashboard/locale/ directory needed to\n  store extracted .pot files and translated .po files.\n- Adds a [testenv:translations] tox target (matching Horizon\u0027s\n  pattern) to run extraction and compilation locally via:\n  tox -e translations\n- Adds *.pot to .gitignore since .pot files are generated\n  artifacts (matching Horizon\u0027s .gitignore pattern). The\n  *.mo pattern was already present.\n- Adds a watcher-dashboard-tox-translations Zuul job to\n  check and gate pipelines that runs the translations tox\n  target and copies the generated .pot files to Zuul logs\n  as downloadable artifacts.\n\nGenerated-By: Claude Opus 4.6\nChange-Id: I5676316822de9ce9e17c5d762873e8266fd94b26\nSigned-off-by: Chandan Kumar (raukadah) \u003cchkumar@redhat.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/8f75dc571f47dbd5830db636b6c4eebbdd1b21a2"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/8f75dc571f47dbd5830db636b6c4eebbdd1b21a2"}]},"branch":"refs/heads/master"},"e2ff9dda14e81455fab3784e2ba75a639c58014f":{"kind":"REWORK","_number":3,"created":"2026-07-23 05:45:04.000000000","uploader":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"ref":"refs/changes/24/998324/3","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/24/998324/3","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/3"}}},"commit":{"parents":[{"commit":"6910aba01b27b6d2a6983f79226fdd68e0a78b69","subject":"Merge \"Use ID-based selector for login button\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/6910aba01b27b6d2a6983f79226fdd68e0a78b69"}]}],"author":{"name":"Chandan Kumar (raukadah)","email":"chkumar@redhat.com","date":"2026-07-22 15:14:16.000000000","tz":330},"committer":{"name":"Chandan Kumar (raukadah)","email":"chkumar@redhat.com","date":"2026-07-23 05:44:41.000000000","tz":330},"subject":"Fix babel configs and add translations tox target","message":"Fix babel configs and add translations tox target\n\nThe watcher-dashboard codebase marks user-visible strings for\ntranslation using _() in Python (via gettext_lazy) and\n{% trans %} in Django templates. These markers tell the\ntranslation toolchain which strings need to be translated\ninto other languages.\n\nThe babel config files (babel-django.cfg and babel-djangojs.cfg)\ninstruct pybabel on where to scan for these marked strings and\nhow to extract them into .pot (Portable Object Template) files.\nTranslators then use these .pot files to produce per-language\n.po files containing the actual translations.\n\nThe existing babel configs had two problems:\n\n1. Glob patterns were hardcoded to watcher_dashboard/ prefixes\n   instead of using generic ** globs. The Horizon management\n   command (extract_messages) already passes --input-dirs to\n   scope extraction, so the config-level prefixes were redundant\n   and inconsistent with other Horizon plugins (e.g. manila-ui).\n\n2. babel-django.cfg was missing the .csv template extraction\n   rule that Horizon and other plugins include.\n\nTwo Zuul jobs handle translations for OpenStack projects:\n\n- upstream-translation-update (runs post-merge): extracts\n  strings via pybabel, generates .pot files, and uploads\n  them to the translation platform (translate.openstack.org).\n- propose-translation-update (runs periodically): downloads\n  translated .po files from the platform and proposes a\n  commit back to the repository.\n\nBoth jobs are defined in openstack/project-config and enabled\nfor watcher-dashboard via the translation-jobs-master-stable\ntemplate in project-config/zuul.d/projects.yaml. They were\nalready running but could not extract any UI strings due to\nthe broken babel configs, which is why only release notes\nappear on translate.openstack.org despite 54 languages being\nconfigured.\n\nThis change also:\n- Creates the watcher_dashboard/locale/ directory needed to\n  store extracted .pot files and translated .po files.\n- Adds a [testenv:translations] tox target (matching Horizon\u0027s\n  pattern) to run extraction and compilation locally via:\n  tox -e translations\n- Adds *.pot to .gitignore since .pot files are generated\n  artifacts (matching Horizon\u0027s .gitignore pattern). The\n  *.mo pattern was already present.\n- Adds a watcher-dashboard-tox-translations Zuul job to\n  check and gate pipelines that runs the translations tox\n  target and copies the generated .pot files to Zuul logs\n  as downloadable artifacts.\n- Adds bindep.txt with gettext dependency so that msgfmt\n  (required by Django\u0027s compilemessages) is available on\n  Zuul nodes.\n\nGenerated-By: Claude Opus 4.6\nChange-Id: I5676316822de9ce9e17c5d762873e8266fd94b26\nSigned-off-by: Chandan Kumar (raukadah) \u003cchkumar@redhat.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/e2ff9dda14e81455fab3784e2ba75a639c58014f"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/e2ff9dda14e81455fab3784e2ba75a639c58014f"}]},"branch":"refs/heads/master"},"0cb4fde6ca24874eb43cbbf607fcaf7db1dd9866":{"kind":"REWORK","_number":4,"created":"2026-07-23 06:07:43.000000000","uploader":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"ref":"refs/changes/24/998324/4","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/24/998324/4","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/4 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/4 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/4 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/24/998324/4"}}},"commit":{"parents":[{"commit":"6910aba01b27b6d2a6983f79226fdd68e0a78b69","subject":"Merge \"Use ID-based selector for login button\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/6910aba01b27b6d2a6983f79226fdd68e0a78b69"}]}],"author":{"name":"Chandan Kumar (raukadah)","email":"chkumar@redhat.com","date":"2026-07-22 15:14:16.000000000","tz":330},"committer":{"name":"Chandan Kumar (raukadah)","email":"chkumar@redhat.com","date":"2026-07-23 06:07:20.000000000","tz":330},"subject":"Fix babel configs and add translations tox target","message":"Fix babel configs and add translations tox target\n\nThe watcher-dashboard codebase marks user-visible strings for\ntranslation using _() in Python (via gettext_lazy) and\n{% trans %} in Django templates. These markers tell the\ntranslation toolchain which strings need to be translated\ninto other languages.\n\nThe babel config files (babel-django.cfg and babel-djangojs.cfg)\ninstruct pybabel on where to scan for these marked strings and\nhow to extract them into .pot (Portable Object Template) files.\nTranslators then use these .pot files to produce per-language\n.po files containing the actual translations.\n\nThe existing babel configs had two problems:\n\n1. Glob patterns were hardcoded to watcher_dashboard/ prefixes\n   instead of using generic ** globs. The Horizon management\n   command (extract_messages) already passes --input-dirs to\n   scope extraction, so the config-level prefixes were redundant\n   and inconsistent with other Horizon plugins (e.g. manila-ui).\n\n2. babel-django.cfg was missing the .csv template extraction\n   rule that Horizon and other plugins include.\n\nTwo Zuul jobs handle translations for OpenStack projects:\n\n- upstream-translation-update (runs post-merge): extracts\n  strings via pybabel, generates .pot files, and uploads\n  them to the translation platform (translate.openstack.org).\n- propose-translation-update (runs periodically): downloads\n  translated .po files from the platform and proposes a\n  commit back to the repository.\n\nBoth jobs are defined in openstack/project-config and enabled\nfor watcher-dashboard via the translation-jobs-master-stable\ntemplate in project-config/zuul.d/projects.yaml. They were\nalready running but could not extract any UI strings due to\nthe broken babel configs, which is why only release notes\nappear on translate.openstack.org despite 54 languages being\nconfigured.\n\nThis change also:\n- Creates the watcher_dashboard/locale/ directory needed to\n  store extracted .pot files and translated .po files.\n- Adds a [testenv:translations] tox target (matching Horizon\u0027s\n  pattern) to run extraction and compilation locally via:\n  tox -e translations\n  The generated .pot files are copied to .tox/translations/log/\n  so that the Zuul fetch-tox-output role picks them up as\n  downloadable artifacts automatically.\n- Adds *.pot to .gitignore since .pot files are generated\n  artifacts (matching Horizon\u0027s .gitignore pattern). The\n  *.mo pattern was already present.\n- Adds a watcher-dashboard-tox-translations Zuul job to\n  check and gate pipelines that runs the translations tox\n  target.\n- Adds bindep.txt with gettext dependency so that msgfmt\n  (required by Django\u0027s compilemessages) is available on\n  Zuul nodes.\n\nGenerated-By: Claude Opus 4.6\nChange-Id: I5676316822de9ce9e17c5d762873e8266fd94b26\nSigned-off-by: Chandan Kumar (raukadah) \u003cchkumar@redhat.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/0cb4fde6ca24874eb43cbbf607fcaf7db1dd9866"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/0cb4fde6ca24874eb43cbbf607fcaf7db1dd9866"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~DefaultSubmitRule","status":"OK","labels":[{"label":"Verified","status":"MAY","applied_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}},{"label":"Code-Review","status":"MAY","applied_by":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"}},{"label":"Workflow","status":"MAY"},{"label":"Review-Priority","status":"MAY"}]}],"submit_requirements":[{"name":"Verified","description":"Verified in gate by CI","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Verified\u003dMAX AND -label:Verified\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Verified\u003dMAX","label:Verified\u003dMIN"],"atom_explanations":{"label:Verified\u003dMAX":"","label:Verified\u003dMIN":""}}},{"name":"Code-Review","description":"Code reviewed by core reviewer","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Code-Review\u003dMAX AND -label:Code-Review\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Code-Review\u003dMAX","label:Code-Review\u003dMIN"],"atom_explanations":{"label:Code-Review\u003dMAX":"","label:Code-Review\u003dMIN":""}}},{"name":"Review-Priority","description":"Review Priority","status":"NOT_APPLICABLE","is_legacy":false,"applicability_expression_result":{"fulfilled":false,"status":"FAIL"},"submittability_expression_result":{"expression":"is:true","fulfilled":true,"status":"NOT_EVALUATED","passing_atoms":[],"failing_atoms":[],"atom_explanations":{}}},{"name":"Workflow","description":"Approved for gate by core reviewer","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Workflow\u003dMAX AND -label:Workflow\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Workflow\u003dMAX","label:Workflow\u003dMIN"],"atom_explanations":{"label:Workflow\u003dMAX":"","label:Workflow\u003dMIN":""}}}]}
