Sure, it's pretty simple:

DB:

db.define_table('ipaddress',
   Field('ip', unique=True, length=200,requires=IS_NOT_EMPTY()),
   Field('status', length=200, default="Free", 
requires=IS_IN_SET(['Free','Used'])),
   format = '%(ip)s')

db.define_table('server',
   Field('servername', length=200),
   Field('ipaddress', unique=True, length=200, 
requires=IS_IN_DB(db(db.ipaddress.status=='Free'),db.ipaddress.ip, 
'%(ip)s')))

def __after_insert_server(f, id):
    db(db.ipaddress.ip == f.ipaddress).update(status = T('Used') )


def __before_delete_server(s):
db(db.ipaddress.ip == s.select()[0].ipaddress).update(status = T('Free'))   
 
    
def __before_update_server(s,f):
    db(db.ipaddress.ip == s.select()[0].ipaddress).update(status = 
T('Free'))    
    db(db.ipaddress.ip == f['ipaddress']).update(status = T('Used') )
    
db.server._after_insert.append(__after_insert_server)
db.server._before_delete.append(__before_delete_server)
db.server._before_update.append(__before_update_server)


GRID:

def temp():
  
    query=(db.server.id>0 )
    fields=()
    grid = SQLFORM.grid(query=query,fields=fields,user_signature=False)
    
    return dict(grid=grid)




