[Zope] NameError (global name 'namespace' is not defined) - more diagnos tics and code

Ronald.Chichester@bakerbotts.com Ronald.Chichester@bakerbotts.com
Fri, 7 Dec 2001 14:35:32 -0600


Even more diagnostic information the pecurliar 'namespace' error.

I loaded Zope 2-4-3 onto my box and loaded in the product and folder (with
info) in their appropriate places.  Then I loaded the python scripts into
the editor and pressed the "Save Changes" button do recompile.  It didn't
help.  Same problem.  NameError: global name 'namespace' is not defined.

I'm wondering if my technique for getting information from an object isn't
frought with peril.  Is there a technique where I could return a particular
object from a list of objects?  Getting an actual object is easy to do.
However, the problem comes when the search is unsuccessful.  What do you
return?  The below code is what I developed to remedy that problem.  The
problem with the remedy is that it doesn't work in Zope 2-4-3 (although it
did in 2-3-1).  Note, the DTML code from which the python script is called
used the contents namespace.  Here is the original python script code:

found    = 0   # flag to indicate that the object was/wasn't found...
contents = []  # the return list...

# Run through the objects in the current (context) folder to see if
there is a match (with given_title)...
for obj in context.objectValues('Image'):
  if found == 0:
    if given_title == obj.title:
      url            = obj.absolute_url
      title          = obj.title    
      contents.append(namespace(url=url, title=title)[0])
      found = 1                  # Set flag on success...

# If you can't find it in the context, then check the container...
for obj in container.objectValues('Image'):
  if found == 0:
    if given_title == obj.title:
      url            = obj.absolute_url
      title          = obj.title    
      contents.append(namespace(url=url, title=title)[0])
      found = 1                  # Set flag on success...

# Return indicative values if the desired object was not found...
if found == 0:
  contents.append(namespace(url='', title='')[0])

vars = namespace(contents=contents)

return vars

-----

As the namespace issue wss causing the problem, I tried to get around it by
doing the following:

found    = 0   # flag to indicate that the object was/wasn't found...

# Run through the objects in the current (context) folder to see if
there is a match (with given_title)...
for obj in context.objectValues('Image'):
  if found == 0:
    if given_title == obj.title:
      ret_obj = obj
      found = 1                  # Set flag on success...

# If you can't find it in the context, then check the container...
for obj in container.objectValues('Image'):
  if found == 0:
    if given_title == obj.title:
      ret_obj = obj
      found = 1                  # Set flag on success...

return ret_obj

###

... which works just fine _IF_ you find the object.  If not, the DTML code
is still going to look for a property and not find one (because nothing is
returned).  To fix that, I added a "dummy" object for errors, to wit:

class myErrorClass:
  element_number = -1

... was tacked on at the beginning of the script, and ...

if found == 0:
  an_Error = myErrorClass()
  return an_Error
else:
  return ret_obj

... was tacked on at the end.  

Unfortunately, when you run into a condition where no legitimate object was
found (i.e., found == 0), you get a screwy response from Zope.  The
username/password challenge comes up (even if you are in the manage session
as the manager).  No username/password combination exists to get through
that.  In short, something about instantiating the class screwed up Zope.

What does one do in such a situation?

Thank you all in advance.

Ron

---

complaw@hal-pc.org wrote:
>As I said before, the above code works just fine in Zope 2-3-1. 
>However, it fails (gets the NameError) in both versions 2-4-2 and
>2-4-3.  Is this because Zope went to python 2.x instead of 1.5?
>
>Do I have to rewrite my code?  Do I have to tell my client to get 2-3-1? 
>
>Any hints would be greatly appreciated.
>
>Thanks,
>
>Ron
>


> 
> This may be a version problem, or it may not.
> 
> I wrote a fairly straightforward Zope application in Zope 2-3-1 on Linux.
(That
> instance of Zope has been working just fine for months and hey, it wasn't
broke
> so I didn't fix it.  The Linux box has been up for 132 days and I like the
fact
> that I only have to fuss with Zope, if anything at all.)
> 
> I created a simple product and associated folder (with a slew of Folders,
DTML
> Documents, python scripts, and DTML Methods.  Then I exported them and
shipped
> both the product and the site off to a client who had downloaded and
installed
> Zope 2-3-4 for Windows.
> 
> The client got into the Zope management screen (after a little
hand-holding, but
> he didn't read any documentation, so I can't complain).  I talked him
through
> the processes of unzip/untar the product, and loading the particular site.
> 
> Now the client can pull up a browser and accurately read index_html of the
main
> folder.  However, when he tries to read any of the DTML Documents,
Folders, etc.
> he gets:
> 
> Zope Error
> 
> Error Type: NameError
> Error Value: global name 'namespace' is not defined
> 
> Is this problem between different versions of Zope?  namespace is pretty
> fundamental.  I don't see how it could have worked fine under 2-3-1 and
not
> under 2-4-3.
> 
> Thanks in advance for any help.
> 
> Ron
> 
> _______________________________________________
> Zope maillist  -  Zope@zope.org
> http://lists.zope.org/mailman/listinfo/zope
> **   No cross posts or HTML encoding!  **
> (Related lists -
>  http://lists.zope.org/mailman/listinfo/zope-announce
>  http://lists.zope.org/mailman/listinfo/zope-dev )

_______________________________________________
Zope maillist  -  Zope@zope.org
http://lists.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope-dev )