<div dir="ltr"><div><div><div><div>Hi,<br><br></div>I try to implement a local search engine product with Catalog. For this, I have followed the "Indexing and searching" part from "Web component Development with Zope3" book.<br>

<br></div>My issue occurs when I add the product in ZMI ("A system error occurred") with log :<br><br>ERROR SiteError <a href="https://site.com/@@contents.html" target="_blank">https://site.com/@@contents.html</a><br>
...<br>......<br>
 File "/usr/lib/python2.4/site-packages/zope/tales/expressions.py", line 217, in __call__<br>    return self._eval(econtext)<br>  File "/usr/lib/python2.4/site-packages/zope/tales/expressions.py", line 211, in _eval<br>

    return ob()<br>  File "/usr/lib/python2.4/site-packages/zope/app/container/browser/contents.py", line 80, in listContentInfo<br>    self.addObject()<br>  File "/usr/lib/python2.4/site-packages/zope/app/container/browser/contents.py", line 245, in addObject<br>

    adding.action(request['type_name'], new)<br>  File "/usr/lib/python2.4/site-packages/zope/app/container/browser/adding.py", line 142, in action<br>    content = factory()<br>  File "/usr/lib/python2.4/site-packages/zope/component/factory.py", line 37, in __call__<br>

    return self._callable(*args, **kw)<br><b>TypeError: __init__() takes exactly 3 arguments (1 given)</b><br><br></div>Here are the different sources :<br><br></div>__init__.py :<br><br>----------------------------------------------------------------------<br>

<br><div>from interfaces import ISearchz<br>from Searchz import Searchz, QueryPage<br><div><br>----------------------------------------------------------------------<br><br></div><div>Searchz.py :<br></div><div><br>----------------------------------------------------------------------<br>

<br>from zope.component import getUtility, queryMultiAdapter<br>from zope.interface import implements<br>from zope.publisher.browser import BrowserPage<br>from zope.dublincore.interfaces import IZopeDublinCore<br>from zope.index.text.interfaces import ISearchableText<br>

from zope.traversing.browser import absoluteURL<br>from zope.app.catalog.interfaces import ICatalog<br>from zope.app.pagetemplate import ViewPageTemplateFile<br>from interfaces import ISearchz<br><br>class Searchz(BrowserPage):<br>

      implements(ISearchz)<br>      def update(self, query):<br>          catalog = getUtility(ICatalog)<br>          self.results = catalog.searchResults(fulltext=query)<br><br>      render = ViewPageTemplateFile ('<a href="http://search.pt" target="_blank">search.pt</a>')<br>

<br>      def __call__(self, query):<br>          self.update(query)<br>          return self.render()<br><br>      def getResultsInfo(self):<br>          for obj in self.results:<br>              icon = queryMultiAdapter((obj, self.request), name='zmi_icon')<br>

<br>          if icon is not None:<br>             icon = icon()<br><br>          title = None<br>          dc = IZopeDublinCore(obj, None)<br><br>          if dc is not None:<br>             title = dc.title<br>             text = ISearchableText(obj).getSearchableText()<br>

<br>          if len(text) > 100:<br>             text = text[:97] + u'...'<br><br>          yield {'icon': icon, 'title': title, 'text': text,<br>                 'absolute_url': absoluteURL(obj, self.request)}<br>

<br>class QueryPage(BrowserPage):<br>      template = ViewPageTemplateFile('<a href="http://query.pt" target="_blank">query.pt</a>')<br>      count = 0<br>      total = 0<br>      def __call__(self):<br>          if "UPDATE_SUBMIT" in self.request.form:<br>

              d = "delete_first" in self.request.form<br>              self.count, self.total = self.context.update(delete=d)<br>          return self.template()<br><br>----------------------------------------------------------------------<br>

<br></div><div>creationCatalog.py :<br></div><div><br>from zope.component import adapter<br>from zope.app.intid.interfaces import IIntIds<br>from zope.app.intid import IntIds<br>from zope.app.catalog.interfaces import ICatalog<br>

