search chapters begins to work
authorcavaliet
Fri, 07 Mar 2014 13:06:24 +0100
changeset 9 b62e3c1565d0
parent 8 5669fe792a0b
child 10 fbd6bb9b186a
search chapters begins to work
src/spel/management/commands/loadspeldata.py
src/spel/static/spel/css/spel.css
src/spel/static/spel/img/loader.gif
src/spel/static/spel/js/spectacle.js
src/spel/templates/partial/spel_chapters.html
src/spel/templates/spel_spectacle.html
src/spel/templatetags/__init__.py
src/spel/templatetags/spel_tags.py
src/spel/urls.py
src/spel/views.py
--- a/src/spel/management/commands/loadspeldata.py	Thu Mar 06 16:28:30 2014 +0100
+++ b/src/spel/management/commands/loadspeldata.py	Fri Mar 07 13:06:24 2014 +0100
@@ -32,9 +32,7 @@
     '''
 
     args = 'folder containing folders containing json files'
-    help = 'Load users, medias, contents, project and guardian permissions from json file generated by dumpdata'
-    
-    
+    help = 'Load medias, contents and project from json files generated by ubicast'
     
     
     def __safe_get(self, dict_arg, key, conv = lambda x: x, default= None):
@@ -211,6 +209,6 @@
                     print("Ignoring or not exist %s ..." % json_path)
         
         # This is the end
-        print("This is the end")
+        print("This is the end. DO NOT FORGET TO RUN THE COMMAND 'REINDEX -P' TO GENERATE SEGMENTS AND TAGS.")
         
         
\ No newline at end of file
--- a/src/spel/static/spel/css/spel.css	Thu Mar 06 16:28:30 2014 +0100
+++ b/src/spel/static/spel/css/spel.css	Fri Mar 07 13:06:24 2014 +0100
@@ -12,4 +12,16 @@
 }
 .width100percent{
   width: 100%;
+}
+
+/* loading background */
+.loader {
+    background: url(../img/loader.gif) center no-repeat;
+    background-size: 25px 25px;
+}
+
+.chapter-results{
+	border-top: 2px solid #BBBBBB;
+    margin-top: 10px;
+    padding-top: 10px;
 }
\ No newline at end of file
Binary file src/spel/static/spel/img/loader.gif has changed
--- a/src/spel/static/spel/js/spectacle.js	Thu Mar 06 16:28:30 2014 +0100
+++ b/src/spel/static/spel/js/spectacle.js	Fri Mar 07 13:06:24 2014 +0100
@@ -1,104 +1,135 @@
 $(document).ready(function () {
+	
+	// Chapter multiselect management
+	$('.chapters .multiselect').multiselect({
+	    buttonText: function(options, select) {
+	      return $(select).attr("data-title") + ' (' + options.length + ') <b class="caret"></b>';
+	    },
+	    onChange: function(element, checked) {
+	      var filter_enabled = false;
+	      var chbs = $(".chapters input:checkbox");
+	      for (var i = chbs.length - 1; i >= 0; i--) {
+	        filter_enabled = filter_enabled || $(chbs[i]).is(":checked");
+	      };
+	      if(filter_enabled){
+	        $("#btn-filter-chapters").removeAttr('disabled');
+	      }
+	      else{
+	        $("#btn-filter-chapters").attr('disabled','disabled');
+	      }
+	    }
+	});
+	// Annotations multiselect management
+	$('.annotations .multiselect').multiselect({
+	    buttonText: function(options, select) {
+	      return $(select).attr("data-title") + ' (' + options.length + ') <b class="caret"></b>';
+	    },
+	    buttonContainer: '<div class="btn-group width100percent" />',
+	    buttonClass: 'btn btn-default width100percent disabled',
+	    onChange: function(element, checked) {
+	      var filter_enabled = false;
+	      var chbs = $(".annotations input:checkbox");
+	      for (var i = chbs.length - 1; i >= 0; i--) {
+	        filter_enabled = filter_enabled || $(chbs[i]).is(":checked");
+	      };
+	      if(filter_enabled){
+	        $("#btn-filter-annotations").removeAttr('disabled');
+	      }
+	      else{
+	        $("#btn-filter-annotations").attr('disabled','disabled');
+	      }
+	    }
+	});
 
-  $('.chapters .multiselect').multiselect({
-    buttonText: function(options, select) {
-      return $(select).attr("data-title") + ' (' + options.length + ') <b class="caret"></b>';
-    },
-    onChange: function(element, checked) {
-      var filter_enabled = false;
-      var chbs = $(".chapters input:checkbox");
-      for (var i = chbs.length - 1; i >= 0; i--) {
-        filter_enabled = filter_enabled || $(chbs[i]).is(":checked");
-      };
-      if(filter_enabled){
-        $("#btn-filter-chapters").removeAttr('disabled');
-      }
-      else{
-        $("#btn-filter-chapters").attr('disabled','disabled');
-      }
-    }
-  });
-  $('.annotations .multiselect').multiselect({
-    buttonText: function(options, select) {
-      return $(select).attr("data-title") + ' (' + options.length + ') <b class="caret"></b>';
-    },
-    buttonContainer: '<div class="btn-group width100percent" />',
-    buttonClass: 'btn btn-default width100percent disabled',
-    onChange: function(element, checked) {
-      var filter_enabled = false;
-      var chbs = $(".annotations input:checkbox");
-      for (var i = chbs.length - 1; i >= 0; i--) {
-        filter_enabled = filter_enabled || $(chbs[i]).is(":checked");
-      };
-      if(filter_enabled){
-        $("#btn-filter-annotations").removeAttr('disabled');
-      }
-      else{
-        $("#btn-filter-annotations").attr('disabled','disabled');
-      }
-    }
-  });
-
-  // Data 1
-  var data1 = [
-    {label: "Performance", value: "performance"},
-    {label: "Discussion", value: "discussion"}
-  ];
-  $("#mulsel1").multiselect('dataprovider', data1);
+	// Data 1
+	var data1 = [
+	    {label: "Performance", value: "performance"},
+	    {label: "Discussion", value: "discussion"}
+    ];
+	$("#mulsel1").multiselect('dataprovider', data1);
+  
+	// Data 2 : modalités scéniques
+	$.ajax({
+		url: urlMS
+	})
+	.done(function( data ) {
+		var o = data.objects;
+		var n = data.objects.length;
+		var data2 = [];
+		for(var i=0;i<n;i++){
+			data2.push({label: o[i].name.substr(21), value: o[i].name})
+		}
+		$("#mulsel2").multiselect('dataprovider', data2);
+		$("#mulsel2").multiselect('enable');
+	});
   
-  // Data 2 : modalités scéniques
-  $.ajax({
-	  url: urlMS
-  })
-  .done(function( data ) {
-	  var o = data.objects;
-	  var n = data.objects.length;
-	  var data2 = [];
-	  for(var i=0;i<n;i++){
-		  data2.push({label: o[i].name.substr(21), value: o[i].name})
-	  }
-	  $("#mulsel2").multiselect('dataprovider', data2);
-	  $("#mulsel2").multiselect('enable');
-  });
-  
-  // Data 3 : Personnages
-  $.ajax({
-	  url: urlP
-  })
-  .done(function( data ) {
-	  var o = data.objects;
-	  var n = data.objects.length;
-	  var data3 = [];
-	  for(var i=0;i<n;i++){
-		  data3.push({label: o[i].name.substr(12), value: o[i].name})
-	  }
-	  $("#mulsel3").multiselect('dataprovider', data3);
-	  $("#mulsel3").multiselect('enable');
-  });
+	// Data 3 : Personnages
+	$.ajax({
+		url: urlP
+	})
+	.done(function( data ) {
+		var o = data.objects;
+		var n = data.objects.length;
+		var data3 = [];
+		for(var i=0;i<n;i++){
+			data3.push({label: o[i].name.substr(12), value: o[i].name})
+		}
+		$("#mulsel3").multiselect('dataprovider', data3);
+		$("#mulsel3").multiselect('enable');
+	});
 
-  // Annotations :
-  $("#mulsel4").multiselect('disable');
-  $(document).on('input', "#search-input", function(){
-    if($(this).val()!=""){
-      $("#btn-search-annotations").removeAttr('disabled');
-    }
-    else{
-      $("#btn-search-annotations").attr('disabled','disabled');
-    }
-  });
+	// Data 4 : type interventions
+	$.ajax({
+		url: urlTI
+	})
+	.done(function( data ) {
+		var o = data.objects;
+		var n = data.objects.length;
+		var data4 = [];
+		for(var i=0;i<n;i++){
+			data4.push({label: o[i].name.substr(11), value: o[i].name})
+		}
+		$("#mulsel4").multiselect('dataprovider', data4);
+		$("#mulsel4").multiselect('enable');
+	});
+	$(document).on('input', "#search-input", function(){
+		if($(this).val()!=""){
+			$("#btn-search-annotations").removeAttr('disabled');
+		}
+		else{
+			$("#btn-search-annotations").attr('disabled','disabled');
+		}
+	});
 
-  $("#btn-search-annotations").click(function(e){
-    e.preventDefault();
-    var data4 = [
-      {label: "Intervention MES", value: "Intervention MES"},
-      {label: "Filage de la scène", value: "Filage de la scène"},
-      {label: "Parole à l'acteur/actrice", value: "Parole à l'acteur/actrice"},
-      {label: "Interprétation du texte", value: "Interprétation du texte"},
-      {label: "Décision", value: "Décision"}
-    ];
-    $("#mulsel4").multiselect('dataprovider', data4);
-    $("#mulsel4").multiselect('enable');
-  });
+	// Search chapters management
+	$("#btn-filter-chapters").click(function(e){
+		if($("#mulsel1").val()==null && $("#mulsel2").val()==null && $("#mulsel3").val()==null){
+			$(".chapter-results").html("<p>Vous devez sélectionner au moins un filtre</p>");
+			return false;
+		}
+		$(".chapter-results").html("<br/><br/>");
+		$(".chapter-results").addClass("loader");
+		$.ajax({
+			url: urlChapters,
+			data:{
+				annotation_types: ( ($("#mulsel1").val()==null) ? [] : $("#mulsel1").val() ).join(","),
+				modalites_sceniques: ( ($("#mulsel2").val()==null) ? [] : $("#mulsel2").val() ).join(","),
+				personnages: ( ($("#mulsel3").val()==null) ? [] : $("#mulsel3").val() ).join(",")
+			}
+		})
+		.done(function( html ) {
+			$(".chapter-results").removeClass("loader");
+			$(".chapter-results").html(html);
+		});
+	});
+	
+	
+	// Search annotations management
+	$("#btn-search-annotations").click(function(e){
+		e.preventDefault();
+	});
+	
+	
 
 
 });
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spel/templates/partial/spel_chapters.html	Fri Mar 07 13:06:24 2014 +0100
@@ -0,0 +1,10 @@
+{% load static %}
+{% load front_tags %}
+{% load spel_tags %}
+<p>{{ segments|length }} segment(s) trouvés</p>
+<table class="table table-striped table-condensed">
+    <tr><th>Type</th><th>Ref texte</th><th>début - fin</th></tr>
+  {% for s in segments %}
+    <tr><td>{{ s.cutting_id }}</td><td>{{ s.tags|get_tags:"ref_text_2" }}</td><td>{{ s.start_ts|str_duration }} - {{ s.start_ts|add:s.duration|str_duration }}</td></tr>
+  {% endfor %}
+</table>
--- a/src/spel/templates/spel_spectacle.html	Thu Mar 06 16:28:30 2014 +0100
+++ b/src/spel/templates/spel_spectacle.html	Fri Mar 07 13:06:24 2014 +0100
@@ -34,6 +34,7 @@
           <div class="row text-center">
             <button id="btn-filter-chapters" class="btn btn-success" disabled="disabled">FILTRER</button>
           </div>
+          <div class="chapter-results"></div>
         </div>
         <div class="col-md-6 annotations">
           <h4 class="text-center">ANNOTATIONS</h4>
@@ -50,7 +51,7 @@
             </div>
           </form>
           <div class="col-md-8 col-md-offset-1">
-            <select id="mulsel4" class="multiselect" multiple="multiple" data-title="Catégories d'annotations">
+            <select id="mulsel4" class="multiselect" multiple="multiple" data-title="Catégories d'annotations" disabled="disabled">
             </select>
           </div>
           <div class="col-md-3">
@@ -67,5 +68,7 @@
   <script type="text/javascript">
   var urlMS = "http://localhost/spel/spel/api/ldt/1.0/tags/?format=json&limit=500&name__startswith=modalites_sceniques:";
   var urlP = "http://localhost/spel/spel/api/ldt/1.0/tags/?format=json&limit=500&name__startswith=personnages:";
+  var urlTI = "http://localhost/spel/spel/api/ldt/1.0/tags/?format=json&limit=500&name__startswith=type_inter:";
+  var urlChapters = "{% url 'spel_chapters' %}";
   </script>
 {% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spel/templatetags/__init__.py	Fri Mar 07 13:06:24 2014 +0100
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/spel/templatetags/spel_tags.py	Fri Mar 07 13:06:24 2014 +0100
@@ -0,0 +1,38 @@
+from django.template import Library, TemplateSyntaxError
+
+register = Library()
+
+import logging
+logger = logging.getLogger(__name__)
+
+@register.filter
+def get_tags(value, arg=None):
+    """ Takes a segment's tag list and returns an array of values from argument. Example seg_obj|get_tags:"personnages" will return "Romeo, Juliette" """
+    # Error management
+    if value is None :
+        return ""
+    if not isinstance(value, (str,unicode)) :
+        raise TemplateSyntaxError('get_tags value error : string is required')
+    # If no arg, we join all values
+    a = value.split(u",")
+    val = []
+    if arg is None :
+        for t in a:
+            val.append(t[t.index(":")+2:])
+    elif arg=="ref_text_2":
+        logger.debug("ICI 1")
+        for t in a:
+            logger.debug("ICI 2")
+            if t[:t.index(":")]=="ref_text":
+                logger.debug("ICI 3")
+                tag_split = t.split(":")
+                if len(tag_split)>2:
+                    logger.debug("ICI 4")
+                    val.append( ":".join(tag_split[2:]) )
+                else:
+                    logger.debug("ICI 5")
+                    val.append(t[t.index(":")+2:])
+    
+    return ", ".join(val)
+get_tags.is_safe = True
+
--- a/src/spel/urls.py	Thu Mar 06 16:28:30 2014 +0100
+++ b/src/spel/urls.py	Fri Mar 07 13:06:24 2014 +0100
@@ -6,6 +6,7 @@
 from django.views.generic import RedirectView, TemplateView
 from ldt.auth.views import login as pf_login
 from ldt.text import VERSION_STR
+from .views import ChapterRequest
 
 #from django.conf import settings
 
@@ -44,6 +45,7 @@
     (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
     url(r'^$', TemplateView.as_view(template_name="spel_home.html"), name='spel_home'),
     url(r'^spectacle$', TemplateView.as_view(template_name="spel_spectacle.html"), name='spel_spectacle'),
+    url(r'^chapters$', ChapterRequest.as_view(), name='spel_chapters'),
 )
 
 urlpatterns += staticfiles_urlpatterns()
--- a/src/spel/views.py	Thu Mar 06 16:28:30 2014 +0100
+++ b/src/spel/views.py	Fri Mar 07 13:06:24 2014 +0100
@@ -4,23 +4,13 @@
 @author: tcavalie
 '''
 
