Mercurial > hg > gcmultimerge
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() |