[CalendarServer-changes] [10086] CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/ datastore/sql.py
source_changes at macosforge.org
source_changes at macosforge.org
Mon Nov 26 15:17:46 PST 2012
Revision: 10086
http://trac.calendarserver.org//changeset/10086
Author: gaya at apple.com
Date: 2012-11-26 15:17:46 -0800 (Mon, 26 Nov 2012)
Log Message:
-----------
add abo.ownerGroup() and abo.ownerAddressBook() that cache results in attrs
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-26 22:06:16 UTC (rev 10085)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2012-11-26 23:17:46 UTC (rev 10086)
@@ -26,13 +26,12 @@
"AddressBookObject",
]
-from twext.enterprise.dal.syntax import \
- Delete, Insert, Len, Parameter, Update, Select, utcNowSQL
+from twext.enterprise.dal.syntax import Delete, Insert, Len, Parameter, \
+ Update, Select, utcNowSQL
from twext.python.clsprop import classproperty
from twext.web2.http_headers import MimeType
-
from twisted.internet.defer import inlineCallbacks, returnValue
from twisted.python import hashlib
from twistedcaldav import carddavxml, customxml
@@ -54,8 +53,8 @@
ADDRESSBOOK_HOME_METADATA_TABLE, ADDRESSBOOK_AND_ADDRESSBOOK_BIND, \
ADDRESSBOOK_OBJECT_AND_BIND_TABLE, \
ADDRESSBOOK_OBJECT_REVISIONS_AND_BIND_TABLE, \
- _ABO_KIND_PERSON, _ABO_KIND_GROUP, _ABO_KIND_RESOURCE, _ABO_KIND_LOCATION, \
- schema
+ _ABO_KIND_PERSON, _ABO_KIND_GROUP, _ABO_KIND_RESOURCE, \
+ _ABO_KIND_LOCATION, schema
from txdav.xml.rfc2518 import ResourceType
from uuid import uuid4
@@ -378,7 +377,6 @@
if self._resourceID == self._addressbook._resourceID:
raise DeleteOfShadowGroupNotAllowedError
- ownerGroup, ownerAddressBook = yield self._ownerGroupAndAddressBook()
# delete members table row for this object
aboMembers = schema.ABO_MEMBERS
@@ -389,16 +387,18 @@
).on(self._txn)
memberAddress = "urn:uuid:" + self._uid
+ ownerGroup = yield self.ownerGroup()
+ removingObject = None if ownerGroup else self
for groupID in [groupIDRow[0] for groupIDRow in groupIDRows]:
- if ownerGroup and groupID == ownerAddressBook._resourceID:
+ if ownerGroup and groupID == self._ownerAddressBookResourceID:
pass # convert delete in shared group to remove of membership only part 1
else:
- groupObject = yield ownerAddressBook.objectResourceWithID(groupID)
+ groupObject = yield self._addressbook.objectResourceWithID(groupID)
groupComponent = yield groupObject.component()
assert memberAddress in groupComponent.resourceMemberAddresses(), "remove: member %s not in %s" % (self.component(), groupComponent)
groupComponent.removeProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
#groupComponent.replaceProperty(Property("PRODID", vCardProductID))
- yield groupObject.updateDatabase(groupComponent, removingObject=None if ownerGroup else self)
+ yield groupObject.updateDatabase(groupComponent, removingObject=removingObject)
if ownerGroup:
pass # convert delete in shared group to remove of member only part 2
@@ -562,36 +562,6 @@
@inlineCallbacks
- def _ownerGroup(self):
- # find the owning address book
- if not self._addressbook.owned():
- for addressbook in (yield self._addressbook.ownerAddressBookHome().addressbooks()):
- ownerGroup = yield addressbook.objectResourceWithID(self._addressbook._resourceID)
- if ownerGroup:
- returnValue(ownerGroup)
- returnValue(None)
-
-
- @inlineCallbacks
- def _ownerAddressBook(self):
- # find the owning address book
- if self._addressbook.owned():
- returnValue(self._addressbook)
- else:
- ownerAddressBook = yield self._addressbook.ownerAddressBookHome().childWithID(self._addressbook._resourceID)
- if ownerAddressBook:
- returnValue(ownerAddressBook)
- else:
- returnValue(self._ownerGroup._addressbook)
-
-
- @inlineCallbacks
- def _shadowGroup(self):
- # find the owning address book
- returnValue((yield self._addressbook.objectResourceWithID(self._addressbook._resourceID)))
-
-
- @inlineCallbacks
def _ownerGroupAndAddressBook(self):
# find the owning address book
ownerGroup = None
@@ -606,9 +576,31 @@
if ownerGroup:
ownerAddressBook = addressbook
break
+
returnValue((ownerGroup, ownerAddressBook))
+ @inlineCallbacks
+ def ownerGroup(self):
+ if not hasattr(self, "_ownerGroup"):
+ self._ownerGroup, self._ownerAddressBook = yield self._ownerGroupAndAddressBook()
+ returnValue(self._ownerGroup)
+
+
+ @inlineCallbacks
+ def ownerAddressBook(self):
+
+ if not hasattr(self, "_ownerAddressBook"):
+ self._ownerGroup, self._ownerAddressBook = yield self._ownerGroupAndAddressBook()
+ returnValue(self._ownerAddressBook)
+
+
+ @inlineCallbacks
+ def shadowGroup(self):
+ ownerAddressBook = yield self.ownerAddressBook()
+ returnValue((yield ownerAddressBook.objectResourceWithID(ownerAddressBook._resourceID)))
+
+
@classmethod
def _resourceIDAndUIDForUIDsAndAddressBookResourceIDQuery(cls, uids): #@NoSelf
abo = schema.ADDRESSBOOK_OBJECT
@@ -619,6 +611,7 @@
abo.VCARD_UID.In(Parameter("uids", len(uids))))),
)
+
@inlineCallbacks
def updateDatabase(self, component, expand_until=None, reCreate=False,
inserting=False, removingObject=None):
@@ -660,14 +653,10 @@
# For shared groups: Non owner may NOT add group members not currently in group!
# (Or it would be possible to troll for unshared vCard UIDs and make them shared.)
- if inserting or self._kind == _ABO_KIND_GROUP:
-
- ownerGroup, ownerAddressBook = yield self._ownerGroupAndAddressBook()
- assert ownerAddressBook
+ if not self._ownerAddressBookResourceID:
+ ownerAddressBook = yield self.ownerAddressBook()
self._ownerAddressBookResourceID = ownerAddressBook._resourceID
- assert self._ownerAddressBookResourceID
-
if self._kind == _ABO_KIND_GROUP:
# get member ids
@@ -686,7 +675,7 @@
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 (yield self.ownerGroup()):
if foreignMemberAddrs or \
set(memberIDs) - set((yield self._addressbook._allAddressBookObjectIDs())):
raise GroupWithUnsharedAddressNotAllowedError
@@ -703,15 +692,16 @@
md5=self._md5,
kind=self._kind,
))[0]
- # add this vCard to shadow group and to shared group
+
+ # add this vCard to shared group and address book group
+ ownerGroup = yield self.ownerGroup()
groups = [ownerGroup] if ownerGroup else []
- shadowGroup = yield ownerAddressBook.objectResourceWithID(ownerAddressBook._resourceID)
- groups.append(shadowGroup)
+ groups.append((yield self.shadowGroup()))
memberAddress = "urn:uuid:" + self._uid
for group in groups:
groupComponent = yield group.component()
- assert memberAddress not in groupComponent.resourceMemberAddresses(), "updateDatabase(): member %s already in %s" % (component, groupComponent)
+ assert memberAddress not in groupComponent.resourceMemberAddresses(), ("updateDatabase(): member %s already in %s" % (component, groupComponent))
groupComponent.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberAddress))
#groupComponent.replaceProperty(Property("PRODID", vCardProductID))
yield group.updateDatabase(groupComponent)
@@ -741,8 +731,6 @@
if self._kind == _ABO_KIND_GROUP:
- assert self._ownerAddressBookResourceID
-
#get current members
currentMemberRows = yield Select([aboMembers.MEMBER_ID],
From=aboMembers,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20121126/d754c614/attachment.html>
More information about the calendarserver-changes
mailing list