[CalendarServer-changes] [4542] CalendarServer/branches/users/wsanchez/deployment
source_changes at macosforge.org
source_changes at macosforge.org
Tue Sep 15 16:24:29 PDT 2009
Revision: 4542
http://trac.macosforge.org/projects/calendarserver/changeset/4542
Author: wsanchez at apple.com
Date: 2009-09-15 16:24:25 -0700 (Tue, 15 Sep 2009)
Log Message:
-----------
Move export tool
Added Paths:
-----------
CalendarServer/branches/users/wsanchez/deployment/bin/caldav_export
Removed Paths:
-------------
CalendarServer/branches/users/wsanchez/deployment/ist-tools/export.py
Copied: CalendarServer/branches/users/wsanchez/deployment/bin/caldav_export (from rev 4541, CalendarServer/branches/users/wsanchez/deployment/ist-tools/export.py)
===================================================================
--- CalendarServer/branches/users/wsanchez/deployment/bin/caldav_export (rev 0)
+++ CalendarServer/branches/users/wsanchez/deployment/bin/caldav_export 2009-09-15 23:24:25 UTC (rev 4542)
@@ -0,0 +1,283 @@
+#!/usr/bin/env python
+
+##
+# Copyright (c) 2006-2007 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+import os
+import sys
+from getopt import getopt, GetoptError
+from os.path import dirname, abspath
+
+from twisted.python.reflect import namedClass
+from twistedcaldav.ical import Component as iComponent, Property as iProperty
+from twistedcaldav.ical import iCalendarProductID
+from twistedcaldav.resource import isCalendarCollectionResource
+from twistedcaldav.static import CalDAVFile, CalendarHomeFile
+from twistedcaldav.directory.directory import DirectoryService, DirectoryRecord
+
+class UsageError (StandardError):
+ pass
+
+def usage(e=None):
+ if e:
+ print e
+ print ""
+
+ name = os.path.basename(sys.argv[0])
+ print "usage: %s [options] [input_specifiers]" % (name,)
+ print ""
+ print "Generate an iCalendar file containing the merged content of each calendar"
+ print "collection read."
+ print ""
+ print "options:"
+ print " -h --help: print this help and exit"
+ print " -f --config: Specify caldavd.plist configuration path"
+ print " -o --output: Specify output file path (default: '-', meaning stdout)"
+ print ""
+ print "input specifiers:"
+ print " -c --collection: add a calendar collection"
+ print " -H --home: add a calendar home (and all calendars within it)"
+ print " -r --record: add a directory record's calendar home (format: 'recordType:shortName')"
+ print " -u --user: add a user's calendar home (shorthand for '-r users:shortName')"
+
+ if e:
+ sys.exit(64)
+ else:
+ sys.exit(0)
+
+def main():
+ try:
+ (optargs, args) = getopt(
+ sys.argv[1:], "hf:o:c:H:r:u:", [
+ "config=",
+ "output=",
+ "help",
+ "collection=", "home=", "record=", "user=",
+ ],
+ )
+ except GetoptError, e:
+ usage(e)
+
+ configFileName = None
+ outputFileName = None
+
+ collections = set()
+ calendarHomes = set()
+ records = set()
+
+ def checkExists(resource):
+ if not resource.exists():
+ sys.stderr.write("No such file: %s\n" % (resource.fp.path,))
+ sys.exit(1)
+
+ for opt, arg in optargs:
+ if opt in ("-h", "--help"):
+ usage()
+
+ elif opt in ("-f", "--config"):
+ configFileName = arg
+
+ elif opt in ("-o", "--output"):
+ if arg == "-":
+ outputFileName = None
+ else:
+ outputFileName = arg
+
+ elif opt in ("-c", "--collection"):
+ path = abspath(arg)
+ collection = CalDAVFile(path)
+ checkExists(collection)
+ if not isCalendarCollectionResource(collection):
+ sys.stderr.write("Not a calendar collection: %s\n" % (path,))
+ sys.exit(1)
+ collections.add(collection)
+
+ elif opt in ("-H", "--home"):
+ path = abspath(arg)
+ parent = CalDAVFile(dirname(abspath(path)))
+ calendarHome = CalendarHomeFile(arg, parent, dummyDirectoryRecord())
+ checkExists(calendarHome)
+ calendarHomes.add(calendarHome)
+
+ elif opt in ("-r", "--record"):
+ try:
+ recordType, shortName = arg.split(":", 1)
+ if not recordType or not shortName:
+ raise ValueError()
+ except ValueError:
+ sys.stderr.write("Invalid record identifier: %r\n" % (arg,))
+ sys.exit(1)
+
+ records.add((recordType, shortName))
+
+ elif opt in ("-u", "--user"):
+ records.add((DirectoryService.recordType_users, arg))
+
+ if args:
+ usage("Too many arguments: %s" % (" ".join(args),))
+
+ if records:
+ config = getConfig(configFileName)
+ directory = getDirectory(config)
+
+ for record in records:
+ recordType, shortName = record
+ calendarHome = directory.calendarHomeForShortName(recordType, shortName)
+ if not calendarHome:
+ sys.stderr.write("No calendar home found for record: (%s)%s\n" % (recordType, shortName))
+ sys.exit(1)
+ calendarHomes.add(calendarHome)
+
+ for calendarHome in calendarHomes:
+ for childName in calendarHome.listChildren():
+ child = calendarHome.getChild(childName)
+ if isCalendarCollectionResource(child):
+ collections.add(child)
+
+ try:
+ calendar = iComponent("VCALENDAR")
+ calendar.addProperty(iProperty("VERSION", "2.0"))
+ calendar.addProperty(iProperty("PRODID", iCalendarProductID))
+
+ uids = set()
+ tzids = set()
+
+ for collection in collections:
+ for name, uid, type in collection.index().search(None):
+ child = collection.getChild(name)
+ childData = child.iCalendarText()
+
+ try:
+ childCalendar = iComponent.fromString(childData)
+ except ValueError:
+ continue
+ assert childCalendar.name() == "VCALENDAR"
+
+ if uid in uids:
+ sys.stderr.write("Skipping duplicate event UID %r from %s\n" % (uid, collection.fp.path))
+ continue
+ else:
+ uids.add(uid)
+
+ for component in childCalendar.subcomponents():
+ # Only insert VTIMEZONEs once
+ if component.name() == "VTIMEZONE":
+ tzid = component.propertyValue("TZID")
+ if tzid in tzids:
+ continue
+ else:
+ tzids.add(tzid)
+
+ calendar.addComponent(component)
+
+ calendarData = str(calendar)
+
+ if outputFileName:
+ try:
+ output = open(outputFileName, "w")
+ except IOError, e:
+ sys.stderr.write("Unable to open output file for writing %s: %s\n" % (outputFileName, e))
+ sys.exit(1)
+ else:
+ output = sys.stdout
+
+ output.write(calendarData)
+
+ except UsageError, e:
+ usage(e)
+
+_dummyDirectoryRecord = None
+def dummyDirectoryRecord():
+ global _dummyDirectoryRecord
+ if _dummyDirectoryRecord is None:
+ class DummyDirectoryService (DirectoryService):
+ realmName = ""
+ baseGUID = "51856FD4-5023-4890-94FE-4356C4AAC3E4"
+ def recordTypes(self): return ()
+ def listRecords(self): return ()
+ def recordWithShortName(self): return None
+
+ _dummyDirectoryRecord = DirectoryRecord(
+ service = DummyDirectoryService(),
+ recordType = "dummy",
+ guid = "8EF0892F-7CB6-4B8E-B294-7C5A5321136A",
+ shortName = "dummy",
+ fullName = "Dummy McDummerson",
+ # firstName = "Dummy",
+ # lastName = "McDummerson",
+ # emailAddresses = (),
+ calendarUserAddresses = set(),
+ autoSchedule = False,
+ )
+ return _dummyDirectoryRecord
+
+_config = None
+def getConfig(configFileName):
+ global _config
+ if _config is None:
+ from twistedcaldav.config import config, defaultConfigFile
+
+ if configFileName is None:
+ configFileName = defaultConfigFile
+
+ if not os.path.isfile(configFileName):
+ sys.stderr.write("No config file: %s\n" % (configFileName,))
+ sys.exit(1)
+
+ config.loadConfig(configFileName)
+
+ _config = config
+
+ return _config
+
+_directory = None
+def getDirectory(config):
+ global _directory
+ if _directory is None:
+ BaseDirectoryService = namedClass(config.DirectoryService["type"])
+
+ class MyDirectoryService (BaseDirectoryService):
+ def principalCollection(self):
+ if not hasattr(self, "_principalCollection"):
+ #
+ # Instantiating a CalendarHomeProvisioningResource with a directory
+ # will register it with the directory (still smells like a hack).
+ #
+ # We need that in order to locate calendar homes via the directory.
+ #
+ from twistedcaldav.static import CalendarHomeProvisioningFile
+ CalendarHomeProvisioningFile(os.path.join(config.DocumentRoot, "calendars"), self, "/calendars/")
+
+ from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
+ self._principalCollection = DirectoryPrincipalProvisioningResource("/principals/", self)
+
+ return self._principalCollection
+
+ def calendarHomeForShortName(self, recordType, shortName):
+ principal = self.principalCollection().principalForShortName(recordType, shortName)
+ if principal:
+ #return principal.calendarHome()
+ service = principal.record.service
+ if hasattr(service, "calendarHomesCollection"):
+ return service.calendarHomesCollection.homeForDirectoryRecord(principal.record)
+ return None
+
+ _directory = MyDirectoryService(**config.DirectoryService["params"])
+
+ return _directory
+
+if __name__ == "__main__":
+ main()
Deleted: CalendarServer/branches/users/wsanchez/deployment/ist-tools/export.py
===================================================================
--- CalendarServer/branches/users/wsanchez/deployment/ist-tools/export.py 2009-09-15 21:28:18 UTC (rev 4541)
+++ CalendarServer/branches/users/wsanchez/deployment/ist-tools/export.py 2009-09-15 23:24:25 UTC (rev 4542)
@@ -1,283 +0,0 @@
-#!/usr/bin/env python
-
-##
-# Copyright (c) 2006-2007 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-import os
-import sys
-from getopt import getopt, GetoptError
-from os.path import dirname, abspath
-
-from twisted.python.reflect import namedClass
-from twistedcaldav.ical import Component as iComponent, Property as iProperty
-from twistedcaldav.ical import iCalendarProductID
-from twistedcaldav.resource import isCalendarCollectionResource
-from twistedcaldav.static import CalDAVFile, CalendarHomeFile
-from twistedcaldav.directory.directory import DirectoryService, DirectoryRecord
-
-class UsageError (StandardError):
- pass
-
-def usage(e=None):
- if e:
- print e
- print ""
-
- name = os.path.basename(sys.argv[0])
- print "usage: %s [options] [input_specifiers]" % (name,)
- print ""
- print "Generate an iCalendar file containing the merged content of each calendar"
- print "collection read."
- print ""
- print "options:"
- print " -h --help: print this help and exit"
- print " -f --config: Specify caldavd.plist configuration path"
- print " -o --output: Specify output file path (default: '-', meaning stdout)"
- print ""
- print "input specifiers:"
- print " -c --collection: add a calendar collection"
- print " -H --home: add a calendar home (and all calendars within it)"
- print " -r --record: add a directory record's calendar home (format: 'recordType:shortName')"
- print " -u --user: add a user's calendar home (shorthand for '-r users:shortName')"
-
- if e:
- sys.exit(64)
- else:
- sys.exit(0)
-
-def main():
- try:
- (optargs, args) = getopt(
- sys.argv[1:], "hf:o:c:H:r:u:", [
- "config=",
- "output=",
- "help",
- "collection=", "home=", "record=", "user=",
- ],
- )
- except GetoptError, e:
- usage(e)
-
- configFileName = None
- outputFileName = None
-
- collections = set()
- calendarHomes = set()
- records = set()
-
- def checkExists(resource):
- if not resource.exists():
- sys.stderr.write("No such file: %s\n" % (resource.fp.path,))
- sys.exit(1)
-
- for opt, arg in optargs:
- if opt in ("-h", "--help"):
- usage()
-
- elif opt in ("-f", "--config"):
- configFileName = arg
-
- elif opt in ("-o", "--output"):
- if arg == "-":
- outputFileName = None
- else:
- outputFileName = arg
-
- elif opt in ("-c", "--collection"):
- path = abspath(arg)
- collection = CalDAVFile(path)
- checkExists(collection)
- if not isCalendarCollectionResource(collection):
- sys.stderr.write("Not a calendar collection: %s\n" % (path,))
- sys.exit(1)
- collections.add(collection)
-
- elif opt in ("-H", "--home"):
- path = abspath(arg)
- parent = CalDAVFile(dirname(abspath(path)))
- calendarHome = CalendarHomeFile(arg, parent, dummyDirectoryRecord())
- checkExists(calendarHome)
- calendarHomes.add(calendarHome)
-
- elif opt in ("-r", "--record"):
- try:
- recordType, shortName = arg.split(":", 1)
- if not recordType or not shortName:
- raise ValueError()
- except ValueError:
- sys.stderr.write("Invalid record identifier: %r\n" % (arg,))
- sys.exit(1)
-
- records.add((recordType, shortName))
-
- elif opt in ("-u", "--user"):
- records.add((DirectoryService.recordType_users, arg))
-
- if args:
- usage("Too many arguments: %s" % (" ".join(args),))
-
- if records:
- config = getConfig(configFileName)
- directory = getDirectory(config)
-
- for record in records:
- recordType, shortName = record
- calendarHome = directory.calendarHomeForShortName(recordType, shortName)
- if not calendarHome:
- sys.stderr.write("No calendar home found for record: (%s)%s\n" % (recordType, shortName))
- sys.exit(1)
- calendarHomes.add(calendarHome)
-
- for calendarHome in calendarHomes:
- for childName in calendarHome.listChildren():
- child = calendarHome.getChild(childName)
- if isCalendarCollectionResource(child):
- collections.add(child)
-
- try:
- calendar = iComponent("VCALENDAR")
- calendar.addProperty(iProperty("VERSION", "2.0"))
- calendar.addProperty(iProperty("PRODID", iCalendarProductID))
-
- uids = set()
- tzids = set()
-
- for collection in collections:
- for name, uid, type in collection.index().search(None):
- child = collection.getChild(name)
- childData = child.iCalendarText()
-
- try:
- childCalendar = iComponent.fromString(childData)
- except ValueError:
- continue
- assert childCalendar.name() == "VCALENDAR"
-
- if uid in uids:
- sys.stderr.write("Skipping duplicate event UID %r from %s\n" % (uid, collection.fp.path))
- continue
- else:
- uids.add(uid)
-
- for component in childCalendar.subcomponents():
- # Only insert VTIMEZONEs once
- if component.name() == "VTIMEZONE":
- tzid = component.propertyValue("TZID")
- if tzid in tzids:
- continue
- else:
- tzids.add(tzid)
-
- calendar.addComponent(component)
-
- calendarData = str(calendar)
-
- if outputFileName:
- try:
- output = open(outputFileName, "w")
- except IOError, e:
- sys.stderr.write("Unable to open output file for writing %s: %s\n" % (outputFileName, e))
- sys.exit(1)
- else:
- output = sys.stdout
-
- output.write(calendarData)
-
- except UsageError, e:
- usage(e)
-
-_dummyDirectoryRecord = None
-def dummyDirectoryRecord():
- global _dummyDirectoryRecord
- if _dummyDirectoryRecord is None:
- class DummyDirectoryService (DirectoryService):
- realmName = ""
- baseGUID = "51856FD4-5023-4890-94FE-4356C4AAC3E4"
- def recordTypes(self): return ()
- def listRecords(self): return ()
- def recordWithShortName(self): return None
-
- _dummyDirectoryRecord = DirectoryRecord(
- service = DummyDirectoryService(),
- recordType = "dummy",
- guid = "8EF0892F-7CB6-4B8E-B294-7C5A5321136A",
- shortName = "dummy",
- fullName = "Dummy McDummerson",
- # firstName = "Dummy",
- # lastName = "McDummerson",
- # emailAddresses = (),
- calendarUserAddresses = set(),
- autoSchedule = False,
- )
- return _dummyDirectoryRecord
-
-_config = None
-def getConfig(configFileName):
- global _config
- if _config is None:
- from twistedcaldav.config import config, defaultConfigFile
-
- if configFileName is None:
- configFileName = defaultConfigFile
-
- if not os.path.isfile(configFileName):
- sys.stderr.write("No config file: %s\n" % (configFileName,))
- sys.exit(1)
-
- config.loadConfig(configFileName)
-
- _config = config
-
- return _config
-
-_directory = None
-def getDirectory(config):
- global _directory
- if _directory is None:
- BaseDirectoryService = namedClass(config.DirectoryService["type"])
-
- class MyDirectoryService (BaseDirectoryService):
- def principalCollection(self):
- if not hasattr(self, "_principalCollection"):
- #
- # Instantiating a CalendarHomeProvisioningResource with a directory
- # will register it with the directory (still smells like a hack).
- #
- # We need that in order to locate calendar homes via the directory.
- #
- from twistedcaldav.static import CalendarHomeProvisioningFile
- CalendarHomeProvisioningFile(os.path.join(config.DocumentRoot, "calendars"), self, "/calendars/")
-
- from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
- self._principalCollection = DirectoryPrincipalProvisioningResource("/principals/", self)
-
- return self._principalCollection
-
- def calendarHomeForShortName(self, recordType, shortName):
- principal = self.principalCollection().principalForShortName(recordType, shortName)
- if principal:
- #return principal.calendarHome()
- service = principal.record.service
- if hasattr(service, "calendarHomesCollection"):
- return service.calendarHomesCollection.homeForDirectoryRecord(principal.record)
- return None
-
- _directory = MyDirectoryService(**config.DirectoryService["params"])
-
- return _directory
-
-if __name__ == "__main__":
- main()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090915/66542bce/attachment-0001.html>
More information about the calendarserver-changes
mailing list