[CalendarServer-changes] [4391] CalendarServer/branches/users/sagen/pending-invites-4389

source_changes at macosforge.org source_changes at macosforge.org
Mon Jun 29 15:44:20 PDT 2009


Revision: 4391
          http://trac.macosforge.org/projects/calendarserver/changeset/4391
Author:   sagen at apple.com
Date:     2009-06-29 15:44:20 -0700 (Mon, 29 Jun 2009)
Log Message:
-----------
Work in progress towards pending invites

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/pending-invites-4389/calendarserver/tap/caldav.py
    CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/config.py
    CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/directory/test/accounts.xml
    CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/scheduling/scheduler.py
    CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/test/test_upgrade.py
    CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/upgrade.py

Modified: CalendarServer/branches/users/sagen/pending-invites-4389/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/calendarserver/tap/caldav.py	2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/calendarserver/tap/caldav.py	2009-06-29 22:44:20 UTC (rev 4391)
@@ -39,7 +39,8 @@
 from twisted.python.usage import Options, UsageError
 from twisted.python.reflect import namedClass
 from twisted.plugin import IPlugin
-from twisted.internet.reactor import callLater
+from twisted.internet.defer import Deferred, inlineCallbacks
+from twisted.internet.reactor import callLater, addSystemEventTrigger
 from twisted.internet.process import ProcessExitedAlready
 from twisted.internet.protocol import Protocol, Factory
 from twisted.internet.address import IPv4Address
@@ -360,17 +361,21 @@
 
             if config.ProcessType in ('Combined', 'Single'):
 
-                # Process localization string files
-                processLocalizationFiles(config.Localization)
+                @inlineCallbacks
+                def beforeStartup():
+                    # Process localization string files
+                    processLocalizationFiles(config.Localization)
 
-                # Now do any on disk upgrades we might need.
-                # Memcache isn't running at this point, so temporarily change
-                # the config so nobody tries to talk to it while upgrading
-                memcacheSetting = config.Memcached.ClientEnabled
-                config.Memcached.ClientEnabled = False
-                upgradeData(config)
-                config.Memcached.ClientEnabled = memcacheSetting
+                    # Now do any on disk upgrades we might need.
+                    # Memcache isn't running at this point, so temporarily
+                    # change the config so nobody tries to talk to it while
+                    # upgrading
+                    memcacheSetting = config.Memcached.ClientEnabled
+                    config.Memcached.ClientEnabled = False
+                    yield upgradeData(config)
+                    config.Memcached.ClientEnabled = memcacheSetting
 
+                addSystemEventTrigger('before', 'startup', beforeStartup)
 
             service = serviceMethod(options)
 
@@ -1281,20 +1286,9 @@
             )
 
         self.active = 1
-        delay = 0
 
-        if config.MultiProcess.StaggeredStartup.Enabled:
-            delay_interval = config.MultiProcess.StaggeredStartup.Interval
-        else:
-            delay_interval = 0
-
         for name in self.processes.keys():
-            if name.startswith("caldav"):
-                when = delay
-                delay += delay_interval
-            else:
-                when = 0
-            callLater(when, self.startProcess, name)
+            addSystemEventTrigger('after', 'startup', self.startProcess, name)
 
         self.consistency = callLater(
             self.consistencyDelay,

Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/config.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/config.py	2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/config.py	2009-06-29 22:44:20 UTC (rev 4391)
@@ -224,10 +224,6 @@
             "Enabled": True,
             "Scheduler": "LeastConnections",
         },
-        "StaggeredStartup": {
-            "Enabled": False,
-            "Interval": 15,
-        },
     },
 
     #

Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/directory/test/accounts.xml
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/directory/test/accounts.xml	2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/directory/test/accounts.xml	2009-06-29 22:44:20 UTC (rev 4391)
@@ -58,6 +58,14 @@
     <cuaddr>mailto:dreid at example.com</cuaddr>
   </user>
   <user>
+    <uid>sagen</uid>
+    <guid>64230DAD-0BDE-4508-8C77-15F0CA5C8DD1</guid>
+    <password>negas</password>
+    <name>Morgen Sagen</name>
+    <email-address>sagen at example.com</email-address>
+    <cuaddr>mailto:sagen at example.com</cuaddr>
+  </user>
+  <user>
     <uid>nocalendar</uid>
     <guid>543D28BA-F74F-4D5F-9243-B3E3A61171E5</guid>
     <password>radnelacon</password>

Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/scheduling/scheduler.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/scheduling/scheduler.py	2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/scheduling/scheduler.py	2009-06-29 22:44:20 UTC (rev 4391)
@@ -55,6 +55,7 @@
     "CalDAVScheduler",
     "IScheduleScheduler",
     "IMIPScheduler",
