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}) |