annotation tag search
authorcavaliet
Tue, 11 Mar 2014 17:43:28 +0100
changeset 15 acf4460a8074
parent 14 00a8a44543ab
child 16 a41d76310c7d
annotation tag search
src/spel/settings.py
src/spel/static/spel/js/spectacle.js
src/spel/views.py
--- a/src/spel/settings.py	Tue Mar 11 14:42:13 2014 +0100
+++ b/src/spel/settings.py	Tue Mar 11 17:43:28 2014 +0100
@@ -276,5 +276,6 @@
 MAX_TAG_LENGTH = 1024
 #FORCE_LOWERCASE_TAGS = True
 LDT_INDEXATION_INSERT_BATCH_SIZE = 1
+LDT_RESULTS_PER_PAGE = 500
     
   
--- a/src/spel/static/spel/js/spectacle.js	Tue Mar 11 14:42:13 2014 +0100
+++ b/src/spel/static/spel/js/spectacle.js	Tue Mar 11 17:43:28 2014 +0100
@@ -162,12 +162,8 @@
 	
 	
 	// Search annotations management
-	$("#btn-search-annotations").click(function(e){
-		e.preventDefault();
-		if($("#search-input").val()==""){
-			$(".annotation-results").html("<p>Vous devez indiquer un terme pour la recherche.</p>");
-			return false;
-		}
+	
+	function searchAnnotations(){
 		$(".annotation-results").html("<br/><br/>");
 		$(".annotation-results").addClass("loader");
 		$.ajax({
@@ -185,22 +181,40 @@
 			$(".annotation-results").removeClass("loader");
 			$(".annotation-results").html('<p class="bg-danger">Erreur de chargement</p>');
 		});
+	}
+	
+	$("#btn-search-annotations").click(function(e){
+		e.preventDefault();
+		if($("#search-input").val()==""){
+			$(".annotation-results").html("<p>Vous devez indiquer un terme pour la recherche.</p>");
+			return false;
+		}
+        $('option', $('#mulsel4')).each(function(element) {
+            $(this).removeAttr('selected').prop('selected', false);
+        });
+        $('#mulsel4').multiselect('refresh');
+		searchAnnotations();
 	});
 	
 	$("#btn-filter-annotations").click(function(e){
 		if($("#mulsel4").val() && $("#mulsel4").val()!=""){
-			var filters = $("#mulsel4").val();
-			var nb_filters = filters.length;
-			$( ".searched-annot" ).each(function(index){
-				var type_inter = $(this).attr("data-type-inter").split(", ");
-				var found = true;
-				for(var i=0;i<nb_filters;i++){
-					if(type_inter.indexOf(filters[i])==-1){
-						found = found && false;
+			if($('#search-input').val()!=""){
+				var filters = $("#mulsel4").val();
+				var nb_filters = filters.length;
+				$( ".searched-annot" ).each(function(index){
+					var type_inter = $(this).attr("data-type-inter").split(", ");
+					var found = true;
+					for(var i=0;i<nb_filters;i++){
+						if(type_inter.indexOf(filters[i])==-1){
+							found = found && false;
+						}
 					}
-				}
-				found ? $(this).show() : $(this).hide();
-			});
+					found ? $(this).show() : $(this).hide();
+				});
+			}
+			else{
+				searchAnnotations();
+			}
 		}
 		else{
 			$( ".searched-annot" ).each(function(j){
--- a/src/spel/views.py	Tue Mar 11 14:42:13 2014 +0100
+++ b/src/spel/views.py	Tue Mar 11 17:43:28 2014 +0100
@@ -6,6 +6,8 @@
 import time
 from django.conf import settings
 from django.views.generic import TemplateView
+from itertools import groupby
+from operator import itemgetter
 from tagging.models import Tag, TaggedItem
 from ldt.ldt_utils.models import Segment, Content
 
@@ -94,12 +96,39 @@
     
     def get(self, request):
         q = request.GET.get("q", "")
-        field = "abstract"
         page = 1
         content_list = None
-        results, nb, nb_segment = get_search_results(request, q, field, page, content_list)
+        if q!="":
+            field = "abstract"
+            results, nb_contents, nb_segments = get_search_results(request, q, field, page, content_list)
+            results = results.object_list
+        else:
+            type_inter_param = request.GET.get("type_inter", "")
+            seg_queryset = []
+            results = []
+            tagged_segs = []
+            if type_inter_param!="":
+                type_inter = [("type_inter: " + t) for t in type_inter_param.split(",")]
+                tags = Tag.objects.filter(name__in=type_inter)
+                # Get segments from tagged items
+                tagged_segs = TaggedItem.objects.get_by_model(Segment, tags).values()
+                # Prefetch all contents
+                all_contents = Content.objects.filter(iri_id__in=[s['iri_id'] for s in tagged_segs])
+                for iri_id, items in groupby(tagged_segs, itemgetter('iri_id')):
+                    # Get good content
+                    content = None
+                    content_filter = filter(lambda e: e.iri_id == iri_id, all_contents)
+                    if len(content_filter)>0:
+                        content = content_filter[0]
+                    if content is None:
+                        continue
+                    # Get segments
+                    s = list(items)
+                    results.append({ 'content': content, 'list': s })
+            nb_contents = len(results)
+            nb_segments = len(tagged_segs)
         
-        context = {"results": results.object_list, "nb_contents": nb, "nb_annotations": nb_segment}
+        context = {"results": results, "nb_contents": nb_contents, "nb_annotations": nb_segments}
         
         return self.render_to_response(context)