Skip to content

Commit

Permalink
fix: Support deleting disabled rules. Simplify delete_rule() by requi…
Browse files Browse the repository at this point in the history
…ring an ID
  • Loading branch information
ecederstrand committed Mar 26, 2024
1 parent b47983a commit 32bc90a
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 9 deletions.
11 changes: 3 additions & 8 deletions exchangelib/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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

Expand Down
10 changes: 10 additions & 0 deletions exchangelib/properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)


Expand Down
2 changes: 1 addition & 1 deletion tests/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 32bc90a

Please sign in to comment.