@backtomyfuture/exchange-cli-darwin-x64 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 +30 -0
- package/bin/_internal/Python.framework/Versions/3.12/Python +0 -0
- package/bin/_internal/Python.framework/Versions/3.12/Resources/Info.plist +30 -0
- package/bin/_internal/Python.framework/Versions/Current/Python +0 -0
- package/bin/_internal/Python.framework/Versions/Current/Resources/Info.plist +30 -0
- 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 +3863 -0
- package/bin/_internal/certifi/py.typed +0 -0
- package/bin/_internal/charset_normalizer/cd.cpython-312-darwin.so +0 -0
- package/bin/_internal/charset_normalizer/md.cpython-312-darwin.so +0 -0
- package/bin/_internal/click-8.4.2.dist-info/INSTALLER +1 -0
- package/bin/_internal/click-8.4.2.dist-info/METADATA +84 -0
- package/bin/_internal/click-8.4.2.dist-info/RECORD +40 -0
- package/bin/_internal/click-8.4.2.dist-info/WHEEL +4 -0
- package/bin/_internal/click-8.4.2.dist-info/licenses/LICENSE.txt +28 -0
- package/bin/_internal/cryptography/hazmat/bindings/_rust.abi3.so +0 -0
- package/bin/_internal/cryptography-48.0.1.dist-info/INSTALLER +1 -0
- package/bin/_internal/cryptography-48.0.1.dist-info/METADATA +110 -0
- package/bin/_internal/cryptography-48.0.1.dist-info/RECORD +195 -0
- package/bin/_internal/cryptography-48.0.1.dist-info/WHEEL +4 -0
- package/bin/_internal/cryptography-48.0.1.dist-info/licenses/LICENSE +3 -0
- package/bin/_internal/cryptography-48.0.1.dist-info/licenses/LICENSE.APACHE +202 -0
- package/bin/_internal/cryptography-48.0.1.dist-info/licenses/LICENSE.BSD +27 -0
- 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/WHEEL +5 -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-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/isoschematron/resources/rng/iso-schematron.rng +709 -0
- package/bin/_internal/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl +75 -0
- package/bin/_internal/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl +77 -0
- package/bin/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl +313 -0
- package/bin/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl +1160 -0
- package/bin/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl +55 -0
- package/bin/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl +1796 -0
- package/bin/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl +588 -0
- package/bin/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt +84 -0
- package/bin/_internal/lxml/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.12/lib-dynload/_bisect.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_blake2.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_bz2.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_cn.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_hk.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_iso2022.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_jp.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_kr.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_codecs_tw.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_contextvars.cpython-312-darwin.so +0 -0
- package/bin/_internal/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.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.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.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.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.12/lib-dynload/_posixshmem.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_posixsubprocess.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_queue.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_random.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/_scproxy.cpython-312-darwin.so +0 -0
- package/bin/_internal/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.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.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.12/lib-dynload/_uuid.cpython-312-darwin.so +0 -0
- package/bin/_internal/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.12/lib-dynload/binascii.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/fcntl.cpython-312-darwin.so +0 -0
- package/bin/_internal/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.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.12/lib-dynload/resource.cpython-312-darwin.so +0 -0
- package/bin/_internal/python3.12/lib-dynload/select.cpython-312-darwin.so +0 -0
- package/bin/_internal/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/setuptools/_vendor/jaraco/text/Lorem ipsum.txt +2 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Abidjan +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Accra +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Addis_Ababa +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Algiers +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Asmara +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Asmera +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Bamako +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Bangui +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Banjul +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Bissau +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Blantyre +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Brazzaville +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Bujumbura +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Cairo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Casablanca +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Ceuta +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Conakry +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Dakar +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Dar_es_Salaam +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Djibouti +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Douala +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/El_Aaiun +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Freetown +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Gaborone +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Harare +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Johannesburg +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Juba +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Kampala +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Khartoum +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Kigali +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Kinshasa +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Lagos +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Libreville +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Lome +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Luanda +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Lubumbashi +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Lusaka +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Malabo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Maputo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Maseru +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Mbabane +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Mogadishu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Monrovia +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Nairobi +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Ndjamena +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Niamey +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Nouakchott +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Ouagadougou +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Porto-Novo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Sao_Tome +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Timbuktu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Tripoli +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Tunis +0 -0
- package/bin/_internal/tzdata/zoneinfo/Africa/Windhoek +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Adak +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Anchorage +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Anguilla +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Antigua +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Araguaina +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Buenos_Aires +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Catamarca +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/ComodRivadavia +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Cordoba +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Jujuy +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/La_Rioja +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Mendoza +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Rio_Gallegos +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Salta +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/San_Juan +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/San_Luis +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Tucuman +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Argentina/Ushuaia +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Aruba +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Asuncion +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Atikokan +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Atka +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Bahia +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Bahia_Banderas +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Barbados +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Belem +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Belize +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Blanc-Sablon +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Boa_Vista +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Bogota +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Boise +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Buenos_Aires +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Cambridge_Bay +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Campo_Grande +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Cancun +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Caracas +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Catamarca +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Cayenne +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Cayman +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Chicago +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Chihuahua +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Ciudad_Juarez +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Coral_Harbour +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Cordoba +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Costa_Rica +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Coyhaique +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Creston +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Cuiaba +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Curacao +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Danmarkshavn +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Dawson +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Dawson_Creek +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Denver +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Detroit +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Dominica +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Edmonton +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Eirunepe +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/El_Salvador +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Ensenada +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Fort_Nelson +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Fort_Wayne +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Fortaleza +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Glace_Bay +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Godthab +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Goose_Bay +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Grand_Turk +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Grenada +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Guadeloupe +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Guatemala +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Guayaquil +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Guyana +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Halifax +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Havana +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Hermosillo +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indiana/Indianapolis +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indiana/Knox +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indiana/Marengo +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indiana/Petersburg +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indiana/Tell_City +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indiana/Vevay +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indiana/Vincennes +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indiana/Winamac +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Indianapolis +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Inuvik +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Iqaluit +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Jamaica +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Jujuy +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Juneau +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Kentucky/Louisville +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Kentucky/Monticello +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Knox_IN +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Kralendijk +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/La_Paz +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Lima +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Los_Angeles +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Louisville +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Lower_Princes +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Maceio +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Managua +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Manaus +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Marigot +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Martinique +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Matamoros +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Mazatlan +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Mendoza +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Menominee +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Merida +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Metlakatla +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Mexico_City +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Miquelon +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Moncton +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Monterrey +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Montevideo +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Montreal +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Montserrat +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Nassau +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/New_York +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Nipigon +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Nome +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Noronha +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/North_Dakota/Beulah +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/North_Dakota/Center +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/North_Dakota/New_Salem +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Nuuk +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Ojinaga +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Panama +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Pangnirtung +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Paramaribo +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Phoenix +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Port-au-Prince +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Port_of_Spain +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Porto_Acre +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Porto_Velho +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Puerto_Rico +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Punta_Arenas +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Rainy_River +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Rankin_Inlet +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Recife +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Regina +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Resolute +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Rio_Branco +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Rosario +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Santa_Isabel +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Santarem +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Santiago +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Santo_Domingo +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Sao_Paulo +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Scoresbysund +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Shiprock +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Sitka +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/St_Barthelemy +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/St_Johns +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/St_Kitts +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/St_Lucia +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/St_Thomas +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/St_Vincent +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Swift_Current +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Tegucigalpa +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Thule +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Thunder_Bay +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Tijuana +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Toronto +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Tortola +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Vancouver +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Virgin +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Whitehorse +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Winnipeg +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Yakutat +0 -0
- package/bin/_internal/tzdata/zoneinfo/America/Yellowknife +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Casey +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Davis +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/DumontDUrville +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Macquarie +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Mawson +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/McMurdo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Palmer +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Rothera +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/South_Pole +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Syowa +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Troll +0 -0
- package/bin/_internal/tzdata/zoneinfo/Antarctica/Vostok +0 -0
- package/bin/_internal/tzdata/zoneinfo/Arctic/Longyearbyen +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Aden +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Almaty +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Amman +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Anadyr +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Aqtau +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Aqtobe +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Ashgabat +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Ashkhabad +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Atyrau +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Baghdad +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Bahrain +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Baku +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Bangkok +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Barnaul +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Beirut +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Bishkek +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Brunei +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Calcutta +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Chita +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Choibalsan +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Chongqing +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Chungking +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Colombo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Dacca +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Damascus +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Dhaka +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Dili +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Dubai +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Dushanbe +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Famagusta +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Gaza +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Harbin +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Hebron +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Hong_Kong +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Hovd +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Irkutsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Istanbul +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Jakarta +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Jayapura +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Jerusalem +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Kabul +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Kamchatka +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Karachi +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Kashgar +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Kathmandu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Katmandu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Khandyga +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Kolkata +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Krasnoyarsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Kuala_Lumpur +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Kuching +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Kuwait +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Macao +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Macau +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Magadan +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Makassar +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Manila +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Muscat +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Nicosia +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Novokuznetsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Novosibirsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Omsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Oral +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Phnom_Penh +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Pontianak +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Pyongyang +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Qatar +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Qostanay +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Qyzylorda +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Rangoon +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Riyadh +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Saigon +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Sakhalin +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Samarkand +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Seoul +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Shanghai +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Singapore +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Srednekolymsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Taipei +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Tashkent +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Tbilisi +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Tehran +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Tel_Aviv +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Thimbu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Thimphu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Tokyo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Tomsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Ujung_Pandang +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Ulaanbaatar +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Ulan_Bator +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Urumqi +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Ust-Nera +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Vientiane +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Vladivostok +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Yakutsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Yangon +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Yekaterinburg +0 -0
- package/bin/_internal/tzdata/zoneinfo/Asia/Yerevan +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Azores +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Bermuda +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Canary +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Cape_Verde +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Faeroe +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Faroe +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Jan_Mayen +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Madeira +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Reykjavik +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/South_Georgia +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/St_Helena +0 -0
- package/bin/_internal/tzdata/zoneinfo/Atlantic/Stanley +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/ACT +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Adelaide +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Brisbane +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Broken_Hill +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Canberra +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Currie +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Darwin +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Eucla +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Hobart +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/LHI +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Lindeman +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Lord_Howe +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Melbourne +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/NSW +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/North +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Perth +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Queensland +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/South +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Sydney +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Tasmania +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Victoria +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/West +0 -0
- package/bin/_internal/tzdata/zoneinfo/Australia/Yancowinna +0 -0
- package/bin/_internal/tzdata/zoneinfo/Brazil/Acre +0 -0
- package/bin/_internal/tzdata/zoneinfo/Brazil/DeNoronha +0 -0
- package/bin/_internal/tzdata/zoneinfo/Brazil/East +0 -0
- package/bin/_internal/tzdata/zoneinfo/Brazil/West +0 -0
- package/bin/_internal/tzdata/zoneinfo/CET +0 -0
- package/bin/_internal/tzdata/zoneinfo/CST6CDT +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Atlantic +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Central +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Eastern +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Mountain +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Newfoundland +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Pacific +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Saskatchewan +0 -0
- package/bin/_internal/tzdata/zoneinfo/Canada/Yukon +0 -0
- package/bin/_internal/tzdata/zoneinfo/Chile/Continental +0 -0
- package/bin/_internal/tzdata/zoneinfo/Chile/EasterIsland +0 -0
- package/bin/_internal/tzdata/zoneinfo/Cuba +0 -0
- package/bin/_internal/tzdata/zoneinfo/EET +0 -0
- package/bin/_internal/tzdata/zoneinfo/EST +0 -0
- package/bin/_internal/tzdata/zoneinfo/EST5EDT +0 -0
- package/bin/_internal/tzdata/zoneinfo/Egypt +0 -0
- package/bin/_internal/tzdata/zoneinfo/Eire +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+0 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+1 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+10 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+11 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+12 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+2 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+3 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+4 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+5 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+6 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+7 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+8 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT+9 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-0 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-1 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-10 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-11 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-12 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-13 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-14 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-2 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-3 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-4 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-5 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-6 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-7 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-8 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT-9 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/GMT0 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/Greenwich +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/UCT +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/UTC +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/Universal +0 -0
- package/bin/_internal/tzdata/zoneinfo/Etc/Zulu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Amsterdam +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Andorra +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Astrakhan +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Athens +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Belfast +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Belgrade +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Berlin +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Bratislava +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Brussels +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Bucharest +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Budapest +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Busingen +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Chisinau +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Copenhagen +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Dublin +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Gibraltar +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Guernsey +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Helsinki +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Isle_of_Man +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Istanbul +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Jersey +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Kaliningrad +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Kiev +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Kirov +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Kyiv +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Lisbon +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Ljubljana +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/London +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Luxembourg +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Madrid +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Malta +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Mariehamn +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Minsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Monaco +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Moscow +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Nicosia +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Oslo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Paris +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Podgorica +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Prague +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Riga +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Rome +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Samara +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/San_Marino +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Sarajevo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Saratov +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Simferopol +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Skopje +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Sofia +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Stockholm +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Tallinn +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Tirane +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Tiraspol +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Ulyanovsk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Uzhgorod +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Vaduz +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Vatican +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Vienna +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Vilnius +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Volgograd +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Warsaw +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Zagreb +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Zaporozhye +0 -0
- package/bin/_internal/tzdata/zoneinfo/Europe/Zurich +0 -0
- package/bin/_internal/tzdata/zoneinfo/Factory +0 -0
- package/bin/_internal/tzdata/zoneinfo/GB +0 -0
- package/bin/_internal/tzdata/zoneinfo/GB-Eire +0 -0
- package/bin/_internal/tzdata/zoneinfo/GMT +0 -0
- package/bin/_internal/tzdata/zoneinfo/GMT+0 +0 -0
- package/bin/_internal/tzdata/zoneinfo/GMT-0 +0 -0
- package/bin/_internal/tzdata/zoneinfo/GMT0 +0 -0
- package/bin/_internal/tzdata/zoneinfo/Greenwich +0 -0
- package/bin/_internal/tzdata/zoneinfo/HST +0 -0
- package/bin/_internal/tzdata/zoneinfo/Hongkong +0 -0
- package/bin/_internal/tzdata/zoneinfo/Iceland +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Antananarivo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Chagos +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Christmas +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Cocos +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Comoro +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Kerguelen +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Mahe +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Maldives +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Mauritius +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Mayotte +0 -0
- package/bin/_internal/tzdata/zoneinfo/Indian/Reunion +0 -0
- package/bin/_internal/tzdata/zoneinfo/Iran +0 -0
- package/bin/_internal/tzdata/zoneinfo/Israel +0 -0
- package/bin/_internal/tzdata/zoneinfo/Jamaica +0 -0
- package/bin/_internal/tzdata/zoneinfo/Japan +0 -0
- package/bin/_internal/tzdata/zoneinfo/Kwajalein +0 -0
- package/bin/_internal/tzdata/zoneinfo/Libya +0 -0
- package/bin/_internal/tzdata/zoneinfo/MET +0 -0
- package/bin/_internal/tzdata/zoneinfo/MST +0 -0
- package/bin/_internal/tzdata/zoneinfo/MST7MDT +0 -0
- package/bin/_internal/tzdata/zoneinfo/Mexico/BajaNorte +0 -0
- package/bin/_internal/tzdata/zoneinfo/Mexico/BajaSur +0 -0
- package/bin/_internal/tzdata/zoneinfo/Mexico/General +0 -0
- package/bin/_internal/tzdata/zoneinfo/NZ +0 -0
- package/bin/_internal/tzdata/zoneinfo/NZ-CHAT +0 -0
- package/bin/_internal/tzdata/zoneinfo/Navajo +0 -0
- package/bin/_internal/tzdata/zoneinfo/PRC +0 -0
- package/bin/_internal/tzdata/zoneinfo/PST8PDT +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Apia +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Auckland +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Bougainville +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Chatham +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Chuuk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Easter +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Efate +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Enderbury +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Fakaofo +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Fiji +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Funafuti +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Galapagos +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Gambier +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Guadalcanal +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Guam +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Honolulu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Johnston +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Kanton +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Kiritimati +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Kosrae +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Kwajalein +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Majuro +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Marquesas +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Midway +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Nauru +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Niue +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Norfolk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Noumea +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Pago_Pago +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Palau +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Pitcairn +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Pohnpei +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Ponape +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Port_Moresby +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Rarotonga +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Saipan +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Samoa +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Tahiti +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Tarawa +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Tongatapu +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Truk +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Wake +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Wallis +0 -0
- package/bin/_internal/tzdata/zoneinfo/Pacific/Yap +0 -0
- package/bin/_internal/tzdata/zoneinfo/Poland +0 -0
- package/bin/_internal/tzdata/zoneinfo/Portugal +0 -0
- package/bin/_internal/tzdata/zoneinfo/ROC +0 -0
- package/bin/_internal/tzdata/zoneinfo/ROK +0 -0
- package/bin/_internal/tzdata/zoneinfo/Singapore +0 -0
- package/bin/_internal/tzdata/zoneinfo/Turkey +0 -0
- package/bin/_internal/tzdata/zoneinfo/UCT +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Alaska +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Aleutian +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Arizona +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Central +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/East-Indiana +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Eastern +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Hawaii +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Indiana-Starke +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Michigan +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Mountain +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Pacific +0 -0
- package/bin/_internal/tzdata/zoneinfo/US/Samoa +0 -0
- package/bin/_internal/tzdata/zoneinfo/UTC +0 -0
- package/bin/_internal/tzdata/zoneinfo/Universal +0 -0
- package/bin/_internal/tzdata/zoneinfo/W-SU +0 -0
- package/bin/_internal/tzdata/zoneinfo/WET +0 -0
- package/bin/_internal/tzdata/zoneinfo/Zulu +0 -0
- package/bin/_internal/tzdata/zoneinfo/iso3166.tab +279 -0
- package/bin/_internal/tzdata/zoneinfo/leapseconds +86 -0
- package/bin/_internal/tzdata/zoneinfo/tzdata.zi +4180 -0
- package/bin/_internal/tzdata/zoneinfo/zone.tab +448 -0
- package/bin/_internal/tzdata/zoneinfo/zone1970.tab +375 -0
- package/bin/_internal/tzdata/zoneinfo/zonenow.tab +299 -0
- package/bin/_internal/tzdata/zones +598 -0
- package/bin/exchange-cli +0 -0
- package/package.json +20 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from copy import deepcopy
|
|
3
|
+
|
|
4
|
+
from ..errors import ErrorFolderNotFound, ErrorItemNotFound, ErrorNoPublicFolderReplicaAvailable, InvalidTypeError
|
|
5
|
+
from ..properties import FolderId, InvalidField
|
|
6
|
+
from ..queryset import DoesNotExist, MultipleObjectsReturned
|
|
7
|
+
from ..restriction import Q
|
|
8
|
+
|
|
9
|
+
# Traversal enums
|
|
10
|
+
SHALLOW = "Shallow"
|
|
11
|
+
SOFT_DELETED = "SoftDeleted"
|
|
12
|
+
DEEP = "Deep"
|
|
13
|
+
FOLDER_TRAVERSAL_CHOICES = (SHALLOW, DEEP, SOFT_DELETED)
|
|
14
|
+
|
|
15
|
+
MISSING_FOLDER_ERRORS = (ErrorFolderNotFound, ErrorItemNotFound, ErrorNoPublicFolderReplicaAvailable)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
log = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class FolderQuerySet:
|
|
22
|
+
"""A QuerySet-like class for finding sub-folders of a folder collection."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, folder_collection):
|
|
25
|
+
from .collections import FolderCollection
|
|
26
|
+
|
|
27
|
+
if not isinstance(folder_collection, FolderCollection):
|
|
28
|
+
raise InvalidTypeError("folder_collection", folder_collection, FolderCollection)
|
|
29
|
+
self.folder_collection = folder_collection
|
|
30
|
+
self.q = Q() # Default to no restrictions
|
|
31
|
+
self.only_fields = None
|
|
32
|
+
self._depth = None
|
|
33
|
+
|
|
34
|
+
def _copy_cls(self):
|
|
35
|
+
return self.__class__(folder_collection=self.folder_collection)
|
|
36
|
+
|
|
37
|
+
def _copy_self(self):
|
|
38
|
+
"""Chaining operations must make a copy of self before making any modifications."""
|
|
39
|
+
new_qs = self._copy_cls()
|
|
40
|
+
new_qs.q = deepcopy(self.q)
|
|
41
|
+
new_qs.only_fields = self.only_fields
|
|
42
|
+
new_qs._depth = self._depth
|
|
43
|
+
return new_qs
|
|
44
|
+
|
|
45
|
+
def only(self, *args):
|
|
46
|
+
"""Restrict the fields returned. 'name' and 'folder_class' are always returned."""
|
|
47
|
+
from .base import Folder
|
|
48
|
+
|
|
49
|
+
# Sub-folders will always be of class Folder
|
|
50
|
+
all_fields = self.folder_collection.get_folder_fields(target_cls=Folder, is_complex=None)
|
|
51
|
+
all_fields.update(Folder.attribute_fields())
|
|
52
|
+
only_fields = []
|
|
53
|
+
for arg in args:
|
|
54
|
+
for field_path in all_fields:
|
|
55
|
+
if field_path.field.name == arg:
|
|
56
|
+
only_fields.append(field_path)
|
|
57
|
+
break
|
|
58
|
+
else:
|
|
59
|
+
raise InvalidField(f"Unknown field {arg!r} on folders {self.folder_collection.folders}")
|
|
60
|
+
new_qs = self._copy_self()
|
|
61
|
+
new_qs.only_fields = only_fields
|
|
62
|
+
return new_qs
|
|
63
|
+
|
|
64
|
+
def depth(self, depth):
|
|
65
|
+
"""Specify the search depth. Possible values are: SHALLOW or DEEP.
|
|
66
|
+
|
|
67
|
+
:param depth:
|
|
68
|
+
"""
|
|
69
|
+
new_qs = self._copy_self()
|
|
70
|
+
new_qs._depth = depth
|
|
71
|
+
return new_qs
|
|
72
|
+
|
|
73
|
+
def get(self, *args, **kwargs):
|
|
74
|
+
"""Return the query result as exactly one item. Raises DoesNotExist if there are no results, and
|
|
75
|
+
MultipleObjectsReturned if there are multiple results.
|
|
76
|
+
"""
|
|
77
|
+
from .base import Folder
|
|
78
|
+
from .collections import FolderCollection
|
|
79
|
+
|
|
80
|
+
if not args and set(kwargs) in ({"id"}, {"id", "changekey"}):
|
|
81
|
+
roots = {f.root for f in self.folder_collection.folders}
|
|
82
|
+
if len(roots) != 1:
|
|
83
|
+
raise ValueError(f"All folders must have the same root hierarchy ({roots})")
|
|
84
|
+
folders = list(
|
|
85
|
+
FolderCollection(
|
|
86
|
+
account=self.folder_collection.account,
|
|
87
|
+
folders=[
|
|
88
|
+
Folder(
|
|
89
|
+
_id=FolderId(**kwargs),
|
|
90
|
+
root=roots.pop(),
|
|
91
|
+
)
|
|
92
|
+
],
|
|
93
|
+
).resolve()
|
|
94
|
+
)
|
|
95
|
+
elif args or kwargs:
|
|
96
|
+
folders = list(self.filter(*args, **kwargs))
|
|
97
|
+
else:
|
|
98
|
+
folders = list(self.all())
|
|
99
|
+
if not folders:
|
|
100
|
+
raise DoesNotExist("Could not find a child folder matching the query")
|
|
101
|
+
if len(folders) != 1:
|
|
102
|
+
raise MultipleObjectsReturned(f"Expected result length 1, but got {folders}")
|
|
103
|
+
f = folders[0]
|
|
104
|
+
if isinstance(f, Exception):
|
|
105
|
+
raise f
|
|
106
|
+
return f
|
|
107
|
+
|
|
108
|
+
def all(self):
|
|
109
|
+
""" """
|
|
110
|
+
new_qs = self._copy_self()
|
|
111
|
+
return new_qs
|
|
112
|
+
|
|
113
|
+
def filter(self, *args, **kwargs):
|
|
114
|
+
"""Add restrictions to the folder search."""
|
|
115
|
+
new_qs = self._copy_self()
|
|
116
|
+
q = Q(*args, **kwargs)
|
|
117
|
+
new_qs.q = new_qs.q & q
|
|
118
|
+
return new_qs
|
|
119
|
+
|
|
120
|
+
def __iter__(self):
|
|
121
|
+
return self._query()
|
|
122
|
+
|
|
123
|
+
def _query(self):
|
|
124
|
+
from .base import Folder
|
|
125
|
+
from .collections import FolderCollection
|
|
126
|
+
|
|
127
|
+
if self.only_fields is None:
|
|
128
|
+
# Sub-folders will always be of class Folder
|
|
129
|
+
non_complex_fields = self.folder_collection.get_folder_fields(target_cls=Folder, is_complex=False)
|
|
130
|
+
complex_fields = self.folder_collection.get_folder_fields(target_cls=Folder, is_complex=True)
|
|
131
|
+
else:
|
|
132
|
+
non_complex_fields = {f for f in self.only_fields if not f.field.is_complex}
|
|
133
|
+
complex_fields = {f for f in self.only_fields if f.field.is_complex}
|
|
134
|
+
|
|
135
|
+
# First, fetch all non-complex fields using FindFolder. We do this because some folders do not support
|
|
136
|
+
# GetFolder, but we still want to get as much information as possible.
|
|
137
|
+
folders = self.folder_collection.find_folders(q=self.q, depth=self._depth, additional_fields=non_complex_fields)
|
|
138
|
+
if not complex_fields:
|
|
139
|
+
yield from folders
|
|
140
|
+
return
|
|
141
|
+
|
|
142
|
+
# Fetch all properties for the found folders
|
|
143
|
+
resolveable_folders = []
|
|
144
|
+
for f in folders:
|
|
145
|
+
if isinstance(f, Exception):
|
|
146
|
+
yield f
|
|
147
|
+
continue
|
|
148
|
+
if not f.get_folder_allowed:
|
|
149
|
+
log.debug("GetFolder not allowed on folder %s. Non-complex fields must be fetched with FindFolder", f)
|
|
150
|
+
yield f
|
|
151
|
+
else:
|
|
152
|
+
resolveable_folders.append(f)
|
|
153
|
+
|
|
154
|
+
# Get the complex fields using GetFolder, for the folders that support it, and add the extra field values
|
|
155
|
+
complex_folders = FolderCollection(
|
|
156
|
+
account=self.folder_collection.account, folders=resolveable_folders
|
|
157
|
+
).get_folders(additional_fields=complex_fields)
|
|
158
|
+
for f, complex_f in zip(resolveable_folders, complex_folders):
|
|
159
|
+
if isinstance(f, MISSING_FOLDER_ERRORS):
|
|
160
|
+
# We were unlucky. The folder disappeared between the FindFolder and the GetFolder calls
|
|
161
|
+
continue
|
|
162
|
+
if isinstance(complex_f, Exception):
|
|
163
|
+
yield complex_f
|
|
164
|
+
continue
|
|
165
|
+
# Add the extra field values to the folders we fetched with find_folders()
|
|
166
|
+
if f.__class__ != complex_f.__class__:
|
|
167
|
+
raise ValueError(f"Type mismatch: {f} vs {complex_f}")
|
|
168
|
+
for complex_field in complex_fields:
|
|
169
|
+
field_name = complex_field.field.name
|
|
170
|
+
setattr(f, field_name, getattr(complex_f, field_name))
|
|
171
|
+
yield f
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class SingleFolderQuerySet(FolderQuerySet):
|
|
175
|
+
"""A helper class with simpler argument types."""
|
|
176
|
+
|
|
177
|
+
def __init__(self, account, folder):
|
|
178
|
+
from .collections import FolderCollection
|
|
179
|
+
|
|
180
|
+
folder_collection = FolderCollection(account=account, folders=[folder])
|
|
181
|
+
super().__init__(folder_collection=folder_collection)
|
|
182
|
+
|
|
183
|
+
def _copy_cls(self):
|
|
184
|
+
return self.__class__(account=self.folder_collection.account, folder=self.folder_collection.folders[0])
|
|
185
|
+
|
|
186
|
+
def resolve(self):
|
|
187
|
+
return list(self.folder_collection.resolve())[0]
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from contextlib import suppress
|
|
3
|
+
from threading import Lock
|
|
4
|
+
|
|
5
|
+
from ..errors import ErrorAccessDenied, ErrorFolderNotFound, ErrorInvalidOperation
|
|
6
|
+
from ..fields import EffectiveRightsField
|
|
7
|
+
from ..properties import DistinguishedFolderId, EWSMeta, Mailbox
|
|
8
|
+
from ..version import EXCHANGE_2007_SP1, EXCHANGE_2010_SP1
|
|
9
|
+
from .base import BaseFolder
|
|
10
|
+
from .collections import FolderCollection
|
|
11
|
+
from .known_folders import (
|
|
12
|
+
MISC_FOLDERS,
|
|
13
|
+
NON_DELETABLE_FOLDERS,
|
|
14
|
+
WELLKNOWN_FOLDERS_IN_ARCHIVE_ROOT,
|
|
15
|
+
WELLKNOWN_FOLDERS_IN_ROOT,
|
|
16
|
+
MsgFolderRoot,
|
|
17
|
+
)
|
|
18
|
+
from .queryset import MISSING_FOLDER_ERRORS, SHALLOW, SingleFolderQuerySet
|
|
19
|
+
|
|
20
|
+
log = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class RootOfHierarchy(BaseFolder, metaclass=EWSMeta):
|
|
24
|
+
"""Base class for folders that implement the root of a folder hierarchy."""
|
|
25
|
+
|
|
26
|
+
# A list of wellknown, or "distinguished", folders that are belong in this folder hierarchy. See
|
|
27
|
+
# https://docs.microsoft.com/en-us/dotnet/api/microsoft.exchange.webservices.data.wellknownfoldername
|
|
28
|
+
# and https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/distinguishedfolderid
|
|
29
|
+
# 'RootOfHierarchy' subclasses must not be in this list.
|
|
30
|
+
WELLKNOWN_FOLDERS = []
|
|
31
|
+
|
|
32
|
+
# This folder type also has 'folder:PermissionSet' on some server versions, but requesting it sometimes causes
|
|
33
|
+
# 'ErrorAccessDenied', as reported by some users. Ignore it entirely for root folders - it's usefulness is
|
|
34
|
+
# deemed minimal at best.
|
|
35
|
+
effective_rights = EffectiveRightsField(
|
|
36
|
+
field_uri="folder:EffectiveRights", is_read_only=True, supported_from=EXCHANGE_2007_SP1
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
__slots__ = "_account", "_subfolders", "_subfolders_lock"
|
|
40
|
+
|
|
41
|
+
# A special folder that acts as the top of a folder hierarchy. Finds and caches sub-folders at arbitrary depth.
|
|
42
|
+
def __init__(self, **kwargs):
|
|
43
|
+
self._account = kwargs.pop("account", None) # A pointer back to the account holding the folder hierarchy
|
|
44
|
+
super().__init__(**kwargs)
|
|
45
|
+
self._subfolders = None # See self._folders_map()
|
|
46
|
+
self._subfolders_lock = Lock()
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def account(self):
|
|
50
|
+
return self._account
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def root(self):
|
|
54
|
+
return self
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def parent(self):
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def register(cls, *args, **kwargs):
|
|
62
|
+
if cls is not RootOfHierarchy:
|
|
63
|
+
raise TypeError("For folder roots, custom fields must be registered on the RootOfHierarchy class")
|
|
64
|
+
return super().register(*args, **kwargs)
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def deregister(cls, *args, **kwargs):
|
|
68
|
+
if cls is not RootOfHierarchy:
|
|
69
|
+
raise TypeError("For folder roots, custom fields must be registered on the RootOfHierarchy class")
|
|
70
|
+
return super().deregister(*args, **kwargs)
|
|
71
|
+
|
|
72
|
+
def get_folder(self, folder):
|
|
73
|
+
if not folder.id:
|
|
74
|
+
raise ValueError("'folder' must have an ID")
|
|
75
|
+
return self._folders_map.get(folder.id)
|
|
76
|
+
|
|
77
|
+
def add_folder(self, folder):
|
|
78
|
+
if not folder.id:
|
|
79
|
+
raise ValueError("'folder' must have an ID")
|
|
80
|
+
self._folders_map[folder.id] = folder
|
|
81
|
+
|
|
82
|
+
def update_folder(self, folder):
|
|
83
|
+
if not folder.id:
|
|
84
|
+
raise ValueError("'folder' must have an ID")
|
|
85
|
+
self._folders_map[folder.id] = folder
|
|
86
|
+
|
|
87
|
+
def remove_folder(self, folder):
|
|
88
|
+
if not folder.id:
|
|
89
|
+
raise ValueError("'folder' must have an ID")
|
|
90
|
+
with suppress(KeyError):
|
|
91
|
+
del self._folders_map[folder.id]
|
|
92
|
+
|
|
93
|
+
def clear_cache(self):
|
|
94
|
+
with self._subfolders_lock:
|
|
95
|
+
self._subfolders = None
|
|
96
|
+
|
|
97
|
+
def get_children(self, folder):
|
|
98
|
+
for f in self._folders_map.values():
|
|
99
|
+
if not f.parent:
|
|
100
|
+
continue
|
|
101
|
+
if f.parent.id == folder.id:
|
|
102
|
+
yield f
|
|
103
|
+
|
|
104
|
+
def get_default_folder(self, folder_cls):
|
|
105
|
+
"""Return the distinguished folder instance of type folder_cls belonging to this account. If no distinguished
|
|
106
|
+
folder was found, try as best we can to return the default folder of type 'folder_cls'
|
|
107
|
+
"""
|
|
108
|
+
if not folder_cls.DISTINGUISHED_FOLDER_ID:
|
|
109
|
+
raise ValueError(f"'folder_cls' {folder_cls} must have a DISTINGUISHED_FOLDER_ID value")
|
|
110
|
+
# Use cached distinguished folder instance, but only if cache has already been prepped. This is an optimization
|
|
111
|
+
# for accessing e.g. 'account.contacts' without fetching all folders of the account.
|
|
112
|
+
if self._subfolders is not None:
|
|
113
|
+
for f in self._folders_map.values():
|
|
114
|
+
# Require exact class, to not match subclasses, e.g. RecipientCache instead of Contacts
|
|
115
|
+
if f.__class__ == folder_cls and f.is_distinguished:
|
|
116
|
+
log.debug("Found cached distinguished %s folder", folder_cls)
|
|
117
|
+
return f
|
|
118
|
+
try:
|
|
119
|
+
log.debug("Requesting distinguished %s folder explicitly", folder_cls)
|
|
120
|
+
return folder_cls.get_distinguished(root=self)
|
|
121
|
+
except ErrorAccessDenied:
|
|
122
|
+
# Maybe we just don't have GetFolder access? Try FindItem instead
|
|
123
|
+
log.debug("Testing default %s folder with FindItem", folder_cls)
|
|
124
|
+
fld = folder_cls(
|
|
125
|
+
_distinguished_id=DistinguishedFolderId(
|
|
126
|
+
id=folder_cls.DISTINGUISHED_FOLDER_ID,
|
|
127
|
+
mailbox=Mailbox(email_address=self.account.primary_smtp_address),
|
|
128
|
+
),
|
|
129
|
+
root=self,
|
|
130
|
+
)
|
|
131
|
+
fld.test_access()
|
|
132
|
+
return self._folders_map.get(fld.id, fld) # Use cached instance if available
|
|
133
|
+
except MISSING_FOLDER_ERRORS:
|
|
134
|
+
# The Exchange server does not return a distinguished folder of this type
|
|
135
|
+
pass
|
|
136
|
+
raise ErrorFolderNotFound(f"No usable default {folder_cls} folders")
|
|
137
|
+
|
|
138
|
+
@classmethod
|
|
139
|
+
def get_distinguished(cls, account):
|
|
140
|
+
"""Get the distinguished folder for this folder class.
|
|
141
|
+
|
|
142
|
+
:param account:
|
|
143
|
+
:return:
|
|
144
|
+
"""
|
|
145
|
+
return cls._get_distinguished(
|
|
146
|
+
folder=cls(
|
|
147
|
+
_distinguished_id=DistinguishedFolderId(
|
|
148
|
+
id=cls.DISTINGUISHED_FOLDER_ID,
|
|
149
|
+
mailbox=Mailbox(email_address=account.primary_smtp_address),
|
|
150
|
+
),
|
|
151
|
+
account=account,
|
|
152
|
+
)
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def _folders_map(self):
|
|
157
|
+
if self._subfolders is not None:
|
|
158
|
+
return self._subfolders
|
|
159
|
+
|
|
160
|
+
with self._subfolders_lock:
|
|
161
|
+
# Map root, and all sub-folders of root, at arbitrary depth by folder ID. First get distinguished folders,
|
|
162
|
+
# so we are sure to apply the correct Folder class, then fetch all sub-folders of this root.
|
|
163
|
+
folders_map = {self.id: self}
|
|
164
|
+
distinguished_folders = [
|
|
165
|
+
cls(
|
|
166
|
+
_distinguished_id=DistinguishedFolderId(
|
|
167
|
+
id=cls.DISTINGUISHED_FOLDER_ID,
|
|
168
|
+
mailbox=Mailbox(email_address=self.account.primary_smtp_address),
|
|
169
|
+
),
|
|
170
|
+
root=self,
|
|
171
|
+
)
|
|
172
|
+
for cls in self.WELLKNOWN_FOLDERS
|
|
173
|
+
if cls.get_folder_allowed and cls.supports_version(self.account.version)
|
|
174
|
+
]
|
|
175
|
+
for f in FolderCollection(account=self.account, folders=distinguished_folders).resolve():
|
|
176
|
+
if isinstance(f, MISSING_FOLDER_ERRORS):
|
|
177
|
+
# This is just a distinguished folder the server does not have
|
|
178
|
+
continue
|
|
179
|
+
if isinstance(f, ErrorInvalidOperation):
|
|
180
|
+
# This is probably a distinguished folder the server does not have. We previously tested the exact
|
|
181
|
+
# error message (f.value), but some Exchange servers return localized error messages, so that's not
|
|
182
|
+
# possible to do reliably.
|
|
183
|
+
continue
|
|
184
|
+
if isinstance(f, ErrorAccessDenied):
|
|
185
|
+
# We may not have GetFolder access, either to this folder or at all
|
|
186
|
+
continue
|
|
187
|
+
if isinstance(f, Exception):
|
|
188
|
+
raise f
|
|
189
|
+
folders_map[f.id] = f
|
|
190
|
+
for f in (
|
|
191
|
+
SingleFolderQuerySet(account=self.account, folder=self).depth(self.DEFAULT_FOLDER_TRAVERSAL_DEPTH).all()
|
|
192
|
+
):
|
|
193
|
+
if isinstance(f, ErrorAccessDenied):
|
|
194
|
+
# We may not have FindFolder access, or GetFolder access, either to this folder or at all
|
|
195
|
+
continue
|
|
196
|
+
if isinstance(f, MISSING_FOLDER_ERRORS):
|
|
197
|
+
# We were unlucky. The folder disappeared between the FindFolder and the GetFolder calls
|
|
198
|
+
continue
|
|
199
|
+
if isinstance(f, Exception):
|
|
200
|
+
raise f
|
|
201
|
+
if f.id in folders_map:
|
|
202
|
+
# Already exists. Probably a distinguished folder
|
|
203
|
+
continue
|
|
204
|
+
folders_map[f.id] = f
|
|
205
|
+
self._subfolders = folders_map
|
|
206
|
+
return folders_map
|
|
207
|
+
|
|
208
|
+
@classmethod
|
|
209
|
+
def from_xml(cls, elem, account):
|
|
210
|
+
kwargs = cls._kwargs_from_elem(elem=elem, account=account)
|
|
211
|
+
cls._clear(elem)
|
|
212
|
+
return cls(account=account, **kwargs)
|
|
213
|
+
|
|
214
|
+
@classmethod
|
|
215
|
+
def folder_cls_from_folder_name(cls, folder_name, folder_class, locale):
|
|
216
|
+
"""Return the folder class that matches a localized folder name. Take into account the 'folder_class' of the
|
|
217
|
+
folder, to not identify an 'IPF.Note' folder as a 'Calendar' class just because it's called e.g. 'Kalender' and
|
|
218
|
+
the locale is 'da_DK'.
|
|
219
|
+
|
|
220
|
+
Some folders, e.g. `System`, don't define a `folder_class`. For these folders, we match on localized folder name
|
|
221
|
+
if the folder class does not have its 'CONTAINER_CLASS' set.
|
|
222
|
+
|
|
223
|
+
:param folder_name:
|
|
224
|
+
:param folder_class:
|
|
225
|
+
:param locale: a string, e.g. 'da_DK'
|
|
226
|
+
"""
|
|
227
|
+
for folder_cls in cls.WELLKNOWN_FOLDERS + NON_DELETABLE_FOLDERS + MISC_FOLDERS:
|
|
228
|
+
if folder_cls.CONTAINER_CLASS != folder_class:
|
|
229
|
+
continue
|
|
230
|
+
if folder_name.lower() not in folder_cls.localized_names(locale):
|
|
231
|
+
continue
|
|
232
|
+
return folder_cls
|
|
233
|
+
raise KeyError()
|
|
234
|
+
|
|
235
|
+
def __getstate__(self):
|
|
236
|
+
# The lock cannot be pickled
|
|
237
|
+
state = {k: getattr(self, k) for k in self._slots_keys}
|
|
238
|
+
del state["_subfolders_lock"]
|
|
239
|
+
return state
|
|
240
|
+
|
|
241
|
+
def __setstate__(self, state):
|
|
242
|
+
# Restore the lock
|
|
243
|
+
for k in self._slots_keys:
|
|
244
|
+
setattr(self, k, state.get(k))
|
|
245
|
+
self._subfolders_lock = Lock()
|
|
246
|
+
|
|
247
|
+
def __repr__(self):
|
|
248
|
+
# Let's not create an infinite loop when printing self.root
|
|
249
|
+
return self.__class__.__name__ + repr(
|
|
250
|
+
(
|
|
251
|
+
self.account,
|
|
252
|
+
"[self]",
|
|
253
|
+
self.name,
|
|
254
|
+
self.total_count,
|
|
255
|
+
self.unread_count,
|
|
256
|
+
self.child_folder_count,
|
|
257
|
+
self.folder_class,
|
|
258
|
+
self.id,
|
|
259
|
+
self.changekey,
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class Root(RootOfHierarchy):
|
|
265
|
+
"""The root of the standard folder hierarchy."""
|
|
266
|
+
|
|
267
|
+
DISTINGUISHED_FOLDER_ID = "root"
|
|
268
|
+
WELLKNOWN_FOLDERS = WELLKNOWN_FOLDERS_IN_ROOT
|
|
269
|
+
|
|
270
|
+
@property
|
|
271
|
+
def tois(self):
|
|
272
|
+
# 'Top of Information Store' is a folder available in some Exchange accounts. It usually contains the
|
|
273
|
+
# distinguished folders belonging to the account (inbox, calendar, trash etc.).
|
|
274
|
+
return self.get_default_folder(MsgFolderRoot)
|
|
275
|
+
|
|
276
|
+
def get_default_folder(self, folder_cls):
|
|
277
|
+
with suppress(MISSING_FOLDER_ERRORS):
|
|
278
|
+
return super().get_default_folder(folder_cls)
|
|
279
|
+
|
|
280
|
+
# Try to pick a suitable default folder. we do this by:
|
|
281
|
+
# 1. Searching the full folder list for a folder with the distinguished folder name
|
|
282
|
+
# 2. Searching TOIS for a direct child folder of the same type that is marked as distinguished
|
|
283
|
+
# 3. Searching TOIS for a direct child folder of the same type that has a localized name
|
|
284
|
+
# 4. Searching root for a direct child folder of the same type that is marked as distinguished
|
|
285
|
+
# 5. Searching root for a direct child folder of the same type that has a localized name
|
|
286
|
+
log.debug("Searching default %s folder in full folder list", folder_cls)
|
|
287
|
+
|
|
288
|
+
for f in self._folders_map.values():
|
|
289
|
+
# Require exact type, to avoid matching with subclasses (e.g. RecipientCache and Contacts)
|
|
290
|
+
if f.__class__ == folder_cls and f.has_distinguished_name:
|
|
291
|
+
log.debug("Found cached %s folder with default distinguished name", folder_cls)
|
|
292
|
+
return f
|
|
293
|
+
|
|
294
|
+
# Try direct children of TOIS first, unless we're trying to get the TOIS folder
|
|
295
|
+
if folder_cls != MsgFolderRoot:
|
|
296
|
+
with suppress(MISSING_FOLDER_ERRORS):
|
|
297
|
+
return self._get_candidate(folder_cls=folder_cls, folder_coll=self.tois.children)
|
|
298
|
+
# No candidates, or TOIS does not exist, or we don't have access to TOIS
|
|
299
|
+
|
|
300
|
+
# Finally, try direct children of root
|
|
301
|
+
return self._get_candidate(folder_cls=folder_cls, folder_coll=self.children)
|
|
302
|
+
|
|
303
|
+
def _get_candidate(self, folder_cls, folder_coll):
|
|
304
|
+
# Look for a single useful folder of type folder_cls in folder_coll
|
|
305
|
+
same_type = [f for f in folder_coll if f.__class__ == folder_cls]
|
|
306
|
+
are_distinguished = [f for f in same_type if f.is_distinguished]
|
|
307
|
+
if are_distinguished:
|
|
308
|
+
candidates = are_distinguished
|
|
309
|
+
else:
|
|
310
|
+
candidates = [f for f in same_type if f.name.lower() in folder_cls.localized_names(self.account.locale)]
|
|
311
|
+
if not candidates:
|
|
312
|
+
raise ErrorFolderNotFound(f"No usable default {folder_cls} folders")
|
|
313
|
+
if len(candidates) > 1:
|
|
314
|
+
raise ValueError(f"Multiple possible default {folder_cls} folders: {[f.name for f in candidates]}")
|
|
315
|
+
candidate = candidates[0]
|
|
316
|
+
if candidate.is_distinguished:
|
|
317
|
+
log.debug("Found distinguished %s folder", folder_cls)
|
|
318
|
+
else:
|
|
319
|
+
log.debug("Found %s folder with localized name %s", folder_cls, candidate.name)
|
|
320
|
+
return candidate
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
class PublicFoldersRoot(RootOfHierarchy):
|
|
324
|
+
"""The root of the public folder hierarchy. Not available on all mailboxes."""
|
|
325
|
+
|
|
326
|
+
DISTINGUISHED_FOLDER_ID = "publicfoldersroot"
|
|
327
|
+
DEFAULT_FOLDER_TRAVERSAL_DEPTH = SHALLOW
|
|
328
|
+
supported_from = EXCHANGE_2007_SP1
|
|
329
|
+
|
|
330
|
+
def __init__(self, **kwargs):
|
|
331
|
+
super().__init__(**kwargs)
|
|
332
|
+
if self._distinguished_id:
|
|
333
|
+
self._distinguished_id.mailbox = None # See DistinguishedFolderId.clean()
|
|
334
|
+
|
|
335
|
+
@property
|
|
336
|
+
def _folders_map(self):
|
|
337
|
+
# Top-level public folders may point to the root folder of the owning account and not the public folders root
|
|
338
|
+
# of this account. This breaks the assumption of get_children(). Fix it by overwriting the parent folder.
|
|
339
|
+
fix_parents = self._subfolders is None
|
|
340
|
+
res = super()._folders_map
|
|
341
|
+
if fix_parents:
|
|
342
|
+
with self._subfolders_lock:
|
|
343
|
+
for f in res.values():
|
|
344
|
+
if f.id != self.id:
|
|
345
|
+
f.parent = self
|
|
346
|
+
return res
|
|
347
|
+
|
|
348
|
+
def get_children(self, folder):
|
|
349
|
+
# EWS does not allow deep traversal of public folders, so self._folders_map will only populate the top-level
|
|
350
|
+
# subfolders. To traverse public folders at arbitrary depth, we need to get child folders on demand.
|
|
351
|
+
|
|
352
|
+
# Let's check if this folder already has any cached children. If so, assume we can just return those.
|
|
353
|
+
children = list(super().get_children(folder=folder))
|
|
354
|
+
if children:
|
|
355
|
+
# Return a generator like our parent does
|
|
356
|
+
yield from children
|
|
357
|
+
return
|
|
358
|
+
|
|
359
|
+
# Also return early if the server told us that there are no child folders.
|
|
360
|
+
if folder.child_folder_count == 0:
|
|
361
|
+
return
|
|
362
|
+
|
|
363
|
+
children_map = {}
|
|
364
|
+
with suppress(ErrorAccessDenied):
|
|
365
|
+
for f in (
|
|
366
|
+
SingleFolderQuerySet(account=self.account, folder=folder)
|
|
367
|
+
.depth(self.DEFAULT_FOLDER_TRAVERSAL_DEPTH)
|
|
368
|
+
.all()
|
|
369
|
+
):
|
|
370
|
+
if isinstance(f, MISSING_FOLDER_ERRORS):
|
|
371
|
+
# We were unlucky. The folder disappeared between the FindFolder and the GetFolder calls
|
|
372
|
+
continue
|
|
373
|
+
if isinstance(f, Exception):
|
|
374
|
+
raise f
|
|
375
|
+
children_map[f.id] = f
|
|
376
|
+
|
|
377
|
+
# Let's update the cache atomically, to avoid partial reads of the cache.
|
|
378
|
+
with self._subfolders_lock:
|
|
379
|
+
self._subfolders.update(children_map)
|
|
380
|
+
|
|
381
|
+
# Child folders have been cached now. Try super().get_children() again.
|
|
382
|
+
yield from super().get_children(folder=folder)
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
class ArchiveRoot(RootOfHierarchy):
|
|
386
|
+
"""The root of the archive folders hierarchy. Not available on all mailboxes."""
|
|
387
|
+
|
|
388
|
+
DISTINGUISHED_FOLDER_ID = "archiveroot"
|
|
389
|
+
supported_from = EXCHANGE_2010_SP1
|
|
390
|
+
WELLKNOWN_FOLDERS = WELLKNOWN_FOLDERS_IN_ARCHIVE_ROOT
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from .fields import Choice, EmailSubField, LabelField, NamedSubField, SubField
|
|
4
|
+
from .properties import EWSElement, EWSMeta
|
|
5
|
+
|
|
6
|
+
log = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class IndexedElement(EWSElement, metaclass=EWSMeta):
|
|
10
|
+
"""Base class for all classes that implement an indexed element."""
|
|
11
|
+
|
|
12
|
+
LABEL_CHOICES = ()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SingleFieldIndexedElement(IndexedElement, metaclass=EWSMeta):
|
|
16
|
+
"""Base class for all classes that implement an indexed element with a single field."""
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def value_field(cls, version):
|
|
20
|
+
fields = cls.supported_fields(version=version)
|
|
21
|
+
if len(fields) != 1:
|
|
22
|
+
raise ValueError(f"Class {cls} must have only one value field (found {tuple(f.name for f in fields)})")
|
|
23
|
+
return fields[0]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class EmailAddress(SingleFieldIndexedElement):
|
|
27
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-emailaddress"""
|
|
28
|
+
|
|
29
|
+
ELEMENT_NAME = "Entry"
|
|
30
|
+
LABEL_CHOICES = ("EmailAddress1", "EmailAddress2", "EmailAddress3")
|
|
31
|
+
|
|
32
|
+
label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default=LABEL_CHOICES[0])
|
|
33
|
+
email = EmailSubField(is_required=True)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ImAddress(SingleFieldIndexedElement):
|
|
37
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-imaddress"""
|
|
38
|
+
|
|
39
|
+
ELEMENT_NAME = "Entry"
|
|
40
|
+
LABEL_CHOICES = ("ImAddress1", "ImAddress2", "ImAddress3")
|
|
41
|
+
|
|
42
|
+
label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default=LABEL_CHOICES[0])
|
|
43
|
+
im_address = SubField(is_required=True)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class PhoneNumber(SingleFieldIndexedElement):
|
|
47
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-phonenumber"""
|
|
48
|
+
|
|
49
|
+
ELEMENT_NAME = "Entry"
|
|
50
|
+
LABEL_CHOICES = (
|
|
51
|
+
"AssistantPhone",
|
|
52
|
+
"BusinessFax",
|
|
53
|
+
"BusinessPhone",
|
|
54
|
+
"BusinessPhone2",
|
|
55
|
+
"Callback",
|
|
56
|
+
"CarPhone",
|
|
57
|
+
"CompanyMainPhone",
|
|
58
|
+
"HomeFax",
|
|
59
|
+
"HomePhone",
|
|
60
|
+
"HomePhone2",
|
|
61
|
+
"Isdn",
|
|
62
|
+
"MobilePhone",
|
|
63
|
+
"OtherFax",
|
|
64
|
+
"OtherTelephone",
|
|
65
|
+
"Pager",
|
|
66
|
+
"PrimaryPhone",
|
|
67
|
+
"RadioPhone",
|
|
68
|
+
"Telex",
|
|
69
|
+
"TtyTddPhone",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default="PrimaryPhone")
|
|
73
|
+
phone_number = SubField(is_required=True)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class MultiFieldIndexedElement(IndexedElement, metaclass=EWSMeta):
|
|
77
|
+
"""Base class for all classes that implement an indexed element with multiple fields."""
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class PhysicalAddress(MultiFieldIndexedElement):
|
|
81
|
+
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/entry-physicaladdress"""
|
|
82
|
+
|
|
83
|
+
ELEMENT_NAME = "Entry"
|
|
84
|
+
LABEL_CHOICES = ("Business", "Home", "Other")
|
|
85
|
+
|
|
86
|
+
label = LabelField(field_uri="Key", choices={Choice(c) for c in LABEL_CHOICES}, default=LABEL_CHOICES[0])
|
|
87
|
+
street = NamedSubField(field_uri="Street") # Street, house number, etc.
|
|
88
|
+
city = NamedSubField(field_uri="City")
|
|
89
|
+
state = NamedSubField(field_uri="State")
|
|
90
|
+
country = NamedSubField(field_uri="CountryOrRegion")
|
|
91
|
+
zipcode = NamedSubField(field_uri="PostalCode")
|
|
92
|
+
|
|
93
|
+
def clean(self, version=None):
|
|
94
|
+
if isinstance(self.zipcode, int):
|
|
95
|
+
self.zipcode = str(self.zipcode)
|
|
96
|
+
super().clean(version=version)
|