def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:sync-collection>
        #   <DAV:sync-token>xxx</DAV:sync-token>
        #   <DAV:sync-level>xxx</DAV:sync-level>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        # </DAV:sync-collection>

        # <DAV:sync-collection> element
        synccollection = Element(davxml.sync_collection)

        # Add sync-token element
        SubElement(synccollection, davxml.sync_token).text = self.synctoken

        # Add sync-token element
        SubElement(synccollection, davxml.sync_level).text = self.level

        # <DAV:prop> element
        prop = SubElement(synccollection, davxml.prop)

        if self.props:
            # Now add each property
            for propname in self.props:
                # Add property element taking namespace into account
                SubElement(prop, propname)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(synccollection)
        xmldoc.writeUTF8(os)
Ejemplo n.º 2
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:propertyupdate>
        #   <DAV:set>
        #     <<names/values of each property as elements>>
        #   </DAV:set>
        #   <DAV:remove>
        #     <<names of each property as elements>>
        #   </DAV:remove>
        # </DAV:propertyupdate>

        # <DAV:propertyupdate> element
        propertyupdate = Element(davxml.propertyupdate)

        # <DAV:set> element
        if self.setprops:
            set = SubElement(propertyupdate, davxml.set)
            propel = SubElement(set, davxml.prop)
            for prop in self.setprops:
                propel.append(prop)

        # <DAV:remove> element
        if self.delprops:
            remove = SubElement(propertyupdate, davxml.remove)
            propel = SubElement(remove, davxml.prop)
            for prop in self.delprops:
                propel.append(prop)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(propertyupdate)
        xmldoc.writeUTF8(os)
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:sync-collection>
        #   <DAV:sync-token>xxx</DAV:sync-token>
        #   <DAV:sync-level>xxx</DAV:sync-level>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        # </DAV:sync-collection>

        # <DAV:sync-collection> element
        synccollection = Element(davxml.sync_collection)

        # Add sync-token element
        SubElement(synccollection, davxml.sync_token).text = self.synctoken

        # Add sync-token element
        SubElement(synccollection, davxml.sync_level).text = self.level

        # <DAV:prop> element
        prop = SubElement(synccollection, davxml.prop)

        if self.props:
            # Now add each property
            for propname in self.props:
                # Add property element taking namespace into account
                SubElement(prop, propname)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(synccollection)
        xmldoc.writeUTF8(os)
Ejemplo n.º 4
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CALDAV:mkcalendar>
        #   <DAV:prop>
        #     <<each property as elements>>
        #   </DAV:prop>
        # </CALDAV:mkcalendar>

        # <CALDAV:mkcalendar> element
        mkcalendar = Element(caldavxml.mkcalendar)

        # <DAV:prop> element
        prop = SubElement(mkcalendar, davxml.prop)

        # <DAV:displayname> element
        if self.displayname:
            displayname = SubElement(prop, davxml.displayname)
            displayname.text = self.displayname

        # <CalDAV:calendar-description> element
        if self.description:
            description = SubElement(prop, caldavxml.calendar_description)
            description.text = self.description

        # <CalDAV:timezone> element
        if self.timezone:
            timezone = SubElement(prop, caldavxml.calendar_timezone)
            timezone.text = self.timezone

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(mkcalendar)
        xmldoc.writeUTF8(os)
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:principal-match>
        #   <DAV:self/>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        # </DAV:principal-match>

        # <DAV:principal-match> element
        principalmatch = Element(davxml.principal_match)

        # <DAV:self> element
        SubElement(principalmatch, davxml.self)

        if self.props:

            # <DAV:prop> element
            prop = SubElement(principalmatch, davxml.prop)

            # Now add each property
            for item in self.props:

                # Add property element taking namespace into account

                # Look for DAV namespace and reuse that one
                SubElement(prop, item)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(principalmatch)
        xmldoc.writeUTF8(os)
Ejemplo n.º 6
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CalDAV:calendar-multiget>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        #   <DAV:href>...</DAV:href>
        #   ...
        # </CalDAV:calendar-multiget>

        # <CalDAV:calendar-multiget> element
        multiget = Element(caldavxml.calendar_multiget)

        if self.props:
            # <DAV:prop> element
            prop = SubElement(multiget, davxml.prop)

            # Now add each property
            for propname in self.props:
                # Add property element taking namespace into account
                SubElement(prop, propname)

        # Now add each href
        for href in self.hrefs:
            # Add href elements
            SubElement(multiget, davxml.href).text = href

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(multiget)
        xmldoc.writeUTF8(os)
