a, sorry, my fault, didn't notice that the id field is none. thanks for 
show me my own mistake. is there a way to arrange the result for that?
e.g. expected result :
root
- child 1
- child 2

thanks and best regards,
stifan

p.s.
i've change the code into :
*models/db_wizard.py*
# coding: utf8

from gluon.dal import Table

class TreeProxy(object):
skeleton = Table(None, 'tree',
 Field('ileft', 'integer'),
 Field('iright', 'integer'))

def __init__(self, table):
self.table = table

def ancestors(self, node):
db = self.table._db
return db(self.table.ileft <= node.ileft)(self.table.iright > node.iright)

def descendants(self, node):
db = self.table._db
return db(self.table.ileft >= node.ileft)(self.table.iright < node.iright)

def add_leaf(self, parent_id = None, **fields):
if not parent_id:
nrecords = self.table._db(self.table).count()
fields.update(dict(ileft = nrecords, iright = nrecords))
else:
node = self.table(parent_id)
fields.update(dict(ileft = node.iright, iright = node.iright))
node.update_record(iright = node.iright + 1)
ancestors = self.ancestors(node).select()
for ancestor in ancestors:
ancestor.update_record(iright = ancestor.iright + 1)
ancestors = self.ancestors(node).select()
for ancestor in ancestors:
ancestor.update_record(iright = ancestor.iright + 1)
return self.table.insert(**fields)

def del_node(self, node):
delta = node.iright - node.ileft
deleted = self.descendants(node).delete()
db = self.table._db
db(self.table.iright > node.iright).update(iright = self.table.iright - 
delta)
del self.table[node.id]
return deleted + 1

treeproxy = TreeProxy(db.define_table('mytree', Field('name'), 
TreeProxy.skeleton))

if db(db.mytree).isempty():
id = treeproxy.add_leaf(name = "root")
treeproxy.add_leaf(parent_id = id, name = "child1")
treeproxy.add_leaf(parent_id = id, name = "child2")

*controllers/default.py*
def test():
    all_rows = db(db.mytree.id > 0).select()
    return dict(all_rows = all_rows)

*views/default/test.html*
{{extend 'layout.html'}}

{{for all_row in all_rows:}}
    {{for node_ancestor in 
treeproxy.ancestors(db.mytree(all_row.id)).select():}}
        {{=DIV('ID : ', all_row.id)}}
        {{=BR()}}
        {{=DIV('Ancestor : ', node_ancestor.name)}}
        {{=BR()}}
    {{pass}}
    {{for node_descendant in 
treeproxy.descendants(db.mytree(all_row.id)).select():}}
        {{=DIV('ID : ', all_row.id)}}
        {{=BR()}}
        {{=DIV('Descendant : ', node_descendant.name)}}
        {{=BR()}}
    {{pass}}
{{pass}}

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to