[Zope-dev] Zope 2.3.1b1, strange things when ConflictError.

Erik Enge erik@esol.no
Sun, 25 Feb 2001 20:59:09 +0100 (CET)


I have two nice methods.  One of them (methodA) is called via the web.
These belong to one class; classA.

class classA:
    "doc string"

    def methodA(self):
        "doc string"
        objects = self.methodB(self)
	objects.reverse()

	attrib = ''	

	for object in objects:
		attrib = attrib + 'some html'

	return attrib

    def methodB(self, object, skip=[], stop=[], objects=[]):
        "doc string"	
	try:
	    if object.meta_type in skip:
		return self.methodB(object.getParentNode(), skip,
				    stop, objects)

	    if object.meta_type in stop:
		raise AttributeError
	    else:
                # I don't think I need this.
		if object not in objects:
		    objects.append(object)
	        else:	
		    raise AttributeError
		
		return self.methodB(object.getParentNode(), skip,
				    stop, objects)
	except AttributeError:
		return objects

Narrative story: The user calls methodA (from a instance of
classA) through the web.  methodA returns some nicely formatted HTML
navigation links.  methodB should traverse through the objects with
getParentNode(), append the object in the list objects (if its meta_type
is not listed in 'skip' or 'stop' - which are "skip meta_types" and
"stop_meta_types" lists) and return them to methodA for formatting.  The
objects should be listed in the list that is returned sequentially and
methodA would be required to do an objects.reverse() to make sure we are
facing the right direction.

First of all, this doesn't work very nicely.  Every other time I refresh
my webpage (ie. call methodA) it seems to reverse() the list returned
from methodB on its own.  That's strange.  This results in:

	[<instance1>, <instance2>]

and

	[<instance2>, <instance1>]

every other time.  *baffled*

Now comes the part which really makes me want to go to my hotelroom and
watch Life of Brian on BBC at 9.00pm; if I refresh the webpage quickly,
and many times (not too quick or too many times; 2-5 times within 2-5
seconds) I get a ConflictError raised in my log - it doesn't take it up to
the webpage.  There is other stuff going on which causes the ConflictError
to get raised (although, I'm only _reading_ from a ZCatalog, as far as I
know anyway).

Heres what I don't understand.  When ever I get a ConflictError, the
contents of the 'objects' attribute in methodB isn't "flushed".  Thus,
resulting in a very long navigation bar with repeating links.  Let me
repeat that: The attribute 'objects' of the method methodB appears to be
persistent.  

Which it isn't of course.

My best guess is that something is wrong with the logic when a
ConflictError is raised.  It would make kinda sense.

Tracebacks, beers or other interesting things offered if needed. :)