src/ldt/ldt/ldt_utils/views/json.py
author ndurand
Thu, 02 Apr 2015 17:29:54 +0200
changeset 1361 5087560b51b6
parent 1316 94e317204c4a
permissions -rw-r--r--
Upgrade to Django 1.6: reworked and fixed tests and deprecations
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 -*-
1361
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
     2
from datetime import datetime
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
     3
import json
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
     4
import logging
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
     5
import lxml.etree
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
     6
from operator import itemgetter
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
     7
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
     8
from django.conf import settings
504
32a878a71a80 Users arrive in front pages by default + bugfixes
verrierj
parents: 482
diff changeset
     9
from django.http import HttpResponse, HttpResponseForbidden
319
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    10
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
    11
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
    12
from django.utils.translation import ugettext as _
1361
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
    13
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
    14
import ldt.auth as ldt_auth
319
c45aed3c7a89 Remove unused imports in views
verrierj
parents: 315
diff changeset
    15
from ldt.ldt_utils.models import Project
886
3ccedd271e36 add to_cinelab serializer to api
cavaliet
parents: 754
diff changeset
    16
from ldt.ldt_utils.projectserializer import ProjectJsonSerializer
730
38993be55b2b search_ldt factorization and correct template.
cavaliet
parents: 722
diff changeset
    17
from ldt.ldt_utils.searchutils import search_generate_ldt
1361
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
    18
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    19
1093
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
    20
logger = logging.getLogger(__name__)
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
    21
386
4539db96ec75 Merge issues
verrierj
parents: 382
diff changeset
    22
1190
129d45eec68c Clean warning and errors for Django 1.5
ymh <ymh.work@gmail.com>
parents: 1093
diff changeset
    23
def project_json_id(request, id):  # @ReservedAssignment
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    24
    
1215
125ea12cce61 temporary modif removed and version number to 1.50.4
cavaliet
parents: 1209
diff changeset
    25
    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
    26
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    27
    return project_json(request, project, False)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    28
1190
129d45eec68c Clean warning and errors for Django 1.5
ymh <ymh.work@gmail.com>
parents: 1093
diff changeset
    29
def project_json_cutting_id(request, id, cutting_id):  # @ReservedAssignment
366
5bd7937ea1d7 Add view to select first cutting in json
verrierj
parents: 319
diff changeset
    30
404
4adc42ab55fd Fix minor bugs
verrierj
parents: 392
diff changeset
    31
    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
    32
5bd7937ea1d7 Add view to select first cutting in json
verrierj
parents: 319
diff changeset
    33
    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
    34
1190
129d45eec68c Clean warning and errors for Django 1.5
ymh <ymh.work@gmail.com>
parents: 1093
diff changeset
    35
def project_json_externalid(request, id):  # @ReservedAssignment
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    36
        
1190
129d45eec68c Clean warning and errors for Django 1.5
ymh <ymh.work@gmail.com>
parents: 1093
diff changeset
    37
    res_proj = get_list_or_404(Project.safe_objects.order_by('-modification_date'), contents__external_id=id)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    38
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    39
    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
    40
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
382
123b89cf599e Search results are clickable
verrierj
parents: 366
diff changeset
    43
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
    44
    
504
32a878a71a80 Users arrive in front pages by default + bugfixes
verrierj
parents: 482
diff changeset
    45
    if not ldt_auth.check_access(request.user, project):
32a878a71a80 Users arrive in front pages by default + bugfixes
verrierj
parents: 482
diff changeset
    46
        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
    47
        
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    48
    mimetype = request.REQUEST.get("mimetype")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    49
    if mimetype is None:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    50
        mimetype = "application/json; charset=utf-8"
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    51
    else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    52
        mimetype = mimetype.encode("utf-8")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    53
    if "charset" not in mimetype:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    54
        mimetype += "; charset=utf-8" 
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    55
    resp = HttpResponse(mimetype=mimetype)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    56
    resp['Cache-Control'] = 'no-cache, must-revalidate'
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    57
    resp['Pragma'] = 'no-cache'
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
    indent = request.REQUEST.get("indent")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    60
    if indent is None:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    61
        indent = settings.LDT_JSON_DEFAULT_INDENT
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    62
    else:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    63
        indent = int(indent)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    64
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    65
    callback = request.REQUEST.get("callback")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    66
    escape_str = request.REQUEST.get("escape")
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    67
    escape_bool = False
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    68
    if escape_str:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    69
        escape_bool = {'true': True, 'false': False, "0": False, "1": True}.get(escape_str.lower())