Ejemplo n.º 7
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CS:invite-reply>
        #   <DAV:href>...</DAV:href>
        #   <CS:invite-accepted /> | <CS:invite-declined />
        #   <CS:hosturl>...</CS:hosturl>
        #   <CS:in-reply-to>...</CS:in-reply-to>
        # </CS:invite-reply>

        # <CS:invite-reply> element
        invite_reply = Element(csxml.invite_reply)

        # <DAV:href> element
        href = SubElement(invite_reply, davxml.href)
        href.text = self.notification.user_uid

        # <CS:invite-accepted /> | <CS:invite-declined />
        SubElement(invite_reply, csxml.invite_accepted if self.accepted else csxml.invite_declined)

        # <CS:hosturl> element
        hosturl = SubElement(invite_reply, csxml.hosturl)

        # <DAV:href> element
        href = SubElement(hosturl, davxml.href)
        href.text = self.notification.hosturl

        # <CS:in-reply-to> element
        in_reply_to = SubElement(invite_reply, csxml.in_reply_to)
        in_reply_to.text = self.notification.uid

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(invite_reply)
        xmldoc.writeUTF8(os)
Ejemplo n.º 8
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CardDAV:addressbook-multiget>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        #   <DAV:href>...</DAV:href>
        #   ...
        # </CardDAV:addressbook-multiget>

        # <CalDAV:calendar-multiget> element
        multiget = Element(carddavxml.addressbook_multiget)

        if self.props:
            # <DAV:prop> element
            prop = SubElement(multiget, davxml.prop)

            # Now add each property
            for propname in self.props:
                # Add property element taking namespace into account
                SubElement(prop, propname)

        # Now add each href
        for href in self.hrefs:
            # Add href elements
            SubElement(multiget, davxml.href).text = href

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(multiget)
        xmldoc.writeUTF8(os)
Ejemplo n.º 9
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:acl>
        #   <DAV:ace>
        #     <S:inheritable xmlns:S="http:#jakarta.apache.org/slide/"> / <S:non-inheritable xmlns:S="http:#jakarta.apache.org/slide/">
        #     <DAV:principal>...</DAV:principal>
        #       <DAV:grant>...</DAV:grant>
        #   </DAV:ace>
        #   ...
        # </DAV:acl>

        # <DAV:acl> element
        acl = Element(davxml.acl)

        # Do for each ACL
        if self.acls:

            for ace in self.acls:
                # Cannot do if change not allowed
                if not ace.canChange():
                    continue

                # <DAV:ace> element
                ace.generateACE(acl)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(acl)
        xmldoc.writeUTF8(os)
Ejemplo n.º 10
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:propertyupdate>
        #   <DAV:set>
        #     <<names/values of each property as elements>>
        #   </DAV:set>
        #   <DAV:remove>
        #     <<names of each property as elements>>
        #   </DAV:remove>
        # </DAV:propertyupdate>

        # <DAV:propertyupdate> element
        propertyupdate = Element(davxml.propertyupdate)

        # <DAV:set> element
        if self.setprops:
            set = SubElement(propertyupdate, davxml.set)
            propel = SubElement(set, davxml.prop)
            for prop in self.setprops:
                propel.append(prop)

        # <DAV:remove> element
        if self.delprops:
            remove = SubElement(propertyupdate, davxml.remove)
            propel = SubElement(remove, davxml.prop)
            for prop in self.delprops:
                propel.append(prop)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(propertyupdate)
        xmldoc.writeUTF8(os)
Ejemplo n.º 11
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:acl>
        #   <DAV:ace>
        #     <S:inheritable xmlns:S="http:#jakarta.apache.org/slide/"> / <S:non-inheritable xmlns:S="http:#jakarta.apache.org/slide/">
        #     <DAV:principal>...</DAV:principal>
        #       <DAV:grant>...</DAV:grant>
        #   </DAV:ace>
        #   ...
        # </DAV:acl>

        # <DAV:acl> element
        acl = Element(davxml.acl)

        # Do for each ACL
        if self.acls:

            for ace in self.acls:
                # Cannot do if change not allowed
                if not ace.canChange():
                    continue

                # <DAV:ace> element
                ace.generateACE(acl)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(acl)
        xmldoc.writeUTF8(os)
