@backtomyfuture/exchange-cli-darwin-arm64 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/_internal/Python +0 -0
- package/bin/_internal/Python.framework/Python +0 -0
- package/bin/_internal/Python.framework/Resources/Info.plist +3 -3
- package/bin/_internal/Python.framework/Versions/3.12/Python +0 -0
- package/bin/_internal/Python.framework/Versions/{3.14 → 3.12}/Resources/Info.plist +3 -3
- package/bin/_internal/Python.framework/Versions/Current/Python +0 -0
- package/bin/_internal/Python.framework/Versions/Current/Resources/Info.plist +3 -3
- package/bin/_internal/_cffi_backend.cpython-312-darwin.so +0 -0
- package/bin/_internal/ada92cb5d92a588d1b93__mypyc.cpython-312-darwin.so +0 -0
- package/bin/_internal/base_library.zip +0 -0
- package/bin/_internal/certifi/cacert.pem +0 -631
- package/bin/_internal/charset_normalizer/{md.cpython-314-darwin.so → cd.cpython-312-darwin.so} +0 -0
- package/bin/_internal/charset_normalizer/{cd.cpython-314-darwin.so → md.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{click-8.3.2.dist-info → click-8.4.2.dist-info}/METADATA +1 -1
- package/bin/_internal/click-8.4.2.dist-info/RECORD +40 -0
- package/bin/_internal/cryptography/hazmat/bindings/_rust.abi3.so +0 -0
- package/bin/_internal/{cryptography-46.0.7.dist-info → cryptography-48.0.1.dist-info}/METADATA +7 -36
- package/bin/_internal/{cryptography-46.0.7.dist-info → cryptography-48.0.1.dist-info}/RECORD +137 -122
- package/bin/_internal/{cryptography-46.0.7.dist-info → cryptography-48.0.1.dist-info}/WHEEL +1 -1
- package/bin/_internal/cryptography-48.0.1.dist-info/sboms/cryptography-rust.cyclonedx.json +1362 -0
- package/bin/_internal/cryptography-48.0.1.dist-info/sboms/sbom.json +43 -0
- package/bin/_internal/exchangelib/__init__.py +120 -0
- package/bin/_internal/exchangelib/account.py +896 -0
- package/bin/_internal/exchangelib/attachments.py +268 -0
- package/bin/_internal/exchangelib/autodiscover/__init__.py +24 -0
- package/bin/_internal/exchangelib/autodiscover/cache.py +150 -0
- package/bin/_internal/exchangelib/autodiscover/discovery.py +491 -0
- package/bin/_internal/exchangelib/autodiscover/protocol.py +58 -0
- package/bin/_internal/exchangelib/configuration.py +106 -0
- package/bin/_internal/exchangelib/credentials.py +319 -0
- package/bin/_internal/exchangelib/errors.py +1710 -0
- package/bin/_internal/exchangelib/ewsdatetime.py +309 -0
- package/bin/_internal/exchangelib/extended_properties.py +311 -0
- package/bin/_internal/exchangelib/fields.py +1842 -0
- package/bin/_internal/exchangelib/folders/__init__.py +249 -0
- package/bin/_internal/exchangelib/folders/base.py +954 -0
- package/bin/_internal/exchangelib/folders/collections.py +576 -0
- package/bin/_internal/exchangelib/folders/known_folders.py +856 -0
- package/bin/_internal/exchangelib/folders/queryset.py +187 -0
- package/bin/_internal/exchangelib/folders/roots.py +390 -0
- package/bin/_internal/exchangelib/indexed_properties.py +96 -0
- package/bin/_internal/exchangelib/items/__init__.py +147 -0
- package/bin/_internal/exchangelib/items/base.py +241 -0
- package/bin/_internal/exchangelib/items/calendar_item.py +466 -0
- package/bin/_internal/exchangelib/items/contact.py +263 -0
- package/bin/_internal/exchangelib/items/item.py +413 -0
- package/bin/_internal/exchangelib/items/message.py +201 -0
- package/bin/_internal/exchangelib/items/post.py +38 -0
- package/bin/_internal/exchangelib/items/task.py +139 -0
- package/bin/_internal/exchangelib/properties.py +2364 -0
- package/bin/_internal/exchangelib/protocol.py +823 -0
- package/bin/_internal/exchangelib/queryset.py +691 -0
- package/bin/_internal/exchangelib/recurrence.py +349 -0
- package/bin/_internal/exchangelib/restriction.py +568 -0
- package/bin/_internal/exchangelib/services/__init__.py +117 -0
- package/bin/_internal/exchangelib/services/archive_item.py +33 -0
- package/bin/_internal/exchangelib/services/common.py +983 -0
- package/bin/_internal/exchangelib/services/convert_id.py +45 -0
- package/bin/_internal/exchangelib/services/copy_item.py +7 -0
- package/bin/_internal/exchangelib/services/create_attachment.py +34 -0
- package/bin/_internal/exchangelib/services/create_folder.py +45 -0
- package/bin/_internal/exchangelib/services/create_item.py +97 -0
- package/bin/_internal/exchangelib/services/create_user_configuration.py +19 -0
- package/bin/_internal/exchangelib/services/delete_attachment.py +28 -0
- package/bin/_internal/exchangelib/services/delete_folder.py +21 -0
- package/bin/_internal/exchangelib/services/delete_item.py +51 -0
- package/bin/_internal/exchangelib/services/delete_user_configuration.py +19 -0
- package/bin/_internal/exchangelib/services/empty_folder.py +25 -0
- package/bin/_internal/exchangelib/services/expand_dl.py +21 -0
- package/bin/_internal/exchangelib/services/export_items.py +27 -0
- package/bin/_internal/exchangelib/services/find_folder.py +80 -0
- package/bin/_internal/exchangelib/services/find_item.py +112 -0
- package/bin/_internal/exchangelib/services/find_people.py +106 -0
- package/bin/_internal/exchangelib/services/get_attachment.py +117 -0
- package/bin/_internal/exchangelib/services/get_delegate.py +45 -0
- package/bin/_internal/exchangelib/services/get_events.py +39 -0
- package/bin/_internal/exchangelib/services/get_folder.py +65 -0
- package/bin/_internal/exchangelib/services/get_item.py +41 -0
- package/bin/_internal/exchangelib/services/get_mail_tips.py +43 -0
- package/bin/_internal/exchangelib/services/get_persona.py +31 -0
- package/bin/_internal/exchangelib/services/get_room_lists.py +21 -0
- package/bin/_internal/exchangelib/services/get_rooms.py +21 -0
- package/bin/_internal/exchangelib/services/get_searchable_mailboxes.py +48 -0
- package/bin/_internal/exchangelib/services/get_server_time_zones.py +39 -0
- package/bin/_internal/exchangelib/services/get_streaming_events.py +102 -0
- package/bin/_internal/exchangelib/services/get_user_availability.py +67 -0
- package/bin/_internal/exchangelib/services/get_user_configuration.py +43 -0
- package/bin/_internal/exchangelib/services/get_user_oof_settings.py +40 -0
- package/bin/_internal/exchangelib/services/get_user_settings.py +87 -0
- package/bin/_internal/exchangelib/services/inbox_rules.py +104 -0
- package/bin/_internal/exchangelib/services/mark_as_junk.py +27 -0
- package/bin/_internal/exchangelib/services/move_folder.py +27 -0
- package/bin/_internal/exchangelib/services/move_item.py +28 -0
- package/bin/_internal/exchangelib/services/resolve_names.py +104 -0
- package/bin/_internal/exchangelib/services/send_item.py +26 -0
- package/bin/_internal/exchangelib/services/send_notification.py +43 -0
- package/bin/_internal/exchangelib/services/set_user_oof_settings.py +34 -0
- package/bin/_internal/exchangelib/services/subscribe.py +125 -0
- package/bin/_internal/exchangelib/services/sync_folder_hierarchy.py +95 -0
- package/bin/_internal/exchangelib/services/sync_folder_items.py +77 -0
- package/bin/_internal/exchangelib/services/unsubscribe.py +21 -0
- package/bin/_internal/exchangelib/services/update_folder.py +158 -0
- package/bin/_internal/exchangelib/services/update_item.py +113 -0
- package/bin/_internal/exchangelib/services/update_user_configuration.py +17 -0
- package/bin/_internal/exchangelib/services/upload_items.py +47 -0
- package/bin/_internal/exchangelib/settings.py +88 -0
- package/bin/_internal/exchangelib/transport.py +214 -0
- package/bin/_internal/exchangelib/util.py +894 -0
- package/bin/_internal/exchangelib/version.py +320 -0
- package/bin/_internal/exchangelib/winzone.py +662 -0
- package/bin/_internal/exchangelib-5.6.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/exchangelib-5.6.0.dist-info/METADATA +77 -0
- package/bin/_internal/exchangelib-5.6.0.dist-info/RECORD +184 -0
- package/bin/_internal/exchangelib-5.6.0.dist-info/licenses/LICENSE +21 -0
- package/bin/_internal/exchangelib-5.6.0.dist-info/top_level.txt +1 -0
- package/bin/_internal/libcrypto.3.dylib +0 -0
- package/bin/_internal/libssl.3.dylib +0 -0
- package/bin/_internal/lxml/_elementpath.cpython-312-darwin.so +0 -0
- package/bin/_internal/lxml/builder.cpython-312-darwin.so +0 -0
- package/bin/_internal/lxml/{etree.cpython-314-darwin.so → etree.cpython-312-darwin.so} +0 -0
- package/bin/_internal/lxml/html/_difflib.cpython-312-darwin.so +0 -0
- package/bin/_internal/lxml/html/diff.cpython-312-darwin.so +0 -0
- package/bin/_internal/lxml/{objectify.cpython-314-darwin.so → objectify.cpython-312-darwin.so} +0 -0
- package/bin/_internal/lxml/sax.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_asyncio.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/termios.cpython-314-darwin.so → python3.12/lib-dynload/_bisect.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_sha2.cpython-314-darwin.so → python3.12/lib-dynload/_blake2.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_bz2.cpython-314-darwin.so → python3.12/lib-dynload/_bz2.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_codecs_cn.cpython-314-darwin.so → python3.12/lib-dynload/_codecs_cn.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_codecs_hk.cpython-314-darwin.so → python3.12/lib-dynload/_codecs_hk.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_interpqueues.cpython-314-darwin.so → python3.12/lib-dynload/_codecs_iso2022.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_codecs_jp.cpython-314-darwin.so → python3.12/lib-dynload/_codecs_jp.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_codecs_kr.cpython-314-darwin.so → python3.12/lib-dynload/_codecs_kr.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_codecs_tw.cpython-314-darwin.so → python3.12/lib-dynload/_codecs_tw.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_statistics.cpython-314-darwin.so → python3.12/lib-dynload/_contextvars.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_csv.cpython-314-darwin.so → python3.12/lib-dynload/_csv.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/_ctypes.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_datetime.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_dbm.cpython-314-darwin.so → python3.12/lib-dynload/_dbm.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/_decimal.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_elementtree.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_hashlib.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_heapq.cpython-314-darwin.so → python3.12/lib-dynload/_heapq.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/_json.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_lzma.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_md5.cpython-314-darwin.so → python3.12/lib-dynload/_md5.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/_multibytecodec.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_multiprocessing.cpython-314-darwin.so → python3.12/lib-dynload/_multiprocessing.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/_opcode.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_pickle.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_bisect.cpython-314-darwin.so → python3.12/lib-dynload/_posixshmem.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_posixsubprocess.cpython-314-darwin.so → python3.12/lib-dynload/_posixsubprocess.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_queue.cpython-314-darwin.so → python3.12/lib-dynload/_queue.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_random.cpython-314-darwin.so → python3.12/lib-dynload/_random.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_scproxy.cpython-314-darwin.so → python3.12/lib-dynload/_scproxy.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_sha1.cpython-314-darwin.so → python3.12/lib-dynload/_sha1.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/_sha2.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_blake2.cpython-314-darwin.so → python3.12/lib-dynload/_sha3.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/_socket.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_ssl.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_posixshmem.cpython-314-darwin.so → python3.12/lib-dynload/_statistics.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/_struct.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_uuid.cpython-314-darwin.so → python3.12/lib-dynload/_uuid.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_zoneinfo.cpython-314-darwin.so → python3.12/lib-dynload/_zoneinfo.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/array.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/binascii.cpython-314-darwin.so → python3.12/lib-dynload/binascii.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/fcntl.cpython-314-darwin.so → python3.12/lib-dynload/fcntl.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/grp.cpython-314-darwin.so → python3.12/lib-dynload/grp.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/math.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/_sha3.cpython-314-darwin.so → python3.12/lib-dynload/mmap.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/pyexpat.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/readline.cpython-312-darwin.so +0 -0
- package/bin/_internal/{python3.14/lib-dynload/resource.cpython-314-darwin.so → python3.12/lib-dynload/resource.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/select.cpython-314-darwin.so → python3.12/lib-dynload/select.cpython-312-darwin.so} +0 -0
- package/bin/_internal/{python3.14/lib-dynload/syslog.cpython-314-darwin.so → python3.12/lib-dynload/syslog.cpython-312-darwin.so} +0 -0
- package/bin/_internal/python3.12/lib-dynload/termios.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/unicodedata.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/zlib.cpython-312-darwin.so +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Casablanca +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/El_Aaiun +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Edmonton +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Vancouver +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Yellowknife +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Saigon +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Mountain +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Pacific +0 -0
- package/bin/_internal/tzdata/zoneinfo/leapseconds +4 -4
- package/bin/_internal/tzdata/zoneinfo/tzdata.zi +11 -131
- package/bin/_internal/tzdata/zoneinfo/zone.tab +2 -2
- package/bin/_internal/tzdata/zoneinfo/zone1970.tab +2 -2
- package/bin/_internal/tzdata/zoneinfo/zonenow.tab +8 -2
- package/bin/exchange-cli +0 -0
- package/package.json +10 -7
- package/bin/_internal/81d243bd2c585b0f4821__mypyc.cpython-314-darwin.so +0 -0
- package/bin/_internal/Python.framework/Versions/3.14/Python +0 -0
- package/bin/_internal/_cffi_backend.cpython-314-darwin.so +0 -0
- package/bin/_internal/click-8.3.2.dist-info/RECORD +0 -40
- package/bin/_internal/liblzma.5.dylib +0 -0
- package/bin/_internal/libmpdec.4.dylib +0 -0
- package/bin/_internal/libzstd.1.dylib +0 -0
- package/bin/_internal/lxml/_elementpath.cpython-314-darwin.so +0 -0
- package/bin/_internal/lxml/builder.cpython-314-darwin.so +0 -0
- package/bin/_internal/lxml/html/_difflib.cpython-314-darwin.so +0 -0
- package/bin/_internal/lxml/html/diff.cpython-314-darwin.so +0 -0
- package/bin/_internal/lxml/sax.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_asyncio.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_codecs_iso2022.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_ctypes.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_decimal.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_elementtree.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_hashlib.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_hmac.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_interpreters.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_json.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_lzma.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_multibytecodec.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_pickle.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_socket.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_ssl.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_struct.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/_zstd.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/array.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/math.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/mmap.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/pyexpat.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/readline.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/unicodedata.cpython-314-darwin.so +0 -0
- package/bin/_internal/python3.14/lib-dynload/zlib.cpython-314-darwin.so +0 -0
- package/bin/_internal/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/INSTALLER +0 -1
- package/bin/_internal/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA +0 -133
- package/bin/_internal/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD +0 -21
- package/bin/_internal/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/REQUESTED +0 -0
- package/bin/_internal/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE +0 -73
- package/bin/_internal/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt +0 -1
- /package/bin/_internal/{click-8.3.2.dist-info → click-8.4.2.dist-info}/INSTALLER +0 -0
- /package/bin/_internal/{click-8.3.2.dist-info → click-8.4.2.dist-info}/WHEEL +0 -0
- /package/bin/_internal/{click-8.3.2.dist-info → click-8.4.2.dist-info}/licenses/LICENSE.txt +0 -0
- /package/bin/_internal/{cryptography-46.0.7.dist-info → cryptography-48.0.1.dist-info}/INSTALLER +0 -0
- /package/bin/_internal/{cryptography-46.0.7.dist-info → cryptography-48.0.1.dist-info}/licenses/LICENSE +0 -0
- /package/bin/_internal/{cryptography-46.0.7.dist-info → cryptography-48.0.1.dist-info}/licenses/LICENSE.APACHE +0 -0
- /package/bin/_internal/{cryptography-46.0.7.dist-info → cryptography-48.0.1.dist-info}/licenses/LICENSE.BSD +0 -0
- /package/bin/_internal/{setuptools/_vendor/importlib_metadata-8.7.1.dist-info → exchangelib-5.6.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from ..fields import Base64Field, BooleanField, CharField, EWSElementField, MailboxField, MailboxListField, TextField
|
|
4
|
+
from ..properties import ReferenceItemId, ReminderMessageData
|
|
5
|
+
from ..util import require_account, require_id
|
|
6
|
+
from ..version import EXCHANGE_2013, EXCHANGE_2013_SP1
|
|
7
|
+
from .base import AUTO_RESOLVE, SEND_AND_SAVE_COPY, SEND_ONLY, SEND_TO_NONE, BaseReplyItem
|
|
8
|
+
from .item import Item
|
|
9
|
+
|
|
10
|
+
log = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Message(Item):
|
|
14
|
+
"""MSDN:
|
|
15
|
+
https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/message-ex15websvcsotherref
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
ELEMENT_NAME = "Message"
|
|
19
|
+
|
|
20
|
+
sender = MailboxField(field_uri="message:Sender", is_read_only=True, is_read_only_after_send=True)
|
|
21
|
+
to_recipients = MailboxListField(
|
|
22
|
+
field_uri="message:ToRecipients", is_read_only_after_send=True, is_searchable=False
|
|
23
|
+
)
|
|
24
|
+
cc_recipients = MailboxListField(
|
|
25
|
+
field_uri="message:CcRecipients", is_read_only_after_send=True, is_searchable=False
|
|
26
|
+
)
|
|
27
|
+
bcc_recipients = MailboxListField(
|
|
28
|
+
field_uri="message:BccRecipients", is_read_only_after_send=True, is_searchable=False
|
|
29
|
+
)
|
|
30
|
+
is_read_receipt_requested = BooleanField(
|
|
31
|
+
field_uri="message:IsReadReceiptRequested", is_required=True, default=False, is_read_only_after_send=True
|
|
32
|
+
)
|
|
33
|
+
is_delivery_receipt_requested = BooleanField(
|
|
34
|
+
field_uri="message:IsDeliveryReceiptRequested", is_required=True, default=False, is_read_only_after_send=True
|
|
35
|
+
)
|
|
36
|
+
conversation_index = Base64Field(field_uri="message:ConversationIndex", is_read_only=True)
|
|
37
|
+
conversation_topic = CharField(field_uri="message:ConversationTopic", is_read_only=True)
|
|
38
|
+
# Rename 'From' to 'author'. We can't use field name 'from' since it's a Python keyword.
|
|
39
|
+
author = MailboxField(field_uri="message:From", is_read_only_after_send=True)
|
|
40
|
+
message_id = TextField(field_uri="message:InternetMessageId", is_read_only_after_send=True)
|
|
41
|
+
is_read = BooleanField(field_uri="message:IsRead", is_required=True, default=False)
|
|
42
|
+
is_response_requested = BooleanField(field_uri="message:IsResponseRequested", default=False, is_required=True)
|
|
43
|
+
references = TextField(field_uri="message:References")
|
|
44
|
+
reply_to = MailboxListField(field_uri="message:ReplyTo", is_read_only_after_send=True, is_searchable=False)
|
|
45
|
+
received_by = MailboxField(field_uri="message:ReceivedBy", is_read_only=True)
|
|
46
|
+
received_representing = MailboxField(field_uri="message:ReceivedRepresenting", is_read_only=True)
|
|
47
|
+
reminder_message_data = EWSElementField(
|
|
48
|
+
field_uri="message:ReminderMessageData",
|
|
49
|
+
value_cls=ReminderMessageData,
|
|
50
|
+
supported_from=EXCHANGE_2013_SP1,
|
|
51
|
+
is_read_only=True,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
@require_account
|
|
55
|
+
def send(
|
|
56
|
+
self,
|
|
57
|
+
save_copy=True,
|
|
58
|
+
copy_to_folder=None,
|
|
59
|
+
conflict_resolution=AUTO_RESOLVE,
|
|
60
|
+
send_meeting_invitations=SEND_TO_NONE,
|
|
61
|
+
):
|
|
62
|
+
from ..services import SendItem
|
|
63
|
+
|
|
64
|
+
# Only sends a message. The message can either be an existing draft stored in EWS or a new message that does
|
|
65
|
+
# not yet exist in EWS.
|
|
66
|
+
if copy_to_folder and not save_copy:
|
|
67
|
+
raise AttributeError("'save_copy' must be True when 'copy_to_folder' is set")
|
|
68
|
+
if save_copy and not copy_to_folder:
|
|
69
|
+
copy_to_folder = self.account.sent # 'Sent' is default EWS behaviour
|
|
70
|
+
if self.id:
|
|
71
|
+
SendItem(account=self.account).get(items=[self], saved_item_folder=copy_to_folder)
|
|
72
|
+
# The item will be deleted from the original folder
|
|
73
|
+
self._id = None
|
|
74
|
+
self.folder = copy_to_folder
|
|
75
|
+
return None
|
|
76
|
+
|
|
77
|
+
# New message
|
|
78
|
+
if copy_to_folder:
|
|
79
|
+
# This would better be done via send_and_save() but let's just support it here
|
|
80
|
+
self.folder = copy_to_folder
|
|
81
|
+
return self.send_and_save(
|
|
82
|
+
conflict_resolution=conflict_resolution, send_meeting_invitations=send_meeting_invitations
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if self.account.version.build < EXCHANGE_2013 and self.attachments:
|
|
86
|
+
# At least some versions prior to Exchange 2013 can't send attachments immediately. You need to first save,
|
|
87
|
+
# then attach, then send. This is done in send_and_save(). send() will delete the item again.
|
|
88
|
+
self.send_and_save(
|
|
89
|
+
conflict_resolution=conflict_resolution, send_meeting_invitations=send_meeting_invitations
|
|
90
|
+
)
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
self._create(message_disposition=SEND_ONLY, send_meeting_invitations=send_meeting_invitations)
|
|
94
|
+
return None
|
|
95
|
+
|
|
96
|
+
def send_and_save(
|
|
97
|
+
self, update_fields=None, conflict_resolution=AUTO_RESOLVE, send_meeting_invitations=SEND_TO_NONE
|
|
98
|
+
):
|
|
99
|
+
# Sends Message and saves a copy in the parent folder. Does not return an ItemId.
|
|
100
|
+
if self.id:
|
|
101
|
+
return self._update(
|
|
102
|
+
update_fieldnames=update_fields,
|
|
103
|
+
message_disposition=SEND_AND_SAVE_COPY,
|
|
104
|
+
conflict_resolution=conflict_resolution,
|
|
105
|
+
send_meeting_invitations=send_meeting_invitations,
|
|
106
|
+
)
|
|
107
|
+
if self.account.version.build < EXCHANGE_2013 and self.attachments:
|
|
108
|
+
# At least some versions prior to Exchange 2013 can't send-and-save attachments immediately. You need
|
|
109
|
+
# to first save, then attach, then send. This is done in save().
|
|
110
|
+
self.save(
|
|
111
|
+
update_fields=update_fields,
|
|
112
|
+
conflict_resolution=conflict_resolution,
|
|
113
|
+
send_meeting_invitations=send_meeting_invitations,
|
|
114
|
+
)
|
|
115
|
+
return self.send(
|
|
116
|
+
save_copy=False,
|
|
117
|
+
conflict_resolution=conflict_resolution,
|
|
118
|
+
send_meeting_invitations=send_meeting_invitations,
|
|
119
|
+
)
|
|
120
|
+
return self._create(message_disposition=SEND_AND_SAVE_COPY, send_meeting_invitations=send_meeting_invitations)
|
|
121
|
+
|
|
122
|
+
@require_id
|
|
123
|
+
def create_reply(self, subject, body, to_recipients=None, cc_recipients=None, bcc_recipients=None, author=None):
|
|
124
|
+
if not to_recipients:
|
|
125
|
+
if not self.author:
|
|
126
|
+
raise ValueError("'to_recipients' must be set when message has no 'author'")
|
|
127
|
+
to_recipients = [self.author]
|
|
128
|
+
return ReplyToItem(
|
|
129
|
+
account=self.account,
|
|
130
|
+
reference_item_id=ReferenceItemId(id=self.id, changekey=self.changekey),
|
|
131
|
+
subject=subject,
|
|
132
|
+
new_body=body,
|
|
133
|
+
to_recipients=to_recipients,
|
|
134
|
+
cc_recipients=cc_recipients,
|
|
135
|
+
bcc_recipients=bcc_recipients,
|
|
136
|
+
author=author,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
def reply(self, subject, body, to_recipients=None, cc_recipients=None, bcc_recipients=None, author=None):
|
|
140
|
+
return self.create_reply(subject, body, to_recipients, cc_recipients, bcc_recipients, author).send()
|
|
141
|
+
|
|
142
|
+
@require_id
|
|
143
|
+
def create_reply_all(self, subject, body, author=None):
|
|
144
|
+
me = MailboxField().clean(self.account.primary_smtp_address.lower())
|
|
145
|
+
to_recipients = set(self.to_recipients or [])
|
|
146
|
+
to_recipients.discard(me)
|
|
147
|
+
cc_recipients = set(self.cc_recipients or [])
|
|
148
|
+
cc_recipients.discard(me)
|
|
149
|
+
bcc_recipients = set(self.bcc_recipients or [])
|
|
150
|
+
bcc_recipients.discard(me)
|
|
151
|
+
if self.author:
|
|
152
|
+
to_recipients.add(self.author)
|
|
153
|
+
return ReplyAllToItem(
|
|
154
|
+
account=self.account,
|
|
155
|
+
reference_item_id=ReferenceItemId(id=self.id, changekey=self.changekey),
|
|
156
|
+
subject=subject,
|
|
157
|
+
new_body=body,
|
|
158
|
+
to_recipients=list(to_recipients),
|
|
159
|
+
cc_recipients=list(cc_recipients),
|
|
160
|
+
bcc_recipients=list(bcc_recipients),
|
|
161
|
+
author=author,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
def reply_all(self, subject, body, author=None):
|
|
165
|
+
return self.create_reply_all(subject, body, author).send()
|
|
166
|
+
|
|
167
|
+
def mark_as_junk(self, is_junk=True, move_item=True):
|
|
168
|
+
"""Mark or un-marks items as junk email.
|
|
169
|
+
|
|
170
|
+
:param is_junk: If True, the sender will be added from the blocked sender list. Otherwise, the sender will be
|
|
171
|
+
removed.
|
|
172
|
+
:param move_item: If true, the item will be moved to the junk folder.
|
|
173
|
+
:return:
|
|
174
|
+
"""
|
|
175
|
+
from ..services import MarkAsJunk
|
|
176
|
+
|
|
177
|
+
res = MarkAsJunk(account=self.account).get(
|
|
178
|
+
items=[self], is_junk=is_junk, move_item=move_item, expect_result=None
|
|
179
|
+
)
|
|
180
|
+
if res is None:
|
|
181
|
+
return
|
|
182
|
+
self.folder = self.account.junk if is_junk else self.account.inbox
|
|
183
|
+
self.id, self.changekey = res
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class ReplyToItem(BaseReplyItem):
|
|
187
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/replytoitem"""
|
|
188
|
+
|
|
189
|
+
ELEMENT_NAME = "ReplyToItem"
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class ReplyAllToItem(BaseReplyItem):
|
|
193
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/replyalltoitem"""
|
|
194
|
+
|
|
195
|
+
ELEMENT_NAME = "ReplyAllToItem"
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
class ForwardItem(BaseReplyItem):
|
|
199
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/forwarditem"""
|
|
200
|
+
|
|
201
|
+
ELEMENT_NAME = "ForwardItem"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from ..fields import BodyField, DateTimeField, MailboxField, TextField
|
|
4
|
+
from .item import Item
|
|
5
|
+
from .message import Message
|
|
6
|
+
|
|
7
|
+
log = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PostItem(Item):
|
|
11
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/postitem"""
|
|
12
|
+
|
|
13
|
+
ELEMENT_NAME = "PostItem"
|
|
14
|
+
|
|
15
|
+
conversation_index = Message.FIELDS["conversation_index"]
|
|
16
|
+
conversation_topic = Message.FIELDS["conversation_topic"]
|
|
17
|
+
|
|
18
|
+
author = Message.FIELDS["author"]
|
|
19
|
+
message_id = Message.FIELDS["message_id"]
|
|
20
|
+
is_read = Message.FIELDS["is_read"]
|
|
21
|
+
|
|
22
|
+
posted_time = DateTimeField(field_uri="postitem:PostedTime", is_read_only=True)
|
|
23
|
+
references = TextField(field_uri="message:References")
|
|
24
|
+
sender = MailboxField(field_uri="message:Sender", is_read_only=True, is_read_only_after_send=True)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class PostReplyItem(Item):
|
|
28
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/postreplyitem"""
|
|
29
|
+
|
|
30
|
+
ELEMENT_NAME = "PostReplyItem"
|
|
31
|
+
|
|
32
|
+
# This element only has Item fields up to, and including, 'culture'
|
|
33
|
+
# TDO: Plus all message fields
|
|
34
|
+
new_body = BodyField(field_uri="NewBodyContent") # Accepts and returns Body or HTMLBody instances
|
|
35
|
+
|
|
36
|
+
culture_idx = Item.FIELDS.index_by_name("culture")
|
|
37
|
+
sender_idx = Message.FIELDS.index_by_name("sender")
|
|
38
|
+
FIELDS = Item.FIELDS[: culture_idx + 1] + Message.FIELDS[sender_idx:]
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import logging
|
|
3
|
+
from decimal import Decimal
|
|
4
|
+
|
|
5
|
+
from ..ewsdatetime import UTC, EWSDateTime
|
|
6
|
+
from ..fields import (
|
|
7
|
+
BooleanField,
|
|
8
|
+
CharField,
|
|
9
|
+
Choice,
|
|
10
|
+
ChoiceField,
|
|
11
|
+
DateTimeBackedDateField,
|
|
12
|
+
DateTimeField,
|
|
13
|
+
DecimalField,
|
|
14
|
+
IntegerField,
|
|
15
|
+
TaskRecurrenceField,
|
|
16
|
+
TextField,
|
|
17
|
+
TextListField,
|
|
18
|
+
)
|
|
19
|
+
from .item import Item
|
|
20
|
+
|
|
21
|
+
log = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Task(Item):
|
|
25
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/task"""
|
|
26
|
+
|
|
27
|
+
ELEMENT_NAME = "Task"
|
|
28
|
+
NOT_STARTED = "NotStarted"
|
|
29
|
+
COMPLETED = "Completed"
|
|
30
|
+
|
|
31
|
+
actual_work = IntegerField(field_uri="task:ActualWork", min=0)
|
|
32
|
+
assigned_time = DateTimeField(field_uri="task:AssignedTime", is_read_only=True)
|
|
33
|
+
billing_information = TextField(field_uri="task:BillingInformation")
|
|
34
|
+
change_count = IntegerField(field_uri="task:ChangeCount", is_read_only=True, min=0)
|
|
35
|
+
companies = TextListField(field_uri="task:Companies")
|
|
36
|
+
# 'complete_date' can be set, but is ignored by the server, which sets it to now()
|
|
37
|
+
complete_date = DateTimeField(field_uri="task:CompleteDate", is_read_only=True)
|
|
38
|
+
contacts = TextListField(field_uri="task:Contacts")
|
|
39
|
+
delegation_state = ChoiceField(
|
|
40
|
+
field_uri="task:DelegationState",
|
|
41
|
+
choices={
|
|
42
|
+
Choice("NoMatch"),
|
|
43
|
+
Choice("OwnNew"),
|
|
44
|
+
Choice("Owned"),
|
|
45
|
+
Choice("Accepted"),
|
|
46
|
+
Choice("Declined"),
|
|
47
|
+
Choice("Max"),
|
|
48
|
+
},
|
|
49
|
+
is_read_only=True,
|
|
50
|
+
)
|
|
51
|
+
delegator = CharField(field_uri="task:Delegator", is_read_only=True)
|
|
52
|
+
due_date = DateTimeBackedDateField(field_uri="task:DueDate")
|
|
53
|
+
is_editable = BooleanField(field_uri="task:IsAssignmentEditable", is_read_only=True)
|
|
54
|
+
is_complete = BooleanField(field_uri="task:IsComplete", is_read_only=True)
|
|
55
|
+
is_recurring = BooleanField(field_uri="task:IsRecurring", is_read_only=True)
|
|
56
|
+
is_team_task = BooleanField(field_uri="task:IsTeamTask", is_read_only=True)
|
|
57
|
+
mileage = TextField(field_uri="task:Mileage")
|
|
58
|
+
owner = CharField(field_uri="task:Owner", is_read_only=True)
|
|
59
|
+
percent_complete = DecimalField(
|
|
60
|
+
field_uri="task:PercentComplete",
|
|
61
|
+
is_required=True,
|
|
62
|
+
default=Decimal(0.0),
|
|
63
|
+
min=Decimal(0),
|
|
64
|
+
max=Decimal(100),
|
|
65
|
+
is_searchable=False,
|
|
66
|
+
)
|
|
67
|
+
recurrence = TaskRecurrenceField(field_uri="task:Recurrence", is_searchable=False)
|
|
68
|
+
start_date = DateTimeBackedDateField(field_uri="task:StartDate")
|
|
69
|
+
status = ChoiceField(
|
|
70
|
+
field_uri="task:Status",
|
|
71
|
+
choices={
|
|
72
|
+
Choice(NOT_STARTED),
|
|
73
|
+
Choice("InProgress"),
|
|
74
|
+
Choice(COMPLETED),
|
|
75
|
+
Choice("WaitingOnOthers"),
|
|
76
|
+
Choice("Deferred"),
|
|
77
|
+
},
|
|
78
|
+
is_required=True,
|
|
79
|
+
is_searchable=False,
|
|
80
|
+
default=NOT_STARTED,
|
|
81
|
+
)
|
|
82
|
+
status_description = CharField(field_uri="task:StatusDescription", is_read_only=True)
|
|
83
|
+
total_work = IntegerField(field_uri="task:TotalWork", min=0)
|
|
84
|
+
|
|
85
|
+
# O365 throws ErrorInternalServerError "[0x004f0102] MapiReplyToBlob" if UniqueBody is requested
|
|
86
|
+
unique_body_idx = Item.FIELDS.index_by_name("unique_body")
|
|
87
|
+
FIELDS = Item.FIELDS[:unique_body_idx] + Item.FIELDS[unique_body_idx + 1 :]
|
|
88
|
+
|
|
89
|
+
def clean(self, version=None):
|
|
90
|
+
super().clean(version=version)
|
|
91
|
+
if self.due_date and self.start_date and self.due_date < self.start_date:
|
|
92
|
+
log.warning(
|
|
93
|
+
"'due_date' must be greater than 'start_date' (%s vs %s). Resetting 'due_date'",
|
|
94
|
+
self.due_date,
|
|
95
|
+
self.start_date,
|
|
96
|
+
)
|
|
97
|
+
self.due_date = self.start_date
|
|
98
|
+
if self.complete_date:
|
|
99
|
+
if self.status != self.COMPLETED:
|
|
100
|
+
log.warning(
|
|
101
|
+
"'status' must be '%s' when 'complete_date' is set (%s). Resetting", self.COMPLETED, self.status
|
|
102
|
+
)
|
|
103
|
+
self.status = self.COMPLETED
|
|
104
|
+
now = datetime.datetime.now(tz=UTC)
|
|
105
|
+
if (self.complete_date - now).total_seconds() > 120:
|
|
106
|
+
# Reset complete_date values that are in the future
|
|
107
|
+
# 'complete_date' can be set automatically by the server. Allow some grace between local and server time
|
|
108
|
+
log.warning("'complete_date' must be in the past (%s vs %s). Resetting", self.complete_date, now)
|
|
109
|
+
self.complete_date = now
|
|
110
|
+
if self.start_date and self.complete_date.date() < self.start_date:
|
|
111
|
+
log.warning(
|
|
112
|
+
"'complete_date' must be greater than 'start_date' (%s vs %s). Resetting",
|
|
113
|
+
self.complete_date,
|
|
114
|
+
self.start_date,
|
|
115
|
+
)
|
|
116
|
+
self.complete_date = EWSDateTime.combine(self.start_date, datetime.time(0, 0)).replace(tzinfo=UTC)
|
|
117
|
+
if self.percent_complete is not None:
|
|
118
|
+
if self.status == self.COMPLETED and self.percent_complete != Decimal(100):
|
|
119
|
+
# percent_complete must be 100% if task is complete
|
|
120
|
+
log.warning(
|
|
121
|
+
"'percent_complete' must be 100 when 'status' is '%s' (%s). Resetting",
|
|
122
|
+
self.COMPLETED,
|
|
123
|
+
self.percent_complete,
|
|
124
|
+
)
|
|
125
|
+
self.percent_complete = Decimal(100)
|
|
126
|
+
elif self.status == self.NOT_STARTED and self.percent_complete != Decimal(0):
|
|
127
|
+
# percent_complete must be 0% if task is not started
|
|
128
|
+
log.warning(
|
|
129
|
+
"'percent_complete' must be 0 when 'status' is '%s' (%s). Resetting",
|
|
130
|
+
self.NOT_STARTED,
|
|
131
|
+
self.percent_complete,
|
|
132
|
+
)
|
|
133
|
+
self.percent_complete = Decimal(0)
|
|
134
|
+
|
|
135
|
+
def complete(self):
|
|
136
|
+
# A helper method to mark a task as complete on the server
|
|
137
|
+
self.status = Task.COMPLETED
|
|
138
|
+
self.percent_complete = Decimal(100)
|
|
139
|
+
self.save()
|