Remove cache from search results
authorverrierj
Mon, 13 Feb 2012 15:47:26 +0100
changeset 563 9beab46d99d3
parent 562 28988fcccad1
child 564 9a9357cf3d58
Remove cache from search results
src/ldt/ldt/ldt_utils/templates/front/front_search_results.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_results.html
src/ldt/ldt/ldt_utils/urls.py
src/ldt/ldt/ldt_utils/views/front.py
src/ldt/ldt/ldt_utils/views/workspace.py
--- a/src/ldt/ldt/ldt_utils/templates/front/front_search_results.html	Mon Feb 13 12:12:04 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/front/front_search_results.html	Mon Feb 13 15:47:26 2012 +0100
@@ -123,7 +123,7 @@
         <li id="result_pagination">
             <p>
             {% if results.has_previous %}
-	            <a class="blue under" href="{% url ldt.ldt_utils.views.front.search_listing %}?page={{ results.previous_page_number }}" title="{% trans 'previous' %}">{% trans "previous" %}</a>
+	            <a class="blue under" href="{% url ldt.ldt_utils.views.front.search_index %}?page={{ results.previous_page_number }}&search={{search}}&field={{field}}" title="{% trans 'previous' %}">{% trans "previous" %}</a>
 	            .
 	        {% endif %}
 	        {% if results.paginator.num_pages > 1 %}
@@ -133,7 +133,7 @@
 	                {% if i|add:'1' == results.number %}
 	                <span class="pink">{{i|add:'1'}}</span>
 	                {% else %}
-	                <a class="blue under" href="{% url ldt.ldt_utils.views.front.search_listing %}?page={{i|add:'1'}}">{{i|add:'1'}}</a>
+	                <a class="blue under" href="{% url ldt.ldt_utils.views.front.search_index %}?page={{i|add:'1'}}&search={{search}}&field={{field}}">{{i|add:'1'}}</a>
 	                {% endif %}
 	                {% if i|add:'1' < results.paginator.num_pages and 1 < results.paginator.num_pages %}
                     {% endif %}
@@ -143,7 +143,7 @@
 	        {% endif %}
 	        {% if results.has_next %}
 	           
-	            <a class="blue under" href="{% url ldt.ldt_utils.views.front.search_listing %}?page={{ results.next_page_number }}" title="{% trans 'next' %}">{% trans "next" %}</a>
+	            <a class="blue under" href="{% url ldt.ldt_utils.views.front.search_index %}?page={{ results.next_page_number }}&search={{search}}&field={{field}}" title="{% trans 'next' %}">{% trans "next" %}</a>
 	        {% endif %}
             </p>
         </li>
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_results.html	Mon Feb 13 12:12:04 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_results.html	Mon Feb 13 15:47:26 2012 +0100
@@ -97,7 +97,7 @@
 <div class="pagination">
     <span class="step-links">
         {% if results.has_previous %}
-            <a href="{% url ldt.ldt_utils.views.workspace.search_listing %}?page={{ results.previous_page_number }}">{% trans "previous" %}</a>
+            <a href="{% url ldt.ldt_utils.views.workspace.search_index %}?page={{ results.previous_page_number }}&search={{search}}&field={{field}}">{% trans "previous" %}</a>
         {% endif %}
 
 		{% if results.paginator.num_pages > 1 %}
@@ -107,7 +107,7 @@
         {% endif %}
 
         {% if results.has_next %}
-            <a href="{% url ldt.ldt_utils.views.workspace.search_listing %}?page={{ results.next_page_number }}">{% trans "next" %}</a>
+            <a href="{% url ldt.ldt_utils.views.workspace.search_index %}?page={{ results.next_page_number }}&search={{search}}&field={{field}}">{% trans "next" %}</a>
         {% endif %}
     </span>
 </div>
--- a/src/ldt/ldt/ldt_utils/urls.py	Mon Feb 13 12:12:04 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/urls.py	Mon Feb 13 15:47:26 2012 +0100
@@ -12,7 +12,6 @@
     url(r'^groups/$', 'views.workspace.groups'),
     url(r'^get_group_projects/$', 'views.group.get_group_projects'),
     url(r'^search/$', 'views.workspace.search_index'),
