How to remove or change a calendar event?
-
After finding code to save and find calendar events, I would like to write my own calendar app. But I still don't know how to write ObjectC code, sorry. So could you please tell me how to remove and change calendar events. That is my try to delete a calendar event (last line crashes pythonista). And there is only one event on 2018-12-30...
from objc_util import * from ctypes import POINTER import threading import calendar, time store = ObjCClass('EKEventStore').alloc().init() access_granted = threading.Event() def completion(_self, granted, _error): access_granted.set() completion_block = ObjCBlock(completion, argtypes=[c_void_p, c_bool, c_void_p]) store.requestAccessToEntityType_completion_(0, completion_block) access_granted.wait() startDate = ObjCClass('NSDate').dateWithTimeIntervalSince1970_(time.mktime(time.strptime('2018-12-30 00:00:00', '%Y-%m-%d %H:%M:%S'))) endDate = ObjCClass('NSDate').dateWithTimeIntervalSince1970_(time.mktime(time.strptime('2018-12-30 23:59:59', '%Y-%m-%d %H:%M:%S'))) predicate = store.predicateForEventsWithStartDate_endDate_calendars_(startDate, endDate, None) event = store.eventsMatchingPredicate_(predicate) print(event) LP_c_void_p = POINTER(c_void_p) err = LP_c_void_p() #store.removeEvent_span_error_(event, 0, err)
-
@AA737 said:
what would be the format to replace the โNoneโ with a calendar name in the predicate?
The third parameter of the predicate is not a calendar name but an array of calendars EKCalendar objects.
-
@AA737 try this
calendars_array = [calendar for calendar in store.calendars() if str(calendar.title()) == 'your calendar'] predicate = store.predicateForEventsWithStartDate_endDate_calendars_(date1, date2, calendars_array) events = store.eventsMatchingPredicate_(predicate)
-
@cvp that worked great, thank you! I have a lot to learn...
-
@AA737 Believe me, you don't begin with the easiest project ๐
-
@cvp Have you noticed you can only run your calendar script about 8 times in a row, and then it stops working and Pythonista has to be reset? Any idea why, or a fix for it?
-
@AA737 said:
run your calendar script about 8 times in a row, and then it stops working
You're right and I did never see that. I'll check. Perhaps an Apple limitation
-
@AA737 After testing, I've remarked that after 10 runs (always), there is no crash at all but the returned calendars list of EKEventStore is empty and sincerely, I didn't find anything similar in Google nor any explanation.
-
@cvp said:
@AA737 After testing, I've remarked that after 10 runs (always), there is no crash at all but the returned calendars list of EKEventStore is empty and sincerely, I didn't find anything similar in Google nor any explanation.
Interesting, thank you for looking into it, and all your help!
-
@cvp maybe try an autoreleasepool context handler around the code of interest, and then autorelease() and delete the python objects for objc objects you don't need anymore, like the predicate, and maybe the store, calendar arrays, etc. it sounds like ekeventstore gets pissed if you are not releasing its objects.
-
@AA737 Thanks to @JonB , this works
import datetime import objc_util with objc_util.autoreleasepool(): # EKEventStore = calendar database store = objc_util.ObjCClass('EKEventStore').alloc().init() # Convert string yyyymmdd to NSdate dateFormat = objc_util.ObjCClass('NSDateFormatter').alloc().init() dateFormat.setDateFormat_('yyyyMMdd HH:mm') date1 = dateFormat.dateFromString_('20200101 00:01') date2 = dateFormat.dateFromString_('20201231 23:59') calendars_array = [calendar for calendar in store.calendars() if str(calendar.title()) == 'Sorties'] predicate = store.predicateForEventsWithStartDate_endDate_calendars_(date1, date2, calendars_array) events = store.eventsMatchingPredicate_(predicate) for event in events: print(event.title()) store.autorelease() del events, predicate, store, calendars_array
-
To convert from Python datetimes...
from datetime import datetime print(f'{datetime.now():%Y%m%d %H:%M}')
-
@ccc I know, but here we need Objectivec NSDateFormatter objects
-
Yes. My point was about converting from Python datetimes to Objective C datetimes.
-
@cvp said:
@AA737 Thanks to @JonB , this works
import datetime import objc_util with objc_util.autoreleasepool(): # EKEventStore = calendar database store = objc_util.ObjCClass('EKEventStore').alloc().init() # Convert string yyyymmdd to NSdate dateFormat = objc_util.ObjCClass('NSDateFormatter').alloc().init() dateFormat.setDateFormat_('yyyyMMdd HH:mm') date1 = dateFormat.dateFromString_('20200101 00:01') date2 = dateFormat.dateFromString_('20201231 23:59') calendars_array = [calendar for calendar in store.calendars() if str(calendar.title()) == 'Sorties'] predicate = store.predicateForEventsWithStartDate_endDate_calendars_(date1, date2, calendars_array) events = store.eventsMatchingPredicate_(predicate) for event in events: print(event.title()) store.autorelease() del events, predicate, store, calendars_array