-----
- Remove use of `ThreadPool` objects. Threads were used to implement async HTTP requests, but were creating massive
memory leaks. Async requests should be reimplemented using a real async HTTP request package, so this is just an
emergency fix. This also lowers the default
`Protocol.SESSION_POOLSIZE` to 1 because no internal code is running multi-threaded anymore.
- All-day calendar items (created as `CalendarItem(is_all_day=True, ...)`) now accept `EWSDate`
instances for the `start` and `end` values. Similarly, all-day calendar items fetched from the server now
return `start` and `end` values as `EWSDate` instances. In this case, start and end values are inclusive; a one-day
event starts and ends on the same `EWSDate` value.
- Add support for `RecurringMasterItemId` and `OccurrenceItemId` elements that allow to request the master recurrence
from a `CalendarItem` occurrence, and to request a specific occurrence from a `CalendarItem` master
recurrence. `CalendarItem.master_recurrence()` and
`CalendarItem.occurrence(some_occurrence_index)` methods were added to aid this traversal.
`some_occurrence_index` in the last method specifies which item in the list of occurrences to
target; `CalendarItem.occurrence(3)` gets the third occurrence in the recurrence.
- Change `Contact.birthday` and `Contact.wedding_anniversary` from `EWSDateTime` to `EWSDate`
fields. EWS still expects and sends datetime values but has started to reset the time part to 11:59. Dates are a
better match for these two fields anyway.
- Remove support for `len(some_queryset)`. It had the nasty side-effect of forcing
`list(some_queryset)` to run the query twice, once for pre-allocating the list via the result of `len(some_queryset)`,
and then once more to fetch the results. All occurrences of
`len(some_queryset)` can be replaced with `some_queryset.count()`. Unfortunately, there is no way to keep
backwards-compatibility for this feature.
- Added `Account.identity`, an attribute to contain extra information for impersonation. Setting
`Account.identity.upn` or `Account.identity.sid` removes the need for an AD lookup on every request.
`upn` will often be the same as `primary_smtp_address`, but it is not guaranteed. If you have access to your
organization's AD servers, you can look up these values once and add them to your
`Account` object to improve performance of the following requests.
- Added support for CBA authentication