[CalendarServer-changes] [10022] CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/ datastore/sql.py
source_changes at macosforge.org
source_changes at macosforge.org
Mon Nov 12 11:16:50 PST 2012
Revision: 10022
http://trac.calendarserver.org//changeset/10022
Author: gaya at apple.com
Date: 2012-11-12 11:16:50 -0800 (Mon, 12 Nov 2012)
Log Message:
-----------
clean up AddressBookObject.remove(), AddressBookObject.updateDatabase()
Modified Paths:
--------------
CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2012-11-12 17:58:46 UTC (rev 10021)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2012-11-12 19:16:50 UTC (rev 10022)
@@ -364,10 +364,9 @@
def remove(self):
print("remove:self=%s, self._addressbook.owned()=%s" % (self, self._addressbook.owned(),))
+ ownerGroup, ownerAddressBook = yield self._ownerGroupAndAddressBook()
+ print("remove:self=%s, ownerGroup=%s" % (self, ownerGroup,))
- aboForeignMembers = schema.ABO_FOREIGN_MEMBERS
- aboMembers = schema.ABO_MEMBERS
-
if self._addressbook.owned():
if self._kind == _ABO_KIND_GROUP:
# need to invalidate queryCacher of sharee's home
@@ -376,82 +375,39 @@
for shareeAddressBook in (yield self.asShared()):
cacheKey = queryCacher.keyForObjectWithName(shareeAddressBook._home._resourceID, shareeAddressBook._name)
yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)
-
-
- ownerAddressBook = self._addressbook
-
else:
# sharee cannot delete group representing shared address book
if self._resourceID == self._addressbook._resourceID:
print("remove:self=%s, DeleteOfShadowGroupNotAllowedError" % (self,))
raise DeleteOfShadowGroupNotAllowedError
- ownerGroup, ownerAddressBook = yield self._ownerGroupAndAddressBook()
- print("remove:self=%s, ownerGroup=%s" % (self, ownerGroup,))
- if ownerGroup:
- # convert a delete in a shared group to membership removes
- groupIDRows = yield Select(
- [aboMembers.GROUP_ID],
- From=aboMembers,
- Where=(aboMembers.MEMBER_ID == self._resourceID).And(
- aboMembers.GROUP_ID != ownerAddressBook._resourceID),
- ).on(self._txn)
-
- memberAddress = "urn:uuid:" + self._uid
- for groupID in [groupIDRow[0] for groupIDRow in groupIDRows]:
- groupObject = yield ownerAddressBook.objectResourceWithID(groupID)
- groupComponent = yield groupObject.component()
- if memberAddress in groupComponent.resourceMemberAddresses():
- groupComponent.removeProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
- yield groupObject.updateDatabase(groupComponent)
-
- returnValue(None)
-
# delete members table row for this object
+ aboMembers = schema.ABO_MEMBERS
groupIDRows = yield Select(
[aboMembers.GROUP_ID],
- From=aboMembers,
- Where=aboMembers.MEMBER_ID == self._resourceID,
+ From=aboMembers,
+ Where=aboMembers.MEMBER_ID == self._resourceID,
).on(self._txn)
memberAddress = "urn:uuid:" + self._uid
for groupID in [groupIDRow[0] for groupIDRow in groupIDRows]:
- groupObject = yield ownerAddressBook.objectResourceWithID(groupID)
- groupComponent = yield groupObject.component()
- if memberAddress in groupComponent.resourceMemberAddresses():
- groupComponent.removeProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
- yield groupObject.updateDatabase(groupComponent)
+ if ownerGroup and groupID == ownerAddressBook._resourceID:
+ pass # convert delete in shared group to remove of membership only part 1
+ else:
+ groupObject = yield ownerAddressBook.objectResourceWithID(groupID)
+ groupComponent = yield groupObject.component()
+ if memberAddress in groupComponent.resourceMemberAddresses():
+ groupComponent.removeProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
+ yield groupObject.updateDatabase(groupComponent)
+ if ownerGroup:
+ pass # convert delete in shared group to remove of member only part 2
+ else:
+ yield super(AddressBookObject, self).remove()
+ self._kind = None
+ self._ownerAddressBookResourceID = None
-
- '''
- OLD WAY
-
- # delete members table row for this object
- groupIDRows = yield Delete(
- aboMembers,
- Where=aboMembers.MEMBER_ID == self._resourceID,
- Return=aboMembers.GROUP_ID
- ).on(self._txn)
-
- # add to foreign member table row by UID
- assert self._ownerAddressBookResourceID
- for groupID in [groupIDRow[0] for groupIDRow in groupIDRows]:
- if groupID != self._ownerAddressBookResourceID:
- # remove on address book, add aboForeignMembers row to local groups only
- yield Insert(
- {aboForeignMembers.GROUP_ID: groupID,
- aboForeignMembers.ADDRESSBOOK_ID: self._ownerAddressBookResourceID,
- aboForeignMembers.MEMBER_ADDRESS: "urn:uuid:" + self._uid, }
- ).on(self._txn)
- '''
-
- yield super(AddressBookObject, self).remove()
- self._kind = None
- self._ownerAddressBookResourceID = None
-
-
@classmethod
def _allWithResourceIDAnd(cls, resourceIDs, column, paramName):
"""
@@ -669,6 +625,16 @@
returnValue((ownerGroup, ownerAddressBook))
+ @classmethod
+ def _resourceIDAndUIDForUIDsAndAddressBookResourceIDQuery(cls, uids): #@NoSelf
+ abo = schema.ADDRESSBOOK_OBJECT
+ return Select([abo.RESOURCE_ID, abo.VCARD_UID],
+ From=abo,
+ Where=((abo.ADDRESSBOOK_RESOURCE_ID == Parameter("addressbookResourceID")
+ ).And(
+ abo.VCARD_UID.In(Parameter("uids", len(uids))))),
+ )
+
@inlineCallbacks
def updateDatabase(self, component, expand_until=None, reCreate=False,
inserting=False):
@@ -724,22 +690,20 @@
if self._kind == _ABO_KIND_GROUP:
# get member ids
- memberIDs = []
+ memberUIDs = []
foreignMemberAddrs = []
for memberAddr in component.resourceMemberAddresses():
- memberRow = []
if len(memberAddr) > len("urn:uuid:") and memberAddr.startswith("urn:uuid:"):
- memberUID = memberAddr[len("urn:uuid:"):]
- memberRow = yield Select([abo.RESOURCE_ID],
- From=abo,
- Where=((abo.ADDRESSBOOK_RESOURCE_ID == self._ownerAddressBookResourceID)
- ).And(abo.VCARD_UID == memberUID),).on(self._txn)
- if memberRow:
- memberIDs.append(memberRow[0][0])
+ memberUIDs.append(memberAddr[len("urn:uuid:"):])
else:
foreignMemberAddrs.append(memberAddr)
- print("updateDatabase1.1:self=%s memberAddr=%s, memberRow=%s" % (self, memberAddr, memberRow))
+ memberRows = yield self._resourceIDAndUIDForUIDsAndAddressBookResourceIDQuery(memberUIDs).on(
+ 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)])
+
#in shared group, all members must be inside the shared group
if ownerGroup:
if foreignMemberAddrs or \
@@ -760,7 +724,6 @@
))[0]
# add this vCard to shadow group and to shared group
groups = [ownerGroup] if ownerGroup else []
-
shadowGroup = yield ownerAddressBook.objectResourceWithID(ownerAddressBook._resourceID)
groups.append(shadowGroup)
@@ -774,32 +737,6 @@
print("updateDatabase2:self=%s, group=%s, groupComponent=%s" % (self, group, groupComponent,))
yield group.updateDatabase(groupComponent)
- '''
- OLD WAY, that does not update the abo.VCARD_TEXT & abo.MD5 of
- owned address books
-
- Perhaps it would be better to just fix that and not call recursively
- because new way, above creates a shawdow group object in the owned address book,
-
- if ownerGroup:
- ownerGroupComponent = yield ownerGroup.component()
- memberAddress = "urn:uuid:" + self._uid
- if not memberAddress in ownerGroupComponent.resourceMemberAddresses():
- ownerGroupComponent.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
- ownerGroupComponent.replaceProperty(Property("PRODID", vCardProductID))
- yield ownerGroup.updateDatabase(ownerGroupComponent)
-
- '''
-
- '''
- # add row on this address book group table
- yield Insert(
- {aboMembers.GROUP_ID: self._ownerAddressBookResourceID,
- aboMembers.ADDRESSBOOK_ID: self._ownerAddressBookResourceID,
- aboMembers.MEMBER_ID: self._resourceID, }
- ).on(self._txn)
- '''
-
# delete foreign members table row for this object
groupIDRows = yield Delete(
aboForeignMembers,
@@ -815,7 +752,6 @@
aboMembers.MEMBER_ID: self._resourceID, }
).on(self._txn)
-
else:
self._modified = (yield Update(
{abo.VCARD_TEXT: componentText,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20121112/64409e13/attachment-0001.html>
More information about the calendarserver-changes
mailing list