comparison multimerge.py @ 98:fe3bfabf0b5f

Rename settings dest_* and source_* to dst_* and src_* respectively.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 06 Oct 2016 15:49:05 +0300
parents 524915af5e87
children 4b84bb5bb8b5
comparison
equal deleted inserted replaced
97:524915af5e87 98:fe3bfabf0b5f
364 cfg.mdef("email_use_tls", True, cfg.is_bool, cfg.trans_bool, False) 364 cfg.mdef("email_use_tls", True, cfg.is_bool, cfg.trans_bool, False)
365 cfg.mdef("email_server", True, cfg.is_string, None, None) 365 cfg.mdef("email_server", True, cfg.is_string, None, None)
366 cfg.mdef("email_srv_user", True, cfg.is_string, None, None) 366 cfg.mdef("email_srv_user", True, cfg.is_string, None, None)
367 cfg.mdef("email_srv_password", True, cfg.is_string, None, None) 367 cfg.mdef("email_srv_password", True, cfg.is_string, None, None)
368 368
369 cfg.mdef("source_regex", True, cfg.is_string, None, u"^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$") 369 cfg.mdef("src_regex", True, cfg.is_string, None, u"^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$")
370 cfg.mdef("source_regmap", False, cfg.is_list, cfg.trans_list, [1, 2]) 370 cfg.mdef("src_regmap", False, cfg.is_list, cfg.trans_list, [1, 2])
371 cfg.mdef("source_regmap_len", False, None, None, len(cfg.source_regmap)) 371 cfg.mdef("src_regmap_len", False, None, None, len(cfg.src_regmap))
372 372
373 cfg.mdef("dest_name", True, cfg.is_string, None, None) 373 cfg.mdef("dst_name", True, cfg.is_string, None, None)
374 cfg.mdef("dest_regex", True, cfg.is_string, None, None) 374 cfg.mdef("dst_regex", True, cfg.is_string, None, None)
375 cfg.mdef("dest_id", True, cfg.is_string, None, None) 375 cfg.mdef("dst_id", True, cfg.is_string, None, None)
376 376
377 cfg.mdef("noauth_local_webserver", False, None, None, True) 377 cfg.mdef("noauth_local_webserver", False, None, None, True)
378 #cfg.mdef("auth_host_name", False, None, None, "localhost") 378 #cfg.mdef("auth_host_name", False, None, None, "localhost")
379 #cfg.mdef("auth_host_port", False, None, None, [8080, 8090]) 379 #cfg.mdef("auth_host_port", False, None, None, [8080, 8090])
380 cfg.mdef("logging_level", True, cfg.is_log_level, cfg.trans_log_level, "ERROR") 380 cfg.mdef("logging_level", True, cfg.is_log_level, cfg.trans_log_level, "ERROR")
424 gcm_fatal(u"E-mail enabled but email_to not set.") 424 gcm_fatal(u"E-mail enabled but email_to not set.")
425 else: 425 else:
426 cfg.mset("email_ok", True) 426 cfg.mset("email_ok", True)
427 427
428 428
429 if len(cfg.source_regmap) != cfg.source_regmap_len: 429 if len(cfg.src_regmap) != cfg.src_regmap_len:
430 gcm_fatal(u"Setting source_regmap list must be {0} items.".format(cfg.source_regmap_len)) 430 gcm_fatal(u"Setting src_regmap list must be {0} items.".format(cfg.src_regmap_len))
431 else: 431 else:
432 # Force to integers 432 # Force to integers
433 try: 433 try:
434 cfg.source_regmap = map(lambda x: int(x), cfg.source_regmap) 434 cfg.src_regmap = map(lambda x: int(x), cfg.src_regmap)
435 except Exception as e: 435 except Exception as e:
436 gcm_fatal(u"Invalid source_regmap: {0}".format(str(e))) 436 gcm_fatal(u"Invalid src_regmap: {0}".format(str(e)))
437 437
438 438
439 if not cfg.dest_regex and not cfg.dest_id: 439 if not cfg.dst_regex and not cfg.dst_id:
440 gcm_fatal(u"Target calendar ID or name required, but not set.") 440 gcm_fatal(u"Target calendar ID or name required, but not set.")
441 441
442 442
443 ## Initialize and authorize API connection 443 ## Initialize and authorize API connection
444 credentials = gcm_get_credentials(cfg) 444 credentials = gcm_get_credentials(cfg)
468 468
469 gcm_debug(3, u"{0} calendars total found.".format(len(calendars))) 469 gcm_debug(3, u"{0} calendars total found.".format(len(calendars)))
470 470
471 471
472 ## Filter desired SOURCE calendars based on specified regexp 472 ## Filter desired SOURCE calendars based on specified regexp
473 src_re = re.compile(cfg.source_regex, re.UNICODE) 473 src_re = re.compile(cfg.src_regex, re.UNICODE)
474 dst_re = re.compile(cfg.dest_regex, re.UNICODE) 474 dst_re = re.compile(cfg.dst_regex, re.UNICODE)
475 src_calendars = [] 475 src_calendars = []
476 dst_calendar = None 476 dst_calendar = None
477 for calendar in calendars: 477 for calendar in calendars:
478 if u"summary" in calendar: 478 if u"summary" in calendar:
479 # Find destination calendar ID if not set 479 # Find destination calendar ID if not set
480 if not cfg.dest_id and dst_re.match(calendar["summary"]): 480 if not cfg.dst_id and dst_re.match(calendar["summary"]):
481 cfg.mset("dest_id", calendar["id"]) 481 cfg.mset("dst_id", calendar["id"])
482 dst_calendar = calendar 482 dst_calendar = calendar
483 elif cfg.dest_id and calendar["id"] == cfg.dest_id: 483 elif cfg.dst_id and calendar["id"] == cfg.dst_id:
484 dst_calendar = calendar 484 dst_calendar = calendar
485 485
486 # If summary or summaryOverride match the regexp, add calendar 486 # If summary or summaryOverride match the regexp, add calendar
487 mre = src_re.match(calendar["summary"]) 487 mre = src_re.match(calendar["summary"])
488 if not mre and u"summaryOverride" in calendar: 488 if not mre and u"summaryOverride" in calendar:
489 mre = src_re.match(calendar[u"summaryOverride"]) 489 mre = src_re.match(calendar[u"summaryOverride"])
490 490
491 if mre: 491 if mre:
492 calendar["gcm_title"] = mre.group(cfg.source_regmap[0]) 492 calendar["gcm_title"] = mre.group(cfg.src_regmap[0])
493 calendar["gcm_id"] = mre.group(cfg.source_regmap[1]) 493 calendar["gcm_id"] = mre.group(cfg.src_regmap[1])
494 src_calendars.append(calendar) 494 src_calendars.append(calendar)
495 495
496 gcm_debug(3, u"{0} source calendars found.".format(len(src_calendars))) 496 gcm_debug(3, u"{0} source calendars found.".format(len(src_calendars)))
497 497
498 498
499 ## Check if we have destination calendar ID 499 ## Check if we have destination calendar ID
500 if not dst_calendar: 500 if not dst_calendar:
501 gcm_fatal(u"Could not find target/destination calendar ID for '"+ cfg.dest_name +"'.") 501 gcm_fatal(u"Could not find target/destination calendar ID for '"+ cfg.dst_name +"'.")
502 else: 502 else:
503 gcm_debug(3, u"Target calendar '{0}' [ ID: {1} ]".format(dst_calendar["summary"], dst_calendar["id"])) 503 gcm_debug(3, u"Target calendar '{0}' [ ID: {1} ]".format(dst_calendar["summary"], dst_calendar["id"]))
504 504
505 505
506 ## Fetch colors 506 ## Fetch colors
548 548
549 549
550 ## Get current events 550 ## Get current events
551 gcm_debug(3, u"Fetching current target calendar events.") 551 gcm_debug(3, u"Fetching current target calendar events.")
552 result = service.events().list( 552 result = service.events().list(
553 calendarId=cfg.dest_id, 553 calendarId=cfg.dst_id,
554 singleEvents=True, 554 singleEvents=True,
555 showDeleted=True, 555 showDeleted=True,
556 ).execute() 556 ).execute()
557 557
558 dst_events = gcm_generate_ids(result.get("items", []), "", "") 558 dst_events = gcm_generate_ids(result.get("items", []), "", "")
578 gcm_debug(4, u"Updating event {0} : {1}..".format(event["id"], event["gcm_id"])) 578 gcm_debug(4, u"Updating event {0} : {1}..".format(event["id"], event["gcm_id"]))
579 try: 579 try:
580 event.pop("sequence", None) 580 event.pop("sequence", None)
581 event.pop("id", None) 581 event.pop("id", None)
582 event["iCalUID"] = event["gcm_id"] 582 event["iCalUID"] = event["gcm_id"]
583 new_event = service.events().update(calendarId=cfg.dest_id, eventId=d_event["id"], body=event).execute() 583 new_event = service.events().update(calendarId=cfg.dst_id, eventId=d_event["id"], body=event).execute()
584 except Exception as e: 584 except Exception as e:
585 gcm_fatal(u"Failed to update event {0}:\n\n{1}\n\nERROR: {2}\n".format(event["gcm_id"], event, str(e))) 585 gcm_fatal(u"Failed to update event {0}:\n\n{1}\n\nERROR: {2}\n".format(event["gcm_id"], event, str(e)))
586 else: 586 else:
587 evn_unchanged += 1 587 evn_unchanged += 1
588 gcm_debug(4, u"No need to update event {0} : {1}.".format(event["id"], event["gcm_id"])) 588 gcm_debug(4, u"No need to update event {0} : {1}.".format(event["id"], event["gcm_id"]))
591 gcm_debug(4, u"Inserting new event {0}".format(event["gcm_id"])) 591 gcm_debug(4, u"Inserting new event {0}".format(event["gcm_id"]))
592 evn_new += 1 592 evn_new += 1
593 event.pop("id", None) 593 event.pop("id", None)
594 event["iCalUID"] = event["gcm_id"] # Replace Google generated ID with our own 594 event["iCalUID"] = event["gcm_id"] # Replace Google generated ID with our own
595 try: 595 try:
596 new_event = service.events().insert(calendarId=cfg.dest_id, body=event).execute() 596 new_event = service.events().insert(calendarId=cfg.dst_id, body=event).execute()
597 except Exception as e: 597 except Exception as e:
598 gcm_fatal(u"Failed to insert new event:\n\n{0}\n\nERROR: {1}\n".format(event, str(e))) 598 gcm_fatal(u"Failed to insert new event:\n\n{0}\n\nERROR: {1}\n".format(event, str(e)))
599 599
600 gcm_debug(3, "{0} new events, {1} updated, {2} unchanged.".format(evn_new, evn_updated, evn_unchanged)) 600 gcm_debug(3, "{0} new events, {1} updated, {2} unchanged.".format(evn_new, evn_updated, evn_unchanged))
601 601
607 gcm_debug(4, u"Checking event {0}".format(event["gcm_id"])) 607 gcm_debug(4, u"Checking event {0}".format(event["gcm_id"]))
608 if not event["gcm_id"] in src_ids and event["status"] != u"cancelled": 608 if not event["gcm_id"] in src_ids and event["status"] != u"cancelled":
609 gcm_debug(4, u"Deleting event {0}".format(event["gcm_id"])) 609 gcm_debug(4, u"Deleting event {0}".format(event["gcm_id"]))
610 evn_purged += 1 610 evn_purged += 1
611 try: 611 try:
612 service.events().delete(calendarId=cfg.dest_id, eventId=event["id"]).execute() 612 service.events().delete(calendarId=cfg.dst_id, eventId=event["id"]).execute()
613 except Exception as e: 613 except Exception as e:
614 gcm_fatal(u"Failed to delete stale event:\n{0}\n\nERROR: {1}\n".format(event, str(e))) 614 gcm_fatal(u"Failed to delete stale event:\n{0}\n\nERROR: {1}\n".format(event, str(e)))
615 615
616 gcm_debug(3, "{0} events purged.".format(evn_purged)) 616 gcm_debug(3, "{0} events purged.".format(evn_purged))
617 617
622 t_time = time.localtime() 622 t_time = time.localtime()
623 t_str = time.strftime("%d.%m.%Y %H:%M", t_time) 623 t_str = time.strftime("%d.%m.%Y %H:%M", t_time)
624 gcm_debug(3, u"Updating target calendar name timestamp {0}".format(t_str)) 624 gcm_debug(3, u"Updating target calendar name timestamp {0}".format(t_str))
625 625
626 try: 626 try:
627 dst_calendar["summary"] = cfg.dest_name.format(t_str) 627 dst_calendar["summary"] = cfg.dst_name.format(t_str)
628 new_calendar = service.calendars().update(calendarId=cfg.dest_id, body=dst_calendar).execute() 628 new_calendar = service.calendars().update(calendarId=cfg.dst_id, body=dst_calendar).execute()
629 except Exception as e: 629 except Exception as e:
630 gcm_fatal(u"Failed to update target calendar:\n{0}\n\nERROR: {1}\n".format(dst_calendar, str(e))) 630 gcm_fatal(u"Failed to update target calendar:\n{0}\n\nERROR: {1}\n".format(dst_calendar, str(e)))
631 631
632 632
633 gcm_bench_end = time.time() 633 gcm_bench_end = time.time()