hi szimszon and massimo,

i have found out what is the problem.

when you append the new virtualfield with
"db.product.virtualfields.append(MyVirtualFields())" you instantiate
it and apply it so for every lazy property, it uses the same
MyVirtualFields class pointing to same object in the memory. i am
sending a patch here however maybe massimo would solve it in a way
more elegant way. for classes with lazy methods you can use
db.product.virtualfields.append(MyVirtualFields) and for every row, it
will instantiate a new MyVirtualFields class.

diff -r c92b70ebb0b9 gluon/dal.py
--- a/gluon/dal.py      Fri Jun 17 23:40:28 2011 -0500
+++ b/gluon/dal.py      Sun Jun 19 04:01:37 2011 +0300
@@ -5476,7 +5476,11 @@
             return self
         for row in self.records:
             for (tablename,virtualfields) in
keyed_virtualfields.items():
-                attributes = dir(virtualfields)
+                if type(virtualfields).__name__ == 'instance':
+                    virtualfield = virtualfields
+                else:
+                    virtualfield = virtualfields
+                attributes = dir(virtualfield)
                 virtualfields.__dict__.update(row)
                 if not tablename in row:
                     box = row[tablename] = Row()
@@ -5484,7 +5488,7 @@
                     box = row[tablename]
                 for attribute in attributes:
                     if attribute[0] != '_':
-                        method = getattr(virtualfields,attribute)
+                        method = getattr(virtualfield,attribute)
                         if hasattr(method,'im_func') and
method.im_func.func_code.co_argcount:
                             box[attribute]=method()
         return self


On Jun 18, 9:25 pm, szimszon <[email protected]> wrote:
> OK. I just do not know if creating an issue is enough or should I mention it
> here... Take time :)

Reply via email to