def getItems(self): context = self.context if self._items is not None: return self._items titles = list() self._items = list() catalog = getToolByName(context, "portal_catalog") path = "/".join(context.getPhysicalPath()) for brain in catalog(portal_type="dmskeyword", path={"query": path, "depth": 1}): obj = brain.getObject() normalized = normalizer.normalize(obj.title).lower() if normalized in titles: continue self._items.append((normalized, obj.title, obj.id)) titles.append(normalized) for equiv in obj.equivs or []: normalized = normalizer.normalize(equiv).lower() if normalized in titles: continue self._items.append((normalized, equiv, obj.id)) def cmp_keyword(x, y): return cmp(x[0].lower(), y[0].lower()) self._items.sort(cmp_keyword) return self._items
def __call__(self): self.request.response.setHeader("Content-type", "text/plain") query_string = unicode(self.request.form.get("q"), "utf-8") query_terms = [normalizer.normalize(x) for x in query_string.split()] startswith = [] intermediate = [] other = [] q = query_string.lower() for normalized, title, id in self.getItems(): for term in query_terms: if not term in title.lower(): break else: item = "%s|%s" % (title, id) if title.lower().startswith(q): startswith.append((normalized, item)) continue for word in title.split(): if word.lower().startswith(q): intermediate.append((normalized, item)) continue other.append((normalized, item)) startswith.sort() intermediate.sort() other.sort() result = list() for _list in (startswith, intermediate, other): for item in _list: result.append(item[1]) if len(result) > 29: return "\n".join(result) return "\n".join(result)