Ejemplo n.º 12
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:principal-match>
        #   <DAV:self/>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        # </DAV:principal-match>

        # <DAV:principal-match> element
        principalmatch = Element(davxml.principal_match)

        # <DAV:self> element
        SubElement(principalmatch, davxml.self)

        if self.props:

            # <DAV:prop> element
            prop = SubElement(principalmatch, davxml.prop)

            # Now add each property
            for item in self.props:

                # Add property element taking namespace into account

                # Look for DAV namespace and reuse that one
                SubElement(prop, item)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(principalmatch)
        xmldoc.writeUTF8(os)
Ejemplo n.º 13
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:propfind>
        #   <DAV:allprop/>
        # </DAV:propfind>

        # <DAV:propfind> element
        propfind = Element(davxml.propfind)

        # <DAV:propname> element
        propfind.append(Element(davxml.allprop))

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(propfind)
        xmldoc.writeUTF8(os)
Ejemplo n.º 14
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:propfind>
        #   <DAV:allprop/>
        # </DAV:propfind>

        # <DAV:propfind> element
        propfind = Element(davxml.propfind)

        # <DAV:propname> element
        propfind.append(Element(davxml.allprop))

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(propfind)
        xmldoc.writeUTF8(os)
Ejemplo n.º 15
0
    def writeAccounts(self):
        """
        Write the entire directory to the XML file.
        """

        node = self.directory.writeXML()
        os = StringIO()
        xmldoc = BetterElementTree(node)
        xmldoc.writeUTF8(os)
        f = open(self.path, "w")
        if not f:
            print "Could not open file: %s for writing" % (self.path,)
            return 0
        f.write(os.getvalue())
        f.close()
        return 1
    def checkXML(self, x):

        x = x.replace("\n", "\r\n")

        # Parse the XML data
        a = XMLDirectory()
        a.parseXML(XML(x))

        # Generate the XML data
        node = a.writeXML()
        os = StringIO()
        xmldoc = BetterElementTree(node)
        xmldoc.writeUTF8(os)

        # Verify data
        self.assertEqual(os.getvalue(), x)
Ejemplo n.º 17
0
    def writeAccounts(self):
        """
        Write the entire directory to the XML file.
        """

        node = self.directory.writeXML()
        os = StringIO()
        xmldoc = BetterElementTree(node)
        xmldoc.writeUTF8(os)
        f = open(self.path, "w")
        if not f:
            print "Could not open file: %s for writing" % (self.path,)
            return 0
        f.write(os.getvalue())
        f.close()
        return 1
Ejemplo n.º 18
0
    def checkXML(self, x):

        x = x.replace("\n", "\r\n")

        # Parse the XML data
        a = XMLRecord()
        a.parseXML(XML(x))

        # Generate the XML data
        node = a.writeXML()
        os = StringIO()
        xmldoc = BetterElementTree(node)
        xmldoc.writeUTF8(os)

        # Verify data
        self.assertEqual(os.getvalue(), x)
Ejemplo n.º 19
0
    def verifyXML(self, x, y=None):

        x = x.replace("\n", "\r\n")
        if y:
            y = y.replace("\n", "\r\n")

        # Parse the XML data
        a = ACE()
        a.parseACE(XML(x))

        # Generate the XML data
        aclnode = Element(davxml.acl)
        a.generateACE(aclnode)
        os = StringIO()
        xmldoc = BetterElementTree(aclnode.getchildren()[0])
        xmldoc.writeUTF8(os)

        # Verify data
        self.assertEqual(os.getvalue(), y if y else x)
Ejemplo n.º 20
0
    def verifyXML(self, x, y=None):

        x = x.replace("\n", "\r\n")
        if y:
            y = y.replace("\n", "\r\n")

        # Parse the XML data
        a = ACE()
        a.parseACE(XML(x))

        # Generate the XML data
        aclnode = Element(davxml.acl)
        a.generateACE(aclnode)
        os = StringIO()
        xmldoc = BetterElementTree(aclnode.getchildren()[0])
        xmldoc.writeUTF8(os)

        # Verify data
        self.assertEqual(os.getvalue(), y if y else x)
Ejemplo n.º 21
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CardDAV:addressbook-query>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        #   <CardDAV:filter>...</CardDAV:filter>
        # </CardDAV:addressbook-query>

        # <CardDAV:addressbook-query> element
        query = Element(carddavxml.addressbook_query)

        self.addProps(query)

        # Now add each href
        self.addFilterElement(query)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(query)
        xmldoc.writeUTF8(os)
