[CalendarServer-changes] [10637] CalendarServer/branches/users/gaya/sharedgroups/txdav
source_changes at macosforge.org
source_changes at macosforge.org
Fri Feb 1 18:33:15 PST 2013
Revision: 10637
http://trac.calendarserver.org//changeset/10637
Author: gaya at apple.com
Date: 2013-02-01 18:33:15 -0800 (Fri, 01 Feb 2013)
Log Message:
-----------
checkpoint
Modified Paths:
--------------
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/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2013-02-01 23:57:42 UTC (rev 10636)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/carddav/datastore/sql.py 2013-02-02 02:33:15 UTC (rev 10637)
@@ -56,7 +56,7 @@
ADDRESSBOOK_OBJECT_REVISIONS_AND_BIND_TABLE, \
_ABO_KIND_PERSON, _ABO_KIND_GROUP, _ABO_KIND_RESOURCE, \
_ABO_KIND_LOCATION, schema, \
- _BIND_MODE_OWN, _BIND_MODE_DIRECT, _BIND_STATUS_ACCEPTED
+ _BIND_MODE_OWN, _BIND_MODE_WRITE, _BIND_STATUS_ACCEPTED
from txdav.xml.rfc2518 import ResourceType
from zope.interface.declarations import implements
@@ -465,23 +465,25 @@
# TODO: Simplify. Try to do one pass only.
# get sharedHomeIDs
- sharedABHomeIDs = set()
- sharedGroupHomeIDs = set()
+ sharedHomeIDToDataRowMap = {}
for dataRow in dataRows:
bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = dataRow[:6] #@UnusedVariable
if bindStatus != _BIND_MODE_OWN:
ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
- sharedABHomeIDs |= set([ownerHomeID])
+ sharedHomeIDToDataRowMap[ownerHomeID] = dataRow
# now get group rows:
- sharedGroupRows = yield AddressBookObject._childrenAndMetadataForHomeID.on(home._txn, homeID=home._resourceID)
- for sharedGroupRow in sharedGroupRows:
- bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = sharedGroupRow[:6] #@UnusedVariable
+ groupBindRows = yield AddressBookObject._childrenAndMetadataForHomeID.on(home._txn, homeID=home._resourceID)
+ for groupBindRow in groupBindRows:
+ bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = groupBindRow[:6] #@UnusedVariable
ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
- if ownerHomeID not in sharedABHomeIDs:
- if ownerHomeID not in sharedGroupHomeIDs:
- sharedGroupHomeIDs |= set([ownerHomeID])
- dataRows.append(sharedGroupRow)
+ if ownerHomeID in sharedHomeIDToDataRowMap:
+ if bindMode == _BIND_MODE_WRITE:
+ sharedHomeIDToDataRowMap[ownerHomeID][0] |= _BIND_MODE_WRITE # or together bind modes
+ else:
+ groupBindRow[3] = None # resourceName or bindName
+ groupBindRow[5] = None # bindMessage
+ sharedHomeIDToDataRowMap[ownerHomeID] = groupBindRow
if dataRows:
@@ -512,22 +514,13 @@
ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
ownerAddressBook = yield ownerHome.addressbook()
- resourceName = ownerAddressBook.shareeABName()
- if ownerHome in sharedGroupHomeIDs:
- child = cls(
- home=home,
- name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
- mode=_BIND_MODE_DIRECT, status=_BIND_STATUS_ACCEPTED,
- message=bindMessage,
- )
- else:
- child = cls(
- home=home,
- name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
- mode=bindMode, status=_BIND_STATUS_ACCEPTED,
- message=bindMessage,
- bindName=resourceName
- )
+ child = cls(
+ home=home,
+ name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
+ mode=bindMode, status=bindStatus,
+ message=bindMessage, ownerHome=ownerHome,
+ bindName=resourceName
+ )
for attr, value in zip(cls.metadataAttributes(), metadata):
setattr(child, attr, value)
@@ -581,6 +574,8 @@
if name == home.addressbookName():
returnValue((yield super(AddressBook, cls).objectWithName(home, name)))
+ #all shared address books now
+
rows = None
queryCacher = home._txn._queryCacher
ownerHome = None
@@ -598,20 +593,31 @@
# see if address book resource id in bind table
ownerAddressBook = yield ownerHome.addressbook()
- rows = yield cls._bindForResourceIDAndHomeID.on(
+ sharedABBindRows = yield cls._bindForResourceIDAndHomeID.on(
home._txn, resourceID=ownerAddressBook._resourceID, homeID=home._resourceID)
+ if sharedABBindRows:
+ bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = sharedABBindRows[0] #@UnusedVariable
+ if bindStatus == _BIND_STATUS_ACCEPTED:
+ sharedABBindRows[0].append(ownerHome._resourceID)
+ rows = [sharedABBindRows[0]]
- if rows:
- rows[0].extend([ownerHome._resourceID, False, ]) #
- else:
- # no whole address book binds, so check for group binds
- #FIXME: make into join that returns a boolean
- ownerABObjectIDs = yield cls._resourceIDsWithParent(ownerAddressBook)
- if ownerABObjectIDs:
- sharedRows = yield AddressBookObject._bindForGroupIDsAndHomeID(ownerABObjectIDs).on(home._txn, groupIDs=ownerABObjectIDs, homeID=home._resourceID)
- if sharedRows:
- sharedRows[0].extend([ownerHome._resourceID, True, ]) #
- rows = [sharedRows[0]]
+ # get group binds
+ #FIXME: use join
+ ownerABObjectIDRows = yield cls._resourceIDsWithParent(ownerAddressBook)
+ if ownerABObjectIDRows:
+ ownerABObjectIDs = [ownerABObjectIDRow[0] for ownerABObjectIDRow in ownerABObjectIDRows]
+ groupBindRows = yield AddressBookObject._bindForGroupIDsAndHomeID(ownerABObjectIDs).on(home._txn, groupIDs=ownerABObjectIDs, homeID=home._resourceID)
+ for groupBindRow in groupBindRows:
+ bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = groupBindRow #@UnusedVariable
+ if bindStatus == _BIND_STATUS_ACCEPTED:
+ if rows:
+ if bindMode == _BIND_MODE_WRITE:
+ rows[0][0] |= _BIND_MODE_WRITE
+ else:
+ groupBindRow[3] = None # resourceName or bindName
+ groupBindRow[5] = None # bindMessage
+ groupBindRow.append(ownerHome._resourceID)
+ rows = [groupBindRow]
if rows and queryCacher:
# Cache the result
@@ -620,20 +626,12 @@
if not rows:
returnValue(None)
- bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage, ownerHomeID, sharedGroupParent = rows[0] #@UnusedVariable
+ bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage, ownerHomeID = rows[0] #@UnusedVariable
ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
ownerAddressBook = yield ownerHome.addressbook()
- if sharedGroupParent:
- child = cls(
+ child = cls(
home=home,
name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
- mode=_BIND_MODE_DIRECT, status=_BIND_STATUS_ACCEPTED,
- message=None, ownerHome=ownerHome,
- )
- else:
- child = cls(
- home=home,
- name=resourceName, resourceID=ownerAddressBook._resourceID,
mode=bindMode, status=bindStatus,
message=bindMessage, ownerHome=ownerHome,
bindName=resourceName,
@@ -659,9 +657,9 @@
if bindName == home.addressbookName():
returnValue((yield cls.objectWithName(home, bindName)))
else:
- rows = yield cls._childForNameAndHomeID.on(home._txn, name=bindName, homeID=home._resourceID)
+ rows = yield cls._childBindForNameAndHomeID.on(home._txn, name=bindName, homeID=home._resourceID)
if not rows:
- rows = yield AddressBookObject._childForNameAndHomeID.on(home._txn, name=bindName, homeID=home._resourceID)
+ rows = yield AddressBookObject._childBindForNameAndHomeID.on(home._txn, name=bindName, homeID=home._resourceID)
if rows:
bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
@@ -687,30 +685,48 @@
"""
rows = yield cls._bindForResourceIDAndHomeID.on(
home._txn, resourceID=resourceID, homeID=home._resourceID)
+
+ if rows:
+ bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+ if bindMode == _BIND_MODE_OWN:
+ child = cls(
+ home=home,
+ name=resourceName, resourceID=resourceID,
+ mode=bindMode, status=bindStatus,
+ message=bindMessage, ownerHome=home,
+ )
+ yield child.initFromStore()
+ returnValue(child)
+
+ ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
+ ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
+ ownerAddressBook = yield ownerHome.addressbook()
+
+ ownerABObjectIDRows = yield cls._resourceIDsWithParent(ownerAddressBook)
+ if ownerABObjectIDRows:
+ ownerABObjectIDs = [ownerABObjectIDRow[0] for ownerABObjectIDRow in ownerABObjectIDRows]
+ groupBindRows = yield AddressBookObject._bindForGroupIDsAndHomeID(ownerABObjectIDs).on(home._txn, groupIDs=ownerABObjectIDs, homeID=home._resourceID)
+ for groupBindRow in groupBindRows:
+ bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = groupBindRow #@UnusedVariable
+ if rows:
+ if bindMode == _BIND_MODE_WRITE:
+ rows[0][0] |= _BIND_MODE_WRITE
+ else:
+ groupBindRow[3] = None # resourceName or bindName
+ groupBindRow[5] = None # bindMessage
+ rows = [groupBindRow]
+
if not rows:
returnValue(None)
bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
-
- if bindMode == _BIND_MODE_OWN:
- child = cls(
- home=home,
- name=resourceName, resourceID=resourceID,
- mode=bindMode, status=bindStatus,
- message=bindMessage, ownerHome=home,
- )
- else:
- ownerHomeID = yield cls.ownerHomeID(home._txn, resourceID)
- ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
- ownerAddressBook = yield ownerHome.addressbook()
- child = cls(
- home=home,
- name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
- mode=bindMode, status=_BIND_STATUS_ACCEPTED,
- message=bindMessage, ownerHome=ownerHome,
- bindName=resourceName
- )
-
+ child = cls(
+ home=home,
+ name=ownerAddressBook.shareeABName(), resourceID=ownerAddressBook._resourceID,
+ mode=bindMode, status=bindStatus,
+ message=bindMessage, ownerHome=ownerHome,
+ bindName=resourceName
+ )
yield child.initFromStore()
returnValue(child)
@@ -748,40 +764,6 @@
)
- @inlineCallbacks
- def shareWith(self, shareeHome, mode, status=None, message=None):
- """
- Share this (owned) L{CommonHomeChild} with another home.
-
- @param shareeHome: The home of the sharee.
- @type shareeHome: L{CommonHome}
-
- @param mode: The sharing mode; L{_BIND_MODE_READ} or
- L{_BIND_MODE_WRITE} or L{_BIND_MODE_DIRECT}
- @type mode: L{str}
-
- @param status: The sharing status; L{_BIND_STATUS_INVITED} or
- L{_BIND_STATUS_ACCEPTED}
- @type mode: L{str}
-
- @param message: The proposed message to go along with the share, which
- will be used as the default display name.
- @type mode: L{str}
-
- @return: the name of the shared calendar in the new calendar home.
- @rtype: L{str}
- """
-
- yield self._shareWith(shareeHome, mode, status=status, message=message)
-
- # uses query cacher
- shareeAddressBook = yield shareeHome.addressbookWithName(self.shareeABName())
- # alt: does not use query cacheer
- # sharedAddressBook = yield shareeNome.objectWithID(self._resourceID)
-
- returnValue(shareeAddressBook)
-
-
'''
@classmethod
@inlineCallbacks
@@ -900,10 +882,10 @@
@return: an iterable of C{str}s.
"""
names = set()
- rows = yield cls._bindForHomeID.on(
+ rows = yield cls._childBindForHomeID.on(
home._txn, homeID=home._resourceID
)
- rows.extend((yield AddressBookObject._bindForHomeID.on(
+ rows.extend((yield AddressBookObject._childBindForHomeID.on(
home._txn, homeID=home._resourceID
)))
for bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage in rows: #@UnusedVariable
@@ -1614,7 +1596,10 @@
def ownerHome(self):
return self._addressbook.ownerHome()
+ def viewerHome(self):
+ return self._addressbook.viewerHome()
+
def notifyChanged(self):
self._addressbook.notifyChanged()
@@ -1721,11 +1706,13 @@
@rtype: L{str}
"""
- yield self._shareWith(shareeHome, mode, status=status, message=message)
+ bindName = yield self._shareWith(shareeHome, mode, status=status, message=message)
addressbook = self.addressbook()
- shareeAddressBook = yield shareeHome.addressbookWithName(addressbook.shareeABName())
- sharedGroup = yield shareeAddressBook.objectWithID(self._resourceID)
+ shareeAddressBook = yield shareeHome.childWithID(addressbook._resourceID)
+ sharedGroup = yield shareeAddressBook.objectResourceWithID(self._resourceID)
+ #FIXME
+ sharedGroup._bindName = bindName
returnValue(sharedGroup)
@@ -1736,7 +1723,7 @@
if hasattr(self, "_bindMode"):
return self._bindMode
else:
- return self._addresssBook.shareMode()
+ return self._addressbook.shareMode()
def shareStatus(self):
@@ -1746,7 +1733,7 @@
if hasattr(self, "_bindStatus"):
return self._bindStatus
else:
- return self._addresssBook.shareStatus()
+ return self._addressbook.shareStatus()
def shareMessage(self):
@@ -1756,7 +1743,7 @@
if hasattr(self, "_bindMessage"):
return self._bindMessage
else:
- return self._addresssBook.shareMessage()
+ return self._addressbook.shareMessage()
def shareUID(self):
@@ -1766,15 +1753,14 @@
if hasattr(self, "_bindName"):
return self._bindName
else:
- return self._addresssBook.shareUID()
+ return self._addressbook.shareUID()
+
@classmethod
def _bindForGroupIDsAndHomeID(cls, groupIDs): #@NoSelf
bind = cls._bindSchema
return cls._bindFor(bind.RESOURCE_ID.In(Parameter("groupIDs", len(groupIDs)))
.And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
- .And(bind.BIND_STATUS == _BIND_STATUS_ACCEPTED)
- .And(bind.BIND_MODE != _BIND_MODE_OWN)
)
Modified: CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py 2013-02-01 23:57:42 UTC (rev 10636)
+++ CalendarServer/branches/users/gaya/sharedgroups/txdav/common/datastore/sql.py 2013-02-02 02:33:15 UTC (rev 10637)
@@ -2398,16 +2398,11 @@
@rtype: L{CommonHomeChild}
"""
- sharedName = yield self._shareWith(shareeHome, mode, status=status, message=message)
+ yield self._shareWith(shareeHome, mode, status=status, message=message)
+ child = yield shareeHome.childWithID(self._resourceID)
+ returnValue(child)
- if status == _BIND_STATUS_ACCEPTED:
- shareeHomeChild = yield shareeHome.childWithName(sharedName)
- else:
- shareeHomeChild = yield shareeHome.invitedChildWithName(sharedName)
- returnValue(shareeHomeChild)
-
-
@classmethod
def _updateBindColumnsQuery(cls, columnMap): #@NoSelf
bind = cls._bindSchema
@@ -2644,7 +2639,7 @@
@classproperty
- def _childForNameAndHomeID(cls): #@NoSelf
+ def _childBindForNameAndHomeID(cls): #@NoSelf
bind = cls._bindSchema
return cls._bindFor((bind.RESOURCE_NAME == Parameter("name"))
.And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
@@ -2688,12 +2683,25 @@
return self.name()
@classproperty
- def _bindForHomeID(cls): #@NoSelf
+ def _childBindForHomeID(cls): #@NoSelf
bind = cls._bindSchema
return cls._bindFor((bind.HOME_RESOURCE_ID == Parameter("homeID"))
.And(bind.BIND_STATUS == _BIND_STATUS_ACCEPTED))
+ @classproperty
+ def _bindForResourceIDAndHomeID(cls): #@NoSelf
+ """
+ DAL query that looks up home child names / bind modes by home child
+ resource ID and home resource ID.
+ """
+ bind = cls._bindSchema
+ return cls._bindFor((bind.RESOURCE_ID == Parameter("resourceID"))
+ .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
+ )
+
+
+
class CommonHomeChild(LoggingMixIn, FancyEqMixin, _SharedSyncLogic, HomeChildBase, SharingMixIn):
"""
Common ancestor class of AddressBooks and Calendars.
@@ -2788,7 +2796,7 @@
@return: an iterable of C{str}s.
"""
# FIXME: tests don't cover this as directly as they should.
- rows = yield cls._bindsForHomeID.on(
+ rows = yield cls._childBindForHomeID.on(
home._txn, homeID=home._resourceID
)
names = [row[3] for row in rows]
@@ -2985,15 +2993,6 @@
returnValue(child)
- @classproperty
- def _childForNameAndHomeID(cls): #@NoSelf
- 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)
- )
-
-
@classmethod
@inlineCallbacks
def objectWithName(cls, home, name):
@@ -3019,7 +3018,7 @@
if rows is None:
# No cached copy
- rows = yield cls._childForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
+ rows = yield cls._childBindForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
if rows:
bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
@@ -3054,18 +3053,6 @@
returnValue(child)
- @classproperty
- def _bindForResourceIDAndHomeID(cls): #@NoSelf
- """
- DAL query that looks up home child names / bind modes by home child
- resource ID and home resource ID.
- """
- bind = cls._bindSchema
- return cls._bindFor((bind.RESOURCE_ID == Parameter("resourceID"))
- .And(bind.HOME_RESOURCE_ID == Parameter("homeID"))
- )
-
-
@classmethod
@inlineCallbacks
def objectWithID(cls, home, resourceID):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130201/5c2199fd/attachment-0001.html>
More information about the calendarserver-changes
mailing list