[CalendarServer-changes] [10777] CalendarServer/branches/users/gaya/sharedgroups
source_changes at macosforge.org
source_changes at macosforge.org
Thu Feb 21 15:27:19 PST 2013
Revision: 10777
http://trac.calendarserver.org//changeset/10777
Author: gaya at apple.com
Date: 2013-02-21 15:27:19 -0800 (Thu, 21 Feb 2013)
Log Message:
-----------
fix and invite queries
Modified Paths:
--------------
CalendarServer/branches/users/gaya/sharedgroups/twistedcaldav/sharing.py
CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py
Modified: CalendarServer/branches/users/gaya/sharedgroups/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/twistedcaldav/sharing.py 2013-02-21 21:35:38 UTC (rev 10776)
+++ CalendarServer/branches/users/gaya/sharedgroups/twistedcaldav/sharing.py 2013-02-21 23:27:19 UTC (rev 10777)
@@ -576,7 +576,7 @@
mode=invitationAccessToBindModeMap[access],
status=_BIND_STATUS_INVITED,
message=summary)
- shareeStoreObject = yield shareeHome.objectWithShareUID(shareUID)
+ shareeStoreObject = yield shareeHome.invitedObjectWithShareUID(shareUID)
invitation = Invitation(shareeStoreObject)
returnValue(invitation)
Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2013-02-21 21:35:38 UTC (rev 10776)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2013-02-21 23:27:19 UTC (rev 10777)
@@ -165,6 +165,28 @@
returnValue((yield self.addressbookWithName(self.addressbookName())))
+ def objectWithShareUID(self, shareUID):
+ """
+ Retrieve the child with the given bind identifier contained in this
+ home.
+
+ @param name: a string.
+ @return: an L{ICalendar} or C{None} if no such child exists.
+ """
+ return self._childClass.objectWithBindName(self, shareUID, accepted=True)
+
+
+ def invitedObjectWithShareUID(self, shareUID):
+ """
+ Retrieve the child invitation with the given bind identifier contained in this
+ home.
+
+ @param name: a string.
+ @return: an L{ICalendar} or C{None} if no such child exists.
+ """
+ return self._childClass.objectWithBindName(self, shareUID, accepted=False)
+
+
AddressBookHome._register(EADDRESSBOOKTYPE)
@@ -269,7 +291,8 @@
def countObjectResources(self):
if self._objectNames is None:
rows = yield self._objectCountQuery.on(
- self._txn, resourceID=self._resourceID)
+ self._txn, resourceID=self._resourceID
+ )
count = rows[0][0]
#add in group for shared address book
@@ -356,8 +379,8 @@
# then get member UIDs
abo = schema.ADDRESSBOOK_OBJECT
memberUIDRows = yield self._abObjectColumnsWithAddressBookResourceID(
- [abo.VCARD_UID]).on(
- self._txn, addressbookResourceID=self._resourceID)
+ [abo.VCARD_UID]
+ ).on(self._txn, addressbookResourceID=self._resourceID)
memberUIDs = [memberUIDRow[0] for memberUIDRow in memberUIDRows]
# add prefix to get property string
@@ -403,16 +426,22 @@
@inlineCallbacks
def _bumpModified(self, subtxn):
- yield self._lockLastModifiedQuery.on(subtxn, resourceID=self._resourceID)
+ yield self._lockLastModifiedQuery.on(
+ subtxn, resourceID=self._resourceID
+ )
# can't call self.ownerGroup() on a subtranaction,
# So just try AB schema first, then ABOBject schema
# The following line makes shared groups faster, but a bit of a hack
#if hasattr(self, "_ownerGroup") and not (yield self.ownerGroup()):
- result = yield self._changeLastModifiedQuery.on(subtxn, resourceID=self._resourceID)
+ result = yield self._changeLastModifiedQuery.on(
+ subtxn, resourceID=self._resourceID
+ )
if not result:
- result = yield self._changeABForSharedGroupLastModifiedQuery.on(subtxn, resourceID=self._resourceID)
+ result = yield self._changeABForSharedGroupLastModifiedQuery.on(
+ subtxn, resourceID=self._resourceID
+ )
returnValue(result)
@@ -430,7 +459,9 @@
results = []
# Load from the main table first
- dataRows = yield cls._childrenAndMetadataForHomeID.on(home._txn, homeID=home._resourceID)
+ dataRows = yield cls._childrenAndMetadataForHomeID.on(
+ home._txn, homeID=home._resourceID
+ )
# get ownerHomeIDs
ownerHomeIDToDataRowMap = {}
@@ -444,7 +475,9 @@
# now get group rows:
- groupBindRows = yield AddressBookObject._childrenAndMetadataForHomeID.on(home._txn, homeID=home._resourceID)
+ groupBindRows = yield AddressBookObject._childrenAndMetadataForHomeID.on(
+ home._txn, homeID=home._resourceID
+ )
for groupBindRow in groupBindRows:
bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = groupBindRow[:6] #@UnusedVariable
ownerAddressBookID = yield AddressBookObject.ownerAddressBookID(home._txn, resourceID)
@@ -509,7 +542,7 @@
@classmethod
@inlineCallbacks
- def objectWithName(cls, home, name):
+ def objectWithName(cls, home, name, accepted=True):
# replaces objectWithName()
"""
Retrieve the child with the given C{name} contained in the given
@@ -545,15 +578,15 @@
ownerAddressBook = yield ownerHome.addressbook()
sharedABBindRows = yield cls._bindForResourceIDAndHomeID.on(
- home._txn, resourceID=ownerAddressBook._resourceID, homeID=home._resourceID)
+ home._txn, resourceID=ownerAddressBook._resourceID, homeID=home._resourceID
+ )
if sharedABBindRows:
bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = sharedABBindRows[0] #@UnusedVariable
- if bindStatus == _BIND_STATUS_ACCEPTED:
- sharedABBindRows[0].append(ownerHome._resourceID)
- rows = [sharedABBindRows[0]]
+ sharedABBindRows[0].append(ownerHome._resourceID)
+ rows = [sharedABBindRows[0]]
if not rows:
- groupBindRows = yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
+ groupBindRows = yield AddressBookObject._bindWithHomeIDAndAddressBookID.on(
home._txn, homeID=home._resourceID, addressbookID=ownerAddressBook._resourceID
)
if groupBindRows:
@@ -588,44 +621,46 @@
@classmethod
@inlineCallbacks
- def objectWithBindName(cls, home, name):
+ def objectWithBindName(cls, home, name, accepted):
"""
- Retrieve the child with the given C{name} contained in the given
+ Retrieve the child or objectResource with the given bind name C{name} contained in the given
C{home}.
@param home: a L{CommonHome}.
@param name: a string; the name of the L{CommonHomeChild} to retrieve.
- @return: an L{CommonHomeChild} or C{None} if no such child
+ @return: an L{CommonHomeChild} or L{ObjectResource} or C{None} if no such child
exists.
"""
bindRows = yield cls._bindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
if bindRows:
bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = bindRows[0] #@UnusedVariable
- # use childWithName, since it is cached by querycacher
- if bindStatus == _BIND_STATUS_ACCEPTED:
+ if (bindStatus == _BIND_STATUS_ACCEPTED) == bool(accepted):
+ # alt:
+ # returnValue((yield cls.objectWithID(home, resourceID)))
ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
ownerAddressBook = yield ownerHome.addressbook()
- returnValue((yield home.childWithName(ownerAddressBook.shareeABName())))
- else:
- returnValue((yield home.childWithID(resourceID)))
+ returnValue((yield cls.objectWithName(home, ownerAddressBook.shareeABName(), accepted=accepted)))
-
- groupBindRows = yield AddressBookObject._bindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
+ groupBindRows = yield AddressBookObject._bindForNameAndHomeID.on(
+ home._txn, name=name, homeID=home._resourceID
+ )
if groupBindRows:
bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = groupBindRows[0] #@UnusedVariable
- ownerAddressBookID = yield AddressBookObject.ownerAddressBookID(home._txn, resourceID)
- # use childWithName, since it is cached by querycacher
- if bindStatus == _BIND_STATUS_ACCEPTED:
+ if (bindStatus == _BIND_STATUS_ACCEPTED) == bool(accepted):
+ ownerAddressBookID = yield AddressBookObject.ownerAddressBookID(home._txn, resourceID)
+ # alt:
+ # addressbook = yield cls.objectWithID(home, ownerAddressBookID)
ownerHomeID = yield cls.ownerHomeID(home._txn, ownerAddressBookID)
ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
ownerAddressBook = yield ownerHome.addressbook()
- addressbook = yield home.childWithName(ownerAddressBook.shareeABName())
- else:
- addressbook = yield cls.objectWithID(home, ownerAddressBookID)
- returnValue((yield addressbook.objectResourceWithID(resourceID)))
+ addressbook = yield cls.objectWithName(home, ownerAddressBook.shareeABName(), accepted=accepted)
+ if accepted:
+ returnValue((yield addressbook.objectResourceWithID(resourceID)))
+ else:
+ returnValue((yield AddressBookObject.objectWithID(addressbook, resourceID))) # avoids object cache
returnValue(None)
@@ -642,57 +677,31 @@
@return: an L{CommonHomeChild} or C{None} if no such child
exists.
"""
- rows = yield cls._bindForResourceIDAndHomeID.on(
- home._txn, resourceID=resourceID, homeID=home._resourceID)
+ bindRows = yield cls._bindForResourceIDAndHomeID.on(
+ home._txn, resourceID=resourceID, homeID=home._resourceID
+ )
+ if bindRows:
+ bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = bindRows[0] #@UnusedVariable
+ ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
+ ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
+ ownerAddressBook = yield ownerHome.addressbook()
+ returnValue((yield cls.objectWithName(home, ownerAddressBook.shareeABName(), accepted=(bindStatus == _BIND_STATUS_ACCEPTED))))
- if rows:
- bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = rows[0] #@UnusedVariable
- if bindMode == _BIND_MODE_OWN:
- child = cls(
- home=home,
- name=bindName, resourceID=resourceID,
- mode=bindMode, status=bindStatus,
- message=bindMessage,
- )
- yield child.initFromStore()
- returnValue(child)
- else:
- # TODO: do one query
- groupBindRows = yield AddressBookObject._invitedBindWithHomeIDAndAddressBookID.on(
+ groupBindRows = yield AddressBookObject._bindWithHomeIDAndAddressBookID.on(
home._txn, homeID=home._resourceID, addressbookID=resourceID
- )
- if not groupBindRows:
- groupBindRows = yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
- home._txn, homeID=home._resourceID, addressbookID=resourceID
- )
- if groupBindRows:
- #bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = groupBindRows[0] #@UnusedVariable
- groupBindRow = groupBindRows[0]
- groupBindRow[0] = _BIND_MODE_WRITE
- groupBindRow[3] = None # bindName
- groupBindRow[4] = None # bindStatus
- groupBindRow[5] = None # bindMessage
- rows = [groupBindRow]
+ )
+ if groupBindRows:
+ bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = groupBindRows[0] #@UnusedVariable
+ ownerAddressBookID = yield AddressBookObject.ownerAddressBookID(home._txn, resourceID)
+ ownerHomeID = yield cls.ownerHomeID(home._txn, ownerAddressBookID)
+ ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
+ ownerAddressBook = yield ownerHome.addressbook()
+ returnValue((yield cls.objectWithName(home, ownerAddressBook.shareeABName(), accepted=(bindStatus == _BIND_STATUS_ACCEPTED))))
- if not rows:
- returnValue(None)
+ returnValue(None)
- ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
- ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
- ownerAddressBook = yield ownerHome.addressbook()
- bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = rows[0] #@UnusedVariable
- child = cls(
- home=home,
- name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
- mode=bindMode, status=bindStatus,
- message=bindMessage, ownerHome=ownerHome,
- bindName=bindName
- )
- yield child.initFromStore()
- returnValue(child)
-
@classproperty
def _revisionsForHomeID(cls): #@NoSelf
@@ -784,7 +793,9 @@
examinedIDs = set()
remainingIDs = set(groupIDs)
while remainingIDs:
- memberRows = yield cls._memberIDsWithGroupIDsQuery(remainingIDs).on(txn, groupIDs=remainingIDs)
+ memberRows = yield cls._memberIDsWithGroupIDsQuery(remainingIDs).on(
+ txn, groupIDs=remainingIDs
+ )
objectIDs |= set(memberRow[0] for memberRow in memberRows)
examinedIDs |= remainingIDs
remainingIDs = objectIDs - examinedIDs
@@ -886,16 +897,16 @@
# count accepted
if status is not None:
- previouslyAcceptedBinds = 1 if shareeView.fullyShared() else 0
- previouslyAcceptedBinds += len((yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
+ previouslyAcceptedBindCount = 1 if shareeView.fullyShared() else 0
+ previouslyAcceptedBindCount += len((yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
self._txn, homeID=shareeView._home._resourceID, addressbookID=shareeView._resourceID
)))
#TODO: with bit of parameter wrangling, call shareWith() here instead.
sharedname = yield self._updateBindColumnsQuery(columnMap).on(
- self._txn,
- resourceID=self._resourceID, homeID=shareeView._home._resourceID
- )
+ self._txn,
+ resourceID=self._resourceID, homeID=shareeView._home._resourceID
+ )
#update affected attributes
if mode is not None:
@@ -904,10 +915,10 @@
if status is not None:
shareeView._bindStatus = columnMap[bind.BIND_STATUS]
if shareeView._bindStatus == _BIND_STATUS_ACCEPTED:
- if 0 == previouslyAcceptedBinds:
+ if 0 == previouslyAcceptedBindCount:
yield shareeView._initSyncToken()
elif shareeView._bindStatus == _BIND_STATUS_DECLINED:
- if 1 == previouslyAcceptedBinds:
+ if 1 == previouslyAcceptedBindCount:
shareeView._deletedSyncToken(sharedRemoval=True)
shareeView._home._children.pop(shareeView._name, None)
@@ -928,7 +939,7 @@
returnValue(shareeView._name)
@inlineCallbacks
- def asShared(self, includeGroupBinds=False):
+ def asShared(self):
"""
Retrieve all the versions of this L{CommonHomeChild} as it is shared to
everyone.
@@ -947,23 +958,6 @@
self._txn, resourceID=self._resourceID, homeID=self._home._resourceID
)
- if includeGroupBinds:
- homeIDToBindRowMap = dict([(bindRow[1], bindRow) for bindRow in bindRows])
-
- groupBindRows = yield AddressBookObject._acceptedBindWithAddressBookID.on(
- self._txn, addressbookID=self._resourceID
- )
- for groupBindRow in groupBindRows:
- bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = groupBindRow #@UnusedVariable
- if homeID not in homeIDToBindRowMap:
- groupBindRow[0] = _BIND_MODE_WRITE
- groupBindRow[3] = None # bindName
- groupBindRow[4] = None # bindStatus
- groupBindRow[5] = None # bindMessage
- homeIDToBindRowMap[homeID] = groupBindRow
-
- bindRows = homeIDToBindRowMap.values()
-
result = []
cls = self._home._childClass # for ease of grepping...
for bindMode, homeID, resourceID, bindName, bindStatus, bindMessage in bindRows: #@UnusedVariable
@@ -983,7 +977,7 @@
@inlineCallbacks
- def asInvited(self, includeGroupBinds=False):
+ def asInvited(self):
"""
Retrieve all the versions of this L{CommonHomeChild} as it is invited to
everyone.
@@ -1001,24 +995,7 @@
bindRows = yield self._unacceptedBindForResourceID.on(
self._txn, resourceID=self._resourceID
)
- homeIDToBindRowMap = dict([(bindRow[1], bindRow) for bindRow in bindRows])
- if includeGroupBinds:
- groupBindRows = yield AddressBookObject._unacceptedBindWithAddressBookID.on(
- self._txn, addressbookID=self._resourceID
- )
- for groupBindRow in groupBindRows:
- bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = groupBindRow #@UnusedVariable
- if homeID not in homeIDToBindRowMap:
- groupBindRow[0] = _BIND_MODE_WRITE
- groupBindRow[3] = None # bindName
- groupBindRow[4] = None # bindStatus
- groupBindRow[5] = None # bindMessage
- homeIDToBindRowMap[homeID] = groupBindRow
- break
-
- bindRows = homeIDToBindRowMap.values()
-
result = []
cls = self._home._childClass # for ease of grepping...
for bindMode, homeID, resourceID, bindName, bindStatus, bindMessage in bindRows: #@UnusedVariable
@@ -1053,20 +1030,24 @@
sharedAddressBook = yield shareeHome.addressbookWithName(self.shareeABName())
if sharedAddressBook:
- acceptedBinds = 1 if sharedAddressBook.fullyShared() else 0
- acceptedBinds += len((yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
- self._txn, homeID=sharedAddressBook._home._resourceID, addressbookID=sharedAddressBook._resourceID
+ acceptedBindCount = 1 if sharedAddressBook.fullyShared() else 0
+ acceptedBindCount += len((yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
+ self._txn, homeID=shareeHome._resourceID, addressbookID=sharedAddressBook._resourceID
)))
- if acceptedBinds == 1:
+ if acceptedBindCount == 1:
sharedAddressBook._deletedSyncToken(sharedRemoval=True)
shareeHome._children.pop(self.shareeABName(), None)
+ elif not sharedAddressBook.fullyShared():
+ #TODO: Just remove objects for this group only
+ self._objectNames = None
# Must send notification to ensure cache invalidation occurs
yield self.notifyChanged()
# delete binds including invites
deletedBindNameRows = yield self._deleteBindWithResourceIDAndHomeID.on(self._txn, resourceID=self._resourceID,
- homeID=shareeHome._resourceID)
+ homeID=shareeHome._resourceID
+ )
if deletedBindNameRows:
deletedBindName = deletedBindNameRows[0][0]
queryCacher = self._txn._queryCacher
@@ -1130,15 +1111,9 @@
if self.owned():
if self._kind == _ABO_KIND_GROUP: # optimization
- # need to invalidate queryCacher of sharee's home
- queryCacher = self._txn._queryCacher
- if queryCacher:
- for shareeAddressBook in (yield self._addressbook.asShared()):
- cacheKey = queryCacher.keyForObjectWithName(shareeAddressBook._home._resourceID, shareeAddressBook._name)
- yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)
+ self.unshare()
else:
- # cannot delete share for now
- # TODO: convert to unshare
+ # Can't delete a share here with notification so raise.
if self._resourceID == self._addressbook._resourceID:
raise GroupForSharedAddressBookDeleteNotAllowedError
elif self.shareUID():
@@ -1155,7 +1130,8 @@
if writeableAcceptedGroupIDs:
objectsIDs = yield self._addressbook._objectIDsInExpandedGroupIDs(self._txn, writeableAcceptedGroupIDs)
yield self._deleteMembersWithMemberIDAndGroupIDsQuery(self._resourceID, objectsIDs).on(
- self._txn, groupIDs=objectsIDs)
+ self._txn, groupIDs=objectsIDs
+ )
ownerAddressBook = yield self._addressbook.ownerAddressBook()
yield self._changeAddressBookRevision(ownerAddressBook)
@@ -1173,10 +1149,10 @@
for groupID in [groupIDRow[0] for groupIDRow in groupIDRows]:
if groupID != self._ownerAddressBookResourceID: # no aboForeignMembers on address books
yield Insert(
- {aboForeignMembers.GROUP_ID: groupID,
- aboForeignMembers.ADDRESSBOOK_ID: self._ownerAddressBookResourceID,
- aboForeignMembers.MEMBER_ADDRESS: memberAddress, }
- ).on(self._txn)
+ {aboForeignMembers.GROUP_ID: groupID,
+ aboForeignMembers.ADDRESSBOOK_ID: self._ownerAddressBookResourceID,
+ aboForeignMembers.MEMBER_ADDRESS: memberAddress, }
+ ).on(self._txn)
yield super(AddressBookObject, self).remove()
self._kind = None
@@ -1231,15 +1207,18 @@
if self._name:
rows = yield self._allColumnsWithParentAndName.on(
self._txn, name=self._name,
- parentID=self._parentCollection._resourceID)
+ parentID=self._parentCollection._resourceID
+ )
elif self._uid:
rows = yield self._allColumnsWithParentAndUID.on(
self._txn, uid=self._uid,
- parentID=self._parentCollection._resourceID)
+ parentID=self._parentCollection._resourceID
+ )
elif self._resourceID:
rows = yield self._allColumnsWithParentAndID.on(
self._txn, resourceID=self._resourceID,
- parentID=self._parentCollection._resourceID)
+ parentID=self._parentCollection._resourceID
+ )
if not rows and self._addressbook.fullyShared(): # perhaps add special group
if self._name:
@@ -1257,16 +1236,19 @@
if self._name:
rows = (yield self._allColumnsWithResourceIDsAndName(allowedObjectIDs).on(
self._txn, name=self._name,
- resourceIDs=allowedObjectIDs,)) if allowedObjectIDs else []
+ resourceIDs=allowedObjectIDs,
+ )) if allowedObjectIDs else []
elif self._uid:
rows = (yield self._allColumnsWithResourceIDsAndUID(allowedObjectIDs).on(
self._txn, uid=self._uid,
- resourceIDs=allowedObjectIDs,)) if allowedObjectIDs else []
+ resourceIDs=allowedObjectIDs,
+ )) if allowedObjectIDs else []
elif self._resourceID:
if self._resourceID not in allowedObjectIDs:
allowedObjectIDs = yield self._addressbook.invitedGroupIDs()
rows = (yield self._allColumnsWithResourceID.on(
- self._txn, resourceID=self._resourceID,)) if (self._resourceID in allowedObjectIDs) else []
+ self._txn, resourceID=self._resourceID,
+ )) if (self._resourceID in allowedObjectIDs) else []
if rows:
self._initFromRow(tuple(rows[0]))
@@ -1279,7 +1261,8 @@
self._size = len(componentText)
groupBindRows = yield AddressBookObject._bindForResourceIDAndHomeID.on(
- self._txn, resourceID=self._resourceID, homeID=self._home._resourceID)
+ self._txn, resourceID=self._resourceID, homeID=self._home._resourceID
+ )
if groupBindRows:
bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = groupBindRows[0] #@UnusedVariable\
@@ -1359,8 +1342,9 @@
else:
acceptedGroupIDs = addressbook.acceptedGroupIDs()
allowedObjectIDs = yield addressbook._objectIDsInExpandedGroupIDs(addressbook._txn, acceptedGroupIDs)
- rows = (yield cls._columnsWithResourceIDsQuery(cls._allColumns, allowedObjectIDs).on(
- addressbook._txn, resourceIDs=allowedObjectIDs))
+ rows = yield cls._columnsWithResourceIDsQuery(cls._allColumns, allowedObjectIDs).on(
+ addressbook._txn, resourceIDs=allowedObjectIDs
+ )
returnValue(rows)
@@ -1384,7 +1368,8 @@
acceptedGroupIDs = addressbook.acceptedGroupIDs()
allowedObjectIDs = yield addressbook._objectIDsInExpandedGroupIDs(addressbook._txn, acceptedGroupIDs)
rows = yield cls._allColumnsWithResourceIDsAndNamesQuery(allowedObjectIDs, names).on(
- addressbook._txn, resourceIDs=allowedObjectIDs, names=names)
+ addressbook._txn, resourceIDs=allowedObjectIDs, names=names
+ )
returnValue(rows)
@@ -1509,7 +1494,8 @@
foreignMemberAddrs.append(memberAddr)
memberRows = yield self._resourceIDAndUIDForUIDsAndAddressBookResourceIDQuery(memberUIDs).on(
- self._txn, addressbookResourceID=self._ownerAddressBookResourceID, uids=memberUIDs) if memberUIDs else []
+ self._txn, addressbookResourceID=self._ownerAddressBookResourceID, uids=memberUIDs
+ ) if memberUIDs else []
memberIDs = [memberRow[0] for memberRow in memberRows]
foundUIDs = [memberRow[1] for memberRow in memberRows]
foreignMemberAddrs.extend(["urn:uuid:" + missingUID for missingUID in set(memberUIDs) - set(foundUIDs)])
@@ -1574,7 +1560,8 @@
uid=self._uid,
md5=self._md5,
kind=self._kind,
- ))[0]
+ )
+ )[0]
# delete foreign members table row for this object
groupIDRows = yield Delete(
@@ -1612,8 +1599,8 @@
#get current members
currentMemberRows = yield Select([aboMembers.MEMBER_ID],
- From=aboMembers,
- Where=aboMembers.GROUP_ID == self._resourceID,).on(self._txn)
+ From=aboMembers,
+ Where=aboMembers.GROUP_ID == self._resourceID,).on(self._txn)
currentMemberIDs = [currentMemberRow[0] for currentMemberRow in currentMemberRows]
memberIDsToDelete = set(currentMemberIDs) - set(memberIDs)
@@ -1621,7 +1608,8 @@
if memberIDsToDelete:
yield self._deleteMembersWithGroupIDAndMemberIDsQuery(self._resourceID, memberIDsToDelete).on(
- self._txn, memberIDs=memberIDsToDelete)
+ self._txn, memberIDs=memberIDsToDelete
+ )
for memberIDToAdd in memberIDsToAdd:
yield Insert(
@@ -1634,9 +1622,10 @@
if self._resourceID != self._ownerAddressBookResourceID:
#get current foreign members
- currentForeignMemberRows = yield Select([aboForeignMembers.MEMBER_ADDRESS],
- From=aboForeignMembers,
- Where=aboForeignMembers.GROUP_ID == self._resourceID,).on(self._txn)
+ currentForeignMemberRows = yield Select(
+ [aboForeignMembers.MEMBER_ADDRESS],
+ From=aboForeignMembers,
+ Where=aboForeignMembers.GROUP_ID == self._resourceID,).on(self._txn)
currentForeignMemberAddrs = [currentForeignMemberRow[0] for currentForeignMemberRow in currentForeignMemberRows]
foreignMemberAddrsToDelete = set(currentForeignMemberAddrs) - set(foreignMemberAddrs)
@@ -1644,7 +1633,8 @@
if foreignMemberAddrsToDelete:
yield self._deleteForeignMembersWithGroupIDAndMembeAddrsQuery(self._resourceID, foreignMemberAddrsToDelete).on(
- self._txn, memberAddrs=foreignMemberAddrsToDelete)
+ self._txn, memberAddrs=foreignMemberAddrsToDelete
+ )
for foreignMemberAddrToAdd in foreignMemberAddrsToAdd:
yield Insert(
@@ -1694,18 +1684,21 @@
# generate "X-ADDRESSBOOKSERVER-MEMBER" properties
# first get member resource ids
aboMembers = schema.ABO_MEMBERS
- memberRows = yield Select([aboMembers.MEMBER_ID],
- From=aboMembers,
- Where=aboMembers.GROUP_ID == self._resourceID,).on(self._txn)
+ memberRows = yield Select(
+ [aboMembers.MEMBER_ID],
+ From=aboMembers,
+ Where=aboMembers.GROUP_ID == self._resourceID,
+ ).on(self._txn)
memberIDs = [memberRow[0] for memberRow in memberRows]
# then get member UIDs
abo = schema.ADDRESSBOOK_OBJECT
- memberUIDRows = (yield self._columnsWithResourceIDsQuery(
- [abo.VCARD_UID],
- memberIDs).on(
- self._txn, resourceIDs=memberIDs)
- ) if memberIDs else []
+ memberUIDRows = (
+ yield self._columnsWithResourceIDsQuery(
+ [abo.VCARD_UID],
+ memberIDs
+ ).on(self._txn, resourceIDs=memberIDs)
+ ) if memberIDs else []
memberUIDs = [memberUIDRow[0] for memberUIDRow in memberUIDRows]
# add prefix to get property string
@@ -1713,10 +1706,11 @@
# get foreign members
aboForeignMembers = schema.ABO_FOREIGN_MEMBERS
- foreignMemberRows = yield Select([aboForeignMembers.MEMBER_ADDRESS],
- From=aboForeignMembers,
- Where=aboForeignMembers.GROUP_ID == self._resourceID,
- ).on(self._txn)
+ foreignMemberRows = yield Select(
+ [aboForeignMembers.MEMBER_ADDRESS],
+ From=aboForeignMembers,
+ Where=aboForeignMembers.GROUP_ID == self._resourceID,
+ ).on(self._txn)
foreignMembers = [foreignMemberRow[0] for foreignMemberRow in foreignMemberRows]
# now add the properties to the component
@@ -1761,9 +1755,11 @@
# no owner, so shared item must be group
abo = schema.ADDRESSBOOK_OBJECT
- groupAddressBookRows = yield Select([abo.ADDRESSBOOK_RESOURCE_ID],
- From=abo,
- Where=(abo.RESOURCE_ID == Parameter("resourceID"))).on(txn, resourceID=resourceID)
+ groupAddressBookRows = yield Select(
+ [abo.ADDRESSBOOK_RESOURCE_ID],
+ From=abo,
+ Where=(abo.RESOURCE_ID == Parameter("resourceID"))
+ ).on(txn, resourceID=resourceID)
groupAddressBookID = groupAddressBookRows[0][0]
ownerHomeRows = yield cls._ownerHomeWithResourceID.on(txn, resourceID=groupAddressBookID)
@@ -1906,31 +1902,33 @@
@return: a L{Deferred} which will fire with the previously-used name.
"""
- resourceName = None
sharedAddressBook = yield shareeHome.addressbookWithName(self._addressbook.shareeABName())
if sharedAddressBook:
- acceptedBinds = 1 if sharedAddressBook.fullyShared() else 0
- acceptedBinds += len((yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
- self._txn, homeID=sharedAddressBook._home._resourceID, addressbookID=sharedAddressBook._resourceID
- )))
+ acceptedBindCount = 1 if sharedAddressBook.fullyShared() else 0
+ acceptedBindCount += len((
+ yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
+ self._txn, homeID=shareeHome._resourceID, addressbookID=sharedAddressBook._resourceID
+ )
+ ))
- if acceptedBinds == 1:
- resourceName = self._addressbook.shareeABName()
+ if acceptedBindCount == 1:
sharedAddressBook._deletedSyncToken(sharedRemoval=True)
- shareeHome._children.pop(resourceName, None)
+ shareeHome._children.pop(self._addressbook.shareeABName(), None)
# Must send notification to ensure cache invalidation occurs
yield self._addressbook.notifyChanged()
# delete binds including invites
- deletedBindNameRows = yield self._deleteBindWithResourceIDAndHomeID.on(self._txn, resourceID=self._addressbook._resourceID,
- homeID=shareeHome._resourceID)
+ deletedBindNameRows = yield self._deleteBindWithResourceIDAndHomeID.on(
+ self._txn, resourceID=self._resourceID,
+ homeID=shareeHome._resourceID
+ )
if deletedBindNameRows:
deletedBindName = deletedBindNameRows[0][0]
queryCacher = self._txn._queryCacher
if queryCacher:
- cacheKey = queryCacher.keyForObjectWithName(shareeHome._resourceID, self.shareeABName())
+ cacheKey = queryCacher.keyForObjectWithName(shareeHome._resourceID, self._addressbook.shareeABName())
queryCacher.invalidateAfterCommit(self._txn, cacheKey)
else:
deletedBindName = None
@@ -1982,16 +1980,17 @@
# count accepted
if status is not None:
- previouslyAcceptedBinds = 1 if shareeView._addressbook.fullyShared() else 0
- previouslyAcceptedBinds += len((yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
- self._txn, homeID=shareeView._home._resourceID, addressbookID=shareeView._resourceID
- )))
+ previouslyAcceptedBindCount = 1 if shareeView._addressbook.fullyShared() else 0
+ previouslyAcceptedBindCount += len((
+ yield AddressBookObject._acceptedBindWithHomeIDAndAddressBookID.on(
+ self._txn, homeID=shareeView._home._resourceID, addressbookID=self._addressbook._resourceID
+ )
+ ))
- #TODO: with bit of parameter wrangling, call shareWith() here instead.
sharedname = yield self._updateBindColumnsQuery(columnMap).on(
- self._txn,
- resourceID=self._resourceID, homeID=shareeView._home._resourceID
- )
+ self._txn,
+ resourceID=self._resourceID, homeID=shareeView._home._resourceID
+ )
#update affected attributes
if mode is not None:
@@ -2000,10 +1999,10 @@
if status is not None:
shareeView._bindStatus = columnMap[bind.BIND_STATUS]
if shareeView._bindStatus == _BIND_STATUS_ACCEPTED:
- if 0 == previouslyAcceptedBinds:
+ if 0 == previouslyAcceptedBindCount:
yield shareeView._addressbook._initSyncToken()
- elif shareeView._bindStatus == _BIND_STATUS_DECLINED:
- if 1 == previouslyAcceptedBinds:
+ elif shareeView._bindStatus != _BIND_STATUS_INVITED:
+ if 1 == previouslyAcceptedBindCount:
shareeView._addressbook._deletedSyncToken(sharedRemoval=True)
shareeView._home._children.pop(shareeView._addressbook._name, None)
Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py 2013-02-21 21:35:38 UTC (rev 10776)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py 2013-02-21 23:27:19 UTC (rev 10777)
@@ -1653,9 +1653,20 @@
@param name: a string.
@return: an L{ICalendar} or C{None} if no such child exists.
"""
- return self._childClass.objectWithBindName(self, shareUID)
+ return self._childClass.objectWithName(self, shareUID, accepted=True)
+ def invitedObjectWithShareUID(self, shareUID):
+ """
+ Retrieve the child invitation with the given bind identifier contained in this
+ home.
+
+ @param name: a string.
+ @return: an L{ICalendar} or C{None} if no such child exists.
+ """
+ return self._childClass.objectWithName(self, shareUID, accepted=False)
+
+
@memoizedKey("resourceID", "_children")
def childWithID(self, resourceID):
"""
@@ -2517,31 +2528,7 @@
.And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
)
- @classproperty
- def _acceptedBindForNameAndHomeID(cls): #@NoSelf
- """
- DAL query that looks up accepted bind rows by home child
- resource ID and home resource ID.
- """
- bind = cls._bindSchema
- return cls._bindFor((bind.RESOURCE_NAME == Parameter("name"))
- .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
- .And(bind.BIND_STATUS == _BIND_STATUS_ACCEPTED)
- )
- @classproperty
- def _unacceptedBindForNameAndHomeID(cls): #@NoSelf
- """
- DAL query that looks up invited bind rows by home child
- resource ID and home resource ID.
- """
- bind = cls._bindSchema
- return cls._bindFor((bind.RESOURCE_NAME == Parameter("name"))
- .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
- .And(bind.BIND_STATUS != _BIND_STATUS_ACCEPTED)
- )
-
-
@inlineCallbacks
def shareWith(self, shareeHome, mode, status=None, message=None):
"""
@@ -2771,7 +2758,6 @@
cls = self._home._childClass # for ease of grepping...
result = []
for bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage in acceptedRows: #@UnusedVariable
- assert bindStatus == _BIND_STATUS_ACCEPTED
# TODO: this could all be issued in parallel; no need to serialize
# the loop.
new = cls(
@@ -3055,32 +3041,7 @@
@classmethod
@inlineCallbacks
- def objectWithBindName(cls, home, name):
- """
- Retrieve the child with the given C{name} contained in the given
- C{home}.
-
- @param home: a L{CommonHome}.
-
- @param name: a string; the name of the L{CommonHomeChild} to retrieve.
-
- @return: an L{CommonHomeChild} or C{None} if no such child
- exists.
- """
- # try accepted, then invited
- result = yield home.childWithName(name)
- if not result:
- bindRows = yield cls._unacceptedBindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
- if bindRows:
- bindMode, homeID, resourceID, bindName, bindStatus, bindMessage = bindRows[0] #@UnusedVariable
- result = yield home.childWithID(resourceID)
-
- returnValue(result)
-
-
- @classmethod
- @inlineCallbacks
- def objectWithName(cls, home, name):
+ def objectWithName(cls, home, name, accepted=True):
# replaces objectWithName()
"""
Retrieve the child with the given C{name} contained in the given
@@ -3103,7 +3064,7 @@
if rows is None:
# No cached copy
- rows = yield cls._acceptedBindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
+ rows = yield cls._bindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
if rows:
bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
@@ -3122,6 +3083,9 @@
returnValue(None)
bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage, ownerHomeID = rows[0] #@UnusedVariable
+ if (bindStatus == _BIND_STATUS_ACCEPTED) != bool(accepted):
+ returnValue(None)
+
if bindMode == _BIND_MODE_OWN:
ownerHome = home
else:
@@ -3151,26 +3115,13 @@
"""
rows = yield cls._bindForResourceIDAndHomeID.on(
home._txn, resourceID=resourceID, homeID=home._resourceID)
- if not rows:
- returnValue(None)
+ if rows:
+ bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+ returnValue((yield cls.objectWithName(home, resourceName, accepted=(bindStatus == _BIND_STATUS_ACCEPTED))))
- bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+ returnValue(None)
- if bindMode == _BIND_MODE_OWN:
- ownerHome = home
- else:
- ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
- ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
- child = cls(
- home=home,
- name=resourceName, resourceID=resourceID,
- mode=bindMode, status=bindStatus,
- message=bindMessage, ownerHome=ownerHome,
- )
- yield child.initFromStore()
- returnValue(child)
-
@classproperty
def _insertHomeChild(cls): #@NoSelf
"""
@@ -3327,7 +3278,6 @@
cacheKey = queryCacher.keyForObjectWithName(self._home._resourceID, oldName)
yield queryCacher.invalidateAfterCommit(self._home._txn, cacheKey)
- print("_renameQuery:%s, name=%s" % (self, name))
yield self._renameQuery.on(self._txn, name=name,
resourceID=self._resourceID,
homeID=self._home._resourceID)
@@ -3335,15 +3285,12 @@
# update memos
del self._home._children[oldName]
self._home._children[name] = self
- print("_renameSyncToken:%s, name=%s" % (self, name))
yield self._renameSyncToken()
- print("notifyChanged:%s, name=%s" % (self, name))
yield self.notifyChanged()
# Make sure home collection modified is changed - not that we do not use _home.notifiedChanged() here
# since we are sending the notification on the existing child collection object
- print("bumpModified:%s, name=%s" % (self, name))
yield self._home.bumpModified()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130221/02359a58/attachment-0001.html>
More information about the calendarserver-changes
mailing list