src/ldt/ldt/ldt_utils/views/json.py
author cavaliet
Mon, 27 Aug 2012 12:59:34 +0200
changeset 754 3efbab60855a
parent 730 38993be55b2b
child 886 3ccedd271e36
permissions -rw-r--r--
allow jsonp on mashupbytag.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
     1
# -*- coding: utf-8 -*-
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     2
from django.conf import settings
504
32a878a71a80 Users arrive in front pages by default + bugfixes
verrierj
parents: 482
diff changeset
     3
from django.http import HttpResponse, HttpResponseForbidden
319
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
     4
from django.shortcuts import get_object_or_404, get_list_or_404
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     5
from django.utils import simplejson
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     6
from django.utils.html import escape
691
ff0b66633807 update project serializer for it to serialize the first bout à bout of a ldt project.
cavaliet
parents: 504
diff changeset
     7
from django.utils.translation import ugettext as _
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
     8
from ldt.indexation import get_results_with_context
319
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
     9
from ldt.ldt_utils.models import Project
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    10
from ldt.ldt_utils.projectserializer import ProjectSerializer
730
38993be55b2b search_ldt factorization and correct template.
cavaliet
parents: 722
diff changeset
    11
from ldt.ldt_utils.searchutils import search_generate_ldt
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    12
from datetime import datetime
504
32a878a71a80 Users arrive in front pages by default + bugfixes
verrierj
parents: 482
diff changeset
    13
import ldt.auth as ldt_auth
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    14
import lxml.etree
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    15
386
4539db96ec75 Merge issues
verrierj
parents: 382
diff changeset
    16
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    17
def project_json_id(request, id): 
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    18
    
404
4adc42ab55fd Fix minor bugs
verrierj
parents: 392
diff changeset
    19
    project = get_object_or_404(Project.safe_objects, ldt_id=id)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    20
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    21
    return project_json(request, project, False)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    22
366
5bd7937ea1d7 Add view to select first cutting in json
verrierj
parents: 319
diff changeset
    23
def project_json_cutting_id(request, id, cutting_id):
5bd7937ea1d7 Add view to select first cutting in json
verrierj
parents: 319
diff changeset
    24
404
4adc42ab55fd Fix minor bugs
verrierj
parents: 392
diff changeset
    25
    project = get_object_or_404(Project.safe_objects, ldt_id=id)
366
5bd7937ea1d7 Add view to select first cutting in json
verrierj
parents: 319
diff changeset
    26
5bd7937ea1d7 Add view to select first cutting in json
verrierj
parents: 319
diff changeset
    27
    return project_json(request, project, first_cutting=cutting_id)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    28
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    29
def project_json_externalid(request, id): 
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    30
        
404
4adc42ab55fd Fix minor bugs
verrierj
parents: 392
diff changeset
    31
    res_proj = get_list_or_404(Project.safe_objects.order_by('-modification_date'), contents__external_id=id) #@UndefinedVariable
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    32
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    33
    return project_json(request, res_proj[0], False)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    34
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    35
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    36
382
123b89cf599e Search results are clickable
verrierj
parents: 366
diff changeset
    37
def project_json(request, project, serialize_contents=True, first_cutting=None):
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    38
    
504
32a878a71a80 Users arrive in front pages by default + bugfixes
verrierj
parents: 482
diff changeset
    39
    if not ldt_auth.check_access(request.user, project):
32a878a71a80 Users arrive in front pages by default + bugfixes
verrierj
parents: 482
diff changeset
    40
        return HttpResponseForbidden(_("You can not access this project"))
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    41
        
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    42
    mimetype = request.REQUEST.get("mimetype")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    43
    if mimetype is None:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    44
        mimetype = "application/json; charset=utf-8"
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    45
    else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    46
        mimetype = mimetype.encode("utf-8")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    47
    if "charset" not in mimetype:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    48
        mimetype += "; charset=utf-8" 
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    49
    resp = HttpResponse(mimetype=mimetype)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    50
    resp['Cache-Control'] = 'no-cache, must-revalidate'
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    51
    resp['Pragma'] = 'no-cache'
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    52
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    53
    indent = request.REQUEST.get("indent")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    54
    if indent is None:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    55
        indent = settings.LDT_JSON_DEFAULT_INDENT
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    56
    else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    57
        indent = int(indent)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    58
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    59
    callback = request.REQUEST.get("callback")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    60
    escape_str = request.REQUEST.get("escape")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    61
    escape_bool = False
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    62
    if escape_str:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    63
        escape_bool = {'true': True, 'false': False, "0": False, "1": True}.get(escape_str.lower())
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    64
        
