[Zope] 2.1.4 to 2.1.6 nightmare

John Morton zope@zope.org
Thu, 25 May 2000 11:43:23 +1200 (NZST)


On Wed, 24 May 2000 13:38:55 -0400 (CLT) you wrote:

 > 
 > Hi Zopistas,
 > 
 > after upgrading Zope (in a debian/Linux system) from 2.1.4 to 2.1.6
 > the acquisition rules seems to be broken.
 > 
 > As an example supose we have this tree structure
 > 
 > ---|- aviso
 >    |- foo
 >    |- bar     
 >       |- X_sql (sql method)
 > 
 > 
 > 
 > X_sql is a sql method with to parameters: objeto, aviso
 > 
 > here is the template:
 > 
 > INSERT INTO linea_publicacion
 >   (publicacion,aviso)
 > VALUES
 >   (&dtml-objeto;,&dtml-aviso;)
 > 
 > when zope renders this template to execute the sql, it renders
 > 
 > INSERT INTO linea_publicacion
 >   (publicacion,aviso)
 > VALUES
 >   (3,<Folder instance at 8580aa0>)
 > 
 > so it replaces aviso with the folder instance aviso.
 > 
 > Apart of discarding the explicit parameter "aviso", the aviso folder
 > is not parent of bar so it shoudn't acquire it.
 > 
 > So, who can explain me this??
 > 
 > is that a bug in Zope 2.1.6 ??  Zope 2.1.4 works fine.


Yes. ZSQL methods attempt to acquire values _before_ using the ones you
supply directly. It's been discussed on the list earlier this month, as I
found out when I stumbled upon it on Monday. Lots of things in 2.1.6 are
worth keeping, however, so I patched it. Just as soon as I have the time
I'll post a formal patch just as soon as I have time, but here's a quick
rundown:

In lib/python/Shared/DC/ZRDB/Aquaduct.py you should see something like
this:

class BaseQuery(Persistent, SimpleItem.Item,
                Acquisition.Implicit, RoleManager):

    def query_year(self): return self.query_date.year()
    def query_month(self): return self.query_date.month()
    def query_day(self): return self.query_date.day()
    query_date=DateTime.now()
    manage_options=()

    def quoted_input(self): return quotedHTML(self.input_src)
    def quoted_report(self): return quotedHTML(self.report_src)

    MissingArgumentError='Bad Request'

    def _convert(self): self._arg=parse(self.arguments_src)

    def _argdata(self, REQUEST):

        r=ArgWrapper()

Change that last line to:

        r={}

Then, in lib/python/Shared/DC/ZRDB/DA.py, in  __call__, look for this:

   query=apply(self.template, (p, argdata))

And change it to:

 query=apply(self.template, (p,), argdata)

That seemed to fix the problem for me. Brickbats to DC for releasing a
security update that breaks functionality this badly, but kudos to them
for releasing the code so we can patch around problems.

John