def test_free_busy_set_same(self): """ Test that calendar-free-busy-set has the correct value and can be reset to the same. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar/")) newfbset = set() newfbset.add("/calendars/users/user01/calendar/") newset = caldavxml.CalendarFreeBusySet( *[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar/")) yield request._newStoreTransaction.commit() calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy())
def test_free_busy_set_tasks(self): """ Test that calendar-free-busy-set ignores tasks calendar. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(set([str(child) for child in prop.children]), set(("/calendars/__uids__/user01/calendar/", ))) newfbset = set() newfbset.add("/calendars/users/user01/tasks/") newset = caldavxml.CalendarFreeBusySet( *[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(len(prop.children), 0) yield request._newStoreTransaction.commit() calendar = yield request.locateResource( "/calendars/__uids__/user01/tasks/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy())
def test_free_busy_set_different(self): """ Test that calendar-free-busy-set has the correct value and can be reset to the same. """ txn = self.transactionUnderTest() home = (yield txn.calendarHomeWithUID("user01", create=True)) yield home.createCalendarWithName("calendar_new") yield self.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( set([str(child) for child in prop.children]), set(( "/calendars/__uids__/user01/calendar/", "/calendars/__uids__/user01/calendar_new/", ))) calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar_new/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) newfbset = set() newfbset.add("/calendars/users/user01/calendar_new/") newset = caldavxml.CalendarFreeBusySet( *[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar_new/")) yield request._newStoreTransaction.commit() calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar_new/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource( "/calendars/__uids__/user01/calendar/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy())
def test_free_busy_set_invalid_url(self): """ Test that calendar-free-busy-set will generate an error if an invalid value is used. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) oldfbset = set(("/calendar", )) newfbset = set() newfbset.update(oldfbset) newfbset.add("/calendar-broken") newset = caldavxml.CalendarFreeBusySet( *[davxml.HRef(url) for url in newfbset]) self.failUnlessFailure(inbox.writeProperty(newset, request), HTTPError)
def updateFreeBusySet(value, directory): try: value = zlib.decompress(value) except zlib.error: # Legacy data - not zlib compressed pass try: doc = element.WebDAVDocument.fromString(value) freeBusySet = doc.root_element except ValueError: try: freeBusySet = unpickle(value) except UnpicklingError: log.error("Invalid free/busy property value") returnValue(None) fbset = set() didUpdate = False for href in freeBusySet.children: href = str(href) newHref = yield updateFreeBusyHref(href, directory) if newHref is None: fbset.add(href) else: didUpdate = True if newHref != "": fbset.add(newHref) if didUpdate: property = caldavxml.CalendarFreeBusySet( *[element.HRef(fbhref) for fbhref in fbset] ) value = compress(property.toxml()) returnValue(value) returnValue(None) # no update required
def test_CalendarTranspProperty(self): request = self.oneRequest("/calendars/users/wsanchez/calendar/") # Get calendar first calendar = ( yield request.locateResource("/calendars/users/wsanchez/calendar/")) if calendar is None: self.fail("Incorrect response to GET on existent calendar.") inbox = (yield request.locateResource("/calendars/users/wsanchez/inbox/")) if inbox is None: self.fail("Incorrect response to GET on existent inbox.") # Provisioned calendar has default opaque property transp = (yield calendar.hasProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertTrue(transp) transp = (yield calendar.readProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertEqual(transp, caldavxml.ScheduleCalendarTransp(caldavxml.Opaque())) # Inbox property lists the default calendar fbset = (yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request)) self.assertTrue(fbset) fbset = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( fbset, caldavxml.CalendarFreeBusySet( davxml.HRef.fromString( "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar/" ), )) # Now remove the property to simulate the old calendar server state with # a calendar listed in the fbset yield calendar._newStoreObject.setUsedForFreeBusy(False) fbset = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(fbset, caldavxml.CalendarFreeBusySet()) # Calendar has opaque property derived from inbox transp = (yield calendar.hasProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertTrue(transp) transp = (yield calendar.readProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertEqual( transp, caldavxml.ScheduleCalendarTransp(caldavxml.Transparent())) # Force trailing slash on fbset yield inbox.writeProperty( caldavxml.CalendarFreeBusySet( davxml.HRef.fromString( "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar/" ), ), request) # Now remove the dead property to simulate the old calendar server state with # a calendar listed in the fbset fbset = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( fbset, caldavxml.CalendarFreeBusySet( davxml.HRef.fromString( "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar/" ), )) # Calendar has opaque property derived from inbox transp = (yield calendar.hasProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertTrue(transp) transp = (yield calendar.readProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertEqual(transp, caldavxml.ScheduleCalendarTransp(caldavxml.Opaque()))