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.")