⚠️ Deprecations & Removals
* `get_observation()` is now deprecated, and will be removed in a future release
* Please use `get_observations()` or `get_observations_by_id()` instead
* Remove redundant `Annotation.controlled_attribute_id` and `controlled_value_id` attributes (These can still be used as init arguments)
New Endpoints
* Added new **Observation** endpoint:
* `get_observations_by_id()`
* Replaces `get_observation`
* Accepts multiple IDs
* Uses a different endpoint (`GET /observations/{id}` instead of `GET /observations?id={id}`)
* returns full term and value details for annotations
Modified Endpoints
* Add some undocumented request params to `get_taxa_by_id()`:
* `locale`
* `preferred_place_id`
* `all_names`
Models
* Add full mapping of conservation status codes for IUCN, NatureServe, Norma Oficial Mexicana, and other generic codes
* Translate `ConservationStatus.status_name` based on status code and authority for more consistent results
* Add `ConservationStatus.display_name` property
* Add `Observation.default_photo` property
* Use taxon icon as placeholder for `Observation.default_photo` if observation has no photos
* Update `Annotation` model to include controlled term and value details from updated `GET /observations/{id}` response format
* Add `Annotation.term` and `value` properties and init arguments for simpler initialization from term and value labels
Sessions
* Add `cache_control` option to `ClientSession` to disable using Cache-Control headers for cache
expiration (enabled by default)
* Add `urls_expire_after` option to `ClientSession` to update default cache expiration URL patterns
Bugfixes
* Fix error `413: Payload too large` when using `add_project_users()` or `delete_project_users()` with a project with a large number of rules
* Fix JWT caching
* Fix `ObservationFieldValue` conversions for `date` and `datetime` fields
* Fix printing `Annotation` objects with `rich`
* Fix printing `Observation` tables when taxon is missing
Other Changes
* Added support for python 3.11
* All API functions that accept taxonomic rank parameters (`rank`, `lrank`, `observation_hrank`,etc.) now accept all rank variations that iNaturalist accepts (`var`, `spp` `sub-species`, etc.)
* Optionally use `ultrajson` instead of stdlib `json`, if installed
* Add `loop` argument to iNatClient and Paginator classes to allow passing an async event loop to be used for async iteration
* Add `Paginator.async_all()` method (async, non-blocking version of `.all()`)