Added a page to display search results
authorverrierj
Wed, 14 Sep 2011 16:48:51 +0200
changeset 176 a88714473302
parent 175 d5d2439e2503
child 177 32fbed79d3a1
Added a page to display search results
src/ldt/ldt/indexation/__init__.py
src/ldt/ldt/ldt_utils/contentindexer.py
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_results.html
src/ldt/ldt/ldt_utils/urls.py
src/ldt/ldt/ldt_utils/utils.py
src/ldt/ldt/ldt_utils/views.py
src/ldt/ldt/settings.py
web/ldtplatform/config.py.tmpl
--- a/src/ldt/ldt/indexation/__init__.py	Tue Sep 13 11:02:16 2011 +0200
+++ b/src/ldt/ldt/indexation/__init__.py	Wed Sep 14 16:48:51 2011 +0200
@@ -10,6 +10,40 @@
 ANALYZER.addAnalyzer("abstract", lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT))
 ANALYZER.addAnalyzer("all", lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT))
 
+
+def get_results_with_context(field, query):
+    res = get_results_list(field, query)
+    analyzer = lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT)
+    searcher = get_searcher()
+    formatter = lucene.SimpleHTMLFormatter('<span class="highlight">', '</span>')
+    query = get_query_parser(field).parse(query)
+    highlighter = lucene.Highlighter(formatter, lucene.QueryScorer (query))
+    contexts = []
+    
+    for i in res:
+        doc = searcher.doc(i.doc)  
+        ids = {"iri_id":doc.get("iri_id"), "ensemble_id":doc.get("ensemble_id"), "decoupage_id":doc.get("decoupage_id"), "element_id":doc.get("element_id"), "project_id":doc.get("project_id")}     
+        segment_title = doc.getField('title').stringValue()
+        
+        text = doc.getField(field).stringValue()
+        ts = analyzer.tokenStream("body", lucene.StringReader(text))
+        context = highlighter.getBestFragments(ts, text, settings.LDT_MAX_FRAGMENT_PER_SEARCH, "...")
+        
+        ids['context'] = context
+        ids['segment_title'] = segment_title
+        contexts.append(ids)    
+    
+    searcher.close()
+    return contexts
+
+def get_results_list(field, query):
+    indexSearcher = get_searcher()
+    queryParser = get_query_parser(field)
+    queryObj = queryParser.parse(query)
+    hits = indexSearcher.search(queryObj, settings.LDT_MAX_SEARCH_NUMBER)
+    
+    return hits.scoreDocs
+
 def get_writer(new=False):
     lucene.getVMEnv().attachCurrentThread()
     return lucene.IndexWriter(STORE, ANALYZER, new, lucene.IndexWriter.MaxFieldLength.UNLIMITED)
@@ -22,3 +56,7 @@
     queryParser = lucene.QueryParser(lucene.Version.LUCENE_30, field, lucene.FrenchAnalyzer(lucene.Version.LUCENE_30))
     queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND)
     return queryParser
+
+
+
+
--- a/src/ldt/ldt/ldt_utils/contentindexer.py	Tue Sep 13 11:02:16 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/contentindexer.py	Wed Sep 14 16:48:51 2011 +0200
@@ -98,10 +98,10 @@
                 doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
                 doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
                 doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))                        
-                doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
-                doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
-                doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
-                doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                doc.add(lucene.Field("tags", tags, lucene.Field.Store.YES, lucene.Field.Index.ANALYZED))
+                doc.add(lucene.Field("title", title, lucene.Field.Store.YES, lucene.Field.Index.ANALYZED))
+                doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.YES, lucene.Field.Index.ANALYZED))
+                doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.YES, lucene.Field.Index.ANALYZED))
 
                 seg = Segment(content=content,
                               iri_id=content.iri_id,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_results.html	Wed Sep 14 16:48:51 2011 +0200
@@ -0,0 +1,30 @@
+{% extends "ldt/ldt_base.html" %}
+{% load i18n %}
+
+{% block css_import %}
+    {{ block.super }}
+    <link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}css/workspace.css" />
+{% endblock %}
+
+{% block content %}
+
+{% if msg %}
+{{ msg }}
+{% else %}
+
+	{% trans "Results for " %} <b> {{ search }}</b> :
+	
+	{% autoescape off %}
+	<ul>
+	{% for res in results %}
+		<li>
+			<a href="{% url ldt.ldt_utils.views.display_highlighted_seg res.project_id res.iri_id res.ensemble_id res.decoupage_id res.element_id%}">{{ res.segment_title }}</a><br />
+			{{ res.context }}<br />
+		</li>
+	{% endfor %}
+	</ul>
+	{% endautoescape %}
+
+{% endif %}
+
+{% endblock %}
\ No newline at end of file
--- a/src/ldt/ldt/ldt_utils/urls.py	Tue Sep 13 11:02:16 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/urls.py	Wed Sep 14 16:48:51 2011 +0200
@@ -35,6 +35,7 @@
     url(r'^segmentInit/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.init_segment'),
     url(r'^segmentLdt/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.ldt_segment'),
     url(r'^segmentHighlight/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.highlight_segment'),