from zope.app.catalog.catalog import Catalog<br>from zope.app.catalog.text import TextIndex<br>from zope.app.pagetemplate import ViewPageTemplateFile<br>from zope.app.container.interfaces import IObjectAddedEvent<br>from interfaces import ISearchz<br>

<br>@adapter(ISearchz, IObjectAddedEvent)<br>def creationCatalog(event):<br>      sm = event.object.getSiteManager()<br>      intids = IntIds()<br>      sm['intids'] = intids<br>      sm.registerUtility(intids, IIntIds)<br>

<br>      catalog = Catalog()<br>      sm['catalog'] = catalog<br>      sm.registerUtility(catalog, ICatalog)<br><br>      fulltext = TextIndex(<br>          interface=ISearchableText,<br>          field_name='getSearchableText',<br>

          field_callable=True<br>          )<br>      catalog[u'fulltext'] = fulltext<br><br>----------------------------------------------------------------------<br><br></div><div>interfaces.py :<br><br>----------------------------------------------------------------------<br>

<br>from zope.interface import Interface<br>from zope.schema import Text, TextLine, Int<br>from zope.app.container.constraints import ItemTypePrecondition<br>from zope.app.container.interfaces import IContainer<br><br>class ISearchz(Interface):<br>

    def update():<br>        """<br>        update catalog<br>        """<br>    def getResultsInfo():<br>        """ <br>        query for searching in catalog<br>        """<br>

    def __setitem__(key, value):<br>        """ <br>        add page<br>        """<br>        __setitem__.precondition = ItemTypePrecondition(ISearchz)<br><br>----------------------------------------------------------------------<br>

<br></div><div>and configure.zcml :<br><br>----------------------------------------------------------------------<br><br><configure xmlns="<a href="http://namespaces.zope.org/zope" target="_blank">http://namespaces.zope.org/zope</a>"<br>

    xmlns:browser="<a href="http://namespaces.zope.org/browser" target="_blank">http://namespaces.zope.org/browser</a>"<br>    i18n_domain="searchz"><br><br>  <interface<br>      interface=".interfaces.ISearchz"<br>

      type="zope.app.content.interfaces.IContentType" /><br><br>  <class<br>      class=".Searchz"><br>    <implements<br>        interface=".interfaces.ISearchz" /><br>    <implements<br>

        interface="zope.annotation.interfaces.IAttributeAnnotatable" /><br>    <factory<br>        id="searchz.Searchz"<br>        title="Search Engine"<br>        description="Search Engine" /><br>

    <require<br>        permission="zope.Public"<br>        interface=".interfaces.ISearchz" /><br>    <require<br>        permission="zope.ManageContent"<br>        set_schema=".interfaces.ISearchz" /><br>

  </class><br><br>  <browser:icon name="zmi_icon"<br>      for=".interfaces.ISearchz"<br>      file="search.gif" /><br><br>  <browser:addMenuItem<br>      class=".Searchz"<br>

      title="Search Engine"<br>      description="Search Engine"<br>      permission="zope.ManageContent" /><br><br>  <browser:containerViews<br>      for=".interfaces.ISearchz"<br>

      index="zope.View"<br>      contents="zope.View"<br>      add="zope.ManageContent" /><br><br>  <browser:addform<br>      label="Add search engine"<br>      name="addsearch.html"<br>

      schema=".interfaces.ISearchz"<br>      content_factory="searchz.Searchz"<br>      permission="zope.ManageContent" /><br><br>  <browser:page<br>      for=".interfaces.ISearchz"<br>

      name="query.html"<br>      class=".QueryPage"<br>      permission="zope.ManageContent"<br>      menu="zmi_views"<br>      title="Update Catalog" /><br><br><b><subscriber handler=".creationCatalog.creationCatalog" /></b><br>

<br></configure><br><br></div><div>----------------------------------------------------------------------<br><br></div><div>Could you see what's wrong at first sight ?<br><br></div><div>Thanks<br></div><div><br>
<br>


</div></div></div>