[CalendarServer-changes] [8907] CalendarServer/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Sat Mar 17 00:27:16 PDT 2012
Revision: 8907
http://trac.macosforge.org/projects/calendarserver/changeset/8907
Author: wsanchez at apple.com
Date: 2012-03-17 00:27:16 -0700 (Sat, 17 Mar 2012)
Log Message:
-----------
Move twext.web2.dav.davxml to txdav.xml.element.
Modified Paths:
--------------
CalendarServer/trunk/twext/web2/dav/__init__.py
CalendarServer/trunk/twext/web2/dav/auth.py
CalendarServer/trunk/twext/web2/dav/http.py
CalendarServer/trunk/twext/web2/dav/method/prop_common.py
CalendarServer/trunk/twext/web2/dav/method/report_expand.py
CalendarServer/trunk/twext/web2/dav/method/report_principal_match.py
CalendarServer/trunk/twext/web2/dav/method/report_principal_property_search.py
CalendarServer/trunk/twext/web2/dav/resource.py
CalendarServer/trunk/twext/web2/dav/test/test_acl.py
CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py
CalendarServer/trunk/twext/web2/dav/test/util.py
CalendarServer/trunk/twext/web2/dav/util.py
CalendarServer/trunk/twext/web2/dav/xattrprops.py
CalendarServer/trunk/twistedcaldav/__init__.py
CalendarServer/trunk/twistedcaldav/caldavxml.py
CalendarServer/trunk/twistedcaldav/carddavxml.py
CalendarServer/trunk/twistedcaldav/customxml.py
CalendarServer/trunk/twistedcaldav/extensions.py
CalendarServer/trunk/twistedcaldav/method/report_common.py
CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py
CalendarServer/trunk/twistedcaldav/mkcolxml.py
CalendarServer/trunk/twistedcaldav/resource.py
CalendarServer/trunk/twistedcaldav/sharing.py
CalendarServer/trunk/twistedcaldav/test/test_extensions.py
CalendarServer/trunk/twistedcaldav/test/test_props.py
CalendarServer/trunk/twistedcaldav/test/test_resource.py
CalendarServer/trunk/twistedcaldav/test/test_upgrade.py
CalendarServer/trunk/twistedcaldav/timezonexml.py
CalendarServer/trunk/twistedcaldav/upgrade.py
CalendarServer/trunk/txdav/base/propertystore/sql.py
CalendarServer/trunk/txdav/base/propertystore/xattr.py
CalendarServer/trunk/txdav/caldav/datastore/test/common.py
CalendarServer/trunk/txdav/carddav/datastore/test/common.py
CalendarServer/trunk/txdav/xml/__init__.py
CalendarServer/trunk/txdav/xml/base.py
CalendarServer/trunk/txdav/xml/element.py
CalendarServer/trunk/txdav/xml/extensions.py
CalendarServer/trunk/txdav/xml/parser_sax.py
CalendarServer/trunk/txdav/xml/rfc2518.py
CalendarServer/trunk/txdav/xml/rfc3253.py
CalendarServer/trunk/txdav/xml/rfc3744.py
CalendarServer/trunk/txdav/xml/rfc4331.py
CalendarServer/trunk/txdav/xml/rfc5842.py
CalendarServer/trunk/txdav/xml/test/test_base.py
CalendarServer/trunk/txdav/xml/test/test_xml.py
Removed Paths:
-------------
CalendarServer/trunk/twext/web2/dav/davxml.py
Modified: CalendarServer/trunk/twext/web2/dav/__init__.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/__init__.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/__init__.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -52,5 +52,4 @@
"xattrprops",
]
-from twext.web2.dav import davxml
-
+import txdav.xml.element as davxml
Modified: CalendarServer/trunk/twext/web2/dav/auth.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/auth.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/auth.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -1,10 +1,24 @@
-from zope.interface import implements, Interface
-from twisted.internet import defer
-from twisted.cred import checkers, error, portal
-from twext.web2.resource import WrapperResource
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import twisted_private_namespace
-from txdav.xml.element import registerElement
+##
+# Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+##
__all__ = [
"IPrincipal",
@@ -14,6 +28,14 @@
"AuthenticationWrapper",
]
+from zope.interface import implements, Interface
+from twisted.internet import defer
+from twisted.cred import checkers, error, portal
+from twext.web2.resource import WrapperResource
+from txdav.xml.element import twisted_private_namespace, registerElement
+from txdav.xml.element import WebDAVTextElement, Principal, HRef
+
+
class AuthenticationWrapper(WrapperResource):
def __init__(self, resource, portal, credentialFactories, loginInterfaces):
"""
@@ -48,7 +70,7 @@
def requestAvatar(self, avatarId, mind, *interfaces):
if IPrincipal in interfaces:
- return IPrincipal, davxml.Principal(davxml.HRef(avatarId[0])), davxml.Principal(davxml.HRef(avatarId[1]))
+ return IPrincipal, Principal(HRef(avatarId[0])), Principal(HRef(avatarId[1]))
raise NotImplementedError("Only IPrincipal interface is supported")
@@ -109,7 +131,7 @@
# Utilities
##
-class TwistedPasswordProperty (davxml.WebDAVTextElement):
+class TwistedPasswordProperty (WebDAVTextElement):
namespace = twisted_private_namespace
name = "password"
Deleted: CalendarServer/trunk/twext/web2/dav/davxml.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/davxml.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/davxml.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -1,73 +0,0 @@
-##
-# Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-##
-
-"""
-WebDAV XML Support.
-
-This module provides XML utilities for use with WebDAV.
-
-This API is considered private to static.py and is therefore subject to
-change.
-
-See RFC 2518: http://www.ietf.org/rfc/rfc2518.txt (WebDAV)
-See RFC 3253: http://www.ietf.org/rfc/rfc3253.txt (WebDAV + Versioning)
-See RFC 3744: http://www.ietf.org/rfc/rfc3744.txt (WebDAV ACLs)
-"""
-
-#
-# Import all XML element definitions
-#
-
-from txdav.xml.base import *
-from txdav.xml.parser import *
-from txdav.xml.rfc2518 import *
-from txdav.xml.rfc3253 import *
-from txdav.xml.rfc3744 import *
-from txdav.xml.rfc4331 import *
-from txdav.xml.rfc5842 import *
-from txdav.xml.extensions import *
-
-#
-# Register all XML elements with the parser
-#
-
-from txdav.xml import base as b
-from txdav.xml import parser as p
-from txdav.xml import rfc2518 as r1
-from txdav.xml import rfc3253 as r2
-from txdav.xml import rfc3744 as r3
-from txdav.xml import rfc4331 as r4
-from txdav.xml import rfc5842 as r5
-from txdav.xml import extensions as e
-
-from txdav.xml.element import registerElements
-
-__all__ = (
- registerElements(b) +
- registerElements(p) +
- registerElements(r1) +
- registerElements(r2) +
- registerElements(r3) +
- registerElements(r4) +
- registerElements(r5) +
- registerElements(e)
-)
Modified: CalendarServer/trunk/twext/web2/dav/http.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/http.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/http.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -47,15 +47,15 @@
from twext.web2.iweb import IResponse
from twext.web2.http import Response, HTTPError, StatusResponse
from twext.web2.http_headers import MimeType
-from twext.web2.dav import davxml
from twext.web2.dav.util import joinURL
+from txdav.xml import element
log = Logger()
class ErrorResponse(Response):
"""
- A L{Response} object which contains a status code and a L{davxml.Error}
+ A L{Response} object which contains a status code and a L{element.Error}
element.
Renders itself as a DAV:error XML document.
"""
@@ -65,7 +65,7 @@
def __init__(self, code, error, description=None):
"""
@param code: a response code.
- @param error: an L{davxml.WebDAVElement} identifying the error, or a
+ @param error: an L{WebDAVElement} identifying the error, or a
tuple C{(namespace, name)} with which to create an empty element
denoting the error. (The latter is useful in the case of
preconditions ans postconditions, not all of which have defined
@@ -75,15 +75,15 @@
"""
if type(error) is tuple:
xml_namespace, xml_name = error
- error = davxml.WebDAVUnknownElement()
+ error = element.WebDAVUnknownElement()
error.namespace = xml_namespace
error.name = xml_name
self.description = description
if self.description:
- output = davxml.Error(error, davxml.ErrorDescription(self.description)).toxml()
+ output = element.Error(error, element.ErrorDescription(self.description)).toxml()
else:
- output = davxml.Error(error).toxml()
+ output = element.Error(error).toxml()
Response.__init__(self, code=code, stream=output)
@@ -114,10 +114,10 @@
uri = joinURL(base_uri, subpath)
for p in privileges:
- denials.append(davxml.Resource(davxml.HRef(uri),
- davxml.Privilege(p)))
+ denials.append(element.Resource(element.HRef(uri),
+ element.Privilege(p)))
- super(NeedPrivilegesResponse, self).__init__(responsecode.FORBIDDEN, davxml.NeedPrivileges(*denials))
+ super(NeedPrivilegesResponse, self).__init__(responsecode.FORBIDDEN, element.NeedPrivileges(*denials))
class MultiStatusResponse (Response):
"""
@@ -126,10 +126,10 @@
"""
def __init__(self, xml_responses):
"""
- @param xml_responses: an interable of davxml.Response objects.
+ @param xml_responses: an interable of element.Response objects.
"""
Response.__init__(self, code=responsecode.MULTI_STATUS,
- stream=davxml.MultiStatus(*xml_responses).toxml())
+ stream=element.MultiStatus(*xml_responses).toxml())
self.headers.setHeader("content-type", MimeType("text", "xml"))
@@ -181,13 +181,13 @@
uri = path[self.path_basename_len:]
children = []
- children.append(davxml.HRef(uri))
- children.append(davxml.Status.fromResponseCode(code))
+ children.append(element.HRef(uri))
+ children.append(element.Status.fromResponseCode(code))
if error is not None:
children.append(error)
if message is not None:
- children.append(davxml.ResponseDescription(message))
- self.responses.append(davxml.StatusResponse(*children))
+ children.append(element.ResponseDescription(message))
+ self.responses.append(element.StatusResponse(*children))
def response(self):
"""
@@ -237,19 +237,19 @@
if len(property.children) > 0:
# Re-instantiate as empty element.
- property = davxml.WebDAVUnknownElement.withName(property.namespace, property.name)
+ property = element.WebDAVUnknownElement.withName(property.namespace, property.name)
if code > 400: # Error codes only
log.err("Error during %s for %s: %s" % (self.method, property, message))
children = []
- children.append(davxml.PropertyContainer(property))
- children.append(davxml.Status.fromResponseCode(code))
+ children.append(element.PropertyContainer(property))
+ children.append(element.Status.fromResponseCode(code))
if error is not None:
children.append(error)
if message is not None:
- children.append(davxml.ResponseDescription(message))
- self.propstats.append(davxml.PropertyStatus(*children))
+ children.append(element.ResponseDescription(message))
+ self.propstats.append(element.PropertyStatus(*children))
def error(self):
"""
@@ -260,32 +260,32 @@
changed_status = False
newchildren = []
for child in propstat.children:
- if isinstance(child, davxml.Status) and (child.code / 100 == 2):
+ if isinstance(child, element.Status) and (child.code / 100 == 2):
# Change the code
- newchildren.append(davxml.Status.fromResponseCode(responsecode.FAILED_DEPENDENCY))
+ newchildren.append(element.Status.fromResponseCode(responsecode.FAILED_DEPENDENCY))
changed_status = True
- elif changed_status and isinstance(child, davxml.ResponseDescription):
- newchildren.append(davxml.ResponseDescription(responsecode.RESPONSES[responsecode.FAILED_DEPENDENCY]))
+ elif changed_status and isinstance(child, element.ResponseDescription):
+ newchildren.append(element.ResponseDescription(responsecode.RESPONSES[responsecode.FAILED_DEPENDENCY]))
else:
newchildren.append(child)
- self.propstats[index] = davxml.PropertyStatus(*newchildren)
+ self.propstats[index] = element.PropertyStatus(*newchildren)
def response(self):
"""
Generate a response from the responses contained in the queue or, if
there are no such responses, return the C{success_response} provided to
L{__init__}.
- @return: a L{davxml.PropertyStatusResponse}.
+ @return: a L{element.PropertyStatusResponse}.
"""
if self.propstats:
- return davxml.PropertyStatusResponse(
- davxml.HRef(self.uri),
+ return element.PropertyStatusResponse(
+ element.HRef(self.uri),
*self.propstats
)
else:
- return davxml.StatusResponse(
- davxml.HRef(self.uri),
- davxml.Status.fromResponseCode(self.success_response)
+ return element.StatusResponse(
+ element.HRef(self.uri),
+ element.Status.fromResponseCode(self.success_response)
)
##
@@ -331,7 +331,7 @@
def errorForFailure(failure):
if failure.check(HTTPError) and isinstance(failure.value.response, ErrorResponse):
- return davxml.Error(failure.value.response.error)
+ return element.Error(failure.value.response.error)
else:
return None
Modified: CalendarServer/trunk/twext/web2/dav/method/prop_common.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/prop_common.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/method/prop_common.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -13,8 +13,7 @@
from twext.python.log import Logger
from twext.web2 import responsecode
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVElement
+from txdav.xml import element
from twext.web2.dav.http import statusForFailure
from twext.web2.dav.method.propfind import propertyName
@@ -33,20 +32,20 @@
for status in properties_by_status:
properties = properties_by_status[status]
if properties:
- xml_status = davxml.Status.fromResponseCode(status)
- xml_container = davxml.PropertyContainer(*properties)
- xml_propstat = davxml.PropertyStatus(xml_container, xml_status)
+ xml_status = element.Status.fromResponseCode(status)
+ xml_container = element.PropertyContainer(*properties)
+ xml_propstat = element.PropertyStatus(xml_container, xml_status)
propstats.append(xml_propstat)
if propstats:
- responses.append(davxml.PropertyStatusResponse(href, *propstats))
+ responses.append(element.PropertyStatusResponse(href, *propstats))
else:
responses.append(
- davxml.StatusResponse(
+ element.StatusResponse(
href,
- davxml.Status.fromResponseCode(responsecode.OK),
+ element.Status.fromResponseCode(responsecode.OK),
)
)
@@ -77,7 +76,7 @@
}
for property in props:
- if isinstance(property, WebDAVElement):
+ if isinstance(property, element.WebDAVElement):
qname = property.qname()
else:
qname = property
Modified: CalendarServer/trunk/twext/web2/dav/method/report_expand.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/report_expand.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/method/report_expand.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -32,8 +32,8 @@
from twext.python.log import Logger
from twext.web2 import responsecode
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import dav_namespace
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
from twext.web2.dav.http import statusForFailure, MultiStatusResponse
from twext.web2.dav.method import prop_common
from twext.web2.dav.method.propfind import propertyName
@@ -52,9 +52,9 @@
TODO: for simplicity we will only support one level of expansion.
"""
# Verify root element
- if not isinstance(expand_property, davxml.ExpandProperty):
+ if not isinstance(expand_property, element.ExpandProperty):
raise ValueError("%s expected as root element, not %s."
- % (davxml.ExpandProperty.sname(), expand_property.sname()))
+ % (element.ExpandProperty.sname(), expand_property.sname()))
# Only handle Depth: 0
depth = request.headers.getHeader("depth", "0")
@@ -102,27 +102,27 @@
prop = (yield self.readProperty(qname, request))
# Form the PROPFIND-style DAV:prop element we need later
- props_to_return = davxml.PropertyContainer(*properties[qname])
+ props_to_return = element.PropertyContainer(*properties[qname])
# Now dereference any HRefs
responses = []
for href in prop.children:
- if isinstance(href, davxml.HRef):
+ if isinstance(href, element.HRef):
# Locate the Href resource and its parent
resource_uri = str(href)
child = (yield request.locateResource(resource_uri))
if not child or not child.exists():
- responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.NOT_FOUND)))
+ responses.append(element.StatusResponse(href, element.Status.fromResponseCode(responsecode.NOT_FOUND)))
continue
parent = (yield request.locateResource(parentForURL(resource_uri)))
# Check privileges on parent - must have at least DAV:read
try:
- yield parent.checkPrivileges(request, (davxml.Read(),))
+ yield parent.checkPrivileges(request, (element.Read(),))
except AccessDeniedError:
- responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.FORBIDDEN)))
+ responses.append(element.StatusResponse(href, element.Status.fromResponseCode(responsecode.FORBIDDEN)))
continue
# Cache the last parent's inherited aces for checkPrivileges optimization
@@ -135,9 +135,9 @@
# Check privileges - must have at least DAV:read
try:
- yield child.checkPrivileges(request, (davxml.Read(),), inherited_aces=filteredaces)
+ yield child.checkPrivileges(request, (element.Read(),), inherited_aces=filteredaces)
except AccessDeniedError:
- responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.FORBIDDEN)))
+ responses.append(element.StatusResponse(href, element.Status.fromResponseCode(responsecode.FORBIDDEN)))
continue
# Now retrieve all the requested properties on the HRef resource
@@ -163,11 +163,11 @@
# Build the overall response
propstats = [
- davxml.PropertyStatus(
- davxml.PropertyContainer(*properties_by_status[status]),
- davxml.Status.fromResponseCode(status)
+ element.PropertyStatus(
+ element.PropertyContainer(*properties_by_status[status]),
+ element.Status.fromResponseCode(status)
)
for status in properties_by_status if properties_by_status[status]
]
- returnValue(MultiStatusResponse((davxml.PropertyStatusResponse(davxml.HRef(request.uri), *propstats),)))
+ returnValue(MultiStatusResponse((element.PropertyStatusResponse(element.HRef(request.uri), *propstats),)))
Modified: CalendarServer/trunk/twext/web2/dav/method/report_principal_match.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/report_principal_match.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/method/report_principal_match.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -35,8 +35,8 @@
from twext.python.log import Logger
from twext.web2 import responsecode
from twext.web2.http import StatusResponse, HTTPError
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import dav_namespace
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
from twext.web2.dav.method import prop_common
from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
@@ -51,9 +51,9 @@
Generate a principal-match REPORT. (RFC 3744, section 9.3)
"""
# Verify root element
- if not isinstance(principal_match, davxml.PrincipalMatch):
+ if not isinstance(principal_match, element.PrincipalMatch):
raise ValueError("%s expected as root element, not %s."
- % (davxml.PrincipalMatch.sname(), principal_match.sname()))
+ % (element.PrincipalMatch.sname(), principal_match.sname()))
# Only handle Depth: 0
depth = request.headers.getHeader("depth", "0")
@@ -130,7 +130,7 @@
d = waitForDeferred(prop_common.responseForHref(
request,
responses,
- davxml.HRef.fromString(uri),
+ element.HRef.fromString(uri),
principal,
propertiesForResource,
propElement
@@ -147,7 +147,7 @@
children = []
d = waitForDeferred(self.findChildren("infinity", request, lambda x, y: children.append((x,y)),
- privileges=(davxml.Read(),), inherited_aces=filteredaces))
+ privileges=(element.Read(),), inherited_aces=filteredaces))
yield d
d.getResult()
@@ -159,7 +159,7 @@
prop = prop.getResult()
if prop: prop.removeWhitespaceNodes()
- if prop and len(prop.children) == 1 and isinstance(prop.children[0], davxml.HRef):
+ if prop and len(prop.children) == 1 and isinstance(prop.children[0], element.HRef):
# Find principal associated with this property and test it
principal = waitForDeferred(request.locateResource(str(prop.children[0])))
yield principal
@@ -178,7 +178,7 @@
d = waitForDeferred(prop_common.responseForHref(
request,
responses,
- davxml.HRef.fromString(uri),
+ element.HRef.fromString(uri),
child,
propertiesForResource,
propElement
@@ -194,7 +194,7 @@
log.err("Too many matching components in principal-match report")
raise HTTPError(ErrorResponse(
responsecode.FORBIDDEN,
- davxml.NumberOfMatchesWithinLimits()
+ element.NumberOfMatchesWithinLimits()
))
yield MultiStatusResponse(responses)
Modified: CalendarServer/trunk/twext/web2/dav/method/report_principal_property_search.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/report_principal_property_search.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/method/report_principal_property_search.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -34,8 +34,9 @@
from twext.python.log import Logger
from twext.web2 import responsecode
from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import dav_namespace
+from txdav.xml.base import PCDATAElement
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
from twext.web2.dav.method import prop_common
from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
@@ -51,9 +52,9 @@
"""
# Verify root element
- if not isinstance(principal_property_search, davxml.PrincipalPropertySearch):
+ if not isinstance(principal_property_search, element.PrincipalPropertySearch):
raise ValueError("%s expected as root element, not %s."
- % (davxml.PrincipalPropertySearch.sname(), principal_property_search.sname()))
+ % (element.PrincipalPropertySearch.sname(), principal_property_search.sname()))
# Only handle Depth: 0
depth = request.headers.getHeader("depth", "0")
@@ -73,9 +74,9 @@
elif child.qname() == (dav_namespace, "apply-to-principal-collection-set"):
applyTo = True
elif child.qname() == (dav_namespace, "property-search"):
- props = child.childOfType(davxml.PropertyContainer)
+ props = child.childOfType(element.PropertyContainer)
props.removeWhitespaceNodes()
- match = child.childOfType(davxml.Match)
+ match = child.childOfType(element.Match)
propertySearches.append((props.children, str(match).lower()))
def nodeMatch(node, match):
@@ -88,7 +89,7 @@
"""
node.removeWhitespaceNodes()
for child in node.children:
- if isinstance(child, davxml.PCDATAElement):
+ if isinstance(child, PCDATAElement):
comp = str(child).lower()
if comp.find(match) != -1:
return True
@@ -152,7 +153,7 @@
children = []
d = waitForDeferred(resource.findChildren("infinity", request, lambda x, y: children.append((x,y)),
- privileges=(davxml.Read(),), inherited_aces=filteredaces))
+ privileges=(element.Read(),), inherited_aces=filteredaces))
yield d
d.getResult()
@@ -170,7 +171,7 @@
d = waitForDeferred(prop_common.responseForHref(
request,
responses,
- davxml.HRef.fromString(uri),
+ element.HRef.fromString(uri),
child,
propertiesForResource,
propElement
@@ -182,7 +183,7 @@
log.err("Too many matching components in prinicpal-property-search report")
raise HTTPError(ErrorResponse(
responsecode.FORBIDDEN,
- davxml.NumberOfMatchesWithinLimits()
+ element.NumberOfMatchesWithinLimits()
))
yield MultiStatusResponse(responses)
Modified: CalendarServer/trunk/twext/web2/dav/resource.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/resource.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/resource.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -70,11 +70,13 @@
from twext.web2.dav.noneprops import NonePropertyStore
from twext.web2.dav.util import unimplemented, parentForURL, joinURL
from twext.web2.dav.auth import PrincipalCredentials
-from twext.web2.dav import davxml
-from txdav.xml.base import dav_namespace
-from txdav.xml.base import twisted_dav_namespace, twisted_private_namespace
+from txdav.xml import element
+from txdav.xml.element import WebDAVElement, WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import dav_namespace
+from txdav.xml.element import twisted_dav_namespace, twisted_private_namespace
from txdav.xml.element import registerElement, lookupElement
+
log = Logger()
@@ -174,8 +176,8 @@
@return: a dict-like object from which one can read and to
which one can write dead properties. Keys are qname
tuples (i.e. C{(namespace, name)}) as returned by
- L{davxml.WebDAVElement.qname()} and values are
- L{davxml.WebDAVElement} instances.
+ L{WebDAVElement.qname()} and values are
+ L{WebDAVElement} instances.
"""
if not hasattr(self, "_dead_properties"):
self._dead_properties = NonePropertyStore(self)
@@ -228,20 +230,20 @@
if self.deadProperties().contains(qname):
returnValue(self.deadProperties().get(qname))
if self.isCollection():
- returnValue(davxml.ResourceType.collection) #@UndefinedVariable
- returnValue(davxml.ResourceType.empty) #@UndefinedVariable
+ returnValue(element.ResourceType.collection) #@UndefinedVariable
+ returnValue(element.ResourceType.empty) #@UndefinedVariable
if name == "getetag":
etag = (yield self.etag())
if etag is None:
returnValue(None)
- returnValue(davxml.GETETag(etag.generate()))
+ returnValue(element.GETETag(etag.generate()))
if name == "getcontenttype":
mimeType = self.contentType()
if mimeType is None:
returnValue(None)
- returnValue(davxml.GETContentType(generateContentType(mimeType)))
+ returnValue(element.GETContentType(generateContentType(mimeType)))
if name == "getcontentlength":
length = self.contentLength()
@@ -249,43 +251,43 @@
# TODO: really we should "render" the resource and
# determine its size from that but for now we just
# return an empty element.
- returnValue(davxml.GETContentLength(""))
+ returnValue(element.GETContentLength(""))
else:
- returnValue(davxml.GETContentLength(str(length)))
+ returnValue(element.GETContentLength(str(length)))
if name == "getlastmodified":
lastModified = self.lastModified()
if lastModified is None:
returnValue(None)
- returnValue(davxml.GETLastModified.fromDate(lastModified))
+ returnValue(element.GETLastModified.fromDate(lastModified))
if name == "creationdate":
creationDate = self.creationDate()
if creationDate is None:
returnValue(None)
- returnValue(davxml.CreationDate.fromDate(creationDate))
+ returnValue(element.CreationDate.fromDate(creationDate))
if name == "displayname":
displayName = self.displayName()
if displayName is None:
returnValue(None)
- returnValue(davxml.DisplayName(displayName))
+ returnValue(element.DisplayName(displayName))
if name == "supportedlock":
- returnValue(davxml.SupportedLock(
- davxml.LockEntry(
- davxml.LockScope.exclusive, #@UndefinedVariable
- davxml.LockType.write #@UndefinedVariable
+ returnValue(element.SupportedLock(
+ element.LockEntry(
+ element.LockScope.exclusive, #@UndefinedVariable
+ element.LockType.write #@UndefinedVariable
),
- davxml.LockEntry(
- davxml.LockScope.shared, #@UndefinedVariable
- davxml.LockType.write #@UndefinedVariable
+ element.LockEntry(
+ element.LockScope.shared, #@UndefinedVariable
+ element.LockType.write #@UndefinedVariable
),
))
if name == "supported-report-set":
- returnValue(davxml.SupportedReportSet(*[
- davxml.SupportedReport(report,)
+ returnValue(element.SupportedReportSet(*[
+ element.SupportedReport(report,)
for report in self.supportedReports()
]))
@@ -293,14 +295,14 @@
returnValue((yield self.supportedPrivileges(request)))
if name == "acl-restrictions":
- returnValue(davxml.ACLRestrictions())
+ returnValue(element.ACLRestrictions())
if name == "inherited-acl-set":
- returnValue(davxml.InheritedACLSet(*self.inheritedACLSet()))
+ returnValue(element.InheritedACLSet(*self.inheritedACLSet()))
if name == "principal-collection-set":
- returnValue(davxml.PrincipalCollectionSet(*[
- davxml.HRef(
+ returnValue(element.PrincipalCollectionSet(*[
+ element.HRef(
principalCollection.principalCollectionURL()
)
for principalCollection in self.principalCollections()
@@ -323,9 +325,9 @@
@inlineCallbacks
def callback():
privs = yield self.currentPrivileges(request)
- returnValue(davxml.CurrentUserPrivilegeSet(*privs))
+ returnValue(element.CurrentUserPrivilegeSet(*privs))
returnValue((yield ifAllowed(
- (davxml.ReadCurrentUserPrivilegeSet(),),
+ (element.ReadCurrentUserPrivilegeSet(),),
callback
)))
@@ -334,14 +336,14 @@
def callback():
acl = yield self.accessControlList(request)
if acl is None:
- acl = davxml.ACL()
+ acl = element.ACL()
returnValue(acl)
returnValue(
- (yield ifAllowed((davxml.ReadACL(),), callback))
+ (yield ifAllowed((element.ReadACL(),), callback))
)
if name == "current-user-principal":
- returnValue(davxml.CurrentUserPrincipal(
+ returnValue(element.CurrentUserPrincipal(
self.currentPrincipal(request).children[0]
))
@@ -353,7 +355,7 @@
"Property %s does not exist." % (sname,)
))
else:
- returnValue(davxml.QuotaAvailableBytes(str(qvalue[0])))
+ returnValue(element.QuotaAvailableBytes(str(qvalue[0])))
if name == "quota-used-bytes":
qvalue = yield self.quota(request)
@@ -363,7 +365,7 @@
"Property %s does not exist." % (sname,)
))
else:
- returnValue(davxml.QuotaUsedBytes(str(qvalue[1])))
+ returnValue(element.QuotaUsedBytes(str(qvalue[1])))
elif namespace == twisted_dav_namespace:
if name == "resource-class":
@@ -384,7 +386,7 @@
"""
See L{IDAVResource.writeProperty}.
"""
- assert isinstance(property, davxml.WebDAVElement), (
+ assert isinstance(property, WebDAVElement), (
"Not a property: %r" % (property,)
)
@@ -546,17 +548,17 @@
# to override the values of some HTTP metadata.
#
def contentType(self):
- if self.hasDeadProperty((davxml.dav_namespace, "getcontenttype")):
+ if self.hasDeadProperty((element.dav_namespace, "getcontenttype")):
return self.readDeadProperty(
- (davxml.dav_namespace, "getcontenttype")
+ (element.dav_namespace, "getcontenttype")
).mimeType()
else:
return super(DAVPropertyMixIn, self).contentType()
def displayName(self):
- if self.hasDeadProperty((davxml.dav_namespace, "displayname")):
+ if self.hasDeadProperty((element.dav_namespace, "displayname")):
return str(self.readDeadProperty(
- (davxml.dav_namespace, "displayname")
+ (element.dav_namespace, "displayname")
))
else:
return super(DAVPropertyMixIn, self).displayName()
@@ -807,7 +809,7 @@
for ace in acl.children:
for privilege in tuple(pending):
if not self.matchPrivilege(
- davxml.Privilege(privilege), ace.privileges, privyset
+ element.Privilege(privilege), ace.privileges, privyset
):
continue
@@ -862,7 +864,7 @@
aces.extend(inherited_aces)
- acl = davxml.ACL(*aces)
+ acl = element.ACL(*aces)
return acl
@@ -874,10 +876,10 @@
expand-property.
"""
result = []
- result.append(davxml.Report(davxml.ACLPrincipalPropSet(),))
- result.append(davxml.Report(davxml.PrincipalMatch(),))
- result.append(davxml.Report(davxml.PrincipalPropertySearch(),))
- result.append(davxml.Report(davxml.ExpandProperty(),))
+ result.append(element.Report(element.ACLPrincipalPropSet(),))
+ result.append(element.Report(element.PrincipalMatch(),))
+ result.append(element.Report(element.PrincipalPropertySearch(),))
+ result.append(element.Report(element.ExpandProperty(),))
return result
##
@@ -907,7 +909,7 @@
def translateError(response):
return Failure(HTTPError(response))
- if request.authnUser == davxml.Principal(davxml.Unauthenticated()):
+ if request.authnUser == element.Principal(element.Unauthenticated()):
return UnauthorizedResponse.makeResponse(
request.credentialFactories,
request.remoteAddr).addCallback(translateError)
@@ -933,7 +935,7 @@
necessary authentication metadata.
If the request was not thusly prepared, both C{authzUser} and
- C{authnUser} will be L{davxml.Unauthenticated}.
+ C{authnUser} will be L{element.Unauthenticated}.
@param request: the request which may contain authentication
information and a reference to a portal to authenticate
@@ -949,8 +951,8 @@
if not (hasattr(request, 'portal') and
hasattr(request, 'credentialFactories') and
hasattr(request, 'loginInterfaces')):
- request.authnUser = davxml.Principal(davxml.Unauthenticated())
- request.authzUser = davxml.Principal(davxml.Unauthenticated())
+ request.authnUser = element.Principal(element.Unauthenticated())
+ request.authzUser = element.Principal(element.Unauthenticated())
return succeed((request.authnUser, request.authzUser))
authHeader = request.headers.getHeader('authorization')
@@ -1021,8 +1023,8 @@
# This request has already been authenticated via the wiki
return succeed((request.authnUser, request.authzUser))
- request.authnUser = davxml.Principal(davxml.Unauthenticated())
- request.authzUser = davxml.Principal(davxml.Unauthenticated())
+ request.authnUser = element.Principal(element.Unauthenticated())
+ request.authzUser = element.Principal(element.Unauthenticated())
return succeed((request.authnUser, request.authzUser))
##
@@ -1051,7 +1053,7 @@
def defaultRootAccessControlList(self):
"""
- @return: the L{davxml.ACL} element containing the default
+ @return: the L{element.ACL} element containing the default
access control list for this resource.
"""
#
@@ -1063,14 +1065,14 @@
def defaultAccessControlList(self):
"""
- @return: the L{davxml.ACL} element containing the default
+ @return: the L{element.ACL} element containing the default
access control list for this resource.
"""
#
# The default behaviour is no ACL; we should inherit from the parent
# collection.
#
- return davxml.ACL()
+ return element.ACL()
def setAccessControlList(self, acl):
"""
@@ -1092,7 +1094,7 @@
entry. This is the behaviour required by the C{ACL}
request. (RFC 3744, section 8.1).
- @param new_acl: an L{davxml.ACL} element
+ @param new_acl: an L{element.ACL} element
@param request: the request being processed.
@return: a tuple of the C{DAV:error} precondition element if
an error occurred, C{None} otherwise.
@@ -1133,14 +1135,14 @@
and recurse into any DAV:SupportedPrivilege's
"""
for item in sp.children:
- if isinstance(item, davxml.Privilege):
+ if isinstance(item, element.Privilege):
supported.append(item.children[0])
- elif isinstance(item, davxml.SupportedPrivilege):
+ elif isinstance(item, element.SupportedPrivilege):
addSupportedPrivilege(item)
supportedPrivs = (yield self.supportedPrivileges(request))
for item in supportedPrivs.children:
- assert isinstance(item, davxml.SupportedPrivilege), (
+ assert isinstance(item, element.SupportedPrivilege), (
"Not a SupportedPrivilege: %r" % (item,)
)
addSupportedPrivilege(item)
@@ -1156,7 +1158,7 @@
"on resource %r"
% (old_ace, self))
returnValue((
- davxml.dav_namespace,
+ element.dav_namespace,
"no-protected-ace-conflict"
))
@@ -1177,7 +1179,7 @@
# log.err("Attempt to overwrite inherited ace %r "
# "on resource %r" % (old_ace, self))
# returnValue((
- # davxml.dav_namespace,
+ # element.dav_namespace,
# "no-inherited-ace-conflict"
# ))
@@ -1186,7 +1188,7 @@
log.err("Attempt to set grant ace %r after deny ace "
"on resource %r"
% (ace, self))
- returnValue((davxml.dav_namespace, "deny-before-grant"))
+ returnValue((element.dav_namespace, "deny-before-grant"))
got_deny = not ace.allow
# Step 4: ignore as this server has no abstract privileges
@@ -1199,19 +1201,19 @@
"in ace %r on resource %r"
% (privilege.children[0], ace, self))
returnValue((
- davxml.dav_namespace,
+ element.dav_namespace,
"not-supported-privilege"
))
if ace.protected:
log.err("Attempt to create protected ace %r on resource %r"
% (ace, self))
- returnValue((davxml.dav_namespace, "no-ace-conflict"))
+ returnValue((element.dav_namespace, "no-ace-conflict"))
if ace.inherited:
log.err("Attempt to create inherited ace %r on resource %r"
% (ace, self))
- returnValue((davxml.dav_namespace, "no-ace-conflict"))
+ returnValue((element.dav_namespace, "no-ace-conflict"))
# Step 6
valid = (yield self.validPrincipal(ace.principal, request))
@@ -1220,7 +1222,7 @@
log.err("Attempt to use unrecognized principal %r "
"in ace %r on resource %r"
% (ace.principal, ace, self))
- returnValue((davxml.dav_namespace, "recognized-principal"))
+ returnValue((element.dav_namespace, "recognized-principal"))
# Step 8 & 9
#
@@ -1257,7 +1259,7 @@
command.
@param new_aces: C{list} of L{ACE} for ACL being set.
"""
- return self.setAccessControlList(davxml.ACL(*new_aces))
+ return self.setAccessControlList(element.ACL(*new_aces))
def matchPrivilege(self, privilege, ace_privileges, supportedPrivileges):
@@ -1281,15 +1283,15 @@
(RFC 3744, section 5.5)
@param request: the request being processed.
- @param privileges: an iterable of L{davxml.WebDAVElement}
+ @param privileges: an iterable of L{WebDAVElement}
elements denoting access control privileges.
@param recurse: C{True} if a recursive check on all child
resources of this resource should be performed as well,
C{False} otherwise.
- @param principal: the L{davxml.Principal} to check privileges
+ @param principal: the L{element.Principal} to check privileges
for. If C{None}, it is deduced from C{request} by calling
L{currentPrincipal}.
- @param inherited_aces: a list of L{davxml.ACE}s corresponding
+ @param inherited_aces: a list of L{element.ACE}s corresponding
to the pre-computed inheritable aces from the parent
resource hierarchy.
@return: a L{Deferred} that callbacks with C{None} or errbacks
@@ -1334,7 +1336,7 @@
for ace in acl.children:
for privilege in tuple(pending):
if not self.matchPrivilege(
- davxml.Privilege(privilege),
+ element.Privilege(privilege),
ace.privileges, supportedPrivs
):
continue
@@ -1425,7 +1427,7 @@
return url
try:
- acl = self.readDeadProperty(davxml.ACL)
+ acl = self.readDeadProperty(element.ACL)
except HTTPError, e:
assert e.response.code == responsecode.NOT_FOUND, (
"Expected %s response from readDeadProperty() exception, "
@@ -1475,9 +1477,9 @@
children = list(ace.children)
children.remove(TwistedACLInheritable())
children.append(
- davxml.Inherited(davxml.HRef(parentURL))
+ element.Inherited(element.HRef(parentURL))
)
- aces.append(davxml.ACE(*children))
+ aces.append(element.ACE(*children))
else:
aces.extend(inherited_aces)
@@ -1486,14 +1488,14 @@
# inheritance.
if not expanding:
aces = [
- davxml.ACE(*[
+ element.ACE(*[
c for c in ace.children
if c != TwistedACLInheritable()
])
for ace in aces
]
- acl = davxml.ACL(*aces)
+ acl = element.ACL(*aces)
returnValue(acl)
@@ -1527,11 +1529,11 @@
children = list(ace.children)
children.remove(TwistedACLInheritable())
children.append(
- davxml.Inherited(
- davxml.HRef(request.urlForResource(self))
+ element.Inherited(
+ element.HRef(request.urlForResource(self))
)
)
- aces.append(davxml.ACE(*children))
+ aces.append(element.ACE(*children))
return aces
d = self.accessControlList(request, inheritance=True, expanding=True)
@@ -1540,7 +1542,7 @@
def inheritedACLSet(self):
"""
- @return: a sequence of L{davxml.HRef}s from which ACLs are
+ @return: a sequence of L{element.HRef}s from which ACLs are
inherited.
This implementation returns an empty set.
@@ -1628,12 +1630,12 @@
principal2 = principal2.children[0]
if type(principal1) == type(principal2):
- if isinstance(principal1, davxml.Property):
+ if isinstance(principal1, element.Property):
return (
type(principal1.children[0]) ==
type(principal2.children[0])
)
- elif isinstance(principal1, davxml.HRef):
+ elif isinstance(principal1, element.HRef):
return (
str(principal1.children[0]) ==
str(principal2.children[0])
@@ -1649,7 +1651,7 @@
by principal2.
@param principal1: a L{Principal} to test. C{principal1} must
- contain a L{davxml.HRef} or L{davxml.Unauthenticated}
+ contain a L{element.HRef} or L{element.Unauthenticated}
element.
@param principal2: a L{Principal} to test.
@param request: the request being processed.
@@ -1671,27 +1673,27 @@
return succeed(match)
def doMatch():
- if isinstance(principal2, davxml.All):
+ if isinstance(principal2, element.All):
return succeed(True)
- elif isinstance(principal2, davxml.Authenticated):
- if isinstance(principal1, davxml.Unauthenticated):
+ elif isinstance(principal2, element.Authenticated):
+ if isinstance(principal1, element.Unauthenticated):
return succeed(False)
- elif isinstance(principal1, davxml.All):
+ elif isinstance(principal1, element.All):
return succeed(False)
else:
return succeed(True)
- elif isinstance(principal2, davxml.Unauthenticated):
- if isinstance(principal1, davxml.Unauthenticated):
+ elif isinstance(principal2, element.Unauthenticated):
+ if isinstance(principal1, element.Unauthenticated):
return succeed(True)
else:
return succeed(False)
- elif isinstance(principal1, davxml.Unauthenticated):
+ elif isinstance(principal1, element.Unauthenticated):
return succeed(False)
- assert isinstance(principal1, davxml.HRef), (
+ assert isinstance(principal1, element.HRef), (
"Not an HRef: %r" % (principal1,)
)
@@ -1766,7 +1768,7 @@
#
real_principal = ace_principal.children[0]
- if isinstance(real_principal, davxml.Property):
+ if isinstance(real_principal, element.Property):
# See comments in matchPrincipal(). We probably need
# some common code.
log.err("Encountered a property principal (%s), "
@@ -1774,7 +1776,7 @@
% (real_principal,))
return False
- if isinstance(real_principal, davxml.HRef):
+ if isinstance(real_principal, element.HRef):
return self.validHrefPrincipal(real_principal, request)
return True
@@ -1810,27 +1812,27 @@
def resolvePrincipal(self, principal, request):
"""
- Resolves a L{davxml.Principal} element into a L{davxml.HRef}
+ Resolves a L{element.Principal} element into a L{element.HRef}
element if possible. Specifically, the given C{principal}'s
contained element is resolved.
- L{davxml.Property} is resolved to the URI in the contained
+ L{element.Property} is resolved to the URI in the contained
property.
- L{davxml.Self} is resolved to the URI of this resource.
+ L{element.Self} is resolved to the URI of this resource.
- L{davxml.HRef} elements are returned as-is.
+ L{element.HRef} elements are returned as-is.
All other principals, including meta-principals
- (eg. L{davxml.All}), resolve to C{None}.
+ (eg. L{element.All}), resolve to C{None}.
- @param principal: the L{davxml.Principal} child element to
+ @param principal: the L{element.Principal} child element to
resolve.
@param request: the request being processed.
- @return: a deferred L{davxml.HRef} element or C{None}.
+ @return: a deferred L{element.HRef} element or C{None}.
"""
- if isinstance(principal, davxml.Property):
+ if isinstance(principal, element.Property):
# NotImplementedError("Property principals are not implemented.")
#
# We can't raise here without potentially crippling the
@@ -1861,7 +1863,7 @@
)
return None
- if not isinstance(principal, davxml.Principal):
+ if not isinstance(principal, element.Principal):
log.err("Non-principal value in property {%s}%s "
"referenced by property principal."
% (namespace, name))
@@ -1879,22 +1881,22 @@
d.addCallback(gotPrincipal)
return d
- elif isinstance(principal, davxml.Self):
+ elif isinstance(principal, element.Self):
try:
self = IDAVPrincipalResource(self)
except TypeError:
log.err("DAV:self ACE is set on non-principal resource %r"
% (self,))
return succeed(None)
- principal = davxml.HRef(self.principalURL())
+ principal = element.HRef(self.principalURL())
- if isinstance(principal, davxml.HRef):
+ if isinstance(principal, element.HRef):
return succeed(principal)
assert isinstance(principal, (
- davxml.All,
- davxml.Authenticated,
- davxml.Unauthenticated
+ element.All,
+ element.Authenticated,
+ element.Unauthenticated
)), "Not a meta-principal: %r" % (principal,)
return succeed(None)
@@ -1957,7 +1959,7 @@
def principalSearchPropertySet(self):
"""
- @return: a L{davxml.PrincipalSearchPropertySet} element describing the
+ @return: a L{element.PrincipalSearchPropertySet} element describing the
principal properties that can be searched on this principal collection,
or C{None} if this is not a principal collection.
@@ -2321,19 +2323,19 @@
if namespace == dav_namespace:
if name == "alternate-URI-set":
- return davxml.AlternateURISet(*[
- davxml.HRef(u) for u in self.alternateURIs()
+ return element.AlternateURISet(*[
+ element.HRef(u) for u in self.alternateURIs()
])
if name == "principal-URL":
- return davxml.PrincipalURL(
- davxml.HRef(self.principalURL())
+ return element.PrincipalURL(
+ element.HRef(self.principalURL())
)
if name == "group-member-set":
def callback(members):
- return davxml.GroupMemberSet(*[
- davxml.HRef(p.principalURL())
+ return element.GroupMemberSet(*[
+ element.HRef(p.principalURL())
for p in members
])
@@ -2343,8 +2345,8 @@
if name == "group-membership":
def callback(memberships):
- return davxml.GroupMembership(*[
- davxml.HRef(g.principalURL())
+ return element.GroupMembership(*[
+ element.HRef(g.principalURL())
for g in memberships
])
@@ -2354,12 +2356,12 @@
if name == "resourcetype":
if self.isCollection():
- return davxml.ResourceType(
- davxml.Collection(),
- davxml.Principal()
+ return element.ResourceType(
+ element.Collection(),
+ element.Principal()
)
else:
- return davxml.ResourceType(davxml.Principal())
+ return element.ResourceType(element.Principal())
return super(DAVPrincipalResource, self).readProperty(
qname, request
@@ -2512,7 +2514,7 @@
else:
return True
-class TwistedACLInheritable (davxml.WebDAVEmptyElement):
+class TwistedACLInheritable (WebDAVEmptyElement):
"""
When set on an ACE, this indicates that the ACE privileges should
be inherited by all child resources within the resource with this
@@ -2522,9 +2524,9 @@
name = "inheritable"
registerElement(TwistedACLInheritable)
-davxml.ACE.allowed_children[(twisted_dav_namespace, "inheritable")] = (0, 1)
+element.ACE.allowed_children[(twisted_dav_namespace, "inheritable")] = (0, 1)
-class TwistedGETContentMD5 (davxml.WebDAVTextElement):
+class TwistedGETContentMD5 (WebDAVTextElement):
"""
MD5 hash of the resource content.
"""
@@ -2534,7 +2536,7 @@
registerElement(TwistedGETContentMD5)
-class TwistedQuotaRootProperty (davxml.WebDAVTextElement):
+class TwistedQuotaRootProperty (WebDAVTextElement):
"""
When set on a collection, this property indicates that the
collection has a quota limit for the size of all resources stored
@@ -2547,7 +2549,7 @@
registerElement(TwistedQuotaRootProperty)
-class TwistedQuotaUsedProperty (davxml.WebDAVTextElement):
+class TwistedQuotaUsedProperty (WebDAVTextElement):
"""
When set on a collection, this property contains the cached
running total of the size of all resources stored in the
@@ -2559,28 +2561,28 @@
registerElement(TwistedQuotaUsedProperty)
-allACL = davxml.ACL(
- davxml.ACE(
- davxml.Principal(davxml.All()),
- davxml.Grant(davxml.Privilege(davxml.All())),
- davxml.Protected(),
+allACL = element.ACL(
+ element.ACE(
+ element.Principal(element.All()),
+ element.Grant(element.Privilege(element.All())),
+ element.Protected(),
TwistedACLInheritable()
)
)
-readonlyACL = davxml.ACL(
- davxml.ACE(
- davxml.Principal(davxml.All()),
- davxml.Grant(davxml.Privilege(davxml.Read())),
- davxml.Protected(),
+readonlyACL = element.ACL(
+ element.ACE(
+ element.Principal(element.All()),
+ element.Grant(element.Privilege(element.Read())),
+ element.Protected(),
TwistedACLInheritable()
)
)
-allPrivilegeSet = davxml.SupportedPrivilegeSet(
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.All()),
- davxml.Description("all privileges", **{"xml:lang": "en"})
+allPrivilegeSet = element.SupportedPrivilegeSet(
+ element.SupportedPrivilege(
+ element.Privilege(element.All()),
+ element.Description("all privileges", **{"xml:lang": "en"})
)
)
@@ -2588,79 +2590,79 @@
# This is one possible graph of the "standard" privileges documented
# in 3744, section 3.
#
-davPrivilegeSet = davxml.SupportedPrivilegeSet(
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.All()),
- davxml.Description(
+davPrivilegeSet = element.SupportedPrivilegeSet(
+ element.SupportedPrivilege(
+ element.Privilege(element.All()),
+ element.Description(
"all privileges",
**{"xml:lang": "en"}
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.Read()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.Read()),
+ element.Description(
"read resource",
**{"xml:lang": "en"}
),
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.Write()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.Write()),
+ element.Description(
"write resource",
**{"xml:lang": "en"}
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.WriteProperties()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.WriteProperties()),
+ element.Description(
"write resource properties",
**{"xml:lang": "en"}
),
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.WriteContent()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.WriteContent()),
+ element.Description(
"write resource content",
**{"xml:lang": "en"}
),
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.Bind()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.Bind()),
+ element.Description(
"add child resource",
**{"xml:lang": "en"}
),
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.Unbind()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.Unbind()),
+ element.Description(
"remove child resource",
**{"xml:lang": "en"}
),
),
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.Unlock()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.Unlock()),
+ element.Description(
"unlock resource without ownership of lock",
**{"xml:lang": "en"}
),
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.ReadACL()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.ReadACL()),
+ element.Description(
"read resource access control list",
**{"xml:lang": "en"}
),
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.WriteACL()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.WriteACL()),
+ element.Description(
"write resource access control list",
**{"xml:lang": "en"}
),
),
- davxml.SupportedPrivilege(
- davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
- davxml.Description(
+ element.SupportedPrivilege(
+ element.Privilege(element.ReadCurrentUserPrivilegeSet()),
+ element.Description(
"read privileges for current principal",
**{"xml:lang": "en"}
),
@@ -2668,10 +2670,10 @@
),
)
-unauthenticatedPrincipal = davxml.Principal(davxml.Unauthenticated())
+unauthenticatedPrincipal = element.Principal(element.Unauthenticated())
-class ResourceClass (davxml.WebDAVTextElement):
+class ResourceClass (WebDAVTextElement):
namespace = twisted_dav_namespace
name = "resource-class"
hidden = False
Modified: CalendarServer/trunk/twext/web2/dav/test/test_acl.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/test_acl.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/test/test_acl.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -29,18 +29,18 @@
from twext.web2 import responsecode
from twext.web2.auth import basic
from twext.web2.stream import MemoryStream
-from twext.web2.dav import davxml
-
from twext.web2.dav.util import davXMLFromStream
from twext.web2.dav.auth import TwistedPasswordProperty, IPrincipal, DavRealm, TwistedPropertyChecker, AuthenticationWrapper
from twext.web2.dav.fileop import rmdir
-
-import twext.web2.dav.test.util
from twext.web2.test.test_server import SimpleRequest
from twext.web2.dav.test.util import Site, serialize
from twext.web2.dav.test.test_resource import \
TestDAVPrincipalResource, TestPrincipalsCollection
+from txdav.xml import element
+
+import twext.web2.dav.test.util
+
class ACL(twext.web2.dav.test.util.TestCase):
"""
RFC 3744 (WebDAV ACL) tests.
@@ -75,14 +75,14 @@
loginInterfaces
))
- rootResource.setAccessControlList(self.grant(davxml.All()))
+ rootResource.setAccessControlList(self.grant(element.All()))
for name, acl in (
("none" , self.grant()),
- ("read" , self.grant(davxml.Read())),
- ("read-write" , self.grant(davxml.Read(), davxml.Write())),
- ("unlock" , self.grant(davxml.Unlock())),
- ("all" , self.grant(davxml.All())),
+ ("read" , self.grant(element.Read())),
+ ("read-write" , self.grant(element.Read(), element.Write())),
+ ("unlock" , self.grant(element.Unlock())),
+ ("all" , self.grant(element.All())),
):
filename = os.path.join(docroot, name)
if not os.path.isfile(filename):
@@ -92,8 +92,8 @@
for name, acl in (
("nobind" , self.grant()),
- ("bind" , self.grant(davxml.Bind())),
- ("unbind" , self.grant(davxml.Bind(), davxml.Unbind())),
+ ("bind" , self.grant(element.Bind())),
+ ("unbind" , self.grant(element.Bind(), element.Unbind())),
):
dirname = os.path.join(docroot, name)
if not os.path.isdir(dirname):
@@ -131,15 +131,15 @@
src_resource = self.resource_class(src_path)
src_resource.setAccessControlList({
"nobind": self.grant(),
- "bind" : self.grant(davxml.Bind()),
- "unbind": self.grant(davxml.Bind(), davxml.Unbind())
+ "bind" : self.grant(element.Bind()),
+ "unbind": self.grant(element.Bind(), element.Unbind())
}[src])
for name, acl in (
("none" , self.grant()),
- ("read" , self.grant(davxml.Read())),
- ("read-write" , self.grant(davxml.Read(), davxml.Write())),
- ("unlock" , self.grant(davxml.Unlock())),
- ("all" , self.grant(davxml.All())),
+ ("read" , self.grant(element.Read())),
+ ("read-write" , self.grant(element.Read(), element.Write())),
+ ("unlock" , self.grant(element.Unlock())),
+ ("all" , self.grant(element.All())),
):
filename = os.path.join(src_path, name)
if not os.path.isfile(filename):
@@ -318,7 +318,7 @@
request = SimpleRequest(self.site, "PROPPATCH", "/" + name)
request.stream = MemoryStream(
- davxml.WebDAVDocument(davxml.PropertyUpdate()).toxml()
+ element.WebDAVDocument(element.PropertyUpdate()).toxml()
)
_add_auth_header(request)
@@ -354,7 +354,7 @@
request = SimpleRequest(self.site, method, "/" + name)
if method == "REPORT":
- request.stream = MemoryStream(davxml.PrincipalPropertySearch().toxml())
+ request.stream = MemoryStream(element.PrincipalPropertySearch().toxml())
_add_auth_header(request)
Modified: CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -15,7 +15,7 @@
from twext.web2.responsecode import FORBIDDEN
from twext.web2.http import HTTPError
from twext.web2.dav.static import DAVFile
-from twext.web2.dav.davxml import Depth, WebDAVDocument
+from txdav.xml.element import Depth, WebDAVDocument
try:
from twext.web2.dav.xattrprops import xattrPropertyStore
Modified: CalendarServer/trunk/twext/web2/dav/test/util.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/util.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/test/util.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -34,11 +34,10 @@
from twext.python.log import Logger
from twext.web2.http import HTTPError, StatusResponse
from twext.web2 import responsecode
-from twext.web2.dav import davxml
-
from twext.web2.dav.resource import TwistedACLInheritable
from twext.web2.dav.static import DAVFile
from twext.web2.dav.util import joinURL
+from txdav.xml import element
log = Logger()
@@ -61,7 +60,7 @@
"No such property: {%s}%s" % qname
))
- doc = davxml.WebDAVDocument.fromString(property)
+ doc = element.WebDAVDocument.fromString(property)
return doc.root_element
def set(self, property):
@@ -100,10 +99,10 @@
resource_class = TestFile
def grant(*privileges):
- return davxml.ACL(*[
- davxml.ACE(
- davxml.Grant(davxml.Privilege(privilege)),
- davxml.Principal(davxml.All())
+ return element.ACL(*[
+ element.ACE(
+ element.Grant(element.Privilege(privilege)),
+ element.Principal(element.All())
)
for privilege in privileges
])
@@ -111,10 +110,10 @@
grant = staticmethod(grant)
def grantInherit(*privileges):
- return davxml.ACL(*[
- davxml.ACE(
- davxml.Grant(davxml.Privilege(privilege)),
- davxml.Principal(davxml.All()),
+ return element.ACL(*[
+ element.ACE(
+ element.Grant(element.Privilege(privilege)),
+ element.Principal(element.All()),
TwistedACLInheritable()
)
for privilege in privileges
@@ -126,7 +125,7 @@
docroot = self.mktemp()
os.mkdir(docroot)
rootresource = self.resource_class(docroot)
- rootresource.setAccessControlList(self.grantInherit(davxml.All()))
+ rootresource.setAccessControlList(self.grantInherit(element.All()))
dirnames = (
os.path.join(docroot, "dir1"), # 0
@@ -173,7 +172,7 @@
def _getSite(self):
if not hasattr(self, "_site"):
rootresource = self.resource_class(self.docroot)
- rootresource.setAccessControlList(self.grantInherit(davxml.All()))
+ rootresource.setAccessControlList(self.grantInherit(element.All()))
self._site = Site(rootresource)
return self._site
Modified: CalendarServer/trunk/twext/web2/dav/util.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/util.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/util.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -50,7 +50,7 @@
from twext.python.log import Logger
from twext.web2.stream import readStream
-from twext.web2.dav import davxml
+from txdav.xml.parser import WebDAVDocument
log = Logger()
@@ -79,7 +79,7 @@
def parse(xml):
try:
- doc = davxml.WebDAVDocument.fromString(xml)
+ doc = WebDAVDocument.fromString(xml)
doc.root_element.validate()
return doc
except ValueError:
Modified: CalendarServer/trunk/twext/web2/dav/xattrprops.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/xattrprops.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/xattrprops.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -52,8 +52,8 @@
from twisted.python.log import err
from twext.web2 import responsecode
from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.dav import davxml
from twext.web2.dav.http import statusForFailure
+from txdav.xml.parser import WebDAVDocument
# RFC 2518 Section 12.13.1 says that removal of non-existing property
# is not an error. python-xattr on Linux fails with ENODATA in this
@@ -170,7 +170,7 @@
legacy = True
try:
- doc = davxml.WebDAVDocument.fromString(data)
+ doc = WebDAVDocument.fromString(data)
except ValueError:
try:
doc = unpickle(data)
Modified: CalendarServer/trunk/twistedcaldav/__init__.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/__init__.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/__init__.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -38,13 +38,8 @@
import twistedcaldav.mkcolxml
import twistedcaldav.customxml
-from txdav.xml.element import registerElements
+twistedcaldav # Shhh.. pyflakes
-registerElements(twistedcaldav.caldavxml)
-registerElements(twistedcaldav.customxml)
-registerElements(twistedcaldav.carddavxml)
-registerElements(twistedcaldav.mkcolxml)
-
#
# DefaultHTTPHandler
#
Modified: CalendarServer/trunk/twistedcaldav/caldavxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/caldavxml.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/caldavxml.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -27,7 +27,10 @@
from pycalendar.datetime import PyCalendarDateTime
-from twext.web2.dav import davxml
+from txdav.xml.element import registerElement, dav_namespace
+from txdav.xml.element import WebDAVElement, PCDATAElement
+from txdav.xml.element import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import ResourceType, Collection
from twext.python.log import Logger
@@ -61,24 +64,28 @@
"calendar-query-extended",
)
-class CalDAVElement (davxml.WebDAVElement):
+
+class CalDAVElement (WebDAVElement):
"""
CalDAV XML element.
"""
namespace = caldav_namespace
-class CalDAVEmptyElement (davxml.WebDAVEmptyElement):
+
+class CalDAVEmptyElement (WebDAVEmptyElement):
"""
CalDAV element with no contents.
"""
namespace = caldav_namespace
-class CalDAVTextElement (davxml.WebDAVTextElement):
+
+class CalDAVTextElement (WebDAVTextElement):
"""
CalDAV element containing PCDATA.
"""
namespace = caldav_namespace
+
class CalDAVTimeRangeElement (CalDAVEmptyElement):
"""
CalDAV element containing a time range.
@@ -121,11 +128,11 @@
# No other tests
return True
+
class CalDAVTimeZoneElement (CalDAVTextElement):
"""
CalDAV element containing iCalendar data with a single VTIMEZONE component.
"""
-
def calendar(self):
"""
Returns a calendar component derived from this element, which contains
@@ -160,6 +167,8 @@
return found
+
+ at registerElement
class CalendarHomeSet (CalDAVElement):
"""
The calendar collections URLs for this principal's calendar user.
@@ -168,8 +177,10 @@
name = "calendar-home-set"
hidden = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+ allowed_children = { (dav_namespace, "href"): (0, None) }
+
+ at registerElement
class CalendarDescription (CalDAVTextElement):
"""
Provides a human-readable description of what this calendar collection
@@ -180,6 +191,8 @@
hidden = True
# May be protected; but we'll let the client set this if they like.
+
+ at registerElement
class CalendarTimeZone (CalDAVTimeZoneElement):
"""
Specifies a time zone on a calendar collection.
@@ -188,6 +201,8 @@
name = "calendar-timezone"
hidden = True
+
+ at registerElement
class SupportedCalendarComponentSets (CalDAVElement):
"""
Indicates what set of calendar components the server is willing to allow
@@ -200,6 +215,8 @@
allowed_children = { (caldav_namespace, "supported-calendar-component-set"): (0, None) }
+
+ at registerElement
class SupportedCalendarComponentSet (CalDAVElement):
"""
Indicates what set of calendar components are allowed in a collection.
@@ -211,6 +228,8 @@
allowed_children = { (caldav_namespace, "comp"): (0, None) }
+
+ at registerElement
class SupportedCalendarData (CalDAVElement):
"""
Specifies restrictions on a calendar collection.
@@ -222,6 +241,8 @@
allowed_children = { (caldav_namespace, "calendar-data"): (0, None) }
+
+ at registerElement
class MaxResourceSize (CalDAVTextElement):
"""
Specifies restrictions on a calendar collection.
@@ -231,6 +252,8 @@
hidden = True
protected = True
+
+ at registerElement
class MinDateTime (CalDAVTextElement):
"""
Specifies restrictions on a calendar collection.
@@ -240,6 +263,8 @@
hidden = True
protected = True
+
+ at registerElement
class MaxDateTime (CalDAVTextElement):
"""
Specifies restrictions on a calendar collection.
@@ -249,6 +274,8 @@
hidden = True
protected = True
+
+ at registerElement
class MaxInstances (CalDAVTextElement):
"""
Specifies restrictions on a calendar collection.
@@ -258,6 +285,8 @@
hidden = True
protected = True
+
+ at registerElement
class MaxAttendeesPerInstance (CalDAVTextElement):
"""
Specifies restrictions on a calendar collection.
@@ -267,6 +296,8 @@
hidden = True
protected = True
+
+ at registerElement
class Calendar (CalDAVEmptyElement):
"""
Denotes a calendar collection.
@@ -274,6 +305,8 @@
"""
name = "calendar"
+
+ at registerElement
class MakeCalendar (CalDAVElement):
"""
Top-level element for request body in MKCALENDAR.
@@ -281,10 +314,12 @@
"""
name = "mkcalendar"
- allowed_children = { (davxml.dav_namespace, "set"): (0, 1) }
+ allowed_children = { (dav_namespace, "set"): (0, 1) }
child_types = { "WebDAVUnknownElement": (0, None) }
+
+ at registerElement
class MakeCalendarResponse (CalDAVElement):
"""
Top-level element for response body in MKCALENDAR.
@@ -292,8 +327,10 @@
"""
name = "mkcalendar-response"
- allowed_children = { davxml.WebDAVElement: (0, None) }
+ allowed_children = { WebDAVElement: (0, None) }
+
+ at registerElement
class CalendarQuery (CalDAVElement):
"""
Defines a report for querying calendar data.
@@ -302,11 +339,11 @@
name = "calendar-query"
allowed_children = {
- (davxml.dav_namespace, "allprop" ): (0, None),
- (davxml.dav_namespace, "propname"): (0, None),
- (davxml.dav_namespace, "prop" ): (0, None),
- (caldav_namespace, "timezone"): (0, 1),
- (caldav_namespace, "filter" ): (0, 1), # Actually (1, 1) unless element is empty
+ (dav_namespace, "allprop" ): (0, None),
+ (dav_namespace, "propname"): (0, None),
+ (dav_namespace, "prop" ): (0, None),
+ (caldav_namespace, "timezone"): (0, 1),
+ (caldav_namespace, "filter" ): (0, 1), # Actually (1, 1) unless element is empty
}
def __init__(self, *children, **attributes):
@@ -320,9 +357,9 @@
qname = child.qname()
if qname in (
- (davxml.dav_namespace, "allprop" ),
- (davxml.dav_namespace, "propname"),
- (davxml.dav_namespace, "prop" ),
+ (dav_namespace, "allprop" ),
+ (dav_namespace, "propname"),
+ (dav_namespace, "prop" ),
):
if props is not None:
raise ValueError("Only one of CalDAV:allprop, CalDAV:propname, CalDAV:prop allowed")
@@ -345,6 +382,8 @@
self.filter = filter
self.timezone = timezone
+
+ at registerElement
class CalendarData (CalDAVElement):
"""
Defines which parts of a calendar component object should be returned by a
@@ -358,7 +397,7 @@
(caldav_namespace, "expand" ): (0, 1),
(caldav_namespace, "limit-recurrence-set" ): (0, 1),
(caldav_namespace, "limit-freebusy-set" ): (0, 1),
- davxml.PCDATAElement: (0, None),
+ PCDATAElement: (0, None),
}
allowed_attributes = {
"content-type": False,
@@ -370,10 +409,10 @@
if isinstance(calendar, str):
if not calendar:
raise ValueError("Missing calendar data")
- return clazz(davxml.PCDATAElement(calendar))
+ return clazz(PCDATAElement(calendar))
elif isinstance(calendar, iComponent):
assert calendar.name() == "VCALENDAR", "Not a calendar: %r" % (calendar,)
- return clazz(davxml.PCDATAElement(calendar.getTextWithTimezones(includeTimezones=not config.EnableTimezonesByReference)))
+ return clazz(PCDATAElement(calendar.getTextWithTimezones(includeTimezones=not config.EnableTimezonesByReference)))
else:
raise ValueError("Not a calendar: %s" % (calendar,))
@@ -404,7 +443,7 @@
elif qname == (caldav_namespace, "limit-freebusy-set"):
freebusy_set = child
- elif isinstance(child, davxml.PCDATAElement):
+ elif isinstance(child, PCDATAElement):
if data is None:
data = child
else:
@@ -469,7 +508,7 @@
Returns the calendar data derived from this element.
"""
for data in self.children:
- if not isinstance(data, davxml.PCDATAElement):
+ if not isinstance(data, PCDATAElement):
return None
else:
# We guaranteed in __init__() that there is only one child...
@@ -479,6 +518,8 @@
textData = calendarData
+
+ at registerElement
class CalendarComponent (CalDAVElement):
"""
Defines which component types to return.
@@ -581,6 +622,8 @@
return result
+
+ at registerElement
class AllComponents (CalDAVEmptyElement):
"""
Specifies that all components shall be returned.
@@ -588,6 +631,8 @@
"""
name = "allcomp"
+
+ at registerElement
class AllProperties (CalDAVEmptyElement):
"""
Specifies that all properties shall be returned.
@@ -595,6 +640,8 @@
"""
name = "allprop"
+
+ at registerElement
class Property (CalDAVEmptyElement):
"""
Defines a property to return in a response.
@@ -623,6 +670,8 @@
else:
self.novalue = False
+
+ at registerElement
class Expand (CalDAVTimeRangeElement):
"""
Specifies that the server should expand recurring components into separate
@@ -631,6 +680,8 @@
"""
name = "expand"
+
+ at registerElement
class LimitRecurrenceSet (CalDAVTimeRangeElement):
"""
Specifies a time range to limit the set of recurrence instances returned by
@@ -639,6 +690,8 @@
"""
name = "limit-recurrence-set"
+
+ at registerElement
class LimitFreeBusySet (CalDAVTimeRangeElement):
"""
Specifies a time range to limit the set of FREEBUSY properties returned by
@@ -647,6 +700,8 @@
"""
name = "limit-freebusy-set"
+
+ at registerElement
class Filter (CalDAVElement):
"""
Determines which matching components are returned.
@@ -656,6 +711,8 @@
allowed_children = { (caldav_namespace, "comp-filter"): (1, 1) }
+
+ at registerElement
class ComponentFilter (CalDAVElement):
"""
Limits a search to only the chosen component types.
@@ -674,6 +731,8 @@
"test": False,
}
+
+ at registerElement
class PropertyFilter (CalDAVElement):
"""
Limits a search to specific properties.
@@ -692,6 +751,8 @@
"test": False,
}
+
+ at registerElement
class ParameterFilter (CalDAVElement):
"""
Limits a search to specific parameters.
@@ -705,6 +766,8 @@
}
allowed_attributes = { "name": True }
+
+ at registerElement
class IsNotDefined (CalDAVEmptyElement):
"""
Specifies that the named iCalendar item does not exist.
@@ -712,6 +775,8 @@
"""
name = "is-not-defined"
+
+ at registerElement
class TextMatch (CalDAVTextElement):
"""
Specifies a substring match on a property or parameter value.
@@ -726,11 +791,11 @@
caseless = "no"
if type(string) is str:
- return clazz(davxml.PCDATAElement(string), caseless=caseless)
+ return clazz(PCDATAElement(string), caseless=caseless)
elif type(string) is unicode:
- return clazz(davxml.PCDATAElement(string.encode("utf-8")), caseless=caseless)
+ return clazz(PCDATAElement(string.encode("utf-8")), caseless=caseless)
else:
- return clazz(davxml.PCDATAElement(str(string)), caseless=caseless)
+ return clazz(PCDATAElement(str(string)), caseless=caseless)
fromString = classmethod(fromString)
@@ -740,6 +805,8 @@
"match-type": False,
}
+
+ at registerElement
class TimeZone (CalDAVTimeZoneElement):
"""
Specifies a time zone component.
@@ -747,6 +814,8 @@
"""
name = "timezone"
+
+ at registerElement
class TimeRange (CalDAVTimeRangeElement):
"""
Specifies a time for testing components against.
@@ -754,6 +823,8 @@
"""
name = "time-range"
+
+ at registerElement
class CalendarMultiGet (CalDAVElement):
"""
CalDAV report used to retrieve specific calendar component items via their
@@ -765,10 +836,10 @@
# To allow for an empty element in a supported-report-set property we need
# to relax the child restrictions
allowed_children = {
- (davxml.dav_namespace, "allprop" ): (0, 1),
- (davxml.dav_namespace, "propname"): (0, 1),
- (davxml.dav_namespace, "prop" ): (0, 1),
- (davxml.dav_namespace, "href" ): (0, None), # Actually ought to be (1, None)
+ (dav_namespace, "allprop" ): (0, 1),
+ (dav_namespace, "propname"): (0, 1),
+ (dav_namespace, "prop" ): (0, 1),
+ (dav_namespace, "href" ): (0, None), # Actually ought to be (1, None)
}
def __init__(self, *children, **attributes):
@@ -781,20 +852,22 @@
qname = child.qname()
if qname in (
- (davxml.dav_namespace, "allprop" ),
- (davxml.dav_namespace, "propname"),
- (davxml.dav_namespace, "prop" ),
+ (dav_namespace, "allprop" ),
+ (dav_namespace, "propname"),
+ (dav_namespace, "prop" ),
):
if property is not None:
raise ValueError("Only one of DAV:allprop, DAV:propname, DAV:prop allowed")
property = child
- elif qname == (davxml.dav_namespace, "href"):
+ elif qname == (dav_namespace, "href"):
resources.append(child)
self.property = property
self.resources = resources
+
+ at registerElement
class FreeBusyQuery (CalDAVElement):
"""
CalDAV report used to generate a VFREEBUSY to determine busy time over a
@@ -824,6 +897,8 @@
self.timerange = timerange
+
+ at registerElement
class ReadFreeBusy(CalDAVEmptyElement):
"""
Privilege which allows the free busy report to be executed.
@@ -831,6 +906,8 @@
"""
name = "read-free-busy"
+
+ at registerElement
class NoUIDConflict(CalDAVElement):
"""
CalDAV precondition used to indicate a UID conflict during PUT/COPY/MOVE.
@@ -838,8 +915,10 @@
"""
name = "no-uid-conflict"
- allowed_children = { (davxml.dav_namespace, "href"): (1, 1) }
+ allowed_children = { (dav_namespace, "href"): (1, 1) }
+
+ at registerElement
class SupportedFilter(CalDAVElement):
"""
CalDAV precondition used to indicate an unsupported component type in a
@@ -858,6 +937,7 @@
# CalDAV Schedule objects
##
+ at registerElement
class CalendarUserAddressSet (CalDAVElement):
"""
The list of calendar user addresses for this principal's calendar user.
@@ -866,8 +946,10 @@
name = "calendar-user-address-set"
hidden = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+ allowed_children = { (dav_namespace, "href"): (0, None) }
+
+ at registerElement
class CalendarFreeBusySet (CalDAVElement):
"""
The list of calendar URIs that contribute to free-busy for this principal's calendar user.
@@ -877,8 +959,10 @@
name = "calendar-free-busy-set"
hidden = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+ allowed_children = { (dav_namespace, "href"): (0, None) }
+
+ at registerElement
class ScheduleCalendarTransp (CalDAVElement):
"""
Indicates whether a calendar should be used for freebusy lookups.
@@ -890,26 +974,34 @@
(caldav_namespace, "transparent" ): (0, 1),
}
+
+ at registerElement
class Opaque (CalDAVEmptyElement):
"""
Indicates that a calendar is used in freebusy lookups.
"""
name = "opaque"
+
+ at registerElement
class Transparent (CalDAVEmptyElement):
"""
Indicates that a calendar is not used in freebusy lookups.
"""
name = "transparent"
+
+ at registerElement
class ScheduleDefaultCalendarURL (CalDAVElement):
"""
A single href indicating which calendar is the default for scheduling.
"""
name = "schedule-default-calendar-URL"
- allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+ allowed_children = { (dav_namespace, "href"): (0, 1) }
+
+ at registerElement
class ScheduleInboxURL (CalDAVElement):
"""
A principal property to indicate the schedule INBOX for the principal.
@@ -919,8 +1011,10 @@
hidden = True
protected = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+ allowed_children = { (dav_namespace, "href"): (0, 1) }
+
+ at registerElement
class ScheduleOutboxURL (CalDAVElement):
"""
A principal property to indicate the schedule OUTBOX for the principal.
@@ -930,8 +1024,10 @@
hidden = True
protected = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+ allowed_children = { (dav_namespace, "href"): (0, 1) }
+
+ at registerElement
class Originator (CalDAVElement):
"""
A property on resources in schedule Inbox and Outbox indicating the Originator used
@@ -942,8 +1038,10 @@
hidden = True
protected = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, 1) } # NB Minimum is zero because this is a property name
+ allowed_children = { (dav_namespace, "href"): (0, 1) } # NB Minimum is zero because this is a property name
+
+ at registerElement
class Recipient (CalDAVElement):
"""
A property on resources in schedule Inbox indicating the Recipients targeted
@@ -957,8 +1055,10 @@
hidden = True
protected = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, None) } # NB Minimum is zero because this is a property name
+ allowed_children = { (dav_namespace, "href"): (0, None) } # NB Minimum is zero because this is a property name
+
+ at registerElement
class ScheduleTag (CalDAVTextElement):
"""
Property on scheduling resources.
@@ -968,6 +1068,8 @@
hidden = True
protected = True
+
+ at registerElement
class ScheduleInbox (CalDAVEmptyElement):
"""
Denotes the resource type of a calendar schedule Inbox.
@@ -975,6 +1077,8 @@
"""
name = "schedule-inbox"
+
+ at registerElement
class ScheduleOutbox (CalDAVEmptyElement):
"""
Denotes the resource type of a calendar schedule Outbox.
@@ -982,6 +1086,8 @@
"""
name = "schedule-outbox"
+
+ at registerElement
class ScheduleResponse (CalDAVElement):
"""
The set of responses for a SCHEDULE method operation.
@@ -991,6 +1097,8 @@
allowed_children = { (caldav_namespace, "response"): (0, None) }
+
+ at registerElement
class Response (CalDAVElement):
"""
A response to an iTIP request against a specific recipient.
@@ -999,13 +1107,15 @@
name = "response"
allowed_children = {
- (caldav_namespace, "recipient" ): (1, 1),
- (caldav_namespace, "request-status" ): (1, 1),
- (caldav_namespace, "calendar-data" ): (0, 1),
- (davxml.dav_namespace, "error" ): (0, 1), # 2518bis
- (davxml.dav_namespace, "responsedescription"): (0, 1)
+ (caldav_namespace, "recipient" ): (1, 1),
+ (caldav_namespace, "request-status" ): (1, 1),
+ (caldav_namespace, "calendar-data" ): (0, 1),
+ (dav_namespace, "error" ): (0, 1), # 2518bis
+ (dav_namespace, "responsedescription"): (0, 1)
}
+
+ at registerElement
class RequestStatus (CalDAVTextElement):
"""
The iTIP REQUEST-STATUS value for the iTIP operation.
@@ -1013,6 +1123,8 @@
"""
name = "request-status"
+
+ at registerElement
class Schedule (CalDAVEmptyElement):
"""
Privilege which allows the SCHEDULE method to be executed.
@@ -1020,6 +1132,8 @@
"""
name = "schedule"
+
+ at registerElement
class ScheduleDeliver (CalDAVEmptyElement):
"""
Privilege which controls scheduling messages going into the Inbox.
@@ -1027,6 +1141,8 @@
"""
name = "schedule-deliver"
+
+ at registerElement
class ScheduleSend (CalDAVEmptyElement):
"""
Privilege which controls the ability to send scheduling messages.
@@ -1034,6 +1150,8 @@
"""
name = "schedule-send"
+
+ at registerElement
class CalendarUserType (CalDAVTextElement):
"""
The CALDAV:calendar-user-type property from section 9.2.4 of caldav-sched-05
@@ -1041,6 +1159,7 @@
name = "calendar-user-type"
protected = True
+
##
# draft-daboo-valarm-extensions
##
@@ -1049,6 +1168,7 @@
"calendar-default-alarms",
)
+
class DefaultAlarmBase (CalDAVTextElement):
"""
Common behavior for default alarm properties.
@@ -1089,10 +1209,10 @@
return True
+
+ at registerElement
class DefaultAlarmVEventDateTime (DefaultAlarmBase):
-
name = "default-alarm-vevent-datetime"
-
calendartxt = """
BEGIN:VCALENDAR
VERSION:2.0
@@ -1107,10 +1227,10 @@
END:VCALENDAR
"""
+
+ at registerElement
class DefaultAlarmVEventDate (DefaultAlarmBase):
-
name = "default-alarm-vevent-date"
-
calendartxt = """
BEGIN:VCALENDAR
VERSION:2.0
@@ -1125,11 +1245,10 @@
END:VCALENDAR
"""
+
+ at registerElement
class DefaultAlarmVToDoDateTime (DefaultAlarmBase):
-
name = "default-alarm-vtodo-datetime"
-
-
calendartxt = """
BEGIN:VCALENDAR
VERSION:2.0
@@ -1143,10 +1262,10 @@
END:VCALENDAR
"""
+
+ at registerElement
class DefaultAlarmVToDoDate (DefaultAlarmBase):
-
name = "default-alarm-vtodo-date"
-
calendartxt = """
BEGIN:VCALENDAR
VERSION:2.0
@@ -1160,12 +1279,14 @@
END:VCALENDAR
"""
+
##
-# Extensions to davxml.ResourceType
+# Extensions to ResourceType
##
def _isCalendar(self): return bool(self.childrenOfType(Calendar))
-davxml.ResourceType.isCalendar = _isCalendar
-davxml.ResourceType.calendar = davxml.ResourceType(davxml.Collection(), Calendar())
-davxml.ResourceType.scheduleInbox = davxml.ResourceType(davxml.Collection(), ScheduleInbox())
-davxml.ResourceType.scheduleOutbox = davxml.ResourceType(davxml.Collection(), ScheduleOutbox())
+ResourceType.isCalendar = _isCalendar
+
+ResourceType.calendar = ResourceType(Collection(), Calendar())
+ResourceType.scheduleInbox = ResourceType(Collection(), ScheduleInbox())
+ResourceType.scheduleOutbox = ResourceType(Collection(), ScheduleOutbox())
Modified: CalendarServer/trunk/twistedcaldav/carddavxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/carddavxml.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/carddavxml.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -25,7 +25,11 @@
See draft spec:
"""
-from twext.web2.dav import davxml
+from txdav.xml.element import registerElement, dav_namespace
+from txdav.xml.element import WebDAVElement, PCDATAElement
+from txdav.xml.element import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import ResourceType, Collection
+
from twistedcaldav.vcard import Component
##
@@ -38,24 +42,29 @@
"addressbook",
)
-class CardDAVElement (davxml.WebDAVElement):
+
+class CardDAVElement (WebDAVElement):
"""
CardDAV XML element.
"""
namespace = carddav_namespace
-class CardDAVEmptyElement (davxml.WebDAVEmptyElement):
+
+class CardDAVEmptyElement (WebDAVEmptyElement):
"""
CardDAV element with no contents.
"""
namespace = carddav_namespace
-class CardDAVTextElement (davxml.WebDAVTextElement):
+
+class CardDAVTextElement (WebDAVTextElement):
"""
CardDAV element containing PCDATA.
"""
namespace = carddav_namespace
+
+ at registerElement
class AddressBookHomeSet (CardDAVElement):
"""
The address book collections URLs for this principal.
@@ -64,8 +73,10 @@
name = "addressbook-home-set"
hidden = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+ allowed_children = { (dav_namespace, "href"): (0, None) }
+
+ at registerElement
class AddressBookDescription (CardDAVTextElement):
"""
Provides a human-readable description of what this address book collection
@@ -76,6 +87,8 @@
hidden = True
# May be protected; but we'll let the client set this if they like.
+
+ at registerElement
class SupportedAddressData (CardDAVElement):
"""
Specifies restrictions on an address book collection.
@@ -87,6 +100,8 @@
allowed_children = { (carddav_namespace, "address-data-type"): (0, None) }
+
+ at registerElement
class MaxResourceSize (CardDAVTextElement):
"""
Specifies restrictions on an address book collection.
@@ -96,6 +111,8 @@
hidden = True
protected = True
+
+ at registerElement
class AddressBook (CardDAVEmptyElement):
"""
Denotes an address book collection.
@@ -103,6 +120,8 @@
"""
name = "addressbook"
+
+ at registerElement
class AddressBookQuery (CardDAVElement):
"""
Defines a report for querying address book data.
@@ -111,11 +130,11 @@
name = "addressbook-query"
allowed_children = {
- (davxml.dav_namespace, "allprop" ): (0, None),
- (davxml.dav_namespace, "propname"): (0, None),
- (davxml.dav_namespace, "prop" ): (0, None),
- (carddav_namespace, "filter" ): (0, 1), # Actually (1, 1) unless element is empty
- (carddav_namespace, "limit" ): (0, None),
+ (dav_namespace, "allprop" ): (0, None),
+ (dav_namespace, "propname"): (0, None),
+ (dav_namespace, "prop" ): (0, None),
+ (carddav_namespace, "filter" ): (0, 1), # Actually (1, 1) unless element is empty
+ (carddav_namespace, "limit" ): (0, None),
}
def __init__(self, *children, **attributes):
@@ -129,9 +148,9 @@
qname = child.qname()
if qname in (
- (davxml.dav_namespace, "allprop" ),
- (davxml.dav_namespace, "propname"),
- (davxml.dav_namespace, "prop" ),
+ (dav_namespace, "allprop" ),
+ (dav_namespace, "propname"),
+ (dav_namespace, "prop" ),
):
if props is not None:
raise ValueError("Only one of CardDAV:allprop, CardDAV:propname, CardDAV:prop allowed")
@@ -155,6 +174,8 @@
self.filter = filter
self.limit = limit
+
+ at registerElement
class AddressDataType (CardDAVEmptyElement):
"""
Defines which parts of a address component object should be returned by a
@@ -168,6 +189,8 @@
"version" : False,
}
+
+ at registerElement
class AddressData (CardDAVElement):
"""
Defines which parts of a address component object should be returned by a
@@ -178,8 +201,8 @@
allowed_children = {
(carddav_namespace, "allprop"): (0, 1),
- (carddav_namespace, "prop"): (0, None),
- davxml.PCDATAElement: (0, None),
+ (carddav_namespace, "prop" ): (0, None),
+ PCDATAElement : (0, None),
}
allowed_attributes = {
"content-type": False,
@@ -189,7 +212,7 @@
@classmethod
def fromAddress(clazz, address):
assert address.name() == "VCARD", "Not a vCard: %r" % (address,)
- return clazz(davxml.PCDATAElement(str(address)))
+ return clazz(PCDATAElement(str(address)))
@classmethod
def fromAddressData(clazz, addressdata):
@@ -198,7 +221,7 @@
@param addressdata: a string of valid address data.
@return: a L{Addressata} element.
"""
- return clazz(davxml.PCDATAElement(addressdata))
+ return clazz(PCDATAElement(addressdata))
fromTextData = fromAddressData
@@ -227,7 +250,7 @@
else:
raise ValueError("CardDAV:allprop and CardDAV:prop may not be combined")
- elif isinstance(child, davxml.PCDATAElement):
+ elif isinstance(child, PCDATAElement):
if data is None:
data = child
else:
@@ -289,7 +312,7 @@
Returns an address component derived from this element.
"""
for data in self.children:
- if not isinstance(data, davxml.PCDATAElement):
+ if not isinstance(data, PCDATAElement):
return None
else:
# We guaranteed in __init__() that there is only one child...
@@ -299,6 +322,8 @@
textData = addressData
+
+ at registerElement
class AllProperties (CardDAVEmptyElement):
"""
Specifies that all properties shall be returned.
@@ -306,6 +331,8 @@
"""
name = "allprop"
+
+ at registerElement
class Property (CardDAVEmptyElement):
"""
Defines a property to return in a response.
@@ -334,6 +361,8 @@
else:
self.novalue = False
+
+ at registerElement
class Filter (CardDAVElement):
"""
Determines which matching components are returned.
@@ -344,6 +373,8 @@
allowed_children = { (carddav_namespace, "prop-filter"): (0, None) }
allowed_attributes = { "test": False }
+
+ at registerElement
class PropertyFilter (CardDAVElement):
"""
Limits a search to specific properties.
@@ -361,6 +392,8 @@
"test": False,
}
+
+ at registerElement
class ParameterFilter (CardDAVElement):
"""
Limits a search to specific parameters.
@@ -374,7 +407,9 @@
}
allowed_attributes = { "name": True }
-class Limit (davxml.WebDAVElement):
+
+ at registerElement
+class Limit (WebDAVElement):
"""
Client supplied limit for reports.
"""
@@ -384,7 +419,9 @@
(carddav_namespace, "nresults" ) : (1, 1),
}
-class NResults (davxml.WebDAVTextElement):
+
+ at registerElement
+class NResults (WebDAVTextElement):
"""
Number of results limit.
"""
@@ -392,6 +429,8 @@
name = "nresults"
+
+ at registerElement
class IsNotDefined (CardDAVEmptyElement):
"""
Specifies that the named vCard item does not exist.
@@ -399,6 +438,8 @@
"""
name = "is-not-defined"
+
+ at registerElement
class TextMatch (CardDAVTextElement):
"""
Specifies a substring match on a property or parameter value.
@@ -408,11 +449,11 @@
def fromString(clazz, string): #@NoSelf
if type(string) is str:
- return clazz(davxml.PCDATAElement(string))
+ return clazz(PCDATAElement(string))
elif type(string) is unicode:
- return clazz(davxml.PCDATAElement(string.encode("utf-8")))
+ return clazz(PCDATAElement(string.encode("utf-8")))
else:
- return clazz(davxml.PCDATAElement(str(string)))
+ return clazz(PCDATAElement(str(string)))
fromString = classmethod(fromString)
@@ -422,6 +463,8 @@
"match-type": False
}
+
+ at registerElement
class AddressBookMultiGet (CardDAVElement):
"""
CardDAV report used to retrieve specific vCard items via their URIs.
@@ -432,10 +475,10 @@
# To allow for an empty element in a supported-report-set property we need
# to relax the child restrictions
allowed_children = {
- (davxml.dav_namespace, "allprop" ): (0, 1),
- (davxml.dav_namespace, "propname"): (0, 1),
- (davxml.dav_namespace, "prop" ): (0, 1),
- (davxml.dav_namespace, "href" ): (0, None), # Actually ought to be (1, None)
+ (dav_namespace, "allprop" ): (0, 1),
+ (dav_namespace, "propname"): (0, 1),
+ (dav_namespace, "prop" ): (0, 1),
+ (dav_namespace, "href" ): (0, None), # Actually ought to be (1, None)
}
def __init__(self, *children, **attributes):
@@ -448,20 +491,22 @@
qname = child.qname()
if qname in (
- (davxml.dav_namespace, "allprop" ),
- (davxml.dav_namespace, "propname"),
- (davxml.dav_namespace, "prop" ),
+ (dav_namespace, "allprop" ),
+ (dav_namespace, "propname"),
+ (dav_namespace, "prop" ),
):
if property is not None:
raise ValueError("Only one of DAV:allprop, DAV:propname, DAV:prop allowed")
property = child
- elif qname == (davxml.dav_namespace, "href"):
+ elif qname == (dav_namespace, "href"):
resources.append(child)
self.property = property
self.resources = resources
+
+ at registerElement
class NoUIDConflict(CardDAVElement):
"""
CardDAV precondition used to indicate a UID conflict during PUT/COPY/MOVE.
@@ -469,8 +514,10 @@
"""
name = "no-uid-conflict"
- allowed_children = { (davxml.dav_namespace, "href"): (1, 1) }
+ allowed_children = { (dav_namespace, "href"): (1, 1) }
+
+ at registerElement
class SupportedFilter(CardDAVElement):
"""
CardDAV precondition used to indicate an unsupported component type in a
@@ -484,6 +531,8 @@
(carddav_namespace, "param-filter"): (0, None)
}
+
+ at registerElement
class DirectoryGateway(CardDAVElement):
"""
CardDAV property on a principal to indicate where the directory gateway resource is.
@@ -492,27 +541,32 @@
hidden = True
protected = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+ allowed_children = { (dav_namespace, "href"): (0, None) }
+
+ at registerElement
class Directory(CardDAVEmptyElement):
"""
CardDAV property on a principal to indicate where the directory resource is.
"""
name = "directory"
+
+ at registerElement
class DefaultAddressBookURL (CardDAVElement):
"""
A single href indicating which addressbook is the default.
"""
name = "default-addressbook-URL"
- allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+ allowed_children = { (dav_namespace, "href"): (0, 1) }
##
-# Extensions to davxml.ResourceType
+# Extensions to ResourceType
##
def _isAddressBook(self): return bool(self.childrenOfType(AddressBook))
-davxml.ResourceType.isAddressBook = _isAddressBook
-davxml.ResourceType.addressbook = davxml.ResourceType(davxml.Collection(), AddressBook())
-davxml.ResourceType.directory = davxml.ResourceType(davxml.Collection(), AddressBook(), Directory())
+ResourceType.isAddressBook = _isAddressBook
+
+ResourceType.addressbook = ResourceType(Collection(), AddressBook())
+ResourceType.directory = ResourceType(Collection(), AddressBook(), Directory())
Modified: CalendarServer/trunk/twistedcaldav/customxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/customxml.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/customxml.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -23,16 +23,19 @@
change.
"""
-from twext.web2.dav.davxml import dav_namespace
-from twext.web2.dav.davxml import twisted_dav_namespace
-from txdav.xml.base import twisted_private_namespace
-from twext.web2.dav import davxml
+from txdav.xml.element import registerElement, dav_namespace
+from txdav.xml.element import twisted_dav_namespace, twisted_private_namespace
+from txdav.xml.element import WebDAVElement, PCDATAElement
+from txdav.xml.element import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import PrincipalPropertySearch, Match
+from txdav.xml.element import ResourceType, Collection, Principal
from twistedcaldav import caldavxml, carddavxml
from twistedcaldav.ical import Component as iComponent
from pycalendar.datetime import PyCalendarDateTime
+
calendarserver_namespace = "http://calendarserver.org/ns/"
calendarserver_proxy_compliance = (
@@ -60,7 +63,9 @@
"calendarserver-sharing-no-scheduling",
)
-class TwistedCalendarSupportedComponents (davxml.WebDAVTextElement):
+
+ at registerElement
+class TwistedCalendarSupportedComponents (WebDAVTextElement):
"""
Contains the calendar supported components list.
"""
@@ -71,7 +76,9 @@
def getValue(self):
return str(self)
-class TwistedCalendarAccessProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class TwistedCalendarAccessProperty (WebDAVTextElement):
"""
Contains the calendar access level (private events) for the resource.
"""
@@ -82,7 +89,9 @@
def getValue(self):
return str(self)
-class TwistedSchedulingObjectResource (davxml.WebDAVTextElement):
+
+ at registerElement
+class TwistedSchedulingObjectResource (WebDAVTextElement):
"""
Indicates that the resource is a scheduling object resource.
"""
@@ -90,7 +99,9 @@
name = "scheduling-object-resource"
hidden = True
-class TwistedScheduleMatchETags(davxml.WebDAVElement):
+
+ at registerElement
+class TwistedScheduleMatchETags(WebDAVElement):
"""
List of ETags that can be used for a "weak" If-Match comparison.
"""
@@ -100,7 +111,9 @@
allowed_children = { (dav_namespace, "getetag"): (0, None) }
-class TwistedCalendarHasPrivateCommentsProperty (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class TwistedCalendarHasPrivateCommentsProperty (WebDAVEmptyElement):
"""
Indicates that a calendar resource has private comments.
@@ -112,7 +125,9 @@
name = "calendar-has-private-comments"
hidden = True
-class CalendarProxyRead (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class CalendarProxyRead (WebDAVEmptyElement):
"""
A read-only calendar user proxy principal resource.
(Apple Extension to CalDAV)
@@ -120,7 +135,9 @@
namespace = calendarserver_namespace
name = "calendar-proxy-read"
-class CalendarProxyWrite (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class CalendarProxyWrite (WebDAVEmptyElement):
"""
A read-write calendar user proxy principal resource.
(Apple Extension to CalDAV)
@@ -128,7 +145,9 @@
namespace = calendarserver_namespace
name = "calendar-proxy-write"
-class CalendarProxyReadFor (davxml.WebDAVElement):
+
+ at registerElement
+class CalendarProxyReadFor (WebDAVElement):
"""
List of principals granting read-only proxy status.
(Apple Extension to CalDAV)
@@ -140,7 +159,9 @@
allowed_children = { (dav_namespace, "href"): (0, None) }
-class CalendarProxyWriteFor (davxml.WebDAVElement):
+
+ at registerElement
+class CalendarProxyWriteFor (WebDAVElement):
"""
List of principals granting read-write proxy status.
(Apple Extension to CalDAV)
@@ -152,7 +173,9 @@
allowed_children = { (dav_namespace, "href"): (0, None) }
-class DropBoxHome (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class DropBoxHome (WebDAVEmptyElement):
"""
Denotes a drop box home collection (a collection that will contain drop boxes).
(Apple Extension to CalDAV)
@@ -160,7 +183,9 @@
namespace = calendarserver_namespace
name = "dropbox-home"
-class DropBox (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class DropBox (WebDAVEmptyElement):
"""
Denotes a drop box collection.
(Apple Extension to CalDAV)
@@ -168,7 +193,9 @@
namespace = calendarserver_namespace
name = "dropbox"
-class DropBoxHomeURL (davxml.WebDAVElement):
+
+ at registerElement
+class DropBoxHomeURL (WebDAVElement):
"""
A principal property to indicate the location of the drop box home.
(Apple Extension to CalDAV)
@@ -178,9 +205,11 @@
hidden = True
protected = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+ allowed_children = { (dav_namespace, "href"): (0, 1) }
-class GETCTag (davxml.WebDAVTextElement):
+
+ at registerElement
+class GETCTag (WebDAVTextElement):
"""
Contains the calendar collection entity tag.
"""
@@ -188,7 +217,9 @@
name = "getctag"
protected = True
-class CalendarAvailability (davxml.WebDAVTextElement):
+
+ at registerElement
+class CalendarAvailability (WebDAVTextElement):
"""
Contains the calendar availability property.
"""
@@ -232,7 +263,9 @@
return found
-class MaxCollections (davxml.WebDAVTextElement):
+
+ at registerElement
+class MaxCollections (WebDAVTextElement):
"""
Maximum number of child collections in a home collection
"""
@@ -241,7 +274,9 @@
hidden = True
protected = True
-class MaxResources (davxml.WebDAVTextElement):
+
+ at registerElement
+class MaxResources (WebDAVTextElement):
"""
Maximum number of child resources in a collection
"""
@@ -250,7 +285,9 @@
hidden = True
protected = True
-class Timezones (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Timezones (WebDAVEmptyElement):
"""
Denotes a timezone service resource.
(Apple Extension to CalDAV)
@@ -258,7 +295,9 @@
namespace = calendarserver_namespace
name = "timezones"
-class TZIDs (davxml.WebDAVElement):
+
+ at registerElement
+class TZIDs (WebDAVElement):
"""
Wraps a list of timezone ids.
"""
@@ -266,14 +305,18 @@
name = "tzids"
allowed_children = { (calendarserver_namespace, "tzid" ): (0, None) }
-class TZID (davxml.WebDAVTextElement):
+
+ at registerElement
+class TZID (WebDAVTextElement):
"""
A timezone id.
"""
namespace = calendarserver_namespace
name = "tzid"
-class TZData (davxml.WebDAVElement):
+
+ at registerElement
+class TZData (WebDAVElement):
"""
Wraps a list of timezone observances.
"""
@@ -281,7 +324,9 @@
name = "tzdata"
allowed_children = { (calendarserver_namespace, "observance" ): (0, None) }
-class Observance (davxml.WebDAVElement):
+
+ at registerElement
+class Observance (WebDAVElement):
"""
A timezone observance.
"""
@@ -292,21 +337,27 @@
(calendarserver_namespace, "utc-offset" ): (1, 1),
}
-class Onset (davxml.WebDAVTextElement):
+
+ at registerElement
+class Onset (WebDAVTextElement):
"""
The onset date-time for a DST transition.
"""
namespace = calendarserver_namespace
name = "onset"
-class UTCOffset (davxml.WebDAVTextElement):
+
+ at registerElement
+class UTCOffset (WebDAVTextElement):
"""
A UTC offset value for a timezone observance.
"""
namespace = calendarserver_namespace
name = "utc-offset"
-class PubSubPushTransportsProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubPushTransportsProperty (WebDAVTextElement):
"""
A calendar property describing the available push notification transports
available.
@@ -319,7 +370,9 @@
(calendarserver_namespace, "transport") : (0, 1),
}
-class PubSubTransportProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubTransportProperty (WebDAVTextElement):
namespace = calendarserver_namespace
name = "transport"
protected = True
@@ -335,32 +388,42 @@
(calendarserver_namespace, "xmpp-uri") : (1, 1),
}
-class PubSubSubscriptionProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubSubscriptionProperty (WebDAVTextElement):
namespace = calendarserver_namespace
name = "subscription-url"
protected = True
hidden = True
- allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+ allowed_children = { (dav_namespace, "href"): (0, 1) }
-class PubSubAPSBundleIDProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubAPSBundleIDProperty (WebDAVTextElement):
namespace = calendarserver_namespace
name = "apsbundleid"
protected = True
hidden = True
-class PubSubAPSEnvironmentProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubAPSEnvironmentProperty (WebDAVTextElement):
namespace = calendarserver_namespace
name = "env"
protected = True
hidden = True
-class PubSubXMPPPushKeyProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubXMPPPushKeyProperty (WebDAVTextElement):
namespace = calendarserver_namespace
name = "pushkey"
protected = True
hidden = True
-class PubSubXMPPURIProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubXMPPURIProperty (WebDAVTextElement):
"""
A calendar home property to indicate the pubsub XMPP URI to subscribe to
for notifications.
@@ -370,7 +433,9 @@
protected = True
hidden = True
-class PubSubHeartbeatProperty (davxml.WebDAVElement):
+
+ at registerElement
+class PubSubHeartbeatProperty (WebDAVElement):
"""
A calendar home property to indicate the pubsub XMPP URI to subscribe to
for server heartbeats.
@@ -384,19 +449,25 @@
(calendarserver_namespace, "xmpp-heartbeat-minutes" ) : (1, 1),
}
-class PubSubHeartbeatURIProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubHeartbeatURIProperty (WebDAVTextElement):
namespace = calendarserver_namespace
name = "xmpp-heartbeat-uri"
protected = True
hidden = True
-class PubSubHeartbeatMinutesProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubHeartbeatMinutesProperty (WebDAVTextElement):
namespace = calendarserver_namespace
name = "xmpp-heartbeat-minutes"
protected = True
hidden = True
-class PubSubXMPPServerProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubXMPPServerProperty (WebDAVTextElement):
"""
A calendar home property to indicate the pubsub XMPP hostname to
contact for notifications.
@@ -406,14 +477,17 @@
protected = True
hidden = True
-davxml.PrincipalPropertySearch.allowed_children[(calendarserver_namespace, "limit")] = (0, 1)
-davxml.PrincipalPropertySearch.allowed_attributes["type"] = False
-davxml.Match.allowed_attributes = {
+
+PrincipalPropertySearch.allowed_children[(calendarserver_namespace, "limit")] = (0, 1)
+PrincipalPropertySearch.allowed_attributes["type"] = False
+Match.allowed_attributes = {
"caseless": False,
"match-type": False,
}
-class Limit (davxml.WebDAVElement):
+
+ at registerElement
+class Limit (WebDAVElement):
"""
Client supplied limit for reports.
"""
@@ -423,14 +497,18 @@
(calendarserver_namespace, "nresults" ) : (1, 1),
}
-class NResults (davxml.WebDAVTextElement):
+
+ at registerElement
+class NResults (WebDAVTextElement):
"""
Number of results limit.
"""
namespace = calendarserver_namespace
name = "nresults"
-class FirstNameProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class FirstNameProperty (WebDAVTextElement):
"""
A property representing first name of a principal
"""
@@ -439,7 +517,9 @@
protected = True
hidden = True
-class LastNameProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class LastNameProperty (WebDAVTextElement):
"""
A property representing last name of a principal
"""
@@ -448,7 +528,9 @@
protected = True
hidden = True
-class EmailAddressProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class EmailAddressProperty (WebDAVTextElement):
"""
A property representing email address of a principal
"""
@@ -457,7 +539,9 @@
protected = True
hidden = True
-class EmailAddressSet (davxml.WebDAVElement):
+
+ at registerElement
+class EmailAddressSet (WebDAVElement):
"""
The list of email addresses of a principal
"""
@@ -467,7 +551,9 @@
allowed_children = { (calendarserver_namespace, "email-address"): (0, None) }
-class ExpandedGroupMemberSet (davxml.WebDAVElement):
+
+ at registerElement
+class ExpandedGroupMemberSet (WebDAVElement):
"""
The expanded list of members of a (group) principal
"""
@@ -478,7 +564,9 @@
allowed_children = { (dav_namespace, "href"): (0, None) }
-class ExpandedGroupMembership (davxml.WebDAVElement):
+
+ at registerElement
+class ExpandedGroupMembership (WebDAVElement):
"""
The expanded list of groups a principal is a member of
"""
@@ -489,7 +577,9 @@
allowed_children = { (dav_namespace, "href"): (0, None) }
-class IScheduleInbox (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class IScheduleInbox (WebDAVEmptyElement):
"""
Denotes the resourcetype of a iSchedule Inbox.
(CalDAV-s2s-xx, section x.x.x)
@@ -497,7 +587,9 @@
namespace = calendarserver_namespace
name = "ischedule-inbox"
-class FreeBusyURL (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class FreeBusyURL (WebDAVEmptyElement):
"""
Denotes the resourcetype of a free-busy URL resource.
(CalDAV-s2s-xx, section x.x.x)
@@ -505,7 +597,9 @@
namespace = calendarserver_namespace
name = "free-busy-url"
-class ScheduleChanges (davxml.WebDAVElement):
+
+ at registerElement
+class ScheduleChanges (WebDAVElement):
"""
Change indicator for a scheduling message.
"""
@@ -518,16 +612,20 @@
(calendarserver_namespace, "action" ) : (0, 1), # Have to allow 0 as element is empty in PROPFIND requests
}
-class ScheduleDefaultTasksURL (davxml.WebDAVElement):
+
+ at registerElement
+class ScheduleDefaultTasksURL (WebDAVElement):
"""
A single href indicating which calendar is the default for VTODO scheduling.
"""
namespace = calendarserver_namespace
name = "schedule-default-tasks-URL"
- allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+ allowed_children = { (dav_namespace, "href"): (0, 1) }
-class DTStamp (davxml.WebDAVTextElement):
+
+ at registerElement
+class DTStamp (WebDAVTextElement):
"""
A UTC timestamp in iCal format.
"""
@@ -536,9 +634,11 @@
def __init__(self, *children):
super(DTStamp, self).__init__(children)
- self.children = (davxml.PCDATAElement(PyCalendarDateTime.getNowUTC().getText()),)
+ self.children = (PCDATAElement(PyCalendarDateTime.getNowUTC().getText()),)
-class Action (davxml.WebDAVElement):
+
+ at registerElement
+class Action (WebDAVElement):
"""
A UTC timestamp in iCal format.
"""
@@ -551,14 +651,18 @@
(calendarserver_namespace, "reply" ) : (0, 1),
}
-class Create (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Create (WebDAVEmptyElement):
"""
Event created.
"""
namespace = calendarserver_namespace
name = "create"
-class Update (davxml.WebDAVElement):
+
+ at registerElement
+class Update (WebDAVElement):
"""
Event updated.
"""
@@ -568,7 +672,9 @@
(calendarserver_namespace, "recurrence" ) : (1, None),
}
-class Cancel (davxml.WebDAVElement):
+
+ at registerElement
+class Cancel (WebDAVElement):
"""
Event cancelled.
"""
@@ -578,7 +684,9 @@
(calendarserver_namespace, "recurrence" ) : (0, 1),
}
-class Reply (davxml.WebDAVElement):
+
+ at registerElement
+class Reply (WebDAVElement):
"""
Event replied to.
"""
@@ -589,7 +697,9 @@
(calendarserver_namespace, "recurrence" ) : (1, None),
}
-class Recurrence (davxml.WebDAVElement):
+
+ at registerElement
+class Recurrence (WebDAVElement):
"""
Changes to an event.
"""
@@ -601,21 +711,27 @@
(calendarserver_namespace, "changes" ) : (0, 1),
}
-class Master (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Master (WebDAVEmptyElement):
"""
Master instance changed.
"""
namespace = calendarserver_namespace
name = "master"
-class RecurrenceID (davxml.WebDAVTextElement):
+
+ at registerElement
+class RecurrenceID (WebDAVTextElement):
"""
A recurrence instance changed.
"""
namespace = calendarserver_namespace
name = "recurrenceid"
-class Changes (davxml.WebDAVElement):
+
+ at registerElement
+class Changes (WebDAVElement):
"""
Changes to an event.
"""
@@ -625,7 +741,9 @@
(calendarserver_namespace, "changed-property" ) : (0, None),
}
-class ChangedProperty (davxml.WebDAVElement):
+
+ at registerElement
+class ChangedProperty (WebDAVElement):
"""
Changes to a property.
"""
@@ -640,7 +758,9 @@
"name" : True,
}
-class ChangedParameter (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ChangedParameter (WebDAVEmptyElement):
"""
Changes to a parameter.
"""
@@ -651,14 +771,18 @@
"name" : True,
}
-class Attendee (davxml.WebDAVTextElement):
+
+ at registerElement
+class Attendee (WebDAVTextElement):
"""
An attendee calendar user address.
"""
namespace = calendarserver_namespace
name = "attendee"
-class RecordType (davxml.WebDAVTextElement):
+
+ at registerElement
+class RecordType (WebDAVTextElement):
"""
Exposes the type of a record
"""
@@ -667,68 +791,88 @@
protected = True
hidden = True
-class AutoSchedule (davxml.WebDAVTextElement):
+
+ at registerElement
+class AutoSchedule (WebDAVTextElement):
"""
Whether the principal automatically accepts invitations
"""
namespace = calendarserver_namespace
name = "auto-schedule"
-class AutoScheduleMode (davxml.WebDAVTextElement):
+
+ at registerElement
+class AutoScheduleMode (WebDAVTextElement):
"""
The principal's auto-schedule mode
"""
namespace = calendarserver_namespace
name = "auto-schedule-mode"
+
##
# Sharing
##
-class ReadAccess (davxml.WebDAVEmptyElement):
+ at registerElement
+class ReadAccess (WebDAVEmptyElement):
"""
Denotes read and update attendee partstat on a shared calendar.
"""
namespace = calendarserver_namespace
name = "read"
-class ReadWriteAccess (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ReadWriteAccess (WebDAVEmptyElement):
"""
Denotes read and write access on a shared calendar.
"""
namespace = calendarserver_namespace
name = "read-write"
-class UID (davxml.WebDAVTextElement):
+
+ at registerElement
+class UID (WebDAVTextElement):
namespace = calendarserver_namespace
name = "uid"
-class InReplyTo (davxml.WebDAVTextElement):
+
+ at registerElement
+class InReplyTo (WebDAVTextElement):
namespace = calendarserver_namespace
name = "in-reply-to"
-class SharedOwner (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class SharedOwner (WebDAVEmptyElement):
"""
Denotes a shared collection.
"""
namespace = calendarserver_namespace
name = "shared-owner"
-class Shared (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Shared (WebDAVEmptyElement):
"""
Denotes a shared collection.
"""
namespace = calendarserver_namespace
name = "shared"
-class Subscribed (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Subscribed (WebDAVEmptyElement):
"""
Denotes a subscribed calendar collection.
"""
namespace = calendarserver_namespace
name = "subscribed"
-class SharedURL (davxml.WebDAVTextElement):
+
+ at registerElement
+class SharedURL (WebDAVTextElement):
"""
The source url for a shared calendar.
"""
@@ -737,7 +881,9 @@
protected = True
hidden = True
-class SharedAs (davxml.WebDAVElement):
+
+ at registerElement
+class SharedAs (WebDAVElement):
"""
The url for a shared calendar.
"""
@@ -748,21 +894,27 @@
(dav_namespace, "href") : (1, 1),
}
-class SharedAcceptEmailNotification (davxml.WebDAVTextElement):
+
+ at registerElement
+class SharedAcceptEmailNotification (WebDAVTextElement):
"""
The accept email flag for a shared calendar.
"""
namespace = calendarserver_namespace
name = "shared-accept-email-notification"
-class Birthday (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Birthday (WebDAVEmptyElement):
"""
Denotes a birthday calendar collection.
"""
namespace = calendarserver_namespace
name = "birthday"
-class AllowedSharingModes (davxml.WebDAVElement):
+
+ at registerElement
+class AllowedSharingModes (WebDAVElement):
namespace = calendarserver_namespace
name = "allowed-sharing-modes"
protected = True
@@ -773,15 +925,21 @@
(calendarserver_namespace, "can-be-published") : (0, 1),
}
-class CanBeShared (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class CanBeShared (WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "can-be-shared"
-class CanBePublished (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class CanBePublished (WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "can-be-published"
-class InviteShare (davxml.WebDAVElement):
+
+ at registerElement
+class InviteShare (WebDAVElement):
namespace = calendarserver_namespace
name = "share"
@@ -790,7 +948,9 @@
(calendarserver_namespace, "remove") : (0, None),
}
-class InviteSet (davxml.WebDAVElement):
+
+ at registerElement
+class InviteSet (WebDAVElement):
namespace = calendarserver_namespace
name = "set"
@@ -803,7 +963,9 @@
(calendarserver_namespace, "read-write-schedule") : (0, 1),
}
-class InviteRemove (davxml.WebDAVElement):
+
+ at registerElement
+class InviteRemove (WebDAVElement):
namespace = calendarserver_namespace
name = "remove"
@@ -814,7 +976,9 @@
(calendarserver_namespace, "read-write-schedule") : (0, 1),
}
-class InviteUser (davxml.WebDAVElement):
+
+ at registerElement
+class InviteUser (WebDAVElement):
namespace = calendarserver_namespace
name = "user"
@@ -831,7 +995,9 @@
(calendarserver_namespace, "summary") : (0, 1),
}
-class InviteAccess (davxml.WebDAVElement):
+
+ at registerElement
+class InviteAccess (WebDAVElement):
namespace = calendarserver_namespace
name = "access"
@@ -841,7 +1007,9 @@
(calendarserver_namespace, "read-write-schedule") : (0, 1),
}
-class Invite (davxml.WebDAVElement):
+
+ at registerElement
+class Invite (WebDAVElement):
namespace = calendarserver_namespace
name = "invite"
@@ -849,31 +1017,45 @@
(calendarserver_namespace, "user") : (0, None),
}
-class InviteSummary (davxml.WebDAVTextElement):
+
+ at registerElement
+class InviteSummary (WebDAVTextElement):
namespace = calendarserver_namespace
name = "summary"
-class InviteStatusNoResponse (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusNoResponse (WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "invite-noresponse"
-class InviteStatusDeleted (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusDeleted (WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "invite-deleted"
-class InviteStatusAccepted (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusAccepted (WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "invite-accepted"
-class InviteStatusDeclined (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusDeclined (WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "invite-declined"
-class InviteStatusInvalid (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusInvalid (WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "invite-invalid"
-class HostURL (davxml.WebDAVElement):
+
+ at registerElement
+class HostURL (WebDAVElement):
"""
The source for a shared calendar
"""
@@ -884,7 +1066,9 @@
(dav_namespace, "href") : (0, None)
}
-class Organizer (davxml.WebDAVElement):
+
+ at registerElement
+class Organizer (WebDAVElement):
"""
The organizer for a shared calendar
"""
@@ -896,14 +1080,18 @@
(calendarserver_namespace, "common-name") : (0, 1)
}
-class CommonName (davxml.WebDAVTextElement):
+
+ at registerElement
+class CommonName (WebDAVTextElement):
"""
Common name for Sharer or Sharee
"""
namespace = calendarserver_namespace
name = "common-name"
-class InviteNotification (davxml.WebDAVElement):
+
+ at registerElement
+class InviteNotification (WebDAVElement):
namespace = calendarserver_namespace
name = "invite-notification"
@@ -924,7 +1112,9 @@
"shared-type" : True,
}
-class InviteReply (davxml.WebDAVElement):
+
+ at registerElement
+class InviteReply (WebDAVElement):
namespace = calendarserver_namespace
name = "invite-reply"
@@ -937,7 +1127,9 @@
(calendarserver_namespace, "summary") : (0, 1),
}
-class ResourceUpdateNotification (davxml.WebDAVElement):
+
+ at registerElement
+class ResourceUpdateNotification (WebDAVElement):
namespace = calendarserver_namespace
name = "resource-update-notification"
@@ -949,19 +1141,27 @@
(calendarserver_namespace, "resource-deleted-notification") : (0, 1),
}
-class ResourceUpdateAdded(davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ResourceUpdateAdded(WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "resource-added-notification"
-class ResourceUpdateUpdated(davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ResourceUpdateUpdated(WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "resource-updated-notification"
-class ResourceUpdateDeleted(davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ResourceUpdateDeleted(WebDAVEmptyElement):
namespace = calendarserver_namespace
name = "resource-deleted-notification"
-class SharedCalendarUpdateNotification (davxml.WebDAVElement):
+
+ at registerElement
+class SharedCalendarUpdateNotification (WebDAVElement):
namespace = calendarserver_namespace
name = "shared-update-notification"
@@ -977,7 +1177,8 @@
# Notifications
##
-class Notification (davxml.WebDAVElement):
+ at registerElement
+class Notification (WebDAVElement):
"""
Denotes a notification collection, or a notification message.
"""
@@ -992,7 +1193,9 @@
(calendarserver_namespace, "shared-update-notification") : (0, None),
}
-class NotificationURL (davxml.WebDAVElement):
+
+ at registerElement
+class NotificationURL (WebDAVElement):
"""
A principal property to indicate the notification collection for the principal.
"""
@@ -1005,7 +1208,9 @@
(dav_namespace, "href") : (0, 1)
}
-class NotificationType (davxml.WebDAVElement):
+
+ at registerElement
+class NotificationType (WebDAVElement):
"""
A property to indicate what type of notification the resource represents.
"""
@@ -1019,16 +1224,20 @@
(calendarserver_namespace, "invite-reply") : (0, None),
}
-class Link (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Link (WebDAVEmptyElement):
"""
Denotes a linked resource.
"""
namespace = calendarserver_namespace
name = "link"
+
mm_namespace = "http://me.com/_namespace/"
-class Multiput (davxml.WebDAVElement):
+ at registerElement
+class Multiput (WebDAVElement):
namespace = mm_namespace
name = "multiput"
@@ -1036,32 +1245,40 @@
(mm_namespace, "resource") : (1, None),
}
-class Resource (davxml.WebDAVElement):
+
+ at registerElement
+class Resource (WebDAVElement):
namespace = mm_namespace
name = "resource"
allowed_children = {
- (davxml, "href") : (0, 1),
- (mm_namespace, "if-match") : (0, 1),
- (davxml, "set") : (0, 1),
- (davxml, "remove") : (0, 1),
- (mm_namespace, "delete") : (0, 1),
+ (dav_namespace, "href") : (0, 1),
+ (mm_namespace, "if-match") : (0, 1),
+ (dav_namespace, "set") : (0, 1),
+ (dav_namespace, "remove") : (0, 1),
+ (mm_namespace, "delete") : (0, 1),
}
-class IfMatch (davxml.WebDAVElement):
+
+ at registerElement
+class IfMatch (WebDAVElement):
namespace = mm_namespace
name = "if-match"
allowed_children = {
- (davxml, "getetag") : (1, 1),
+ (dav_namespace, "getetag") : (1, 1),
}
-class Delete (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Delete (WebDAVEmptyElement):
namespace = mm_namespace
name = "delete"
-class BulkRequests (davxml.WebDAVElement):
+
+ at registerElement
+class BulkRequests (WebDAVElement):
namespace = mm_namespace
name = "bulk-requests"
hidden = True
@@ -1072,7 +1289,9 @@
(mm_namespace, "crud") : (0, 1),
}
-class Simple (davxml.WebDAVElement):
+
+ at registerElement
+class Simple (WebDAVElement):
namespace = mm_namespace
name = "simple"
hidden = True
@@ -1083,7 +1302,9 @@
(mm_namespace, "max-bytes") : (1, 1),
}
-class CRUD (davxml.WebDAVElement):
+
+ at registerElement
+class CRUD (WebDAVElement):
namespace = mm_namespace
name = "crud"
hidden = True
@@ -1094,11 +1315,15 @@
(mm_namespace, "max-bytes") : (1, 1),
}
-class MaxBulkResources (davxml.WebDAVTextElement):
+
+ at registerElement
+class MaxBulkResources (WebDAVTextElement):
namespace = mm_namespace
name = "max-resources"
-class MaxBulkBytes (davxml.WebDAVTextElement):
+
+ at registerElement
+class MaxBulkBytes (WebDAVTextElement):
namespace = mm_namespace
name = "max-bytes"
@@ -1107,23 +1332,31 @@
# Client properties we might care about
#
-class CalendarColor(davxml.WebDAVTextElement):
+ at registerElement
+class CalendarColor(WebDAVTextElement):
namespace = "http://apple.com/ns/ical/"
name = "calendar-color"
##
-# Extensions to davxml.ResourceType
+# Extensions to ResourceType
##
-davxml.ResourceType.dropboxhome = davxml.ResourceType(davxml.Collection(), DropBoxHome())
-davxml.ResourceType.dropbox = davxml.ResourceType(davxml.Collection(), DropBox())
-davxml.ResourceType.calendarproxyread = davxml.ResourceType(davxml.Principal(), davxml.Collection(), CalendarProxyRead())
-davxml.ResourceType.calendarproxywrite = davxml.ResourceType(davxml.Principal(), davxml.Collection(), CalendarProxyWrite())
-davxml.ResourceType.timezones = davxml.ResourceType(Timezones())
-davxml.ResourceType.ischeduleinbox = davxml.ResourceType(IScheduleInbox())
-davxml.ResourceType.freebusyurl = davxml.ResourceType(FreeBusyURL())
-davxml.ResourceType.notification = davxml.ResourceType(davxml.Collection(), Notification())
-davxml.ResourceType.sharedownercalendar = davxml.ResourceType(davxml.Collection(), caldavxml.Calendar(), SharedOwner())
-davxml.ResourceType.sharedcalendar = davxml.ResourceType(davxml.Collection(), caldavxml.Calendar(), Shared())
-davxml.ResourceType.sharedaddressbook = davxml.ResourceType(davxml.Collection(), carddavxml.AddressBook(), Shared())
-davxml.ResourceType.link = davxml.ResourceType(Link())
+ResourceType.dropboxhome = ResourceType(Collection(), DropBoxHome())
+ResourceType.dropbox = ResourceType(Collection(), DropBox())
+
+ResourceType.calendarproxyread = ResourceType(Principal(), Collection(), CalendarProxyRead())
+ResourceType.calendarproxywrite = ResourceType(Principal(), Collection(), CalendarProxyWrite())
+
+ResourceType.timezones = ResourceType(Timezones())
+
+ResourceType.ischeduleinbox = ResourceType(IScheduleInbox())
+
+ResourceType.freebusyurl = ResourceType(FreeBusyURL())
+
+ResourceType.notification = ResourceType(Collection(), Notification())
+
+ResourceType.sharedownercalendar = ResourceType(Collection(), caldavxml.Calendar(), SharedOwner())
+ResourceType.sharedcalendar = ResourceType(Collection(), caldavxml.Calendar(), Shared())
+ResourceType.sharedaddressbook = ResourceType(Collection(), carddavxml.AddressBook(), Shared())
+
+ResourceType.link = ResourceType(Link())
Modified: CalendarServer/trunk/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/extensions.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/extensions.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -47,9 +47,9 @@
from twext.web2.http_headers import MimeType
from twext.web2.stream import FileStream
from twext.web2.static import MetaDataMixin, StaticRenderMixin
-from twext.web2.dav import davxml
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
from twext.web2.dav.auth import PrincipalCredentials
-from twext.web2.dav.davxml import dav_namespace
from twext.web2.dav.http import MultiStatusResponse
from twext.web2.dav.idav import IDAVPrincipalResource
from twext.web2.dav.static import DAVFile as SuperDAVFile
@@ -102,8 +102,8 @@
hasattr(request, "credentialFactories") and
hasattr(request, "loginInterfaces")
):
- request.authnUser = davxml.Principal(davxml.Unauthenticated())
- request.authzUser = davxml.Principal(davxml.Unauthenticated())
+ request.authnUser = element.Principal(element.Unauthenticated())
+ request.authzUser = element.Principal(element.Unauthenticated())
returnValue((request.authnUser, request.authzUser,))
authHeader = request.headers.getHeader("authorization")
@@ -155,8 +155,8 @@
# This request has already been authenticated via the wiki
returnValue((request.authnUser, request.authzUser))
- request.authnUser = davxml.Principal(davxml.Unauthenticated())
- request.authzUser = davxml.Principal(davxml.Unauthenticated())
+ request.authnUser = element.Principal(element.Unauthenticated())
+ request.authzUser = element.Principal(element.Unauthenticated())
returnValue((request.authnUser, request.authzUser,))
def principalsForAuthID(self, request, creds):
@@ -290,8 +290,8 @@
searching.
"""
# Verify root element
- if not isinstance(principal_property_search, davxml.PrincipalPropertySearch):
- msg = "%s expected as root element, not %s." % (davxml.PrincipalPropertySearch.sname(), principal_property_search.sname())
+ if not isinstance(principal_property_search, element.PrincipalPropertySearch):
+ msg = "%s expected as root element, not %s." % (element.PrincipalPropertySearch.sname(), principal_property_search.sname())
log.warn(msg)
raise HTTPError(StatusResponse(responsecode.BAD_REQUEST, msg))
@@ -334,10 +334,10 @@
applyTo = True
elif child.qname() == (dav_namespace, "property-search"):
- props = child.childOfType(davxml.PropertyContainer)
+ props = child.childOfType(element.PropertyContainer)
props.removeWhitespaceNodes()
- match = child.childOfType(davxml.Match)
+ match = child.childOfType(element.Match)
caseless = match.attributes.get("caseless", "yes")
if caseless not in ("yes", "no"):
msg = "Bad XML: unknown value for caseless attribute: %s" % (caseless,)
@@ -434,7 +434,7 @@
yield prop_common.responseForHref(
request,
responses,
- davxml.HRef.fromString(url),
+ element.HRef.fromString(url),
resource,
propertiesForResource,
propElement
@@ -444,13 +444,13 @@
if resultsWereLimited[0] == "server":
log.err("Too many matching resources in "
"principal-property-search report")
- responses.append(davxml.StatusResponse(
- davxml.HRef.fromString(request.uri),
- davxml.Status.fromResponseCode(
+ responses.append(element.StatusResponse(
+ element.HRef.fromString(request.uri),
+ element.Status.fromResponseCode(
responsecode.INSUFFICIENT_STORAGE_SPACE
),
- davxml.Error(davxml.NumberOfMatchesWithinLimits()),
- davxml.ResponseDescription("Results limited by %s at %d"
+ element.Error(element.NumberOfMatchesWithinLimits()),
+ element.ResponseDescription("Results limited by %s at %d"
% resultsWereLimited),
))
returnValue(MultiStatusResponse(responses))
@@ -714,7 +714,7 @@
# Allow live property to be overridden by dead property
if self.deadProperties().contains((dav_namespace, "resourcetype")):
return self.deadProperties().get((dav_namespace, "resourcetype"))
- return davxml.ResourceType(davxml.Collection()) if self.isCollection() else davxml.ResourceType()
+ return element.ResourceType(element.Collection()) if self.isCollection() else element.ResourceType()
def contentType(self):
return MimeType("httpd", "unix-directory") if self.isCollection() else None
@@ -842,13 +842,13 @@
if name == "expanded-group-member-set":
principals = (yield self.expandedGroupMembers())
returnValue(customxml.ExpandedGroupMemberSet(
- *[davxml.HRef(p.principalURL()) for p in principals]
+ *[element.HRef(p.principalURL()) for p in principals]
))
elif name == "expanded-group-membership":
principals = (yield self.expandedGroupMemberships())
returnValue(customxml.ExpandedGroupMembership(
- *[davxml.HRef(p.principalURL()) for p in principals]
+ *[element.HRef(p.principalURL()) for p in principals]
))
elif name == "record-type":
@@ -882,9 +882,9 @@
if self.deadProperties().contains((dav_namespace, "resourcetype")):
return self.deadProperties().get((dav_namespace, "resourcetype"))
if self.isCollection():
- return davxml.ResourceType(davxml.Principal(), davxml.Collection())
+ return element.ResourceType(element.Principal(), element.Collection())
else:
- return davxml.ResourceType(davxml.Principal())
+ return element.ResourceType(element.Principal())
@@ -899,8 +899,8 @@
if self.deadProperties().contains((dav_namespace, "resourcetype")):
return self.deadProperties().get((dav_namespace, "resourcetype"))
if self.isCollection():
- return davxml.ResourceType.collection #@UndefinedVariable
- return davxml.ResourceType.empty #@UndefinedVariable
+ return element.ResourceType.collection #@UndefinedVariable
+ return element.ResourceType.empty #@UndefinedVariable
def render(self, request):
if not self.fp.exists():
Modified: CalendarServer/trunk/twistedcaldav/method/report_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_common.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/method/report_common.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -39,8 +39,8 @@
from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
from twisted.python.failure import Failure
from twext.web2 import responsecode
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVElement
+
+from txdav.xml import element
from twext.web2.dav.http import statusForFailure
from twext.web2.dav.method.propfind import propertyName
from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
@@ -183,14 +183,14 @@
for status in properties_by_status:
properties = properties_by_status[status]
if properties:
- xml_status = davxml.Status.fromResponseCode(status)
- xml_container = davxml.PropertyContainer(*properties)
- xml_propstat = davxml.PropertyStatus(xml_container, xml_status)
+ xml_status = element.Status.fromResponseCode(status)
+ xml_container = element.PropertyContainer(*properties)
+ xml_propstat = element.PropertyStatus(xml_container, xml_status)
propstats.append(xml_propstat)
if propstats:
- responses.append(davxml.PropertyStatusResponse(href, *propstats))
+ responses.append(element.PropertyStatusResponse(href, *propstats))
d = propertiesForResource(request, propertyreq, resource, calendar, timezone, vcard, isowner)
d.addCallback(_defer)
@@ -354,7 +354,7 @@
properties_by_status[responsecode.OK].append(propvalue)
continue
- if isinstance(property, WebDAVElement):
+ if isinstance(property, element.WebDAVElement):
qname = property.qname()
else:
qname = property
Modified: CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -20,16 +20,13 @@
__all__ = ["report_DAV__sync_collection"]
-from twext.python.log import Logger
-from twext.web2.dav.davxml import SyncToken
-from twext.web2.dav.http import ErrorResponse
-
from twisted.internet.defer import inlineCallbacks, returnValue
from twisted.python.failure import Failure
+
+from twext.python.log import Logger
+from txdav.xml import element
+from twext.web2.dav.http import ErrorResponse
from twext.web2 import responsecode
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVElement
-from txdav.xml.extensions import SyncCollection
from twext.web2.dav.http import MultiStatusResponse, statusForFailure
from twext.web2.dav.method.prop_common import responseForHref
from twext.web2.dav.method.propfind import propertyName
@@ -51,11 +48,11 @@
"""
# These resource support the report
- if not config.EnableSyncReport or davxml.Report(SyncCollection(),) not in self.supportedReports():
+ if not config.EnableSyncReport or element.Report(element.SyncCollection(),) not in self.supportedReports():
log.err("sync-collection report is only allowed on calendar/inbox/addressbook/notification collection resources %s" % (self,))
raise HTTPError(ErrorResponse(
responsecode.FORBIDDEN,
- davxml.SupportedReport(),
+ element.SupportedReport(),
"Report not supported on this resource",
))
@@ -92,7 +89,7 @@
}
for property in props:
- if isinstance(property, WebDAVElement):
+ if isinstance(property, element.WebDAVElement):
qname = property.qname()
else:
qname = property
@@ -132,12 +129,12 @@
lambda x, y: ok_resources.append((x, y)),
lambda x, y: forbidden_resources.append((x, y)),
changed,
- (davxml.Read(),),
+ (element.Read(),),
inherited_aces=filteredaces
)
for child, child_uri in ok_resources:
- href = davxml.HRef.fromString(child_uri)
+ href = element.HRef.fromString(child_uri)
try:
yield responseForHref(
request,
@@ -155,7 +152,7 @@
log.err("Missing resource during sync: %s" % (href,))
for child, child_uri in forbidden_resources:
- href = davxml.HRef.fromString(child_uri)
+ href = element.HRef.fromString(child_uri)
try:
yield responseForHref(
request,
@@ -173,17 +170,17 @@
log.err("Missing resource during sync: %s" % (href,))
for name in removed:
- href = davxml.HRef.fromString(joinURL(request.uri, name))
- responses.append(davxml.StatusResponse(davxml.HRef.fromString(href), davxml.Status.fromResponseCode(responsecode.NOT_FOUND)))
+ href = element.HRef.fromString(joinURL(request.uri, name))
+ responses.append(element.StatusResponse(element.HRef.fromString(href), element.Status.fromResponseCode(responsecode.NOT_FOUND)))
for name in notallowed:
- href = davxml.HRef.fromString(joinURL(request.uri, name))
- responses.append(davxml.StatusResponse(davxml.HRef.fromString(href), davxml.Status.fromResponseCode(responsecode.NOT_ALLOWED)))
+ href = element.HRef.fromString(joinURL(request.uri, name))
+ responses.append(element.StatusResponse(element.HRef.fromString(href), element.Status.fromResponseCode(responsecode.NOT_ALLOWED)))
if not hasattr(request, "extendedLogItems"):
request.extendedLogItems = {}
request.extendedLogItems["responses"] = len(responses)
- responses.append(SyncToken.fromString(newtoken))
+ responses.append(element.SyncToken.fromString(newtoken))
returnValue(MultiStatusResponse(responses))
Modified: CalendarServer/trunk/twistedcaldav/mkcolxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/mkcolxml.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/mkcolxml.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -26,6 +26,7 @@
"""
from twext.web2.dav import davxml
+from txdav.xml.element import registerElement
##
# Extended MKCOL objects
@@ -35,6 +36,8 @@
"extended-mkcol",
)
+
+ at registerElement
class MakeCollection (davxml.WebDAVElement):
"""
Top-level element for request body in MKCOL.
@@ -46,6 +49,8 @@
child_types = { "WebDAVUnknownElement": (0, None) }
+
+ at registerElement
class MakeCollectionResponse (davxml.WebDAVElement):
"""
Top-level element for response body in MKCOL.
Modified: CalendarServer/trunk/twistedcaldav/resource.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/resource.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/resource.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -37,23 +37,23 @@
from zope.interface import implements
-from twext.python.log import LoggingMixIn
-from twext.web2.dav.davxml import SyncCollection
-from twext.web2.dav.http import ErrorResponse
-
from twisted.internet.defer import succeed, maybeDeferred, fail
from twisted.internet.defer import inlineCallbacks, returnValue
+from twext.python.log import LoggingMixIn
+
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
+
from twext.web2 import responsecode, http, http_headers
-from twext.web2.dav import davxml
from twext.web2.dav.auth import AuthenticationWrapper as SuperAuthenticationWrapper
-from twext.web2.dav.davxml import dav_namespace
from twext.web2.dav.idav import IDAVPrincipalCollectionResource
from twext.web2.dav.resource import AccessDeniedError, DAVPrincipalCollectionResource,\
davPrivilegeSet
from twext.web2.dav.resource import TwistedACLInheritable
from twext.web2.dav.util import joinURL, parentForURL, normalizeURL
from twext.web2.http import HTTPError, RedirectResponse, StatusResponse, Response
+from twext.web2.dav.http import ErrorResponse
from twext.web2.http_headers import MimeType, ETag
from twext.web2.stream import MemoryStream
@@ -146,37 +146,37 @@
top_supported_privileges = []
- for supported_privilege in davPrivilegeSet.childrenOfType(davxml.SupportedPrivilege):
- all_privilege = supported_privilege.childOfType(davxml.Privilege)
- if isinstance(all_privilege.children[0], davxml.All):
- all_description = supported_privilege.childOfType(davxml.Description)
+ for supported_privilege in davPrivilegeSet.childrenOfType(element.SupportedPrivilege):
+ all_privilege = supported_privilege.childOfType(element.Privilege)
+ if isinstance(all_privilege.children[0], element.All):
+ all_description = supported_privilege.childOfType(element.Description)
all_supported_privileges = []
- for all_supported_privilege in supported_privilege.childrenOfType(davxml.SupportedPrivilege):
- read_privilege = all_supported_privilege.childOfType(davxml.Privilege)
- if isinstance(read_privilege.children[0], davxml.Read):
- read_description = all_supported_privilege.childOfType(davxml.Description)
- read_supported_privileges = list(all_supported_privilege.childrenOfType(davxml.SupportedPrivilege))
+ for all_supported_privilege in supported_privilege.childrenOfType(element.SupportedPrivilege):
+ read_privilege = all_supported_privilege.childOfType(element.Privilege)
+ if isinstance(read_privilege.children[0], element.Read):
+ read_description = all_supported_privilege.childOfType(element.Description)
+ read_supported_privileges = list(all_supported_privilege.childrenOfType(element.SupportedPrivilege))
read_supported_privileges.append(
- davxml.SupportedPrivilege(
- davxml.Privilege(caldavxml.ReadFreeBusy()),
- davxml.Description("allow free busy report query", **{"xml:lang": "en"}),
+ element.SupportedPrivilege(
+ element.Privilege(caldavxml.ReadFreeBusy()),
+ element.Description("allow free busy report query", **{"xml:lang": "en"}),
)
)
all_supported_privileges.append(
- davxml.SupportedPrivilege(read_privilege, read_description, *read_supported_privileges)
+ element.SupportedPrivilege(read_privilege, read_description, *read_supported_privileges)
)
edited = True
else:
all_supported_privileges.append(all_supported_privilege)
top_supported_privileges.append(
- davxml.SupportedPrivilege(all_privilege, all_description, *all_supported_privileges)
+ element.SupportedPrivilege(all_privilege, all_description, *all_supported_privileges)
)
else:
top_supported_privileges.append(supported_privilege)
assert edited, "Structure of davPrivilegeSet changed in a way that I don't know how to extend for calendarPrivilegeSet"
- return davxml.SupportedPrivilegeSet(*top_supported_privileges)
+ return element.SupportedPrivilegeSet(*top_supported_privileges)
calendarPrivilegeSet = _calendarPrivilegeSet()
@@ -381,7 +381,7 @@
def liveProperties(self):
baseProperties = (
- davxml.Owner.qname(), # Private Events needs this but it is also OK to return empty
+ element.Owner.qname(), # Private Events needs this but it is also OK to return empty
)
if self.isPseudoCalendarCollection():
@@ -405,7 +405,7 @@
if self.isCalendarCollection():
baseProperties += (
- davxml.ResourceID.qname(),
+ element.ResourceID.qname(),
# These are "live" properties in the sense of WebDAV, however "live" for twext actually means
# ones that are also always present, but the default alarm properties are allowed to be absent
@@ -420,7 +420,7 @@
if self.isAddressBookCollection():
baseProperties += (
- davxml.ResourceID.qname(),
+ element.ResourceID.qname(),
carddavxml.SupportedAddressData.qname(),
customxml.GETCTag.qname(),
customxml.PubSubXMPPPushKeyProperty.qname(),
@@ -435,11 +435,11 @@
caldavxml.ScheduleTag.qname(),
)
- if config.EnableSyncReport and (davxml.Report(SyncCollection(),) in self.supportedReports()):
- baseProperties += (davxml.SyncToken.qname(),)
+ if config.EnableSyncReport and (element.Report(element.SyncCollection(),) in self.supportedReports()):
+ baseProperties += (element.SyncToken.qname(),)
if config.EnableAddMember and (self.isCalendarCollection() or self.isAddressBookCollection()):
- baseProperties += (davxml.AddMember.qname(),)
+ baseProperties += (element.AddMember.qname(),)
if config.Sharing.Enabled:
if config.Sharing.Calendars.Enabled and self.isCalendarCollection():
@@ -474,7 +474,7 @@
"""
if qname in self.liveProperties():
if qname in (
- davxml.DisplayName.qname(),
+ element.DisplayName.qname(),
customxml.Invite.qname(),
):
return False
@@ -598,31 +598,31 @@
@inlineCallbacks
def _readGlobalProperty(self, qname, property, request):
- if qname == davxml.Owner.qname():
+ if qname == element.Owner.qname():
owner = (yield self.owner(request))
- returnValue(davxml.Owner(owner))
+ returnValue(element.Owner(owner))
- elif qname == davxml.ResourceType.qname():
+ elif qname == element.ResourceType.qname():
returnValue(self.resourceType())
- elif qname == davxml.ResourceID.qname():
- returnValue(davxml.ResourceID(davxml.HRef.fromString(self.resourceID())))
+ elif qname == element.ResourceID.qname():
+ returnValue(element.ResourceID(element.HRef.fromString(self.resourceID())))
elif qname == customxml.GETCTag.qname() and (
self.isPseudoCalendarCollection() or self.isAddressBookCollection()
):
returnValue(customxml.GETCTag.fromString((yield self.getInternalSyncToken())))
- elif qname == davxml.SyncToken.qname() and config.EnableSyncReport and (
- davxml.Report(SyncCollection(),) in self.supportedReports()
+ elif qname == element.SyncToken.qname() and config.EnableSyncReport and (
+ element.Report(element.SyncCollection(),) in self.supportedReports()
):
- returnValue(davxml.SyncToken.fromString((yield self.getSyncToken())))
+ returnValue(element.SyncToken.fromString((yield self.getSyncToken())))
- elif qname == davxml.AddMember.qname() and config.EnableAddMember and (
+ elif qname == element.AddMember.qname() and config.EnableAddMember and (
self.isCalendarCollection() or self.isAddressBookCollection()
):
url = (yield self.canonicalURL(request))
- returnValue(davxml.AddMember(davxml.HRef.fromString(url + "/;add-member")))
+ returnValue(element.AddMember(element.HRef.fromString(url + "/;add-member")))
elif qname == caldavxml.SupportedCalendarComponentSet.qname() and self.isPseudoCalendarCollection():
returnValue(self.getSupportedComponentSet())
@@ -707,7 +707,7 @@
isvirt = self.isVirtualShare()
if isvirt:
- returnValue(customxml.SharedURL(davxml.HRef.fromString(self._share.hosturl)))
+ returnValue(customxml.SharedURL(element.HRef.fromString(self._share.hosturl)))
else:
returnValue(None)
@@ -716,7 +716,7 @@
@inlineCallbacks
def writeProperty(self, property, request):
- assert isinstance(property, davxml.WebDAVElement), (
+ assert isinstance(property, element.WebDAVElement), (
"%r is not a WebDAVElement instance" % (property,)
)
@@ -805,7 +805,7 @@
yield self._preProcessWriteProperty(property, request)
- if property.qname() == davxml.ResourceType.qname():
+ if property.qname() == element.ResourceType.qname():
if self.isCalendarCollection() or self.isAddressBookCollection():
sawShare = [child for child in property.children if child.qname() == (calendarserver_namespace, "shared-owner")]
if sawShare:
@@ -823,7 +823,7 @@
# Check if adding or removing share
shared = (yield self.isShared(request))
for child in property.children:
- if child.qname() == davxml.Collection.qname():
+ if child.qname() == element.Collection.qname():
break
else:
raise HTTPError(StatusResponse(
@@ -893,37 +893,37 @@
if self.accessMode == Component.ACCESS_PRIVATE:
newacls.extend(config.AdminACEs)
newacls.extend(config.ReadACEs)
- newacls.append(davxml.ACE(
- davxml.Invert(
- davxml.Principal(owner),
+ newacls.append(element.ACE(
+ element.Invert(
+ element.Principal(owner),
),
- davxml.Deny(
- davxml.Privilege(
- davxml.Read(),
+ element.Deny(
+ element.Privilege(
+ element.Read(),
),
- davxml.Privilege(
- davxml.Write(),
+ element.Privilege(
+ element.Write(),
),
),
- davxml.Protected(),
+ element.Protected(),
))
else:
newacls.extend(config.AdminACEs)
newacls.extend(config.ReadACEs)
- newacls.append(davxml.ACE(
- davxml.Invert(
- davxml.Principal(owner),
+ newacls.append(element.ACE(
+ element.Invert(
+ element.Principal(owner),
),
- davxml.Deny(
- davxml.Privilege(
- davxml.Write(),
+ element.Deny(
+ element.Privilege(
+ element.Write(),
),
),
- davxml.Protected(),
+ element.Protected(),
))
newacls.extend(acls.children)
- acls = davxml.ACL(*newacls)
+ acls = element.ACL(*newacls)
returnValue(acls)
@@ -992,7 +992,7 @@
current = self.currentPrincipal(request)
if current in config.AllAdminPrincipalObjects:
returnValue(True)
- if davxml.Principal((yield self.owner(request))) == current:
+ if element.Principal((yield self.owner(request))) == current:
returnValue(True)
returnValue(False)
@@ -1002,7 +1002,7 @@
##
def displayName(self):
- if self.isAddressBookCollection() and not self.hasDeadProperty((davxml.dav_namespace, "displayname")):
+ if self.isAddressBookCollection() and not self.hasDeadProperty((dav_namespace, "displayname")):
return None
if 'record' in dir(self):
@@ -1022,10 +1022,10 @@
return None
def resourceID(self):
- if not self.hasDeadProperty(davxml.ResourceID.qname()):
+ if not self.hasDeadProperty(element.ResourceID.qname()):
uuidval = uuid.uuid4()
- self.writeDeadProperty(davxml.ResourceID(davxml.HRef.fromString(uuidval.urn)))
- return str(self.readDeadProperty(davxml.ResourceID.qname()).children[0])
+ self.writeDeadProperty(element.ResourceID(element.HRef.fromString(uuidval.urn)))
+ return str(self.readDeadProperty(element.ResourceID.qname()).children[0])
##
# CalDAV
@@ -1140,7 +1140,7 @@
# Adjust the default calendar setting if necessary
if defaultCalendarType is not None:
- yield inbox.writeProperty(defaultCalendarType(davxml.HRef(destination_path)), request)
+ yield inbox.writeProperty(defaultCalendarType(element.HRef(destination_path)), request)
def isCalendarOpaque(self):
@@ -1219,7 +1219,7 @@
principal = (yield self.resourceOwnerPrincipal(request))
home = (yield principal.addressBookHome(request))
(_ignore_scheme, _ignore_host, destination_path, _ignore_query, _ignore_fragment) = urlsplit(normalizeURL(destination_uri))
- yield home.writeProperty(carddavxml.DefaultAddressBookURL(davxml.HRef(destination_path)), request)
+ yield home.writeProperty(carddavxml.DefaultAddressBookURL(element.HRef(destination_path)), request)
@inlineCallbacks
def isDefaultAddressBook(self, request):
@@ -1265,21 +1265,21 @@
def supportedReports(self):
result = super(CalDAVResource, self).supportedReports()
- result.append(davxml.Report(caldavxml.CalendarQuery(),))
- result.append(davxml.Report(caldavxml.CalendarMultiGet(),))
+ result.append(element.Report(caldavxml.CalendarQuery(),))
+ result.append(element.Report(caldavxml.CalendarMultiGet(),))
if self.isCollection():
# Only allowed on collections
- result.append(davxml.Report(caldavxml.FreeBusyQuery(),))
+ result.append(element.Report(caldavxml.FreeBusyQuery(),))
if config.EnableCardDAV:
- result.append(davxml.Report(carddavxml.AddressBookQuery(),))
- result.append(davxml.Report(carddavxml.AddressBookMultiGet(),))
+ result.append(element.Report(carddavxml.AddressBookQuery(),))
+ result.append(element.Report(carddavxml.AddressBookMultiGet(),))
if (
self.isPseudoCalendarCollection() or
self.isAddressBookCollection() or
self.isNotificationCollection()
) and config.EnableSyncReport:
# Only allowed on calendar/inbox/addressbook/notification collections
- result.append(davxml.Report(SyncCollection(),))
+ result.append(element.Report(element.SyncCollection(),))
return result
def writeNewACEs(self, newaces):
@@ -1300,7 +1300,7 @@
if TwistedACLInheritable() not in ace.children:
children = list(ace.children)
children.append(TwistedACLInheritable())
- edited_aces.append(davxml.ACE(*children))
+ edited_aces.append(element.ACE(*children))
else:
edited_aces.append(ace)
else:
@@ -1817,26 +1817,26 @@
principal-search-property-set report.
"""
result = super(CalendarPrincipalCollectionResource, self).supportedReports()
- result.append(davxml.Report(davxml.PrincipalSearchPropertySet(),))
+ result.append(element.Report(element.PrincipalSearchPropertySet(),))
return result
def principalSearchPropertySet(self):
- return davxml.PrincipalSearchPropertySet(
- davxml.PrincipalSearchProperty(
- davxml.PropertyContainer(
- davxml.DisplayName()
+ return element.PrincipalSearchPropertySet(
+ element.PrincipalSearchProperty(
+ element.PropertyContainer(
+ element.DisplayName()
),
- davxml.Description(
- davxml.PCDATAElement("Display Name"),
+ element.Description(
+ element.PCDATAElement("Display Name"),
**{"xml:lang":"en"}
),
),
- davxml.PrincipalSearchProperty(
- davxml.PropertyContainer(
+ element.PrincipalSearchProperty(
+ element.PropertyContainer(
caldavxml.CalendarUserAddressSet()
),
- davxml.Description(
- davxml.PCDATAElement("Calendar User Addresses"),
+ element.Description(
+ element.PCDATAElement("Calendar User Addresses"),
**{"xml:lang":"en"}
),
),
@@ -1904,12 +1904,12 @@
if namespace == caldav_namespace and self.calendarsEnabled():
if name == "calendar-home-set":
returnValue(caldavxml.CalendarHomeSet(
- *[davxml.HRef(url) for url in self.calendarHomeURLs()]
+ *[element.HRef(url) for url in self.calendarHomeURLs()]
))
elif name == "calendar-user-address-set":
returnValue(caldavxml.CalendarUserAddressSet(
- *[davxml.HRef(uri) for uri in self.calendarUserAddresses()]
+ *[element.HRef(uri) for uri in self.calendarUserAddresses()]
))
elif name == "schedule-inbox-URL":
@@ -1917,14 +1917,14 @@
if url is None:
returnValue(None)
else:
- returnValue(caldavxml.ScheduleInboxURL(davxml.HRef(url)))
+ returnValue(caldavxml.ScheduleInboxURL(element.HRef(url)))
elif name == "schedule-outbox-URL":
url = self.scheduleOutboxURL()
if url is None:
returnValue(None)
else:
- returnValue(caldavxml.ScheduleOutboxURL(davxml.HRef(url)))
+ returnValue(caldavxml.ScheduleOutboxURL(element.HRef(url)))
elif name == "calendar-user-type":
returnValue(caldavxml.CalendarUserType(self.record.getCUType()))
@@ -1935,25 +1935,25 @@
if url is None:
returnValue(None)
else:
- returnValue(customxml.DropBoxHomeURL(davxml.HRef(url)))
+ returnValue(customxml.DropBoxHomeURL(element.HRef(url)))
elif name == "notification-URL" and config.Sharing.Enabled:
url = yield self.notificationURL()
if url is None:
returnValue(None)
else:
- returnValue(customxml.NotificationURL(davxml.HRef(url)))
+ returnValue(customxml.NotificationURL(element.HRef(url)))
elif name == "calendar-proxy-read-for" and self.calendarsEnabled():
results = (yield self.proxyFor(False))
returnValue(customxml.CalendarProxyReadFor(
- *[davxml.HRef(principal.principalURL()) for principal in results]
+ *[element.HRef(principal.principalURL()) for principal in results]
))
elif name == "calendar-proxy-write-for" and self.calendarsEnabled():
results = (yield self.proxyFor(True))
returnValue(customxml.CalendarProxyWriteFor(
- *[davxml.HRef(principal.principalURL()) for principal in results]
+ *[element.HRef(principal.principalURL()) for principal in results]
))
elif name == "auto-schedule" and self.calendarsEnabled():
@@ -1967,11 +1967,11 @@
elif namespace == carddav_namespace and self.addressBooksEnabled():
if name == "addressbook-home-set":
returnValue(carddavxml.AddressBookHomeSet(
- *[davxml.HRef(url) for url in self.addressBookHomeURLs()]
+ *[element.HRef(url) for url in self.addressBookHomeURLs()]
))
elif name == "directory-gateway" and self.directoryAddressBookEnabled():
returnValue(carddavxml.DirectoryGateway(
- davxml.HRef.fromString(joinURL("/", config.DirectoryAddressBook.name, "/"))
+ element.HRef.fromString(joinURL("/", config.DirectoryAddressBook.name, "/"))
))
result = (yield super(CalendarPrincipalResource, self).readProperty(property, request))
@@ -2180,7 +2180,7 @@
result = super(CommonHomeResource, self).supportedReports()
if config.EnableSyncReport and config.EnableSyncReportHome:
# Allowed on any home
- result.append(davxml.Report(SyncCollection(),))
+ result.append(element.Report(element.SyncCollection(),))
return result
def _mergeSyncTokens(self, hometoken, notificationtoken):
@@ -2313,7 +2313,7 @@
children.append(
customxml.PubSubTransportProperty(
customxml.PubSubSubscriptionProperty(
- davxml.HRef(
+ element.HRef(
apsConfiguration["SubscriptionURL"]
),
),
@@ -2405,7 +2405,7 @@
##
def owner(self, request):
- return succeed(davxml.HRef(self.principalForRecord().principalURL()))
+ return succeed(element.HRef(self.principalForRecord().principalURL()))
def ownerPrincipal(self, request):
return succeed(self.principalForRecord())
@@ -2419,18 +2419,18 @@
# Server may be read only
if config.EnableReadOnlyServer:
owner_privs = (
- davxml.Privilege(davxml.Read()),
- davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+ element.Privilege(element.Read()),
+ element.Privilege(element.ReadCurrentUserPrivilegeSet()),
)
else:
- owner_privs = (davxml.Privilege(davxml.All()),)
+ owner_privs = (element.Privilege(element.All()),)
aces = (
# Inheritable access for the resource's associated principal.
- davxml.ACE(
- davxml.Principal(davxml.HRef(myPrincipal.principalURL())),
- davxml.Grant(*owner_privs),
- davxml.Protected(),
+ element.ACE(
+ element.Principal(element.HRef(myPrincipal.principalURL())),
+ element.Grant(*owner_privs),
+ element.Protected(),
TwistedACLInheritable(),
),
)
@@ -2441,7 +2441,7 @@
# Give all access to config.AdminPrincipals
aces += config.AdminACEs
- return davxml.ACL(*aces)
+ return element.ACL(*aces)
def accessControlList(self, request, inheritance=True, expanding=False, inherited_aces=None):
# Permissions here are fixed, and are not subject to inheritance rules, etc.
@@ -2622,24 +2622,24 @@
# Server may be read only
if config.EnableReadOnlyServer:
owner_privs = (
- davxml.Privilege(davxml.Read()),
- davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+ element.Privilege(element.Read()),
+ element.Privilege(element.ReadCurrentUserPrivilegeSet()),
)
else:
- owner_privs = (davxml.Privilege(davxml.All()),)
+ owner_privs = (element.Privilege(element.All()),)
aces = (
# Inheritable access for the resource's associated principal.
- davxml.ACE(
- davxml.Principal(davxml.HRef(myPrincipal.principalURL())),
- davxml.Grant(*owner_privs),
- davxml.Protected(),
+ element.ACE(
+ element.Principal(element.HRef(myPrincipal.principalURL())),
+ element.Grant(*owner_privs),
+ element.Protected(),
TwistedACLInheritable(),
),
# Inheritable CALDAV:read-free-busy access for authenticated users.
- davxml.ACE(
- davxml.Principal(davxml.Authenticated()),
- davxml.Grant(davxml.Privilege(caldavxml.ReadFreeBusy())),
+ element.ACE(
+ element.Principal(element.Authenticated()),
+ element.Grant(element.Privilege(caldavxml.ReadFreeBusy())),
TwistedACLInheritable(),
),
)
@@ -2654,37 +2654,37 @@
# Server may be read only
if config.EnableReadOnlyServer:
rw_proxy_privs = (
- davxml.Privilege(davxml.Read()),
- davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+ element.Privilege(element.Read()),
+ element.Privilege(element.ReadCurrentUserPrivilegeSet()),
)
else:
rw_proxy_privs = (
- davxml.Privilege(davxml.Read()),
- davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
- davxml.Privilege(davxml.Write()),
+ element.Privilege(element.Read()),
+ element.Privilege(element.ReadCurrentUserPrivilegeSet()),
+ element.Privilege(element.Write()),
)
aces += (
# DAV:read/DAV:read-current-user-privilege-set access for this principal's calendar-proxy-read users.
- davxml.ACE(
- davxml.Principal(davxml.HRef(joinURL(myPrincipal.principalURL(), "calendar-proxy-read/"))),
- davxml.Grant(
- davxml.Privilege(davxml.Read()),
- davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+ element.ACE(
+ element.Principal(element.HRef(joinURL(myPrincipal.principalURL(), "calendar-proxy-read/"))),
+ element.Grant(
+ element.Privilege(element.Read()),
+ element.Privilege(element.ReadCurrentUserPrivilegeSet()),
),
- davxml.Protected(),
+ element.Protected(),
TwistedACLInheritable(),
),
# DAV:read/DAV:read-current-user-privilege-set/DAV:write access for this principal's calendar-proxy-write users.
- davxml.ACE(
- davxml.Principal(davxml.HRef(joinURL(myPrincipal.principalURL(), "calendar-proxy-write/"))),
- davxml.Grant(*rw_proxy_privs),
- davxml.Protected(),
+ element.ACE(
+ element.Principal(element.HRef(joinURL(myPrincipal.principalURL(), "calendar-proxy-write/"))),
+ element.Grant(*rw_proxy_privs),
+ element.Protected(),
TwistedACLInheritable(),
),
)
- return davxml.ACL(*aces)
+ return element.ACL(*aces)
@inlineCallbacks
@@ -2785,11 +2785,11 @@
@inlineCallbacks
def writeProperty(self, property, request):
- assert isinstance(property, davxml.WebDAVElement)
+ assert isinstance(property, element.WebDAVElement)
if property.qname() == carddavxml.DefaultAddressBookURL.qname():
# Verify that the address book added in the PROPPATCH is valid.
- property.children = [davxml.HRef(normalizeURL(str(href))) for href in property.children]
+ property.children = [element.HRef(normalizeURL(str(href))) for href in property.children]
new_adbk = [str(href) for href in property.children]
adbk = None
if len(new_adbk) == 1:
@@ -2807,7 +2807,7 @@
adbkURI = (yield adbk.canonicalURL(request))
if not adbkURI.endswith("/"):
adbkURI += "/"
- property = carddavxml.DefaultAddressBookURL(davxml.HRef(adbkURI))
+ property = carddavxml.DefaultAddressBookURL(element.HRef(adbkURI))
yield super(AddressBookHomeResource, self).writeProperty(property, request)
@@ -2875,11 +2875,11 @@
self.writeDeadProperty(
carddavxml.DefaultAddressBookURL(
- davxml.HRef(defaultAddressBookURL)
+ element.HRef(defaultAddressBookURL)
)
)
returnValue(carddavxml.DefaultAddressBookURL(
- davxml.HRef(defaultAddressBookURL))
+ element.HRef(defaultAddressBookURL))
)
@inlineCallbacks
@@ -2929,35 +2929,35 @@
"""
def resourceType(self):
- return davxml.ResourceType.sharedaddressbook #@UndefinedVariable
+ return element.ResourceType.sharedaddressbook #@UndefinedVariable
def defaultAccessControlList(self):
aces = (
- davxml.ACE(
- davxml.Principal(davxml.Authenticated()),
- davxml.Grant(
- davxml.Privilege(davxml.Read()),
- davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
- davxml.Privilege(davxml.Write()),
+ element.ACE(
+ element.Principal(element.Authenticated()),
+ element.Grant(
+ element.Privilege(element.Read()),
+ element.Privilege(element.ReadCurrentUserPrivilegeSet()),
+ element.Privilege(element.Write()),
),
- davxml.Protected(),
+ element.Protected(),
TwistedACLInheritable(),
),
)
if config.GlobalAddressBook.EnableAnonymousReadAccess:
aces += (
- davxml.ACE(
- davxml.Principal(davxml.Unauthenticated()),
- davxml.Grant(
- davxml.Privilege(davxml.Read()),
+ element.ACE(
+ element.Principal(element.Unauthenticated()),
+ element.Grant(
+ element.Privilege(element.Read()),
),
- davxml.Protected(),
+ element.Protected(),
TwistedACLInheritable(),
),
)
- return davxml.ACL(*aces)
+ return element.ACL(*aces)
def accessControlList(self, request, inheritance=True, expanding=False, inherited_aces=None):
# Permissions here are fixed, and are not subject to inheritance rules, etc.
Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/sharing.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -26,11 +26,11 @@
from twext.python.log import LoggingMixIn
from twext.web2 import responsecode
-from twext.web2.dav import davxml
+from twext.web2.http import HTTPError, Response, XMLResponse
from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
from twext.web2.dav.resource import TwistedACLInheritable
from twext.web2.dav.util import allDataFromStream, joinURL
-from twext.web2.http import HTTPError, Response, XMLResponse
+from txdav.xml import element
from twisted.internet.defer import succeed, inlineCallbacks, DeferredList,\
returnValue
@@ -77,7 +77,7 @@
# Change resourcetype
rtype = self.resourceType()
- rtype = davxml.ResourceType(*(rtype.children + (customxml.SharedOwner(),)))
+ rtype = element.ResourceType(*(rtype.children + (customxml.SharedOwner(),)))
self.writeDeadProperty(rtype)
# Create invites database
@@ -89,7 +89,7 @@
# Change resource type (note this might be called after deleting a resource
# so we have to cope with that)
rtype = self.resourceType()
- rtype = davxml.ResourceType(*([child for child in rtype.children if child != customxml.SharedOwner()]))
+ rtype = element.ResourceType(*([child for child in rtype.children if child != customxml.SharedOwner()]))
self.writeDeadProperty(rtype)
# Remove all invitees
@@ -141,11 +141,11 @@
"""
# Need to have at least DAV:read to do this
- yield self.authorize(request, (davxml.Read(),))
+ yield self.authorize(request, (element.Read(),))
# Find current principal
authz_principal = self.currentPrincipal(request).children[0]
- if not isinstance(authz_principal, davxml.HRef):
+ if not isinstance(authz_principal, element.HRef):
raise HTTPError(ErrorResponse(
responsecode.FORBIDDEN,
(calendarserver_namespace, "valid-principal"),
@@ -236,13 +236,13 @@
try:
superMethod = superObject.resourceType
except AttributeError:
- rtype = davxml.ResourceType()
+ rtype = element.ResourceType()
else:
rtype = superMethod()
isVirt = self.isVirtualShare()
if isVirt:
- rtype = davxml.ResourceType(
+ rtype = element.ResourceType(
*(
tuple([child for child in rtype.children if child.qname() != customxml.SharedOwner.qname()]) +
(customxml.Shared(),)
@@ -299,28 +299,28 @@
self._share.shareuid
)
if invite is None:
- returnValue(davxml.ACL())
+ returnValue(element.ACL())
inviteAccess = invite.access
userprivs = [
]
if inviteAccess in ("read-only", "read-write", "read-write-schedule",):
- userprivs.append(davxml.Privilege(davxml.Read()))
- userprivs.append(davxml.Privilege(davxml.ReadACL()))
- userprivs.append(davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()))
+ userprivs.append(element.Privilege(element.Read()))
+ userprivs.append(element.Privilege(element.ReadACL()))
+ userprivs.append(element.Privilege(element.ReadCurrentUserPrivilegeSet()))
if inviteAccess in ("read-only",):
- userprivs.append(davxml.Privilege(davxml.WriteProperties()))
+ userprivs.append(element.Privilege(element.WriteProperties()))
if inviteAccess in ("read-write", "read-write-schedule",):
- userprivs.append(davxml.Privilege(davxml.Write()))
+ userprivs.append(element.Privilege(element.Write()))
proxyprivs = list(userprivs)
- proxyprivs.remove(davxml.Privilege(davxml.ReadACL()))
+ proxyprivs.remove(element.Privilege(element.ReadACL()))
aces = (
# Inheritable specific access for the resource's associated principal.
- davxml.ACE(
- davxml.Principal(davxml.HRef(self._shareePrincipal.principalURL())),
- davxml.Grant(*userprivs),
- davxml.Protected(),
+ element.ACE(
+ element.Principal(element.HRef(self._shareePrincipal.principalURL())),
+ element.Grant(*userprivs),
+ element.Protected(),
TwistedACLInheritable(),
),
)
@@ -328,9 +328,9 @@
if self.isCalendarCollection():
aces += (
# Inheritable CALDAV:read-free-busy access for authenticated users.
- davxml.ACE(
- davxml.Principal(davxml.Authenticated()),
- davxml.Grant(davxml.Privilege(caldavxml.ReadFreeBusy())),
+ element.ACE(
+ element.Principal(element.Authenticated()),
+ element.Grant(element.Privilege(caldavxml.ReadFreeBusy())),
TwistedACLInheritable(),
),
)
@@ -344,25 +344,25 @@
if config.EnableProxyPrincipals:
aces += (
# DAV:read/DAV:read-current-user-privilege-set access for this principal's calendar-proxy-read users.
- davxml.ACE(
- davxml.Principal(davxml.HRef(joinURL(self._shareePrincipal.principalURL(), "calendar-proxy-read/"))),
- davxml.Grant(
- davxml.Privilege(davxml.Read()),
- davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+ element.ACE(
+ element.Principal(element.HRef(joinURL(self._shareePrincipal.principalURL(), "calendar-proxy-read/"))),
+ element.Grant(
+ element.Privilege(element.Read()),
+ element.Privilege(element.ReadCurrentUserPrivilegeSet()),
),
- davxml.Protected(),
+ element.Protected(),
TwistedACLInheritable(),
),
# DAV:read/DAV:read-current-user-privilege-set/DAV:write access for this principal's calendar-proxy-write users.
- davxml.ACE(
- davxml.Principal(davxml.HRef(joinURL(self._shareePrincipal.principalURL(), "calendar-proxy-write/"))),
- davxml.Grant(*proxyprivs),
- davxml.Protected(),
+ element.ACE(
+ element.Principal(element.HRef(joinURL(self._shareePrincipal.principalURL(), "calendar-proxy-write/"))),
+ element.Grant(*proxyprivs),
+ element.Protected(),
TwistedACLInheritable(),
),
)
- returnValue(davxml.ACL(*aces))
+ returnValue(element.ACL(*aces))
def validUserIDForShare(self, userid):
"""
@@ -633,14 +633,14 @@
customxml.DTStamp.fromString(PyCalendarDateTime.getNowUTC().getText()),
customxml.InviteNotification(
customxml.UID.fromString(record.inviteuid),
- davxml.HRef.fromString(record.userid),
+ element.HRef.fromString(record.userid),
inviteStatusMapToXML[record.state](),
customxml.InviteAccess(inviteAccessMapToXML[record.access]()),
customxml.HostURL(
- davxml.HRef.fromString(hosturl),
+ element.HRef.fromString(hosturl),
),
customxml.Organizer(
- davxml.HRef.fromString(owner),
+ element.HRef.fromString(owner),
customxml.CommonName.fromString(ownerCN),
),
customxml.InviteSummary.fromString(record.summary),
@@ -666,7 +666,7 @@
@inlineCallbacks
def _xmlHandleInvite(self, request, docroot):
- yield self.authorize(request, (davxml.Read(), davxml.Write()))
+ yield self.authorize(request, (element.Read(), element.Write()))
result = (yield self._handleInvite(request, docroot))
returnValue(result)
@@ -677,7 +677,7 @@
access = None
summary = None
for item in inviteset.children:
- if isinstance(item, davxml.HRef):
+ if isinstance(item, element.HRef):
userid = str(item)
continue
if isinstance(item, customxml.CommonName):
@@ -709,7 +709,7 @@
userid = None
access = []
for item in inviteremove.children:
- if isinstance(item, davxml.HRef):
+ if isinstance(item, element.HRef):
userid = str(item)
continue
if isinstance(item, customxml.ReadAccess) or isinstance(item, customxml.ReadWriteAccess):
@@ -785,11 +785,11 @@
if badusers:
xml_responses = []
xml_responses.extend([
- davxml.StatusResponse(davxml.HRef(userid), davxml.Status.fromResponseCode(ok_code))
+ element.StatusResponse(element.HRef(userid), element.Status.fromResponseCode(ok_code))
for userid in sorted(okusers)
])
xml_responses.extend([
- davxml.StatusResponse(davxml.HRef(userid), davxml.Status.fromResponseCode(responsecode.FORBIDDEN))
+ element.StatusResponse(element.HRef(userid), element.Status.fromResponseCode(responsecode.FORBIDDEN))
for userid in sorted(badusers)
])
@@ -804,7 +804,7 @@
@inlineCallbacks
def _xmlHandleInviteReply(self, request, docroot):
- yield self.authorize(request, (davxml.Read(), davxml.Write()))
+ yield self.authorize(request, (element.Read(), element.Write()))
result = (yield self._handleInviteReply(request, docroot))
returnValue(result)
@@ -817,7 +817,7 @@
# Need to read the data and get the root element first
xmldata = (yield allDataFromStream(request.stream))
try:
- doc = davxml.WebDAVDocument.fromString(xmldata)
+ doc = element.WebDAVDocument.fromString(xmldata)
except ValueError, e:
self.log_error("Error parsing doc (%s) Doc:\n %s" % (str(e), xmldata,))
raise HTTPError(ErrorResponse(
@@ -889,7 +889,7 @@
return customxml.InviteUser(
customxml.UID.fromString(self.inviteuid),
- davxml.HRef.fromString(self.userid),
+ element.HRef.fromString(self.userid),
customxml.CommonName.fromString(self.name),
customxml.InviteAccess(inviteAccessMapToXML[self.access]()),
inviteStatusMapToXML[self.state](),
@@ -1110,7 +1110,7 @@
# Set per-user displayname or color to whatever was given
sharedCollection.setVirtualShare(ownerPrincipal, share)
if displayname:
- yield sharedCollection.writeProperty(davxml.DisplayName.fromString(displayname), request)
+ yield sharedCollection.writeProperty(element.DisplayName.fromString(displayname), request)
if color:
yield sharedCollection.writeProperty(customxml.CalendarColor.fromString(color), request)
@@ -1129,7 +1129,7 @@
returnValue(XMLResponse(
code = responsecode.OK,
element = customxml.SharedAs(
- davxml.HRef.fromString(joinURL(self.url(), share.localname))
+ element.HRef.fromString(joinURL(self.url(), share.localname))
)
))
@@ -1219,10 +1219,10 @@
customxml.InviteReply(
*(
(
- davxml.HRef.fromString(sharee),
+ element.HRef.fromString(sharee),
inviteStatusMapToXML[state](),
customxml.HostURL(
- davxml.HRef.fromString(hostUrl),
+ element.HRef.fromString(hostUrl),
),
customxml.InReplyTo.fromString(replytoUID),
) + ((customxml.InviteSummary.fromString(displayname),) if displayname is not None else ())
@@ -1248,7 +1248,7 @@
summary = str(item)
elif isinstance(item, customxml.HostURL):
for hosturlItem in item.children:
- if isinstance(hosturlItem, davxml.HRef):
+ if isinstance(hosturlItem, element.HRef):
hostUrl = str(hosturlItem)
elif isinstance(item, customxml.InReplyTo):
replytoUID = str(item)
Modified: CalendarServer/trunk/twistedcaldav/test/test_extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_extensions.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/test/test_extensions.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -16,8 +16,7 @@
##
from twext.python.filepath import CachingFilePath as FilePath
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVElement
+from txdav.xml.element import WebDAVElement, ResourceType
from twext.web2.http_headers import MimeType
from twext.web2.static import MetaDataMixin
@@ -164,7 +163,7 @@
def addUnicodeChild(davFile):
m = MetaDataMixin()
m.contentType = lambda: MimeType.fromString('text/plain')
- m.resourceType = lambda: davxml.ResourceType()
+ m.resourceType = lambda: ResourceType()
m.isCollection = lambda: False
davFile.putChild(unicodeChildName, m)
yield self.doDirectoryTest([nonASCIIFilename], addUnicodeChild,
Modified: CalendarServer/trunk/twistedcaldav/test/test_props.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_props.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/test/test_props.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -202,8 +202,8 @@
return davXMLFromStream(response.stream).addCallback(got_xml)
query = davxml.PropertyFind(
- davxml.AllProperties(),
- )
+ davxml.AllProperties(),
+ )
request = SimpleRequest(
self.site,
Modified: CalendarServer/trunk/twistedcaldav/test/test_resource.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_resource.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/test/test_resource.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -14,10 +14,7 @@
# limitations under the License.
##
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import Principal
-from twext.web2.dav.davxml import Unauthenticated
-from txdav.xml.rfc2518 import HRef
+from txdav.xml.element import HRef, Principal, Unauthenticated
from twext.web2.http import HTTPError
from twext.web2.test.test_server import SimpleRequest
@@ -273,7 +270,7 @@
newadbk = yield request.locateResource("/addressbooks/users/wsanchez/newadbk")
yield newadbk.createAddressBookCollection()
home.writeDeadProperty(carddavxml.DefaultAddressBookURL(
- davxml.HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
+ HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
))
request._newStoreTransaction.commit()
@@ -321,7 +318,7 @@
newadbk = yield request.locateResource("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
yield newadbk.createAddressBookCollection()
home.writeDeadProperty(carddavxml.DefaultAddressBookURL(
- davxml.HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
+ HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
))
try:
default = yield home.readProperty(carddavxml.DefaultAddressBookURL, request)
Modified: CalendarServer/trunk/twistedcaldav/test/test_upgrade.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_upgrade.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/test/test_upgrade.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -14,9 +14,15 @@
# limitations under the License.
##
+import hashlib
+import os, zlib, cPickle
+from twisted.python.reflect import namedClass
from twisted.internet.defer import inlineCallbacks
-from twext.web2.dav import davxml
+
+from txdav.xml.parser import WebDAVDocument
+from txdav.caldav.datastore.index_file import db_basename
+
from twistedcaldav.config import config
from twistedcaldav.directory.xmlfile import XMLDirectoryService
from twistedcaldav.directory.resourceinfo import ResourceInfoDatabase
@@ -28,13 +34,8 @@
from twistedcaldav.test.util import TestCase
from calendarserver.tools.util import getDirectory
-import hashlib
-import os, zlib, cPickle
-from txdav.caldav.datastore.index_file import db_basename
-from twisted.python.reflect import namedClass
-
freeBusyAttr = xattrname(
"{urn:ietf:params:xml:ns:caldav}calendar-free-busy-set"
)
@@ -214,7 +215,7 @@
# Pickled XML
value = "<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/__uids__/BB05932F-DCE7-4195-9ED4-0896EAFF3B0B/calendar</href>\r\n</calendar-free-busy-set>\r\n"
- doc = davxml.WebDAVDocument.fromString(value)
+ doc = WebDAVDocument.fromString(value)
value = cPickle.dumps(doc.root_element)
self.assertEquals(updateFreeBusySet(value, directory), None)
@@ -240,7 +241,7 @@
# Pickled XML
value = "<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/users/wsanchez/calendar</href>\r\n</calendar-free-busy-set>\r\n"
- doc = davxml.WebDAVDocument.fromString(value)
+ doc = WebDAVDocument.fromString(value)
value = cPickle.dumps(doc.root_element)
newValue = updateFreeBusySet(value, directory)
newValue = zlib.decompress(newValue)
@@ -387,7 +388,7 @@
"@xattrs" :
{
# Pickled XML Doc
- freeBusyAttr : cPickle.dumps(davxml.WebDAVDocument.fromString("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/users/wsanchez/calendar</href>\r\n</calendar-free-busy-set>\r\n").root_element),
+ freeBusyAttr : cPickle.dumps(WebDAVDocument.fromString("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n <href xmlns='DAV:'>/calendars/users/wsanchez/calendar</href>\r\n</calendar-free-busy-set>\r\n").root_element),
},
},
},
@@ -1705,7 +1706,7 @@
except zlib.error:
return False
try:
- davxml.WebDAVDocument.fromString(value)
+ WebDAVDocument.fromString(value)
return True
except ValueError:
return False
Modified: CalendarServer/trunk/twistedcaldav/timezonexml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/timezonexml.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/timezonexml.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -1,5 +1,5 @@
##
-# Copyright (c) 2011 Apple Inc. All rights reserved.
+# Copyright (c) 2011-2012 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.
@@ -19,13 +19,17 @@
"""
from twext.web2.dav import davxml
+from txdav.xml.element import registerElement
+
##
# Timezone Service XML Definitions
##
timezone_namespace = "urn:ietf:params:xml:ns:timezone-service"
+
+ at registerElement
class Capabilities (davxml.WebDAVElement):
namespace = timezone_namespace
name = "capabilities"
@@ -33,6 +37,8 @@
(timezone_namespace, "operation"): (0, None),
}
+
+ at registerElement
class Operation (davxml.WebDAVElement):
namespace = timezone_namespace
name = "operation"
@@ -42,14 +48,20 @@
(timezone_namespace, "accept-parameter"): (0, None),
}
+
+ at registerElement
class Action (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "action"
+
+ at registerElement
class Description (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "description"
+
+ at registerElement
class AcceptParameter (davxml.WebDAVElement):
namespace = timezone_namespace
name = "accept-parameter"
@@ -61,22 +73,32 @@
(timezone_namespace, "description"): (0, 1),
}
+
+ at registerElement
class Name (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "name"
+
+ at registerElement
class Required (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "required"
+
+ at registerElement
class Multi (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "multi"
+
+ at registerElement
class Value (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "value"
+
+ at registerElement
class TimezoneList (davxml.WebDAVElement):
namespace = timezone_namespace
name = "timezone-list"
@@ -85,10 +107,14 @@
(timezone_namespace, "summary"): (0, None),
}
+
+ at registerElement
class Dtstamp (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "dtstamp"
+
+ at registerElement
class Summary (davxml.WebDAVElement):
namespace = timezone_namespace
name = "summary"
@@ -100,26 +126,38 @@
(timezone_namespace, "inactive"): (0, 1),
}
+
+ at registerElement
class Tzid (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "tzid"
+
+ at registerElement
class LastModified (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "last-modified"
+
+ at registerElement
class LocalName (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "local-name"
+
+ at registerElement
class Alias (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "alias"
+
+ at registerElement
class Inactive (davxml.WebDAVEmptyElement):
namespace = timezone_namespace
name = "inactive"
+
+ at registerElement
class Timezones (davxml.WebDAVElement):
namespace = timezone_namespace
name = "timezones"
@@ -128,6 +166,8 @@
(timezone_namespace, "tzdata"): (0, None),
}
+
+ at registerElement
class Tzdata (davxml.WebDAVElement):
namespace = timezone_namespace
name = "tzdata"
@@ -137,10 +177,14 @@
(timezone_namespace, "observance"): (0, None),
}
+
+ at registerElement
class Calscale (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "calscale"
+
+ at registerElement
class Observance (davxml.WebDAVElement):
namespace = timezone_namespace
name = "observance"
@@ -152,15 +196,20 @@
(timezone_namespace, "utc-offset-to"): (1, 1),
}
+
+ at registerElement
class Onset (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "onset"
+
+ at registerElement
class UTCOffsetFrom (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "utc-offset-from"
+
+ at registerElement
class UTCOffsetTo (davxml.WebDAVTextElement):
namespace = timezone_namespace
name = "utc-offset-to"
-
Modified: CalendarServer/trunk/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/upgrade.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/upgrade.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -22,7 +22,7 @@
from cPickle import loads as unpickle, UnpicklingError
from twext.python.log import Logger
-from twext.web2.dav import davxml
+from txdav.xml import element
from twext.web2.dav.fileop import rmdir
from twistedcaldav import caldavxml
@@ -814,7 +814,7 @@
pass
try:
- doc = davxml.WebDAVDocument.fromString(value)
+ doc = element.WebDAVDocument.fromString(value)
freeBusySet = doc.root_element
except ValueError:
try:
@@ -837,7 +837,7 @@
fbset.add(newHref)
if didUpdate:
- property = caldavxml.CalendarFreeBusySet(*[davxml.HRef(href)
+ property = caldavxml.CalendarFreeBusySet(*[element.HRef(href)
for href in fbset])
value = compress(property.toxml())
return value
@@ -1112,8 +1112,8 @@
request = FakeRequest(root, "PUT", None)
request.noAttendeeRefresh = True # tell scheduling to skip refresh
request.checkedSACL = True
- request.authnUser = request.authzUser = davxml.Principal(
- davxml.HRef.fromString("/principals/__uids__/%s/" % (uuid,))
+ request.authnUser = request.authzUser = element.Principal(
+ element.HRef.fromString("/principals/__uids__/%s/" % (uuid,))
)
# The request may end up with an associated transaction and we must make sure that is
Modified: CalendarServer/trunk/txdav/base/propertystore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/base/propertystore/sql.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/base/propertystore/sql.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -29,12 +29,11 @@
from twext.enterprise.dal.syntax import (
Select, Parameter, Update, Insert, TableSyntax, Delete)
+from txdav.xml.parser import WebDAVDocument
from txdav.common.datastore.sql_tables import schema
from txdav.base.propertystore.base import (AbstractPropertyStore,
PropertyName, validKey)
-from twext.web2.dav.davxml import WebDAVDocument
-
from twisted.internet.defer import inlineCallbacks, returnValue
Modified: CalendarServer/trunk/txdav/base/propertystore/xattr.py
===================================================================
--- CalendarServer/trunk/txdav/base/propertystore/xattr.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/base/propertystore/xattr.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -32,12 +32,12 @@
from cPickle import UnpicklingError, loads as unpickle
from xattr import xattr
-from twext.web2.dav.davxml import WebDAVDocument
+from twisted.python.reflect import namedAny
+from txdav.xml.parser import WebDAVDocument
from txdav.base.propertystore.base import AbstractPropertyStore, PropertyName,\
validKey
from txdav.idav import PropertyStoreError
-from twisted.python.reflect import namedAny
#
# RFC 2518 Section 12.13.1 says that removal of non-existing property is not an
Modified: CalendarServer/trunk/txdav/caldav/datastore/test/common.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/common.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/common.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -27,15 +27,12 @@
from twisted.python import hashlib
from twext.python.clsprop import classproperty
-
-from twext.enterprise.ienterprise import AlreadyFinishedError
-
+from twext.python.vcomponent import VComponent
from twext.python.filepath import CachingFilePath as FilePath
-from twext.web2.dav import davxml
+from twext.enterprise.ienterprise import AlreadyFinishedError
from twext.web2.http_headers import MimeType
-from txdav.xml.base import WebDAVUnknownElement
-from twext.python.vcomponent import VComponent
+from txdav.xml.element import WebDAVUnknownElement, ResourceType
from txdav.idav import IPropertyStore, IDataStore
from txdav.base.propertystore.base import PropertyName
from txdav.common.icommondatastore import HomeChildNameAlreadyExistsError, \
@@ -710,9 +707,9 @@
yield home.calendarWithName(name)).properties()
self.assertEquals(
calendarProperties[
- PropertyName.fromString(davxml.ResourceType.sname())
+ PropertyName.fromString(ResourceType.sname())
],
- davxml.ResourceType.calendar #@UndefinedVariable
+ ResourceType.calendar #@UndefinedVariable
)
yield checkProperties()
Modified: CalendarServer/trunk/txdav/carddav/datastore/test/common.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/test/common.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/carddav/datastore/test/common.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -41,8 +41,7 @@
from twistedcaldav.vcard import Component as VComponent
from twext.python.filepath import CachingFilePath as FilePath
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVUnknownElement
+from txdav.xml.element import WebDAVUnknownElement, ResourceType
storePath = FilePath(__file__).parent().child("addressbook_store")
@@ -319,10 +318,10 @@
self.assertNotIdentical((yield home.addressbookWithName(name)), None)
def checkProperties():
addressbookProperties = (yield home.addressbookWithName(name)).properties()
- addressbookType = davxml.ResourceType.addressbook #@UndefinedVariable
+ addressbookType = ResourceType.addressbook #@UndefinedVariable
self.assertEquals(
addressbookProperties[
- PropertyName.fromString(davxml.ResourceType.sname())
+ PropertyName.fromString(ResourceType.sname())
],
addressbookType
)
Modified: CalendarServer/trunk/txdav/xml/__init__.py
===================================================================
--- CalendarServer/trunk/txdav/xml/__init__.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/__init__.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -2,7 +2,7 @@
# See LICENSE for details.
##
-# Copyright (c) 2005-1012 Apple Computer, Inc. All rights reserved.
+# Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -25,16 +25,28 @@
"""
WebDAV XML support.
+
+This module provides XML utilities for use with WebDAV.
+
+See RFC 2518: http://www.ietf.org/rfc/rfc2518.txt (WebDAV)
+See RFC 3253: http://www.ietf.org/rfc/rfc3253.txt (WebDAV + Versioning)
+See RFC 3744: http://www.ietf.org/rfc/rfc3744.txt (WebDAV ACLs)
+See RFC 4331: http://www.ietf.org/rfc/rfc4331.txt (WebDAV Quota)
+See RFC 5842: http://www.ietf.org/rfc/rfc5842.txt (WebDAV Bind)
"""
__all__ = [
"base",
+ "element",
"parser",
- "util",
- "rfc2518",
- "rfc3253",
- "rfc3744",
- "rfc4331",
- "rfc5842",
- "extensions",
]
+
+import txdav.xml.rfc2518
+import txdav.xml.rfc3253
+import txdav.xml.rfc3744
+import txdav.xml.rfc4331
+import txdav.xml.rfc5842
+import txdav.xml.extensions
+
+txdav # Shhh pyflakes
+
Modified: CalendarServer/trunk/txdav/xml/base.py
===================================================================
--- CalendarServer/trunk/txdav/xml/base.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/base.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -59,6 +59,8 @@
# Base XML elements
##
+_elements_by_qname = {}
+
dav_namespace = "DAV:"
twisted_dav_namespace = "http://twistedmatrix.com/xml_namespace/dav/"
twisted_private_namespace = twisted_dav_namespace + "private/"
Modified: CalendarServer/trunk/txdav/xml/element.py
===================================================================
--- CalendarServer/trunk/txdav/xml/element.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/element.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -25,65 +25,68 @@
"""
__all__ = [
+ "WebDAVDocument",
"dav_namespace",
"twisted_dav_namespace",
"twisted_private_namespace",
+ "WebDAVElement",
+ "PCDATAElement",
+ "WebDAVOneShotElement",
+ "WebDAVUnknownElement",
+ "WebDAVEmptyElement",
+ "WebDAVTextElement",
+ "WebDAVDateTimeElement",
+ "DateTimeHeaderElement",
"registerElement",
- "registerElements",
+ "registerElementClass",
"lookupElement",
]
+from txdav.xml.parser import WebDAVDocument
from txdav.xml.base import dav_namespace
from txdav.xml.base import twisted_dav_namespace, twisted_private_namespace
-
from txdav.xml.base import WebDAVElement
+from txdav.xml.base import PCDATAElement, WebDAVOneShotElement, WebDAVUnknownElement
+from txdav.xml.base import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.base import WebDAVDateTimeElement, DateTimeHeaderElement
+from txdav.xml.base import _elements_by_qname
##
# XML element registration
##
-_elements_by_qname = {}
-
-
-def registerElements(module):
+def registerElement(elementClass):
"""
- Register XML elements defined in the given module with the parser.
+ Register an XML element class with the parser and add to this module's namespace.
"""
- element_names = []
+ assert issubclass(elementClass, WebDAVElement), "Not a WebDAVElement: %s" % (elementClass,)
+ assert elementClass.namespace, "Element has no namespace: %s" % (elementClass,)
+ assert elementClass.name, "Element has no name: %s" % (elementClass,)
- items = module.__all__ if hasattr(module, "__all__") else dir(module)
- for element_class_name in items:
- element_class = getattr(module, element_class_name)
-
- if type(element_class) is type and issubclass(element_class, WebDAVElement):
- if element_class.namespace is None: continue
- if element_class.name is None: continue
- if element_class.unregistered: continue
-
- registerElement(element_class)
-
- element_names.append(element_class.__name__)
-
- return element_names
-
-
-def registerElement(element_class):
- """
- Register the supplied XML elements with the parser.
- """
- qname = element_class.namespace, element_class.name
+ qname = elementClass.namespace, elementClass.name
if qname in _elements_by_qname:
raise AssertionError(
- "Attempting to register qname %s multiple times: (%r, %r)"
- % (qname, _elements_by_qname[qname], element_class)
+ "Attempting to register element %s multiple times: (%r, %r)"
+ % (elementClass.sname(), _elements_by_qname[qname], elementClass)
)
- if not (qname in _elements_by_qname and issubclass(element_class, _elements_by_qname[qname])):
- _elements_by_qname[qname] = element_class
+ if not (qname in _elements_by_qname and issubclass(elementClass, _elements_by_qname[qname])):
+ _elements_by_qname[qname] = elementClass
+ return elementClass
+
+def registerElementClass(elementClass):
+ """
+ Add an XML element class to this module's namespace.
+ """
+ globals()[elementClass.__name__] = elementClass
+ __all__.append(elementClass.__name__)
+ return elementClass
+
+
def lookupElement(qname):
"""
Return the element class for the element with the given qname.
Modified: CalendarServer/trunk/txdav/xml/extensions.py
===================================================================
--- CalendarServer/trunk/txdav/xml/extensions.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/extensions.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -38,9 +38,12 @@
]
from txdav.xml.base import WebDAVElement, WebDAVTextElement
-from txdav.xml.base import dav_namespace, twisted_dav_namespace
+from txdav.xml.element import dav_namespace, twisted_dav_namespace
+from txdav.xml.element import registerElement, registerElementClass
+ at registerElement
+ at registerElementClass
class CurrentUserPrincipal(WebDAVElement):
"""
Current principal information
@@ -53,6 +56,8 @@
}
+ at registerElement
+ at registerElementClass
class ErrorDescription(WebDAVTextElement):
"""
The human-readable description of a failed precondition
@@ -62,6 +67,8 @@
protected = True
+ at registerElement
+ at registerElementClass
class AddMember (WebDAVElement):
"""
A property on a collection to allow for "anonymous" creation of resources.
@@ -74,6 +81,8 @@
allowed_children = { (dav_namespace, "href"): (0, 1) }
+ at registerElement
+ at registerElementClass
class SyncCollection (WebDAVElement):
"""
DAV report used to retrieve specific calendar component items via their
@@ -112,6 +121,8 @@
self.property = child
+ at registerElement
+ at registerElementClass
class SyncToken (WebDAVTextElement):
"""
Synchronization token used in report and as a property.
@@ -121,6 +132,8 @@
protected = True
+ at registerElement
+ at registerElementClass
class SyncLevel (WebDAVTextElement):
"""
Synchronization level used in report.
Modified: CalendarServer/trunk/txdav/xml/parser_sax.py
===================================================================
--- CalendarServer/trunk/txdav/xml/parser_sax.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/parser_sax.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -28,7 +28,7 @@
import xml.sax
from txdav.xml.base import WebDAVUnknownElement, PCDATAElement
-from txdav.xml.element import _elements_by_qname
+from txdav.xml.base import _elements_by_qname
from txdav.xml.parser_base import AbstractWebDAVDocument
from txdav.xml.xmlext import Print as xmlPrint
Modified: CalendarServer/trunk/txdav/xml/rfc2518.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc2518.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc2518.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -31,16 +31,18 @@
from twext.web2 import responsecode
from twext.web2.http_headers import MimeType
-from txdav.xml.base import dav_namespace
from txdav.xml.base import WebDAVElement, WebDAVTextElement, PCDATAElement
from txdav.xml.base import WebDAVEmptyElement, WebDAVOneShotElement
from txdav.xml.base import WebDAVDateTimeElement, DateTimeHeaderElement
+from txdav.xml.element import dav_namespace, registerElement, registerElementClass
##
# Section 12
##
+ at registerElement
+ at registerElementClass
class ActiveLock (WebDAVElement):
"""
Describes a lock on a resource. (RFC 2518, section 12.1)
@@ -57,6 +59,8 @@
}
+ at registerElement
+ at registerElementClass
class Depth (WebDAVTextElement):
"""
The value of the depth header. (RFC 2518, section 12.1.1)
@@ -71,6 +75,8 @@
raise ValueError("Invalid depth: %s" % (depth,))
+ at registerElement
+ at registerElementClass
class LockToken (WebDAVElement):
"""
The lock token associated with a lock. (RFC 2518, section 12.1.2)
@@ -80,6 +86,8 @@
allowed_children = { (dav_namespace, "href"): (1, None) }
+ at registerElement
+ at registerElementClass
class Timeout (WebDAVTextElement):
"""
The timeout associated with a lock. (RFC 2518, section 12.1.3)
@@ -87,6 +95,8 @@
name = "timeout"
+ at registerElement
+ at registerElementClass
class Collection (WebDAVEmptyElement):
"""
Identifies the associated resource as a collection. (RFC 2518, section 12.2)
@@ -94,6 +104,8 @@
name = "collection"
+ at registerElement
+ at registerElementClass
class HRef (WebDAVTextElement):
"""
Identifies the content of the element as a URI. (RFC 2518, section 12.3)
@@ -101,6 +113,8 @@
name = "href"
+ at registerElement
+ at registerElementClass
class Link (WebDAVElement):
"""
Identifies the property as a link and contains the source and
@@ -114,6 +128,8 @@
}
+ at registerElement
+ at registerElementClass
class LinkDestination (WebDAVTextElement):
"""
Indicates the destination of a link. (RFC 2518, section 12.4.1)
@@ -121,6 +137,8 @@
name = "dst"
+ at registerElement
+ at registerElementClass
class LinkSource (WebDAVTextElement):
"""
Indicates the source of a link. (RFC 2518, section 12.4.2)
@@ -128,6 +146,8 @@
name = "src"
+ at registerElement
+ at registerElementClass
class LockEntry (WebDAVElement):
"""
Defines the types of lock that can be used with the
@@ -141,6 +161,8 @@
}
+ at registerElement
+ at registerElementClass
class LockInfo (WebDAVElement):
"""
Used with a LOCK method to specify the type of lock that the
@@ -155,6 +177,8 @@
}
+ at registerElement
+ at registerElementClass
class LockScope (WebDAVOneShotElement):
"""
Specifies whether a lock is an exclusive lock or a shared
@@ -168,6 +192,8 @@
}
+ at registerElement
+ at registerElementClass
class Exclusive (WebDAVEmptyElement):
"""
Indicates an exclusive lock. (RFC 2518, section 12.7.1)
@@ -177,6 +203,8 @@
LockScope.exclusive = LockScope(Exclusive())
+ at registerElement
+ at registerElementClass
class Shared (WebDAVEmptyElement):
"""
Indicates a shared lock. (RFC 2518, section 12.7.2)
@@ -186,6 +214,8 @@
LockScope.shared = LockScope(Shared())
+ at registerElement
+ at registerElementClass
class LockType (WebDAVOneShotElement):
"""
Specifies the access type of a lock. (RFC 2518, section 12.8)
@@ -195,6 +225,8 @@
allowed_children = { (dav_namespace, "write"): (0, 1) }
+ at registerElement
+ at registerElementClass
class Write (WebDAVEmptyElement):
"""
Indicates a write lock. (RFC 2518, section 12.8.1)
@@ -207,6 +239,8 @@
LockType.write = LockType(Write())
+ at registerElement
+ at registerElementClass
class MultiStatus (WebDAVElement):
"""
Contains multiple Responses. (RFC 2518, section 12.9)
@@ -219,6 +253,8 @@
}
+ at registerElement
+ at registerElementClass
class Response (WebDAVElement):
"""
Holds a single response describing the effect of a method on a
@@ -267,6 +303,7 @@
return StatusResponse.__new__(StatusResponse, *children)
+ at registerElementClass
class StatusResponse (Response):
"""
Specialized derivative of Response for resource status.
@@ -281,6 +318,7 @@
}
+ at registerElementClass
class PropertyStatusResponse (Response):
"""
Specialized derivative of Response for property status.
@@ -295,6 +333,8 @@
}
+ at registerElement
+ at registerElementClass
class PropertyStatus (WebDAVElement):
"""
Groups together a Property and Status element that is associated
@@ -310,6 +350,8 @@
}
+ at registerElement
+ at registerElementClass
class Status (WebDAVTextElement):
"""
Holds a single HTTP status line. (RFC 2518, section 12.9.1.2)
@@ -342,6 +384,8 @@
self.code = code
+ at registerElement
+ at registerElementClass
class ResponseDescription (WebDAVTextElement):
"""
Contains a message that can be displayed to the user explaining the nature
@@ -350,6 +394,8 @@
name = "responsedescription"
+ at registerElement
+ at registerElementClass
class Owner (WebDAVElement):
"""
Property which provides information about the principal taking out a lock.
@@ -366,6 +412,8 @@
allowed_children = { WebDAVElement: (0, None) }
+ at registerElement
+ at registerElementClass
class PropertyContainer (WebDAVElement):
"""
Contains properties related to a resource. (RFC 2518, section 12.11)
@@ -375,6 +423,8 @@
allowed_children = { WebDAVElement: (0, None) }
+ at registerElement
+ at registerElementClass
class PropertyBehavior (WebDAVElement):
"""
Specifies how properties are handled during a COPY or MOVE. (RFC 2518,
@@ -399,6 +449,8 @@
self.behavior = children[0]
+ at registerElement
+ at registerElementClass
class KeepAlive (WebDAVElement):
"""
Specifies requirements for the copying/moving or live properties. (RFC 2518,
@@ -430,6 +482,8 @@
raise ValueError("Invalid keepalive value: %r", (str(self),))
+ at registerElement
+ at registerElementClass
class Omit (WebDAVEmptyElement):
"""
Instructs the server that it should use best effort to copy properties. (RFC
@@ -438,6 +492,8 @@
name = "omit"
+ at registerElement
+ at registerElementClass
class PropertyUpdate (WebDAVElement):
"""
Contains a request to alter the properties on a resource. (RFC 2518, section
@@ -451,6 +507,8 @@
}
+ at registerElement
+ at registerElementClass
class Remove (WebDAVElement):
"""
Lists the DAV properties to be removed from a resource. (RFC 2518, section
@@ -461,6 +519,8 @@
allowed_children = { (dav_namespace, "prop"): (1, 1) }
+ at registerElement
+ at registerElementClass
class Set (WebDAVElement):
"""
Lists the DAV properties to be set for a resource. (RFC 2518, section
@@ -471,6 +531,8 @@
allowed_children = { (dav_namespace, "prop"): (1, 1) }
+ at registerElement
+ at registerElementClass
class PropertyFind (WebDAVElement):
"""
Specifies the properties to be returned from a PROPFIND
@@ -494,6 +556,8 @@
)
+ at registerElement
+ at registerElementClass
class AllProperties (WebDAVEmptyElement):
"""
Specifies that all property names and values on the resource are
@@ -502,6 +566,8 @@
name = "allprop"
+ at registerElement
+ at registerElementClass
class PropertyName (WebDAVEmptyElement):
"""
Specifies that only a list of property names on the resource are
@@ -514,6 +580,8 @@
# Section 13
##
+ at registerElement
+ at registerElementClass
class CreationDate (WebDAVDateTimeElement):
"""
Records the time and date that the resource was created. (RFC 2518, section
@@ -524,6 +592,8 @@
protected = True
+ at registerElement
+ at registerElementClass
class DisplayName (WebDAVTextElement):
"""
Provides a name for the resource that is suitable for presentation
@@ -532,6 +602,8 @@
name = "displayname"
+ at registerElement
+ at registerElementClass
class GETContentLanguage (WebDAVTextElement):
"""
Contains the Content-Language header returned by a GET without
@@ -540,6 +612,8 @@
name = "getcontentlanguage"
+ at registerElement
+ at registerElementClass
class GETContentLength (WebDAVTextElement):
"""
Contains the Content-Length header returned by a GET without
@@ -549,6 +623,8 @@
protected = True
+ at registerElement
+ at registerElementClass
class GETContentType (WebDAVTextElement):
"""
Contains the Content-Type header returned by a GET without
@@ -560,6 +636,8 @@
return MimeType.fromString(str(self))
+ at registerElement
+ at registerElementClass
class GETETag (WebDAVTextElement):
"""
Contains the ETag header returned by a GET without
@@ -569,6 +647,8 @@
protected = True
+ at registerElement
+ at registerElementClass
class GETLastModified (DateTimeHeaderElement):
"""
Contains the Last-Modified header returned by a GET without accept
@@ -578,6 +658,8 @@
protected = True
+ at registerElement
+ at registerElementClass
class LockDiscovery (WebDAVElement):
"""
Describes the active locks on a resource. (RFC 2518, section 13.8)
@@ -588,6 +670,8 @@
allowed_children = { (dav_namespace, "activelock"): (0, None) }
+ at registerElement
+ at registerElementClass
class ResourceType (WebDAVElement):
"""
Specifies the nature of the resource. (RFC 2518, section 13.9)
@@ -601,6 +685,8 @@
ResourceType.empty = ResourceType()
+ at registerElement
+ at registerElementClass
class Source (WebDAVElement):
"""
The destination of the source link identifies the resource that
@@ -612,6 +698,8 @@
allowed_children = { (dav_namespace, "link"): (0, None) }
+ at registerElement
+ at registerElementClass
class SupportedLock (WebDAVElement):
"""
Provides a listing of the lock capabilities supported by the
@@ -626,6 +714,8 @@
# Pre-conditions codes defined in RFC4918
+ at registerElement
+ at registerElementClass
class PropfindFiniteDepth (WebDAVEmptyElement):
"""
Error which indicates Depth:infinity PROPFIND not allowed
Modified: CalendarServer/trunk/txdav/xml/rfc3253.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc3253.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc3253.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -28,14 +28,16 @@
See RFC 3253: http://www.ietf.org/rfc/rfc3253.txt
"""
-from txdav.xml.base import dav_namespace
-from txdav.xml.base import WebDAVElement, WebDAVTextElement
+from txdav.xml.base import WebDAVElement, WebDAVTextElement, dav_namespace
+from txdav.xml.element import registerElement, registerElementClass
##
# Section 1
##
+ at registerElement
+ at registerElementClass
class Error (WebDAVElement):
"""
Specifies an error condition. (RFC 3253, section 1.6)
@@ -51,6 +53,8 @@
# Section 3
##
+ at registerElement
+ at registerElementClass
class Comment (WebDAVTextElement):
"""
Property used to track a brief comment about a resource that is suitable for
@@ -61,6 +65,8 @@
hidden = True
+ at registerElement
+ at registerElementClass
class CreatorDisplayName (WebDAVTextElement):
"""
Property which contains a description of the creator of the resource that is
@@ -70,6 +76,8 @@
hidden = True
+ at registerElement
+ at registerElementClass
class SupportedMethod (WebDAVElement):
"""
Property which identifies a method that is supported by a resource. A method
@@ -85,6 +93,8 @@
allowed_attributes = { "name": True }
+ at registerElement
+ at registerElementClass
class SupportedMethodSet (WebDAVElement):
"""
Property which identifies the methods that are supported by a resource. (RFC
@@ -97,6 +107,8 @@
allowed_children = { (dav_namespace, "supported-method"): (0, None) }
+ at registerElement
+ at registerElementClass
class SupportedLiveProperty (WebDAVElement):
"""
Property which identifies a live property that is supported by a resource. A
@@ -112,6 +124,8 @@
allowed_children = { (dav_namespace, "name"): (1, 1) }
+ at registerElement
+ at registerElementClass
class SupportedLivePropertySet (WebDAVElement):
"""
Property which identifies the live properties that are supported by a
@@ -124,6 +138,8 @@
allowed_children = { (dav_namespace, "supported-live-property"): (0, None) }
+ at registerElement
+ at registerElementClass
class Report (WebDAVElement):
"""
A report. (RFC 3253, section 3.1.5)
@@ -134,6 +150,8 @@
allowed_children = { WebDAVElement: (0, None) }
+ at registerElement
+ at registerElementClass
class SupportedReport (WebDAVElement):
"""
Identifies a report that is supported by the resource. (RFC 3253, section
@@ -167,6 +185,8 @@
allowed_children = { (dav_namespace, "report"): (0, 1) }
+ at registerElement
+ at registerElementClass
class SupportedReportSet (WebDAVElement):
"""
Property which identifies the reports that are supported by the resource.
@@ -179,6 +199,8 @@
allowed_children = { (dav_namespace, "supported-report"): (0, None) }
+ at registerElement
+ at registerElementClass
class ExpandProperty (WebDAVElement):
"""
Report which provides a mechanism for retrieving in one request the
@@ -190,6 +212,8 @@
allowed_children = { (dav_namespace, "property"): (0, None) }
+ at registerElement
+ at registerElementClass
class Property (WebDAVElement):
"""
Identifies a property by name. (RFC 3253, section 3.8)
Modified: CalendarServer/trunk/txdav/xml/rfc3744.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc3744.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc3744.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -28,15 +28,17 @@
See RFC 3744: http://www.ietf.org/rfc/rfc3744.txt
"""
-from txdav.xml.base import dav_namespace
from txdav.xml.base import WebDAVElement, PCDATAElement
from txdav.xml.base import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import dav_namespace, registerElement, registerElementClass
##
# Section 3 (Privileges)
##
+ at registerElement
+ at registerElementClass
class Read (WebDAVEmptyElement):
"""
Privilege which controls methods that return information about the state
@@ -50,6 +52,8 @@
# rfc2518.py.
+ at registerElement
+ at registerElementClass
class WriteProperties (WebDAVEmptyElement):
"""
Privilege which controls methods that modify the dead properties of a
@@ -58,6 +62,8 @@
name = "write-properties"
+ at registerElement
+ at registerElementClass
class WriteContent (WebDAVEmptyElement):
"""
Privilege which controls methods that modify the content of an existing
@@ -66,6 +72,8 @@
name = "write-content"
+ at registerElement
+ at registerElementClass
class Unlock (WebDAVEmptyElement):
"""
Privilege which controls the use of the UNLOCK method by a principal other
@@ -74,6 +82,8 @@
name = "unlock"
+ at registerElement
+ at registerElementClass
class ReadACL (WebDAVEmptyElement):
"""
Privilege which controls the use of the PROPFIND method to retrieve the
@@ -82,6 +92,8 @@
name = "read-acl"
+ at registerElement
+ at registerElementClass
class ReadCurrentUserPrivilegeSet (WebDAVEmptyElement):
"""
Privilege which controls the use of the PROPFIND method to retrieve the
@@ -91,6 +103,8 @@
name = "read-current-user-privilege-set"
+ at registerElement
+ at registerElementClass
class WriteACL (WebDAVEmptyElement):
"""
Privilege which controls the use of the ACL method to modify the DAV:acl
@@ -99,6 +113,8 @@
name = "write-acl"
+ at registerElement
+ at registerElementClass
class Bind (WebDAVEmptyElement):
"""
Privilege which allows a method to add a new member URL from the a
@@ -107,6 +123,8 @@
name = "bind"
+ at registerElement
+ at registerElementClass
class Unbind (WebDAVEmptyElement):
"""
Privilege which allows a method to remove a member URL from the a collection
@@ -115,6 +133,8 @@
name = "unbind"
+ at registerElement
+ at registerElementClass
class All (WebDAVEmptyElement):
"""
Aggregate privilege that contains the entire set of privileges that can be
@@ -128,6 +148,8 @@
# Section 4 (Principal Properties)
##
+ at registerElement
+ at registerElementClass
class Principal (WebDAVElement):
"""
Indicates a principal resource type. (RFC 3744, section 4)
@@ -156,6 +178,8 @@
)
+ at registerElement
+ at registerElementClass
class AlternateURISet (WebDAVElement):
"""
Property which contains the URIs of network resources with additional
@@ -168,6 +192,8 @@
allowed_children = { (dav_namespace, "href"): (0, None) }
+ at registerElement
+ at registerElementClass
class PrincipalURL (WebDAVElement):
"""
Property which contains the URL that must be used to identify this principal
@@ -180,6 +206,8 @@
allowed_children = { (dav_namespace, "href"): (0, 1) }
+ at registerElement
+ at registerElementClass
class GroupMemberSet (WebDAVElement):
"""
Property which identifies the principals that are direct members of a group
@@ -192,6 +220,8 @@
allowed_children = { (dav_namespace, "href"): (0, None) }
+ at registerElement
+ at registerElementClass
class GroupMembership (WebDAVElement):
"""
Property which identifies the group principals in which a principal is
@@ -212,6 +242,8 @@
# rfc2518.py.
+ at registerElement
+ at registerElementClass
class Group (WebDAVElement):
"""
Property which identifies a particular principal as being the group
@@ -224,6 +256,8 @@
allowed_children = { (dav_namespace, "href"): (0, 1) }
+ at registerElement
+ at registerElementClass
class SupportedPrivilegeSet (WebDAVElement):
"""
Property which identifies the privileges defined for a resource. (RFC 3744,
@@ -236,6 +270,8 @@
allowed_children = { (dav_namespace, "supported-privilege"): (0, None) }
+ at registerElement
+ at registerElementClass
class SupportedPrivilege (WebDAVElement):
"""
Identifies a privilege defined for a resource. (RFC 3744, section 5.3)
@@ -250,6 +286,8 @@
}
+ at registerElement
+ at registerElementClass
class Privilege (WebDAVElement):
"""
Identifies a privilege. (RFC 3744, sections 5.3 and 5.5.1)
@@ -343,6 +381,8 @@
return aggregates
+ at registerElement
+ at registerElementClass
class Abstract (WebDAVElement):
"""
Identifies a privilege as abstract. (RFC 3744, section 5.3)
@@ -350,6 +390,8 @@
name = "abstract"
+ at registerElement
+ at registerElementClass
class Description (WebDAVTextElement):
"""
A human-readable description of what privilege controls access to. (RFC
@@ -359,6 +401,8 @@
allowed_attributes = { "xml:lang": True }
+ at registerElement
+ at registerElementClass
class CurrentUserPrivilegeSet (WebDAVElement):
"""
Property which contains the exact set of privileges (as computer by the
@@ -375,6 +419,8 @@
# For DAV:privilege element (RFC 3744, section 5.4) see Privilege class above.
+ at registerElement
+ at registerElementClass
class ACL (WebDAVElement):
"""
Property which specifies the list of access control entries which define
@@ -388,6 +434,8 @@
allowed_children = { (dav_namespace, "ace"): (0, None) }
+ at registerElement
+ at registerElementClass
class ACE (WebDAVElement):
"""
Specifies the list of access control entries which define what privileges
@@ -477,6 +525,8 @@
# For DAV:all element (RFC 3744, section 5.5.1) see All class above.
+ at registerElement
+ at registerElementClass
class Authenticated (WebDAVEmptyElement):
"""
Principal which matches authenticated users. (RFC 3744, section 5.5.1)
@@ -484,6 +534,8 @@
name = "authenticated"
+ at registerElement
+ at registerElementClass
class Unauthenticated (WebDAVEmptyElement):
"""
Principal which matches unauthenticated users. (RFC 3744, section 5.5.1)
@@ -495,6 +547,8 @@
# class above.
+ at registerElement
+ at registerElementClass
class Self (WebDAVEmptyElement):
"""
Principal which matches a user if a resource is a principal and the user
@@ -503,6 +557,8 @@
name = "self"
+ at registerElement
+ at registerElementClass
class Invert (WebDAVElement):
"""
Principal which matches a user if the user does not match the principal
@@ -513,6 +569,8 @@
allowed_children = { (dav_namespace, "principal"): (1, 1) }
+ at registerElement
+ at registerElementClass
class Grant (WebDAVElement):
"""
Grants the contained privileges to a principal. (RFC 3744, section 5.5.2)
@@ -522,6 +580,8 @@
allowed_children = { (dav_namespace, "privilege"): (1, None) }
+ at registerElement
+ at registerElementClass
class Deny (WebDAVElement):
"""
Denies the contained privileges to a principal. (RFC 3744, section 5.5.2)
@@ -535,6 +595,8 @@
# class above.
+ at registerElement
+ at registerElementClass
class Protected (WebDAVEmptyElement):
"""
Identifies an ACE as protected. (RFC 3744, section 5.5.3)
@@ -542,6 +604,8 @@
name = "protected"
+ at registerElement
+ at registerElementClass
class Inherited (WebDAVElement):
"""
Indicates that an ACE is inherited from the resource indentified by the
@@ -552,6 +616,8 @@
allowed_children = { (dav_namespace, "href"): (1, 1) }
+ at registerElement
+ at registerElementClass
class ACLRestrictions (WebDAVElement):
"""
Property which defines the types of ACLs supported by this server, to avoid
@@ -569,6 +635,8 @@
}
+ at registerElement
+ at registerElementClass
class GrantOnly (WebDAVEmptyElement):
"""
Indicates that ACEs with deny clauses are not allowed. (RFC 3744, section
@@ -577,6 +645,8 @@
name = "grant-only"
+ at registerElement
+ at registerElementClass
class NoInvert (WebDAVEmptyElement):
"""
Indicates that ACEs with the DAV:invert element are not allowed. (RFC 3744,
@@ -585,6 +655,8 @@
name = "no-invert"
+ at registerElement
+ at registerElementClass
class DenyBeforeGrant (WebDAVEmptyElement):
"""
Indicates that all deny ACEs must precede all grant ACEs. (RFC 3744, section
@@ -593,6 +665,8 @@
name = "deny-before-grant"
+ at registerElement
+ at registerElementClass
class RequiredPrincipal (WebDAVElement):
"""
Indicates which principals must have an ACE defined in an ACL. (RFC 3744,
@@ -625,6 +699,8 @@
)
+ at registerElement
+ at registerElementClass
class InheritedACLSet (WebDAVElement):
"""
Property which contains a set of URLs that identify other resources that
@@ -637,6 +713,8 @@
allowed_children = { (dav_namespace, "href"): (0, None) }
+ at registerElement
+ at registerElementClass
class PrincipalCollectionSet (WebDAVElement):
"""
Property which contains a set of URLs that identify the root collections
@@ -654,6 +732,8 @@
# Section 7 (Access Control and existing methods)
##
+ at registerElement
+ at registerElementClass
class NeedPrivileges (WebDAVElement):
"""
Error which indicates insufficient privileges. (RFC 3744, section 7.1.1)
@@ -663,6 +743,8 @@
allowed_children = { (dav_namespace, "resource"): (0, None) }
+ at registerElement
+ at registerElementClass
class Resource (WebDAVElement):
"""
Identifies which resource had insufficient privileges. (RFC 3744, section
@@ -680,6 +762,8 @@
# Section 9 (Access Control Reports)
##
+ at registerElement
+ at registerElementClass
class ACLPrincipalPropSet (WebDAVElement):
"""
Report which returns, for all principals in the DAV:acl property (of the
@@ -706,6 +790,8 @@
prop = True
+ at registerElement
+ at registerElementClass
class PrincipalMatch (WebDAVElement):
"""
Report used to identify all members (at any depth) of the collection
@@ -747,6 +833,8 @@
)
+ at registerElement
+ at registerElementClass
class PrincipalProperty (WebDAVElement):
"""
Identifies a property. (RFC 3744, section 9.3)
@@ -759,6 +847,8 @@
# For DAV:self element (RFC 3744, section 9.3) see Self class above.
+ at registerElement
+ at registerElementClass
class PrincipalPropertySearch (WebDAVElement):
"""
Report which performs a search for all principals whose properties contain
@@ -775,6 +865,8 @@
allowed_attributes = { "test": False }
+ at registerElement
+ at registerElementClass
class PropertySearch (WebDAVElement):
"""
Contains a DAV:prop element enumerating the properties to be searched and a
@@ -788,6 +880,8 @@
}
+ at registerElement
+ at registerElementClass
class Match (WebDAVTextElement):
"""
Contains a search string. (RFC 3744, section 9.4)
@@ -795,6 +889,8 @@
name = "match"
+ at registerElement
+ at registerElementClass
class PrincipalSearchPropertySet (WebDAVElement):
"""
Report which identifies those properties that may be searched using the
@@ -805,6 +901,8 @@
allowed_children = { (dav_namespace, "principal-search-property"): (0, None) }
+ at registerElement
+ at registerElementClass
class PrincipalSearchProperty (WebDAVElement):
"""
Contains exactly one searchable property, and a description of the property.
@@ -818,6 +916,8 @@
}
+ at registerElement
+ at registerElementClass
class NumberOfMatchesWithinLimits (WebDAVEmptyElement):
"""
Error which indicates too many results
Modified: CalendarServer/trunk/txdav/xml/rfc4331.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc4331.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc4331.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -29,12 +29,14 @@
"""
from txdav.xml.base import WebDAVTextElement
+from txdav.xml.element import registerElement, registerElementClass
-
##
# Section 3 & 4 (Quota Properties)
##
+ at registerElement
+ at registerElementClass
class QuotaAvailableBytes (WebDAVTextElement):
"""
Property which contains the the number of bytes available under the
@@ -45,6 +47,8 @@
protected = True
+ at registerElement
+ at registerElementClass
class QuotaUsedBytes (WebDAVTextElement):
"""
Property which contains the the number of bytes used under the
Modified: CalendarServer/trunk/txdav/xml/rfc5842.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc5842.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc5842.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -21,7 +21,7 @@
##
from txdav.xml.base import WebDAVTextElement, WebDAVElement
-from txdav.xml.base import dav_namespace
+from txdav.xml.element import dav_namespace, registerElement, registerElementClass
"""
RFC 5842 (Binding Extensions to WebDAV) XML Elements
@@ -31,6 +31,8 @@
See RFC 5842: http://www.ietf.org/rfc/rfc5842.txt
"""
+ at registerElement
+ at registerElementClass
class ResourceID (WebDAVElement):
"""
Unique identifier for a resource
@@ -42,6 +44,8 @@
allowed_children = { (dav_namespace, "href"): (0, 1) }
+ at registerElement
+ at registerElementClass
class ParentSet (WebDAVElement):
"""
Identifies other bindings to a resource
@@ -53,6 +57,8 @@
allowed_children = { (dav_namespace, "parent"): (0, 1) }
+ at registerElement
+ at registerElementClass
class Parent (WebDAVElement):
name = "parent"
@@ -63,6 +69,8 @@
}
+ at registerElement
+ at registerElementClass
class Segment (WebDAVTextElement):
name = "segment"
@@ -75,6 +83,8 @@
# sub-elements and so that can extend it here.
+#@registerElement
+#@registerElementClass
#class BindResponse (WebDAVElement):
# """
# Response body for a BIND request
@@ -87,6 +97,8 @@
# }
#
#
+#@registerElement
+#@registerElementClass
#class UnbindRequest (WebDAVElement):
# """
# Request body for a UNBIND request
@@ -99,6 +111,8 @@
# }
#
#
+#@registerElement
+#@registerElementClass
#class Unbind (WebDAVElement):
# """
# Response body for a UNBIND request
@@ -111,6 +125,8 @@
# }
#
#
+#@registerElement
+#@registerElementClass
#class RebindRequest (WebDAVElement):
# """
# Request body for a REBIND request
@@ -124,6 +140,8 @@
# }
#
#
+#@registerElement
+#@registerElementClass
#class Rebind (WebDAVElement):
# """
# Response body for a UNBIND request
Modified: CalendarServer/trunk/txdav/xml/test/test_base.py
===================================================================
--- CalendarServer/trunk/txdav/xml/test/test_base.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/test/test_base.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -27,7 +27,8 @@
from twisted.trial.unittest import TestCase
from txdav.xml.base import decodeXMLName, encodeXMLName
-from twext.web2.dav.davxml import WebDAVDocument, WebDAVUnknownElement
+from txdav.xml.base import WebDAVUnknownElement
+from txdav.xml.parser import WebDAVDocument
class NameEncodeTests(TestCase):
Modified: CalendarServer/trunk/txdav/xml/test/test_xml.py
===================================================================
--- CalendarServer/trunk/txdav/xml/test/test_xml.py 2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/test/test_xml.py 2012-03-17 07:27:16 UTC (rev 8907)
@@ -28,8 +28,8 @@
"""
from twisted.trial.unittest import TestCase
-from twext.web2.dav.davxml import Response, HRef, MultiStatus, Status
-from twext.web2.dav.davxml import CurrentUserPrincipal
+from txdav.xml.element import Response, HRef, MultiStatus, Status
+from txdav.xml.element import CurrentUserPrincipal
from txdav.xml.test.test_base import WebDAVElementTestsMixin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120317/eb4ab1c0/attachment-0001.html>
More information about the calendarserver-changes
mailing list