Skip to content

Commit

Permalink
mpttプラグインの実装続き。remove_nodeが未完成 #16
Browse files Browse the repository at this point in the history
  • Loading branch information
fislexi committed Aug 19, 2011
1 parent 83b417b commit 93f6765
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 43 deletions.
50 changes: 7 additions & 43 deletions controllers/plugin_mptt.py
Original file line number Diff line number Diff line change
@@ -1,49 +1,13 @@
'''
Created on 2011/08/12
@author: yusuke.kishita
'''

# -*- coding: utf-8 -*-
from gluon import *
from plugin_mptt import MPTT

db = DAL('sqlite:memory:')
db.define_table('tree',
Field('title'), Field('left', 'integer'),
Field('right', 'integer'),
)
db.tree.insert(title='Food',left=1,right=2)

def add_node(title,parent_title):
"""
add_node('Fruit','Food')
add_node('Meat','Food')
add_node('Red','Food')
"""
parent = db(db.tree.title == parent_title).select()[0]
db(db.tree.right >= parent.right).update(right = db.tree.right+2)
db(db.tree.left >= parent.right).update(left = db.tree.left+2)
db.tree.insert(title = title, left = parent.right, right = parent.right + 1)
def index():
mptt = MPTT(db)
mptt.define_tables()
db.tree.insert(title='Food', left=1, right=2)
mptt.test()
return dict()

def ancestors(title, *fields):
"""print ancestors('Red', db.tree.title)"""
node = db(db.tree.title == title).select()[0]
return db(db.tree.left < node.left)(db.tree.right > node.right).select(orderby = db.tree.left, *fields)

def descendants(title, *fields):
"""print descendants('Fruit', db.tree.title)"""
node = db(db.tree.title == title).select()[0]
return db(db.tree.left > node.left)(db.tree.right < node.right).select(orderby=db.tree.left, *fields)

def test():
print db().select(db.tree.ALL)
add_node('Fruit', 'Food')
print db().select(db.tree.ALL)
add_node('Meat', 'Food')
print db().select(db.tree.ALL)
add_node('Red', 'Food')
print db().select(db.tree.ALL)
print ancestors('Red', db.tree.title)
print descendants('Fruit', db.tree.title)

test()
110 changes: 110 additions & 0 deletions modules/plugin_mptt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# -*- coding: utf-8 -*-
from gluon import *
from gluon.storage import Storage

class MPTT(object):

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

self.settings = Storage()
self.settings.table_tree = None
self.settings.table_tree_name = 'tree'

def define_tables(self, migrate = True, fake_migrate = False):

tree_name = self.settings.table_tree_name

self.settings.table_tree = self.db.define_table(
tree_name,
Field('title'),
Field('left', 'integer'),
Field('right', 'integer'),
migrate = migrate,
fake_migrate = fake_migrate)

#self.settings.table_tree.tree.requires = (IS_NOT_EMPTY())

def add_node(self, title, parent_title):
db = self.db
#table = table
parent = db(db.tree.title == parent_title).select()[0]
db(db.tree.right >= parent.right).update(right=db.tree.right + 2)
db(db.tree.left >= parent.right).update(left=db.tree.left + 2)
db.tree.insert(title=title, left=parent.right, right=parent.right + 1)

def get_ancestors(self, title, *fields):
db = self.db
"""print ancestors('Red', db.tree.title)"""
node = db(db.tree.title == title).select()[0]
return db(db.tree.left < node.left)(db.tree.right > node.right).select(orderby=db.tree.left, *fields)

def get_descendants(self, title, *fields):
db = self.db
"""print descendants('Fruit', db.tree.title)"""
node = db(db.tree.title == title).select()[0]
return db(db.tree.left > node.left)(db.tree.right < node.right).select(orderby=db.tree.left, *fields)

def get_descendant_count(self, title):
db = self.db
node = db(db.tree.title == title).select()[0]
return (node.right - node.left - 1) / 2

def get_leafnodes(self):
db = self.db
return db(db.tree.right == db.tree.left+1).select(orderby=db.tree.left)

def get_root(self):
db = self.db
return db(db.tree.left == 1).select()

def is_child(self, title):
db = self.db
if db(db.tree.title == title)(db.tree.left > 1).select().first():
return True
else:
return False

def is_root_node(self, title):
db = self.db
if db(db.tree.title == title)(db.tree.left == 1).select().first():
return True
else:
return False

def is_leaf_node(self, title):
db = self.db
if db(db.tree.title == title)(db.tree.right == db.tree.left+1).select().first():
return True
else:
return False

def remove_node(self, title):
db = self.db
tmp = db(db.tree.title == title).select().first()

def test(self):
db = self.db
print db().select(db.tree.ALL)
self.add_node('Fruit', 'Food')
print db().select(db.tree.ALL)
self.add_node('Meat', 'Food')
print db().select(db.tree.ALL)
self.add_node('Red', 'Food')
print db().select(db.tree.ALL)
self.add_node('Rabbit', 'Meat')
print db().select(db.tree.ALL)

print self.get_ancestors('Red', db.tree.title)
print self.get_descendants('Food', db.tree.title)
print self.get_descendant_count('Meat')
print self.get_leafnodes()
print self.get_root()
print self.is_child('Food')
print self.is_child('Rabbit')
print self.is_root_node('Rabbit')
print self.is_root_node('Food')
print self.is_leaf_node('Rabbit')
print self.is_leaf_node('Meat')

print self.remove_node('Food')

0 comments on commit 93f6765

Please sign in to comment.