Пример #1
0
 def setUp(self, request, node, data):
     FormFillerWidget.setUp(self, request, node, data)
     for k, f in self.model.err.items():
         en = self.errorNodes[k]
         tn = self.inputNodes[k]
         en.setAttribute('class', 'formError')
         tn.setAttribute('class', 'formInputError')
         en.childNodes[:]=[] # gurfle, CLEAR IT NOW!@#
         if isinstance(f, failure.Failure):
             f = f.getErrorMessage()
         lmx(en).text(str(f))
Пример #2
0
 def setUp(self, request, node, data):
     FormFillerWidget.setUp(self, request, node, data)
     for k, f in self.model.err.items():
         en = self.errorNodes[k]
         tn = self.inputNodes[k]
         en.setAttribute('class', 'formError')
         tn.setAttribute('class', 'formInputError')
         en.childNodes[:] = []  # gurfle, CLEAR IT NOW!@#
         if isinstance(f, failure.Failure):
             f = f.getErrorMessage()
         lmx(en).text(str(f))
Пример #3
0
    def scrub(self, node, filterCIDLinks=True):
        """
        Remove all potentially harmful elements from the node and
        return a wrapper node.

        For reasons (perhaps dubious) of performance, this mutates its
        input.
        """
        if node.nodeName == 'html':
            filler = body = lmx().div(_class="message-html")
            for c in node.childNodes:
                if c.nodeName == 'head':
                    for hc in c.childNodes:
                        if hc.nodeName == 'title':
                            body.div(_class="message-title").text(domhelpers.gatherTextNodes(hc))
                            break
                elif c.nodeName == 'body':
                    filler = body.div(_class='message-body')
                    break
        else:
            filler = body = lmx().div(_class="message-nohtml")
        for e in self.iternode(node):
            if getattr(e, 'clean', False):
                # If I have manually exploded this node, just forget about it.
                continue
            ennl = e.nodeName.lower()

            if filterCIDLinks and self._filterCIDLink(e):
                # we could replace these with a marker element, like we do
                # with dangerous tags, but i'm not sure there is a reason to
                e.parentNode.removeChild(e)

            if ennl in self._goodHtml:
                handler = getattr(self, '_handle_' + ennl, None)
                if handler is not None:
                    e = handler(e)
                newAttributes = {}
                oldAttributes = e.attributes
                e.attributes = newAttributes
                goodAttributes = self._goodHtml[ennl] + self._alwaysSafeAttributes
                for attr in goodAttributes:
                    if attr in oldAttributes:
                        newAttributes[attr] = oldAttributes[attr]
            else:
                e.attributes.clear()
                e.setTagName("div")
                e.setAttribute("class", "message-html-unknown")
                e.setAttribute("style", "display: none")
                div = Element('div')
                div.setAttribute('class', 'message-html-unknown-tag')
                div.appendChild(Text("Untrusted %s tag" % (ennl, )))
                e.childNodes.insert(0, div)
        filler.node.appendChild(node)
        return body.node
