From f7224d80f803ec553ff7c291d892f130a6c11098 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 12 Jan 2014 17:15:00 +0100 Subject: [PATCH] ignore searches for certaing types if no or to short search text is given, using option loops.expert.search.minlen_text --- expert/browser/search.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/expert/browser/search.py b/expert/browser/search.py index 307747c..f4c4548 100644 --- a/expert/browser/search.py +++ b/expert/browser/search.py @@ -27,6 +27,7 @@ from zope.cachedescriptors.property import Lazy from zope.traversing.api import getName, getParent, traverse from cybertools.browser.form import FormController +from cybertools.meta.interfaces import IOptions from cybertools.stateful.interfaces import IStateful, IStatesDefinition from loops.browser.common import BaseView from loops.browser.concept import ConceptView @@ -131,6 +132,32 @@ class Search(ConceptView): 'dojo.require("dojox.data.QueryReadStore");') cm.register('js-execute', jsCall, jsCall=jsCall) + def getTypes(self): + """ Return a list of type tokens from the request after checking if + they fulfill certain requirements, e.g. on the length of the + name (title, text) criteria given. + """ + types = self.request.form.get('searchType') + title = self.request.form.get('name') or '' + if title.endswith('*'): + title = title[:-1] + if not isinstance(types, (list, tuple)): + types = [types] + if 'loops:concept:*' in types: + types.remove('loops:concept:*') + for t in list(types): + typeName = t.split(':')[-1] + if typeName == '*': + continue + type = self.conceptManager.get(typeName.lower()) + if type is not None: + opt = IOptions(adapted(type)) + minlen = opt('loops.expert.search.minlen_text') + if minlen: + if len(title) < int(minlen[0]): + types.remove(t) + return types + def listConcepts(self, filterMethod=None): """ Used for dijit.FilteringSelect. """ @@ -141,8 +168,10 @@ class Search(ConceptView): title = None types = request.get('searchType') data = [] - if title or (types and types not in - (u'loops:concept:*', 'loops:concept:account')): + types = self.getTypes() + if title or types: + #if title or (types and types not in + # (u'loops:concept:*', 'loops:concept:account')): if title is not None: title = title.replace('(', ' ').replace(')', ' ').replace(' -', ' ') #title = title.split(' ', 1)[0]