[open-ils-commits] r62 - in servres/trunk/conifer: syrup templates

svn at svn.open-ils.org svn at svn.open-ils.org
Thu Nov 27 21:45:23 EST 2008


Author: artunit
Date: 2008-11-27 21:45:22 -0500 (Thu, 27 Nov 2008)
New Revision: 62

Modified:
   servres/trunk/conifer/syrup/urls.py
   servres/trunk/conifer/syrup/views.py
   servres/trunk/conifer/templates/master.xhtml
Log:


Modified: servres/trunk/conifer/syrup/urls.py
===================================================================
--- servres/trunk/conifer/syrup/urls.py	2008-11-27 14:50:42 UTC (rev 61)
+++ servres/trunk/conifer/syrup/urls.py	2008-11-28 02:45:22 UTC (rev 62)
@@ -5,6 +5,7 @@
     (r'^course/$', 'my_courses'),
     (r'^opencourse/$', 'open_courses'),
     (r'^join/$', 'join_course'),
+    (r'^search/$', 'search'),
     (r'^instructors/$', 'instructors'),
     (r'^course/(?P<course_id>\d+)/$', 'course_detail'),
     (r'^course/(?P<course_id>\d+)/item/(?P<item_id>\d+)/$', 'item_detail'),

Modified: servres/trunk/conifer/syrup/views.py
===================================================================
--- servres/trunk/conifer/syrup/views.py	2008-11-27 14:50:42 UTC (rev 61)
+++ servres/trunk/conifer/syrup/views.py	2008-11-28 02:45:22 UTC (rev 62)
@@ -6,6 +6,8 @@
 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 @@
     """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))
+

Modified: servres/trunk/conifer/templates/master.xhtml
===================================================================
--- servres/trunk/conifer/templates/master.xhtml	2008-11-27 14:50:42 UTC (rev 61)
+++ servres/trunk/conifer/templates/master.xhtml	2008-11-28 02:45:22 UTC (rev 62)
@@ -29,7 +29,7 @@
         -->
       <div id="header">
         <div id="search">
-            <form method="get" action="search">
+            <form method="get" action="/syrup/search">
             <input id="q" name="q" maxlength="100" size="25" type="text" 
                 value="search..." onblur="if(this.value=='') this.value='search...';" 
                 onfocus="if(this.value=='search...') this.value='';"/>



More information about the open-ils-commits mailing list