Пример #4
0
    def setUp(self, request, node, data):
        # node = widgets.Widget.generateDOM(self,request,node)
        lmn = lmx(node)
        if not node.hasAttribute('action'):
            lmn['action'] = (request.prepath + request.postpath)[-1]
        if not node.hasAttribute("method"):
            lmn['method'] = 'post'
        lmn['enctype'] = 'multipart/form-data'
        self.errorNodes = errorNodes = {}  # name: nodes which trap errors
        self.inputNodes = inputNodes = {}
        for errorNode in domhelpers.findElementsWithAttribute(
                node, 'errorFor'):
            errorNodes[errorNode.getAttribute('errorFor')] = errorNode
        argz = {}
        # list to figure out which nodes are in the template already and which aren't
        hasSubmit = 0
        argList = self.model.fmethod.getArgs()
        for arg in argList:
            if isinstance(arg, formmethod.Submit):
                hasSubmit = 1
            argz[arg.name] = arg
        inNodes = domhelpers.findElements(
            node, lambda n: n.tagName.lower() in
            ('textarea', 'select', 'input', 'div'))
        for inNode in inNodes:
            t = inNode.getAttribute("type")
            if t and t.lower() == "submit":
                hasSubmit = 1
            if not inNode.hasAttribute("name"):
                continue
            nName = inNode.getAttribute("name")
            if argz.has_key(nName):
                #send an empty content shell - we just want the node
                inputNodes[nName] = self.convergeInput(request, lmx(),
                                                       argz[nName], inNode)
                inNode.parentNode.replaceChild(inputNodes[nName], inNode)
                del argz[nName]
            # TODO:
            # * some arg types should only have a single node (text, string, etc)
            # * some should have multiple nodes (choice, checkgroup)
            # * some have a bunch of ancillary nodes that are possible values (menu, radiogroup)
            # these should all be taken into account when walking through the template
        if argz:
            shell = self.createShell(request, node, data)
            # create inputs, in the same order they were passed to us:
            for remArg in [arg for arg in argList if argz.has_key(arg.name)]:
                inputNode, errorNode = self.createInput(request, shell, remArg)
                errorNodes[remArg.name] = errorNode
                inputNodes[remArg.name] = inputNode

        if not hasSubmit:
            lmn.input(type="submit")
Пример #5
0
    def setUp(self, request, node, data):
        # node = widgets.Widget.generateDOM(self,request,node)
        lmn = lmx(node)
        if not node.hasAttribute('action'):
            lmn['action'] = (request.prepath+request.postpath)[-1]
        if not node.hasAttribute("method"):
            lmn['method'] = 'post'
        lmn['enctype'] = 'multipart/form-data'
        self.errorNodes = errorNodes = {}                     # name: nodes which trap errors
        self.inputNodes = inputNodes = {}
        for errorNode in domhelpers.findElementsWithAttribute(node, 'errorFor'):
            errorNodes[errorNode.getAttribute('errorFor')] = errorNode
        argz={}
        # list to figure out which nodes are in the template already and which aren't
        hasSubmit = 0
        argList = self.model.fmethod.getArgs()
        for arg in argList:
            if isinstance(arg, formmethod.Submit):
                hasSubmit = 1
            argz[arg.name] = arg
        inNodes = domhelpers.findElements(
            node,
            lambda n: n.tagName.lower() in ('textarea', 'select', 'input',
                                            'div'))
        for inNode in inNodes:
            t = inNode.getAttribute("type")
            if t and t.lower() == "submit":
                hasSubmit = 1
            if not inNode.hasAttribute("name"):
                continue
            nName = inNode.getAttribute("name")
            if argz.has_key(nName):
                #send an empty content shell - we just want the node
                inputNodes[nName] = self.convergeInput(request, lmx(),
                                                       argz[nName], inNode)
                inNode.parentNode.replaceChild(inputNodes[nName], inNode)
                del argz[nName]
            # TODO:
            # * some arg types should only have a single node (text, string, etc)
            # * some should have multiple nodes (choice, checkgroup)
            # * some have a bunch of ancillary nodes that are possible values (menu, radiogroup)
            # these should all be taken into account when walking through the template
        if argz:
            shell = self.createShell(request, node, data)
            # create inputs, in the same order they were passed to us:
            for remArg in [arg for arg in argList if argz.has_key(arg.name)]:
                inputNode, errorNode = self.createInput(request, shell, remArg)
                errorNodes[remArg.name] = errorNode
                inputNodes[remArg.name] = inputNode

        if not hasSubmit:
            lmn.input(type="submit")
 def wvupdate_thumbnail(self, request, node, data):
     a = microdom.lmx(node)
     a["href"] = data
     if os.path.isdir(os.path.join(self.directory, data)):
         a.text(data)
     else:
         a.img(src=(data + "/preview"), width="200", height="200").text(data)
