You are right, but this would send that output for all id fields as
long as there is not a new request (is that so?), and with the linkto
argument it would work just once. This last is the behavior i am
looking for. I sent a modification request to Massimo so linkto can
return a 2 element tuple optionally as you suggested.

Thank you

On Dec 2, 7:32 pm, Anthony <[email protected]> wrote:
> Note, you can create any arbitrary link (or whatever) in the id column (or
> any column) of a SQLTABLE by defining the 'represent' attribute of the 'id'
> field:
>
> db.mytable.id.represent = lambda id, row: A(IMG(_src=URL('static',
> 'myimage.png')),
>     _href=URL('default', 'view', args=['mytable', id]))
>
> Anthony
>
> On Thursday, December 1, 2011 10:37:12 PM UTC-5, Alan Etkin wrote:
>
> > And here is a new version of the modification (with a slight change in
> > naming). Sorry for the ugly repeated diffs
>
> > How can i ask a review of this modification? I first intended to post
> > it in issues but i see that it is used mostly for errors.
>
> > diff -r b5b9c3a348de gluon/sqlhtml.py
> > --- a/gluon/sqlhtml.py Wed Nov 30 22:36:22 2011 -0600
> > +++ b/gluon/sqlhtml.py Thu Dec 01 22:30:59 2011 -0300
> > @@ -2144,16 +2144,25 @@
> >                  if not field:
> >                      pass
> >                  elif linkto and field.type == 'id':
> > +                    linkwrapped = None
> >                      try:
> > -                        href = linkto(r, 'table', tablename)
> > +                        t = linkto(r, 'table', tablename)
> > +                        if isinstance(t, (tuple, list)):
> > +                            href, linkwrapped = t
> > +                        else:
> > +                            href = t
> >                      except TypeError:
> >                          href = '%s/%s/%s' % (linkto, tablename,
> > r_old)
> > -                    r = A(r, _href=href)
> > +                    r = self.link_or_linkwrapped(r, href,
> > linkwrapped)
> >                  elif field.type.startswith('reference'):
> >                      if linkto:
> >                          ref = field.type[10:]
> >                          try:
> > -                            href = linkto(r, 'reference', ref)
> > +                            t = linkto(r, 'reference', ref)
> > +                            if isinstance(t, (tuple, list)):
> > +                                href = t[0]
> > +                            else:
> > +                                href = t
> >                          except TypeError:
> >                              href = '%s/%s/%s' % (linkto, ref, r_old)
> >                              if ref.find('.') >= 0:
> > @@ -2249,6 +2258,14 @@
>
> >          return css
>
> > +
> > +    def link_or_linkwrapped(self, r, href, linkwrapped):
> > +        if linkwrapped is not None:
> > +            return A(linkwrapped, _href=href)
> > +        else:
> > +            return A(r, _href=href)
> > +
> > +
> >  form_factory = SQLFORM.factory # for backward compatibility,
> > deprecated
>
> > On Dec 1, 12:54 am, Alan Etkin <[email protected]> wrote:
> > > I made a new diff with Anthony suggestions: Now any helper instance
> > > can be returned by lambda as a second argument.
>
> > > diff -r 7dd85a51bb2a gluon/sqlhtml.py
> > > --- a/gluon/sqlhtml.py  Tue Nov 29 22:32:30 2011 -0600
> > > +++ b/gluon/sqlhtml.py  Thu Dec 01 00:44:05 2011 -0300
> > > @@ -1972,6 +1972,8 @@
> > >      optional arguments:
>
> > >      :param linkto: URL (or lambda to generate a URL) to edit
> > > individual records
> > > +                    To wrap an IMG object or alike with de the id
> > > field link,
> > > +                    the lambda function can return a (href, obj)
> > > tuple
> > >      :param upload: URL to download uploaded files
> > >      :param orderby: Add an orderby link to column headers.
> > >      :param headers: dictionary of headers to headers redefinions
> > > @@ -2142,16 +2144,25 @@
> > >                  if not field:
> > >                      pass
> > >                  elif linkto and field.type == 'id':
> > > +                    linkwrapped = None
> > >                      try:
> > > -                        href = linkto(r, 'table', tablename)
> > > +                        t = linkto(r, 'table', tablename)
> > > +                        if isinstance(t, (tuple, list)):
> > > +                            href, linkwrapped = t
> > > +                        else:
> > > +                            href = t
> > >                      except TypeError:
> > >                          href = '%s/%s/%s' % (linkto, tablename,
> > > r_old)
> > > -                    r = A(r, _href=href)
> > > +                    r = self.link_or_image(r, href, linkwrapped)
> > >                  elif field.type.startswith('reference'):
> > >                      if linkto:
> > >                          ref = field.type[10:]
> > >                          try:
> > > -                            href = linkto(r, 'reference', ref)
> > > +                            t = linkto(r, 'reference', ref)
> > > +                            if isinstance(t, (tuple, list)):
> > > +                                href = t[0]
> > > +                            else:
> > > +                                href = t
> > >                          except TypeError:
> > >                              href = '%s/%s/%s' % (linkto, ref, r_old)
> > >                              if ref.find('.') >= 0:
> > > @@ -2247,6 +2258,14 @@
>
> > >          return css
>
> > > +
> > > +    def link_or_image(self, r, href, linkwrapped):
> > > +        if linkwrapped is not None:
> > > +            return A(linkwrapped, _href=href)
> > > +        else:
> > > +            return A(r, _href=href)
> > > +
> > > +
> > >  form_factory = SQLFORM.factory # for backward compatibility,
> > > deprecated
>
> > > On Nov 30, 10:32 pm, Anthony <[email protected]> wrote:
>
> > > > Instead, why not make it more general and simply allow the linkto
> > lambda to
> > > > return an (r, href) tuple, where r could be an IMG object or anything
> > else.
> > > > Something like:
>
> > > > elif linkto and field.type == 'id':
> > > >     try:
> > > >         href = linkto(r, 'table', tablename)
> > > >         if isinstance(href, (list, tuple)):
> > > >             r, href = href
>
> > > > Then we don't need a new argument -- all the work can be done in the
> > linkto
> > > > function.
>
> > > > Anthony
>
> > > > On Wednesday, November 30, 2011 8:01:18 PM UTC-5, Alan Etkin wrote:
>
> > > > > I think that it would be practical to have the option when calling
> > > > > SQLTABLE to specify images in place of id links.
>
> > > > > Here is how i would change it (seems to work with version 1.99.2)
>
> > > > > diff -r 7dd85a51bb2a gluon/sqlhtml.py
> > > > > --- a/gluon/sqlhtml.py Tue Nov 29 22:32:30 2011 -0600
> > > > > +++ b/gluon/sqlhtml.py Wed Nov 30 21:50:01 2011 -0300
> > > > > @@ -1972,6 +1972,7 @@
> > > > >      optional arguments:
>
> > > > >      :param linkto: URL (or lambda to generate a URL) to edit
> > > > > individual records
> > > > > +    :param imagelink: URL of an image to wrap the linkto field
> > > > >      :param upload: URL to download uploaded files
> > > > >      :param orderby: Add an orderby link to column headers.
> > > > >      :param headers: dictionary of headers to headers redefinions
> > > > > @@ -2043,6 +2044,7 @@
> > > > >          self,
> > > > >          sqlrows,
> > > > >          linkto=None,
> > > > > +        imagelink=None,
> > > > >          upload=None,
> > > > >          orderby=None,
> > > > >          headers={},
> > > > > @@ -2146,7 +2148,7 @@
> > > > >                          href = linkto(r, 'table', tablename)
> > > > >                      except TypeError:
> > > > >                          href = '%s/%s/%s' % (linkto, tablename,
> > > > > r_old)
> > > > > -                    r = A(r, _href=href)
> > > > > +                    r = self.image_link(r, href, imagelink)
> > > > >                  elif field.type.startswith('reference'):
> > > > >                      if linkto:
> > > > >                          ref = field.type[10:]
> > > > > @@ -2247,6 +2249,14 @@
>
> > > > >          return css
>
> > > > > +
> > > > > +    def image_link(self, r, href, imagelink):
> > > > > +        if isinstance(imagelink, basestring):
> > > > > +            return A(IMG(_src=imagelink, _alt=r), _href=href)
> > > > > +        else:
> > > > > +            return A(r, _href=href)
> > > > > +
> > > > > +
> > > > >  form_factory = SQLFORM.factory # for backward compatibility,
> > > > > deprecated
>
>

Reply via email to