Massimo,
thanks to your code example I managed to get this somehow into the
model side of things. Reason is because for later maintenance I think
that multi column unique keys should be set/managed on database/model
layer.
1) I had to 'exclude' the checking of the current record - hence only
checking all other records in that table for duplicates (=uniqueness)
- in oder to get update forms working. Without that the update form
would always throw the 'already in database' error message = update
function lost. Can you confirm if that is a good solution without
negative side effects?
2) csv imports do not apply these validator. how could that be fixed
best?
3) can this multi column key solution - once its fully working - be
integrated into future versions of web2py in order that the workaround
construct could be replaced by something like the 1st line of
commented code below?
#db.shapecolormonth.colorname.requires=[IS_IN_DB(db,'colorname.id','%
(name)s'),IS_NOT_IN_DB(db
((db.shapecolormonth.shapename==request.vars.shapename)&
(db.shapecolormonth.month==request.vars.month)),db.shapecolormonth.colorname)]
# vvvvvvvvvvvvvvvvvvvvvvv workaround construct begins here
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
# +) the following construct replaces the broken dropdown function of
the previous commented line of code
# 1) had to add '&(db.shapecolormonth.id!=request.vars.id)' into the
IS_NOT_IN_DB parameters in order to get update froms accepting
# 2) remaining issue: csv import does not apply this validator!
class MY_ODD_VALIDATOR(IS_IN_DB):
def __init__(self,*a,**b): IS_IN_DB.__init__(self,*a,**b)
def __call__(self,value):
e=IS_IN_DB.__call__(self,value)
if e[1]: return e
e=IS_NOT_IN_DB(db
((db.shapecolormonth.shapename==request.vars.shapename)&
(db.shapecolormonth.month==request.vars.month)&(db.shapecolormonth.id!
=request.vars.id)),db.shapecolormonth.colorname)(value)
return e
db.shapecolormonth.colorname.requires=MY_ODD_VALIDATOR
(db,'colorname.id','%(name)s')
# ^^^^^^^^^^^^ end of workaround construct
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
--Hans
On Mar 25, 2:56 pm, mdipierro <[email protected]> wrote:
> My suggestion is use the validators for the drop box only, define
>
> def my_check(form):
> if db( (db.shapecolormonth.shapename==form.vars.shapename) &
> (db.shapecolormonth.shapecolor==form.vars.shapecolor) &
> (db.shapecolormonth.month==form.vars.month) ).count():
> form.errors.month='sorry, shape+color+month combo have to be
> unique'
> return
>
> then in SQLFORM set
>
> SQLFORM(....,onvalidation=my_check)
>
> This is not the only solution. You could do everything with
> validators, but this solution is simpler.
>
> Massimo
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---