Changeset 2232
- Timestamp:
- 07/01/07 12:38:02 (1 year ago)
- Files:
-
- plugins/moto-sync/motosync.py (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
plugins/moto-sync/motosync.py
r2197 r2232 60 60 61 61 # repeat types in the calendar 62 # XXX FIXME: check order of DATE/DAY for monthly and yearly on extended-format phones62 # these have a different meaning in the simple and extended calendars (why???!) 63 63 MOTO_REPEAT_NONE = 0 64 64 MOTO_REPEAT_DAILY = 1 65 65 MOTO_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 66 MOTO_REPEAT_SIMPLE_MONTHLY_DATE = 3 67 MOTO_REPEAT_SIMPLE_MONTHLY_DAY = 4 68 MOTO_REPEAT_SIMPLE_YEARLY_DATE = 5 69 MOTO_REPEAT_EXTENDED_MONTHLY_DAY = 3 70 MOTO_REPEAT_EXTENDED_MONTHLY_DATE = 4 71 MOTO_REPEAT_EXTENDED_YEARLY_DAY = 5 72 MOTO_REPEAT_EXTENDED_YEARLY_DATE = 6 70 73 71 74 # features we require; these refer to the bits returned by the AT+MAID? command … … 430 433 return ((daynum + 1) % 7) * 8 + nth 431 434 432 def xml_rrule_to_moto(rulenodes, exdates, exrules, eventdt ):435 def xml_rrule_to_moto(rulenodes, exdates, exrules, eventdt, extended_format): 433 436 """Process XML recursion rules, converting them to the closest-possible 434 437 matching recursion specifier supported by the phone. … … 439 442 exrules: list of exception rules 440 443 eventdt: event's date (and time if set) 444 extended_format: bool iff the extended calendar format is used 441 445 442 446 Returns a dict containing the following fields: … … 516 520 elif (freq == 'MONTHLY' and not byday and (not bymonthday or bymonthday == set([eventdt.day])) 517 521 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 519 526 elif (freq == 'MONTHLY' and byday and len(byday) == 1 and not bymonthday 520 527 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 522 532 if not (byday_daynum == eventdt.weekday() and byday_nth == eventweek): 523 533 ret['repeat_day'] = moto_monthday_to_repeat_day(byday_nth, byday_daynum) 524 534 elif (freq == 'YEARLY' and not byday and (not bymonthday or bymonthday == set([eventdt.day])) 525 535 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) 528 541 and (not bymonthday or bymonthday == set([eventdt.day])) 529 542 and not byyearday and (not bymonth or bymonth == set([eventdt.month]))): 530 ret['repeat_type'] = MOTO_REPEAT_ YEARLY_DAY543 ret['repeat_type'] = MOTO_REPEAT_EXTENDED_YEARLY_DAY 531 544 if not (byday_daynum == eventdt.weekday() and byday_nth == eventweek): 532 545 ret['repeat_day'] = moto_monthday_to_repeat_day(byday_nth, byday_daynum) … … 571 584 return ret 572 585 573 def moto_rrule_to_xml(doc, eventdt, repeat_type, exceptions, 586 def moto_rrule_to_xml(doc, eventdt, repeat_type, exceptions, extended_format, 574 587 repeat_every=None, repeat_day=None, repeat_end=None): 575 588 """Convert a Motorola-format recurrence to the corresponding XML description. … … 600 613 rule = rrule.rrule(rrule.WEEKLY, byweekday=repeat_days, 601 614 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)): 603 617 appendXMLTag(doc, e, 'Frequency', 'MONTHLY') 604 618 appendXMLTag(doc, e, 'ByMonthDay', str(eventdt.day)) 605 619 rule = rrule.rrule(rrule.MONTHLY, bymonthday=eventdt.day, 606 620 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)): 608 623 appendXMLTag(doc, e, 'Frequency', 'MONTHLY') 609 624 if repeat_day: … … 615 630 rule = rrule.rrule(rrule.MONTHLY, byweekday=rrule.weekdays[repeat_daynum](repeat_nth), 616 631 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)): 618 634 appendXMLTag(doc, e, 'Frequency', 'YEARLY') 619 635 appendXMLTag(doc, e, 'ByMonth', str(eventdt.month)) … … 621 637 rule = rrule.rrule(rrule.YEARLY, bymonth=eventdt.month, bymonthday=eventdt.day, 622 638 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: 624 640 appendXMLTag(doc, e, 'Frequency', 'YEARLY') 625 641 appendXMLTag(doc, e, 'ByMonth', str(eventdt.month)) … … 1320 1336 1321 1337 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) 1323 1339 for node in nodes: 1324 1340 insertXMLNode(top, node) … … 1371 1387 exrules = node.getElementsByTagName('ExceptionRule') 1372 1388 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']): 1376 1391 raise UnsupportedDataError("Recursion rule not supported by simple event format") 1377 1392 … … 1473 1488 1474 1489 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) 1476 1492 for node in nodes: 1477 1493 insertXMLNode(top, node) … … 1531 1547 exdates = node.getElementsByTagName('ExceptionDateTime') 1532 1548 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) 1534 1550 self.repeat_type = rule['repeat_type'] 1535 1551 self.repeat_every = rule['repeat_every']