-import json
-import logging
-import math
-import random
-
 from django.conf import settings
-from django.core.cache import cache
-from django.db.models import Q, Sum
-from django.db.models.query import EmptyQuerySet
-from django.shortcuts import redirect
-from django.utils.http import urlencode
-from django.utils.translation import ugettext
-from django.views.generic import DetailView, TemplateView
-from haystack.query import SearchQuerySet
-from unidecode import unidecode
+from django.views.generic import TemplateView
+from tagging.models import Tag, TaggedItem
+from ldt.ldt_utils.models import Segment
 
 
+import logging
 logger = logging.getLogger(__name__)
 
 
@@ -35,4 +25,43 @@
         
         return self.render_to_response(context)
 
+
+class ChapterRequest(TemplateView):
+    
+    template_name = "partial/spel_chapters.html"
+    
+    def get(self, request):
+        
+        # First we look at modalites_sceniques and personnages tags.
+        mod_scen_param = request.GET.get("modalites_sceniques", "")
+        mod_scen = []
+        if mod_scen_param!="":
+            mod_scen = mod_scen_param.split(",")
+        perso_param = request.GET.get("personnages", "")
+        perso = []
+        if perso_param!="":
+            perso = perso_param.split(",")
+        
+        # Get tags from orm
+        all_tags = mod_scen + perso
+        tags = Tag.objects.filter(name__in=all_tags)
+        # Get segments from tagged items
+        #TaggedItem.objects.get_by_model(segment_queryset, tags)
+        s = TaggedItem.objects.get_by_model(Segment, tags)
+        
+        
+        logger.debug("COUCOU")
+        #logger.debug(mod_scen_param)
+        #logger.debug(perso_param)
+        #logger.debug(mod_scen)
+        #logger.debug(perso)
+        #logger.debug(tags)
+        #logger.debug(s)
+        
+        #request.GET.get("annotation_types", "")
+        
+        context = {"segments": s, "annotation_types": [], "tags": mod_scen+perso }
+        
+        return self.render_to_response(context)
+
     
\ No newline at end of file