1.1 --- a/imiptools/client.py Tue Oct 17 14:47:09 2017 +0200
1.2 +++ b/imiptools/client.py Tue Oct 17 17:43:42 2017 +0200
1.3 @@ -28,7 +28,7 @@
1.4 get_window_end, is_new_object, make_freebusy, \
1.5 make_uid, new_object, to_part, \
1.6 update_attendees_with_delegates, \
1.7 - uri_dict, uri_item, uri_items, uri_parts, uri_values
1.8 + uri_dict, 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 @@ -491,7 +491,7 @@
1.13 Return whether the current user is the organiser in the current object.
1.14 """
1.15
1.16 - return get_uri(self.obj.get_value("ORGANIZER")) == self.user
1.17 + return self.obj.get_uri("ORGANIZER") == self.user
1.18
1.19 def is_recurrence(self):
1.20
1.21 @@ -531,7 +531,7 @@
1.22 """
1.23
1.24 obj = obj or self.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_attr(organiser_attr)
1.28
1.29 def update_senders(self, obj=None):
1.30 @@ -545,7 +545,7 @@
1.31 obj = obj or self.obj
1.32 calendar_uri = self.messenger and get_uri(self.messenger.sender)
1.33
1.34 - for attendee, attendee_attr in uri_items(obj.get_items("ATTENDEE") or []):
1.35 + for attendee, attendee_attr in obj.get_uri_items("ATTENDEE") or []:
1.36
1.37 # Fix up the SENT-BY attribute for this user.
1.38
1.39 @@ -571,7 +571,7 @@
1.40 # is taken from the SENT-BY attribute if present, or from the
1.41 # attendee value otherwise.
1.42
1.43 - sent_by = get_sender_identities(uri_dict(self.obj.get_value_map("ATTENDEE")))
1.44 + sent_by = get_sender_identities(self.obj.get_uri_map("ATTENDEE"))
1.45
1.46 # Obtain the attendee for the first sender matching the SENT-BY or
1.47 # attendee value.
1.48 @@ -621,7 +621,7 @@
1.49
1.50 # Get attendee details in a usable form.
1.51
1.52 - stored_attendees = uri_dict(obj.get_value_map("ATTENDEE"))
1.53 + stored_attendees = obj.get_uri_map("ATTENDEE")
1.54
1.55 for attendee, attendee_attr in attendees.items():
1.56
1.57 @@ -649,7 +649,7 @@
1.58 'to_cancel' and 'to_modify' attendee mappings.
1.59 """
1.60
1.61 - attendees = uri_items(self.obj.get_items("ATTENDEE") or [])
1.62 + attendees = self.obj.get_uri_items("ATTENDEE") or []
1.63 attendee_map = OrderedDict(attendees)
1.64
1.65 # Normalise the identities.
1.66 @@ -702,7 +702,7 @@
1.67 given 'partstat'.
1.68 """
1.69
1.70 - attendee_attr = uri_dict(self.obj.get_value_map("ATTENDEE")).get(self.user)
1.71 + attendee_attr = self.obj.get_uri_map("ATTENDEE").get(self.user)
1.72
1.73 if not attendee_attr:
1.74 return None
1.75 @@ -761,8 +761,8 @@
1.76
1.77 obj = obj or self.obj
1.78
1.79 - organiser = get_uri(obj.get_value("ORGANIZER"))
1.80 - attendees = uri_values(obj.get_values("ATTENDEE"))
1.81 + organiser = obj.get_uri("ORGANIZER")
1.82 + attendees = obj.get_uri_values("ATTENDEE")
1.83
1.84 # As organiser, send an invitation to attendees, excluding oneself if
1.85 # also attending. The updated event will be saved by the outgoing
1.86 @@ -1076,7 +1076,7 @@
1.87
1.88 obj = self.get_stored_object_version()
1.89 if obj:
1.90 - stored_organiser = get_uri(obj.get_value("ORGANIZER"))
1.91 + stored_organiser = obj.get_uri("ORGANIZER")
1.92 return stored_organiser == organiser
1.93 else:
1.94 return True
1.95 @@ -1091,7 +1091,7 @@
1.96
1.97 obj = self.get_stored_object_version()
1.98 if obj:
1.99 - stored_attendees = uri_dict(obj.get_value_map("ATTENDEE"))
1.100 + stored_attendees = obj.get_uri_map("ATTENDEE")
1.101 return stored_attendees.has_key(attendee)
1.102 else:
1.103 return True
1.104 @@ -1103,7 +1103,7 @@
1.105 'user' is not specified.
1.106 """
1.107
1.108 - attendees = uri_dict((obj or self.obj).get_value_map("ATTENDEE"))
1.109 + attendees = (obj or self.obj).get_uri_map("ATTENDEE")
1.110 return attendees.get(user or self.user)
1.111
1.112 def is_participating(self, user, as_organiser=False, obj=None):
1.113 @@ -1355,7 +1355,7 @@
1.114 Client.update_freebusy(self, freebusy, periods, transp,
1.115 self.uid, self.recurrenceid,
1.116 obj.get_value("SUMMARY"),
1.117 - get_uri(obj.get_value("ORGANIZER")),
1.118 + obj.get_uri("ORGANIZER"),
1.119 expires)
1.120
1.121 def update_freebusy_for_participant(self, freebusy, user, for_organiser=False,
1.122 @@ -1447,7 +1447,7 @@
1.123
1.124 # Filter out unrecognised attendees.
1.125
1.126 - attendees = set(attendees).intersection(uri_values(obj.get_values("ATTENDEE")))
1.127 + attendees = set(attendees).intersection(obj.get_uri_values("ATTENDEE"))
1.128
1.129 for attendee in attendees:
1.130 self.update_freebusy_from_participant(attendee, False)
2.1 --- a/imiptools/data.py Tue Oct 17 14:47:09 2017 +0200
2.2 +++ b/imiptools/data.py Tue Oct 17 17:43:42 2017 +0200
2.3 @@ -196,15 +196,21 @@
2.4 def copy(self):
2.5 return Object(self.to_dict(), self.tzid)
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 @@ -214,6 +220,27 @@
2.26 def set_value(self, name, value, attr=None):
2.27 self.details[name] = [(value, attr or {})]
2.28
2.29 + # Convenience methods asserting URI values.
2.30 +
2.31 + def get_uri_items(self, name, all=True):
2.32 + return uri_items(self.get_items(name, all))
2.33 +
2.34 + def get_uri_item(self, name):
2.35 + return uri_item(self.get_item(name))
2.36 +
2.37 + def get_uri_map(self, name):
2.38 + return uri_dict(self.get_value_map(name))
2.39 +
2.40 + def get_uri_values(self, name):
2.41 + return uri_values(self.get_values(name))
2.42 +
2.43 + def get_uri_value(self, name):
2.44 + return uri_value(self.get_value(name))
2.45 +
2.46 + get_uri = get_uri_value
2.47 +
2.48 + # Access to details as temporal objects.
2.49 +
2.50 def get_utc_datetime(self, name):
2.51 return get_utc_datetime(self.details, name, self.tzid)
2.52
2.53 @@ -463,7 +490,7 @@
2.54 only_organiser and "ORG" or self.get_value("TRANSP") or "OPAQUE",
2.55 self.get_recurrenceid(),
2.56 self.get_value("SUMMARY"),
2.57 - get_uri(self.get_value("ORGANIZER"))
2.58 + self.get_uri("ORGANIZER")
2.59 )
2.60
2.61 def get_participation_status(self, participant):
2.62 @@ -473,8 +500,8 @@
2.63 special value "ORG" indicating organiser-only participation.
2.64 """
2.65
2.66 - attendees = uri_dict(self.get_value_map("ATTENDEE"))
2.67 - organiser = get_uri(self.get_value("ORGANIZER"))
2.68 + attendees = self.get_uri_map("ATTENDEE")
2.69 + organiser = self.get_uri("ORGANIZER")
2.70
2.71 attendee_attr = attendees.get(participant)
2.72 if attendee_attr:
3.1 --- a/imiptools/handlers/__init__.py Tue Oct 17 14:47:09 2017 +0200
3.2 +++ b/imiptools/handlers/__init__.py Tue Oct 17 17:43:42 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 Tue Oct 17 14:47:09 2017 +0200
4.2 +++ b/imiptools/handlers/common.py Tue Oct 17 17:43:42 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 Tue Oct 17 14:47:09 2017 +0200
5.2 +++ b/imiptools/handlers/person.py Tue Oct 17 17:43:42 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 Tue Oct 17 14:47:09 2017 +0200
6.2 +++ b/imiptools/handlers/person_outgoing.py Tue Oct 17 17:43:42 2017 +0200
6.3 @@ -21,7 +21,6 @@
6.4 """
6.5
6.6 from imiptools.client import Client
6.7 -from imiptools.data import get_uri, uri_dict, uri_values
6.8 from imiptools.handlers import Handler
6.9 from imiptools.handlers.common import CommonEvent
6.10
6.11 @@ -41,7 +40,7 @@
6.12 if self.obj and not self.user:
6.13 from_organiser = method in self.organiser_methods
6.14 if from_organiser:
6.15 - self.user = get_uri(self.obj.get_value("ORGANIZER"))
6.16 + self.user = self.obj.get_uri("ORGANIZER")
6.17
6.18 # Since there may be many attendees in an attendee-provided outgoing
6.19 # message, because counter-proposals can have more than one
6.20 @@ -183,9 +182,9 @@
6.21
6.22 # Only cancel the event completely if all attendees are given.
6.23
6.24 - attendees = uri_dict(old.get_value_map("ATTENDEE"))
6.25 + attendees = old.get_uri_map("ATTENDEE")
6.26 all_attendees = set(attendees.keys())
6.27 - given_attendees = set(uri_values(self.obj.get_values("ATTENDEE")))
6.28 + given_attendees = set(self.obj.get_uri_values("ATTENDEE"))
6.29 cancel_entire_event = not all_attendees.difference(given_attendees)
6.30
6.31 # Update the recipient's record of the organiser's schedule.
6.32 @@ -242,7 +241,7 @@
6.33 if not self.have_new_object():
6.34 return False
6.35
6.36 - self.remove_counters(uri_values(self.obj.get_values("ATTENDEE")))
6.37 + self.remove_counters(self.obj.get_uri_values("ATTENDEE"))
6.38
6.39 class Event(PersonHandler):
6.40
7.1 --- a/imiptools/handlers/resource.py Tue Oct 17 14:47:09 2017 +0200
7.2 +++ b/imiptools/handlers/resource.py Tue Oct 17 17:43:42 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 Tue Oct 17 14:47:09 2017 +0200
8.2 +++ b/imiptools/handlers/scheduling/quota.py Tue Oct 17 17:43:42 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.