Ejemplo n.º 22
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CardDAV:addressbook-query>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        #   <CardDAV:filter>...</CardDAV:filter>
        # </CardDAV:addressbook-query>

        # <CardDAV:addressbook-query> element
        query = Element(carddavxml.addressbook_query)

        self.addProps(query)

        # Now add each href
        self.addFilterElement(query)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(query)
        xmldoc.writeUTF8(os)
    def generateXML(self, os):
        # Structure of document is:
        #
        # <WEBDAV:mkcol>
        #   <DAV:set>
        #     <DAV:prop>
        #       <DAV:resourcetype><DAV:collection/><CARDDAV:addressbook/></DAV:resourcetype>
        #       <<each property as elements>>
        #     </DAV:prop>
        #   </DAV:set>
        # </WEBDAV:mkcol>

        # <CALDAV:mkcalendar> element
        mkcol = Element(davxml.mkcol)

        # <DAV:set> element
        set = SubElement(mkcol, davxml.set)

        # <DAV:prop> element
        prop = SubElement(set, davxml.prop)

        # <WebDAV:resourcetype> element
        resourcetype = SubElement(prop, davxml.resourcetype)
        SubElement(resourcetype, davxml.collection)
        SubElement(resourcetype, carddavxml.addressbook)

        # <DAV:displayname> element
        if self.displayname:
            displayname = SubElement(prop, davxml.displayname)
            displayname.text = self.displayname

        # <CardDAV:addressbook-description> element
        if self.description:
            description = SubElement(prop, carddavxml.addressbook_description)
            description.text = self.description

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(mkcol)
        xmldoc.writeUTF8(os)
Ejemplo n.º 24
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CS:share>
        #   <CS:remove>
        #     <DAV:href>...</DAV:href>
        #   </CS:remove>
        # </CS:share>

        # <CS:share> element
        share = Element(csxml.share)

        # <CS:remove> element
        remove = SubElement(share, csxml.remove)

        # <DAV:href> element
        href = SubElement(remove, davxml.href)
        href.text = self.invitee.user_uid

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(share)
        xmldoc.writeUTF8(os)
Ejemplo n.º 25
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <WEBDAV:mkcol>
        #   <DAV:set>
        #     <DAV:prop>
        #       <DAV:resourcetype><DAV:collection/><CARDDAV:addressbook/></DAV:resourcetype>
        #       <<each property as elements>>
        #     </DAV:prop>
        #   </DAV:set>
        # </WEBDAV:mkcol>

        # <CALDAV:mkcalendar> element
        mkcol = Element(davxml.mkcol)

        # <DAV:set> element
        set = SubElement(mkcol, davxml.set)

        # <DAV:prop> element
        prop = SubElement(set, davxml.prop)

        # <WebDAV:resourcetype> element
        resourcetype = SubElement(prop, davxml.resourcetype)
        SubElement(resourcetype, davxml.collection)
        SubElement(resourcetype, carddavxml.addressbook)

        # <DAV:displayname> element
        if self.displayname:
            displayname = SubElement(prop, davxml.displayname)
            displayname.text = self.displayname

        # <CardDAV:addressbook-description> element
        if self.description:
            description = SubElement(prop, carddavxml.addressbook_description)
            description.text = self.description

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(mkcol)
        xmldoc.writeUTF8(os)
Ejemplo n.º 26
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CALDAV:mkcalendar>
        #   <DAV:set>
        #     <DAV:prop>
        #       <<each property as elements>>
        #     </DAV:prop>
        #   </DAV:set>
        # </CALDAV:mkcalendar>

        # <CALDAV:mkcalendar> element
        mkcalendar = Element(caldavxml.mkcalendar)

        # <DAV:set> element
        set = SubElement(mkcalendar, davxml.set)

        # <DAV:prop> element
        prop = SubElement(set, davxml.prop)

        # <DAV:displayname> element
        if self.displayname:
            displayname = SubElement(prop, davxml.displayname)
            displayname.text = self.displayname

        # <CalDAV:calendar-description> element
        if self.description:
            description = SubElement(prop, caldavxml.calendar_description)
            description.text = self.description

        # <CalDAV:timezone> element
        if self.timezone:
            timezone = SubElement(prop, caldavxml.calendar_timezone)
            timezone.text = self.timezone

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(mkcalendar)
        xmldoc.writeUTF8(os)