+    url(r'^displayHighligtedSegment/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.display_highlighted_seg'),
 )
 
 urlpatterns += patterns('',
--- a/src/ldt/ldt/ldt_utils/utils.py	Tue Sep 13 11:02:16 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/utils.py	Wed Sep 14 16:48:51 2011 +0200
@@ -1,6 +1,6 @@
 from copy import deepcopy
 from django.conf import settings
-from ldt.indexation import get_searcher, get_query_parser
+from ldt.indexation import get_searcher, get_query_parser, get_results_list
 import datetime
 import django.core.urlresolvers
 import lxml.etree
@@ -39,12 +39,10 @@
 
     def query(self, field, query):
         indexSearcher = get_searcher()
-        queryParser = get_query_parser(field)
-        queryObj = queryParser.parse(query)
-        hits = indexSearcher.search(queryObj, settings.LDT_MAX_SEARCH_NUMBER)
+        hits = get_results_list(field, query)
     
         res = []
-        for hit in hits.scoreDocs:
+        for hit in hits:
             doc = indexSearcher.doc(hit.doc)
             res.append({"iri_id":doc.get("iri_id"), "ensemble_id":doc.get("ensemble_id"), "decoupage_id":doc.get("decoupage_id"), "element_id":doc.get("element_id"), "project_id":doc.get("project_id")})
         indexSearcher.close()
@@ -52,6 +50,7 @@
 
     def query_all(self, query):        
         return self.query("all", query)
+        
 
 class LdtUtils(object):
     
--- a/src/ldt/ldt/ldt_utils/views.py	Tue Sep 13 11:02:16 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/views.py	Wed Sep 14 16:48:51 2011 +0200
@@ -7,6 +7,7 @@
 from django.forms.util import ErrorList
 from django.http import (HttpResponse, HttpResponseRedirect,
     HttpResponseForbidden, HttpResponseServerError)
+from ldt.indexation import get_results_with_context
 from django.shortcuts import (render_to_response, get_object_or_404,
     get_list_or_404)
 from django.template import RequestContext
@@ -240,22 +241,23 @@
         language_code = request.LANGUAGE_CODE[:2]
         
         if request.POST.has_key("ldt_pres"):
-            ldt_pres = True
+            url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.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:
-            ldt_pres = False
-        
-        url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.search_init", args=[field, queryStr])
-        
-        # For the moment, we always display the results in a regular LDT template
-        if ldt_pres :
-            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 :
-            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))
+            results = get_results_with_context(field, search)
+            return render_to_response('ldt/ldt_utils/search_results.html', {'results': results, '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:
-        resp = HttpResponse()
-        resp.write("<html><head></head><body>Error : No result</body></html>");
-        return resp
+        msg = _("Please enter valid keywords.")
+        return render_to_response('ldt/ldt_utils/search_results.html', {'msg' : msg}, context_instance=RequestContext(request))
 
+def display_highlighted_seg(request, project_id, content_id, ensemble_id, cutting_id, segment_id):
+    
+    url = settings.WEB_URL + reverse("ldt.ldt_utils.views.init_segment", args=[project_id, content_id, ensemble_id, cutting_id, segment_id])
+    language_code = request.LANGUAGE_CODE[:2]
+
+    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))
+
+  
 def search_index_get(request, field, query):
 
     language_code = request.LANGUAGE_CODE[:2]
@@ -1091,7 +1093,7 @@
     try:
         # The filename arrives with a GET var.
         file_path = os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", ldt_utils_path.sanitize_filename(request.GET["filename"]))
-        if settings.FFMPEG_PATH and os.path.exists(file_path):
+        if hasattr(settings,'FFMPEG_PATH') and os.path.exists(file_path):
             output = str(subprocess.Popen([settings.FFMPEG_PATH, "-i", file_path],stderr = subprocess.PIPE).communicate()[1])
             m = re.search("Duration:\s*?([\d.:]+)", output, re.M)
             dur_arr = m.group(1).split(":")
--- a/src/ldt/ldt/settings.py	Tue Sep 13 11:02:16 2011 +0200
+++ b/src/ldt/ldt/settings.py	Wed Sep 14 16:48:51 2011 +0200
@@ -73,6 +73,7 @@
 ACCOUNT_ACTIVATION_DAYS = getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', 7)
 LDT_MEDIA_PREFIX = getattr(settings, 'LDT_MEDIA_PREFIX', MEDIA_URL + 'ldt/')
 LDT_MAX_SEARCH_NUMBER = 50
+LDT_MAX_FRAGMENT_PER_SEARCH = 3
 LDT_JSON_DEFAULT_INDENT = 2
 
 AUTO_INDEX_AFTER_SAVE = getattr(settings, 'AUTO_INDEX_AFTER_SAVE', True)
--- a/web/ldtplatform/config.py.tmpl	Tue Sep 13 11:02:16 2011 +0200
+++ b/web/ldtplatform/config.py.tmpl	Wed Sep 14 16:48:51 2011 +0200
@@ -74,6 +74,7 @@
 REGISTRATION_OPEN = False
 
 LDT_MAX_SEARCH_NUMBER = 50
+LDT_MAX_FRAGMENT_PER_SEARCH = 3
 LDT_JSON_DEFAULT_INDENT = 0
 
 EMPTY_MEDIA_EXTERNALID = None