Hello Tom,

Thank you very much, your pointers helped me to solving it.

Tags was indexed with a TextIndex using my adapter FooTags which had a function
to join the list:

     def getSearchableList(self):
         s = ' '.join(self.context.tags)
         #if s == '':
         #    return None
         return s

The part that is commented out was the cause of my error. Returning a None when the list is empty will of course cause an error of "iteration over non- sequence" when indexing.

Btw, is there an already existing way to index a field with a list of strings so you can do a search on a particular element in the list? It's a little cumbrsome writing an adapter for each field that has a list of strings to join them as one string (if this is even a good solution at all, I'm
not sure).

Regards
Steva



On Oct 22, 2007, at 11:20 PM, Tom Dossis wrote:

Hi Maken,

From the stack trace it looks like the problem is related to cataloging your object.

From this point, there's a couple things to look at.

1. How are you cataloging IFoo?  How did you set up the catalog?

2. Enter a break point or print statement in lexicon.py to see what's happening in the method sourceToWordIds just after the call to _text2list,
  e.g. print repr(text), repr(last).
I'd be interested to see what these value's are. I can't see how it's failing, but since it appears so, maybe there's a bug in _text2list.

BTW, just to explain my original suggestion... When you use EditForm, you have a Foo object, which means it's __init__ method has been called and the tag attribute has been set to PersistentList. However in the case of AddForm, there is no Foo instance from which to bind the widgets to. In this case you may need to explicitly say something about the tag field default value, because AddForm will need to use this value.

-Tom

On 22/10/2007, at 9:14 PM, Maken Seteva wrote:


On Oct 18, 2007, at 10:54 PM, Tom Dossis wrote:


On 18/10/2007, at 11:58 PM, Maken Seteva wrote:

Hello,
I have a very strange error that I cannot understand. I get an error for one of my attribute only when it is named a certain name! It seems like there is an old implementation of
it that is haunting in the background, how is this possible?

This cursed name is called "tags". This attribute is a list of TextLine. I get the error when I
don't add anything to the list in the adding view:

"TypeError: iteration over non-sequence"


However, if I rename the attribute to "wehoo" or really, anything else, I don't get the TypeError and I can add my content object successfully (with an empty list for wehoo). Here's my component:

class IFoo(IContained):
        #...
     tags = List(
         title=_(u'Tags'),
         description=_(u'A list of keywords'),
         max_length=10,
         value_type=TextLine(title=_(u'Tag')),
         unique=True
         )
        #...


class Foo(Persistent):
        implements(IFoo)
        __name__ = __parent__ = None
        def __init__(self):
                #...
                self.tags = PersistentList()
                #...

No custom widgets used for this field...

I tried deleting all .pyc-files and deleting all old Foo objects, and the site i run for testing followed by restarting the server. But adding new Foo objects still don't work. (But renaming tags to anything else
and then trying again will succeed).

Any ideas?

Add: default=[] to your IFoo schema.

-Tom


Hi Tom,
I did just that and I still get the TypeError. It is kind of confusing in how to allow an empty list for a schema field. If required=True for the list, why doesn't it complain when I don't add anything to the list in the form? Btw, I don't want this field to be required, but i just noticed
this oddity(?) when trying different settings.

This was the last setting for the field I used (and it failed):


     tags = List(
         title=_(u'Tags'),
         description=_(u'A list of keywords'),
         max_length=10,
         required=False,
         default=[],
         value_type=TextLine(title=_(u'Tag')),
         unique=True
         )


I printed out the data dict in my AddForm's create function to
see what the value for tags was when no tags are added in the form.. it is really an empty list..


Here's my full traceback I get after pressing "Add" button in my adding view for Foo:

2007-10-22T12:31:13 ERROR SiteError http://localhost:8080/Site/ foos/+/mytest.addpage.Foo%3D
Traceback (most recent call last):
File "/home/mset/local/Zope-3.3.1/lib/python/zope/publisher/ publish.py", line 133, in publish
    result = publication.callObject(request, obj)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/app/ publication/zopepublication.py", line 161, in callObject
    return mapply(ob, request.getPositionalArguments(), request)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/publisher/ publish.py", line 108, in mapply
    return debug_call(obj, args)
- __traceback_info__: <security proxied zope.app.publisher.browser.viewmeta.FooAddForm instance at 0x3fa3c30> File "/home/mset/local/Zope-3.3.1/lib/python/zope/publisher/ publish.py", line 114, in debug_call
    return obj(*args)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/formlib/ form.py", line 769, in __call__
    self.update()
File "/home/mset/local/Zope-3.3.1/lib/python/zope/formlib/ form.py", line 750, in update
    result = action.success(data)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/formlib/ form.py", line 594, in success
    return self.success_handler(self.form, self, data)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/formlib/ form.py", line 861, in handle_add
    self.createAndAdd(data)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/formlib/ form.py", line 868, in createAndAdd
    return self.add(ob)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/formlib/ form.py", line 877, in add
    ob = self.context.add(object)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/app/container/ browser/adding.py", line 72, in add
    container[name] = content
File "/home/mset/local/Zope-3.3.1/lib/python/zope/app/container/ sample.py", line 86, in __setitem__
    setitem(self, self.__data.__setitem__, key, object)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/app/container/ contained.py", line 593, in setitem
    notify(event)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/event/ __init__.py", line 23, in notify
    subscriber(event)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ event.py", line 26, in dispatch
    for ignored in zope.component.subscribers(event, None):
File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ _api.py", line 130, in subscribers
    return sitemanager.subscribers(objects, interface)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ registry.py", line 290, in subscribers
    return self.adapters.subscribers(objects, provided)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/interface/ adapter.py", line 535, in subscribers
    subscription(*objects)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ event.py", line 33, in objectEventNotify adapters = zope.component.subscribers((event.object, event), None) File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ _api.py", line 130, in subscribers
    return sitemanager.subscribers(objects, interface)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ registry.py", line 290, in subscribers
    return self.adapters.subscribers(objects, provided)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/interface/ adapter.py", line 535, in subscribers
    subscription(*objects)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/app/intid/ __init__.py", line 169, in addIntIdSubscriber
    notify(IntIdAddedEvent(ob, event))
File "/home/mset/local/Zope-3.3.1/lib/python/zope/event/ __init__.py", line 23, in notify
    subscriber(event)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ event.py", line 26, in dispatch
    for ignored in zope.component.subscribers(event, None):
File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ _api.py", line 130, in subscribers
    return sitemanager.subscribers(objects, interface)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/component/ registry.py", line 290, in subscribers
    return self.adapters.subscribers(objects, provided)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/interface/ adapter.py", line 535, in subscribers
    subscription(*objects)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/app/catalog/ catalog.py", line 153, in indexDocSubscriber
    cat.index_doc(id, ob)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/app/catalog/ catalog.py", line 62, in index_doc
    index.index_doc(docid, texts)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/app/catalog/ attribute.py", line 144, in index_doc
    return super(AttributeIndex, self).index_doc(docid, value)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/index/text/ textindex.py", line 45, in index_doc
    self.index.index_doc(docid, text)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/index/text/ okapiindex.py", line 225, in index_doc
    count = BaseIndex.index_doc(self, docid, text)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/index/text/ baseindex.py", line 95, in index_doc
    wids = self._lexicon.sourceToWordIds(text)
File "/home/mset/local/Zope-3.3.1/lib/python/zope/index/text/ lexicon.py", line 66, in sourceToWordIds
    for t in last:
TypeError: iteration over non-sequence


Thanks in advance



_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

Reply via email to