Whoo Hoo!  Victory

Here is the way I got it working:

In my controller I have the following:

        techSet = db((db.auth_user.id==db.helpdeskTech.userId) & \
                     (db.helpdeskTech.helpdeskId==ticket.helpdeskId))
        db.ticket.assignedTo.requires = IS_NULL_OR(IS_IN_DB(techSet,
                db.helpdeskTech,
lambda r: db.helpdeskTech(r.helpdeskTechId).userId.lastFirst,
                zero='...choose...'))

Thanks so much for your help Richard. I couldn't have done it without the help you provided.

The techSet filters the dropdown list to only the user names that are available for the specific helpdesk. And then the lambda function allows me access to the helpdeskTech id for the specific row in the SELECT widget and from there I can grab any info I need.

Thanks again for all the  help.

    -Jim

On 5/8/2012 3:39 PM, Richard Vézina wrote:
Also, if you just don't want to use auth_group and auth_membership, you can just add a flag to auth_user if you define your own custom auth_user and then refer to this flag to create your set for IS_IN_DB...

Richard

On Tue, May 8, 2012 at 4:38 PM, Richard Vézina <[email protected] <mailto:[email protected]>> wrote:

    Since virtual field are calculated each query I don't think you
    can refer to them in IS_IN_DB as a table field...

    Could be a solution if it works.

    Richard


    On Tue, May 8, 2012 at 2:10 PM, Jim Steil <[email protected]
    <mailto:[email protected]>> wrote:

        Anyone know if I can use a virtual field in my IS_IN_DB validator?

            -Jim


        On 5/8/2012 12:48 PM, Jim Steil wrote:
        Richard

        First off, thanks for all the help, I certainly appreciate it.

        I'm trying to work with the second suggestion below, but am
        having trouble as you suspected with getting the row.id
        <http://row.id>.

        I'm shying away from the auth_group idea because I prefer to
        enforce within the db that the users on that ticket can only
        be a predefined subset of users.  I think that is more of a
        personal preference, but for now I'm going to continue going
        down the other path.

        Any other pointers are appreciated.  I'll continue digging in
        to this for the afternoon.

            -Jim

        On 5/8/2012 8:22 AM, Richard Vézina wrote:
        Ok, I think I understand...

        You create a kind of materialized view with helpdeskTech???

        If you only need a "subset" of auth_user, you can create a
        auth_group for this. I mean, you create a auth_group "tech"
        and you assign user to this group then you will be able to
        make a set of those users like this :

        tech_set = db((db.auth_group.role=='tech') &
        (db.auth_user.id
        <http://db.auth_user.id>==db.auth_membership.user_id) &
        (db.auth_membership.group_id==db.auth_group.id
        <http://db.auth_group.id>))

        Then use this set in ticket requires directly instead of
        passing by the helpdeskTech.

        requires=IS_IN_DB(tech_set,'auth_user.id
        <http://auth_user.id>','%(first_name)s %(last_name)s',\
                    cache=(cache.ram, 3600)),

        There is other solution with you helpdeskTech, but I am not
        sure it works :

        
requires=IS_IN_DB(db,'helpdeskTech.id',db.auth_user(db.helpdeskTech(row.id
        <http://row.id>).id).first_name
        + db.auth_user(db.helpdeskTech(row.id
        <http://row.id>).id).last_name,\
                    cache=(cache.ram, 3600)),


        This work in represent : db.auth_user(db.helpdeskTech(row.id
        <http://row.id>).id).first_name
        + db.auth_user(db.helpdeskTech(row.id
        <http://row.id>).id).last_name

        Because represent is a lambda and you pass row, but in case
        of requires I think that you can't get the ID of the not yet
        created record, that I why I use group assignment and set
        and don't create kind of materialized view like you...

        I think you can do both, have a materialized view if you
        need it for some purpose and have a group assigment and set
        approach at the same time.

        Hope I am more clear.

        Richard

        On Mon, May 7, 2012 at 5:37 PM, Richard Vézina
        <[email protected]
        <mailto:[email protected]>> wrote:

            Sorry for the lazy example, I have to go, I can try to
            write the proper code if you didn't solve it tomorrow,
            just ask.

            Richard


            On Mon, May 7, 2012 at 5:36 PM, Richard Vézina
            <[email protected]
            <mailto:[email protected]>> wrote:

                Ok, now I understand...

                You should allways use id instead of name or other
                field. Anyway I think you can figure it out from
                this example :

                dog
                name
                person_id

                person
                name

                stat_about_dog_and_person
                stat1
                stat2
                dog_name
                person_name

                If I want to get dog_name or person_name in
                stat_about_dog_and_person.dog_name

                I could something like this :

                db.dog(ID).name

                You just have to replace the ID by the id or a query
                that return the id... You can even do :
                db.dog(db.auth_user(db.ham(ID).id)).id).name

                Richard

                On Mon, May 7, 2012 at 5:09 PM, Jim Steil
                <[email protected] <mailto:[email protected]>> wrote:

                    Sorry, not sure I follow.

                    In my example, helpdeskTech is a subset of
                    auth_user.  My 'ticket' has a helpdeskTechId (in
                    the assignedTo field), not an id from the
                    auth_user table.  I want my select tag to
                    display the auth_user name, but return the
                    helpdeskTechId from the helpdeskTech table.

                    Maybe I don't fully grok the IS_IN_DB and the
                    way the parms work.  I'll go back and look that
                    over again.

                        -Jim


                    On 5/7/2012 3:59 PM, Richard Vézina wrote:
                    auth_user_rows = db().select(db.auth_user.id
                    <http://db.auth_user.id>)

                    make a set :

                    auth_user_set = ((db.auth_user.id
                    <http://db.auth_user.id> ==
                     rows.first().id)|(db.auth_user.id
                    <http://db.auth_user.id> ==  rows.last().id))

                    IS_IN_DB(auth_user_set,...)

                    Richard

                    On Mon, May 7, 2012 at 4:37 PM, Jim Steil
                    <[email protected] <mailto:[email protected]>> wrote:

                        Hi

                        I am having trouble getting my list to
                        display the way I want it to.

                        Given the following definition:

                        -----------------------
                        helpdeskTech = db.define_table('helpdeskTech',
                           Field('helpdeskTechId', 'id',
                        readable=False),
                           Field('helpdeskId', db.helpdesk,
                        required=True, label='Helpdesk'),
                           Field('userId', db.auth_user,
                        required=True, label='User'),
                           format='%(userId.lastFirst)s')
                        helpdeskTech.helpdeskId.requires =
                        IS_IN_DB(db, db.helpdesk,
'%(name)s', zero='...choose...')
                        helpdeskTech.userId.requires = IS_IN_DB(db,
                        db.auth_user,
'%(lastFirst)s', zero='...choose...')
                        helpdeskTech['_plural'] = 'Technicians'

                        ticket = db.define_table('ticket',
                           Field('ticketId', 'id', readable=False),
                           Field('helpdeskId', db.helpdesk,
                        required=True, label='Helpdesk'),
                           Field('name', length=100, required=True),
                           Field('description', 'text'),
                           Field('createdOn', 'date', label='Created'),
                           Field('createdBy', db.auth_user,
                        required=True, label='Creator'),
                           Field('assignedTo', db.helpdeskTech,
                        label='Assigned To'),
                           Field('priority', length=10, required=True),
                           Field('status', length=10, required=True),
                           format='%(name)s')
                        ticket.helpdeskId.requires = IS_IN_DB(db,
                        db.helpdesk,
'%(name)s', zero='...choose...')
                        ticket.name.requires = IS_NOT_EMPTY()
                        ticket.createdOn.requires = IS_DATE('%m/%d/%Y')
                        ticket.createdBy.requires = IS_IN_DB(db,
                        db.auth_user,
'%(lastFirst)s', zero='...choose...')
                        ticket.assignedTo.requires =
                        IS_NULL_OR(IS_IN_DB(db, db.helpdeskTech,
zero='...choose...'))
                        -----------------------

                        I want my IS_IN_DB validator in the last
                        line to display the last name and first
                        name from the auth_user table.

                        But, what I'm getting is the helpdeskTechId
                        field displaying.

                        I'm wondering how I can refer back to the
                        auth_user table to get the names to display
                        in the dropdown instead of the
                        helpdeskTechId without custom-coding the view.

                        Thoughts?

                           -Jim









Reply via email to