From 5f3f859a78a658aca73f93e9432ea5e30ad0d7eb Mon Sep 17 00:00:00 2001 From: David Convent Date: Sat, 13 Apr 2013 15:58:18 +0200 Subject: [PATCH] thesaurus search (autocomplete) now has sorted results --- .../dms/thesaurus/browser/thesaurusview.py | 34 +++++++++++++++---- src/collective/dms/thesaurus/vocabulary.py | 2 +- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/collective/dms/thesaurus/browser/thesaurusview.py b/src/collective/dms/thesaurus/browser/thesaurusview.py index e88c396..d831ad8 100644 --- a/src/collective/dms/thesaurus/browser/thesaurusview.py +++ b/src/collective/dms/thesaurus/browser/thesaurusview.py @@ -105,7 +105,7 @@ class ListKeywordsView(BrowserView): ) # path={'query': path,'depth': 1}) keywords = [x.getObject() for x in results] def cmp_keyword(x, y): - return cmp(x.title, y.title) + return cmp(x.title.lower(), y.title.lower()) keywords.sort(cmp_keyword) #keyword_ids = [x.id for x in keywords] _c = SimpleVocabulary.createTerm @@ -117,15 +117,37 @@ class ListKeywordsView(BrowserView): from plone.i18n.normalizer.fr import normalizer self.request.response.setHeader('Content-type', 'text/plain') - query_terms = [normalizer.normalize(x).lower() for x in unicode(self.request.form.get('q'), 'utf-8').split()] + query_string = unicode(self.request.form.get('q'), 'utf-8') + query_terms = [normalizer.normalize(x) for x in query_string.split()] - r = [] + startswith = [] + intermediate = [] + other = [] + q = query_string.lower() for value in self.get_vocabulary().by_token.values(): for term in query_terms: if not term in value.title.lower(): break else: - r.append('%s|%s' % (value.title, value.value)) - if len(r) > 30: - break + item = (value.title.lower(), '%s|%s' % (value.title, value.value)) + added = False + if value.title.lower().startswith(q): + startswith.append(item) + added = True + for te in value.title.split(): + if te.lower().startswith(q): + intermediate.append(item) + added = True + break; + else: + other.append(item) + startswith.sort() + intermediate.sort() + other.sort() + r = [] + for l in (startswith, intermediate, other): + for t, e in l: + r.append(e) + if len(r) > 29: + return '\n'.join(r) return '\n'.join(r) diff --git a/src/collective/dms/thesaurus/vocabulary.py b/src/collective/dms/thesaurus/vocabulary.py index 0c950b4..9eb293e 100644 --- a/src/collective/dms/thesaurus/vocabulary.py +++ b/src/collective/dms/thesaurus/vocabulary.py @@ -37,7 +37,7 @@ class InternalThesaurusSource(object): path={'query': path,'depth': 1}) keywords = [x.getObject() for x in results] def cmp_keyword(x, y): - return cmp(x.title, y.title) + return cmp(x.title.lower(), y.title.lower()) keywords.sort(cmp_keyword) #keyword_ids = [x.id for x in keywords] _c = SimpleVocabulary.createTerm