I'm trying to create new invite and then send cancel invite using python iCalendar
package. New invite working as expected, but cancel invite
is not working, instead its creating duplicate invite.
Invite .ics
looks as below, which i'm sending as attachment in email
New invite
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Calendar invite//mxm.dk//
METHOD:REQUEST
BEGIN:VEVENT
SUMMARY:[CONFIRMED]: Python meeting calendar
DTSTART;VALUE=DATE-TIME:20210606T080000
DTEND;VALUE=DATE-TIME:20210606T170000
DTSTAMP;VALUE=DATE-TIME:20210604T165119Z
UID:74cf83e4-e4ff-42dd-97d2-fc5964661e37
SEQUENCE:1622850679
DESCRIPTION:Event1 details
LOCATION:Portland\, Oregon
ORGANIZER;CN="Max Rasmussen";ROLE=CHAIR;SENT-BY="MAILTO:tester-grimsby@tester.com":MAILTO:karthikvadla16@gmail.com
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
Cancel invite
I'm making sure to pass below properties as recommended
- Same UID of the event
- Method: CANCEL
- Status: CANCELLED
- Organizer: is set.
- Sequence: incremented (to set priority)
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Calendar invite//mxm.dk//
METHOD:CANCEL
BEGIN:VEVENT
SUMMARY:[CANCELLED]: Python meeting calendar
DTSTART;VALUE=DATE-TIME:20210606T080000
DTEND;VALUE=DATE-TIME:20210606T170000
DTSTAMP;VALUE=DATE-TIME:20210604T165432Z
UID:74cf83e4-e4ff-42dd-97d2-fc5964661e37
SEQUENCE:1622850872
DESCRIPTION:Event1 details
LOCATION:Portland\, Oregon
ORGANIZER;CN="Max Rasmussen";ROLE=CHAIR;SENT-BY="MAILTO:tester-grimsby@tester.com":MAILTO:karthikvadla16@gmail.com
STATUS:CANCELLED
END:VEVENT
END:VCALENDAR
I tried out all work-arounds as suggested on stackoverflow, still not able to resolve the issue. Can someone help me, what i'm missing here?
Here is my source code
def create_calendar_invite(calendar_event: dict):
"""Method to build calendar invite"""
calendar = Calendar()
calendar.add("prodid", "-//Grimsby Calendar invite//mxm.dk//")
calendar.add("version", "2.0")
status = calendar_event.get("status")
if status == "CANCELLED":
calendar.add("method", "CANCEL")
else:
calendar.add("method", "REQUEST")
event = __create_calendar_event_object(calendar_event)
calendar.add_component(event)
return calendar.to_ical()
def __create_calendar_event_object(calendar_event):
"""Method to build calendar event object"""
event = Event()
event.add("uid", calendar_event["event_uid"])
# set priority of the event
status = calendar_event.get("status")
if status == "CANCELLED":
event.add("sequence", 1)
else:
event.add("sequence", 0)
# status can be TENTATIVE/CONFIRMED/CANCELLED
# status = calendar_event["status"]
current_timestamp = datetime.now()
# organizer = vCalAddress('MAILTO:karthikvadla16@gmail.com')
# "SENT-BY", for specifying another calendar
# user that is acting on behalf of the "Organizer"
# organizer.params['sent-by'] = vText(f"MAILTO:tester-grimsby@{os.getenv('DOMAIN_NAME')}")
# organizer.params['cn'] = vText('Max Rasmussen')
# organizer.params['role'] = vText('CHAIR')
event.add('organizer', "karthikvadla16@gmail.com")
event.add("status", status)
event.add("summary", f"[{status}]: {calendar_event['summary']}")
event.add("dtstart", datetime.fromtimestamp(calendar_event["start_timestamp"]))
event.add("dtend", datetime.fromtimestamp(calendar_event["end_timestamp"]))
event.add("dtstamp", current_timestamp)
event.add("location", vText(calendar_event["location"]))
event.add("description", vText(calendar_event["description"]))
return event