# HG changeset patch # User Paul Boddie # Date 1425682134 -3600 # Node ID 3f2e7175f5400fcc64b458320f35902ad8e2ac5f # Parent be994aef551ac3b6bd1c0a1869a3d02ba1d1fbc2 Changed new event creation to employ RDATE periods in a single object instead of creating separate event objects for each coalesced period. diff -r be994aef551a -r 3f2e7175f540 imip_manager.py --- a/imip_manager.py Fri Mar 06 23:47:20 2015 +0100 +++ b/imip_manager.py Fri Mar 06 23:48:54 2015 +0100 @@ -553,44 +553,53 @@ utcnow = get_timestamp() uid = "imip-agent-%s-%s" % (utcnow, get_address(self.user)) + # Create a calendar object and store it as a request. + + record = [] + rwrite = record.append + # Define a single occurrence if only one coalesced slot exists. - # Otherwise, many occurrences are defined. - - for i, (start, end) in enumerate(coalesced): - this_uid = "%s-%s" % (uid, i) - + + start, end = coalesced[0] + start_value, start_attr = get_datetime_item(start, tzid) + end_value, end_attr = get_datetime_item(end, tzid) + + rwrite(("UID", {}, uid)) + rwrite(("SUMMARY", {}, "New event at %s" % utcnow)) + rwrite(("DTSTAMP", {}, utcnow)) + rwrite(("DTSTART", start_attr, start_value)) + rwrite(("DTEND", end_attr, end_value)) + rwrite(("ORGANIZER", {}, self.user)) + + participants = uri_values(filter(None, participants)) + + for participant in participants: + rwrite(("ATTENDEE", {"RSVP" : "TRUE", "PARTSTAT" : "NEEDS-ACTION"}, participant)) + + if self.user not in participants: + rwrite(("ATTENDEE", {"PARTSTAT" : "ACCEPTED"}, self.user)) + + # Define additional occurrences if many slots are defined. + + rdates = [] + + for start, end in coalesced[1:]: start_value, start_attr = get_datetime_item(start, tzid) end_value, end_attr = get_datetime_item(end, tzid) - - # Create a calendar object and store it as a request. - - record = [] - rwrite = record.append - - rwrite(("UID", {}, this_uid)) - rwrite(("SUMMARY", {}, "New event at %s" % utcnow)) - rwrite(("DTSTAMP", {}, utcnow)) - rwrite(("DTSTART", start_attr, start_value)) - rwrite(("DTEND", end_attr, end_value)) - rwrite(("ORGANIZER", {}, self.user)) - - participants = uri_values(filter(None, participants)) - - for participant in participants: - rwrite(("ATTENDEE", {"RSVP" : "TRUE", "PARTSTAT" : "NEEDS-ACTION"}, participant)) - - if self.user not in participants: - rwrite(("ATTENDEE", {"PARTSTAT" : "ACCEPTED"}, self.user)) - - node = ("VEVENT", {}, record) - - self.store.set_event(self.user, this_uid, None, node=node) - self.store.queue_request(self.user, this_uid) + rdates.append("%s/%s" % (start_value, end_value)) + + if rdates: + rwrite(("RDATE", {"VALUE" : "PERIOD", "TZID" : tzid}, rdates)) + + node = ("VEVENT", {}, record) + + self.store.set_event(self.user, uid, None, node=node) + self.store.queue_request(self.user, uid) # Redirect to the object (or the first of the objects), where instead of # attendee controls, there will be organiser controls. - self.redirect(self.link_to("%s-0" % uid)) + self.redirect(self.link_to(uid)) def handle_request(self, uid, recurrenceid, obj):