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.