I assumed that the line:
 requires=IS_NOT_IN_DB(db
 (db.application.name==request.vars.name),db.application.version)

Was a typo and that you had forgotten a comma. I parsed it as:
   requires=IS_NOT_IN_DB(db, (boolean expression, field)
But it really is:
   requires=IS_NOT_IN_DB(db(expression), field)

Thanks,
C. Helck



On Tue, Dec 29, 2009 at 12:03 AM, mdipierro <mdipie...@cs.depaul.edu> wrote:

>
>
> On Dec 28, 10:23 pm, Christopher Helck <christopher.he...@gmail.com>
> wrote:
> > 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?
>
> format is used to set field.requires=IS_IN_DB
> (db,reference_field,format) automatically for all fields that
> reference this table.
>
> >
> > 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"?
>
> It is a trunk to make sure that the combination name+version is
> unique. It requirest that the version is in not the the set db(...)
> where db(...) is the set of records with the same name as the one
> submitted.
>
> > 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.
>
> IS_NOT_IN_DB(a,b)
>
> "a" is a db or db(...), i.e. a of records. "b" is a field to look for.
>
>
> >
> > 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?
>
> Yes and not. field.requires sets validators. web2py tries to represent
> your field depending on the field type and its validators. This can be
> overwritten using field.widget=...
>
> >
> > 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>
> <web2py%2bunsubscr...@googlegroups.com<web2py%252bunsubscr...@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<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.


Reply via email to