From a8cf5584204d77bd3f234fe579844ca84bb3558d Mon Sep 17 00:00:00 2001 From: bnewbold Date: Mon, 2 May 2011 21:41:28 -0400 Subject: basic json keyword search --- piccast/feeds/models.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'piccast/feeds/models.py') diff --git a/piccast/feeds/models.py b/piccast/feeds/models.py index cbc12e4..0ec24f1 100644 --- a/piccast/feeds/models.py +++ b/piccast/feeds/models.py @@ -126,3 +126,42 @@ class PicSet(models.Model): } +# The below search code comes from Julien Phalip + +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 + -- cgit v1.2.3