Пример #7
0
 def testUnicodeTolerance(self):
     import struct
     s = '<foo><bar><baz /></bar></foo>'
     j =(u'<?xml version="1.0" encoding="UCS-2" ?>\r\n<JAPANESE>\r\n'
         u'<TITLE>\u5c02\u9580\u5bb6\u30ea\u30b9\u30c8 </TITLE></JAPANESE>')
     j2=('\xff\xfe<\x00?\x00x\x00m\x00l\x00 \x00v\x00e\x00r\x00s\x00i\x00o'
         '\x00n\x00=\x00"\x001\x00.\x000\x00"\x00 \x00e\x00n\x00c\x00o\x00d'
         '\x00i\x00n\x00g\x00=\x00"\x00U\x00C\x00S\x00-\x002\x00"\x00 \x00?'
         '\x00>\x00\r\x00\n\x00<\x00J\x00A\x00P\x00A\x00N\x00E\x00S\x00E'
         '\x00>\x00\r\x00\n\x00<\x00T\x00I\x00T\x00L\x00E\x00>\x00\x02\\'
         '\x80\x95\xb6[\xea0\xb90\xc80 \x00<\x00/\x00T\x00I\x00T\x00L\x00E'
         '\x00>\x00<\x00/\x00J\x00A\x00P\x00A\x00N\x00E\x00S\x00E\x00>\x00')
     def reverseBytes(s):
         fmt = str(len(s) / 2) + 'H'
         return struct.pack('<' + fmt, *struct.unpack('>' + fmt, s))
     urd = microdom.parseString(reverseBytes(s.encode('UTF-16')))
     ud = microdom.parseString(s.encode('UTF-16'))
     sd = microdom.parseString(s)
     self.assert_(ud.isEqualToDocument(sd))
     self.assert_(ud.isEqualToDocument(urd))
     ud = microdom.parseString(j)
     urd = microdom.parseString(reverseBytes(j2))
     sd = microdom.parseString(j2)
     self.assert_(ud.isEqualToDocument(sd))
     self.assert_(ud.isEqualToDocument(urd))
     j3=microdom.parseString(u'<foo/>')
     hdr='<?xml version="1.0"?>'
     div=microdom.lmx().text(u'\u221a', raw=1).node
     de=j3.documentElement
     de.appendChild(div)
     de.appendChild(j3.createComment(u'\u221a'))
     self.assertEquals(j3.toxml(), hdr+
                       u'<foo><div>\u221a</div><!--\u221a--></foo>'.encode('utf8'))
Пример #8
0
 def spanify(self, node):
     node.attributes = {}
     node.childNodes = []
     node.endTagName = node.nodeName = node.tagName = 'span'
     lnew = lmx(node).span()
     lnew.node.clean = True
     return lnew
Пример #9
0
 def wvupdate_thumbnail(self, request, node, data):
     size = request.args.get('thumbnailSize', ('200', ))[0]
     a = microdom.lmx(node)
     a['href'] = data
     if os.path.isdir(os.path.join(self.directory, data)):
         a.text(data)
     else:
         a.img(src=(data + '/preview'), width=size, height=size).text(data)
Пример #10
0
 def wvupdate_thumbnail(self, request, node, data):
     a = microdom.lmx(node)
     a['href'] = data
     if os.path.isdir(os.path.join(self.directory, data)):
         a.text(data)
     else:
         a.img(src=(data + '/preview'), width='200',
               height='200').text(data)
Пример #11
0
 def wvupdate_thumbnail(self, request, node, data):
     size = request.args.get('thumbnailSize',('200',))[0]
     a = microdom.lmx(node)
     a['href'] = data
     if os.path.isdir(os.path.join(self.directory,data)):
         a.text(data)
     else:
         a.img(src=(data+'/preview'),width=size,height=size).text(data)
