imip-agent

Changeset

1337:e811fc71e425
2017-10-17 Paul Boddie raw files shortlog changelog graph Merged changes from the default branch. client-editing-simplification
imiptools/client.py (file) imiptools/data.py (file) imiptools/handlers/common.py (file) imiptools/handlers/person_outgoing.py (file) imiptools/handlers/resource.py (file)
     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.