Ejemplo n.º 27
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CS:share>
        #   <CS:set>
        #     <DAV:href>...</DAV:href>
        #     <CS:summary>...</CS:summary>
        #     <CS:read /> | <CS:read-write />
        #   </CS:set>
        #   <CS:set>
        #     <DAV:href>...</DAV:href>
        #     <CS:summary>...</CS:summary>
        #     <CS:read /> | <CS:read-write />
        #   </CS:set>
        #   ...
        # </CS:share>

        # <CS:share> element
        share = Element(csxml.share)

        for user_uid in self.user_uids:
            # <CS:set> element
            set = SubElement(share, csxml.set)

            # <DAV:href> element
            href = SubElement(set, davxml.href)
            href.text = user_uid

            # <CS:summary> element
            summary = SubElement(set, csxml.summary)
            summary.text = self.summary

            # <CS:read /> | <CS:read-write />
            SubElement(set, csxml.read_write if self.read_write else csxml.read)

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(share)
        xmldoc.writeUTF8(os)
    def generateXML(self, os):
        # Structure of document is:
        #
        # <CS:invite-reply>
        #   <DAV:href>...</DAV:href>
        #   <CS:invite-accepted /> | <CS:invite-declined />
        #   <CS:hosturl>...</CS:hosturl>
        #   <CS:in-reply-to>...</CS:in-reply-to>
        # </CS:invite-reply>

        # <CS:invite-reply> element
        invite_reply = Element(csxml.invite_reply)

        # <DAV:href> element
        href = SubElement(invite_reply, davxml.href)
        href.text = self.notification.user_uid

        # <CS:invite-accepted /> | <CS:invite-declined />
        SubElement(
            invite_reply,
            csxml.invite_accepted if self.accepted else csxml.invite_declined)

        # <CS:hosturl> element
        hosturl = SubElement(invite_reply, csxml.hosturl)

        # <DAV:href> element
        href = SubElement(hosturl, davxml.href)
        href.text = self.notification.hosturl

        # <CS:in-reply-to> element
        in_reply_to = SubElement(invite_reply, csxml.in_reply_to)
        in_reply_to.text = self.notification.uid

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(invite_reply)
        xmldoc.writeUTF8(os)
Ejemplo n.º 29
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:propfind>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        # </DAV:propfind>

        # <DAV:propfind> element
        propfind = Element(davxml.propfind)

        # <DAV:prop> element
        prop = Element(davxml.prop)
        propfind.append(prop)

        # Now add each property
        for propname in self.props:
            # Add property element taking namespace into account
            prop.append(Element(propname))

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(propfind)
        xmldoc.writeUTF8(os)
Ejemplo n.º 30
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:propfind>
        #   <DAV:prop>
        #     <<names of each property as elements>>
        #   </DAV:prop>
        # </DAV:propfind>

        # <DAV:propfind> element
        propfind = Element(davxml.propfind)

        # <DAV:prop> element
        prop = Element(davxml.prop)
        propfind.append(prop)

        # Now add each property
        for propname in self.props:
            # Add property element taking namespace into account
            prop.append(Element(propname))

        # Now we have the complete document, so write it out (no indentation)
        xmldoc = BetterElementTree(propfind)
        xmldoc.writeUTF8(os)
Ejemplo n.º 31
0
    def generateXML(self, os):
        # Structure of document is:
        #
        # <DAV:lockinfo>
        #   <DAV:lockscope>
        #     <DAV:exclusive/> | <DAV:shared/>
        #   </DAV:lockscope>
        #   <DAV:locktype>
        #     <DAV:write/>
        #   </DAV:locktype>
        #   <DAV:owner>
        #     <<owner>>
        #   </DAV:owner>
        # </DAV:lockinfo>

        # <DAV:lockinfo> element
        lockinfo = Element(davxml.lockinfo)

        # <DAV:lockscope> element
        lockscope = Element(davxml.lockscope)
        lockinfo.append(lockscope)

        # <DAV:exclusive/> | <DAV:shared/> element
        lockscope.append(Element(davxml.exclusive if self.scope == Lock.eExclusive else davxml.shared))

        # <DAV:locktype> element
        locktype = Element(davxml.locktype)
        lockinfo.append(locktype)

        # <DAV:write/> element
        locktype.append(Element(davxml.write))

        # <DAV:owner> element is optional
        if self.owner:
            # <DAV:owner> element
            owner = Element(davxml.owner)
            owner.text = self.owner
            lockinfo.append(owner)

        # Now we have the complete document, so write it out (no indentation)
        BetterElementTree(lockinfo).writeUTF8(os)