Thanks Anthony to clarify, now I understand... I never had such an issue I
guess, I never thought the set were preventing the form submission... Let
say that the IP address doesn't change, he could also have put the field in
readable true and writable false...

Richard

On Wed, May 20, 2015 at 4:34 PM, Anthony <abasta...@gmail.com> wrote:

> @Richard, the problem is that even when doing an update, the update will
> not be allowed because the validator will exclude IP addresses marked as
> being used (and the IP address of the current record will be marked as
> used).
>
> When doing an update, you need to conditionally change the validator to
> include all free IP addresses *plus* the IP address of the record being
> updated. So, in the action that handles updates, you might have something
> like this:
>
>     if 'edit' in request.args:
>         record = db.server(request.args(-1))
>         db.server.ipaddress.requires = IS_IN_DB(db((db.ipaddress.status ==
> 'Free') |
>                                                    (db.ipaddress.ip ==
> record.ipaddress)),
>                                                 db.ipaddress.ip, '%(ip)s')
>     grid = SQLFORM.grid(...)
>
> Also, you might consider changing the "ipaddress" field to be a reference
> field (referencing db.ipaddress). In that case the validator would be:
>
>     db.server.ipaddress.requires = IS_IN_DB(db((db.ipaddress.status==
> 'Free') |
>                                                (db.ipaddress.id == record.
> ipaddress)),
>                                             db.ipaddress.id, '%(ip)s')
>
> Anthony
>
>
> On Wednesday, May 20, 2015 at 12:06:54 PM UTC-4, Richard wrote:
>>
>> As I said, I don't understand your requirement... What you wrote seems ok
>> (really quick looks), but I don't understand why you would need to do such
>> a thing to get your field populated correctly...
>>
>> If you create a new record, you have to build a set that will allow to
>> pick only the FREE IP address. In case of Update form, the IP address
>> should be already selected and you shouldn't change it, if your update form
>> field is blank there is an issue somewhere it should display the selected
>> IP address... If you need to change the IP address, but this address is in
>> use by another record, you have to FREE the IP address attach to the other
>> record and then select it in the dropbox if your new record or update
>> form...
>>
>> Richard
>>
>> On Tue, May 19, 2015 at 6:20 AM, <kecajkecaj...@gmail.com> wrote:
>>
>>> Rich,
>>>
>>> Can You have a quick look at this?
>>>
>>> Thanks,
>>>
>>> On Tuesday, 12 May 2015 17:34:38 UTC+2, kecajk...@gmail.com wrote:
>>>>
>>>> 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> 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.
>>>>>> 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.
>>>
>>
>>  --
> 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.
>

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