Пример #12
0
 def save(self, xmlfile=None):
     """Save current state as XML
     @param xmlfile file name (optional)"""
     xmlfile = xmlfile or self.xmlfile
     root = microdom.lmx(self.root)               
     for k,v in self.items(): 
         # if v is None: v=''
         self.write_element(root, k, v)
     save_xml(root.node, xmlfile)
Пример #13
0
 def wvupdate_thumbnail(self, request, node, data):
     prefs = request.getSession(IPreferences)
     size = getattr(prefs, 'size', '200')
     a = microdom.lmx(node)
     a['href'] = data
     if os.path.isdir(os.path.join(self.directory, data)):
         a.text(data)
     else:
         a.img(src=(data + '/preview'), width=size, height=size).text(data)
Пример #14
0
 def wvupdate_thumbnail(self, request, node, data):
     prefs = request.getSession(IPreferences)
     size = getattr(prefs, 'size','200')
     a = microdom.lmx(node)
     a['href'] = data
     if os.path.isdir(os.path.join(self.directory,data)):
         a.text(data)
     else:
         a.img(src=(data+'/preview'),width=size,height=size).text(data)
Пример #15
0
 def save(self, xmlfile=None):
     """Save current state as XML
     @param xmlfile file name (optional)"""
     xmlfile = xmlfile or self.xmlfile
     root = microdom.lmx(self.root)               
     for k,v in self.items(): 
         # if v is None: v=''
         log.msg("save(): write element: key = %s, value = %s" % (k,v));
         self.write_element(root, k, v)
     save_xml(root.node, xmlfile)
Пример #16
0
 def testLMX(self):
     n = microdom.Element("p")
     lmx = microdom.lmx(n)
     lmx.text("foo")
     b = lmx.b(a="c")
     b.foo()["z"] = "foo"
     b.foo()
     b.add("bar", c="y")
     s = '<p>foo<b a="c"><foo z="foo"></foo><foo></foo><bar c="y"></bar></b></p>'
     self.assertEquals(s, n.toxml())
Пример #17
0
 def setUp(self, request, node, data):
     lmn = lmx(node)
     if not node.hasAttribute('action'):
         lmn['action'] = (request.prepath+request.postpath)[-1]
     if not node.hasAttribute("method"):
         lmn['method'] = 'post'
     lmn['enctype'] = 'multipart/form-data'
     self.errorNodes = errorNodes = {}                     # name: nodes which trap errors
     self.inputNodes = inputNodes = {}
     for errorNode in domhelpers.findElementsWithAttribute(node, 'errorFor'):
         errorNodes[errorNode.getAttribute('errorFor')] = errorNode
     argz={}
     hasSubmit = 0
     argList = self.model.fmethod.getArgs()
     for arg in argList:
         if isinstance(arg, formmethod.Submit):
             hasSubmit = 1
         argz[arg.name] = arg
     inNodes = domhelpers.findElements(
         node,
         lambda n: n.tagName.lower() in ('textarea', 'select', 'input',
                                         'div'))
     for inNode in inNodes:
         t = inNode.getAttribute("type")
         if t and t.lower() == "submit":
             hasSubmit = 1
         if not inNode.hasAttribute("name"):
             continue
         nName = inNode.getAttribute("name")
         if argz.has_key(nName):
             inputNodes[nName] = self.convergeInput(request, lmx(),
                                                    argz[nName], inNode)
             inNode.parentNode.replaceChild(inputNodes[nName], inNode)
             del argz[nName]
     if argz:
         shell = self.createShell(request, node, data)
         for remArg in [arg for arg in argList if argz.has_key(arg.name)]:
             inputNode, errorNode = self.createInput(request, shell, remArg)
             errorNodes[remArg.name] = errorNode
             inputNodes[remArg.name] = inputNode
     if not hasSubmit:
         lmn.input(type="submit")
Пример #18
0
    def test_LMX(self):
        n = microdom.Element("p")
        lmx = microdom.lmx(n)
        lmx.text("foo")
        b = lmx.b(a="c")
        b.foo()["z"] = "foo"
        b.foo()
        b.add("bar", c="y")

        s = '<p>foo<b a="c"><foo z="foo"></foo><foo></foo><bar c="y"></bar></b></p>'
        self.assertEqual(s, n.toxml())
