From d7e9a87432fc5448f719c4778e514639996cd92d Mon Sep 17 00:00:00 2001 From: artunit Date: Fri, 28 Nov 2008 02:45:22 +0000 Subject: [PATCH] git-svn-id: svn://svn.open-ils.org/ILS-Contrib/servres/trunk@62 6d9bc8c9-1ec2-4278-b937-99fde70a366f --- conifer/syrup/urls.py | 1 + conifer/syrup/views.py | 55 ++++++++++++++++++++++++++++++++++++++++++ conifer/templates/master.xhtml | 2 +- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/conifer/syrup/urls.py b/conifer/syrup/urls.py index 255e67a..81acbb6 100644 --- a/conifer/syrup/urls.py +++ b/conifer/syrup/urls.py @@ -5,6 +5,7 @@ urlpatterns = patterns('conifer.syrup.views', (r'^course/$', 'my_courses'), (r'^opencourse/$', 'open_courses'), (r'^join/$', 'join_course'), + (r'^search/$', 'search'), (r'^instructors/$', 'instructors'), (r'^course/(?P\d+)/$', 'course_detail'), (r'^course/(?P\d+)/item/(?P\d+)/$', 'item_detail'), diff --git a/conifer/syrup/views.py b/conifer/syrup/views.py index 3412faa..a9f72b6 100644 --- a/conifer/syrup/views.py +++ b/conifer/syrup/views.py @@ -6,6 +6,8 @@ from django.contrib.auth import authenticate, login, logout import conifer.genshi_support as g from conifer.syrup import models from django.contrib.auth.models import User +import re +from django.db.models import Q #------------------------------------------------------------ @@ -102,3 +104,56 @@ def _heading_detail(request, item): """Display a heading. Show the subitems for this heading.""" return g.render('item_heading_detail.xhtml', item=item) + +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 + +def search(request): + ''' Need to work on this + + ''' + query_string = '' + found_entries = None + if ('q' in request.GET) and request.GET['q'].strip(): + query_string = request.GET['q'] + + entry_query = get_query(query_string, ['code', 'name',]) + + #found_entries = Entry.objects.filter(entry_query).order_by('-pub_date') + found_entries = models.Term.objects.filter(entry_query).order_by('-pub_date') + + return render_to_response('search/search_results.html', + { 'query_string': query_string, 'found_entries': found_entries }, + context_instance=RequestContext(request)) + diff --git a/conifer/templates/master.xhtml b/conifer/templates/master.xhtml index df7ce76..fd80839 100644 --- a/conifer/templates/master.xhtml +++ b/conifer/templates/master.xhtml @@ -29,7 +29,7 @@ app_name = 'Syrup E-Reserve System' -->