loops/search
helmutm ff8069124b some minor improvements on editing and searching
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1319 fd906abe-77d9-0310-91a1-e0d9ade77398
2006-08-20 17:31:51 +00:00
..
__init__.py added loops.search package 2006-08-04 12:14:13 +00:00
browser.py search and inline editing improved 2006-08-19 21:00:00 +00:00
configure.zcml more on inline editing with dojo 2006-08-13 21:59:01 +00:00
README.txt search and inline editing improved 2006-08-19 21:00:00 +00:00
search.pt some minor improvements on editing and searching 2006-08-20 17:31:51 +00:00
tests.py added loops.search package 2006-08-04 12:14:13 +00:00

===================================================================
loops.search - Provide search functionality for the loops framework
===================================================================

  ($Id$)


Let's do some basic set up

  >>> from zope.app.testing.setup import placefulSetUp, placefulTearDown
  >>> site = placefulSetUp(True)

  >>> from zope import component, interface
  >>> from zope.interface import implements

and setup a simple loops site with a concept manager and some concepts
(with all the type machinery, what in real life is done via standard
ZCML setup):

  >>> from cybertools.relation.interfaces import IRelationRegistry
  >>> from cybertools.relation.registry import DummyRelationRegistry
  >>> relations = DummyRelationRegistry()
  >>> component.provideUtility(relations, IRelationRegistry)

  >>> from loops.type import ConceptType, TypeConcept
  >>> from loops.interfaces import ITypeConcept
  >>> component.provideAdapter(ConceptType)
  >>> component.provideAdapter(TypeConcept)

  >>> from loops import Loops
  >>> loopsRoot = site['loops'] = Loops()

  >>> from loops.setup import SetupManager
  >>> setup = SetupManager(loopsRoot)
  >>> concepts, resources, views = setup.setup()
  >>> typeConcept = concepts['type']

  >>> from loops.concept import Concept
  >>> query = concepts['query'] = Concept(u'Query')
  >>> topic = concepts['topic'] = Concept(u'Topic')
  >>> for c in (query, topic): c.conceptType = typeConcept

In addition we create a concept that holds the search page and a node
(page) that links to this concept:

  >>> search = concepts['search'] = Concept(u'Search')
  >>> search.conceptType = query

  >>> from loops.view import Node
  >>> page = views['page'] = Node('Search Page')
  >>> page.target = search

Now we are ready to create a search view object:

  >>> from zope.publisher.browser import TestRequest
  >>> from loops.search.browser import Search
  >>> searchView = Search(search, TestRequest())

The search view provides values for identifying the search form itself
and the parameter rows; the rowNum is auto-incremented, so it should be
accessed exactly once per row:

  >>> searchView.rowNum
  1
  >>> searchView.rowNum
  2

To execute the search in the context of a node we have to set up a node
view for our page. The submitReplacing method returns a JavaScript call
that will replace the results part on the search page; as this registers
the dojo library with the view's controller we also have to supply
a controller attribute for the search view.

  >>> from loops.browser.node import NodeView
  >>> request = TestRequest()
  >>> pageView = NodeView(page, request)

  >>> from cybertools.browser.liquid.controller import Controller
  >>> searchView.controller = Controller(searchView, request)

  >>> searchView.submitReplacing('1.results', '1.search.form', pageView)
  'return submitReplacing("1.results", "1.search.form",
       "http://127.0.0.1/loops/views/page/.target19/@@searchresults.html")'

The searchresults.html view, i.e. the SearchResults view class provides the
result set of the search via its `results` property.

  >>> from loops.search.browser import SearchResults
  >>> form = {'search.2.title': 'yes', 'search.2.text': u'foo' }
  >>> request = TestRequest(form=form)
  >>> resultsView = SearchResults(page, request)

Before accessing the `results` property we have to prepare a catalog.

  >>> from zope.app.catalog.interfaces import ICatalog
  >>> class DummyCat(object):
  ...     implements(ICatalog)
  ...     def searchResults(self, **criteria):
  ...         return []
  >>> component.provideUtility(DummyCat())

  >>> list(resultsView.results)
  []