aboutsummaryrefslogtreecommitdiffstats
path: root/piccast/feeds/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'piccast/feeds/models.py')
-rw-r--r--piccast/feeds/models.py39
1 files changed, 39 insertions, 0 deletions
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
+