From b47983ac27f19906d6ad20bbd41343161726e885 Mon Sep 17 00:00:00 2001 From: ecederstrand Date: Tue, 26 Mar 2024 10:58:09 +0100 Subject: [PATCH] feat: Simplify move/copy to folder inbox rul action creation --- docs/index.md | 5 ++++- exchangelib/fields.py | 16 ++++++++++++++++ exchangelib/properties.py | 5 +++-- tests/test_account.py | 3 +-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index 35a6dcb3..7bb2a204 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1943,7 +1943,10 @@ rule = Rule( is_enabled=True, conditions=Conditions(contains_sender_strings=["sender_example"]), exceptions=Exceptions(), - actions=Actions(delete=True), + actions=Actions( + move_to_folder=a.trash, + mark_as_read=True, + ), ) # Create rule diff --git a/exchangelib/fields.py b/exchangelib/fields.py index 3e59d5e3..c5dcb912 100644 --- a/exchangelib/fields.py +++ b/exchangelib/fields.py @@ -1798,3 +1798,19 @@ class SensitivityField(ChoiceField): def __init__(self, *args, **kwargs): kwargs["choices"] = SENSITIVITY_CHOICES super().__init__(*args, **kwargs) + + +class FolderActionField(EWSElementField): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def clean(self, value, version=None): + from .folders import DistinguishedFolderId, Folder + + if isinstance(value, Folder): + folder_id = value.to_id() + if isinstance(folder_id, DistinguishedFolderId): + value = self.value_cls(distinguished_folder_id=folder_id) + else: + value = self.value_cls(folder_id=folder_id) + return super().clean(value, version=version) diff --git a/exchangelib/properties.py b/exchangelib/properties.py index f7c0d70f..17d64785 100644 --- a/exchangelib/properties.py +++ b/exchangelib/properties.py @@ -38,6 +38,7 @@ Field, FieldPath, FlaggedForActionField, + FolderActionField, FreeBusyStatusField, GenericEventListField, IdElementField, @@ -2244,13 +2245,13 @@ class Actions(EWSElement): ELEMENT_NAME = "Actions" assign_categories = CharListField(field_uri="AssignCategories") - copy_to_folder = EWSElementField(value_cls=CopyToFolder) + copy_to_folder = FolderActionField(value_cls=CopyToFolder) delete = BooleanField(field_uri="Delete") forward_as_attachment_to_recipients = AddressListField(field_uri="ForwardAsAttachmentToRecipients") forward_to_recipients = AddressListField(field_uri="ForwardToRecipients") mark_importance = ImportanceField(field_uri="MarkImportance") mark_as_read = BooleanField(field_uri="MarkAsRead") - move_to_folder = EWSElementField(value_cls=MoveToFolder) + move_to_folder = FolderActionField(value_cls=MoveToFolder) permanent_delete = BooleanField(field_uri="PermanentDelete") redirect_to_recipients = AddressListField(field_uri="RedirectToRecipients") send_sms_alert_to_recipients = AddressListField(field_uri="SendSMSAlertToRecipients") diff --git a/tests/test_account.py b/tests/test_account.py index 2b4b6375..2b513eb5 100644 --- a/tests/test_account.py +++ b/tests/test_account.py @@ -22,7 +22,6 @@ Actions, Address, Conditions, - CopyToFolder, DelegatePermissions, DelegateUser, Exceptions, @@ -375,7 +374,7 @@ def test_basic_inbox_rule(self): def test_all_inbox_rule_actions(self): for action_name, action in { "assign_categories": ["foo", "bar"], - "copy_to_folder": CopyToFolder(distinguished_folder_id=self.account.trash.to_id()), + "copy_to_folder": self.account.trash, "delete": True, # Cannot be random. False would be a no-op action "forward_as_attachment_to_recipients": [Address(email_address=get_random_email())], "mark_importance": get_random_choice(