1316
94e317204c4a v1.53.8 : enhance json generation when for one media
cavaliet
parents: 1215
diff changeset
    70
    
94e317204c4a v1.53.8 : enhance json generation when for one media
cavaliet
parents: 1215
diff changeset
    71
    one_content_str = request.REQUEST.get("onecontent")
94e317204c4a v1.53.8 : enhance json generation when for one media
cavaliet
parents: 1215
diff changeset
    72
    one_content_bool = False
94e317204c4a v1.53.8 : enhance json generation when for one media
cavaliet
parents: 1215
diff changeset
    73
    if one_content_str:
94e317204c4a v1.53.8 : enhance json generation when for one media
cavaliet
parents: 1215
diff changeset
    74
        one_content_bool = {'true': True, 'false': False, "0": False, "1": True}.get(one_content_str.lower())
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    75
        
382
123b89cf599e Search results are clickable
verrierj
parents: 366
diff changeset
    76
        
886
3ccedd271e36 add to_cinelab serializer to api
cavaliet
parents: 754
diff changeset
    77
    ps = ProjectJsonSerializer(project, serialize_contents, first_cutting=first_cutting)
1316
94e317204c4a v1.53.8 : enhance json generation when for one media
cavaliet
parents: 1215
diff changeset
    78
    project_dict = ps.serialize_to_cinelab(one_content_bool)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    79
    
1361
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
    80
    json_str = json.dumps(project_dict, ensure_ascii=False, indent=indent)
315
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    81
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    82
    if callback is not None:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    83
        json_str = "%s(%s)" % (callback, json_str)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    84
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    85
    if escape_bool:
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    86
        json_str = escape(json_str)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    87
    
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    88
    resp.write(json_str)
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    89
877f89ec1efa Split big views.py files into several views grouped by "make sense".
cavaliet
parents:
diff changeset
    90
    return resp
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    91
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    92
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    93
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    94
def mashup_by_tag(request):
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    95
    # do we indent ?
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    96
    indent = request.REQUEST.get("indent")
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    97
    if indent is None:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    98
        indent = settings.LDT_JSON_DEFAULT_INDENT
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
    99
    else:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   100
        indent = int(indent)
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   101
    # do we escape ?
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   102
    escape_str = request.REQUEST.get("escape")
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   103
    escape_bool = False
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   104
    if escape_str:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   105
        escape_bool = {'true': True, 'false': False, "0": False, "1": True}.get(escape_str.lower())
1031
04f8cf193221 remove zero duration annotations parameter added in mashupbytag.
cavaliet
parents: 1030
diff changeset
   106
    # do we remove annotations from mashup if the have duration=0 ? (yes by default)
04f8cf193221 remove zero duration annotations parameter added in mashupbytag.
cavaliet
parents: 1030
diff changeset
   107
    remove_zero_dur_str = request.REQUEST.get("removezeroduration")
04f8cf193221 remove zero duration annotations parameter added in mashupbytag.
cavaliet
parents: 1030
diff changeset
   108
    remove_zero_dur = True
04f8cf193221 remove zero duration annotations parameter added in mashupbytag.
cavaliet
parents: 1030
diff changeset
   109
    if remove_zero_dur_str:
04f8cf193221 remove zero duration annotations parameter added in mashupbytag.
cavaliet
parents: 1030
diff changeset
   110
        remove_zero_dur = {'true': True, 'false': False, "0": False, "1": True}.get(remove_zero_dur_str.lower())
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   111
    
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   112
    # We search
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   113
    s = request.REQUEST.get("tag")
