Thanks for the response. I believe I understand your suggestion. DBs are not one of my areas of strength, and so I'm struggling with issues that may be simple. So, I have a few follow up questions:
Question 1 In: db.define_table('application', Field('name'), Field('version'), format='%(name)s %(version)s') What is the purpose of the 'format' argument? Does it some how control how a pull down menu is formated? or how each row is printed in a report? or is it some proper DB thing? Question 2 How should I understand the statement: db.application.version. > > requires=IS_NOT_IN_DB(db > (db.application.name==request.vars.name),db.application.version) First, what is it suppose to mean? Something like "allow the update if and only if rows who's name matches the request's name do not already have the given version"? Second, I can't make sense of the second argument. Doesn't it just evaluate to a boolean, and get passed into IS_NOT_IN_DB()? Does the code get reparsed for every form and row? How does it work? I assume the intent is that the second argument is some sort of function that get evaluated against each row. Question 3 Somehow I've assumed that when I'm defining a table that it's all DB specific, but it seems that I'm also specifiying the GUI presentation -- pull down menus and so on. Is this correct and intentional? Thank you, C. Helck On Sun, Dec 27, 2009 at 11:55 PM, mdipierro <mdipie...@cs.depaul.edu> wrote: > First of all let me congratulate for the clear format of your > question. > This line: > > db.report.from_id.requires = IS_IN_DB(db, db.version.id, '%(name)s > %(version)s') # Again, I want a set, not a list. > > does not display the cartesian product of name and version but only a > list of name, version for every record in db.version. Some entries are > repeated because name+version is not a unique key of db.version. > > As I see it this is a logical problem. > > The table version contains a link between an application version and a > component version. It basically implements a many-2-many relation but > without a source table. The missing source table is the one you want > to reference in from_id. The source table is a table that contains > lists of application name,version and all entries are unique. > > My suggestion is change the model: > > db.define_table('application', > Field('name'), > Field('version'), > format='%(name)s %(version)s') > #make sure name+version is unique for applications > db.application.version.requires=IS_NOT_IN_DB(db > (db.application.name==request.vars.name),db.application.version) > > db.define_table('component', > Field('name'), > Field('version'(, > Field('label'), > format='%(name)s %(version)s') > ) > #make sure name+version is unique + components > db.component.version.requires=IS_NOT_IN_DB(db > (db.component.name==request.vars.name),db.component.version) > > db.define_table('usage', > Field('application_id', db.application), > Field('component_id', db.component)) > > db.define_table('report', > Field('from_id', db.application), > Field('to_id', db.application)) > > If you use 1.74.4 and the format attribute you do not need to set any > of the IS_IN_DB validators. I think this will be what you want. The > tables "applicaiton" and "usage" replace your table "version". > > On Dec 27, 9:18 pm, Christopher Helck <christopher.he...@gmail.com> > wrote: > > I apologize if this is more of a DB question than a web2py question, but > I'm > > having trouble with populating a drop down menu in the admin interface. I > > have a table (called 'version') with two keys ('name' and 'version') > and a > > third column 'component_id'. This table records which versions of an > > application use which software component: Example data: > > > > Name, Version, Component > > credit, 1.0.0 commons_all_1.2 > > credit, 1.0.1, commons_all_1.3 > > credit, 1.0.0 commons_pools_6.3 > > credit, 1.0.1, commons_pools_6.5 > > > > Interpretaion: The credit application 1.0.0 uses commons_all_1.2 and > > commons_pools_6.3 > > The credit application 1.0.1 uses commons_all_1.3 and > > commons_pools_6.5 > > > > The problem occurs when I reference the version table from another table. > > The drop down list contains: > > credit 1.0.0 > > credit 1.0.0 > > credit 1.0.1 > > credit 1.0.1 > > > > I want the drop down menu to display the set {name, version}, instead of > the > > cartisian product of the two keys. Here's my db.py: > > > > db.define_table('component', > > Field('component_name'), > > Field('component_version'), > > Field('label')) > > > > db.define_table('version', > > Field('name'), > > Field('version'), > > Field('component_id', db.component)) > > > > db.define_table('report', > > Field('from_id', db.version), # Drop down menu has > cartisian > > product of version.name X version.version > > Field('to_id', db.version)) > > > > db.version.component_id.requires = IS_IN_DB(db, db.component.id, > > '%(component_name)s %(component_version)s') > > db.report.from_id.requires = IS_IN_DB(db, db.version.id, '%(name)s > > %(version)s') # Again, I want a set, not a list. > > db.report.to_id.requires = IS_IN_DB(db, db.version.id, '%(name)s > > %(version)s') > > > > Thanks, > > C. helck > > -- > > You received this message because you are subscribed to the Google Groups > "web2py-users" group. > To post to this group, send email to web...@googlegroups.com. > To unsubscribe from this group, send email to > web2py+unsubscr...@googlegroups.com<web2py%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/web2py?hl=en. > > > -- You received this message because you are subscribed to the Google Groups "web2py-users" group. To post to this group, send email to web...@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.