imip-agent

Changeset

391:3f2e7175f540
2015-03-06 Paul Boddie raw files shortlog changelog graph Changed new event creation to employ RDATE periods in a single object instead of creating separate event objects for each coalesced period. recurring-events
imip_manager.py (file)
     1.1 --- a/imip_manager.py	Fri Mar 06 23:47:20 2015 +0100
     1.2 +++ b/imip_manager.py	Fri Mar 06 23:48:54 2015 +0100
     1.3 @@ -553,44 +553,53 @@
     1.4          utcnow = get_timestamp()
     1.5          uid = "imip-agent-%s-%s" % (utcnow, get_address(self.user))
     1.6  
     1.7 +        # Create a calendar object and store it as a request.
     1.8 +
     1.9 +        record = []
    1.10 +        rwrite = record.append
    1.11 +
    1.12          # Define a single occurrence if only one coalesced slot exists.
    1.13 -        # Otherwise, many occurrences are defined.
    1.14 -
    1.15 -        for i, (start, end) in enumerate(coalesced):
    1.16 -            this_uid = "%s-%s" % (uid, i)
    1.17 -
    1.18 +
    1.19 +        start, end = coalesced[0]
    1.20 +        start_value, start_attr = get_datetime_item(start, tzid)
    1.21 +        end_value, end_attr = get_datetime_item(end, tzid)
    1.22 +
    1.23 +        rwrite(("UID", {}, uid))
    1.24 +        rwrite(("SUMMARY", {}, "New event at %s" % utcnow))
    1.25 +        rwrite(("DTSTAMP", {}, utcnow))
    1.26 +        rwrite(("DTSTART", start_attr, start_value))
    1.27 +        rwrite(("DTEND", end_attr, end_value))
    1.28 +        rwrite(("ORGANIZER", {}, self.user))
    1.29 +
    1.30 +        participants = uri_values(filter(None, participants))
    1.31 +
    1.32 +        for participant in participants:
    1.33 +            rwrite(("ATTENDEE", {"RSVP" : "TRUE", "PARTSTAT" : "NEEDS-ACTION"}, participant))
    1.34 +
    1.35 +        if self.user not in participants:
    1.36 +            rwrite(("ATTENDEE", {"PARTSTAT" : "ACCEPTED"}, self.user))
    1.37 +
    1.38 +        # Define additional occurrences if many slots are defined.
    1.39 +
    1.40 +        rdates = []
    1.41 +
    1.42 +        for start, end in coalesced[1:]:
    1.43              start_value, start_attr = get_datetime_item(start, tzid)
    1.44              end_value, end_attr = get_datetime_item(end, tzid)
    1.45 -
    1.46 -            # Create a calendar object and store it as a request.
    1.47 -
    1.48 -            record = []
    1.49 -            rwrite = record.append
    1.50 -
    1.51 -            rwrite(("UID", {}, this_uid))
    1.52 -            rwrite(("SUMMARY", {}, "New event at %s" % utcnow))
    1.53 -            rwrite(("DTSTAMP", {}, utcnow))
    1.54 -            rwrite(("DTSTART", start_attr, start_value))
    1.55 -            rwrite(("DTEND", end_attr, end_value))
    1.56 -            rwrite(("ORGANIZER", {}, self.user))
    1.57 -
    1.58 -            participants = uri_values(filter(None, participants))
    1.59 -
    1.60 -            for participant in participants:
    1.61 -                rwrite(("ATTENDEE", {"RSVP" : "TRUE", "PARTSTAT" : "NEEDS-ACTION"}, participant))
    1.62 -
    1.63 -            if self.user not in participants:
    1.64 -                rwrite(("ATTENDEE", {"PARTSTAT" : "ACCEPTED"}, self.user))
    1.65 -
    1.66 -            node = ("VEVENT", {}, record)
    1.67 -
    1.68 -            self.store.set_event(self.user, this_uid, None, node=node)
    1.69 -            self.store.queue_request(self.user, this_uid)
    1.70 +            rdates.append("%s/%s" % (start_value, end_value))
    1.71 +
    1.72 +        if rdates:
    1.73 +            rwrite(("RDATE", {"VALUE" : "PERIOD", "TZID" : tzid}, rdates))
    1.74 +
    1.75 +        node = ("VEVENT", {}, record)
    1.76 +
    1.77 +        self.store.set_event(self.user, uid, None, node=node)
    1.78 +        self.store.queue_request(self.user, uid)
    1.79  
    1.80          # Redirect to the object (or the first of the objects), where instead of
    1.81          # attendee controls, there will be organiser controls.
    1.82  
    1.83 -        self.redirect(self.link_to("%s-0" % uid))
    1.84 +        self.redirect(self.link_to(uid))
    1.85  
    1.86      def handle_request(self, uid, recurrenceid, obj):
    1.87