0

我正在尝试使用 python 和 caldav 库访问托管在 Nextcloud 上的日历的所有事件。使用此代码:

client = caldav.DAVClient(url) #like "https://..../nextcloud/remote.php/dav/calendars
principal = client.principal()
calendars = principal.calendars()

我可以访问我所有的日历并对其进行迭代。

我如何只能读取名称为“calendar_name”的特定日历?在这种情况下,即使我指定了日历名称,我也会得到所有日历:

client = caldav.DAVClient(url) #like "https://..../nextcloud/remote.php/dav/calendars/user/calendar_name
principal = client.principal()
calendars = principal.calendars()

如果我用 calendar_name 更改最后一行代码,我会得到一个空数组。

calendar = principal.calendar('calendar_name')

注意:我可以使用发布的第一个代码访问所有日历和事件,但所有名称都是“无”,即使 URL 是正确的。

4

1 回答 1

1

第二个片段仍然为您提供所有日历,因为您首先获取帐户 ( .principal()),然后列出该帐户拥有的所有日历 ( principal.calendars())。

第三个片段可能不起作用,因为日历的名称(显示名称calendar_name属性,而不是 URL 路径组件)很可能不是Calendar. 理论上它甚至可能是空的。

要使用其 URL 访问单个日历,这可能有效,但未尝试:

client   = caldav.DAVClient(url)
calendar = caldav.Calendar(client=client, 
             url="/nextcloud/remote.php/dav/calendars/user/calendar_name")

尽管出于各种原因,这样做可能会更好:

client    = caldav.DAVClient(url)
principal = client.principal()
calendars = principal.calendars()
calendar  = any(c for c in calendars if c.url == your url)

要解决您的实际问题,您需要添加更多信息。如果您想要日历的(相对或绝对)URL,请使用以下内容:

print calendar.url

如果您想显式检索日历显示名称,这可能有效:

print calendar.get_properties([dav.DisplayName()])

希望这可以帮助。

于 2017-01-02T13:26:14.260 回答