[CalendarServer-changes] [7380] CalendarServer/branches/users/sagen/inboxitems

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 28 13:56:36 PDT 2011


Revision: 7380
          http://trac.macosforge.org/projects/calendarserver/changeset/7380
Author:   sagen at apple.com
Date:     2011-04-28 13:56:36 -0700 (Thu, 28 Apr 2011)
Log Message:
-----------
Branch for processing Leopard->Lion inbox items

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/inboxitems/calendarserver/tap/caldav.py
    CalendarServer/branches/users/sagen/inboxitems/twisted/plugins/caldav.py
    CalendarServer/branches/users/sagen/inboxitems/twistedcaldav/upgrade.py

Modified: CalendarServer/branches/users/sagen/inboxitems/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/branches/users/sagen/inboxitems/calendarserver/tap/caldav.py	2011-04-28 20:54:25 UTC (rev 7379)
+++ CalendarServer/branches/users/sagen/inboxitems/calendarserver/tap/caldav.py	2011-04-28 20:56:36 UTC (rev 7380)
@@ -69,7 +69,7 @@
 from twistedcaldav.mail import IMIPReplyInboxResource
 from twistedcaldav import memcachepool
 from twistedcaldav.stdconfig import DEFAULT_CONFIG, DEFAULT_CONFIG_FILE
-from twistedcaldav.upgrade import UpgradeFileSystemFormatService
+from twistedcaldav.upgrade import UpgradeFileSystemFormatService, PostDBImportService
 
 from calendarserver.tap.util import pgServiceFromConfig
 
@@ -506,27 +506,8 @@
             self.monitor.addProcess("mailgateway", mailGatewayArgv,
                                env=PARENT_ENVIRONMENT)
 
-        self.maker.log_info("Adding task service")
-        taskArgv = [
-            sys.executable,
-            sys.argv[0],
-        ]
-        if config.UserName:
-            taskArgv.extend(("-u", config.UserName))
-        if config.GroupName:
-            taskArgv.extend(("-g", config.GroupName))
-        taskArgv.extend((
-            "--reactor=%s" % (config.Twisted.reactor,),
-            "-n", "caldav_task",
-            "-f", self.configPath,
-        ))
 
-        self.monitor.addProcess(
-            "caldav_task", taskArgv, env=PARENT_ENVIRONMENT
-        )
 
-
-
 class CalDAVServiceMaker (LoggingMixIn):
     implements(IPlugin, IServiceMaker)
 
@@ -982,7 +963,8 @@
             mainService = createMainService(cp, store)
             upgradeSvc = UpgradeFileSystemFormatService(config,
                 UpgradeToDatabaseService.wrapService(
-                    CachingFilePath(config.DocumentRoot), mainService,
+                    CachingFilePath(config.DocumentRoot),
+                    PostDBImportService(config, store, mainService),
                     store, uid=uid, gid=gid
                 )
             )

Modified: CalendarServer/branches/users/sagen/inboxitems/twisted/plugins/caldav.py
===================================================================
--- CalendarServer/branches/users/sagen/inboxitems/twisted/plugins/caldav.py	2011-04-28 20:54:25 UTC (rev 7379)
+++ CalendarServer/branches/users/sagen/inboxitems/twisted/plugins/caldav.py	2011-04-28 20:56:36 UTC (rev 7380)
@@ -50,6 +50,5 @@
 
 
 TwistedCalDAV     = TAP("calendarserver.tap.caldav.CalDAVServiceMaker")
-CalDAVTask        = TAP("calendarserver.sidecar.task.CalDAVTaskServiceMaker")
 CalDAVNotifier    = TAP("twistedcaldav.notify.NotificationServiceMaker")
 CalDAVMailGateway = TAP("twistedcaldav.mail.MailGatewayServiceMaker")

Modified: CalendarServer/branches/users/sagen/inboxitems/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/branches/users/sagen/inboxitems/twistedcaldav/upgrade.py	2011-04-28 20:54:25 UTC (rev 7379)
+++ CalendarServer/branches/users/sagen/inboxitems/twistedcaldav/upgrade.py	2011-04-28 20:56:36 UTC (rev 7380)
@@ -33,15 +33,22 @@
 from twistedcaldav.mail import MailGatewayTokensDatabase
 from twistedcaldav.ical import Component
 from twistedcaldav import caldavxml
+from twistedcaldav.ical import Component
+from twistedcaldav.scheduling.cuaddress import LocalCalendarUser
+from twistedcaldav.scheduling.scheduler import DirectScheduler
 
