imip-agent

imiptools/handlers/common.py

182:2527a2230686
2015-01-28 Paul Boddie Changed the responses from handlers to be collections of messages, with outgoing message usage made explicit, thus permitting multiple responses for certain methods. Made more widespread use of the special wrap method in the person handler for providing messages to recipients.
     1 #!/usr/bin/env python     2      3 """     4 Common handler functionality for different entities.     5      6 Copyright (C) 2014, 2015 Paul Boddie <paul@boddie.org.uk>     7      8 This program is free software; you can redistribute it and/or modify it under     9 the terms of the GNU General Public License as published by the Free Software    10 Foundation; either version 3 of the License, or (at your option) any later    11 version.    12     13 This program is distributed in the hope that it will be useful, but WITHOUT    14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS    15 FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more    16 details.    17     18 You should have received a copy of the GNU General Public License along with    19 this program.  If not, see <http://www.gnu.org/licenses/>.    20 """    21     22 from imiptools.content import to_part    23     24 class CommonFreebusy:    25     26     "Common free/busy mix-in."    27     28     def request(self):    29     30         """    31         Respond to a request by preparing a reply containing free/busy    32         information for each indicated attendee.    33         """    34     35         calendar = self.make_freebusy(from_organiser=False)    36     37         # Return the reply.    38     39         return [(True, to_part("REPLY", calendar))]    40     41     def make_freebusy_to_publish(self, from_organiser=True):    42     43         """    44         Make a freebusy object for publication for a user, providing either an    45         organiser's details if 'from_organiser' is set to a true value, or an    46         attendee's details otherwise.    47         """    48     49         calendar = self.make_freebusy(from_organiser, publish=True)    50     51         # Return a published object.    52     53         return [(True, to_part("PUBLISH", calendar))]    54     55     def make_freebusy(self, from_organiser=True, publish=False):    56     57         """    58         Make a freebusy object, providing either an organiser's details if    59         'from_organiser' is set to a true value, or an attendee's details    60         otherwise.    61         """    62     63         oa = self.require_organiser_and_attendees()    64         if not oa:    65             return None    66     67         (organiser, organiser_attr), attendees = oa    68     69         # Get the details for each attendee.    70     71         calendar = []    72         cwrite = calendar.append    73     74         for attendee, attendee_attr in attendees.items():    75     76             # Construct an appropriate fragment.    77     78             freebusy = self.store.get_freebusy(from_organiser and organiser or attendee)    79     80             record = []    81             rwrite = record.append    82     83             # For replies, the organiser is preserved.    84     85             if not publish or from_organiser:    86                 rwrite(("ORGANIZER", organiser_attr, organiser))    87     88             # For published objects, the organiser is actually the user whose    89             # information is being provided.    90     91             else:    92                 rwrite(("ORGANIZER", attendee_attr, attendee))    93     94             # For replies, the attendee is preserved.    95             # (Published objects do not employ the attendee property.)    96     97             if not publish:    98                 rwrite(("ATTENDEE", attendee_attr, attendee))    99    100             rwrite(("UID", {}, self.uid))   101    102             if freebusy:   103                 for start, end, uid, transp in freebusy:   104                     if transp == "OPAQUE":   105                         rwrite(("FREEBUSY", {"FBTYPE" : "BUSY"}, "/".join([start, end])))   106    107             cwrite(("VFREEBUSY", {}, record))   108    109         # Return the object.   110    111         return calendar   112    113 # vim: tabstop=4 expandtab shiftwidth=4