add query for details V00.06
authorymh <ymh.work@gmail.com>
Fri, 29 Jan 2010 05:13:31 +0100
changeset 16 146d86480e85
parent 15 db6ed4430381
child 17 dc40652282ad
add query for details
web/blinkster/__init__.py
web/blinkster/ldt/contentindexer.py
web/blinkster/ldt/models.py
web/blinkster/ldt/utils.py
web/blinkster/templates/base.html
web/blinkster/templates/segment_detail.html
web/blinkster/urls.py
web/blinkster/utils/context_processors.py
web/blinkster/views.py
--- a/web/blinkster/__init__.py	Thu Jan 28 23:12:32 2010 +0100
+++ b/web/blinkster/__init__.py	Fri Jan 29 05:13:31 2010 +0100
@@ -1,3 +1,3 @@
-VERSION = (0,5)
+VERSION = (0,6)
 
 VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION)))
--- a/web/blinkster/ldt/contentindexer.py	Thu Jan 28 23:12:32 2010 +0100
+++ b/web/blinkster/ldt/contentindexer.py	Fri Jan 29 05:13:31 2010 +0100
@@ -6,7 +6,7 @@
 import blinkster.utils.log
 import blinkster.utils.xml
 from blinkster import settings
-from blinkster.ldt.models import Content
+from blinkster.ldt.models import Content, Segment
 import xml
 import xml.dom
 import xml.dom.minidom
@@ -76,6 +76,10 @@
                         doc = lucene.Document()
                         elementId = elementNode.getAttribute("id")
                         tags = elementNode.getAttribute("tags")
+                        author = elementNode.getAttribute("author")
+                        start_ts = int(elementNode.getAttribute("begin"))
+                        duration = int(elementNode.getAttribute("dur"))
+                        date_str = elementNode.getAttribute("date")
                         
                         if tags is not None:                            
                             tags.replace(",", ";")
@@ -109,6 +113,20 @@
                         doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
                         doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
             
+                        seg = Segment(content = content,
+                                      iri_id = content.iri_id,
+                                      ensemble_id = ensembleId,
+                                      cutting_id = decoupId,
+                                      element_id = elementId,
+                                      tags =  tags,
+                                      title = title,
+                                      abstract = abstract,
+                                      duration = duration,
+                                      author = author,
+                                      start_ts = start_ts,
+                                      date = date_str)
+                        seg.save()
+            
                         self.__writer.addDocument(doc)
             
             self.__writer.flush()
@@ -168,6 +186,10 @@
                         doc = lucene.Document()
                         elementId = elementNode.getAttribute("id")
                         tags = elementNode.getAttribute("tags")
+                        author = elementNode.getAttribute("author")
+                        start_ts = int(elementNode.getAttribute("begin"))
+                        duration = int(elementNode.getAttribute("dur"))
+                        date_str = elementNode.getAttribute("date")
                         
                         if tags is not None:                            
                             tags.replace(",", ";")
@@ -192,6 +214,7 @@
                         for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): 
                             abstract = abstract + txtRes.data 
                 
+                
                         doc.add(lucene.Field("project_id", project.iri_id, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))              
                         doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED))
                         doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
@@ -202,6 +225,28 @@
                         doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
                         doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED))
             
+                        try:
+                            content = Content.objects.get(iri_id = contentId)
+                            seg = Segment( project_obj = project,
+                                      content = content,
+                                      project_id = project.ldt_id,
+                                      iri_id = contentId,
+                                      ensemble_id = ensembleId,
+                                      cutting_id = decoupId,
+                                      element_id = elementId,
+                                      tags =  tags,
+                                      title = title,
+                                      abstract = abstract,
+                                      duration = duration,
+                                      author = author,
+                                      start_ts = start_ts,
+                                      date = date_str)
+                            seg.save()
+                        except:
+                            blinkster.utils.log.error("unable to store segment")
+                            
+            
+            
                         self.__writer.addDocument(doc)
             
             self.__writer.flush()