382
123b89cf599e Search results are clickable
verrierj
parents: 366
diff changeset
    65
        
482
c802e00c7131 Lot of bugfixes
verrierj
parents: 481
diff changeset
    66
    ps = ProjectSerializer(project, serialize_contents, first_cutting=first_cutting)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    67
    project_dict = ps.serialize_to_cinelab()
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    68
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    69
    json_str = simplejson.dumps(project_dict, ensure_ascii=False, indent=indent)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    70
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    71
    if callback is not None:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    72
        json_str = "%s(%s)" % (callback, json_str)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    73
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    74
    if escape_bool:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    75
        json_str = escape(json_str)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    76
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    77
    resp.write(json_str)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    78
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    79
    return resp
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    80
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    81
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    82
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    83
def mashup_by_tag(request):
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    84
    # do we indent ?
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    85
    indent = request.REQUEST.get("indent")
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    86
    if indent is None:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    87
        indent = settings.LDT_JSON_DEFAULT_INDENT
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    88
    else:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    89
        indent = int(indent)
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    90
    # do we escape ?
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    91
    escape_str = request.REQUEST.get("escape")
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    92
    escape_bool = False
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    93
    if escape_str:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    94
        escape_bool = {'true': True, 'false': False, "0": False, "1": True}.get(escape_str.lower())
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    95
    
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    96
    # We search
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    97
    s = request.REQUEST.get("tag")
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    98
    if s:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    99
        # We get the projects with all the segments
730
38993be55b2b search_ldt factorization and correct template.
cavaliet
parents: 722
diff changeset
   100
        project_xml, results = search_generate_ldt(request, "tags", s, False)
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   101
        project = Project()
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   102
        project.ldt = lxml.etree.tostring(project_xml, pretty_print=True)
714
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   103
        # Needed datas for jsonification
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   104
        now = datetime.now()
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   105
        project.modification_date = project.creation_date = now
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   106
        #return HttpResponse(lxml.etree.tostring(project_xml, pretty_print=True), mimetype="text/xml;charset=utf-8")
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   107
        ps = ProjectSerializer(project, from_contents=False)
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   108
        mashup_dict = ps.serialize_to_cinelab()
714
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   109
        # Now we build the mashup with the good segments (the ones between in and out)
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   110
        if results:
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   111
            tc_in = 0
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   112
            if request.REQUEST.get("in") :
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   113
                tc_in = float(request.REQUEST.get("in"))
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   114
            tc_out = float('inf')
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   115
            if request.REQUEST.get("out") :
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   116
                tc_out = float(request.REQUEST.get("out"))
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   117
            # Since the timecodes are saved as strings, we filter after calculating float in and out. Timecodes are in milliseconds
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   118
            mashup_list = {
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   119
                "items": [],
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   120
                "meta": {
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   121
                    "dc:contributor": "IRI",
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   122
                    "dc:creator": "IRI",
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   123
                    "dc:title": "Generated mashup with tag '"+s+"'",
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   124
                    "dc:modified": now.isoformat(),
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   125
                    "dc:created": now.isoformat(),
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   126
                    "listtype": "mashup",
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   127
                    "dc:description": ""
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   128
                },
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   129
                "id": "generated_mashup_list"
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   130
            }
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   131
            #filtered_results = []
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   132
            for res in results:
722
2446fff2bea0 correct search result
cavaliet
parents: 714
diff changeset
   133
                cur_in = float(res["start_ts"])
714
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   134
                cur_out = cur_in + float(res["duration"])
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   135
                if tc_in<=cur_in and cur_out<=tc_out:
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   136
                     #filtered_results.append(res)
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   137
                     mashup_list["items"].append(res["element_id"])
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   138
            mashup_dict["lists"].append(mashup_list)
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   139
    
714
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   140
    #mashup_dict["escape_bool"] = escape_bool
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   141
    #mashup_dict["indent"] = indent
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   142
    
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   143
    json_str = simplejson.dumps(mashup_dict, ensure_ascii=False, indent=indent)
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   144
    if escape_bool:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   145
        json_str = escape(json_str)
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   146
    
754
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   147
    # Callback to allo jsonp
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   148
    callback = request.REQUEST.get("callback")
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   149
    if callback is not None:
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   150
        json_str = "%s(%s)" % (callback, json_str)
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   151
    
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   152
    resp = HttpResponse(mimetype="application/json; charset=utf-8")
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   153
    resp['Cache-Control'] = 'no-cache, must-revalidate'
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   154
    resp['Pragma'] = 'no-cache'
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   155
    resp.write(json_str)
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   156
    
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   157
    return resp