summaryrefslogtreecommitdiffstats
path: root/expo/search.py
diff options
context:
space:
mode:
authorsubstantialnoninfringinguser <substantialnoninfringinguser@gmail.com>2009-05-13 05:22:14 +0100
committersubstantialnoninfringinguser <substantialnoninfringinguser@gmail.com>2009-05-13 05:22:14 +0100
commit29984ff15aad9910200c924f7fddf668104bc7c2 (patch)
tree4fec811cdf0fb9329ea4eab95b256ac402202e79 /expo/search.py
parent47604b1db2505d971fed3c1de93a24951a33038c (diff)
downloadtroggle-29984ff15aad9910200c924f7fddf668104bc7c2.tar.gz
troggle-29984ff15aad9910200c924f7fddf668104bc7c2.tar.bz2
troggle-29984ff15aad9910200c924f7fddf668104bc7c2.zip
[svn] Added cave and logbook search, collapsible footer navbar, useless statistics page. Also fixed broken css. Toying with forms but not committing those yet.
Copied from http://cucc@cucc.survex.com/svn/trunk/expoweb/troggle/, rev. 8081 by aaron @ 12/8/2008 4:28 AM
Diffstat (limited to 'expo/search.py')
-rw-r--r--expo/search.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/expo/search.py b/expo/search.py
new file mode 100644
index 0000000..5ec2ce2
--- /dev/null
+++ b/expo/search.py
@@ -0,0 +1,39 @@
+import re
+
+from django.db.models import Q
+
+# search script from http://www.julienphalip.com/blog/2008/08/16/adding-search-django-site-snap/
+
+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 \ No newline at end of file