From 1383d13334b3d55743596d3141265732fe26e49a Mon Sep 17 00:00:00 2001 From: mdipierro Date: Fri, 3 May 2013 22:15:01 -0500 Subject: [PATCH] @db.table.add_method.name, thanks Vinicius --- VERSION | 2 +- gluon/dal.py | 18 ++++++++++++++++++ gluon/tests/test_dal.py | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0812d1d1..e5efb189 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.4.6-stable+timestamp.2013.05.03.21.47.09 +Version 2.4.6-stable+timestamp.2013.05.03.22.14.19 diff --git a/gluon/dal.py b/gluon/dal.py index 82ef739b..785f24d9 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -8091,6 +8091,22 @@ def Reference_pickler(data): copyreg.pickle(Reference, Reference_pickler, Reference_unpickler) +class MethodAdder(object): + def __init__(self,table): + self.table = table + def __call__(self): + return self.register() + def __getattr__(self,method_name): + return self.register(method_name) + def register(self,method_name=None): + def _decorated(f): + instance = self.table + import types + method = types.MethodType(f, instance, instance.__class__) + name = method_name or f.func_name + setattr(instance, name, method) + return f + return _decorated class Table(object): @@ -8145,6 +8161,8 @@ class Table(object): self._after_update = [] self._after_delete = [] + self.add_method = MethodAdder(self) + fieldnames,newfields=set(),[] if hasattr(self,'_primarykey'): if not isinstance(self._primarykey,list): diff --git a/gluon/tests/test_dal.py b/gluon/tests/test_dal.py index 317c9053..f4423b54 100644 --- a/gluon/tests/test_dal.py +++ b/gluon/tests/test_dal.py @@ -275,6 +275,20 @@ class TestSelect(unittest.TestCase): self.assertEqual(db(~(db.tt.aa > '1') & (db.tt.aa > '2')).count(), 0) db.tt.drop() +class TestAddMethod(unittest.TestCase): + + def testRun(self): + db = DAL(DEFAULT_URI, check_reserved=['all']) + db.define_table('tt', Field('aa')) + @db.tt.add_method.all + def select_all(table,orderby=None): + return table._db(table).select(orderby=orderby) + self.assertEqual(db.tt.insert(aa='1'), 1) + self.assertEqual(db.tt.insert(aa='2'), 2) + self.assertEqual(db.tt.insert(aa='3'), 3) + self.assertEqual(len(db.tt.all()), 3) + db.tt.drop() + class TestBelongs(unittest.TestCase):