+    "DirectScheduler",
 ]
 
 
@@ -386,7 +387,7 @@
             # Now process iMIP recipients
             if imip_recipients:
                 yield self.generateIMIPSchedulingResponses(imip_recipients, responses, freebusy)
-    
+
         # Return with final response if we are done
         returnValue(responses)
     
@@ -789,6 +790,31 @@
             log.err(msg)
             raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "valid-calendar-data"), description=msg))
 
+
+class DirectScheduler(Scheduler):
+
+    def checkAuthorization(self):
+        pass
+
+    def checkOrganizer(self):
+        pass
+
+    def checkOrganizerAsOriginator(self):
+        pass
+
+    def checkAttendeeAsOriginator(self):
+        pass
+
+    def securityChecks(self):
+        pass
+
+    def checkOriginator(self):
+        pass
+
+    def checkRecipients(self):
+        pass
+
+
 class IMIPScheduler(Scheduler):
 
     def checkAuthorization(self):

Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/test/test_upgrade.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/test/test_upgrade.py	2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/test/test_upgrade.py	2009-06-29 22:44:20 UTC (rev 4391)
@@ -23,6 +23,7 @@
 from twistedcaldav.test.util import TestCase
 from calendarserver.tools.util import getDirectory
 from twisted.web2.dav import davxml
+from twisted.internet.defer import inlineCallbacks
 
 import hashlib
 import os, zlib, cPickle
@@ -112,6 +113,7 @@
         proxyDB = CalendarUserProxyDatabase(self.existingdataroot)
         proxyDB._db()
 
+    @inlineCallbacks
     def test_normalUpgrade(self):
         """
         Test the behavior of normal upgrade from old server to new.
@@ -129,13 +131,14 @@
         self.assertTrue(os.path.exists(os.path.join(config.DocumentRoot, "principals", CalendarUserProxyDatabase.dbOldFilename)))
         self.assertFalse(os.path.exists(os.path.join(config.DataRoot, CalendarUserProxyDatabase.dbFilename)))
 
-        upgradeData(config)
+        yield upgradeData(config)
         
         # Check post-conditions
         self.assertFalse(os.path.exists(os.path.join(config.DocumentRoot, "principals",)))
         self.assertTrue(os.path.exists(os.path.join(config.DataRoot, CalendarUserProxyDatabase.dbFilename)))
 
 
+    @inlineCallbacks
     def test_noUpgrade(self):
         """
         Test the behavior of running on a new server (i.e. no upgrade needed).
@@ -150,13 +153,14 @@
         self.assertFalse(os.path.exists(os.path.join(config.DocumentRoot, "principals")))
         self.assertTrue(os.path.exists(os.path.join(config.DataRoot, CalendarUserProxyDatabase.dbFilename)))
 
-        upgradeData(config)
+        yield upgradeData(config)
         
         # Check post-conditions
         self.assertFalse(os.path.exists(os.path.join(config.DocumentRoot, "principals",)))
         self.assertTrue(os.path.exists(os.path.join(config.DataRoot, CalendarUserProxyDatabase.dbFilename)))
 
 
+    @inlineCallbacks
     def test_freeBusyUpgrade(self):
         """
         Test the updating of calendar-free-busy-set xattrs on inboxes
@@ -220,7 +224,7 @@
         value = "<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/users/nonexistent/calendar</href>\r\n</calendar-free-busy-set>\r\n"
         self.assertRaises(UpgradeError, updateFreeBusySet, value, directory)
 
-
+    @inlineCallbacks
     def test_calendarsUpgradeWithTypes(self):
         """
         Verify that calendar homes in the /calendars/<type>/<shortname>/ form
@@ -354,13 +358,14 @@
         config.DocumentRoot = root
         config.DataRoot = root
 