-    url(r'^searchListing', 'views.workspace.search_listing'),
     url(r'^search/(?P<field>.*)/(?P<query>.*)$', 'views.lignesdetemps.search_index_get'),
     url(r'^searchLdt/(?P<field>.*)/(?P<query>.*)$', 'views.lignesdetemps.search_ldt'),
     url(r'^searchSeg/(?P<field>.*)/(?P<query>.*)$', 'views.lignesdetemps.search_segments'),
@@ -46,7 +45,6 @@
     url(r'^front/player/(?P<content_iri_id>.*)/$', 'views.front.annot_content'),
     url(r'^front/player/(?P<content_iri_id>.*)/(?P<project_id>.*)/(?P<cutting_id>.*)$', 'views.front.annot_content'),
     url(r'^front/search/$', 'views.front.search_index'),
-    url(r'^front/searchListing', 'views.front.search_listing'),
     url(r'^front/medias', 'views.front.all_contents'),
 )
 
--- a/src/ldt/ldt/ldt_utils/views/front.py	Mon Feb 13 12:12:04 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/views/front.py	Mon Feb 13 15:47:26 2012 +0100
@@ -1,13 +1,16 @@
 from django.conf import settings
-from django.contrib.auth.decorators import login_required
 from django.contrib.auth.models import Group, User
+from django.http import HttpResponseRedirect
 from django.core.urlresolvers import reverse
 from django.shortcuts import render_to_response
 from django.template import RequestContext
 from guardian.shortcuts import get_objects_for_group
 from ldt.ldt_utils.models import Content, Project
-from ldt.ldt_utils.views.workspace import search_index as ws_search_index, search_listing as ws_search_listing
+from ldt.ldt_utils.forms import SearchForm
+from ldt.ldt_utils.views.workspace import get_search_results
 from tagging.models import Tag, TaggedItem
+import base64
+
 
 
 def front_home(request):
@@ -119,11 +122,29 @@
 
 
 def search_index(request):
-    return ws_search_index(request, front_template=True)
-
+    language_code = request.LANGUAGE_CODE[:2]
+    
+    page = int(request.GET.get('page', '-1'))        
+    search = request.GET.get('search', '')
+    field = request.GET.get('field', 'all')
+    
+    if page >= 0 and search != '':
+        results, nb = get_search_results(request, search, field, page)
+        
+        return render_to_response('front/front_search_results.html', {'results': results, 'nb_results' : nb, 'search' : search, 'field': field, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))   
+    
+    sform = SearchForm(request.POST)
+    if sform.is_valid():
+        search = sform.cleaned_data["search"]
+        queryStr = base64.urlsafe_b64encode(search.encode('utf8'))
+        field = request.POST["field"]
+                                                   
+        results, nb = get_search_results(request, search, field, 1)            
+            
+        return render_to_response('front/front_search_results.html', {'results': results, 'nb_results' : nb, 'search' : search, 'field': field, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))
+    return HttpResponseRedirect('ldt.ldt_utils.views.front.home')
+    
 
-def search_listing(request):
-    return ws_search_listing(request, front_template=True)
 
 
 def get_content_tags(limit=None, steps=10):
--- a/src/ldt/ldt/ldt_utils/views/workspace.py	Mon Feb 13 12:12:04 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/views/workspace.py	Mon Feb 13 15:47:26 2012 +0100
@@ -1,7 +1,6 @@
 from django.conf import settings
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.models import Group
-from django.core.cache import cache
 from django.core.urlresolvers import reverse#, resolve
 from django.core.paginator import Paginator, InvalidPage, EmptyPage
 from django.http import (HttpResponseRedirect, HttpResponseForbidden )
@@ -150,130 +149,96 @@
     form = SearchForm()
     return render_to_response('ldt/ldt_utils/search_form.html', {'form': form} , context_instance=RequestContext(request))
 
