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]> 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. > > 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==db.auth_membership.user_id) > & (db.auth_membership.group_id==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 > ','%(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).id).first_name + db.auth_user(db.helpdeskTech(row.id > ).id).last_name,\ > cache=(cache.ram, 3600)), > > > This work in represent : db.auth_user(db.helpdeskTech(row.id).id).first_name > + db.auth_user(db.helpdeskTech(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]> 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]> 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]> 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) >>>> >>>> make a set : >>>> >>>> auth_user_set = ((db.auth_user.id == rows.first().id)|( >>>> 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]> 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 >>>>> >>>>> >>>>> >>>>> >>>> >>> >> >

