[Vobject] Recurring Events Examples

Keyton Weissinger keyton at gmail.com
Sun Sep 20 06:18:34 CDT 2009


Thank you Jeffrey! This looks an excellent start.

Sent from my iPhone

On Sep 20, 2009, at 2:23 AM, Jeffrey Harris  
<jeffrey at osafoundation.org> wrote:

> Hi Keyton,
>
>> Do you have any example Python code showing the creation of recurring
>> events? Do most developers create copies of the other event and then
>> sort of keep up with them, sending, say, the next ten? Or can I  
>> send a
>> recurring event to Outlook etc via a single iCal entry?
>
> There are a few calendar clients that create a limited subset of a
> recurring series of events, but that's not common these days.
>
> The sections on recurrence in RFC2445 are long and complicated, but  
> the
> basic idea is reasonably simple.  You can do this:
>
>>>> import vobject
>>>> import datetime
>>>> cal = vobject.iCalendar()
>>>> cal.add('vevent').add('dtstart')
> <DTSTART{}>
>>>> cal.vevent.dtstart.value = datetime.datetime(2009,9,19,10)
>>>> cal.vevent.add('rrule').value = "FREQ=WEEKLY"
>>>> print cal.serialize()
> BEGIN:VCALENDAR
> VERSION:2.0
> PRODID:-//PYVOBJECT//NONSGML Version 1//EN
> BEGIN:VEVENT
> UID:20090920T060033Z-91602 at jeffrey.local
> DTSTART:20090919T100000
> RRULE:FREQ=WEEKLY
> END:VEVENT
> END:VCALENDAR
>
>
> This is an indefinitely recurring event, recurring weekly on Saturday
> mornings (to be legal, it should have a timezone, but almost no one
> enforces that rule).  vobject maps recurrence information in VEVENTs
> like this to a special object that helps with recurrence, a
> dateutil.rrule.rruleset.
>
> If you want to see the first three occurrences of the rule (be careful
> not to expand the entire series, it's indefinitely recurring into the
> future), do this:
>
>>>> cal.vevent.rruleset[0:3]
> [datetime.datetime(2009, 9, 19, 10, 0),
> datetime.datetime(2009, 9, 26, 10, 0),
> datetime.datetime(2009, 10, 3, 10, 0)]
>
> If you want to add a Sunday to this every-Saturday rule, do:
>
>>>> cal.vevent.add('rdate').value = [datetime.datetime(2009,9,20,10)]
>
> You can also exclude particular dates:
>
>>>> cal.vevent.add('exdate').value = [datetime.datetime(2009,9,26,10)]
>
> Note that RDATE and EXDATE can each take multiple dates, so when you  
> set
> value it needs to be a list of dates or datetimes, not an individual
> date or datetime.  Now the first three occurrences look like this:
>
>>>> cal.vevent.rruleset[0:3]
> [datetime.datetime(2009, 9, 19, 10, 0),
> datetime.datetime(2009, 9, 20, 10, 0),
> datetime.datetime(2009, 10, 3, 10, 0)]
>
> --------------
>
> If you want to change a specific occurrence (or a particular  
> occurrence
> and all later occurrences), you do that by creating a *new* VEVENT,  
> with
> an identical UID to the master VEVENT (the master has the RRULE set).
>
> In this new VEVENT set RECURRENCE-ID to match the DTSTART for the
> occurrence you're changing.
>
> vobject doesn't help you with multiple VEVENTs, or help you parse
> iCalendar with several VEVENTs representing the same recurring series.
> I've thought about adding convenience functions to do this, but I've
> never gotten around to it.
>
> Hope that helps,
> Jeffrey
> _______________________________________________
> VObject mailing list
> VObject at lists.skyhouseconsulting.com
> http://lists.skyhouseconsulting.com/mailman/listinfo/vobject


More information about the VObject mailing list