Changeset 2232

Show
Ignore:
Timestamp:
07/01/07 12:38:02 (1 year ago)
Author:
abaumann
Message:

handle different meaning of repeat types in the extended calendar format (ticket #425)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • plugins/moto-sync/motosync.py

    r2197 r2232  
    6060 
    6161# repeat types in the calendar 
    62 # XXX FIXME: check order of DATE/DAY for monthly and yearly on extended-format phones 
     62# these have a different meaning in the simple and extended calendars (why???!) 
    6363MOTO_REPEAT_NONE = 0 
    6464MOTO_REPEAT_DAILY = 1 
    6565MOTO_REPEAT_WEEKLY = 2 
    66 MOTO_REPEAT_MONTHLY_DATE = 3 
    67 MOTO_REPEAT_MONTHLY_DAY = 4 
    68 MOTO_REPEAT_YEARLY_DATE = 5 
    69 MOTO_REPEAT_YEARLY_DAY = 6 # extended calendar format only 
     66MOTO_REPEAT_SIMPLE_MONTHLY_DATE = 3 
     67MOTO_REPEAT_SIMPLE_MONTHLY_DAY = 4 
     68MOTO_REPEAT_SIMPLE_YEARLY_DATE = 5 
     69MOTO_REPEAT_EXTENDED_MONTHLY_DAY = 3 
     70MOTO_REPEAT_EXTENDED_MONTHLY_DATE = 4 
     71MOTO_REPEAT_EXTENDED_YEARLY_DAY = 5 
     72MOTO_REPEAT_EXTENDED_YEARLY_DATE = 6 
    7073 
    7174# features we require; these refer to the bits returned by the AT+MAID? command 
     
    430433    return ((daynum + 1) % 7) * 8 + nth 
    431434 
    432 def xml_rrule_to_moto(rulenodes, exdates, exrules, eventdt): 
     435def xml_rrule_to_moto(rulenodes, exdates, exrules, eventdt, extended_format): 
    433436    """Process XML recursion rules, converting them to the closest-possible 
    434437    matching recursion specifier supported by the phone. 
     
    439442      exrules:   list of exception rules 
    440443      eventdt:   event's date (and time if set) 
     444      extended_format: bool iff the extended calendar format is used 
    441445 
    442446    Returns a dict containing the following fields: 
     
    516520    elif (freq == 'MONTHLY' and not byday and (not bymonthday or bymonthday == set([eventdt.day])) 
    517521            and not byyearday and (not bymonth or bymonth == byallmonths)): 
    518         ret['repeat_type'] = MOTO_REPEAT_MONTHLY_DATE 
     522        if extended_format: 
     523            ret['repeat_type'] = MOTO_REPEAT_EXTENDED_MONTHLY_DATE 
     524        else: 
     525            ret['repeat_type'] = MOTO_REPEAT_SIMPLE_MONTHLY_DATE 
    519526    elif (freq == 'MONTHLY' and byday and len(byday) == 1 and not bymonthday 
    520527            and not byyearday and (not bymonth or bymonth == byallmonths)): 
    521         ret['repeat_type'] = MOTO_REPEAT_MONTHLY_DAY 
     528        if extended_format: 
     529            ret['repeat_type'] = MOTO_REPEAT_EXTENDED_MONTHLY_DAY 
     530        else: 
     531            ret['repeat_type'] = MOTO_REPEAT_SIMPLE_MONTHLY_DAY 
    522532        if not (byday_daynum == eventdt.weekday() and byday_nth == eventweek): 
    523533            ret['repeat_day'] = moto_monthday_to_repeat_day(byday_nth, byday_daynum) 
    524534    elif (freq == 'YEARLY' and not byday and (not bymonthday or bymonthday == set([eventdt.day])) 
    525535            and not byyearday and (not bymonth or bymonth == set([eventdt.month]))): 
    526         ret['repeat_type'] = MOTO_REPEAT_YEARLY_DATE 
    527     elif (freq == 'YEARLY' and byday and len(byday == 1) 
     536        if extended_format: 
     537            ret['repeat_type'] = MOTO_REPEAT_EXTENDED_YEARLY_DATE 
     538        else: 
     539            ret['repeat_type'] = MOTO_REPEAT_SIMPLE_YEARLY_DATE 
     540    elif (freq == 'YEARLY' and extended_format and byday and len(byday == 1) 
    528541            and (not bymonthday or bymonthday == set([eventdt.day])) 
    529542            and not byyearday and (not bymonth or bymonth == set([eventdt.month]))): 
    530         ret['repeat_type'] = MOTO_REPEAT_YEARLY_DAY 
     543        ret['repeat_type'] = MOTO_REPEAT_EXTENDED_YEARLY_DAY 
    531544        if not (byday_daynum == eventdt.weekday() and byday_nth == eventweek): 
    532545            ret['repeat_day'] = moto_monthday_to_repeat_day(byday_nth, byday_daynum) 
     
    571584    return ret 
    572585 
    573 def moto_rrule_to_xml(doc, eventdt, repeat_type, exceptions, 
     586def moto_rrule_to_xml(doc, eventdt, repeat_type, exceptions, extended_format, 
    574587                      repeat_every=None, repeat_day=None, repeat_end=None): 
    575588    """Convert a Motorola-format recurrence to the corresponding XML description. 
     
    600613        rule = rrule.rrule(rrule.WEEKLY, byweekday=repeat_days, 
    601614                           dtstart=eventdt, interval=repeat_every, until=repeat_end) 
    602     elif repeat_type == MOTO_REPEAT_MONTHLY_DATE: 
     615    elif ((not extended_format and repeat_type == MOTO_REPEAT_SIMPLE_MONTHLY_DATE) 
     616          or (extended_format and repeat_type == MOTO_REPEAT_EXTENDED_MONTHLY_DATE)): 
    603617        appendXMLTag(doc, e, 'Frequency', 'MONTHLY') 
    604618        appendXMLTag(doc, e, 'ByMonthDay', str(eventdt.day)) 
    605619        rule = rrule.rrule(rrule.MONTHLY, bymonthday=eventdt.day, 
    606620                           dtstart=eventdt, interval=repeat_every, until=repeat_end) 
    607     elif repeat_type == MOTO_REPEAT_MONTHLY_DAY: 
     621    elif ((not extended_format and repeat_type == MOTO_REPEAT_SIMPLE_MONTHLY_DAY) 
     622          or (extended_format and repeat_type == MOTO_REPEAT_EXTENDED_MONTHLY_DAY)): 
    608623        appendXMLTag(doc, e, 'Frequency', 'MONTHLY') 
    609624        if repeat_day: 
     
    615630        rule = rrule.rrule(rrule.MONTHLY, byweekday=rrule.weekdays[repeat_daynum](repeat_nth), 
    616631                           dtstart=eventdt, interval=repeat_every, until=repeat_end) 
    617     elif repeat_type == MOTO_REPEAT_YEARLY_DATE: 
     632    elif ((not extended_format and repeat_type == MOTO_REPEAT_SIMPLE_YEARLY_DATE) 
     633          or (extended_format and repeat_type == MOTO_REPEAT_EXTENDED_YEARLY_DATE)): 
    618634        appendXMLTag(doc, e, 'Frequency', 'YEARLY') 
    619635        appendXMLTag(doc, e, 'ByMonth', str(eventdt.month)) 
     
    621637        rule = rrule.rrule(rrule.YEARLY, bymonth=eventdt.month, bymonthday=eventdt.day, 
    622638                           dtstart=eventdt, interval=repeat_every, until=repeat_end) 
    623     elif repeat_type == MOTO_REPEAT_YEARLY_DAY: 
     639    elif extended_format and repeat_type == MOTO_REPEAT_EXTENDED_YEARLY_DAY: 
    624640        appendXMLTag(doc, e, 'Frequency', 'YEARLY') 
    625641        appendXMLTag(doc, e, 'ByMonth', str(eventdt.month)) 
     
    13201336 
    13211337        if include_rrule: 
    1322             nodes = moto_rrule_to_xml(doc, self.eventdt, self.repeat_type, self.exceptions
     1338            nodes = moto_rrule_to_xml(doc, self.eventdt, self.repeat_type, self.exceptions, False
    13231339            for node in nodes: 
    13241340                insertXMLNode(top, node) 
     
    13711387        exrules = node.getElementsByTagName('ExceptionRule') 
    13721388 
    1373         rule = xml_rrule_to_moto(rrules, exdates, exrules, self.eventdt) 
    1374         if (rule['repeat_type'] == MOTO_REPEAT_YEARLY_DAY or rule['repeat_every'] not in [0, 1] 
    1375             or rule['repeat_day'] != 0 or rule['repeat_end']): 
     1389        rule = xml_rrule_to_moto(rrules, exdates, exrules, self.eventdt, False) 
     1390        if (rule['repeat_every'] not in [0, 1] or rule['repeat_day'] != 0 or rule['repeat_end']): 
    13761391            raise UnsupportedDataError("Recursion rule not supported by simple event format") 
    13771392 
     
    14731488 
    14741489        nodes = moto_rrule_to_xml(doc, self.eventdt, self.repeat_type, 
    1475                     self.exceptions, self.repeat_every, self.repeat_day, self.repeat_end) 
     1490                    self.exceptions, True, self.repeat_every, self.repeat_day, 
     1491                    self.repeat_end) 
    14761492        for node in nodes: 
    14771493            insertXMLNode(top, node) 
     
    15311547        exdates = node.getElementsByTagName('ExceptionDateTime') 
    15321548        exrules = node.getElementsByTagName('ExceptionRule') 
    1533         rule = xml_rrule_to_moto(rrules, exdates, exrules, self.eventdt
     1549        rule = xml_rrule_to_moto(rrules, exdates, exrules, self.eventdt, True
    15341550        self.repeat_type = rule['repeat_type'] 
    15351551        self.repeat_every = rule['repeat_every']