+
 from twisted.application.service import Service
 from twisted.internet import reactor
 from twisted.internet.defer import inlineCallbacks, succeed
 
 from txdav.caldav.datastore.index_file import db_basename
 
+from calendarserver.tap.util import getRootResource, FakeRequest
+
 from calendarserver.tools.util import getDirectory
 from calendarserver.tools.resources import migrateResources
+
 from twisted.python.reflect import namedAny
 
 deadPropertyXattrPrefix = namedAny(
@@ -807,3 +814,125 @@
 
 
 
+class PostDBImportService(Service, object):
+
+    def __init__(self, config, store, service):
+        self.wrappedService = service
+        self.store = store
+        self.config = config
+
+    def startService(self):
+        self.processInboxItems()
+
+
+    @inlineCallbacks
+    def processInboxItems(self):
+
+        inboxItemsList = os.path.join(self.config.DataRoot, "tasks", "incoming",
+            "scheduleinboxes.task")
+        if os.path.exists(inboxItemsList):
+
+            root = getRootResource(self.config, self.store)
+            directory = root.getDirectory()
+            principalCollection = directory.principalCollection
+
+            inboxItems = set()
+            with open(inboxItemsList) as input:
+                for inboxItem in input:
+                    inboxItem = inboxItem.strip()
+                    inboxItems.add(inboxItem)
+
+            try:
+                for inboxItem in list(inboxItems):
+                    log.info("Processing inbox item: %s" % (inboxItem,))
+                    ignore, uuid, ignore, fileName = inboxItem.rsplit("/", 3)
+
+                    record = directory.recordWithUID(uuid)
+                    if not record:
+                        continue
+
+                    principal = principalCollection.principalForRecord(record)
+                    if not principal:
+                        continue
+
+                    request = FakeRequest(root, "PUT", None)
+                    request.checkedSACL = True
+                    request.authnUser = request.authzUser = davxml.Principal(
+                        davxml.HRef.fromString("/principals/__uids__/%s/" % (uuid,))
+                    )
+
+                    calendarHome = yield principal.calendarHome(request)
+                    if not calendarHome:
+                        continue
+
+                    inbox = yield calendarHome.getChild("inbox")
+                    if inbox and inbox.exists():
+
+                        inboxItemResource = yield inbox.getChild(fileName)
+                        if inboxItemResource and inboxItemResource.exists():
+
+                            uri = "/calendars/__uids__/%s/inbox/%s" % (uuid, fileName)
+                            request.path = uri
+                            request._rememberResource(inboxItemResource, uri)
+
+                            yield self.processInboxItem(
+                                root,
+                                directory,
+                                principal,
+                                request,
+                                inbox,
+                                inboxItemResource,
+                                uuid,
+                                uri
+                            )
+                inboxItems.remove(inboxItem)
+
+            finally:
+                # Rewrite the task file in case we exit before we're done
+                with open(inboxItemsList + ".tmp", "w") as output:
+                    for inboxItem in inboxItems:
+                        output.write("%s\n" % (inboxItem,))
+                os.rename(inboxItemsList + ".tmp", inboxItemsList)
+
+        os.remove(inboxItemsList)
+        reactor.callLater(0, self.wrappedService.setServiceParent, self.parent)
+
+
+    @inlineCallbacks
+    def processInboxItem(self, root, directory, principal, request, inbox,
+            inboxItem, uuid, uri):
+        log.debug("Processing inbox item %s" % (inboxItem,))
+
+        ownerPrincipal = principal
+        cua = "urn:uuid:%s" % (uuid,)
+        owner = LocalCalendarUser(cua, ownerPrincipal,
+            inbox, ownerPrincipal.scheduleInboxURL())
+
+        data = yield inboxItem.iCalendarText()
+        calendar = Component.fromString(data)
+        try:
+            method = calendar.propertyValue("METHOD")
+        except ValueError:
+            returnValue(None)
+
+        if method == "REPLY":
+            # originator is attendee sending reply
+            originator = calendar.getAttendees()[0]
+        else:
+            # originator is the organizer
+            originator = calendar.getOrganizer()
+
+        principalCollection = directory.principalCollection
+        originatorPrincipal = principalCollection.principalForCalendarUserAddress(originator)
+        originator = LocalCalendarUser(originator, originatorPrincipal)
+        recipients = (owner,)
+
+        txn = request._newStoreTransaction
+
+        scheduler = DirectScheduler(request, inboxItem)
+        yield scheduler.doSchedulingViaPUT(originator, recipients, calendar,
+            internal_request=False)
+        yield inboxItem.storeRemove(request, True, uri)
+
+        yield txn.commit()
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110428/22b67e39/attachment-0001.html>


More information about the calendarserver-changes mailing list