Thanks Anthony, your active support to this group is great!

I solved the symmetric self relationship integrity this way:

db.define_table('person',
                Field('name', requires=IS_NOT_EMPTY()),
                Field('partnet', 'reference person', ondelete='NO ACTION',
                      requires = 
IS_EMPTY_OR(IS_IN_DB(db,'person.id','%(name)s'))),
                format = '%(name)s')

def partnet_insert(f, id):
    if f.partnet:
        db(db.person.id == f.partnet).update_naive(partnet = id)

def partnet_update(s, f):
    id = request.args[3]
    if f.partnet:
        db(db.person.id == f.partnet).update_naive(partnet = id)
    db((db.person.partnet == id) & (db.person.id != 
f.partnet)).update_naive(partnet = '')
    db((db.person.partnet == f.partnet) & (db.person.id != 
id)).update_naive(partnet = '')

def partnet_delete(s):
    id = request.args[3]
    db(db.person.partnet == id).update_naive(partnet = '')

db.person._after_insert.append(partnet_insert)
db.person._after_update.append(partnet_update)
db.person._before_delete.append(partnet_delete)

On the controler:

@auth.requires_login()
def persons():
    grid = SQLFORM.smartgrid(db.person, orderby=db.person.name)
    return locals()

It works great, but I still need to *filter *the drop-down select on 
create/update a person's record in the SQLFORM.smartgrid:

- A person cannot select himself as his partnet
- A person can only select a partner that is single

db((db.person.partner == None) & (db.person.id != *current.id*)).select()

Is this posible?

El viernes, 20 de abril de 2018, 21:16:59 (UTC+2), Anthony escribió:
>
> On Friday, April 20, 2018 at 2:32:45 PM UTC-4, JSalvat wrote:
>>
>> Hello,
>>
>> Why on update/insert a record with a non-empty partner, the partner does 
>> not get updated as well with the backwards reference?
>>
>> db.define_table('person',
>>                 Field('name', requires=IS_NOT_EMPTY()),
>>                 Field('partner', 'reference person', 
>> requires=IS_EMPTY_OR(IS_IN_DB(db,'person.id'))))
>>
>> db.person.insert(name='John')
>> 1
>> >>> for person in db().select(db.person.ALL):
>> ...     print person.id, ' - ', person.name, ' - ', person.partner
>> ...
>> 1  -  John  -  None
>>
>> db.person.insert(name='Maria', partner=1)
>> 2
>> >>> for person in db().select(db.person.ALL):
>> ...     print person.id, ' - ', person.name, ' - ', person.partner
>> ...
>> 1  -  John  -  None
>> 2  -  Maria  -  1
>>
>> Should not be this the result, since is a reciprocal relation?
>>
>
> No, neither web2py nor the database know this is a symmetric relationship 
> (what if the self reference field was something like "manager"?). You got 
> exactly what you inserted.
>
> Anthony
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to