)]}'
{"id":"openstack%2Fwatcher-dashboard~982674","triplet_id":"openstack%2Fwatcher-dashboard~master~I8d0535799d5079a6abfb18bc566852e71619454c","project":"openstack/watcher-dashboard","branch":"master","topic":"service-layer-refactor","attention_set":{"11604":{"account":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"last_update":"2026-04-30 20:59:52.000000000","reason":"A robot voted negatively on a label"},"26471":{"account":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"last_update":"2026-04-30 20:42:49.000000000","reason":"Vote got outdated and was removed: Code-Review+1"}},"removed_from_attention_set":{},"hashtags":[],"change_id":"I8d0535799d5079a6abfb18bc566852e71619454c","subject":"refactor: migrate skip-action UI to service layer","status":"NEW","created":"2026-03-30 15:53:53.000000000","updated":"2026-04-30 20:59:52.000000000","submit_type":"MERGE_IF_NECESSARY","mergeable":false,"submittable":false,"total_comment_count":0,"unresolved_comment_count":0,"has_review_started":true,"meta_rev_id":"75b5708be6651018fc5d587eb58b53460ec8ac2e","_number":982674,"virtual_id_number":982674,"owner":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"actions":{},"labels":{"Verified":{"disliked":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"all":[{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},{"tag":"autogenerated:zuul:check","value":-1,"date":"2026-04-30 20:59:52.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":{"all":[{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},{"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":"","default_value":0,"optional":true},"Workflow":{"all":[{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},{"_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":1},"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},{"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":{"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"}],"REVIEWER":[{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2026-03-30 15:55:03.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-03-30 16:08:12.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-03-30 18:50:50.000000000","updated_by":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"reviewer":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"state":"REVIEWER"}],"messages":[{"id":"7e94990509d6a642e5fd7e11a67f74956ee123fc","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-03-30 15:53:53.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"1ba878f05be2d9d3db564ee8a358c01ebf384ca9","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-03-30 15:55:03.000000000","message":"Patch Set 1:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":1},{"id":"3af0bcb30837f1276cdbb61d1b59f585558ee53a","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-30 16:08:12.000000000","message":"Patch Set 1: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/b3de079f33bd423db6ce61017a8830cf\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/6606859e1bd84e67ae31f4b010cb817e : SUCCESS in 5m 06s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/3647aa690b2147d895746e8c02bdc1d3 : SUCCESS in 4m 40s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/c25539739e3145a0b270705535255573 : SUCCESS in 5m 16s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/11f274f42dbe4ca685ab9ad00519bbbe : SUCCESS in 3m 33s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/099d66096bc94a3dae3256e8d534bc88 : SUCCESS in 3m 17s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/721d1fbe11bd4898b5b675de50d7f325 : FAILURE in 7m 24s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/0a5a75dc4c0645eb8b8b5f429698b49b : SUCCESS in 3m 45s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/598e68dedf5b43e180c04763e9d1aa82 : SUCCESS in 7m 43s","accounts_in_message":[],"_revision_number":1},{"id":"f90bd42356b21610fb3a96d788d45f5913b1ca0a","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-03-30 16:57:22.000000000","message":"Patch Set 1:\n\n(3 comments)\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/6e16283c72b644d7a750b34a7446c00c\n\n- teim-code-review https://zuul.teim.app/t/main/build/c006a3ef884047d78c97cd746293ab15 : SUCCESS in 8m 06s","accounts_in_message":[],"_revision_number":1},{"id":"d1a108a4ea788275f51ecd222045947ff323fa4c","author":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"date":"2026-03-30 18:50:50.000000000","message":"Patch Set 1: Code-Review+1\n\nBuild succeeded (check pipeline).\nhttps://softwarefactory-project.io/zuul/t/rdoproject.org/buildset/a0da342a37394631aec1e0dae5c40934\n\n- openstack-meta-content-provider-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/af4357366c5849dbb3f6c794505107f6 : SUCCESS in 2h 55m 35s\n- watcher-operator-validation-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/e4d45d92d0754ca29e66a0f505417827 : SUCCESS in 2h 11m 00s","accounts_in_message":[],"_revision_number":1},{"id":"c582ff54da68aad58dbeb6b2f3f53ba9291606e1","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-04-04 00:52:13.000000000","message":"Uploaded patch set 2.\n\nOutdated Votes:\n* Code-Review+1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1\n","accounts_in_message":[],"_revision_number":2},{"id":"51c728510e0512d5ee7eb79a0093d7cd31a791cf","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-04-04 00:54:36.000000000","message":"Patch Set 2:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":2},{"id":"b05685ccac5b29f18acc95561e7d3789f12df62b","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-04-04 01:06:51.000000000","message":"Patch Set 2: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/f842401ed27e4cb2b500c32e562e69b9\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/907b2a4912c4481b9d08f27c3c20ccf9 : SUCCESS in 4m 05s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/3f2123bbf2824af292650a60072b5923 : SUCCESS in 2m 58s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/f82779329cb149cfbe5f3fd3201e73b2 : SUCCESS in 7m 03s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/ec5f7faa52dc40359d76b1c11b8b6595 : SUCCESS in 5m 23s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/f37422e3304e4463b2c667eb8378f820 : SUCCESS in 4m 21s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/e595c66b07f042a3b067d1430bd910e4 : FAILURE in 5m 27s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/e43cafaa284e4bb4814b80be4236c79b : SUCCESS in 4m 46s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/e6e0f26e5f4d4fdc82264be7ba2d2f47 : SUCCESS in 9m 19s","accounts_in_message":[],"_revision_number":2},{"id":"8f259207ea04006133449002a2ad4103db17e2eb","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-04-04 02:58:32.000000000","message":"Patch Set 2:\n\n(3 comments)\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/313416056d8149aca6115cd764b0daea\n\n- teim-code-review https://zuul.teim.app/t/main/build/11cdbfb3284f4393baf4a485819ec94f : SUCCESS in 7m 57s","accounts_in_message":[],"_revision_number":2},{"id":"6b183e8b78adc714540755fa66ca58e77ba2da5c","author":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"date":"2026-04-04 03:54:19.000000000","message":"Patch Set 2: Code-Review+1\n\nBuild succeeded (check pipeline).\nhttps://softwarefactory-project.io/zuul/t/rdoproject.org/buildset/d4d7f22458364eb0b202735e9f5ac286\n\n- openstack-meta-content-provider-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/b588682c281b473ca54d0bff25d4db37 : SUCCESS in 3h 00m 04s\n- watcher-operator-validation-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/234da85c614a44a9a9b62079295237cd : SUCCESS in 2h 13m 38s","accounts_in_message":[],"_revision_number":2},{"id":"ac5702e97d2fb2a1539223f5eca00c06273db199","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-04-30 20:42:49.000000000","message":"Uploaded patch set 3.\n\nOutdated Votes:\n* Code-Review+1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":3},{"id":"75b5708be6651018fc5d587eb58b53460ec8ac2e","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-04-30 20:59:52.000000000","message":"Patch Set 3: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/ae37a662654847f6aa4656ef00b4f843\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/1a6bf274d44a4d019de03165dca23bd9 : SUCCESS in 5m 51s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/d7aff415258c43379f9f1b4b7fb3ce05 : SUCCESS in 4m 26s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/0df3cf26462a4874a3c15f6b6593e166 : SUCCESS in 5m 16s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/203593fd8c414831abfe0fb749b41f18 : FAILURE in 6m 40s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/1981120119ee428bb55d61df5703aa48 : SUCCESS in 2m 31s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/5374316d87d44d119b0a750ddaab3abb : FAILURE in 5m 52s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/cb246235167b40bc975612b23c61e89e : SUCCESS in 2m 35s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/c4b0536f6863404ea97443376f2f1777 : SUCCESS in 7m 45s","accounts_in_message":[],"_revision_number":3}],"current_revision_number":3,"current_revision":"67d45d8e15410197e1f4c9f8d7445d88107db172","revisions":{"3e0d11ddea35648ec0bf471def1f1d1915379944":{"kind":"REWORK","_number":1,"created":"2026-03-30 15:53:53.000000000","uploader":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"ref":"refs/changes/74/982674/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/74/982674/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/1"}}},"commit":{"parents":[{"commit":"cc03108ea909a5de17382d1a74af9f0bd8ab3125","subject":"Document UI-layer contribution patterns","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/cc03108ea909a5de17382d1a74af9f0bd8ab3125"}]}],"author":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-03-30 15:48:15.000000000","tz":60},"committer":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-03-30 15:49:47.000000000","tz":60},"subject":"migrate skip-action UI to service layer","message":"migrate skip-action UI to service layer\n\n- Add action_update() service function to api/watcher.py\n- Fix Action.update to catch NotAcceptable (HTTP 406) instead of\n  MethodNotAllowed (HTTP 405); per the OpenStack microversion spec,\n  an out-of-range microversion request returns 406 Not Acceptable\n- content/actions/forms.py: replace direct class method calls\n  (Action.get, Action.update) with service layer functions\n  (action_get, action_update)\n- content/actions/views.py: remove dead max_version() method and\n  unused common_client import from DetailView\n- Update test_action_update_method_not_allowed -\u003e _not_acceptable\n  to match the corrected exception handling\n- Add three action_update service layer tests in test_watcher_service.py\n- Add new test/unit/content_tests/test_actions.py with 10 tests\n  covering SkipActionForm.clean() and handle() paths\n\nGenerated-By: claude-code Sonnet 4.6\nChange-Id: I8d0535799d5079a6abfb18bc566852e71619454c\nSigned-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/3e0d11ddea35648ec0bf471def1f1d1915379944"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/3e0d11ddea35648ec0bf471def1f1d1915379944"}]},"branch":"refs/heads/master"},"b0eacfcafdc02793a3e2a8cc0fc58d17a27967c6":{"kind":"REWORK","_number":2,"created":"2026-04-04 00:52:13.000000000","uploader":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"ref":"refs/changes/74/982674/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/74/982674/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/2"}}},"commit":{"parents":[{"commit":"7e53878165446f1f6cddec313f73b84ba0308457","subject":"docs: document UI-layer contribution patterns","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/7e53878165446f1f6cddec313f73b84ba0308457"}]}],"author":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-03-30 15:48:15.000000000","tz":60},"committer":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-04-04 00:49:03.000000000","tz":60},"subject":"refactor: migrate skip-action UI to service layer","message":"refactor: migrate skip-action UI to service layer\n\n- Add action_update() service function to api/watcher.py\n- Fix Action.update to catch NotAcceptable (HTTP 406) instead of\n  MethodNotAllowed (HTTP 405); per the OpenStack microversion spec,\n  an out-of-range microversion request returns 406 Not Acceptable\n- content/actions/forms.py: replace direct class method calls\n  (Action.get, Action.update) with service layer functions\n  (action_get, action_update)\n- content/actions/views.py: remove dead max_version() method and\n  unused common_client import from DetailView\n- Update test_action_update_method_not_allowed -\u003e _not_acceptable\n  to match the corrected exception handling\n- Add three action_update service layer tests in test_watcher_service.py\n- Add new test/unit/content_tests/test_actions.py with 10 tests\n  covering SkipActionForm.clean() and handle() paths\n\nGenerated-By: claude-code Sonnet 4.6\nChange-Id: I8d0535799d5079a6abfb18bc566852e71619454c\nSigned-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/b0eacfcafdc02793a3e2a8cc0fc58d17a27967c6"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/b0eacfcafdc02793a3e2a8cc0fc58d17a27967c6"}]},"branch":"refs/heads/master"},"67d45d8e15410197e1f4c9f8d7445d88107db172":{"kind":"REWORK","_number":3,"created":"2026-04-30 20:42:49.000000000","uploader":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"ref":"refs/changes/74/982674/3","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/74/982674/3","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/74/982674/3"}}},"commit":{"parents":[{"commit":"8505e50433b43b754c5124c99f85170bd839a964","subject":"docs: document UI-layer contribution patterns","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/8505e50433b43b754c5124c99f85170bd839a964"}]}],"author":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-03-30 15:48:15.000000000","tz":60},"committer":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-04-30 20:36:32.000000000","tz":60},"subject":"refactor: migrate skip-action UI to service layer","message":"refactor: migrate skip-action UI to service layer\n\n- Add action_update() service function to api/watcher.py\n- Fix Action.update to catch NotAcceptable (HTTP 406) instead of\n  MethodNotAllowed (HTTP 405); per the OpenStack microversion spec,\n  an out-of-range microversion request returns 406 Not Acceptable\n- content/actions/forms.py: replace direct class method calls\n  (Action.get, Action.update) with service layer functions\n  (action_get, action_update)\n- content/actions/views.py: remove dead max_version() method and\n  unused common_client import from DetailView\n- Update test_action_update_method_not_allowed -\u003e _not_acceptable\n  to match the corrected exception handling\n- Add three action_update service layer tests in test_watcher_service.py\n- Add new test/unit/content_tests/test_actions.py with 10 tests\n  covering SkipActionForm.clean() and handle() paths\n\nGenerated-By: claude-code Sonnet 4.6\nChange-Id: I8d0535799d5079a6abfb18bc566852e71619454c\nSigned-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/67d45d8e15410197e1f4c9f8d7445d88107db172"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/67d45d8e15410197e1f4c9f8d7445d88107db172"}]},"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"},{"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":""}}}]}
