web/blinkster/views.py
changeset 16 146d86480e85
parent 13 de71c188f397
child 18 6c2a86612031
equal deleted inserted replaced
15:db6ed4430381 16:146d86480e85
     5 from django.template import RequestContext, TemplateDoesNotExist
     5 from django.template import RequestContext, TemplateDoesNotExist
     6 from django.template.loader import get_template
     6 from django.template.loader import get_template
     7 from django.core import serializers
     7 from django.core import serializers
     8 from django.core.serializers.json import DjangoJSONEncoder
     8 from django.core.serializers.json import DjangoJSONEncoder
     9 from django.utils import simplejson
     9 from django.utils import simplejson
       
    10 from django.conf import settings
    10 
    11 
       
    12 from blinkster.ldt.models import Segment
       
    13 from blinkster.ldt.utils import LdtSearch
    11 from blinkster.models import Roi, Poi
    14 from blinkster.models import Roi, Poi
    12 import blinkster
    15 import blinkster
       
    16 import re
       
    17 import urllib2
    13 
    18 
    14 def serialize_queryset_to_json(response, obj_list):
    19 def serialize_queryset_to_json(response, obj_list, extra=None):
    15     objs = {
    20     objs = {
    16         "version" : blinkster.VERSION,
    21         "version" : blinkster.VERSION,
    17         "list" : obj_list,
    22         "list" : obj_list,
    18     }
    23     }
       
    24     if extra:
       
    25         objs = dict(objs, **extra)
       
    26 
    19     simplejson.dump(objs, response, cls=DjangoJSONEncoder,ensure_ascii=False, indent=4)
    27     simplejson.dump(objs, response, cls=DjangoJSONEncoder,ensure_ascii=False, indent=4)
    20     return response
    28     return response
    21 
    29 
    22 def roi_list(request):
    30 def roi_list(request):
    23 
    31 
    24     content_type = request.GET.get("content-type", "application/json; charset=utf-8")
    32     content_type = request.GET.get("content-type", "application/json; charset=utf-8")
    25 
    33 
    26     response = HttpResponse(content_type=str(content_type))
    34     response = HttpResponse(content_type=str(content_type))
    27     return serialize_queryset_to_json(response, [roi.serialize_to_dict() for roi in Roi.objects.all()])
    35     results = []
       
    36     for roi_dict in [roi.serialize_to_dict() for roi in Roi.objects.all()]:
       
    37         roi_dict["poi_list_url"] = unicode(settings.WEB_URL.rstrip('/') + reverse('blinkster.views.poi_list',args=[roi_dict["sid"]]))
       
    38         results.append(roi_dict)
       
    39 
       
    40     return serialize_queryset_to_json(response, results)
    28 
    41 
    29 def poi_list(request, roi_sid):
    42 def poi_list(request, roi_sid):
    30     content_type = request.GET.get("content-type", "application/json; charset=utf-8")
    43     content_type = request.GET.get("content-type", "application/json; charset=utf-8")
    31     response = HttpResponse(content_type=str(content_type))
    44     response = HttpResponse(content_type=str(content_type))
    32     roi = get_object_or_404(Roi, sid=roi_sid)
    45     roi = get_object_or_404(Roi, sid=roi_sid)
    33     return serialize_queryset_to_json(response, [poi.serialize_to_dict() for poi in Poi.objects.filter(roi=roi)]) 
    46     results = []
       
    47     for poi_dict in [poi.serialize_to_dict() for     poi in Poi.objects.filter(roi=roi)]:
       
    48         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"))]))
       
    49         results.append(poi_dict)
       
    50     return serialize_queryset_to_json(response, results)
       
    51 
       
    52 # Display segment detail.
       
    53 # This will have to be moved to ldt module
       
    54 def segment_detail(request, iri_id, ensemble_id, cutting_id, element_id, project_id = None):
       
    55     
       
    56     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)
       
    57     return render_to_response("segment_detail.html",{'segment':segment}, context_instance=RequestContext(request))
       
    58 
       
    59 def segment_search_post(request):
       
    60     query = request.POST["query"]
       
    61     field = request.POST["field"]
       
    62     operator = request.POST["operator"]
       
    63     return segment_search_get(request, query, field, operator)
       
    64 
       
    65 def segment_search_get(request, query, field = u"tags", operator=u"or"):
       
    66     
       
    67     
       
    68     content_type = request.GET.get("content-type", "application/json; charset=utf-8")
       
    69 
       
    70     response = HttpResponse(content_type=str(content_type))
       
    71 
       
    72     # transform tag1, tag2, tag3 in "tag1" OR "tag2" OR "tag3"
       
    73     query_str = (u" " + operator.upper() + u" ").join(["\"" + t.strip() + "\"" for t in re.split("\,|\;",query)])
       
    74     
       
    75 
       
    76     searcher = blinkster.ldt.utils.LdtSearch()
       
    77     index_results = searcher.query(field, query_str)
       
    78 
       
    79     results = []
       
    80 
       
    81     for index_res in index_results:
       
    82         res = dict(index_res)
       
    83         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() 
       
    84         for seg in segs:
       
    85             del seg["project_obj_id"]
       
    86             del seg["content_id"]
       
    87             del seg["id"]
       
    88             res = dict(res, **seg)
       
    89         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"]]))
       
    90         results.append(res)
       
    91     
       
    92     return serialize_queryset_to_json(response, results, {u"query" : query, u"field": field, u"operator":operator, u"final_query": query_str})