Massimo,

I will try and give you a translated example which is probable easier
to understand. I have two tables:

db.define_table('company',
    db.Field('company_name',length=54,default='',notnull=True),
    db.Field(...),
    migrate=False)


db.define_table('activity',
    db.Field
('activity_name',length=48,default='',notnull=True,unique=True),
    db.Field(...),
    migrate=False)


... and a combination table:

db.define_table('companyactivity',
    db.Field
('company',db.company,default='',notnull=True,ondelete='CASCADE'),
    db.Field
('activity',db.activity,default='',notnull=True,ondelete='RESTRICT'),
    db.Field(...),
    migrate=False)


To prevent the user to enter the same company activity combination
twice I would like to have a two column unique constraint on company
and activity. The first validator which I tried read like:

db.companyactivity.company.requires=[IS_IN_DB(db,db.company.id,'%
(company_name)s'),IS_NOT_IN_DB
(db.companyactivity.activity==request.vars.activity),db.companyactivity.company)]
db.companyactivity.activity.requires=IS_IN_DB(db,db.activity.id,'%
(activity_name)s')

This validator does not disable the drop box functionality, but
doesn't perform the correct validation as well. I can enter a company
activity combination twice.


In the second validator I put the validator on activity instead of
company, this disabled the drop box so I had to add that using the
widget.

db.companyactivity.company.requires=IS_IN_DB(db,db.company.id,'%
(company_name)s')
db.companyactivity.activity.requires=[IS_IN_DB(db,db.activity.id,'%
(activity_name)s'),IS_NOT_IN_DB
(db.companyactivity.company==request.vars.company),db.companyactivity.activity)]
tmp=SQLField
('activity',db.activity,requires=db.companyactivity.activity.requires
[0])
tmp._tablename=db.companyactivity.activity._tablename
db.companyactivity.activity.widget=lambda f,v: OptionsWidget.widget
(tmp,v)

This validator does display the drop box, but doesn't perform the
correct validation. I can enter a company activity combination twice.
I tried adding the line of code you suggested in your previous post,
but that did result in an error ticket being issued:

Traceback (most recent call last):
  File "/Library/Python/2.5/site-packages/web2py/gluon/restricted.py",
line 176, in restricted
    exec ccode in environment
  File "/Library/Python/2.5/site-packages/web2py/applications/cms/
models/db.py", line 281, in <module>
    db.bedrijfactiviteit.activiteit['requires']
=db.bedrijfactiviteit.activiteit.requires
TypeError: 'SQLField' object does not support item assignment


I am not sure the validator is the cause of the problem, I had a look
at the function I expose:

@auth.requires_membership('tier2_manager')
def crud_activity():
    response.functionname='Manage activities'
    db.companyactivity.company.writable=False
    db.companyactivity.company.default=auth.user.company
    form=create_form(db.companyactivity)
    records=db((db.companyactivity.company==auth.user.company)&
(db.companyactivity.activity==db.activity.id))\
    .select
(db.companyactivity.ALL,db.activity.activity_name,orderby=db.activity.activity_name)
    return dict(form=form,records=records)

... maybe these lines of code are the cause of the problem

db.companyactivity.company.writable=False
db.companyactivity.company.default=auth.user.company

... request.vars.company probably doesn't have a value?


I hope I provided you with sufficient information to help me solve the
problem. I apologize for asking the question without translating the
Dutch words into English, to me German, Dutch and English are similar
one another.


Kind regards,

Annet.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py Web Framework" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to