2020-07-17 19:38:56 +00:00
import yaml
import caldav
import sys
2020-07-18 12:49:37 +00:00
if len ( sys . argv ) > 1 :
import os
os . chdir ( sys . argv [ 1 ] )
2020-07-17 19:38:56 +00:00
with open ( ' auth.yaml ' ) as f :
auth = yaml . full_load ( f )
try :
with open ( ' data.yaml ' ) as f :
known = yaml . full_load ( f )
except :
known = { }
logins = { }
for login , content in auth [ ' logins ' ] . items ( ) :
logins [ login ] = caldav . DAVClient ( url = content [ ' url ' ] , username = content [ ' user ' ] , password = content [ ' password ' ] )
cals = [ ]
2020-07-18 13:03:00 +00:00
cal_evts = { }
2020-07-17 19:38:56 +00:00
for cal in auth [ ' cals ' ] :
cals . append ( caldav . Calendar ( client = logins [ cal [ ' login ' ] ] , url = cal [ ' url ' ] ) )
2020-07-18 13:03:00 +00:00
cal_evts [ cals [ - 1 ] . canonical_url ] = [ evt . vobject_instance . vevent . uid . value for evt in cals [ - 1 ] . events ( ) ]
2020-07-17 19:38:56 +00:00
changed = { }
deleted = { }
def cal_contains_uid ( cal , uid ) :
2020-07-18 13:03:00 +00:00
return uid in cal_evts [ cal . canonical_url ]
2020-07-17 19:38:56 +00:00
for cal in cals :
2020-07-18 12:49:37 +00:00
print ( " Checking %s " % ( cal . canonical_url , ) )
2020-07-17 19:38:56 +00:00
for event in cal . events ( ) :
uid = event . vobject_instance . vevent . uid . value
data = event . data
2020-07-18 12:49:37 +00:00
entry = ( cal . canonical_url , event )
2020-07-17 19:38:56 +00:00
if uid not in known :
2020-07-18 12:49:37 +00:00
print ( " Found new event with summary %s " % ( event . vobject_instance . vevent . summary . value , ) )
if uid not in changed :
changed [ uid ] = [ entry ]
2020-07-17 19:38:56 +00:00
else :
2020-07-18 12:49:37 +00:00
changed [ uid ] . append ( entry )
2020-07-17 19:38:56 +00:00
else :
if data != known [ uid ] :
2020-07-18 12:49:37 +00:00
print ( " Found changed event with summary %s " % ( event . vobject_instance . vevent . summary . value , ) )
2020-07-17 19:38:56 +00:00
if uid not in changed :
changed [ uid ] = [ entry ]
else :
changed [ uid ] . append ( entry )
2020-07-18 12:49:37 +00:00
print ( " Checking for deletions " )
2020-07-17 19:38:56 +00:00
for uid , data in known . items ( ) :
for cal in cals :
if not cal_contains_uid ( cal , uid ) :
2020-07-18 12:49:37 +00:00
print ( " Item with uid %s got deleted in %s " % ( uid , cal . canonical_url ) )
2020-07-17 19:38:56 +00:00
if uid not in deleted :
deleted [ uid ] = [ cal . canonical_url ]
else :
deleted [ uid ] . append ( cal . canonical_url )
for uid , arr in changed . items ( ) :
if uid in deleted :
2020-07-18 12:49:37 +00:00
print ( " Changed/new entry with UID ( %s ), summary \" %s \" was also deleted, recreating it. " % ( uid , arr [ 0 ] [ 1 ] . vobject_instance . vevent . uid . value ) , file = sys . stderr )
2020-07-17 19:38:56 +00:00
print ( " Deletions in: " , file = sys . stderr )
for cal in deleted [ uid ] :
print ( " - %s " % ( cal , ) , file = sys . stderr )
print ( " Changes in: " , file = sys . stderr )
for entry in arr :
print ( " - %s " % ( entry [ 0 ] , ) , file = sys . stderr )
print ( " " , file = sys . stderr )
2020-07-18 12:49:37 +00:00
del deleted [ uid ]
2020-07-17 19:38:56 +00:00
2020-07-18 12:49:37 +00:00
if len ( set ( [ entry [ 1 ] . data for entry in arr ] ) ) != 1 :
print ( " Multiple changed/new entries with the same UID ( %s ) detected: " % ( uid , ) , file = sys . stderr )
2020-07-17 19:38:56 +00:00
for ev in arr :
print ( " %s : %s " % ( ev [ 0 ] , ev [ 1 ] . vobject_instance . vevent . summary . value ) , file = sys . stderr )
continue
entry = arr [ 0 ]
changed_cals = [ entry [ 0 ] for entry in arr ]
for cal in cals :
if cal . canonical_url not in changed_cals :
2020-07-18 12:49:37 +00:00
try :
old = cal . event_by_uid ( uid )
print ( " Overwriting event from %s with data %s (source: %s ) " % ( cal . canonical_url , repr ( old . data ) , changed_cals ) )
new = False
except :
new = True
cal . save_event ( entry [ 1 ] . data )
if new :
print ( " Creating new event in %s with summary %s " % ( cal . canonical_url , cal . event_by_uid ( uid ) . vobject_instance . vevent . summary . value ) )
known [ uid ] = entry [ 1 ] . data
2020-07-17 19:38:56 +00:00
for uid in deleted :
for cal in cals :
2020-07-18 12:49:37 +00:00
if cal_contains_uid ( cal , uid ) :
evt = cal . event_by_uid ( uid )
print ( " Deleting event from %s with data %s (source: %s ) " % ( cal . canonical_url , repr ( evt . data ) , deleted [ uid ] ) )
2020-07-17 19:38:56 +00:00
cal . event_by_uid ( uid ) . delete ( )
2020-07-18 12:49:37 +00:00
del known [ uid ]
2020-07-17 19:38:56 +00:00
2020-07-18 12:49:37 +00:00
print ( " Done. " )
print ( )
2020-07-17 19:38:56 +00:00
with open ( " data.yaml " , " w " ) as f :
yaml . dump ( known , f )