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