diff options
author | substantialnoninfringinguser <substantialnoninfringinguser@gmail.com> | 2009-05-13 05:22:14 +0100 |
---|---|---|
committer | substantialnoninfringinguser <substantialnoninfringinguser@gmail.com> | 2009-05-13 05:22:14 +0100 |
commit | 29984ff15aad9910200c924f7fddf668104bc7c2 (patch) | |
tree | 4fec811cdf0fb9329ea4eab95b256ac402202e79 /expo/search.py | |
parent | 47604b1db2505d971fed3c1de93a24951a33038c (diff) | |
download | troggle-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.py | 39 |
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 |