Python Caldav, все календари не имеют имени

Я пытаюсь получить доступ ко всем событиям моего календаря, размещенного на Nextcloud, с помощью python и библиотеки caldav. С этим кодом:

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

Я могу получить доступ ко всем своим календарям и перебирать их.

Как я могу прочитать только определенный календарь с именем «имя_календаря»? В этом случае я получаю все календари, даже если укажу имя календаря:

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-адрес правильный.


person cent89    schedule 01.01.2017    source источник
comment
Пожалуйста, покажите код, который вы используете для доступа к названию календаря (тогда это None).   -  person hnh    schedule 02.01.2017


Ответы (1)


Второй фрагмент по-прежнему дает вам все календари, потому что вы сначала выбираете учетную запись (.principal()), а затем перечисляете все календари, которые есть у учетной записи (principal.calendars()).

Третий фрагмент, вероятно, не работает, потому что имя (свойство отображаемое имя, а не компонент пути URL) календаря, скорее всего, не calendar_name, а что-то вроде 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()])

Надеюсь это поможет.

person hnh    schedule 02.01.2017