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 :)

Reply via email to