aboutsummaryrefslogtreecommitdiffstats
path: root/layerindex/simplesearch.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2013-02-19 15:54:43 +0000
committerPaul Eggleton <paul.eggleton@linux.intel.com>2013-02-19 17:22:45 +0000
commit430ae4f90e8953a0f1c91842bb2eb291ab9b92df (patch)
tree19f102279ea00cd1fda502787fdc052f275bce91 /layerindex/simplesearch.py
parentfd600fb716ce46a0f73ca0017f1923fba6cb53ef (diff)
downloadopenembedded-core-contrib-430ae4f90e8953a0f1c91842bb2eb291ab9b92df.tar.gz
Improve recipe search
* Use more traditional GET instead of POST method * Search in pn, summary, description and filename instead of just pn Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Diffstat (limited to 'layerindex/simplesearch.py')
-rw-r--r--layerindex/simplesearch.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/layerindex/simplesearch.py b/layerindex/simplesearch.py
new file mode 100644
index 0000000000..3b2a530716
--- /dev/null
+++ b/layerindex/simplesearch.py
@@ -0,0 +1,39 @@
+# Borrowed from http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snap
+# Copyright 2011 Julien Phalip. All Rights Reserved.
+
+import re
+from django.db.models import Q
+
+def normalize_query(query_string,
+ findterms=re.compile(r'"([^"]+)"|(\S+)').findall,
+ normspace=re.compile(r'\s{2,}').sub):
+ ''' Splits the query string in invidual keywords, getting rid of unecessary spaces
+ and grouping quoted words together.
+ Example:
+
+ >>> normalize_query(' some random words "with quotes " and spaces')
+ ['some', 'random', 'words', 'with quotes', 'and', 'spaces']
+
+ '''
+ return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)]
+
+def get_query(query_string, search_fields):
+ ''' Returns a query, that is a combination of Q objects. That combination
+ aims to search keywords within a model by testing the given search fields.
+
+ '''
+ query = None # Query to search for every search term
+ terms = normalize_query(query_string)
+ for term in terms:
+ or_query = None # Query to search for a given term in each field
+ for field_name in search_fields:
+ q = Q(**{"%s__icontains" % field_name: term})
+ if or_query is None:
+ or_query = q
+ else:
+ or_query = or_query | q
+ if query is None:
+ query = or_query
+ else:
+ query = query & or_query
+ return query