Пример #19
0
    def testUnicodeTolerance(self):
        import struct

        s = "<foo><bar><baz /></bar></foo>"
        j = (
            u'<?xml version="1.0" encoding="UCS-2" ?>\r\n<JAPANESE>\r\n'
            u"<TITLE>\u5c02\u9580\u5bb6\u30ea\u30b9\u30c8 </TITLE></JAPANESE>"
        )
        j2 = (
            "\xff\xfe<\x00?\x00x\x00m\x00l\x00 \x00v\x00e\x00r\x00s\x00i\x00o"
            '\x00n\x00=\x00"\x001\x00.\x000\x00"\x00 \x00e\x00n\x00c\x00o\x00d'
            '\x00i\x00n\x00g\x00=\x00"\x00U\x00C\x00S\x00-\x002\x00"\x00 \x00?'
            "\x00>\x00\r\x00\n\x00<\x00J\x00A\x00P\x00A\x00N\x00E\x00S\x00E"
            "\x00>\x00\r\x00\n\x00<\x00T\x00I\x00T\x00L\x00E\x00>\x00\x02\\"
            "\x80\x95\xb6[\xea0\xb90\xc80 \x00<\x00/\x00T\x00I\x00T\x00L\x00E"
            "\x00>\x00<\x00/\x00J\x00A\x00P\x00A\x00N\x00E\x00S\x00E\x00>\x00"
        )

        def reverseBytes(s):
            fmt = str(len(s) // 2) + "H"
            return struct.pack("<" + fmt, *struct.unpack(">" + fmt, s))

        urd = microdom.parseString(reverseBytes(s.encode("UTF-16")))
        ud = microdom.parseString(s.encode("UTF-16"))
        sd = microdom.parseString(s)
        self.assert_(ud.isEqualToDocument(sd))
        self.assert_(ud.isEqualToDocument(urd))
        ud = microdom.parseString(j)
        urd = microdom.parseString(reverseBytes(j2))
        sd = microdom.parseString(j2)
        self.assert_(ud.isEqualToDocument(sd))
        self.assert_(ud.isEqualToDocument(urd))

        # test that raw text still gets encoded
        # test that comments get encoded
        j3 = microdom.parseString(u"<foo/>")
        hdr = '<?xml version="1.0"?>'
        div = microdom.lmx().text(u"\u221a", raw=1).node
        de = j3.documentElement
        de.appendChild(div)
        de.appendChild(j3.createComment(u"\u221a"))
        self.assertEqual(j3.toxml(), hdr + u"<foo><div>\u221a</div><!--\u221a--></foo>".encode("utf8"))
Пример #20
0
    def test_unicodeTolerance(self):
        import struct

        s = "<foo><bar><baz /></bar></foo>"
        j = ('<?xml version="1.0" encoding="UCS-2" ?>\r\n<JAPANESE>\r\n'
             "<TITLE>\u5c02\u9580\u5bb6\u30ea\u30b9\u30c8 </TITLE></JAPANESE>")
        j2 = (
            b"\xff\xfe<\x00?\x00x\x00m\x00l\x00 \x00v\x00e\x00r\x00s\x00i\x00o"
            b'\x00n\x00=\x00"\x001\x00.\x000\x00"\x00 \x00e\x00n\x00c\x00o\x00d'
            b'\x00i\x00n\x00g\x00=\x00"\x00U\x00C\x00S\x00-\x002\x00"\x00 \x00?'
            b"\x00>\x00\r\x00\n\x00<\x00J\x00A\x00P\x00A\x00N\x00E\x00S\x00E"
            b"\x00>\x00\r\x00\n\x00<\x00T\x00I\x00T\x00L\x00E\x00>\x00\x02\\"
            b"\x80\x95\xb6[\xea0\xb90\xc80 \x00<\x00/\x00T\x00I\x00T\x00L\x00E"
            b"\x00>\x00<\x00/\x00J\x00A\x00P\x00A\x00N\x00E\x00S\x00E\x00>\x00"
        )

        def reverseBytes(s):
            fmt = str(len(s) // 2) + "H"
            return struct.pack("<" + fmt, *struct.unpack(">" + fmt, s))

        urd = microdom.parseString(reverseBytes(s.encode("UTF-16")))
        ud = microdom.parseString(s.encode("UTF-16"))
        sd = microdom.parseString(s)
        self.assertTrue(ud.isEqualToDocument(sd))
        self.assertTrue(ud.isEqualToDocument(urd))
        ud = microdom.parseString(j)
        urd = microdom.parseString(reverseBytes(j2))
        sd = microdom.parseString(j2)
        self.assertTrue(ud.isEqualToDocument(sd))
        self.assertTrue(ud.isEqualToDocument(urd))

        # test that raw text still gets encoded
        # test that comments get encoded
        j3 = microdom.parseString("<foo/>")
        hdr = '<?xml version="1.0"?>'
        div = microdom.lmx().text("\u221a", raw=1).node
        de = j3.documentElement
        de.appendChild(div)
        de.appendChild(j3.createComment("\u221a"))
        self.assertEqual(j3.toxml(),
                         (hdr + "<foo><div>\u221a</div><!--\u221a--></foo>"))
Пример #21
0
    def testUnicodeTolerance(self):
        import struct
        s = '<foo><bar><baz /></bar></foo>'
        j = (
            u'<?xml version="1.0" encoding="UCS-2" ?>\r\n<JAPANESE>\r\n'
            u'<TITLE>\u5c02\u9580\u5bb6\u30ea\u30b9\u30c8 </TITLE></JAPANESE>')
        j2 = (
            '\xff\xfe<\x00?\x00x\x00m\x00l\x00 \x00v\x00e\x00r\x00s\x00i\x00o'
            '\x00n\x00=\x00"\x001\x00.\x000\x00"\x00 \x00e\x00n\x00c\x00o\x00d'
            '\x00i\x00n\x00g\x00=\x00"\x00U\x00C\x00S\x00-\x002\x00"\x00 \x00?'
            '\x00>\x00\r\x00\n\x00<\x00J\x00A\x00P\x00A\x00N\x00E\x00S\x00E'
            '\x00>\x00\r\x00\n\x00<\x00T\x00I\x00T\x00L\x00E\x00>\x00\x02\\'
            '\x80\x95\xb6[\xea0\xb90\xc80 \x00<\x00/\x00T\x00I\x00T\x00L\x00E'
            '\x00>\x00<\x00/\x00J\x00A\x00P\x00A\x00N\x00E\x00S\x00E\x00>\x00')

        def reverseBytes(s):
            fmt = str(len(s) / 2) + 'H'
            return struct.pack('<' + fmt, *struct.unpack('>' + fmt, s))

        urd = microdom.parseString(reverseBytes(s.encode('UTF-16')))
        ud = microdom.parseString(s.encode('UTF-16'))
        sd = microdom.parseString(s)
        self.assert_(ud.isEqualToDocument(sd))
        self.assert_(ud.isEqualToDocument(urd))
        ud = microdom.parseString(j)
        urd = microdom.parseString(reverseBytes(j2))
        sd = microdom.parseString(j2)
        self.assert_(ud.isEqualToDocument(sd))
        self.assert_(ud.isEqualToDocument(urd))

        # test that raw text still gets encoded
        # test that comments get encoded
        j3 = microdom.parseString(u'<foo/>')
        hdr = '<?xml version="1.0"?>'
        div = microdom.lmx().text(u'\u221a', raw=1).node
        de = j3.documentElement
        de.appendChild(div)
        de.appendChild(j3.createComment(u'\u221a'))
        self.assertEquals(
            j3.toxml(),
            hdr + u'<foo><div>\u221a</div><!--\u221a--></foo>'.encode('utf8'))
Пример #22
0
 def createShell(self, request, node, data):
     """Create a `shell' node that will hold the additional form
     elements, if one is required.
     """
     return lmx(node).table(border="0")
Пример #23
0
 def wvupdate_loginform(self, request, widget, model):
     microdom.lmx(widget.node).form(action=guard.INIT_PERSPECTIVE,
                                    model="form")
Пример #24
0
 def wvupdate_loginform(self, request, widget, model):
     microdom.lmx(widget.node).form(action=guard.INIT_PERSPECTIVE,
                                    model="form")
Пример #25
0
 def createShell(self, request, node, data):
     """Create a `shell' node that will hold the additional form
     elements, if one is required.
     """
     return lmx(node).table(border="0")
Пример #26
0
 def save(self,config_file=None):
     """Saves to XML config file"""
     config_file = config_file or self.config_file
     tree = microdom.lmx('stage')
     tree['name'] = self.name
     tree['id'] = self.ID
     tree['created'] = self.created
     if self.active:
         tree['active'] = 'active'
     if self.splash_message != self.__class__.splash_message:
         splash = tree.add('splash')
         splash.text(self.splash_message)
     #Aaron 1Aug 08 Save the Prop and Backdrop BG colour
     if self.backgroundPropBgColour != self.__class__.backgroundPropBgColour:
         bgPropBgColour = tree.add('bgPropBgColour')
         bgPropBgColour.text(self.backgroundPropBgColour)
    #Aaron 12 Nov 08 Save the Debug screen Value
     if self.debugMessages != self.__class__.debugMessages:
         showDebugScreen = tree.add('showDebugScreen')
         showDebugScreen.text(self.debugMessages)
     for x in self.get_avatar_list():
         # log.msg("Voices: %s %s " %(x.voice,x.media.voice))
         tree.add(self.avatars.typename, media=x.media.file, showname=x.show_name,
                  name=x.name, voice=(x.voice or x.media.voice or '') )
         log.msg("avatar list in save method: %s" % self.avatars.typename)
         # NOTE one day, save player permissions.
     for x in self.get_prop_list():
         tree.add(self.props.typename, media=x.media.file,
                  name=x.name)
     for x in self.get_backdrop_list():
         tree.add(self.backdrops.typename, media=x.media.file,
                  name=x.name)
     log.msg('stage.save() - adding audio to xml')
     for x in self.get_audio_list():
         log.msg('stage.save() - audio item: %s' %(x))
         tree.add(self.audios.typename, media=x.media.file, name=x.name, type=x.media.medium)
     #Shaun Narayan (02/14/10) - Write all new values to XML.
     access_string = ''
     for x in self.access_level_one:
         access_string += x+',' #Heath Behrens 10/08/2011 - Added so that items can be separated and the last , is removed
     access_string = access_string.rstrip(',')
     one = tree.add('access_one')
     one.text(access_string)
     access_string = ''
     for x in self.access_level_two:
         access_string += x+',' #Heath Behrens 10/08/2011 - Added so that items can be separated and the last , is removed
     access_string = access_string.rstrip(',')
     two = tree.add('access_two')
     two.text(access_string)
     access_string = ''
     for x in self.access_level_three:
         access_string += x+',' #Heath Behrens 10/08/2011 - Added so that items can be separated and the last , is removed
     access_string = access_string.rstrip(',')
     three = tree.add('access_three')
     three.text(access_string)
     
     nodeChatBgColour = tree.add('chatBgColour')
     nodeChatBgColour.text(self.chatBgColour)
     nodeToolsBgColour = tree.add('toolsBgColour')
     nodeToolsBgColour.text(self.toolsBgColour)
     nodePageBgColour = tree.add('pageBgColour')
     nodePageBgColour.text(self.pageBgColour)
     
     save_xml(tree.node, config_file)
     del tree