1.1 --- a/imiptools/handlers/person.py Sat Sep 05 00:36:05 2015 +0200
1.2 +++ b/imiptools/handlers/person.py Sat Sep 05 00:36:31 2015 +0200
1.3 @@ -19,7 +19,7 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from imiptools.data import uri_dict
1.8 +from imiptools.data import get_address, to_part, uri_dict, uri_item
1.9 from imiptools.handlers import Handler
1.10 from imiptools.handlers.common import CommonFreebusy, CommonEvent
1.11 from imiptools.period import FreeBusyPeriod, Period, replace_overlapping
1.12 @@ -175,6 +175,62 @@
1.13 replace_overlapping(stored_freebusy, period, freebusy)
1.14 self.store.set_freebusy_for_other(self.user, stored_freebusy, sender)
1.15
1.16 + def _refresh(self):
1.17 +
1.18 + """
1.19 + Respond to a refresh message by providing complete event details to
1.20 + attendees.
1.21 + """
1.22 +
1.23 + # Obtain valid organiser and attendee details.
1.24 +
1.25 + oa = self.require_organiser_and_attendees(False)
1.26 + if not oa:
1.27 + return False
1.28 +
1.29 + (organiser, organiser_attr), attendees = oa
1.30 +
1.31 + # Filter by stored attendees.
1.32 +
1.33 + obj = self.get_stored_object_version()
1.34 + stored_attendees = set(obj.get_values("ATTENDEE"))
1.35 + attendees = stored_attendees.intersection(attendees)
1.36 +
1.37 + if not attendees:
1.38 + return False
1.39 +
1.40 + # Assume that the outcome will be a request. It would not seem
1.41 + # completely bizarre to produce a publishing message instead if a
1.42 + # refresh message was unprovoked.
1.43 +
1.44 + method = "REQUEST"
1.45 +
1.46 + # Get the parent event, add SENT-BY details to the organiser.
1.47 +
1.48 + obj = self.get_stored_object_version()
1.49 + organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER"))
1.50 + self.update_sender(organiser_attr)
1.51 + responses = [obj.to_node()]
1.52 +
1.53 + # Get recurrences.
1.54 +
1.55 + cancelled = self.store.get_cancellations(self.user)
1.56 +
1.57 + if not self.recurrenceid:
1.58 + for recurrenceid in self.store.get_recurrences(self.user, self.uid):
1.59 + if (self.uid, recurrenceid) not in cancelled:
1.60 +
1.61 + # Get the recurrence, add SENT-BY details to the organiser.
1.62 +
1.63 + obj = self.get_stored_object(self.uid, recurrenceid)
1.64 + organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER"))
1.65 + self.update_sender(organiser_attr)
1.66 + responses.append(obj.to_node())
1.67 +
1.68 + self.add_result(method, map(get_address, attendees), to_part(method, responses))
1.69 +
1.70 + return True
1.71 +
1.72 class Event(PersonHandler):
1.73
1.74 "An event handler."
1.75 @@ -214,11 +270,12 @@
1.76
1.77 def refresh(self):
1.78
1.79 - "Generate details of any active event."
1.80 + "Requests to refresh events are handled either here or by the client."
1.81
1.82 - # NOTE: Return event details if configured to do so.
1.83 -
1.84 - return self.wrap("A request for updated event details has been received.")
1.85 + if self.is_refreshing():
1.86 + return self._refresh()
1.87 + else:
1.88 + return self.wrap("A request for updated event details has been received.")
1.89
1.90 def reply(self):
1.91