1025
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   114
    sort_type = request.REQUEST.get("sort", "")
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   115
    if s:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   116
        # We get the projects with all the segments
730
38993be55b2b search_ldt factorization and correct template.
cavaliet
parents: 722
diff changeset
   117
        project_xml, results = search_generate_ldt(request, "tags", s, False)
1093
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   118
        
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   119
        logger.debug("mashup_by_tag : search_generate_ldt done")
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   120
        
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   121
        project = Project()
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   122
        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
   123
        # Needed datas for jsonification
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   124
        now = datetime.now()
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   125
        project.modification_date = project.creation_date = now
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   126
        #return HttpResponse(lxml.etree.tostring(project_xml, pretty_print=True), mimetype="text/xml;charset=utf-8")
1093
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   127
        logger.debug("mashup_by_tag : serialize_to_cinelab prepare")
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   128
        
886
3ccedd271e36 add to_cinelab serializer to api
cavaliet
parents: 754
diff changeset
   129
        ps = ProjectJsonSerializer(project, from_contents=False)
1093
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   130
        logger.debug("mashup_by_tag : serialize_to_cinelab serializer ready")        
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   131
        mashup_dict = ps.serialize_to_cinelab()
1093
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   132
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   133
        logger.debug("mashup_by_tag : serialize_to_cinelab done")
03104d3f6ca1 Requests optimisations
ymh <ymh.work@gmail.com>
parents: 1076
diff changeset
   134
        
714
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   135
        # 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
   136
        if results:
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   137
            tc_in = 0
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   138
            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
   139
                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
   140
            tc_out = float('inf')
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   141
            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
   142
                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
   143
            # 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
   144
            mashup_list = {
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   145
                "items": [],
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   146
                "meta": {
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   147
                    "dc:contributor": "IRI",
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   148
                    "dc:creator": "IRI",
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   149
                    "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
   150
                    "dc:modified": now.isoformat(),
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   151
                    "dc:created": now.isoformat(),
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   152
                    "listtype": "mashup",
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   153
                    "dc:description": ""
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   154
                },
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   155
                "id": "generated_mashup_list"
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   156
            }
1025
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   157
            # If sort_type = weight, we sort the result by the tag's weight
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   158
            if sort_type.lower() == "weight":
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   159
                # First we turn each string timecode to a float
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   160
                for res in results:
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   161
                    res["start_ts"] = float(res["start_ts"])
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   162
                    res["duration"] = float(res["duration"])
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   163
                # We sort to group by start_ts for each media/iri_id
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   164
                sorted_results = sorted(results, key=itemgetter("iri_id", "start_ts", "duration"))
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   165
                highest_weighted = []
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   166
                current_weight = 1
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   167
                nb_res = len(sorted_results)
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   168
                for i, res in enumerate(sorted_results):
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   169
                    # Explanation : we calculate the weight, which is the number of segments 
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   170
                    # tagged with the searched tag for the same iri_id at the same start_ts.
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   171
                    # Thanks to the previous sort, the last segment is the one with the longest duration and the one we finally keep
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   172
                    next_res = None
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   173
                    if i<(nb_res-1):
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   174
                        next_res = sorted_results[i+1]
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   175
                    if next_res and next_res["iri_id"]==res["iri_id"] and next_res["start_ts"]==res["start_ts"]:
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   176
                        current_weight += 1
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   177
                        continue
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   178
                    res["weight"] = current_weight
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   179
                    highest_weighted.append(res)
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   180
                    current_weight = 1
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   181
                
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   182
                # Now that we have the weight for all temporal segments, we just have to sort the array.
1055
43a60bdffe69 correct sort in mashupbytag
cavaliet
parents: 1054
diff changeset
   183
                highest_weighted = sorted(highest_weighted, key=itemgetter("weight"), reverse=True)
1025
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   184
                for res in highest_weighted:
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   185
                    cur_in = res["start_ts"]
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   186
                    cur_out = cur_in + res["duration"]