--- a/web/blinkster/ldt/models.py	Thu Jan 28 23:12:32 2010 +0100
+++ b/web/blinkster/ldt/models.py	Fri Jan 29 05:13:31 2010 +0100
@@ -48,6 +48,7 @@
     
     def __unicode__(self):
         return str(self.id) + ": " + self.iri_id
+
     
 class LdtProject(models.Model):
     
@@ -60,9 +61,33 @@
     
     def __unicode__(self):
         return unicode(self.id) + u": " + unicode(self.ldt_id)
+
+class Segment(models.Model):
+    
+    project_obj = models.ForeignKey(LdtProject, null=True)
+    content = models.ForeignKey(Content)
+    project_id = models.CharField(max_length=1024, unique=False, blank = True, null=True)
+    iri_id = models.CharField(max_length=1024, unique=False)
+    ensemble_id = models.CharField(max_length=1024, unique=False)
+    cutting_id = models.CharField(max_length=1024, unique=False)    
+    element_id = models.CharField(max_length=1024, unique=False)
+    tags =  models.CharField(max_length=2048, unique=False, null=True, blank=True)  
+    title = models.CharField(max_length=2048, unique=False, null=True, blank=True)
+    duration = models.IntegerField(null=True)
+    start_ts = models.IntegerField(null=True)
+    author = models.CharField(max_length=1024, unique=False, null=True, blank=True)
+    date = models.CharField(max_length=128, unique=False, null=True, blank=True)
+    abstract = models.TextField(null=True, blank=True)
+    
+    def __unicode__(self):
+        return "/".join((unicode(self.project_id), unicode(self.iri_id), unicode(self.ensemble_id), unicode(self.cutting_id), unicode(self.element_id)))
+    
+    class Meta:
+        unique_together = (('project_id','iri_id','ensemble_id','cutting_id','element_id'),)
     
     
 admin.site.register(Content)
 admin.site.register(Author)
 admin.site.register(LdtProject)
+admin.site.register(Segment)
 
--- a/web/blinkster/ldt/utils.py	Thu Jan 28 23:12:32 2010 +0100
+++ b/web/blinkster/ldt/utils.py	Fri Jan 29 05:13:31 2010 +0100
@@ -17,14 +17,13 @@
 class LdtSearch(object):
 
 	def query(self, field, query):
+		res = []
 		indexSearcher = lucene.IndexSearcher(STORE)
 		#queryParser = lucene.MultiFieldQueryParser(["tags","title","abstract"], ANALYZER)
 		queryParser = lucene.QueryParser(field, lucene.FrenchAnalyzer())
 		queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND)
 		queryObj = queryParser.parse(query)
 		hits = indexSearcher.search(queryObj)
-		
-		res = []
 		for hit in hits:
 			doc = lucene.Hit.cast_(hit).getDocument()
 			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")})
--- a/web/blinkster/templates/base.html	Thu Jan 28 23:12:32 2010 +0100
+++ b/web/blinkster/templates/base.html	Fri Jan 29 05:13:31 2010 +0100
@@ -3,7 +3,7 @@
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
-    <title>{% block title %}Pocket Films 2009{% endblock %}</title>
+    <title>{% block title %}Blinkster{% endblock %}</title>
     {% block js_import %}
     {% endblock %}
     {% block css_import %}
@@ -32,7 +32,7 @@
 		<a href="http://www.iri.centrepompidou.fr"><img src="{{MEDIA_URL}}/img/logo_IRI_footer.png" alt="Logo IRI" /></a>
 		</div>
 		<div class="version" id="version"><a>{{VERSION}}</a></div>
