2

I run ownCloud on my webspace for a shared calendar. Now I'm looking for a suitable python library to get read only access to the calendar. I want to put some information of the calendar on an intranet website.

I have tried http://trac.calendarserver.org/wiki/CalDAVClientLibrary but it always returns a NotImplementedError with the query command, so my guess is that the query command doesn't work well with the given library.

What library could I use instead?

TuringTux
  • 559
  • 1
  • 12
  • 26
hildwin
  • 95
  • 1
  • 1
  • 5

4 Answers4

8

I recommend the library, caldav.

Read-only is working really well with this library and looks straight-forward to me. It will do the whole job of getting calendars and reading events, returning them in the iCalendar format. More information about the caldav library can also be obtained in the documentation.

import caldav

client = caldav.DAVClient(<caldav-url>, username=<username>,
                          password=<password>)
principal = client.principal()
for calendar in principal.calendars():
    for event in calendar.events():
        ical_text = event.data

From this on you can use the icalendar library to read specific fields such as the type (e. g. event, todo, alarm), name, times, etc. - a good starting point may be this question.

wpercy
  • 9,636
  • 4
  • 33
  • 45
de fl0r
  • 101
  • 2
  • 6
  • Welcome to Stack Overflow! Whilst this may theoretically answer the question, [it would be preferable](//meta.stackoverflow.com/q/8259) to include the essential parts of the answer here, and provide the link for reference. – Rohit Gupta Jun 24 '15 at 20:52
  • 2
    thanks for the comment, I think the edit is what you asked for? – de fl0r Jun 25 '15 at 21:27
2

I wrote this code few months ago to fetch data from CalDAV to present them on my website. I have changed the data into JSON format, but you can do whatever you want with the data.

I have added some print for you to see the output which you can remove them in production.

    from datetime import datetime
import json
from pytz import UTC # timezone
import caldav
from icalendar import Calendar, Event

# CalDAV info
url = "YOUR CALDAV URL"
userN = "YOUR CALDAV USERNAME"
passW = "YOUR CALDAV PASSWORD"

client = caldav.DAVClient(url=url, username=userN, password=passW)
principal = client.principal()
calendars = principal.calendars()

if len(calendars) > 0:
    calendar = calendars[0]
    print ("Using calendar", calendar)
    results = calendar.events()
    eventSummary = []
    eventDescription = []
    eventDateStart = []
    eventdateEnd = []
    eventTimeStart = []
    eventTimeEnd = []

    for eventraw in results:

        event = Calendar.from_ical(eventraw._data)
        for component in event.walk():
            if component.name == "VEVENT":
                print (component.get('summary'))
                eventSummary.append(component.get('summary'))
                print (component.get('description'))
                eventDescription.append(component.get('description'))
                startDate = component.get('dtstart')
                print (startDate.dt.strftime('%m/%d/%Y %H:%M'))
                eventDateStart.append(startDate.dt.strftime('%m/%d/%Y'))
                eventTimeStart.append(startDate.dt.strftime('%H:%M'))
                endDate = component.get('dtend')
                print (endDate.dt.strftime('%m/%d/%Y %H:%M'))
                eventdateEnd.append(endDate.dt.strftime('%m/%d/%Y'))
                eventTimeEnd.append(endDate.dt.strftime('%H:%M'))
                dateStamp = component.get('dtstamp')
                print (dateStamp.dt.strftime('%m/%d/%Y %H:%M'))
                print ('')

    # Modify or change these values based on your CalDAV
    # Converting to JSON
    data = [{ 'Events Summary':eventSummary[0], 'Event Description':eventDescription[0],'Event Start date':eventDateStart[0], 'Event End date':eventdateEnd[0], 'At:':eventTimeStart[0], 'Until':eventTimeEnd[0]}]
    data_string = json.dumps(data)
    print ('JSON:', data_string)
0

You probably want to provide more details about how you are actually making use of the API but in case the query command is indeed not implemented, there is a list of other Python libraries at the CalConnect website (archvied version, original link is dead now).

TuringTux
  • 559
  • 1
  • 12
  • 26
Arnaud Quillaud
  • 4,420
  • 1
  • 12
  • 8
0

pyOwnCloud could be the right thing for you. I haven't tried it, but it should provide a CMDline/API for reading the calendars.

Huge
  • 661
  • 7
  • 14