-        upgradeData(config)
+        yield upgradeData(config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
         # Ensure that repeating the process doesn't change anything
-        upgradeData(config)
+        yield upgradeData(config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
+    @inlineCallbacks
     def test_calendarsUpgradeWithUIDs(self):
         """
         Verify that calendar homes in the /calendars/__uids__/<guid>/ form
@@ -462,13 +467,14 @@
         config.DocumentRoot = root
         config.DataRoot = root
 
-        upgradeData(config)
+        yield upgradeData(config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
         # Ensure that repeating the process doesn't change anything
-        upgradeData(config)
+        yield upgradeData(config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
+    @inlineCallbacks
     def test_calendarsUpgradeWithUIDsMultilevel(self):
         """
         Verify that calendar homes in the /calendars/__uids__/XX/YY/<guid>/
@@ -586,14 +592,15 @@
         config.DocumentRoot = root
         config.DataRoot = root
 
-        upgradeData(config)
+        yield upgradeData(config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
         # Ensure that repeating the process doesn't change anything
-        upgradeData(config)
+        yield upgradeData(config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
 
+    @inlineCallbacks
     def test_calendarsUpgradeWithNoChange(self):
         """
         Verify that calendar homes in the /calendars/__uids__/XX/YY/<guid>/
@@ -711,12 +718,13 @@
         config.DocumentRoot = root
         config.DataRoot = root
 
-        upgradeData(config)
+        yield upgradeData(config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
 
 
 
+    @inlineCallbacks
     def test_calendarsUpgradeWithError(self):
         """
         Verify that a problem with one resource doesn't stop the process, but
@@ -810,8 +818,149 @@
         self.assertRaises(UpgradeError, upgradeData, config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
+
+
+    @inlineCallbacks
+    def test_pendingInvitesUpgrade(self):
+        """
+        Verify that pending invites (sitting in inboxes) are processed by
+        the implicit scheduler during upgrade
+        """
+
+        self.setUpXMLDirectory()
+        directory = getDirectory()
+
+        before = {
+            "calendars" :
+            {
+                "__uids__" :
+                {
+                    "64" :
+                    {
+                        "23" :
+                        {
+                            "6423F94A-6B76-4A3A-815B-D52CFD77935D" :
+                            {
+                                "calendar" :
+                                { },
+                                "inbox" :
+                                {
+                                    "b12d602b9f43b53fa4de27d3dea86fcd.ics" :
+                                    {
+                                        "@contents" : event03_inbox,
+                                    },
+                                    "@xattrs" :
+                                    {
+                                        freeBusyAttr : zlib.compress("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar/</href>\r\n</calendar-free-busy-set>\r\n"),
+                                    },
+                                },
+                            },
+                            "64230DAD-0BDE-4508-8C77-15F0CA5C8DD1" :
+                            {
+                                "calendar" :
+                                {
+                                    "F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6.ics" :
+                                    {
+                                        "@contents" : event03_orig,
+                                    },
+                                },
+                                "inbox" :
+                                {
+                                    "@xattrs" :
+                                    {
+                                        freeBusyAttr : zlib.compress("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/__uids__/64230DAD-0BDE-4508-8C77-15F0CA5C8DD1/calendar/</href>\r\n</calendar-free-busy-set>\r\n"),
+                                    },
+                                },
+                            },
+                        },
+                    },
+                },
+            },
+            CalendarUserProxyDatabase.dbFilename :
+            {
+                "@contents" : "",
+            }
+        }
+
+
+        after = {
+            "calendars" :
+            {
+                "__uids__" :
+                {
+                    "64" :
+                    {
+                        "23" :
+                        {
+                            "6423F94A-6B76-4A3A-815B-D52CFD77935E" :
+                            {
+                                "calendar" :
+                                {
+                                    "F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6.ics" :
+                                    {
+                                        "@contents" : event03_orig,
+                                    },
+                                },
+                                "inbox" :
+                                {
+                                    "b12d602b9f43b53fa4de27d3dea86fcd.ics" :
+                                    {
+                                        "@contents" : event03_inbox,
+                                    },
+                                    "@xattrs" :
+                                    {
+                                        freeBusyAttr : zlib.compress("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar/</href>\r\n</calendar-free-busy-set>\r\n"),
+                                    },
+                                },
+                            },
+                            "64230DAD-0BDE-4508-8C77-15F0CA5C8DD1" :
+                            {
+                                "calendar" :
+                                {
+                                    "F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6.ics" :
+                                    {
+                                        "@contents" : event03_orig,
+                                    },
+                                },
+                                "inbox" :
+                                {
+                                    "@xattrs" :
+                                    {
+                                        freeBusyAttr : zlib.compress("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/__uids__/64230DAD-0BDE-4508-8C77-15F0CA5C8DD1/calendar/</href>\r\n</calendar-free-busy-set>\r\n"),
+                                    },
+                                },
+                            },
+                        },
+                    },
+                },
+            },
+            CalendarUserProxyDatabase.dbFilename :
+            {
+                "@contents" : None,
+            },
+            MailGatewayTokensDatabase.dbFilename :
+            {
+                "@contents" : None,
+            },
+            ResourceInfoDatabase.dbFilename :
+            {
+                "@contents" : None,
+            }
+        }
+
+
+        root = self.createHierarchy(before)
+
+        config.DocumentRoot = root
+        config.DataRoot = root
+
+        yield upgradeData(config)
+
+        self.assertTrue(self.verifyHierarchy(root, after))
+
+
+    @inlineCallbacks
     def test_migrateResourceInfo(self):
-        # Fake getResourceInfo( )
 
         assignments = {
             'guid1' : (False, None, None),
@@ -853,7 +1002,7 @@
         config.DocumentRoot = root
         config.DataRoot = root
 
-        upgradeData(config)
+        yield upgradeData(config)
         self.assertTrue(self.verifyHierarchy(root, after))
 
         calendarUserProxyDatabase = CalendarUserProxyDatabase(root)
@@ -967,6 +1116,90 @@
 
 event01_after_md5 = hashlib.md5(event01_after).hexdigest()
 
+event03_inbox = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+PRODID:-//Apple Inc.//iCal 3.0//EN
+BEGIN:VTIMEZONE
+TZID:US/Pacific
+BEGIN:STANDARD
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+TZNAME:PST
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+TZNAME:PDT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6
+DTSTART;TZID=US/Pacific:20090907T160000
+DTEND;TZID=US/Pacific:20090907T180000
+ATTENDEE;CN=Wilfredo Sanchez;CUTYPE=INDIVIDUAL;EMAIL=wsanchez at example.com;
+ PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:uuid:6423F94A-6B7
+ 6-4A3A-815B-D52CFD77935D
+ATTENDEE;CN=Morgen Sagen;EMAIL=sagen at example.com;PARTSTAT=ACCEPTED:urn:uui
+ d:64230DAD-0BDE-4508-8C77-15F0CA5C8DD1
+CREATED:20090514T215838Z
+DTSTAMP:20090514T215856Z
+ORGANIZER;CN=Morgen Sagen;EMAIL=sagen at example.com:urn:uuid:64230DAD-0BDE-4
+ 508-8C77-15F0CA5C8DD1
+SEQUENCE:9
+SUMMARY:Pending Invitation
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+""".replace("\n", "\r\n")
+
+event03_orig = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//Apple Inc.//iCal 3.0//EN
+BEGIN:VTIMEZONE
+TZID:US/Pacific
+BEGIN:STANDARD
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+TZNAME:PST
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+TZNAME:PDT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:F18BA9DA-B1BA-4C94-9CB7-7E5BB7E30AE6
+DTSTART;TZID=US/Pacific:20090907T160000
+DTEND;TZID=US/Pacific:20090907T180000
+ATTENDEE;CN=Wilfredo Sanchez;CUTYPE=INDIVIDUAL;EMAIL=wsanchez at example.com;
+ PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:uuid:6423F94A-6B7
+ 6-4A3A-815B-D52CFD77935D
+ATTENDEE;CN=Morgen Sagen;EMAIL=sagen at example.com;PARTSTAT=ACCEPTED:urn:uui
+ d:64230DAD-0BDE-4508-8C77-15F0CA5C8DD1
+CREATED:20090514T215838Z
+DTSTAMP:20090514T215856Z
+ORGANIZER;CN=Morgen Sagen;EMAIL=sagen at example.com:urn:uuid:64230DAD-0BDE-4
+ 508-8C77-15F0CA5C8DD1
+SEQUENCE:9
+SUMMARY:Pending Invitation
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+""".replace("\n", "\r\n")
+
+
 def isValidCTag(value):
     """
     Since ctag is generated from datetime.now(), let's make sure that at

Modified: CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/upgrade.py	2009-06-29 22:43:02 UTC (rev 4390)
+++ CalendarServer/branches/users/sagen/pending-invites-4389/twistedcaldav/upgrade.py	2009-06-29 22:44:20 UTC (rev 4391)
@@ -18,6 +18,7 @@
 
 from twisted.web2.dav.fileop import rmdir
 from twisted.web2.dav import davxml
+from twisted.internet.defer import inlineCallbacks, returnValue
 from twistedcaldav.directory.directory import DirectoryService
 from twistedcaldav.directory.calendaruserproxy import CalendarUserProxyDatabase
 from twistedcaldav.directory.resourceinfo import ResourceInfoDatabase
@@ -25,8 +26,10 @@
 from twistedcaldav.log import Logger
 from twistedcaldav.ical import Component
 from twistedcaldav import caldavxml
+from twistedcaldav.scheduling.cuaddress import LocalCalendarUser
+from twistedcaldav.scheduling.scheduler import DirectScheduler
 from calendarserver.tools.util import getDirectory
-import xattr, os, zlib, hashlib, datetime, pwd, grp, shutil
+import xattr, os, zlib, hashlib, datetime, pwd, grp
 from zlib import compress
 from cPickle import loads as unpickle, UnpicklingError
 
@@ -58,6 +61,7 @@
 # Upconverts data from any calendar server version prior to data format 1
 #
 
+ at inlineCallbacks
 def upgrade_to_1(config):
 
     errorOccurred = False
@@ -197,7 +201,46 @@
 
         return errorOccurred
 
+    class fakeRequest(object):
+        pass
 
+    class fakeResource(object):
+        pass
+
+    @inlineCallbacks
+    def processInbox(inboxPath, uuid, directory):
+
+        for ics in os.listdir(inboxPath):
+
+            cua = "urn:uuid:%s" % (uuid,)
+            ownerPrincipal = directory.principalForCalendarUserAddress(cua)
+            owner = LocalCalendarUser(cua, ownerPrincipal)
+
+            icsPath = os.path.join(inboxPath, ics)
+            log.debug("Processing inbox item: %s" % (icsPath,))
+            with open(icsPath) as icsFile:
+                data = icsFile.read()
+                calendar = Component.fromString(data)
+
+                try:
+                    method = calendar.propertyValue("METHOD")
+                except ValueError:
+                    returnValue(None)
+
+                if method == "REPLY":
+                    # originator is attendee sending reply
+                    originator = calendar.getAttendees()
+                else:
+                    # originator is the organizer
+                    originator = calendar.getOrganizer()
+
+            recipients = (owner,)
+            scheduler = DirectScheduler(fakeRequest(), fakeResource())
+            result = (yield scheduler.doSchedulingViaPUT(originator, recipients,
+                calendar, internal_request=False))
+
+        returnValue(None)
+
     def doProxyDatabaseMoveUpgrade(config, uid=-1, gid=-1):
 
         # See if the new one is already present
@@ -391,6 +434,23 @@
 
                 log.warn("Done processing calendar homes")
 
+
+            # Process pending invitations
+            for first in os.listdir(uidHomes):
+                if len(first) == 2:
+                    firstPath = os.path.join(uidHomes, first)
+                    for second in os.listdir(firstPath):
+                        if len(second) == 2:
+                            secondPath = os.path.join(firstPath, second)
+                            for home in os.listdir(secondPath):
+                                homePath = os.path.join(secondPath, home)
+                                inboxPath = os.path.join(homePath, "inbox")
+                                if os.path.exists(inboxPath):
+                                    yield processInbox(inboxPath,
+                                        home, directory)
+
+
+
     migrateResourceInfo(config, directory, uid, gid)
     createMailTokensDatabase(config, uid, gid)
 
@@ -406,6 +466,7 @@
     (1, upgrade_to_1),
 ]
 
+ at inlineCallbacks
 def upgradeData(config):
 
     docRoot = config.DocumentRoot
@@ -426,13 +487,15 @@
 
     uid, gid = getCalendarServerIDs(config)
 
+    log.warn("UpgradeData: calendar data is at version %d" % (onDiskVersion,))
     for version, method in upgradeMethods:
         if onDiskVersion < version:
-            log.warn("Upgrading to version %d" % (version,))
-            method(config)
+            log.warn("UpgradeData: upgrading to version %d" % (version,))
+            yield method(config)
             with open(versionFilePath, "w") as verFile:
                 verFile.write(str(version))
             os.chown(versionFilePath, uid, gid)
+    log.warn("UpgradeData: complete")
 
 
 class UpgradeError(RuntimeError):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090629/72f2b571/attachment-0001.html>


More information about the calendarserver-changes mailing list