-		<div style="float: right;" class="small">©2009 <a style="text-decoration: none; color: #4F5155;" href="http://www.iri.centrepompidou.fr">IRI / Centre Pompidou</a></div>
+		<div style="float: right;" class="small">©2010 <a style="text-decoration: none; color: #4F5155;" href="http://www.iri.centrepompidou.fr">IRI / Centre Pompidou</a></div>
 		{% endblock %}
 	</div>
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/blinkster/templates/segment_detail.html	Fri Jan 29 05:13:31 2010 +0100
@@ -0,0 +1,33 @@
+{% extends "base.html" %}
+
+{% block content %}
+<div>
+
+<h1>Segment :</h1>
+
+<h2>Titre :</h2>
+<div>{{segment.title}}</div>
+
+<h2>Description :</h2>
+<div>{{segment.abstract}}</div>
+
+<h2>Tags :</h2>
+<div>{{segment.tags}}</div>
+
+<h2>Détails :</h2>
+
+<ul>
+    <li>project_id = {{segment.project_id}}</li>
+    <li>iri_id = {{segment.iri_id}}</li>
+    <li>ensemble_id = {{segment.ensemble_id}}</li>
+    <li>cutting_id = {{segment.cutting_id}}</li>
+    <li>element_id = {{segment.element_id}}</li>
+    <li>duration ={{segment.duration}}</li>
+    <li>start_ts = {{segment.start_ts}}</li>
+    <li>author = {{segment.author}}</li>
+    <li>date = {{segment.date}}</li>
+</ul>
+
+
+</div>
+{% endblock %}
\ No newline at end of file
--- a/web/blinkster/urls.py	Thu Jan 28 23:12:32 2010 +0100
+++ b/web/blinkster/urls.py	Fri Jan 29 05:13:31 2010 +0100
@@ -40,6 +40,9 @@
     #(r'^.*(?P<content>flvplayer|mp3player|ClearExternalAllBlue)\.swf$','django.views.generic.simple.redirect_to', {'url':blinkster.settings.BASE_URL+'/static/swf/ldt/pkg/%(content)s.swf'}),
     (r'^roi/list/$', 'blinkster.views.roi_list'),
     (r'^poi/list/(?P<roi_sid>.*)/$', 'blinkster.views.poi_list'),
+    (r'^segment/detail/(?P<iri_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<element_id>.*)/$', 'blinkster.views.segment_detail'),
+    (r'^segment/search/$','blinkster.views.segment_search_post'),
+    (r'^segment/search/(?P<field>tags|title|abstract|all)/(?P<operator>or|and)/(?P<query>.*)/$','blinkster.views.segment_search_get'),
     (r'^photologue/', include('photologue.urls')),
     
 )
--- a/web/blinkster/utils/context_processors.py	Thu Jan 28 23:12:32 2010 +0100
+++ b/web/blinkster/utils/context_processors.py	Fri Jan 29 05:13:31 2010 +0100
@@ -1,11 +1,11 @@
-import blinkster.settings;
+from django.conf import settings;
 import blinkster;
 
 def version(request):
     return {'VERSION': blinkster.VERSION_STR }
 
 def base(request):
-    return {'BASE_URL': blinkster.settings.BASE_URL }
+    return {'BASE_URL': settings.BASE_URL, 'MEDIA_URL': settings.MEDIA_URL }
 
 def web(request):
-    return {'WEB_URL': enmi.settings.WEB_URL }
+    return {'WEB_URL': settings.WEB_URL }
--- a/web/blinkster/views.py	Thu Jan 28 23:12:32 2010 +0100
+++ b/web/blinkster/views.py	Fri Jan 29 05:13:31 2010 +0100
@@ -7,15 +7,23 @@
 from django.core import serializers
 from django.core.serializers.json import DjangoJSONEncoder
 from django.utils import simplejson
+from django.conf import settings
 
+from blinkster.ldt.models import Segment
+from blinkster.ldt.utils import LdtSearch
 from blinkster.models import Roi, Poi
 import blinkster
+import re
+import urllib2
 