1054
54b0ac8c4a1f avoid doubloon in mashuptag
cavaliet
parents: 1050
diff changeset
   187
                    if tc_in<=cur_in and cur_out<=tc_out and ((not remove_zero_dur) or (remove_zero_dur and res["duration"]>0.0)) and (res["element_id"] not in mashup_list["items"]):
1025
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   188
                        #mashup_list["items"].append(res["iri_id"] + ", " + res["element_id"] + ", " + str(res["start_ts"]) + ", " + str(res["duration"]) + ", " + str(res["weight"]))
1050
0eee72ebc2c0 add title sort after weight sort (correction)
cavaliet
parents: 1049
diff changeset
   189
                        #mashup_list["items"].append(res["element_id"] + ", " + str(res["weight"]) + ", " + res["title"])
1025
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   190
                        mashup_list["items"].append(res["element_id"])
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   191
            else:
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   192
                # no particular sorting
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   193
                for res in results:
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   194
                    cur_in = float(res["start_ts"])
1031
04f8cf193221 remove zero duration annotations parameter added in mashupbytag.
cavaliet
parents: 1030
diff changeset
   195
                    dur = float(res["duration"])
04f8cf193221 remove zero duration annotations parameter added in mashupbytag.
cavaliet
parents: 1030
diff changeset
   196
                    cur_out = cur_in + dur
04f8cf193221 remove zero duration annotations parameter added in mashupbytag.
cavaliet
parents: 1030
diff changeset
   197
                    if tc_in<=cur_in and cur_out<=tc_out and ((not remove_zero_dur) or (remove_zero_dur and dur>0.0)):
1025
fc3d5e88cd45 sort by weight for mashupbytag
cavaliet
parents: 886
diff changeset
   198
                        mashup_list["items"].append(res["element_id"])
1076
a11c8dba822e correct add_segment in annotation api. version number upgraded to 1.46.
cavaliet
parents: 1056
diff changeset
   199
            if mashup_dict["lists"] is None:
a11c8dba822e correct add_segment in annotation api. version number upgraded to 1.46.
cavaliet
parents: 1056
diff changeset
   200
                mashup_dict["lists"] = []
714
a25d344cb446 second step for mashup json (works fine but does not sort mashup by weight).
cavaliet
parents: 713
diff changeset
   201
            mashup_dict["lists"].append(mashup_list)
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   202
    
1030
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   203
            # If asked, we remove the annotations not used in the mashup.
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   204
            # It enabled a lighter response 
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   205
            remove_not_used_str = request.REQUEST.get("removenotused")
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   206
            remove_not_used = False
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   207
            if remove_not_used_str:
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   208
                remove_not_used = {'true': True, 'false': False, "0": False, "1": True}.get(remove_not_used_str.lower())
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   209
            if remove_not_used:
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   210
                for a in mashup_dict["annotations"]:
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   211
                    if a["id"] not in mashup_list["items"]:
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   212
                        mashup_dict["annotations"].remove(a)
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   213
    
581c7906ebb4 enable remove unused annotations in mashupbytag
cavaliet
parents: 1025
diff changeset
   214
    
1361
5087560b51b6 Upgrade to Django 1.6: reworked and fixed tests and deprecations
ndurand
parents: 1316
diff changeset
   215
    json_str = json.dumps(mashup_dict, ensure_ascii=False, indent=indent)
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   216
    if escape_bool:
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   217
        json_str = escape(json_str)
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   218
    
754
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   219
    # Callback to allo jsonp
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   220
    callback = request.REQUEST.get("callback")
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   221
    if callback is not None:
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   222
        json_str = "%s(%s)" % (callback, json_str)
3efbab60855a allow jsonp on mashupbytag.
cavaliet
parents: 730
diff changeset
   223
    
713
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   224
    resp = HttpResponse(mimetype="application/json; charset=utf-8")
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   225
    resp.write(json_str)
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   226
    
202fb1255d8b first step for mashup json.
cavaliet
parents: 691
diff changeset
   227
    return resp