ZPatterns 0-4-2a2 The attribute excludePIs of LinkToParentProviders can be one of three types: It starts off as an empty tuple. When you choose to exclude one or more providers from the parent, it becomes a list. If you choose to exclude no providers from the parent, it becomes a string. When it is a string, the because it has been changed from the default state, but there are no exclusions, the second line of the method _getProviders fails, as it is trying to evaluate string in string. (Providers.py, line 299.) An easy solution is to change the line from this: return filter(lambda x,exclude=self.excludePIs: x.id not in exclude, r) to this: return filter(lambda x,exclude=list(self.excludePIs): x.id not in exclude, r) For a negligible bit of extra efficiency in the case where the link to parent providers' properties haven't been altered, change line 295, from this: excludePIs=() to this: excludePIs=[] This seems like more of a Zope implementation fault: surely a multiple selection property should always be set to a list, even when empty? Patch attached. -- Steve Alexander Software Engineer Cat-Box limited http://www.cat-box.net
*** Providers.py.orig --- Providers.py *************** *** 292,302 **** meta_type='Link to parent Data Plug-ins' __plugin_kind__ = 'Data Plug-in' ! excludePIs=() def _getProviders(self): r=getattr(self.aq_inner.aq_parent.aq_parent,'__allProviders__',()) ! return filter(lambda x,exclude=self.excludePIs: x.id not in exclude, r) def parentPIids(self): r=getattr(self.aq_inner.aq_parent.aq_parent,'__allProviders__',()) --- 292,303 ---- meta_type='Link to parent Data Plug-ins' __plugin_kind__ = 'Data Plug-in' ! excludePIs=[] def _getProviders(self): r=getattr(self.aq_inner.aq_parent.aq_parent,'__allProviders__',()) ! return filter(lambda x,exclude=list(self.excludePIs): ! x.id not in exclude, r) def parentPIids(self): r=getattr(self.aq_inner.aq_parent.aq_parent,'__allProviders__',())