feat(calendar): list external read-only (subscribed) calendars
list_calendars only kept PROPFIND responses whose resourcetype was <c:calendar>, so external subscriptions (webcal/ICS feeds) — exposed by Nextcloud as <cs:subscribed> collections — were silently dropped and never appeared in nc_calendar_list_calendars (issue #830). - Construct the calendar DAV client with `X-NC-CalDAV-Webcal-Caching: On` so Nextcloud exposes subscriptions as queryable CachedSubscription calendars, making their events readable through the existing event/search tools (the same mechanism Evolution/KDE desktop clients use). - In list_calendars, override that header to "Off" so subscriptions are returned as cs:subscribed collections with their cs:source href, then parse responses whose resourcetype is c:calendar OR cs:subscribed. Subscriptions are reported with read_only=True and their source feed URL; their color is read from the Apple iCal namespace as a fallback. - Send the custom PROPFIND markup via `body=` instead of `props=`: under caldav 3.x `props=` expects a list of property names and discards a raw XML string, producing an empty <prop/>. This also restores display_name, description and color which were previously falling back to defaults. - Add `read_only` and `source` fields to the Calendar model. Adds unit tests for subscription parsing, the body/header wiring, and the webcal-caching header; extends the integration test to assert the new fields.
This commit is contained in:
@@ -89,8 +89,18 @@ async def test_list_calendars(nc_client: NextcloudClient):
|
||||
# Optional fields
|
||||
assert "description" in calendar
|
||||
assert "color" in calendar
|
||||
# External subscription metadata (issue #830): always present, with
|
||||
# read_only=True / a source URL for subscribed calendars.
|
||||
assert "read_only" in calendar
|
||||
assert isinstance(calendar["read_only"], bool)
|
||||
assert "source" in calendar
|
||||
|
||||
logger.info("Calendar: %s - %s", calendar["name"], calendar["display_name"])
|
||||
logger.info(
|
||||
"Calendar: %s - %s (read_only=%s)",
|
||||
calendar["name"],
|
||||
calendar["display_name"],
|
||||
calendar["read_only"],
|
||||
)
|
||||
|
||||
|
||||
async def test_create_and_delete_event(
|
||||
|
||||
Reference in New Issue
Block a user