diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2013-02-19 15:54:43 +0000 |
---|---|---|
committer | Paul Eggleton <paul.eggleton@linux.intel.com> | 2013-02-19 17:22:45 +0000 |
commit | 430ae4f90e8953a0f1c91842bb2eb291ab9b92df (patch) | |
tree | 19f102279ea00cd1fda502787fdc052f275bce91 /layerindex/simplesearch.py | |
parent | fd600fb716ce46a0f73ca0017f1923fba6cb53ef (diff) | |
download | openembedded-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.py | 39 |
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 |