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

Reply via email to