-
-def search_index(request, front_template=False):
+@login_required
+def search_index(request):
+    language_code = request.LANGUAGE_CODE[:2]
+    
+    page = int(request.GET.get('page', '-1'))        
+    search = request.GET.get('search', '')
+    field = request.GET.get('field', 'all')
+    
+    if page >= 0 and search != '':
+        results, nb = get_search_results(request, search, field, page)
+        
+        return render_to_response('ldt/ldt_utils/search_results.html', {'results': results, 'nb_results' : nb, 'search' : search, 'field': field, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))   
+    
         
     sform = SearchForm(request.POST)
     if sform.is_valid():
         search = sform.cleaned_data["search"]
         queryStr = base64.urlsafe_b64encode(search.encode('utf8'))
         field = request.POST["field"]
-        language_code = request.LANGUAGE_CODE[:2]
         
         if request.POST.has_key("ldt_pres"):
             url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.lignesdetemps.search_init", args=[field, queryStr])
             return render_to_response('ldt/ldt_utils/init_ldt_full.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
-        else:
-            results = get_results_with_context(field, search) 
-            
-            # Search results come from published project
-            # We do not apply permissions here since it has to be reached from unlogged users.
-            all_segments = Segment.objects.filter(element_id__in=[e['element_id'] for e in results])
-            all_projects = Project.objects.filter(ldt_id__in=[e['project_id'] for e in results], state=2)
-            all_contents = Content.objects.filter(iri_id__in=[e['iri_id'] for e in results])
-            viewable_projects_id = [p.ldt_id for p in all_projects]
-            
-            complete_results = []           
-            results.sort(key=lambda k: k['iri_id'])
+        else:                                            
+            results, nb = get_search_results(request, search, field, 1)            
             
-            for iri_id, item in groupby(results, itemgetter('iri_id')):
-                content = filter(lambda e: e.iri_id == iri_id, all_contents)[0]
-                if content.description is None:
-                    content.description = ''
-                    
-                all_related_segments = list(item)
-                
-                valid_segments = []
-                for s in all_related_segments:
-                    segment = [seg for seg in all_segments if seg.element_id == s['element_id'] and seg.project_id == s['project_id'] and seg.iri_id == s['iri_id'] and seg.cutting_id == s['decoupage_id'] and seg.ensemble_id == s['ensemble_id'] ][0]
-                    
-                    segment.score = s['score']
-                    segment.lucene_id = s['lucene_id']
-                    segment.context = s['context']
-                    segment.context_tags = s['tags']
-                                        
-                    if not s['project_id']:
-                        segment.project_id = '_'
-                        valid_segments.append(segment)
-                    elif s['project_id'] in viewable_projects_id:
-                        valid_segments.append(segment)
-                
-                # If all segments found belong to unpublished projects or projects
-                # the current user is not allowed to see
-                if not valid_segments:
-                    continue
-                
-                score = sum([seg.score for seg in valid_segments])
-                complete_results.append({
-                                         'list': valid_segments,
-                                         'score': score,
-                                         'content': content,                                         
-                                         })
-                
-      
-            complete_results.sort(key=lambda k: k['score'])
-                                
-            cache.set('complete_results_%s' % request.user.username, complete_results)
-            cache.set('search_%s' % request.user.username, search)
-            cache.set('field_%s' % request.user.username, field)
-
-            paginator = Paginator (complete_results, settings.LDT_RESULTS_PER_PAGE)
-            page = 1
-            
-            try:
-                results = paginator.page(page)
-            except (EmptyPage, InvalidPage):
-                results = paginator.page(paginator.num_pages)
-            
-            results.object_list = highlight_documents(results.object_list, search, field)            
-            
-            if front_template :
-                return render_to_response('front/front_search_results.html', {'results': results, 'nb_results' : paginator.count, 'search' : search, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))
-            else :
-                return render_to_response('ldt/ldt_utils/search_results.html', {'results': results, 'nb_results' : paginator.count, 'search' : search, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))
+            return render_to_response('ldt/ldt_utils/search_results.html', {'results': results, 'nb_results' : nb, 'search' : search, 'field': field, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))
         
     else:
-        if front_template :
-            return HttpResponseRedirect(reverse('ldt.ldt_utils.views.front.front_home'))
-        else :
-            return HttpResponseRedirect(reverse('ldt.ldt_utils.views.workspace.published_project'))
-        
+        return HttpResponseRedirect(reverse('ldt.ldt_utils.views.workspace.published_project'))
 
-def search_listing(request, front_template=False):
-    if not cache.get('complete_results_%s' % request.user.username):
-        if front_template :
-            return HttpResponseRedirect(reverse('ldt.ldt_utils.views.front.front_home'))
-        else :
-            return HttpResponseRedirect(reverse('ldt.ldt_utils.views.workspace.published_project'))
-     
-    complete_results = cache.get('complete_results_%s' % request.user.username)
-    search = cache.get('search_%s' % request.user.username)
-    field = cache.get('field_%s' % request.user.username)
-    paginator = Paginator(complete_results, settings.LDT_RESULTS_PER_PAGE)
-    language_code = request.LANGUAGE_CODE[:2]
-
-    try:
-        page = int(request.GET.get('page', '1'))
-    except ValueError:
-        page = 1
-
+        
+def get_search_results(request, search, field, page):
+    results = get_results_with_context(field, search) 
+            
+    all_segments = Segment.objects.filter(element_id__in=[e['element_id'] for e in results])
+    all_projects = Project.objects.filter(ldt_id__in=[e['project_id'] for e in results], state=2)
+    all_contents = Content.objects.filter(iri_id__in=[e['iri_id'] for e in results])
+    viewable_projects_id = [p.ldt_id for p in all_projects]
+           
+    complete_results = []           
+    results.sort(key=lambda k: k['iri_id'])
+           
+    for iri_id, item in groupby(results, itemgetter('iri_id')):
+        content = filter(lambda e: e.iri_id == iri_id, all_contents)[0]
+        if content.description is None:
+            content.description = ''
+                    
+            all_related_segments = list(item)
+                
+            valid_segments = []
+            for s in all_related_segments:
+                segment = [seg for seg in all_segments if seg.element_id == s['element_id'] and seg.project_id == s['project_id'] and seg.iri_id == s['iri_id'] and seg.cutting_id == s['decoupage_id'] and seg.ensemble_id == s['ensemble_id'] ][0]
+                    
+                segment.score = s['score']
+                segment.lucene_id = s['lucene_id']
+                segment.context = s['context']
+                segment.context_tags = s['tags']
+                                        
+                if not s['project_id']:
+                    segment.project_id = '_'
+                    valid_segments.append(segment)
+                elif s['project_id'] in viewable_projects_id:
+                    valid_segments.append(segment)
+                
+            # If all segments found belong to unpublished projects or projects
+            # the current user is not allowed to see
+            if not valid_segments:
+                continue
+                
+            score = sum([seg.score for seg in valid_segments])
+            complete_results.append({
+                                     'list': valid_segments,
+                                     'score': score,
+                                     'content': content,                                         
+                                     })                
+      
+    complete_results.sort(key=lambda k: k['score'])
+    
+    paginator = Paginator (complete_results, settings.LDT_RESULTS_PER_PAGE)
+    
     try:
         results = paginator.page(page)
     except (EmptyPage, InvalidPage):
         results = paginator.page(paginator.num_pages)
-    
+            
     results.object_list = highlight_documents(results.object_list, search, field)
-
-    if front_template :
-        return render_to_response('front/front_search_results.html', {'results': results, 'nb_results' : paginator.count, 'search' : search, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))
-    else :
-        return render_to_response('ldt/ldt_utils/search_results.html', {'results': results, 'nb_results' : paginator.count, 'search' : search, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))   
-  
-
-
-
-
     
+    return results, len(complete_results)
+   
 
 def loading(request): 
     return render_to_response('ldt/ldt_utils/loading.html', context_instance=RequestContext(request))