-def serialize_queryset_to_json(response, obj_list):
+def serialize_queryset_to_json(response, obj_list, extra=None):
     objs = {
         "version" : blinkster.VERSION,
         "list" : obj_list,
     }
+    if extra:
+        objs = dict(objs, **extra)
+
     simplejson.dump(objs, response, cls=DjangoJSONEncoder,ensure_ascii=False, indent=4)
     return response
 
@@ -24,10 +32,61 @@
     content_type = request.GET.get("content-type", "application/json; charset=utf-8")
 
     response = HttpResponse(content_type=str(content_type))
-    return serialize_queryset_to_json(response, [roi.serialize_to_dict() for roi in Roi.objects.all()])
+    results = []
+    for roi_dict in [roi.serialize_to_dict() for roi in Roi.objects.all()]:
+        roi_dict["poi_list_url"] = unicode(settings.WEB_URL.rstrip('/') + reverse('blinkster.views.poi_list',args=[roi_dict["sid"]]))
+        results.append(roi_dict)
+
+    return serialize_queryset_to_json(response, results)
 
 def poi_list(request, roi_sid):
     content_type = request.GET.get("content-type", "application/json; charset=utf-8")
     response = HttpResponse(content_type=str(content_type))
     roi = get_object_or_404(Roi, sid=roi_sid)
-    return serialize_queryset_to_json(response, [poi.serialize_to_dict() for poi in Poi.objects.filter(roi=roi)]) 
+    results = []
+    for poi_dict in [poi.serialize_to_dict() for     poi in Poi.objects.filter(roi=roi)]:
+        poi_dict["segment_search_url"] = unicode(settings.WEB_URL.rstrip('/') + reverse('blinkster.views.segment_search_get',args=[u"tags",u"or",urllib2.quote(poi_dict["tags"].encode("utf-8"))]))
+        results.append(poi_dict)
+    return serialize_queryset_to_json(response, results)
+
+# Display segment detail.
+# This will have to be moved to ldt module
+def segment_detail(request, iri_id, ensemble_id, cutting_id, element_id, project_id = None):
+    
+    segment = get_object_or_404(Segment, project_id=project_id, iri_id=iri_id, ensemble_id=ensemble_id, cutting_id=cutting_id, element_id=element_id)
+    return render_to_response("segment_detail.html",{'segment':segment}, context_instance=RequestContext(request))
+
+def segment_search_post(request):
+    query = request.POST["query"]
+    field = request.POST["field"]
+    operator = request.POST["operator"]
+    return segment_search_get(request, query, field, operator)
+
+def segment_search_get(request, query, field = u"tags", operator=u"or"):
+    
+    
+    content_type = request.GET.get("content-type", "application/json; charset=utf-8")
+
+    response = HttpResponse(content_type=str(content_type))
+
+    # transform tag1, tag2, tag3 in "tag1" OR "tag2" OR "tag3"
+    query_str = (u" " + operator.upper() + u" ").join(["\"" + t.strip() + "\"" for t in re.split("\,|\;",query)])
+    
+
+    searcher = blinkster.ldt.utils.LdtSearch()
+    index_results = searcher.query(field, query_str)
+
+    results = []
+
+    for index_res in index_results:
+        res = dict(index_res)
+        segs = Segment.objects.filter(iri_id=index_res["iri_id"], element_id=index_res["element_id"], cutting_id=index_res["decoupage_id"], ensemble_id=index_res["ensemble_id"]).values() 
+        for seg in segs:
+            del seg["project_obj_id"]
+            del seg["content_id"]
+            del seg["id"]
+            res = dict(res, **seg)
+        res["segment_detail_url"] = unicode(settings.WEB_URL.rstrip('/') + reverse('blinkster.views.segment_detail',args=[res["iri_id"], res["ensemble_id"], res["cutting_id"], res["element_id"]]))
+        results.append(res)
+    
+    return serialize_queryset_to_json(response, results, {u"query" : query, u"field": field, u"operator":operator, u"final_query": query_str})