def generateAttendeeFreeBusyResponse(self, recipient, organizerProp, organizerPrincipal, uid, attendeeProp, remote, event_details=None): # Find the current recipients calendars that are not transparent fbset = (yield recipient.inbox.ownerHome().loadCalendars()) fbset = [calendar for calendar in fbset if calendar.isUsedForFreeBusy()] # First list is BUSY, second BUSY-TENTATIVE, third BUSY-UNAVAILABLE fbinfo = ([], [], []) # Process the availability property from the Inbox. availability = recipient.inbox.ownerHome().getAvailability() if availability is not None: processAvailabilityFreeBusy(availability, fbinfo, self.scheduler.timeRange) # Check to see if the recipient is the same calendar user as the organizer. # Needed for masked UID stuff. if isinstance(self.scheduler.organizer, LocalCalendarUser): same_calendar_user = self.scheduler.organizer.record.uid == recipient.record.uid else: same_calendar_user = False # Now process free-busy set calendars matchtotal = 0 for calendar in fbset: matchtotal = (yield generateFreeBusyInfo( calendar, fbinfo, self.scheduler.timeRange, matchtotal, excludeuid=self.scheduler.excludeUID, organizer=self.scheduler.organizer.cuaddr, organizerPrincipal=organizerPrincipal, same_calendar_user=same_calendar_user, servertoserver=remote, event_details=event_details, logItems=self.scheduler.logItems, )) # Build VFREEBUSY iTIP reply for this recipient fbresult = buildFreeBusyResult( fbinfo, self.scheduler.timeRange, organizer=organizerProp, attendee=attendeeProp, uid=uid, method="REPLY", event_details=event_details, ) returnValue(fbresult)
def generateAttendeeFreeBusyResponse(self, recipient, organizerProp, organizerPrincipal, uid, attendeeProp, remote, event_details=None): # Find the current recipients calendars that are not transparent fbset = (yield recipient.inbox.ownerHome().loadCalendars()) fbset = [calendar for calendar in fbset if calendar.isUsedForFreeBusy()] # First list is BUSY, second BUSY-TENTATIVE, third BUSY-UNAVAILABLE fbinfo = ([], [], []) # Process the availability property from the Inbox. availability = recipient.inbox.ownerHome().getAvailability() if availability is not None: processAvailabilityFreeBusy(availability, fbinfo, self.scheduler.timeRange) # Check to see if the recipient is the same calendar user as the organizer. # Needed for masked UID stuff. if isinstance(self.scheduler.organizer, LocalCalendarUser): same_calendar_user = self.scheduler.organizer.principal.uid == recipient.principal.uid else: same_calendar_user = False # Now process free-busy set calendars matchtotal = 0 for calendar in fbset: matchtotal = (yield generateFreeBusyInfo( calendar, fbinfo, self.scheduler.timeRange, matchtotal, excludeuid=self.scheduler.excludeUID, organizer=self.scheduler.organizer.cuaddr, organizerPrincipal=organizerPrincipal, same_calendar_user=same_calendar_user, servertoserver=remote, event_details=event_details, logItems=self.scheduler.logItems, )) # Build VFREEBUSY iTIP reply for this recipient fbresult = buildFreeBusyResult( fbinfo, self.scheduler.timeRange, organizer=organizerProp, attendee=attendeeProp, uid=uid, method="REPLY", event_details=event_details, ) returnValue(fbresult)
def test_simple(self): data = ( ( "#1.1 No busy time", [ [], [], [], ], "20080601T000000Z", "20080602T000000Z", None, None, None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z END:VFREEBUSY END:VCALENDAR """, ), ( "#1.2 No busy time with organizer & attendee", [ [], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.3 With single busy time", [ [Period.parseText("20080601T120000Z/20080601T130000Z"), ], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T130000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.4 With multiple busy time", [ [ Period.parseText("20080601T120000Z/20080601T130000Z"), Period.parseText("20080601T140000Z/20080601T150000Z"), ], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T130000Z,20080601T140000Z/20080601T150000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.5 With multiple busy time, some overlap", [ [ Period.parseText("20080601T120000Z/20080601T130000Z"), Period.parseText("20080601T123000Z/20080601T133000Z"), Period.parseText("20080601T140000Z/20080601T150000Z"), Period.parseText("20080601T150000Z/20080601T160000Z"), ], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T133000Z,20080601T140000Z/20080601T160000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.6 With all busy time types", [ [ Period.parseText("20080601T120000Z/20080601T130000Z"), Period.parseText("20080601T140000Z/20080601T150000Z"), ], [ Period.parseText("20080601T140000Z/20080601T150000Z"), ], [ Period.parseText("20080601T160000Z/20080601T170000Z"), ], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T130000Z,20080601T140000Z/20080601T150000Z FREEBUSY;FBTYPE=BUSY-TENTATIVE:20080601T140000Z/20080601T150000Z FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20080601T160000Z/20080601T170000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.7 With single busy time and event details", [ [Period.parseText("20080601T120000Z/20080601T130000Z"), ], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), [ tuple(Component.fromString("""BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:1234-5678 DTSTAMP:20080601T000000Z DTSTART:20080601T120000Z DTEND:20080601T130000Z END:VEVENT END:VCALENDAR """).subcomponents())[0], ], """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT DTSTART:20080601T120000Z DTEND:20080601T130000Z END:VEVENT BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T130000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ) for description, fbinfo, dtstart, dtend, organizer, attendee, event_details, calendar in data: timerange = caldavxml.TimeRange(start=dtstart, end=dtend) result = buildFreeBusyResult(fbinfo, timerange, organizer=organizer, attendee=attendee, event_details=event_details) self.assertEqual(normalizeiCalendarText(str(result)), calendar.replace("\n", "\r\n"), msg=description)
def test_simple(self): data = ( ( "#1.1 No busy time", [ [], [], [], ], "20080601T000000Z", "20080602T000000Z", None, None, None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z END:VFREEBUSY END:VCALENDAR """, ), ( "#1.2 No busy time with organizer & attendee", [ [], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.3 With single busy time", [ [ Period.parseText("20080601T120000Z/20080601T130000Z"), ], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T130000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.4 With multiple busy time", [ [ Period.parseText("20080601T120000Z/20080601T130000Z"), Period.parseText("20080601T140000Z/20080601T150000Z"), ], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T130000Z,20080601T140000Z/20080601T150000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.5 With multiple busy time, some overlap", [ [ Period.parseText("20080601T120000Z/20080601T130000Z"), Period.parseText("20080601T123000Z/20080601T133000Z"), Period.parseText("20080601T140000Z/20080601T150000Z"), Period.parseText("20080601T150000Z/20080601T160000Z"), ], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T133000Z,20080601T140000Z/20080601T160000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.6 With all busy time types", [ [ Period.parseText("20080601T120000Z/20080601T130000Z"), Period.parseText("20080601T140000Z/20080601T150000Z"), ], [ Period.parseText("20080601T140000Z/20080601T150000Z"), ], [ Period.parseText("20080601T160000Z/20080601T170000Z"), ], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), None, """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T130000Z,20080601T140000Z/20080601T150000Z FREEBUSY;FBTYPE=BUSY-TENTATIVE:20080601T140000Z/20080601T150000Z FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20080601T160000Z/20080601T170000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ( "#1.7 With single busy time and event details", [ [ Period.parseText("20080601T120000Z/20080601T130000Z"), ], [], [], ], "20080601T000000Z", "20080602T000000Z", Property("ORGANIZER", "mailto:[email protected]"), Property("ATTENDEE", "mailto:[email protected]"), [ tuple( Component.fromString("""BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:1234-5678 DTSTAMP:20080601T000000Z DTSTART:20080601T120000Z DTEND:20080601T130000Z END:VEVENT END:VCALENDAR """).subcomponents())[0], ], """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT DTSTART:20080601T120000Z DTEND:20080601T130000Z END:VEVENT BEGIN:VFREEBUSY DTSTART:20080601T000000Z DTEND:20080602T000000Z ATTENDEE:mailto:[email protected] FREEBUSY;FBTYPE=BUSY:20080601T120000Z/20080601T130000Z ORGANIZER:mailto:[email protected] END:VFREEBUSY END:VCALENDAR """, ), ) for description, fbinfo, dtstart, dtend, organizer, attendee, event_details, calendar in data: timerange = caldavxml.TimeRange(start=dtstart, end=dtend) result = buildFreeBusyResult(fbinfo, timerange, organizer=organizer, attendee=attendee, event_details=event_details) self.assertEqual(normalizeiCalendarText(str(result)), calendar.replace("\n", "\r\n"), msg=description)