Mercurial > hg > gcmultimerge
comparison multimerge.py @ 63:6e38692e341f
Fixes to event merging etc.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 11 Jul 2016 13:51:54 +0300 |
parents | 4891ed8d77d5 |
children | c4b8d934d7ab |
comparison
equal
deleted
inserted
replaced
62:4891ed8d77d5 | 63:6e38692e341f |
---|---|
104 ev_end = event["end"].get("dateTime", event["end"].get("date")) | 104 ev_end = event["end"].get("dateTime", event["end"].get("date")) |
105 gcm_print(u"{0:25} - {1:25} : {2}".format(ev_start, ev_end, event["summary"])) | 105 gcm_print(u"{0:25} - {1:25} : {2}".format(ev_start, ev_end, event["summary"])) |
106 | 106 |
107 | 107 |
108 ## Generate gcm IDs for given list of events | 108 ## Generate gcm IDs for given list of events |
109 def gcm_generate_ids(events, calendar_id): | 109 def gcm_generate_ids(events, calendar_id, sep): |
110 if not events: | 110 if not events: |
111 return events | 111 return events |
112 | 112 |
113 for ev in events: | 113 for ev in events: |
114 ev["gcm_cal_id"] = calendar_id | 114 ev["gcm_cal_id"] = calendar_id |
115 ev["gcm_id"] = re.sub("[^a-v0-9]", "0", calendar_id.lower()) + ev["id"] | 115 ev["gcm_id"] = calendar_id + sep + ev["iCalUID"] |
116 | 116 |
117 return events | 117 return events |
118 | 118 |
119 | 119 |
120 ## Find event by its gcm_id from given list or return None if not found | 120 ## Find event by its gcm_id from given list or return None if not found |
130 def gcm_compare_events(ev1, ev2): | 130 def gcm_compare_events(ev1, ev2): |
131 for field in ev1: | 131 for field in ev1: |
132 if not field in gcm_no_compare_fields and ev1[field] != ev2[field]: | 132 if not field in gcm_no_compare_fields and ev1[field] != ev2[field]: |
133 return False | 133 return False |
134 return True | 134 return True |
135 | |
135 | 136 |
136 class GCMColor(): | 137 class GCMColor(): |
137 def __init__(self, src = None): | 138 def __init__(self, src = None): |
138 if src == None: | 139 if src == None: |
139 self.r = self.g = self.b = 0 | 140 self.r = self.g = self.b = 0 |
493 gcm_debug("Found nearest event color ID: {0}, {1}".format(c_found, colors["event"][c_found])) | 494 gcm_debug("Found nearest event color ID: {0}, {1}".format(c_found, colors["event"][c_found])) |
494 else: | 495 else: |
495 gcm_debug("No matching event color found!") | 496 gcm_debug("No matching event color found!") |
496 | 497 |
497 # Add events, if any, to main list | 498 # Add events, if any, to main list |
498 events = gcm_generate_ids(result.get("items", []), calendar["id"]) | 499 events = gcm_generate_ids(result.get("items", []), calendar["id"], "___") |
499 if events: | 500 if events: |
500 for event in events: | 501 for event in events: |
501 if c_found != None: | 502 if c_found != None: |
502 event["colorId"] = c_found | 503 event["colorId"] = c_found |
503 event["summary"] = u"[{1}] {0}".format(event["summary"], calendar["gcm_id"]) | 504 event["summary"] = u"[{1}] {0}".format(event["summary"], calendar["gcm_id"]) |
512 calendarId=cfg.dest_id, | 513 calendarId=cfg.dest_id, |
513 singleEvents=True, | 514 singleEvents=True, |
514 showDeleted=True, | 515 showDeleted=True, |
515 ).execute() | 516 ).execute() |
516 | 517 |
517 dst_events = gcm_generate_ids(result.get("items", []), "") | 518 dst_events = gcm_generate_ids(result.get("items", []), "", "") |
518 gcm_debug(u"Found {0} event(s).".format(len(dst_events))) | 519 gcm_debug(u"Found {0} event(s).".format(len(dst_events))) |
519 | |
520 | 520 |
521 | 521 |
522 ## Start merging events .. | 522 ## Start merging events .. |
523 gcm_debug(u"Re-merging events to target calendar ..") | 523 gcm_debug(u"Re-merging events to target calendar ..") |
524 dst_ids = frozenset(map(lambda x: x["gcm_id"], dst_events)) | 524 dst_ids = frozenset(map(lambda x: x["gcm_id"], dst_events)) |
526 | 526 |
527 for event in src_events: | 527 for event in src_events: |
528 # Does the event exist already in the target? | 528 # Does the event exist already in the target? |
529 if event["gcm_id"] in dst_ids: | 529 if event["gcm_id"] in dst_ids: |
530 # Check if event NEEDS updating .. aka compare data | 530 # Check if event NEEDS updating .. aka compare data |
531 gcm_debug(u"Event {0} exists, checking ..".format(event["gcm_id"])) | 531 gcm_debug(u"Event {0} : {1} exists, checking ..".format(event["id"], event["gcm_id"])) |
532 d_event = gcm_get_event_by_gcm_id(dst_events, event["gcm_id"]) | 532 d_event = gcm_get_event_by_gcm_id(dst_events, event["gcm_id"]) |
533 if not gcm_compare_events(event, d_event): | 533 if not gcm_compare_events(event, d_event): |
534 # Seems we need to update | 534 # Seems we need to update |
535 gcm_debug(u"Updating event {0} ..".format(event["gcm_id"])) | 535 gcm_debug(u"Updating event {0} : {1}..".format(event["id"], event["gcm_id"])) |
536 try: | 536 try: |
537 event.pop("sequence", None) | 537 event.pop("sequence", None) |
538 new_event = service.events().update(calendarId=cfg.dest_id, eventId=event["id"], body=event).execute() | 538 event.pop("id", None) |
539 event["iCalUID"] = event["gcm_id"] | |
540 new_event = service.events().update(calendarId=cfg.dest_id, eventId=d_event["id"], body=event).execute() | |
539 except Exception as e: | 541 except Exception as e: |
540 gcm_fatal("Failed to update event:\n{0}\n\nERROR: {1}\n".format(event, str(e))) | 542 gcm_fatal("Failed to update event {0}:\n\n{1}\n\nERROR: {2}\n".format(event["gcm_id"], event, str(e))) |
541 else: | 543 else: |
542 gcm_debug(u"No need to update event {0}.".format(event["gcm_id"])) | 544 gcm_debug(u"No need to update event {0} : {1}.".format(event["id"], event["gcm_id"])) |
543 else: | 545 else: |
544 ## Event does not seem to exist. Insert new event. | 546 ## Event does not seem to exist. Insert new event. |
545 gcm_debug(u"Inserting new event {0}".format(event["gcm_id"])) | 547 gcm_debug(u"Inserting new event {0}".format(event["gcm_id"])) |
546 event.pop("iCalUID", None) # Remove the iCalUID, having it conflicts with event ID | 548 event.pop("id", None) |
547 event["id"] = event["gcm_id"] # Replace Google generated ID with our own | 549 event["iCalUID"] = event["gcm_id"] # Replace Google generated ID with our own |
548 try: | 550 try: |
549 new_event = service.events().insert(calendarId=cfg.dest_id, body=event).execute() | 551 new_event = service.events().insert(calendarId=cfg.dest_id, body=event).execute() |
550 except Exception as e: | 552 except Exception as e: |
551 gcm_fatal("Failed to insert new event:\n{0}\n\nERROR: {1}\n".format(event, str(e))) | 553 gcm_fatal("Failed to insert new event:\n\n{0}\n\nERROR: {1}\n".format(event, str(e))) |
554 | |
552 | 555 |
553 ## Remove "stale" events | 556 ## Remove "stale" events |
554 gcm_debug(u"Purging stale events ..") | 557 gcm_debug(u"Purging stale events ..") |
555 for event in dst_events: | 558 for event in dst_events: |
556 gcm_debug(u"Checking event {0}".format(event["gcm_id"])) | 559 gcm_debug(u"Checking event {0}".format(event["gcm_id"])) |
557 if not event["gcm_id"] in src_ids and event["status"] != u"cancelled": | 560 if not event["gcm_id"] in src_ids and event["status"] != u"cancelled": |
558 gcm_debug(u"Deleting event {0}".format(event["gcm_id"])) | 561 gcm_debug(u"Deleting event {0}".format(event["gcm_id"])) |
559 # try: | 562 try: |
560 # service.events().delete(calendarId=cfg.dest_id, eventId=event["id"]).execute() | 563 service.events().delete(calendarId=cfg.dest_id, eventId=event["id"]).execute() |
561 # except Exception as e: | 564 except Exception as e: |
562 # gcm_fatal("Failed to delete stale event:\n{0}\n\nERROR: {1}\n".format(event, str(e))) | 565 gcm_fatal("Failed to delete stale event:\n{0}\n\nERROR: {1}\n".format(event, str(e))) |
563 | 566 |
564 | 567 |
565 gcm_debug(u"Finished.") | 568 gcm_debug(u"Finished.") |