Ticket #473: gcal-recurrency.patch

File gcal-recurrency.patch, 3.4 KB (added by srwalter, 7 years ago)

Support recurrent events in google calendar

  • src/google-cal-helper.py

    old new  
    138138        sys.stderr.write("xs to osync: %s => %s\n" % (s, r)) 
    139139        return r 
    140140 
     141GDEND_RE = re.compile("DTEND;[^:]*:(\S+)") 
     142def gdRecurToEnd(recur): 
     143        m = GDEND_RE.search(recur) 
     144        if m is None: 
     145            raise DateConversionError("failed to find end in \"%s\"" % recur) 
     146        start = m.group(1) 
     147        year = start[0:4] 
     148        month = start[4:6] 
     149        day = start[6:8] 
     150        hour = start[9:11] 
     151        min = start[11:13] 
     152        sec = start[13:15] 
     153        return "%s-%2s-%2sT%2s:%2s:%2s" % (year, month, day, hour, min, sec) 
     154 
     155GDSTART_RE = re.compile("DTSTART;[^:]*:(\S+)") 
     156def gdRecurToStart(recur): 
     157        m = GDSTART_RE.search(recur) 
     158        if m is None: 
     159            raise DateConversionError("failed to find start in \"%s\"" % recur) 
     160        start = m.group(1) 
     161        year = start[0:4] 
     162        month = start[4:6] 
     163        day = start[6:8] 
     164        hour = start[9:11] 
     165        min = start[11:13] 
     166        sec = start[13:15] 
     167        return "%s-%2s-%2sT%2s:%2s:%2s" % (year, month, day, hour, min, sec) 
     168 
     169GDRECUR_RE = re.compile("RRULE:(\S+)") 
     170def gdRecurToORecur(recur): 
     171        m = GDRECUR_RE.search(recur) 
     172        if m is None: 
     173            raise DateConversionError("failed to find rule in \"%s\"" % recur) 
     174        return m.group(1) 
     175 
    141176class GCalRequestError(Exception): 
    142177        def __init__(self, response): 
    143178                self.response = response 
     
    159194                self.id = self.elementValue('atom:id/text()') 
    160195                self.editUri = self.elementValue('atom:link[@rel="edit"]/@href') 
    161196                self.content = self.elementValue('atom:content[@type="text"]/text()') 
    162                 self.dtstart = self.elementValue('gd:when/@startTime') 
    163                 self.dtend = self.elementValue('gd:when/@endTime') 
     197                self.dtrecur = self.elementValue('gd:recurrence/text()') 
     198                if self.dtrecur: 
     199                    pass 
     200                    self.dtstart = gdRecurToStart(self.dtrecur) 
     201                    self.dtend = gdRecurToEnd(self.dtrecur) 
     202                    self.dtrecur = gdRecurToORecur(self.dtrecur) 
     203                else: 
     204                    self.dtstart = self.elementValue('gd:when/@startTime') 
     205                    self.dtend = self.elementValue('gd:when/@endTime') 
    164206 
    165207                self.eventStatus = self.elementValue('gd:eventStatus/@value') 
    166208                self.whereString = self.elementValue('gd:where/@valueString') 
    167209 
    168                 #FIXME: Handle recurrency 
    169210                #FIXME: Handle gd:eventStatus 
    170211 
    171212 
     
    197238                self.addElementContent(doc, event, 'Summary', self.title) 
    198239                self.addElementContent(doc, event, 'Description', self.content) 
    199240 
    200                 self.addElementContent(doc, event, 'DateStarted', xsdateToOsync(self.dtstart)) 
    201                 self.addElementContent(doc, event, 'DateEnd', xsdateToOsync(self.dtend)) 
     241                self.addElementContent(doc, event, 'DateStarted', xsdateToOsync(self.dtstart)) 
     242                self.addElementContent(doc, event, 'DateEnd', xsdateToOsync(self.dtend)) 
     243                if self.dtrecur: 
     244                        self.addElementContent(doc, event, 'RecurrenceRule', 
     245                                               self.dtrecur) 
     246 
    202247                self.addElementContent(doc, event, 'Location', self.whereString) 
    203248 
    204                 #TODO: UID, editUri, dtstart, dtend, recurrency, eventStatus 
     249                #TODO: UID, editUri, dtstart, dtend, eventStatus 
    205250                return doc.toxml(encoding='utf-8') 
    206251 
    207252        def dumpGdata(self):