diff --git a/twistedcaldav/test/test_upgrade.py b/twistedcaldav/test/test_upgrade.py index 9c469a9ea..7e735a077 100644 --- a/twistedcaldav/test/test_upgrade.py +++ b/twistedcaldav/test/test_upgrade.py @@ -14,27 +14,30 @@ # limitations under the License. ## -import cPickle -import hashlib -import os -import zlib from twisted.internet.defer import inlineCallbacks, succeed from twisted.python.filepath import FilePath +from twisted.python.reflect import namedClass + from twistedcaldav.config import config from twistedcaldav.directory.calendaruserproxy import ProxySqliteDB +from twistedcaldav.directory.resourceinfo import ResourceInfoDatabase from twistedcaldav.test.util import StoreTestCase -from twistedcaldav.upgrade import ( - xattrname, upgradeData, updateFreeBusySet, - removeIllegalCharacters, normalizeCUAddrs, - loadDelegatesFromXMLintoProxyDB, migrateDelegatesToStore, - upgradeResourcesXML, upgradeAugmentsXML -) +from twistedcaldav.upgrade import xattrname, upgradeData, updateFreeBusySet, \ + removeIllegalCharacters, normalizeCUAddrs, \ + loadDelegatesFromXMLintoProxyDB, migrateDelegatesToStore, \ + upgradeResourcesXML, upgradeAugmentsXML, migrateAutoSchedule + from txdav.caldav.datastore.index_file import db_basename from txdav.caldav.datastore.scheduling.imip.mailgateway import MailGatewayTokensDatabase from txdav.who.delegates import Delegates from txdav.xml.parser import WebDAVDocument +import cPickle +import hashlib +import os +import zlib + freeBusyAttr = xattrname( @@ -1505,6 +1508,50 @@ def test_migrateDelegates(self): sqliteProxyService.close() + @inlineCallbacks + def test_migrateAutoSchedule(self): + + serviceClass = { + "xml": "twistedcaldav.directory.augment.AugmentXMLDB", + } + augmentClass = namedClass(serviceClass[config.AugmentService.type]) + + # Auto-schedule not currently set + augmentService = augmentClass(**config.AugmentService.params) + augmentRecord = ( + yield augmentService.getAugmentRecord( + "mercury", + "locations" + ) + ) + self.assertEqual(augmentRecord.autoScheduleMode, "default") + + # Create bogus record in resourceinfo db + resourceInfoDatabase = ResourceInfoDatabase(config.DataRoot) + resourceInfoDatabase._db_execute( + "insert into RESOURCEINFO (GUID, AUTOSCHEDULE) values (:1, :2)", + "mercury", 1, + ) + resourceInfoDatabase._db_execute( + "insert into RESOURCEINFO (GUID, AUTOSCHEDULE) values (:1, :2)", + None, 1, + ) + resourceInfoDatabase._db_commit() + + # Migrate auto-schedule from sqlite into directory + yield migrateAutoSchedule(config, self.directory) + + # Auto-schedule now set + augmentService = augmentClass(**config.AugmentService.params) + augmentRecord = ( + yield augmentService.getAugmentRecord( + "mercury", + "locations" + ) + ) + self.assertEqual(augmentRecord.autoScheduleMode, "automatic") + + def test_resourcesXML(self): """ Verify conversion of old resources.xml format to twext.who.xml format diff --git a/twistedcaldav/upgrade.py b/twistedcaldav/upgrade.py index c02a240a4..965a80e02 100644 --- a/twistedcaldav/upgrade.py +++ b/twistedcaldav/upgrade.py @@ -1011,18 +1011,19 @@ def migrateAutoSchedule(config, directory): "select GUID, AUTOSCHEDULE from RESOURCEINFO" ) for uid, autoSchedule in results: - record = yield directory.recordWithUID(uid) - if record is not None: - augmentRecord = ( - yield augmentService.getAugmentRecord( - uid, - directory.recordTypeToOldName(record.recordType) + if uid is not None: + record = yield directory.recordWithUID(uid) + if record is not None: + augmentRecord = ( + yield augmentService.getAugmentRecord( + uid, + directory.recordTypeToOldName(record.recordType) + ) ) - ) - augmentRecord.autoScheduleMode = ( - "automatic" if autoSchedule else "default" - ) - augmentRecords.append(augmentRecord) + augmentRecord.autoScheduleMode = ( + "automatic" if autoSchedule else "default" + ) + augmentRecords.append(augmentRecord) if augmentRecords: yield augmentService.addAugmentRecords(augmentRecords)