diff --git a/exchangelib/account.py b/exchangelib/account.py index 402f5ea1..ebf26270 100644 --- a/exchangelib/account.py +++ b/exchangelib/account.py @@ -6,7 +6,7 @@ from .autodiscover import Autodiscovery from .configuration import Configuration from .credentials import ACCESS_TYPES, DELEGATE, IMPERSONATION -from .errors import ErrorItemNotFound, InvalidEnumValue, InvalidTypeError, ResponseMessageError, UnknownTimeZone +from .errors import InvalidEnumValue, InvalidTypeError, ResponseMessageError, UnknownTimeZone from .ewsdatetime import UTC, EWSTimeZone from .fields import FieldPath, TextField from .folders import ( @@ -787,16 +787,11 @@ def set_rule(self, rule: Rule): def delete_rule(self, rule: Rule): """Delete an Inbox rule. - :param rule: The rule to delete. Must have ID or 'display_name'. + :param rule: The rule to delete. Must have an ID. :return: None if success, else raises an error. """ if not rule.id: - if not rule.display_name: - raise ValueError("Rule must have ID or display_name") - try: - rule = {i.display_name: i for i in GetInboxRules(account=self).call()}[rule.display_name] - except KeyError: - raise ErrorItemNotFound(f"No rule with name {rule.display_name!r}") + raise ValueError("Rule must have an ID") DeleteInboxRule(account=self).get(rule=rule) rule.id = None diff --git a/exchangelib/properties.py b/exchangelib/properties.py index 17d64785..26352024 100644 --- a/exchangelib/properties.py +++ b/exchangelib/properties.py @@ -2289,6 +2289,12 @@ def __init__(self, **kwargs): exceptions = EWSElementField(value_cls=Exceptions) actions = EWSElementField(value_cls=Actions, is_required=True) + @classmethod + def from_xml(cls, elem, account): + res = super().from_xml(elem=elem, account=account) + res.account = account + return res + def save(self): if self.id is None: self.account.create_rule(self) @@ -2297,6 +2303,10 @@ def save(self): return self def delete(self): + if self.is_enabled is False: + # Cannot delete a disabled rule - server throws 'ErrorItemNotFound' + self.is_enabled = True + self.save() self.account.delete_rule(self) diff --git a/tests/common.py b/tests/common.py index d262ecb3..cde04c3e 100644 --- a/tests/common.py +++ b/tests/common.py @@ -161,7 +161,7 @@ def wipe_test_account(self): # Deletes up all deletable items in the test account. Not run in a normal test run self.account.root.wipe() for rule in self.account.rules: - self.account.delete_rule(rule) + rule.delete() def bulk_delete(self, ids): # Clean up items and check return values