mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Only disable a device if all associated config entries are disabled (#53681)
This commit is contained in:
parent
204426009f
commit
c6213b36ad
@ -670,6 +670,7 @@ def async_config_entry_disabled_by_changed(
|
|||||||
the config entry is disabled, enable devices in the registry that are associated
|
the config entry is disabled, enable devices in the registry that are associated
|
||||||
with a config entry when the config entry is enabled and the devices are marked
|
with a config entry when the config entry is enabled and the devices are marked
|
||||||
DISABLED_CONFIG_ENTRY.
|
DISABLED_CONFIG_ENTRY.
|
||||||
|
Only disable a device if all associated config entries are disabled.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
devices = async_entries_for_config_entry(registry, config_entry.entry_id)
|
devices = async_entries_for_config_entry(registry, config_entry.entry_id)
|
||||||
@ -681,10 +682,20 @@ def async_config_entry_disabled_by_changed(
|
|||||||
registry.async_update_device(device.id, disabled_by=None)
|
registry.async_update_device(device.id, disabled_by=None)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
enabled_config_entries = {
|
||||||
|
entry.entry_id
|
||||||
|
for entry in registry.hass.config_entries.async_entries()
|
||||||
|
if not entry.disabled_by
|
||||||
|
}
|
||||||
|
|
||||||
for device in devices:
|
for device in devices:
|
||||||
if device.disabled:
|
if device.disabled:
|
||||||
# Device already disabled, do not overwrite
|
# Device already disabled, do not overwrite
|
||||||
continue
|
continue
|
||||||
|
if len(device.config_entries) > 1 and device.config_entries.intersection(
|
||||||
|
enabled_config_entries
|
||||||
|
):
|
||||||
|
continue
|
||||||
registry.async_update_device(device.id, disabled_by=DISABLED_CONFIG_ENTRY)
|
registry.async_update_device(device.id, disabled_by=DISABLED_CONFIG_ENTRY)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1253,3 +1253,45 @@ async def test_disable_config_entry_disables_devices(hass, registry):
|
|||||||
entry2 = registry.async_get(entry2.id)
|
entry2 = registry.async_get(entry2.id)
|
||||||
assert entry2.disabled
|
assert entry2.disabled
|
||||||
assert entry2.disabled_by == device_registry.DISABLED_USER
|
assert entry2.disabled_by == device_registry.DISABLED_USER
|
||||||
|
|
||||||
|
|
||||||
|
async def test_only_disable_device_if_all_config_entries_are_disabled(hass, registry):
|
||||||
|
"""Test that we only disable device if all related config entries are disabled."""
|
||||||
|
config_entry1 = MockConfigEntry(domain="light")
|
||||||
|
config_entry1.add_to_hass(hass)
|
||||||
|
config_entry2 = MockConfigEntry(domain="light")
|
||||||
|
config_entry2.add_to_hass(hass)
|
||||||
|
|
||||||
|
registry.async_get_or_create(
|
||||||
|
config_entry_id=config_entry1.entry_id,
|
||||||
|
connections={(device_registry.CONNECTION_NETWORK_MAC, "12:34:56:AB:CD:EF")},
|
||||||
|
)
|
||||||
|
entry1 = registry.async_get_or_create(
|
||||||
|
config_entry_id=config_entry2.entry_id,
|
||||||
|
connections={(device_registry.CONNECTION_NETWORK_MAC, "12:34:56:AB:CD:EF")},
|
||||||
|
)
|
||||||
|
assert len(entry1.config_entries) == 2
|
||||||
|
assert not entry1.disabled
|
||||||
|
|
||||||
|
await hass.config_entries.async_set_disabled_by(
|
||||||
|
config_entry1.entry_id, config_entries.DISABLED_USER
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
entry1 = registry.async_get(entry1.id)
|
||||||
|
assert not entry1.disabled
|
||||||
|
|
||||||
|
await hass.config_entries.async_set_disabled_by(
|
||||||
|
config_entry2.entry_id, config_entries.DISABLED_USER
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
entry1 = registry.async_get(entry1.id)
|
||||||
|
assert entry1.disabled
|
||||||
|
assert entry1.disabled_by == device_registry.DISABLED_CONFIG_ENTRY
|
||||||
|
|
||||||
|
await hass.config_entries.async_set_disabled_by(config_entry1.entry_id, None)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
entry1 = registry.async_get(entry1.id)
|
||||||
|
assert not entry1.disabled
|
||||||
|
Loading…
x
Reference in New Issue
Block a user