File: tree.py

package info (click to toggle)
nevow 0.9.31-3
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 2,804 kB
  • ctags: 4,921
  • sloc: python: 19,639; ansic: 136; sh: 53; xml: 42; makefile: 25; sql: 5
file content (73 lines) | stat: -rw-r--r-- 2,608 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from zope.interface import implements

from twisted.python.components import registerAdapter

from nevow import loaders, rend, inevow, tags as T
from formless import annotate, webform
 
class Tree(dict):
    def __init__(self, name, description, *children):
        self.name = name
        self.description = description
        for child in children:
            self.add(child)
    def add(self, child):
        self[child.name] = child
    def __nonzero__(self):
        return True
 
class ITreeEdit(annotate.TypedInterface):
    def setDescription(description=annotate.String()):
        pass
    setDescription = annotate.autocallable(setDescription)
    def deleteChild(name=annotate.String(required=True)):
        pass
    deleteChild = annotate.autocallable(deleteChild, invisible=True)
    def addChild(name=annotate.String(required=True),
                       description=annotate.String()):
        pass
    addChild = annotate.autocallable(addChild)
 
class TreeRenderer(rend.Page):
    implements(ITreeEdit)
    addSlash = True
    docFactory = loaders.htmlstr("""
<html>
<head><title>Tree Editor</title></head>
<body><h1><span nevow:data="description"
                nevow:render="string">Tree Description</span></h1>
<span nevow:render="descriptionForm"/>
<ol nevow:data="children" nevow:render="sequence">
<li nevow:pattern="item"><span nevow:render="childLink"/>
<span nevow:render="childDel"/>
</li>
</ol>
<a href="..">Up</a>
</body>
</html>
    """)
    def setDescription(self, description):
        self.original.description = description
    def addChild(self, name, description):
        self.original.add(Tree(name, description))
    def deleteChild(self, name):
        del self.original[name]
    def data_description(self, context, data):
        return self.original.description
    def data_children(self, context, data):
        return self.original.items()
    def render_childLink(self, context, data):
        return T.a(href='subtree_%s/'%data[0])[data[1].description]
    def childFactory(self, ctx, name):
        if name.startswith('subtree_'):
            return self.original[name[len('subtree_'):]]
    def render_descriptionForm(self, context, data):
        return webform.renderForms()
    def render_childDel(self, context, (name, _)):
        ret = T.form(action="./freeform_post!!deleteChild",
                     enctype="multipart/form-data", method="POST")[
               T.input(type="hidden", name="name", value=name),
               T.input(type="submit", value="Delete")]
        return ret
 
registerAdapter(TreeRenderer, Tree, inevow.IResource)