[CalendarServer-changes] [14456] CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav
source_changes at macosforge.org
source_changes at macosforge.org
Thu Feb 19 17:47:23 PST 2015
Revision: 14456
http://trac.calendarserver.org//changeset/14456
Author: cdaboo at apple.com
Date: 2015-02-19 17:47:23 -0800 (Thu, 19 Feb 2015)
Log Message:
-----------
Use DAL Record for iMIP tokens.
Modified Paths:
--------------
CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/inbound.py
CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/outbound.py
CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py
CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py
CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py
CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql.py
CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/icommondatastore.py
Added Paths:
-----------
CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql_imip.py
Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/inbound.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/inbound.py 2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/inbound.py 2015-02-20 01:47:23 UTC (rev 14456)
@@ -260,11 +260,11 @@
return
txn = self.store.newTransaction(label="MailReceiver.processDSN")
- result = (yield txn.imipLookupByToken(token))
+ records = (yield txn.imipLookupByToken(token))
yield txn.commit()
try:
# Note the results are returned as utf-8 encoded strings
- organizer, attendee, _ignore_icaluid = result[0]
+ record = records[0]
except:
# This isn't a token we recognize
log.error(
@@ -272,7 +272,7 @@
% (token, msgId))
returnValue(self.UNKNOWN_TOKEN)
- calendar.removeAllButOneAttendee(attendee)
+ calendar.removeAllButOneAttendee(record.attendee)
calendar.getOrganizerProperty().setValue(organizer)
for comp in calendar.subcomponents():
if comp.name() == "VEVENT":
@@ -288,8 +288,11 @@
log.warn("Mail gateway processing DSN %s" % (msgId,))
txn = self.store.newTransaction(label="MailReceiver.processDSN")
yield txn.enqueue(
- IMIPReplyWork, organizer=organizer, attendee=attendee,
- icalendarText=str(calendar))
+ IMIPReplyWork,
+ organizer=record.organizer,
+ attendee=record.attendee,
+ icalendarText=str(calendar)
+ )
yield txn.commit()
returnValue(self.INJECTION_SUBMITTED)
@@ -313,11 +316,11 @@
returnValue(self.MALFORMED_TO_ADDRESS)
txn = self.store.newTransaction(label="MailReceiver.processReply")
- result = (yield txn.imipLookupByToken(token))
+ records = (yield txn.imipLookupByToken(token))
yield txn.commit()
try:
# Note the results are returned as utf-8 encoded strings
- organizer, attendee, _ignore_icaluid = result[0]
+ record = records[0]
except:
# This isn't a token we recognize
log.error(
@@ -337,11 +340,11 @@
"in message %s" % (msg['Message-ID'],))
toAddr = None
- fromAddr = attendee[7:]
- if organizer.startswith("mailto:"):
- toAddr = organizer[7:]
- elif organizer.startswith("urn:x-uid:"):
- uid = organizer[10:]
+ fromAddr = record.attendee[7:]
+ if record.organizer.startswith("mailto:"):
+ toAddr = record.organizer[7:]
+ elif record.organizer.startswith("urn:x-uid:"):
+ uid = record.organizer[10:]
record = yield self.directory.recordWithUID(uid)
try:
if record and record.emailAddresses:
@@ -376,23 +379,23 @@
calendar = Component.fromString(calBody)
event = calendar.mainComponent()
- calendar.removeAllButOneAttendee(attendee)
+ calendar.removeAllButOneAttendee(record.attendee)
organizerProperty = calendar.getOrganizerProperty()
if organizerProperty is None:
# ORGANIZER is required per rfc2446 section 3.2.3
log.warn(
"Mail gateway didn't find an ORGANIZER in REPLY %s"
% (msg['Message-ID'],))
- event.addProperty(Property("ORGANIZER", organizer))
+ event.addProperty(Property("ORGANIZER", record.organizer))
else:
- organizerProperty.setValue(organizer)
+ organizerProperty.setValue(record.organizer)
if not calendar.getAttendees():
# The attendee we're expecting isn't there, so add it back
# with a SCHEDULE-STATUS of SERVICE_UNAVAILABLE.
# The organizer will then see that the reply was not successful.
attendeeProp = Property(
- "ATTENDEE", attendee,
+ "ATTENDEE", record.attendee,
params={
"SCHEDULE-STATUS": iTIPRequestStatus.SERVICE_UNAVAILABLE,
}
@@ -406,8 +409,11 @@
txn = self.store.newTransaction(label="MailReceiver.processReply")
yield txn.enqueue(
- IMIPReplyWork, organizer=organizer, attendee=attendee,
- icalendarText=str(calendar))
+ IMIPReplyWork,
+ organizer=record.organizer,
+ attendee=record.attendee,
+ icalendarText=str(calendar)
+ )
yield txn.commit()
returnValue(self.INJECTION_SUBMITTED)
Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/outbound.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/outbound.py 2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/outbound.py 2015-02-20 01:47:23 UTC (rev 14456)
@@ -364,28 +364,29 @@
# Reuse or generate a token based on originator, toAddr, and
# event uid
- token = (yield txn.imipGetToken(originator, toAddr.lower(), icaluid))
- if token is None:
+ record = (yield txn.imipGetToken(originator, toAddr.lower(), icaluid))
+ if record is None:
# Because in the past the originator was sometimes in mailto:
# form, lookup an existing token by mailto: as well
organizerProperty = calendar.getOrganizerProperty()
organizerEmailAddress = organizerProperty.parameterValue("EMAIL", None)
if organizerEmailAddress is not None:
- token = (yield txn.imipGetToken("mailto:%s" % (organizerEmailAddress.lower(),), toAddr.lower(), icaluid))
+ record = (yield txn.imipGetToken("mailto:%s" % (organizerEmailAddress.lower(),), toAddr.lower(), icaluid))
- if token is None:
- token = (yield txn.imipCreateToken(originator, toAddr.lower(), icaluid))
+ if record is None:
+ record = (yield txn.imipCreateToken(originator, toAddr.lower(), icaluid))
self.log.debug("Mail gateway created token %s for %s "
"(originator), %s (recipient) and %s (icaluid)"
- % (token, originator, toAddr, icaluid))
+ % (record.token, originator, toAddr, icaluid))
inviteState = "new"
else:
self.log.debug("Mail gateway reusing token %s for %s "
"(originator), %s (recipient) and %s (icaluid)"
- % (token, originator, toAddr, icaluid))
+ % (record.token, originator, toAddr, icaluid))
inviteState = "update"
+ token = record.token
fullServerAddress = self.address
_ignore_name, serverAddress = email.utils.parseaddr(fullServerAddress)
Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py 2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py 2015-02-20 01:47:23 UTC (rev 14456)
@@ -175,13 +175,13 @@
# Make sure a known token *is* processed
txn = self.store.newTransaction()
- token = (yield txn.imipCreateToken(
+ record = (yield txn.imipCreateToken(
"urn:x-uid:5A985493-EE2C-4665-94CF-4DFEA3A89500",
"mailto:user02 at example.com",
"1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C"
))
yield txn.commit()
- calBody = template % token
+ calBody = template % record.token
result = (yield self.receiver.processDSN(calBody, "xyzzy"))
self.assertEquals(result, MailReceiver.INJECTION_SUBMITTED)
Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py 2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py 2015-02-20 01:47:23 UTC (rev 14456)
@@ -44,9 +44,8 @@
"icaluid1", token="token1")
yield migrateTokensToStore(self.path, self.store)
txn = self.store.newTransaction()
- results = yield (txn.imipLookupByToken("token1"))
- organizer, attendee, icaluid = results[0]
+ records = yield (txn.imipLookupByToken("token1"))
yield txn.commit()
- self.assertEquals(organizer, "urn:uuid:user01")
- self.assertEquals(attendee, "mailto:attendee at example.com")
- self.assertEquals(icaluid, "icaluid1")
+ self.assertEquals(records[0].organizer, "urn:uuid:user01")
+ self.assertEquals(records[0].attendee, "mailto:attendee at example.com")
+ self.assertEquals(records[0].icaluid, "icaluid1")
Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py 2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py 2015-02-20 01:47:23 UTC (rev 14456)
@@ -316,17 +316,17 @@
yield JobItem.waitEmpty(self.store.newTransaction, reactor, 60)
txn = self.store.newTransaction()
- token = (yield txn.imipGetToken(
+ record = (yield txn.imipGetToken(
ORGANIZER,
ATTENDEE,
ICALUID
))
- self.assertTrue(token)
- organizer, attendee, icaluid = (yield txn.imipLookupByToken(token))[0]
+ self.assertTrue(record is not None)
+ record = (yield txn.imipLookupByToken(record.token))[0]
yield txn.commit()
- self.assertEquals(organizer, ORGANIZER)
- self.assertEquals(attendee, ATTENDEE)
- self.assertEquals(icaluid, ICALUID)
+ self.assertEquals(record.organizer, ORGANIZER)
+ self.assertEquals(record.attendee, ATTENDEE)
+ self.assertEquals(record.icaluid, ICALUID)
@inlineCallbacks
@@ -492,12 +492,12 @@
if UID: # The organizer is local, and server is sending to remote
# attendee
txn = self.store.newTransaction()
- token = (yield txn.imipGetToken(inputOriginator, inputRecipient, UID))
+ record = (yield txn.imipGetToken(inputOriginator, inputRecipient, UID))
yield txn.commit()
- self.assertNotEquals(token, None)
+ self.assertNotEquals(record, None)
self.assertEquals(
msg["Reply-To"],
- "server+%s at example.com" % (token,))
+ "server+%s at example.com" % (record.token,))
# Make sure attendee property for organizer exists and matches
# the CUA of the organizer property
@@ -529,31 +529,31 @@
@inlineCallbacks
def test_tokens(self):
txn = self.store.newTransaction()
- token = (yield txn.imipLookupByToken("xyzzy"))
+ self.assertEquals((yield txn.imipLookupByToken("xyzzy")), [])
yield txn.commit()
- self.assertEquals(token, [])
txn = self.store.newTransaction()
- token1 = (yield txn.imipCreateToken("organizer", "attendee", "icaluid"))
+ record1 = (yield txn.imipCreateToken("organizer", "attendee", "icaluid"))
yield txn.commit()
txn = self.store.newTransaction()
- token2 = (yield txn.imipGetToken("organizer", "attendee", "icaluid"))
+ record2 = (yield txn.imipGetToken("organizer", "attendee", "icaluid"))
yield txn.commit()
- self.assertEquals(token1, token2)
+ self.assertEquals(record1.token, record2.token)
txn = self.store.newTransaction()
+ record = (yield txn.imipLookupByToken(record1.token))[0]
self.assertEquals(
- (yield txn.imipLookupByToken(token1)),
- [["organizer", "attendee", "icaluid"]])
+ [record.organizer, record.attendee, record.icaluid],
+ ["organizer", "attendee", "icaluid"])
yield txn.commit()
txn = self.store.newTransaction()
- yield txn.imipRemoveToken(token1)
+ yield txn.imipRemoveToken(record1.token)
yield txn.commit()
txn = self.store.newTransaction()
- self.assertEquals((yield txn.imipLookupByToken(token1)), [])
+ self.assertEquals((yield txn.imipLookupByToken(record1.token)), [])
yield txn.commit()
@@ -568,7 +568,7 @@
# Explictly store a token with mailto: CUA for organizer
# (something that doesn't happen any more, but did in the past)
txn = self.store.newTransaction()
- origToken = (yield txn.imipCreateToken(
+ origRecord = (yield txn.imipCreateToken(
organizerEmail,
"mailto:attendee at example.com",
"CFDD5E46-4F74-478A-9311-B3FF905449C3"
@@ -588,15 +588,15 @@
# Verify we didn't create a new token...
txn = self.store.newTransaction()
- token = (yield txn.imipGetToken(inputOriginator, inputRecipient, UID))
+ record = (yield txn.imipGetToken(inputOriginator, inputRecipient, UID))
yield txn.commit()
- self.assertEquals(token, None)
+ self.assertEquals(record, None)
# But instead kept the old one...
txn = self.store.newTransaction()
- token = (yield txn.imipGetToken(organizerEmail, inputRecipient, UID))
+ record = (yield txn.imipGetToken(organizerEmail, inputRecipient, UID))
yield txn.commit()
- self.assertEquals(token, origToken)
+ self.assertEquals(record.token, origRecord.token)
def generateSampleEmail(self, caltext=initialInviteText):
Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql.py 2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql.py 2015-02-20 01:47:23 UTC (rev 14456)
@@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
##
+from txdav.common.datastore.sql_imip import imipAPIMixin
"""
SQL data store.
@@ -75,8 +76,7 @@
HomeChildNameAlreadyExistsError, NoSuchHomeChildError, \
ObjectResourceNameNotAllowedError, ObjectResourceNameAlreadyExistsError, \
NoSuchObjectResourceError, AllRetriesFailed, InvalidSubscriptionValues, \
- InvalidIMIPTokenValues, TooManyObjectResourcesError, \
- SyncTokenValidException
+ TooManyObjectResourcesError, SyncTokenValidException
from txdav.common.idirectoryservice import IStoreDirectoryService, \
DirectoryRecordNotFoundError
from txdav.common.inotifications import INotificationCollection, \
@@ -565,7 +565,10 @@
-class CommonStoreTransaction(GroupsAPIMixin, GroupCacherAPIMixin, DelegatesAPIMixin):
+class CommonStoreTransaction(
+ GroupsAPIMixin, GroupCacherAPIMixin, DelegatesAPIMixin,
+ imipAPIMixin,
+):
"""
Transaction implementation for SQL database.
"""
@@ -921,121 +924,6 @@
return self._apnSubscriptionsBySubscriberQuery.on(self, subscriberGUID=guid)
- # Create IMIP token
-
- @classproperty
- def _insertIMIPTokenQuery(cls):
- imip = schema.IMIP_TOKENS
- return Insert({
- imip.TOKEN: Parameter("token"),
- imip.ORGANIZER: Parameter("organizer"),
- imip.ATTENDEE: Parameter("attendee"),
- imip.ICALUID: Parameter("icaluid"),
- })
-
-
- @inlineCallbacks
- def imipCreateToken(self, organizer, attendee, icaluid, token=None):
- if not (organizer and attendee and icaluid):
- raise InvalidIMIPTokenValues()
-
- if token is None:
- token = str(uuid4())
-
- try:
- yield self._insertIMIPTokenQuery.on(
- self,
- token=token, organizer=organizer, attendee=attendee,
- icaluid=icaluid)
- except Exception:
- # TODO: is it okay if someone else created the same row just now?
- pass
- returnValue(token)
-
- # Lookup IMIP organizer+attendee+icaluid for token
-
-
- @classproperty
- def _selectIMIPTokenByTokenQuery(cls):
- imip = schema.IMIP_TOKENS
- return Select([imip.ORGANIZER, imip.ATTENDEE, imip.ICALUID], From=imip,
- Where=(imip.TOKEN == Parameter("token")))
-
-
- def imipLookupByToken(self, token):
- return self._selectIMIPTokenByTokenQuery.on(self, token=token)
-
- # Lookup IMIP token for organizer+attendee+icaluid
-
-
- @classproperty
- def _selectIMIPTokenQuery(cls):
- imip = schema.IMIP_TOKENS
- return Select(
- [imip.TOKEN],
- From=imip,
- Where=(imip.ORGANIZER == Parameter("organizer")).And(
- imip.ATTENDEE == Parameter("attendee")).And(
- imip.ICALUID == Parameter("icaluid"))
- )
-
-
- @classproperty
- def _updateIMIPTokenQuery(cls):
- imip = schema.IMIP_TOKENS
- return Update(
- {imip.ACCESSED: utcNowSQL, },
- Where=(imip.ORGANIZER == Parameter("organizer")).And(
- imip.ATTENDEE == Parameter("attendee")).And(
- imip.ICALUID == Parameter("icaluid"))
- )
-
-
- @inlineCallbacks
- def imipGetToken(self, organizer, attendee, icaluid):
- row = (yield self._selectIMIPTokenQuery.on(
- self, organizer=organizer,
- attendee=attendee, icaluid=icaluid))
- if row:
- token = row[0][0]
- # update the timestamp
- yield self._updateIMIPTokenQuery.on(
- self, organizer=organizer,
- attendee=attendee, icaluid=icaluid)
- else:
- token = None
- returnValue(token)
-
-
- # Remove IMIP token
- @classproperty
- def _removeIMIPTokenQuery(cls):
- imip = schema.IMIP_TOKENS
- return Delete(From=imip,
- Where=(imip.TOKEN == Parameter("token")))
-
-
- def imipRemoveToken(self, token):
- return self._removeIMIPTokenQuery.on(self, token=token)
-
-
- # Purge old IMIP tokens
- @classproperty
- def _purgeOldIMIPTokensQuery(cls):
- imip = schema.IMIP_TOKENS
- return Delete(From=imip,
- Where=(imip.ACCESSED < Parameter("olderThan")))
-
-
- def purgeOldIMIPTokens(self, olderThan):
- """
- @type olderThan: datetime
- """
- return self._purgeOldIMIPTokensQuery.on(self, olderThan=olderThan)
-
- # End of IMIP
-
-
def preCommit(self, operation):
"""
Run things before C{commit}. (Note: only provided by SQL
Added: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql_imip.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql_imip.py (rev 0)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql_imip.py 2015-02-20 01:47:23 UTC (rev 14456)
@@ -0,0 +1,102 @@
+# -*- test-case-name: twext.enterprise.dal.test.test_record -*-
+##
+# Copyright (c) 2015 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.
+##
+
+from twext.enterprise.dal.record import SerializableRecord, fromTable
+from twext.enterprise.dal.syntax import utcNowSQL
+from twext.python.log import Logger
+from twisted.internet.defer import inlineCallbacks, returnValue
+from txdav.common.datastore.sql_tables import schema
+from txdav.common.icommondatastore import InvalidIMIPTokenValues
+from uuid import uuid4
+
+log = Logger()
+
+"""
+Classes and methods that relate to iMIP objects in the SQL store.
+"""
+
+class iMIPTokensRecord(SerializableRecord, fromTable(schema.IMIP_TOKENS)):
+ """
+ @DynamicAttrs
+ L{Record} for L{schema.IMIP_TOKENS}.
+ """
+ pass
+
+
+
+class imipAPIMixin(object):
+ """
+ A mixin for L{CommonStoreTransaction} that covers the iMIP API.
+ """
+
+ # Create IMIP token
+ @inlineCallbacks
+ def imipCreateToken(self, organizer, attendee, icaluid, token=None):
+ if not (organizer and attendee and icaluid):
+ raise InvalidIMIPTokenValues()
+
+ if token is None:
+ token = str(uuid4())
+
+ try:
+ record = yield iMIPTokensRecord.create(
+ self,
+ token=token,
+ organizer=organizer,
+ attendee=attendee,
+ icaluid=icaluid
+ )
+ except Exception:
+ # TODO: is it okay if someone else created the same row just now?
+ record = yield self.imipGetToken(organizer, attendee, icaluid)
+ returnValue(record)
+
+
+ # Lookup IMIP organizer+attendee+icaluid for token
+ def imipLookupByToken(self, token):
+ return iMIPTokensRecord.querysimple(self, token=token)
+
+
+ # Lookup IMIP token for organizer+attendee+icaluid
+ @inlineCallbacks
+ def imipGetToken(self, organizer, attendee, icaluid):
+ records = yield iMIPTokensRecord.querysimple(
+ self,
+ organizer=organizer,
+ attendee=attendee,
+ icaluid=icaluid,
+ )
+ if records:
+ # update the timestamp
+ record = records[0]
+ yield record.update(accessed=utcNowSQL)
+ else:
+ record = None
+ returnValue(record)
+
+
+ # Remove IMIP token
+ def imipRemoveToken(self, token):
+ return iMIPTokensRecord.deletesimple(self, token=token)
+
+
+ # Purge old IMIP tokens
+ def purgeOldIMIPTokens(self, olderThan):
+ """
+ @type olderThan: datetime
+ """
+ return iMIPTokensRecord.delete(self, iMIPTokensRecord.accessed < olderThan)
Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/icommondatastore.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/icommondatastore.py 2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/icommondatastore.py 2015-02-20 01:47:23 UTC (rev 14456)
@@ -389,8 +389,8 @@
"""
Returns the organizer, attendee, and icaluid corresponding to the token
- @param token: the token to look up
- @type token: C{str}
+ @param token: the token record
+ @type token: L{Record}
"""
def imipGetToken(organizer, attendee, icaluid): #@NoSelf
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20150219/7cbc1d4e/attachment-0001.html>
More information about the calendarserver-changes
mailing list