# HG changeset patch # User Paul Boddie # Date 1508253396 -7200 # Node ID 5e4371f0176491965678460caa6024500b6712d9 # Parent fe50d2b3760a4a707934cf23e0dae85825c2c28b Introduced convenience methods for ensuring URI values from object properties. diff -r fe50d2b3760a -r 5e4371f01764 imiptools/client.py --- a/imiptools/client.py Mon Oct 16 23:21:15 2017 +0200 +++ b/imiptools/client.py Tue Oct 17 17:16:36 2017 +0200 @@ -25,7 +25,7 @@ get_sender_identities, get_uri, \ get_window_end, is_new_object, make_freebusy, \ make_uid, to_part, update_attendees_with_delegates, \ - uri_dict, uri_item, uri_items, uri_parts, uri_values + uri_parts, uri_values from imiptools.dates import check_permitted_values, format_datetime, \ get_datetime, get_default_timezone, \ get_duration, get_time, get_timestamp, \ @@ -364,7 +364,7 @@ # Get the parent event, add SENT-BY details to the organiser. if not attendee or self.is_participating(attendee, obj=obj): - organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER")) + organiser, organiser_attr = obj.get_uri_item("ORGANIZER") self.update_sender(organiser_attr) responses.append(self.object_to_part(method, obj)) methods.add(method) @@ -387,7 +387,7 @@ obj = self.get_stored_object(self.uid, recurrenceid, section) if not attendee or self.is_participating(attendee, obj=obj): - organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER")) + organiser, organiser_attr = obj.get_uri_item("ORGANIZER") self.update_sender(organiser_attr) responses.append(self.object_to_part(rmethod, obj)) methods.add(rmethod) @@ -436,7 +436,7 @@ Return whether the current user is the organiser in the current object. """ - return get_uri(self.obj.get_value("ORGANIZER")) == self.user + return self.obj.get_uri("ORGANIZER") == self.user def is_recurrence(self): @@ -457,7 +457,7 @@ obj = obj or self.obj calendar_uri = self.messenger and get_uri(self.messenger.sender) - for attendee, attendee_attr in uri_items(obj.get_items("ATTENDEE")): + for attendee, attendee_attr in obj.get_uri_items("ATTENDEE"): if attendee != self.user: if attendee_attr.get("SENT-BY") == calendar_uri: del attendee_attr["SENT-BY"] @@ -478,7 +478,7 @@ # is taken from the SENT-BY attribute if present, or from the # attendee value otherwise. - sent_by = get_sender_identities(uri_dict(self.obj.get_value_map("ATTENDEE"))) + sent_by = get_sender_identities(self.obj.get_uri_map("ATTENDEE")) # Obtain the attendee for the first sender matching the SENT-BY or # attendee value. @@ -547,7 +547,7 @@ # Get attendee details in a usable form. - stored_attendees = uri_dict(obj.get_value_map("ATTENDEE")) + stored_attendees = obj.get_uri_map("ATTENDEE") for attendee, attendee_attr in attendees.items(): @@ -581,7 +581,7 @@ to_cancel = [] - existing_attendees = uri_items(self.obj.get_items("ATTENDEE") or []) + existing_attendees = self.obj.get_uri_items("ATTENDEE") or [] existing_attendees_map = dict(existing_attendees) # Added attendees are those from the supplied collection not already @@ -656,7 +656,7 @@ given 'partstat'. """ - attendee_attr = uri_dict(self.obj.get_value_map("ATTENDEE")).get(self.user) + attendee_attr = self.obj.get_uri_map("ATTENDEE").get(self.user) if not attendee_attr: return None if partstat: @@ -681,8 +681,8 @@ # also attending. The updated event will be saved by the outgoing # handler. - organiser = get_uri(obj.get_value("ORGANIZER")) - attendees = uri_values(obj.get_values("ATTENDEE")) + organiser = obj.get_uri("ORGANIZER") + attendees = obj.get_uri_values("ATTENDEE") if from_organiser: recipients = [get_address(attendee) for attendee in attendees if attendee != self.user] @@ -795,7 +795,7 @@ # Here, the organiser should be the current user. - organiser, organiser_attr = uri_item(self.obj.get_item("ORGANIZER")) + organiser, organiser_attr = self.obj.get_uri_item("ORGANIZER") self.update_sender(organiser_attr) self.update_senders() @@ -855,7 +855,7 @@ obj = self.get_stored_object_version() if obj: - stored_organiser = get_uri(obj.get_value("ORGANIZER")) + stored_organiser = obj.get_uri("ORGANIZER") return stored_organiser == organiser else: return True @@ -870,7 +870,7 @@ obj = self.get_stored_object_version() if obj: - stored_attendees = uri_dict(obj.get_value_map("ATTENDEE")) + stored_attendees = obj.get_uri_map("ATTENDEE") return stored_attendees.has_key(attendee) else: return True @@ -882,7 +882,7 @@ 'user' is not specified. """ - attendees = uri_dict((obj or self.obj).get_value_map("ATTENDEE")) + attendees = (obj or self.obj).get_uri_map("ATTENDEE") return attendees.get(user or self.user) def is_participating(self, user, as_organiser=False, obj=None): @@ -1146,7 +1146,7 @@ Client.update_freebusy(self, freebusy, periods, transp, self.uid, self.recurrenceid, obj.get_value("SUMMARY"), - get_uri(obj.get_value("ORGANIZER")), + obj.get_uri("ORGANIZER"), expires) def update_freebusy_for_participant(self, freebusy, user, for_organiser=False, @@ -1238,7 +1238,7 @@ # Filter out unrecognised attendees. - attendees = set(attendees).intersection(uri_values(obj.get_values("ATTENDEE"))) + attendees = set(attendees).intersection(obj.get_uri_values("ATTENDEE")) for attendee in attendees: self.update_freebusy_from_participant(attendee, False) diff -r fe50d2b3760a -r 5e4371f01764 imiptools/data.py --- a/imiptools/data.py Mon Oct 16 23:21:15 2017 +0200 +++ b/imiptools/data.py Tue Oct 17 17:16:36 2017 +0200 @@ -138,21 +138,48 @@ def copy(self): return Object(self.to_dict()) + # Access to (value, attributes) items. + def get_items(self, name, all=True): return get_items(self.details, name, all) def get_item(self, name): return get_item(self.details, name) + # Access to mappings. + def get_value_map(self, name): return get_value_map(self.details, name) + # Access to mapped values. + def get_values(self, name, all=True): return get_values(self.details, name, all) def get_value(self, name): return get_value(self.details, name) + # Convenience methods asserting URI values. + + def get_uri_items(self, name, all=True): + return uri_items(self.get_items(name, all)) + + def get_uri_item(self, name): + return uri_item(self.get_item(name)) + + def get_uri_map(self, name): + return uri_dict(self.get_value_map(name)) + + def get_uri_values(self, name): + return uri_values(self.get_values(name)) + + def get_uri_value(self, name): + return uri_value(self.get_value(name)) + + get_uri = get_uri_value + + # Access to details as temporal objects. + def get_utc_datetime(self, name, date_tzid=None): return get_utc_datetime(self.details, name, date_tzid) @@ -344,7 +371,7 @@ only_organiser and "ORG" or self.get_value("TRANSP") or "OPAQUE", self.get_recurrenceid(), self.get_value("SUMMARY"), - get_uri(self.get_value("ORGANIZER")) + self.get_uri("ORGANIZER") ) def get_participation_status(self, participant): @@ -354,8 +381,8 @@ special value "ORG" indicating organiser-only participation. """ - attendees = uri_dict(self.get_value_map("ATTENDEE")) - organiser = get_uri(self.get_value("ORGANIZER")) + attendees = self.get_uri_map("ATTENDEE") + organiser = self.get_uri("ORGANIZER") attendee_attr = attendees.get(participant) if attendee_attr: diff -r fe50d2b3760a -r 5e4371f01764 imiptools/handlers/__init__.py --- a/imiptools/handlers/__init__.py Mon Oct 16 23:21:15 2017 +0200 +++ b/imiptools/handlers/__init__.py Tue Oct 17 17:16:36 2017 +0200 @@ -23,7 +23,7 @@ from imiptools.client import ClientForObject from imiptools.config import settings from imiptools.data import check_delegation, get_address, get_uri, \ - get_sender_identities, uri_dict, uri_item + get_sender_identities from socket import gethostname MANAGER_PATH = settings["MANAGER_PATH"] @@ -177,7 +177,7 @@ Return whether delegation is occurring by returning any delegator. """ - attendee_map = uri_dict(self.obj.get_value_map("ATTENDEE")) + attendee_map = self.obj.get_uri_map("ATTENDEE") attendee_attr = attendee_map.get(self.user) return check_delegation(attendee_map, self.user, attendee_attr) @@ -192,7 +192,7 @@ the actual organiser is returned. """ - organiser, organiser_attr = organiser_item = uri_item(self.obj.get_item("ORGANIZER")) + organiser, organiser_attr = organiser_item = self.obj.get_uri_item("ORGANIZER") if not organiser: return None @@ -235,7 +235,7 @@ The attendee identities are normalized. """ - attendee_map = uri_dict(self.obj.get_value_map("ATTENDEE")) + attendee_map = self.obj.get_uri_map("ATTENDEE") # Only provide details for attendees who sent/receive the message. diff -r fe50d2b3760a -r 5e4371f01764 imiptools/handlers/common.py --- a/imiptools/handlers/common.py Mon Oct 16 23:21:15 2017 +0200 +++ b/imiptools/handlers/common.py Tue Oct 17 17:16:36 2017 +0200 @@ -19,8 +19,7 @@ this program. If not, see . """ -from imiptools.data import get_address, get_uri, make_freebusy, to_part, \ - uri_dict +from imiptools.data import get_address, make_freebusy, to_part from imiptools.dates import format_datetime from imiptools.freebusy import FreeBusyPeriod from imiptools.period import Period @@ -126,8 +125,8 @@ "Make a REFRESH message." - organiser = get_uri(self.obj.get_value("ORGANIZER")) - attendees = uri_dict(self.obj.get_value_map("ATTENDEE")) + organiser = self.obj.get_uri("ORGANIZER") + attendees = self.obj.get_uri_map("ATTENDEE") # Indicate the actual sender of the message. @@ -169,8 +168,8 @@ # Transfer attendance information from the parent. - parent_attendees = uri_dict(parent.get_value_map("ATTENDEE")) - attendee_map = uri_dict(self.obj.get_value_map("ATTENDEE")) + parent_attendees = parent.get_uri_map("ATTENDEE") + attendee_map = self.obj.get_uri_map("ATTENDEE") for attendee, attendee_attr in parent_attendees.items(): if not attendee_map.has_key(attendee): diff -r fe50d2b3760a -r 5e4371f01764 imiptools/handlers/person.py --- a/imiptools/handlers/person.py Mon Oct 16 23:21:15 2017 +0200 +++ b/imiptools/handlers/person.py Tue Oct 17 17:16:36 2017 +0200 @@ -3,7 +3,7 @@ """ Handlers for a person for whom scheduling is performed. -Copyright (C) 2014, 2015, 2016 Paul Boddie +Copyright (C) 2014, 2015, 2016, 2017 Paul Boddie This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -19,7 +19,7 @@ this program. If not, see . """ -from imiptools.data import get_address, uri_dict +from imiptools.data import get_address from imiptools.handlers import Handler from imiptools.handlers.common import CommonFreebusy, CommonEvent @@ -120,7 +120,7 @@ self.store.dequeue_request(self.user, self.uid, self.recurrenceid) self.store.remove_counters(self.user, self.uid, self.recurrenceid) self.remove_event_from_freebusy() - self.remove_freebusy_from_attendees(uri_dict(self.obj.get_value_map("ATTENDEE"))) + self.remove_freebusy_from_attendees(self.obj.get_uri_map("ATTENDEE")) return True return self._process(self._schedule_for_attendee, queue=False, cancel=True) diff -r fe50d2b3760a -r 5e4371f01764 imiptools/handlers/person_outgoing.py --- a/imiptools/handlers/person_outgoing.py Mon Oct 16 23:21:15 2017 +0200 +++ b/imiptools/handlers/person_outgoing.py Tue Oct 17 17:16:36 2017 +0200 @@ -4,7 +4,7 @@ Handlers for a person for whom scheduling is performed, inspecting outgoing messages to obtain scheduling done externally. -Copyright (C) 2014, 2015, 2016 Paul Boddie +Copyright (C) 2014, 2015, 2016, 2017 Paul Boddie This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -21,7 +21,6 @@ """ from imiptools.client import Client -from imiptools.data import get_uri, uri_dict, uri_values from imiptools.handlers import Handler from imiptools.handlers.common import CommonEvent @@ -41,7 +40,7 @@ if self.obj and not self.user: from_organiser = method in self.organiser_methods if from_organiser: - self.user = get_uri(self.obj.get_value("ORGANIZER")) + self.user = self.obj.get_uri("ORGANIZER") # Since there may be many attendees in an attendee-provided outgoing # message, because counter-proposals can have more than one @@ -179,9 +178,9 @@ # Only cancel the event completely if all attendees are given. - attendees = uri_dict(old.get_value_map("ATTENDEE")) + attendees = old.get_uri_map("ATTENDEE") all_attendees = set(attendees.keys()) - given_attendees = set(uri_values(self.obj.get_values("ATTENDEE"))) + given_attendees = set(self.obj.get_uri_values("ATTENDEE")) cancel_entire_event = not all_attendees.difference(given_attendees) # Update the recipient's record of the organiser's schedule. @@ -238,7 +237,7 @@ if not self.have_new_object(): return False - self.remove_counters(uri_values(self.obj.get_values("ATTENDEE"))) + self.remove_counters(self.obj.get_uri_values("ATTENDEE")) class Event(PersonHandler): diff -r fe50d2b3760a -r 5e4371f01764 imiptools/handlers/resource.py --- a/imiptools/handlers/resource.py Mon Oct 16 23:21:15 2017 +0200 +++ b/imiptools/handlers/resource.py Tue Oct 17 17:16:36 2017 +0200 @@ -20,7 +20,7 @@ """ from email.mime.text import MIMEText -from imiptools.data import get_address, uri_dict +from imiptools.data import get_address from imiptools.handlers import Handler from imiptools.handlers.common import CommonFreebusy, CommonEvent from imiptools.handlers.scheduling import apply_scheduling_functions, \ @@ -89,7 +89,7 @@ "Attempt to schedule the current object for the current user." - attendee_attr = uri_dict(self.obj.get_value_map("ATTENDEE"))[self.user] + attendee_attr = self.obj.get_uri_map("ATTENDEE")[self.user] delegates = None # Attempt to schedule the event. @@ -176,7 +176,7 @@ if delegates: for delegate in delegates: - delegate_attr = uri_dict(self.obj.get_value_map("ATTENDEE"))[delegate] + delegate_attr = self.obj.get_uri_map("ATTENDEE")[delegate] attendees.append((delegate, delegate_attr)) # Reply to the delegator in addition to the organiser if replying to a @@ -185,7 +185,7 @@ delegators = self.is_delegation() if delegators: for delegator in delegators: - delegator_attr = uri_dict(self.obj.get_value_map("ATTENDEE"))[delegator] + delegator_attr = self.obj.get_uri_map("ATTENDEE")[delegator] attendees.append((delegator, delegator_attr)) recipients.append(get_address(delegator)) diff -r fe50d2b3760a -r 5e4371f01764 imiptools/handlers/scheduling/quota.py --- a/imiptools/handlers/scheduling/quota.py Mon Oct 16 23:21:15 2017 +0200 +++ b/imiptools/handlers/scheduling/quota.py Tue Oct 17 17:16:36 2017 +0200 @@ -20,7 +20,6 @@ """ from imiptools.dates import get_duration, to_utc_datetime -from imiptools.data import get_uri, uri_dict from imiptools.handlers.scheduling.common import get_scheduling_conflicts, \ standard_responses from imiptools.period import Endless @@ -109,7 +108,7 @@ # Set attendance. - attendee_map = uri_dict(obj.get_value_map("ATTENDEE")) + attendee_map = obj.get_uri_map("ATTENDEE") attendee_map[handler.user]["PARTSTAT"] = "ACCEPTED" obj["ATTENDEE"] = attendee_map.items() @@ -131,7 +130,7 @@ if not obj: return - attendee_map = uri_dict(obj.get_value_map("ATTENDEE")) + attendee_map = obj.get_uri_map("ATTENDEE") delegates = journal.get_delegates(quota) # Determine whether any of the delegates are still involved. @@ -165,7 +164,7 @@ # Obtain the identity to whom the quota will apply. - organiser = get_uri(handler.obj.get_value("ORGANIZER")) + organiser = handler.obj.get_uri("ORGANIZER") # Obtain any user group to which the quota will apply instead. @@ -320,7 +319,7 @@ # Obtain the identity for whom the scheduling will apply. - organiser = get_uri(handler.obj.get_value("ORGANIZER")) + organiser = handler.obj.get_uri("ORGANIZER") return quota, organiser @@ -349,7 +348,7 @@ # Determine the status of the recipient. - attendee_map = uri_dict(handler.obj.get_value_map("ATTENDEE")) + attendee_map = handler.obj.get_uri_map("ATTENDEE") attendee_attr = attendee_map[handler.user] # Prevent delegation by a delegate.