On Monday, 11 May 2015 15:49:10 UTC+2, Richard wrote:
>
> Ok, so the problem is that when you edit your record the dropbox field 
> shouldn't be blank... That is your issue, would you share the code of you 
> form and grid and the exact validators...
>
> There shoud be something that don't work somewhere...
>
> And it you may start here : requires=IS_IN_DB(db(db.ipadd
> ress.status=='Free'),db.ipaddress.ip, '%(ip)s')),
>
> It should read :
>
> requires=IS_IN_DB(db(db.ipaddress.status=='Free'),* 'ipaddr**ess.ip'*, 
> '%(ip)s')),
>
>
>
> Richard
>
> On Mon, May 11, 2015 at 9:14 AM, 黄祥 <steve.van...@gmail.com <javascript:>> 
> wrote:
>
>> why not use conditional requires base on url?
>> e.g.
>> if 'free' in request.controllers:
>>
>>
>>
>> On Monday, May 11, 2015 at 4:19:03 PM UTC+7, kecajk...@gmail.com wrote:
>>>
>>> Richard, 
>>>
>>> Let say that I have two IPs in ipaddress table:
>>>
>>> 10.1.1.1  FREE
>>> 10.2.2.2 FREE
>>>
>>> I add a server into server table, i put name as server1 and chose IP 
>>> from dropdown menu 10.1.1.1.
>>> Then my ipaddress table looks like that
>>> 10.1.1.1 USED
>>> 10.2.2.2 FREE
>>>
>>> But i noticed that i did a typo in server name... in fact server name 
>>> should be server111, so i use grid to display server table and use update 
>>> button next to "server1" record. I change server name to server111 and i 
>>> need to chose an IP again (as IP dropdown field is blank). So now i would 
>>> like to chose same IP as before, but I'm not able to do it, because 
>>> dropdown shows just 10.2.2.2 which make sense as i used 
>>>
>>>  requires=IS_IN_DB(db(db.ipaddress.status=='Free'),db.ipaddress.ip, 
>>> '%(ip)s')),
>>>
>>> So my question is how to make IP 10.1.1.1 visiable on the list when i'm 
>>> updating the record? 
>>>
>>> Regards.
>>>
>>> On Thursday, 7 May 2015 15:52:07 UTC+2, Richard wrote:
>>>>
>>>> Ok, I don't understand... Can you go back one step and explain what 
>>>> kind of information you want to manage and why you think you have to 
>>>> update 
>>>> the IP address... Is there multiple records with the same server name if 
>>>> so 
>>>> why... It seems to me that you want to manage kind of history of IP 
>>>> attached to a given device... If so, you DB schema is not sufficient, you 
>>>> will need an archive table which will contains the old state of your 
>>>> server 
>>>> record... In your server table there will be only a single record for each 
>>>> of your server and in the history table when you update this single record 
>>>> the old state of the record will be copied there, so you can track all the 
>>>> IP a given server had in the past... An history table is easy achieve in 
>>>> web2py with record versioning...
>>>>
>>>> Richard
>>>>
>>>> On Thu, May 7, 2015 at 6:52 AM, <kecajk...@gmail.com> wrote:
>>>>
>>>>> Hi, 
>>>>>
>>>>> What's the difference between what i wrote and what You wrote? 
>>>>> And i believe You didn't get my point. Checking if IP is Free works 
>>>>> correctly. Point is that i want do update the one row in Server table and 
>>>>> change i.e. server name. I click on update button provided by grid, and i 
>>>>> can change the name of the server (withouth changing its IP), but i need 
>>>>> to 
>>>>> chose an IP as well. Problem is that on the IP list, IP i used for that 
>>>>> server before is marked as Used, so i won't see it on the list and i 
>>>>> can't 
>>>>> chose it again. How to make it available for selection while i'm updating 
>>>>> the row.
>>>>>
>>>>> Thanks
>>>>> On Wednesday, 6 May 2015 16:52:05 UTC+2, Richard wrote:
>>>>>>
>>>>>> A set which you have, but your validator has wrong syntax :
>>>>>>
>>>>>> IS_IN_DB(db(db.ipaddress.status=='Free'),db.ipaddress.ip, '%(ip)s')
>>>>>>
>>>>>> free_ip_set = db(db.ipaddress.status=='Free')
>>>>>> IS_IN_DB(free_ip_set, 'ipaddress.ip', '%(ip)s')
>>>>>>
>>>>>> Try this... You define the set before you server table and after the 
>>>>>> ipaddress table..
>>>>>>
>>>>>> Richard
>>>>>>
>>>>>> On Tue, May 5, 2015 at 9:46 AM, <kecajk...@gmail.com> wrote:
>>>>>>
>>>>>>> Hi All, 
>>>>>>>
>>>>>>> I have very basic dtabasae where in one table i have IPs which are 
>>>>>>> used in second table:
>>>>>>>
>>>>>>> db.define_table('ipaddress',
>>>>>>>    Field('ip', unique=True, length=200,requires=IS_NOT_EMPTY()),
>>>>>>>    Field('subnet', length=200, requires=IS_NOT_EMPTY() ),
>>>>>>>    Field('status', length=200, default="Free", 
>>>>>>> requires=IS_IN_SET(['Free','Used'])),
>>>>>>>    format = '%(ip)s')
>>>>>>>
>>>>>>> db.define_table('server',
>>>>>>>    Field('servername', length=200),
>>>>>>>    Field('port', length=200, requires=IS_NOT_EMPTY()),
>>>>>>>    Field('ipaddress', unique=True, length=200, 
>>>>>>> requires=IS_IN_DB(db(db.ipaddress.status=='Free'),db.ipaddress.ip, 
>>>>>>> '%(ip)s')),
>>>>>>>   
>>>>>>>
>>>>>>> The problem i'm having is that with grid i can delete and add new 
>>>>>>> values to "server" table and i added function which update status of IP 
>>>>>>> for 
>>>>>>> USED or FREE after insert/delete. 
>>>>>>> Problem is with Update function as when i try to update server name 
>>>>>>> i need to chose IP again and i can't chose same IP as it is marked in 
>>>>>>> ipaddress table as USED hence it's not displayed in dropdown menu.
>>>>>>> How can i display all IPs that are marked as FREE in ipaddress table 
>>>>>>> AND IPs that where currently assign to the record i'm updateing in 
>>>>>>> table 
>>>>>>> server? 
>>>>>>>
>>>>>>> Regards.
>>>>>>>
>>>>>>> -- 
>>>>>>> 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 web2py+un...@googlegroups.com.
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>>
>>>>>>  -- 
>>>>> 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 web2py+un...@googlegroups.com.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>  -- 
>> 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 web2py+un...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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 web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to