1.1 --- a/imiptools/client.py Mon Oct 16 23:21:15 2017 +0200
1.2 +++ b/imiptools/client.py Tue Oct 17 17:16:36 2017 +0200
1.3 @@ -25,7 +25,7 @@
1.4 get_sender_identities, get_uri, \
1.5 get_window_end, is_new_object, make_freebusy, \
1.6 make_uid, to_part, update_attendees_with_delegates, \
1.7 - uri_dict, uri_item, uri_items, uri_parts, uri_values
1.8 + uri_parts, uri_values
1.9 from imiptools.dates import check_permitted_values, format_datetime, \
1.10 get_datetime, get_default_timezone, \
1.11 get_duration, get_time, get_timestamp, \
1.12 @@ -364,7 +364,7 @@
1.13 # Get the parent event, add SENT-BY details to the organiser.
1.14
1.15 if not attendee or self.is_participating(attendee, obj=obj):
1.16 - organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER"))
1.17 + organiser, organiser_attr = obj.get_uri_item("ORGANIZER")
1.18 self.update_sender(organiser_attr)
1.19 responses.append(self.object_to_part(method, obj))
1.20 methods.add(method)
1.21 @@ -387,7 +387,7 @@
1.22 obj = self.get_stored_object(self.uid, recurrenceid, section)
1.23
1.24 if not attendee or self.is_participating(attendee, obj=obj):
1.25 - organiser, organiser_attr = uri_item(obj.get_item("ORGANIZER"))
1.26 + organiser, organiser_attr = obj.get_uri_item("ORGANIZER")
1.27 self.update_sender(organiser_attr)
1.28 responses.append(self.object_to_part(rmethod, obj))
1.29 methods.add(rmethod)
1.30 @@ -436,7 +436,7 @@
1.31 Return whether the current user is the organiser in the current object.
1.32 """
1.33
1.34 - return get_uri(self.obj.get_value("ORGANIZER")) == self.user
1.35 + return self.obj.get_uri("ORGANIZER") == self.user
1.36
1.37 def is_recurrence(self):
1.38
1.39 @@ -457,7 +457,7 @@
1.40
1.41 obj = obj or self.obj
1.42 calendar_uri = self.messenger and get_uri(self.messenger.sender)
1.43 - for attendee, attendee_attr in uri_items(obj.get_items("ATTENDEE")):
1.44 + for attendee, attendee_attr in obj.get_uri_items("ATTENDEE"):
1.45 if attendee != self.user:
1.46 if attendee_attr.get("SENT-BY") == calendar_uri:
1.47 del attendee_attr["SENT-BY"]
1.48 @@ -478,7 +478,7 @@
1.49 # is taken from the SENT-BY attribute if present, or from the
1.50 # attendee value otherwise.
1.51
1.52 - sent_by = get_sender_identities(uri_dict(self.obj.get_value_map("ATTENDEE")))
1.53 + sent_by = get_sender_identities(self.obj.get_uri_map("ATTENDEE"))
1.54
1.55 # Obtain the attendee for the first sender matching the SENT-BY or
1.56 # attendee value.
1.57 @@ -547,7 +547,7 @@
1.58
1.59 # Get attendee details in a usable form.
1.60
1.61 - stored_attendees = uri_dict(obj.get_value_map("ATTENDEE"))
1.62 + stored_attendees = obj.get_uri_map("ATTENDEE")
1.63
1.64 for attendee, attendee_attr in attendees.items():
1.65
1.66 @@ -581,7 +581,7 @@
1.67
1.68 to_cancel = []
1.69
1.70 - existing_attendees = uri_items(self.obj.get_items("ATTENDEE") or [])
1.71 + existing_attendees = self.obj.get_uri_items("ATTENDEE") or []
1.72 existing_attendees_map = dict(existing_attendees)
1.73
1.74 # Added attendees are those from the supplied collection not already
1.75 @@ -656,7 +656,7 @@
1.76 given 'partstat'.
1.77 """
1.78
1.79 - attendee_attr = uri_dict(self.obj.get_value_map("ATTENDEE")).get(self.user)
1.80 + attendee_attr = self.obj.get_uri_map("ATTENDEE").get(self.user)
1.81 if not attendee_attr:
1.82 return None
1.83 if partstat:
1.84 @@ -681,8 +681,8 @@
1.85 # also attending. The updated event will be saved by the outgoing
1.86 # handler.
1.87
1.88 - organiser = get_uri(obj.get_value("ORGANIZER"))
1.89 - attendees = uri_values(obj.get_values("ATTENDEE"))
1.90 + organiser = obj.get_uri("ORGANIZER")
1.91 + attendees = obj.get_uri_values("ATTENDEE")
1.92
1.93 if from_organiser:
1.94 recipients = [get_address(attendee) for attendee in attendees if attendee != self.user]
1.95 @@ -795,7 +795,7 @@
1.96
1.97 # Here, the organiser should be the current user.
1.98
1.99 - organiser, organiser_attr = uri_item(self.obj.get_item("ORGANIZER"))
1.100 + organiser, organiser_attr = self.obj.get_uri_item("ORGANIZER")
1.101
1.102 self.update_sender(organiser_attr)
1.103 self.update_senders()
1.104 @@ -855,7 +855,7 @@
1.105
1.106 obj = self.get_stored_object_version()
1.107 if obj:
1.108 - stored_organiser = get_uri(obj.get_value("ORGANIZER"))
1.109 + stored_organiser = obj.get_uri("ORGANIZER")
1.110 return stored_organiser == organiser
1.111 else:
1.112 return True
1.113 @@ -870,7 +870,7 @@
1.114
1.115 obj = self.get_stored_object_version()
1.116 if obj:
1.117 - stored_attendees = uri_dict(obj.get_value_map("ATTENDEE"))
1.118 + stored_attendees = obj.get_uri_map("ATTENDEE")
1.119 return stored_attendees.has_key(attendee)
1.120 else:
1.121 return True
1.122 @@ -882,7 +882,7 @@
1.123 'user' is not specified.
1.124 """
1.125
1.126 - attendees = uri_dict((obj or self.obj).get_value_map("ATTENDEE"))
1.127 + attendees = (obj or self.obj).get_uri_map("ATTENDEE")
1.128 return attendees.get(user or self.user)
1.129
1.130 def is_participating(self, user, as_organiser=False, obj=None):
1.131 @@ -1146,7 +1146,7 @@
1.132 Client.update_freebusy(self, freebusy, periods, transp,
1.133 self.uid, self.recurrenceid,
1.134 obj.get_value("SUMMARY"),
1.135 - get_uri(obj.get_value("ORGANIZER")),
1.136 + obj.get_uri("ORGANIZER"),
1.137 expires)
1.138
1.139 def update_freebusy_for_participant(self, freebusy, user, for_organiser=False,
1.140 @@ -1238,7 +1238,7 @@
1.141
1.142 # Filter out unrecognised attendees.
1.143
1.144 - attendees = set(attendees).intersection(uri_values(obj.get_values("ATTENDEE")))
1.145 + attendees = set(attendees).intersection(obj.get_uri_values("ATTENDEE"))
1.146
1.147 for attendee in attendees:
1.148 self.update_freebusy_from_participant(attendee, False)
2.1 --- a/imiptools/data.py Mon Oct 16 23:21:15 2017 +0200
2.2 +++ b/imiptools/data.py Tue Oct 17 17:16:36 2017 +0200
2.3 @@ -138,21 +138,48 @@
2.4 def copy(self):
2.5 return Object(self.to_dict())
2.6
2.7 + # Access to (value, attributes) items.
2.8 +
2.9 def get_items(self, name, all=True):
2.10 return get_items(self.details, name, all)
2.11
2.12 def get_item(self, name):
2.13 return get_item(self.details, name)
2.14
2.15 + # Access to mappings.
2.16 +
2.17 def get_value_map(self, name):
2.18 return get_value_map(self.details, name)
2.19
2.20 + # Access to mapped values.
2.21 +
2.22 def get_values(self, name, all=True):
2.23 return get_values(self.details, name, all)
2.24
2.25 def get_value(self, name):
2.26 return get_value(self.details, name)
2.27
2.28 + # Convenience methods asserting URI values.
2.29 +
2.30 + def get_uri_items(self, name, all=True):
2.31 + return uri_items(self.get_items(name, all))
2.32 +
2.33 + def get_uri_item(self, name):
2.34 + return uri_item(self.get_item(name))
2.35 +
2.36 + def get_uri_map(self, name):
2.37 + return uri_dict(self.get_value_map(name))
2.38 +
2.39 + def get_uri_values(self, name):
2.40 + return uri_values(self.get_values(name))
2.41 +
2.42 + def get_uri_value(self, name):
2.43 + return uri_value(self.get_value(name))
2.44 +
2.45 + get_uri = get_uri_value
2.46 +
2.47 + # Access to details as temporal objects.
2.48 +
2.49 def get_utc_datetime(self, name, date_tzid=None):
2.50 return get_utc_datetime(self.details, name, date_tzid)
2.51
2.52 @@ -344,7 +371,7 @@
2.53 only_organiser and "ORG" or self.get_value("TRANSP") or "OPAQUE",
2.54 self.get_recurrenceid(),
2.55 self.get_value("SUMMARY"),
2.56 - get_uri(self.get_value("ORGANIZER"))
2.57 + self.get_uri("ORGANIZER")
2.58 )
2.59
2.60 def get_participation_status(self, participant):
2.61 @@ -354,8 +381,8 @@
2.62 special value "ORG" indicating organiser-only participation.
2.63 """
2.64
2.65 - attendees = uri_dict(self.get_value_map("ATTENDEE"))
2.66 - organiser = get_uri(self.get_value("ORGANIZER"))
2.67 + attendees = self.get_uri_map("ATTENDEE")
2.68 + organiser = self.get_uri("ORGANIZER")
2.69
2.70 attendee_attr = attendees.get(participant)
2.71 if attendee_attr:
3.1 --- a/imiptools/handlers/__init__.py Mon Oct 16 23:21:15 2017 +0200
3.2 +++ b/imiptools/handlers/__init__.py Tue Oct 17 17:16:36 2017 +0200
3.3 @@ -23,7 +23,7 @@
3.4 from imiptools.client import ClientForObject
3.5 from imiptools.config import settings
3.6 from imiptools.data import check_delegation, get_address, get_uri, \
3.7 - get_sender_identities, uri_dict, uri_item
3.8 + get_sender_identities
3.9 from socket import gethostname
3.10
3.11 MANAGER_PATH = settings["MANAGER_PATH"]
3.12 @@ -177,7 +177,7 @@
3.13 Return whether delegation is occurring by returning any delegator.
3.14 """
3.15
3.16 - attendee_map = uri_dict(self.obj.get_value_map("ATTENDEE"))
3.17 + attendee_map = self.obj.get_uri_map("ATTENDEE")
3.18 attendee_attr = attendee_map.get(self.user)
3.19 return check_delegation(attendee_map, self.user, attendee_attr)
3.20
3.21 @@ -192,7 +192,7 @@
3.22 the actual organiser is returned.
3.23 """
3.24
3.25 - organiser, organiser_attr = organiser_item = uri_item(self.obj.get_item("ORGANIZER"))
3.26 + organiser, organiser_attr = organiser_item = self.obj.get_uri_item("ORGANIZER")
3.27
3.28 if not organiser:
3.29 return None
3.30 @@ -235,7 +235,7 @@
3.31 The attendee identities are normalized.
3.32 """
3.33
3.34 - attendee_map = uri_dict(self.obj.get_value_map("ATTENDEE"))
3.35 + attendee_map = self.obj.get_uri_map("ATTENDEE")
3.36
3.37 # Only provide details for attendees who sent/receive the message.
3.38
4.1 --- a/imiptools/handlers/common.py Mon Oct 16 23:21:15 2017 +0200
4.2 +++ b/imiptools/handlers/common.py Tue Oct 17 17:16:36 2017 +0200
4.3 @@ -19,8 +19,7 @@
4.4 this program. If not, see <http://www.gnu.org/licenses/>.
4.5 """
4.6
4.7 -from imiptools.data import get_address, get_uri, make_freebusy, to_part, \
4.8 - uri_dict
4.9 +from imiptools.data import get_address, make_freebusy, to_part
4.10 from imiptools.dates import format_datetime
4.11 from imiptools.freebusy import FreeBusyPeriod
4.12 from imiptools.period import Period
4.13 @@ -126,8 +125,8 @@
4.14
4.15 "Make a REFRESH message."
4.16
4.17 - organiser = get_uri(self.obj.get_value("ORGANIZER"))
4.18 - attendees = uri_dict(self.obj.get_value_map("ATTENDEE"))
4.19 + organiser = self.obj.get_uri("ORGANIZER")
4.20 + attendees = self.obj.get_uri_map("ATTENDEE")
4.21
4.22 # Indicate the actual sender of the message.
4.23
4.24 @@ -169,8 +168,8 @@
4.25
4.26 # Transfer attendance information from the parent.
4.27
4.28 - parent_attendees = uri_dict(parent.get_value_map("ATTENDEE"))
4.29 - attendee_map = uri_dict(self.obj.get_value_map("ATTENDEE"))
4.30 + parent_attendees = parent.get_uri_map("ATTENDEE")
4.31 + attendee_map = self.obj.get_uri_map("ATTENDEE")
4.32
4.33 for attendee, attendee_attr in parent_attendees.items():
4.34 if not attendee_map.has_key(attendee):
5.1 --- a/imiptools/handlers/person.py Mon Oct 16 23:21:15 2017 +0200
5.2 +++ b/imiptools/handlers/person.py Tue Oct 17 17:16:36 2017 +0200
5.3 @@ -3,7 +3,7 @@
5.4 """
5.5 Handlers for a person for whom scheduling is performed.
5.6
5.7 -Copyright (C) 2014, 2015, 2016 Paul Boddie <paul@boddie.org.uk>
5.8 +Copyright (C) 2014, 2015, 2016, 2017 Paul Boddie <paul@boddie.org.uk>
5.9
5.10 This program is free software; you can redistribute it and/or modify it under
5.11 the terms of the GNU General Public License as published by the Free Software
5.12 @@ -19,7 +19,7 @@
5.13 this program. If not, see <http://www.gnu.org/licenses/>.
5.14 """
5.15
5.16 -from imiptools.data import get_address, uri_dict
5.17 +from imiptools.data import get_address
5.18 from imiptools.handlers import Handler
5.19 from imiptools.handlers.common import CommonFreebusy, CommonEvent
5.20
5.21 @@ -120,7 +120,7 @@
5.22 self.store.dequeue_request(self.user, self.uid, self.recurrenceid)
5.23 self.store.remove_counters(self.user, self.uid, self.recurrenceid)
5.24 self.remove_event_from_freebusy()
5.25 - self.remove_freebusy_from_attendees(uri_dict(self.obj.get_value_map("ATTENDEE")))
5.26 + self.remove_freebusy_from_attendees(self.obj.get_uri_map("ATTENDEE"))
5.27 return True
5.28
5.29 return self._process(self._schedule_for_attendee, queue=False, cancel=True)
6.1 --- a/imiptools/handlers/person_outgoing.py Mon Oct 16 23:21:15 2017 +0200
6.2 +++ b/imiptools/handlers/person_outgoing.py Tue Oct 17 17:16:36 2017 +0200
6.3 @@ -4,7 +4,7 @@
6.4 Handlers for a person for whom scheduling is performed, inspecting outgoing
6.5 messages to obtain scheduling done externally.
6.6
6.7 -Copyright (C) 2014, 2015, 2016 Paul Boddie <paul@boddie.org.uk>
6.8 +Copyright (C) 2014, 2015, 2016, 2017 Paul Boddie <paul@boddie.org.uk>
6.9
6.10 This program is free software; you can redistribute it and/or modify it under
6.11 the terms of the GNU General Public License as published by the Free Software
6.12 @@ -21,7 +21,6 @@
6.13 """
6.14
6.15 from imiptools.client import Client
6.16 -from imiptools.data import get_uri, uri_dict, uri_values
6.17 from imiptools.handlers import Handler
6.18 from imiptools.handlers.common import CommonEvent
6.19
6.20 @@ -41,7 +40,7 @@
6.21 if self.obj and not self.user:
6.22 from_organiser = method in self.organiser_methods
6.23 if from_organiser:
6.24 - self.user = get_uri(self.obj.get_value("ORGANIZER"))
6.25 + self.user = self.obj.get_uri("ORGANIZER")
6.26
6.27 # Since there may be many attendees in an attendee-provided outgoing
6.28 # message, because counter-proposals can have more than one
6.29 @@ -179,9 +178,9 @@
6.30
6.31 # Only cancel the event completely if all attendees are given.
6.32
6.33 - attendees = uri_dict(old.get_value_map("ATTENDEE"))
6.34 + attendees = old.get_uri_map("ATTENDEE")
6.35 all_attendees = set(attendees.keys())
6.36 - given_attendees = set(uri_values(self.obj.get_values("ATTENDEE")))
6.37 + given_attendees = set(self.obj.get_uri_values("ATTENDEE"))
6.38 cancel_entire_event = not all_attendees.difference(given_attendees)
6.39
6.40 # Update the recipient's record of the organiser's schedule.
6.41 @@ -238,7 +237,7 @@
6.42 if not self.have_new_object():
6.43 return False
6.44
6.45 - self.remove_counters(uri_values(self.obj.get_values("ATTENDEE")))
6.46 + self.remove_counters(self.obj.get_uri_values("ATTENDEE"))
6.47
6.48 class Event(PersonHandler):
6.49
7.1 --- a/imiptools/handlers/resource.py Mon Oct 16 23:21:15 2017 +0200
7.2 +++ b/imiptools/handlers/resource.py Tue Oct 17 17:16:36 2017 +0200
7.3 @@ -20,7 +20,7 @@
7.4 """
7.5
7.6 from email.mime.text import MIMEText
7.7 -from imiptools.data import get_address, uri_dict
7.8 +from imiptools.data import get_address
7.9 from imiptools.handlers import Handler
7.10 from imiptools.handlers.common import CommonFreebusy, CommonEvent
7.11 from imiptools.handlers.scheduling import apply_scheduling_functions, \
7.12 @@ -89,7 +89,7 @@
7.13
7.14 "Attempt to schedule the current object for the current user."
7.15
7.16 - attendee_attr = uri_dict(self.obj.get_value_map("ATTENDEE"))[self.user]
7.17 + attendee_attr = self.obj.get_uri_map("ATTENDEE")[self.user]
7.18 delegates = None
7.19
7.20 # Attempt to schedule the event.
7.21 @@ -176,7 +176,7 @@
7.22
7.23 if delegates:
7.24 for delegate in delegates:
7.25 - delegate_attr = uri_dict(self.obj.get_value_map("ATTENDEE"))[delegate]
7.26 + delegate_attr = self.obj.get_uri_map("ATTENDEE")[delegate]
7.27 attendees.append((delegate, delegate_attr))
7.28
7.29 # Reply to the delegator in addition to the organiser if replying to a
7.30 @@ -185,7 +185,7 @@
7.31 delegators = self.is_delegation()
7.32 if delegators:
7.33 for delegator in delegators:
7.34 - delegator_attr = uri_dict(self.obj.get_value_map("ATTENDEE"))[delegator]
7.35 + delegator_attr = self.obj.get_uri_map("ATTENDEE")[delegator]
7.36 attendees.append((delegator, delegator_attr))
7.37 recipients.append(get_address(delegator))
7.38
8.1 --- a/imiptools/handlers/scheduling/quota.py Mon Oct 16 23:21:15 2017 +0200
8.2 +++ b/imiptools/handlers/scheduling/quota.py Tue Oct 17 17:16:36 2017 +0200
8.3 @@ -20,7 +20,6 @@
8.4 """
8.5
8.6 from imiptools.dates import get_duration, to_utc_datetime
8.7 -from imiptools.data import get_uri, uri_dict
8.8 from imiptools.handlers.scheduling.common import get_scheduling_conflicts, \
8.9 standard_responses
8.10 from imiptools.period import Endless
8.11 @@ -109,7 +108,7 @@
8.12
8.13 # Set attendance.
8.14
8.15 - attendee_map = uri_dict(obj.get_value_map("ATTENDEE"))
8.16 + attendee_map = obj.get_uri_map("ATTENDEE")
8.17 attendee_map[handler.user]["PARTSTAT"] = "ACCEPTED"
8.18 obj["ATTENDEE"] = attendee_map.items()
8.19
8.20 @@ -131,7 +130,7 @@
8.21 if not obj:
8.22 return
8.23
8.24 - attendee_map = uri_dict(obj.get_value_map("ATTENDEE"))
8.25 + attendee_map = obj.get_uri_map("ATTENDEE")
8.26 delegates = journal.get_delegates(quota)
8.27
8.28 # Determine whether any of the delegates are still involved.
8.29 @@ -165,7 +164,7 @@
8.30
8.31 # Obtain the identity to whom the quota will apply.
8.32
8.33 - organiser = get_uri(handler.obj.get_value("ORGANIZER"))
8.34 + organiser = handler.obj.get_uri("ORGANIZER")
8.35
8.36 # Obtain any user group to which the quota will apply instead.
8.37
8.38 @@ -320,7 +319,7 @@
8.39
8.40 # Obtain the identity for whom the scheduling will apply.
8.41
8.42 - organiser = get_uri(handler.obj.get_value("ORGANIZER"))
8.43 + organiser = handler.obj.get_uri("ORGANIZER")
8.44
8.45 return quota, organiser
8.46
8.47 @@ -349,7 +348,7 @@
8.48
8.49 # Determine the status of the recipient.
8.50
8.51 - attendee_map = uri_dict(handler.obj.get_value_map("ATTENDEE"))
8.52 + attendee_map = handler.obj.get_uri_map("ATTENDEE")
8.53 attendee_attr = attendee_map[handler.user]
8.54
8.55 # Prevent delegation by a delegate.