sorry, i have send out the wrong patch. the correct one is here:
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:11:28 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 19, 4:06 am, Mengu <[email protected]> wrote:
> 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 :)