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.

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