Add search form, displaying the results in a regular LDT template. Update language files.
authorcavaliet
Tue, 24 May 2011 12:44:05 +0200
changeset 122 f3a013f66974
parent 121 a95b0246db99
child 123 7cc4b3210840
Add search form, displaying the results in a regular LDT template. Update language files.
src/ldt/ldt/ldt_utils/forms.py
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html
src/ldt/ldt/ldt_utils/urls.py
src/ldt/ldt/ldt_utils/views.py
src/ldt/ldt/locale/fr/LC_MESSAGES/django.mo
src/ldt/ldt/locale/fr/LC_MESSAGES/django.po
src/ldt/ldt/static/ldt/js/projectscontents.js
src/ldt/ldt/static/ldt/swf/ldt/LignesDeTempsFlex.swf
src/ldt/ldt/templates/ldt/ldt_base.html
web/ldtplatform/config.py.tmpl
web/ldtplatform/settings.py
--- a/src/ldt/ldt/ldt_utils/forms.py	Fri May 20 14:19:15 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/forms.py	Tue May 24 12:44:05 2011 +0200
@@ -1,82 +1,83 @@
-from django import forms
-from django.utils.translation import ugettext_lazy as _
-from ldt.forms import widgets as ldt_widgets
-from models import Project, Content, Media
-from utils import generate_uuid
-
-class LdtImportForm(forms.Form):
-    importFile = forms.FileField()
-    videoPath = forms.CharField(required=False)
-    flatten = forms.BooleanField(required=False, initial=True)   
-    
-class LdtAddForm(forms.ModelForm):
-    title = forms.CharField()
-    contents = forms.ModelMultipleChoiceField(Content.objects.all()) #@UndefinedVariable
-    # owner = forms.ModelChoiceField(Author.objects.all())
-    class Meta:
-        model = Project
-        exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner")   
-
-class ReindexForm(forms.Form):
-    contents = forms.ModelMultipleChoiceField(Content.objects.all()) #@UndefinedVariable
-    index_projects = forms.BooleanField(required=False, initial=False)
-
-class SearchForm(forms.Form):
-    search = forms.CharField()
-    field = forms.ChoiceField([(u"all", u"all"), (u"title", u"title"), (u"abstract", u"resume"), (u"tags", u"tags")])
-
-class AddProjectForm (forms.Form):
-    title = forms.CharField(widget=forms.TextInput(attrs={'class':'inputbox required'}))
-
-class CopyProjectForm (forms.Form):
-    title = forms.CharField()
-    
-
-class ContentForm(forms.ModelForm):
-
-    #iri_id = forms.CharField(max_length=1024, widget=forms.HiddenInput, initial=generate_uuid)
-    iriurl = forms.CharField(max_length=1024, widget=forms.HiddenInput, required=False)
-    content_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False, label=_("content.content_creation_date"))
-    media_input_type = forms.ChoiceField(required=False, label=_("content.media_input_type"), choices=(("upload", _("file_upload")), ("url", _("url")), ("link", _("existing_media")), ("create", _("create_media")), ("none", _("none_media"))))
-    
-    def clean_iri_id(self):
-        data = self.cleaned_data.get('iri_id')
-        if not data:
-            data = generate_uuid()
-        return data
-    
-    def clean(self):
-        cleaned_data = self.cleaned_data
-        iriurl_data = cleaned_data.get('iriurl')
-        iri_id_data = cleaned_data['iri_id']
-        if not iriurl_data:
-            iriurl_data = "%s/%s.iri" % (iri_id_data, iri_id_data)    
-        cleaned_data['iriurl'] = iriurl_data
-        return cleaned_data
-    
-    class Meta:
-        model = Content
-        exclude = ("creation_date", "update_date", "authors")
-        widgets = {
-                   'iri_id': forms.HiddenInput,
-        }
-        
-    class Media:
-        css = {
-            'all' : ('admin/css/forms.css', 'admin/css/base.css', 'admin/css/widgets.css')
-               }
-        
-class MediaForm(forms.ModelForm):
-    
-    media_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False)
-    media_file = forms.FileField(required=False);
-    src = forms.CharField(required=False, max_length=1024)
-
-    class Meta:
-        model = Media
-        exclude = ("creation_date", "update_date", "creator")
-    
-    class Media:
-        css = {
-            'all' : ('admin/css/forms.css', 'admin/css/base.css', 'admin/css/widgets.css')
-               }
+from django import forms
+from django.utils.translation import ugettext_lazy as _
+from ldt.forms import widgets as ldt_widgets
+from models import Project, Content, Media
+from utils import generate_uuid
+
+class LdtImportForm(forms.Form):
+    importFile = forms.FileField()
+    videoPath = forms.CharField(required=False)
+    flatten = forms.BooleanField(required=False, initial=True)   
+    
+class LdtAddForm(forms.ModelForm):
+    title = forms.CharField()
+    contents = forms.ModelMultipleChoiceField(Content.objects.all()) #@UndefinedVariable
+    # owner = forms.ModelChoiceField(Author.objects.all())
+    class Meta:
+        model = Project
+        exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner")   
+
+class ReindexForm(forms.Form):
+    contents = forms.ModelMultipleChoiceField(Content.objects.all()) #@UndefinedVariable
+    index_projects = forms.BooleanField(required=False, initial=False)
+
+class SearchForm(forms.Form):
+    search = forms.CharField(label=_("Search"))
+    field = forms.ChoiceField([(u"all", u"all"), (u"title", u"title"), (u"abstract", u"resume"), (u"tags", u"tags")], label=_("Fields"))
+    ldt_pres = forms.BooleanField(required=False, initial=True, label=_("Display the results in Lignes De Temps"))
+
+class AddProjectForm (forms.Form):
+    title = forms.CharField(widget=forms.TextInput(attrs={'class':'inputbox required'}))
+
+class CopyProjectForm (forms.Form):
+    title = forms.CharField()
+    
+
+class ContentForm(forms.ModelForm):
+
+    #iri_id = forms.CharField(max_length=1024, widget=forms.HiddenInput, initial=generate_uuid)
+    iriurl = forms.CharField(max_length=1024, widget=forms.HiddenInput, required=False)
+    content_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False, label=_("content.content_creation_date"))
+    media_input_type = forms.ChoiceField(required=False, label=_("content.media_input_type"), choices=(("upload", _("file_upload")), ("url", _("url")), ("link", _("existing_media")), ("create", _("create_media")), ("none", _("none_media"))))
+    
+    def clean_iri_id(self):
+        data = self.cleaned_data.get('iri_id')
+        if not data:
+            data = generate_uuid()
+        return data
+    
+    def clean(self):
+        cleaned_data = self.cleaned_data
+        iriurl_data = cleaned_data.get('iriurl')
+        iri_id_data = cleaned_data['iri_id']
+        if not iriurl_data:
+            iriurl_data = "%s/%s.iri" % (iri_id_data, iri_id_data)    
+        cleaned_data['iriurl'] = iriurl_data
+        return cleaned_data
+    
+    class Meta:
+        model = Content
+        exclude = ("creation_date", "update_date", "authors")
+        widgets = {
+                   'iri_id': forms.HiddenInput,
+        }
+        
+    class Media:
+        css = {
+            'all' : ('admin/css/forms.css', 'admin/css/base.css', 'admin/css/widgets.css')
+               }
+        
+class MediaForm(forms.ModelForm):
+    
+    media_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False)
+    media_file = forms.FileField(required=False);
+    src = forms.CharField(required=False, max_length=1024)
+
+    class Meta:
+        model = Media
+        exclude = ("creation_date", "update_date", "creator")
+    
+    class Media:
+        css = {
+            'all' : ('admin/css/forms.css', 'admin/css/base.css', 'admin/css/widgets.css')
+               }
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html	Fri May 20 14:19:15 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html	Tue May 24 12:44:05 2011 +0200
@@ -29,18 +29,19 @@
 	window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
 	
 	$(document).ready(function() {
-		// url_upload, media_prefix, post_added_params, btn_label, success_label, wait_label, cancel_label
+		// url_upload, media_prefix, post_added_params, btn_label, success_label, wait_label, cancel_label, remove_url, get_dur_url
 		post_added_params = {"csrfmiddlewaretoken" : "{{csrf_token}}",
                     		"{{cookie_name}}" : "{{session_key}}"};
 		
 		onCreateContentReady("{% url ldt.ldt_utils.views.upload %}",
-							"{{LDT_MEDIA_PREFIX}}", 
+							"{{LDT_MEDIA_PREFIX}}",
 							post_added_params,
 							'{% trans "Browse" %}',
 							'{% trans "File uploaded" %}',
 							'{% trans "Please wait, the upload is not finished yet" %}',
 							'{% trans "Cancel upload" %}',
-							"{% url ldt.ldt_utils.views.removetempfile %}");
+							"{% url ldt.ldt_utils.views.removetempfile %}",
+							"{% url ldt.ldt_utils.views.get_duration %}");
 	});
 	
     </script>
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html	Fri May 20 14:19:15 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html	Tue May 24 12:44:05 2011 +0200
@@ -1,13 +1,31 @@
-{% extends "ldt/base.html" %} {% block content %}
+{% extends "ldt/ldt_base.html" %}
+{% load i18n %}
 
-<form method="post"
-	action="{{WEB_URL}}{% url ldt.ldt_utils.views.searchIndex %}"
+{% block js_declaration %}
+<script type="text/javascript">
+	// We disable the default submit
+	$(document).ready(function() {
+	    $('#my_form').submit(function() {
+	        if($('#id_search').val()==""){
+	            alert('{% trans "The search field can not be empty." %}');
+	            return false;
+	        }
+	        else{
+	            return true;
+	        }
+	    });
+    });
+</script>
+{% endblock %}
+
+{% block content %}
+<form method="post" id="my_form"
+	{% comment %}action="{{WEB_URL}}{% url ldt.ldt_utils.views.searchIndex %}"{% endcomment %}
+	action="{% url ldt.ldt_utils.views.searchIndex %}"
 	accept-charset="utf-8">
-
+{% csrf_token %}
 <table>
 	{{ form.as_table }}
 </table>
 <input type="submit" /></form>
-
-
 {% endblock %}
--- a/src/ldt/ldt/ldt_utils/urls.py	Fri May 20 14:19:15 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/urls.py	Tue May 24 12:44:05 2011 +0200
@@ -1,58 +1,59 @@
-from django.conf.urls.defaults import patterns, url
-from ldt.management import test_ldt
-
-# Uncomment the next two lines to enable the admin:
-# from django.contrib import admin
-# admin.autodiscover()
-
-urlpatterns = patterns('ldt.ldt_utils',
-    url(r'^searchInit/(?P<field>.*)/(?P<query>.*)$', 'views.searchInit'),
-    url(r'^searchForm/$', 'views.searchForm'),
-    url(r'^search/$', 'views.searchIndex'),
-    url(r'^search/(?P<field>.*)/(?P<query>.*)$', 'views.searchIndexGet'),
-    url(r'^searchLdt/(?P<field>.*)/(?P<query>.*)$', 'views.searchLdt'),
-    url(r'^searchSeg/(?P<field>.*)/(?P<query>.*)$', 'views.searchSegments'),
-    url(r'^index/(?P<url>.*)$', 'views.index'),
-    url(r'^init/(?P<method>.*)/(?P<url>.*)$', 'views.init', name='ldt_init'),
-    url(r'^ldt/(?P<url>.*)$', 'views.ldt'),
-    url(r'^search/loading/$', 'views.loading'),
-    url(r'^create/(?P<iri_id>.*)$', 'views.create_project'),
-    url(r'^copy/(?P<ldt_id>.*)$', 'views.copy_project'),
-    url(r'^update/(?P<ldt_id>.*)$', 'views.update_project'),
-    url(r'^cljson/id/(?P<id>.*)$', 'views.project_json_id'),
-    url(r'^cljson/externalid/(?P<id>.*)$', 'views.project_json_externalid'),
-    url(r'^rdf/id/(?P<ldt_id>.*)$', 'views.project_annotations_rdf'),
-    url(r'^/?$', "views.workspace", name="root-view"),
-    url(r'^filterprojects/_(?P<filter>[\w\%\_\-\+]*?)/(?P<is_owner>true|false)/(?P<status>\d)$', "views.projectsfilter",),
-    url(r'^filtercontents/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.contentsfilter",),
-    (r'^embedpopup/?$', "views.popup_embed"),
-    url(r'^segment/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.index_segment'),
-    url(r'^segmentInit/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.init_segment'),
-    url(r'^segmentLdt/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.ldt_segment'),
-    url(r'^segmentHighlight/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.highlight_segment'),
-)
-
-urlpatterns += patterns('',
-    url('^jsi18n', 'django.views.i18n.javascript_catalog', name='jsi18n'),
-)
-
-
-if test_ldt():
-    urlpatterns += patterns('ldt.ldt_utils',
-        url(r'^space/content/$', 'views.list_content'),
-        url(r'^space/content/create/$', 'views.write_content'),
-        url(r'^space/content/update/(?P<iri_id>[\w-]+)$', 'views.write_content'),
-        url(r'^space/ldt/$', 'views.list_ldt'),
-        url(r'^space/ldt/indexproject/(?P<id>.*)$', 'views.index_project', name='index_project'),
-        url(r'^space/ldt/indexprojectfull/(?P<id>.*)$', 'views.index_project', {'full': True}, name='index_project_full'),
-        url(r'^space/ldt/init/(?P<method>.*)/(?P<url>.+)$', 'views.init', name='space_ldt_init'),
-        url(r'^space/ldt/project/(?P<id>.*)$', 'views.ldtProject'),
-        url(r'^space/ldt/create/$', 'views.create_ldt_view'),
-        url(r'^space/ldt/created_done/$', 'views.created_ldt'),
-        url(r'^space/ldt/save/$', 'views.save_ldtProject'),
-        url(r'^space/ldt/publish/(?P<id>[\w-]*)(?:/(?P<redirect>true|false))?$', 'views.publish'),
-        url(r'^space/ldt/unpublish/(?P<id>[\w-]*)(?:/(?P<redirect>true|false))?$', 'views.unpublish'),
-        url(r'^space/upload/$', 'views.upload'),
-        url(r'^space/removetempfile/$', 'views.removetempfile'),
-
-)
+from django.conf.urls.defaults import patterns, url
+from ldt.management import test_ldt
+
+# Uncomment the next two lines to enable the admin:
+# from django.contrib import admin
+# admin.autodiscover()
+
+urlpatterns = patterns('ldt.ldt_utils',
+    url(r'^searchInit/(?P<field>.*)/(?P<query>.*)$', 'views.searchInit'),
+    url(r'^searchForm/$', 'views.searchForm'),
+    url(r'^search/$', 'views.searchIndex'),
+    url(r'^search/(?P<field>.*)/(?P<query>.*)$', 'views.searchIndexGet'),
+    url(r'^searchLdt/(?P<field>.*)/(?P<query>.*)$', 'views.searchLdt'),
+    url(r'^searchSeg/(?P<field>.*)/(?P<query>.*)$', 'views.searchSegments'),
+    url(r'^index/(?P<url>.*)$', 'views.index'),
+    url(r'^init/(?P<method>.*)/(?P<url>.*)$', 'views.init', name='ldt_init'),
+    url(r'^ldt/(?P<url>.*)$', 'views.ldt'),
+    url(r'^search/loading/$', 'views.loading'),
+    url(r'^create/(?P<iri_id>.*)$', 'views.create_project'),
+    url(r'^copy/(?P<ldt_id>.*)$', 'views.copy_project'),
+    url(r'^update/(?P<ldt_id>.*)$', 'views.update_project'),
+    url(r'^cljson/id/(?P<id>.*)$', 'views.project_json_id'),
+    url(r'^cljson/externalid/(?P<id>.*)$', 'views.project_json_externalid'),
+    url(r'^rdf/id/(?P<ldt_id>.*)$', 'views.project_annotations_rdf'),
+    url(r'^/?$', "views.workspace", name="root-view"),
+    url(r'^filterprojects/_(?P<filter>[\w\%\_\-\+]*?)/(?P<is_owner>true|false)/(?P<status>\d)$', "views.projectsfilter",),
+    url(r'^filtercontents/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.contentsfilter",),
+    (r'^embedpopup/?$', "views.popup_embed"),
+    url(r'^segment/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.index_segment'),
+    url(r'^segmentInit/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.init_segment'),
+    url(r'^segmentLdt/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.ldt_segment'),
+    url(r'^segmentHighlight/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.highlight_segment'),
+)
+
+urlpatterns += patterns('',
+    url('^jsi18n', 'django.views.i18n.javascript_catalog', name='jsi18n'),
+)
+
+
+if test_ldt():
+    urlpatterns += patterns('ldt.ldt_utils',
+        url(r'^space/content/$', 'views.list_content'),
+        url(r'^space/content/create/$', 'views.write_content'),
+        url(r'^space/content/update/(?P<iri_id>[\w-]+)$', 'views.write_content'),
+        url(r'^space/ldt/$', 'views.list_ldt'),
+        url(r'^space/ldt/indexproject/(?P<id>.*)$', 'views.index_project', name='index_project'),
+        url(r'^space/ldt/indexprojectfull/(?P<id>.*)$', 'views.index_project', {'full': True}, name='index_project_full'),
+        url(r'^space/ldt/init/(?P<method>.*)/(?P<url>.+)$', 'views.init', name='space_ldt_init'),
+        url(r'^space/ldt/project/(?P<id>.*)$', 'views.ldtProject'),
+        url(r'^space/ldt/create/$', 'views.create_ldt_view'),
+        url(r'^space/ldt/created_done/$', 'views.created_ldt'),
+        url(r'^space/ldt/save/$', 'views.save_ldtProject'),
+        url(r'^space/ldt/publish/(?P<id>[\w-]*)(?:/(?P<redirect>true|false))?$', 'views.publish'),
+        url(r'^space/ldt/unpublish/(?P<id>[\w-]*)(?:/(?P<redirect>true|false))?$', 'views.unpublish'),
+        url(r'^space/upload/$', 'views.upload'),
+        url(r'^space/removetempfile/$', 'views.removetempfile'),
+        url(r'^space/getduration/$', 'views.get_duration'),
+
+)
--- a/src/ldt/ldt/ldt_utils/views.py	Fri May 20 14:19:15 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/views.py	Tue May 24 12:44:05 2011 +0200
@@ -1,983 +1,1019 @@
-from django.conf import settings
-from django.contrib.auth.decorators import login_required
-from django.core.urlresolvers import reverse
-from django.db.models import Q
-from django.forms.models import model_to_dict
-from django.forms.util import ErrorList
-from django.http import (HttpResponse, HttpResponseRedirect,
-    HttpResponseForbidden, HttpResponseServerError)
-from django.shortcuts import (render_to_response, get_object_or_404,
-    get_list_or_404)
-from django.template import RequestContext
-from django.template.loader import render_to_string
-from django.utils import simplejson
-from django.utils.html import escape
-from django.utils.translation import ugettext as _, ungettext
-from forms import (LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm,
-    ContentForm, MediaForm)
-from ldt.core.models import Owner
-from ldt.ldt_utils.models import Content
-from ldt.ldt_utils.utils import boolean_convert, LdtUtils, LdtSearch
-from lxml.html import fragment_fromstring
-from models import Media, Project
-from projectserializer import ProjectSerializer
-from urllib2 import urlparse
-import base64
-import django.core.urlresolvers
-import ldt.auth as ldt_auth
-import ldt.utils.path as ldt_utils_path
-import logging
-import lxml.etree
-import mimetypes
-import os
-import urllib2
-
-
-
-@login_required
-def workspace(request):
-
-    # list of contents
-    content_list = Content.objects.all() #@UndefinedVariable
-
-    # get list of projects
-    project_list = Project.objects.all() #@UndefinedVariable
-    
-    is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
-    
-    # render list
-    return render_to_response("ldt/ldt_utils/workspace.html",
-                              {'contents': content_list, 'projects': project_list,
-                               'is_gecko': is_gecko},
-                              context_instance=RequestContext(request))
-
-
-def popup_embed(request):
-
-    json_url = request.GET.get("json_url")
-    player_id = request.GET.get("player_id")
-    ldt_id = request.GET.get("ldt_id")
-
-
-    project = Project.objects.get(ldt_id=ldt_id); #@UndefinedVariable
-
-    stream_mode = project.stream_mode
-    if stream_mode != "video":
-        stream_mode = 'radio'
-
-    player_width = 650
-    player_height = 480
-    
-    if stream_mode == 'radio':
-        player_height = 1
-        
-    if not ldt_auth.checkAccess(request.user, project):
-        return HttpResponseForbidden(_("You can not access this project"))
-
-    ps = ProjectSerializer(project, from_contents=False, from_display=True)
-    annotations = ps.getAnnotations(first_cutting=True)
-    
-    rend_dict = {'json_url':json_url, 'player_id':player_id, 'annotations':annotations, 'ldt_id': ldt_id, 'stream_mode': stream_mode, 'player_width': player_width, 'player_height': player_height}
-
-    embed_rendered = dict((typestr,
-                           (lambda s:escape(lxml.etree.tostring(fragment_fromstring(render_to_string("ldt/ldt_utils/partial/embed_%s.html" % (s), rend_dict, context_instance=RequestContext(request))), pretty_print=True)))(typestr))
-                           for typestr in ('player', 'seo_body', 'seo_meta', 'links'))
-
-    rend_dict['embed_rendered'] = embed_rendered
-
-    return render_to_response("ldt/ldt_utils/embed_popup.html",
-                              rend_dict,
-                              context_instance=RequestContext(request))
-
-
-
-@login_required
-def projectsfilter(request, filter, is_owner=False, status=0):
-
-    is_owner = boolean_convert(is_owner)
-    status = int(status)
-    query = Q()
-
-    if is_owner:
-        owner = None
-        try:
-            owner = Owner.objects.get(user=request.user) #@UndefinedVariable
-        except:
-            return HttpResponseServerError("<h1>User not found</h1>")
-        query &= Q(owner=owner)
-
-    if status > 0:
-        query &= Q(state=status)
-
-    if filter:
-        if len(filter) > 0 and filter[0] == '_':
-            filter = filter[1:]
-        query &= Q(title__icontains=filter)
-
-    project_list = Project.objects.filter(query) #@UndefinedVariable
-    
-    is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
-
-    return render_to_response("ldt/ldt_utils/partial/projectslist.html",
-                              {'projects': project_list, 'is_gecko': is_gecko},
-                              context_instance=RequestContext(request))
-
-
-
-@login_required
-def contentsfilter(request, filter):
-    if filter and len(filter) > 0 and filter[0] == '_':
-        filter = filter[1:]
-
-    if filter:
-        content_list = Content.objects.filter(title__icontains=filter) #@UndefinedVariable
-    else:
-        content_list = Content.objects.all() #@UndefinedVariable
-
-    return render_to_response("ldt/ldt_utils/partial/contentslist.html",
-                              {'contents': content_list},
-                              context_instance=RequestContext(request))
-
-
-def searchForm(request):
-    form = SearchForm()
-    return render_to_response('ldt/ldt_utils/search_form.html', {'form': form} , context_instance=RequestContext(request))    
-
-def searchIndex(request):
-    
-    sform = SearchForm(request.POST)
-    if sform.is_valid():
-        search = sform.cleaned_data["search"]
-    
-    
-        queryStr = base64.urlsafe_b64encode(search.encode('utf8'))
-        field = request.POST["field"]
-        language_code = request.LANGUAGE_CODE[:2]
-    
-        url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, queryStr])
-        return render_to_response('ldt/ldt_utils/init_ldt.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
-    else:
-        resp = HttpResponse()
-        resp.write("<html><head></head><body>Error : No result</body></html>");
-
-def searchIndexGet(request, field, query):
-
-    language_code = request.LANGUAGE_CODE[:2]
-    url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, query])
-    return render_to_response('ldt/ldt_utils/init_ldt.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
-
-def searchInit(request, field, query):
-    
-    ldtgen = LdtUtils()
-    
-    doc = ldtgen.generateInit([field, query], 'ldt.ldt_utils.views.searchLdt', 'ldt.ldt_utils.views.searchSegments')
-    
-    resp = HttpResponse(mimetype="text/xml;charset=utf-8")
-    doc.write(resp, pretty_print=True)
-    return resp
-
-def searchLdt(request, field, query, edition=None):
-    
-    contentList = []
-    resp = HttpResponse(mimetype="text/xml")
-    queryStr = ""
-
-    if query and len(query) > 0:        
-        queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8")
-        searcher = LdtSearch()
-        ids = {}
-        
-        for result in searcher.query(field, queryStr):
-            ids[result["iri_id"]] = ""            
-
-        id_list = ids.keys()
-        
-        #if edition is not None:
-        #    ids_editions = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id")))            
-        #    id_list = filter(lambda id: id in id_list, ids_editions)
-            
-        contentList = Content.objects.filter(iri_id__in=id_list)        #@UndefinedVariable
-
-            
-    ldtgen = LdtUtils()
-    doc = ldtgen.generateLdt(contentList, title=u"Recherche : " + queryStr)
-    doc.write(resp, pretty_print=True)
-
-    
-    return resp
-
-
-def searchSegments(request, field, query, edition=None):
-    
-    if query and len(query) > 0:
-        searcher = LdtSearch()
-        
-        queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8")
-        res = searcher.query(field, queryStr)
-    else:
-        res = []
-        
-    iri_ids = None
-    
-    #if edition is not None:
-    #    iri_ids = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id")))
-
-    iri = lxml.etree.Element('iri')
-    doc = lxml.etree.ElementTree(iri)	
-
-    for resultMap in res:
-        if iri_ids is None or resultMap['iri_id'] in iri_ids:
-            seg = lxml.etree.SubElement(iri, 'seg')
-            seg.set('idctt', resultMap['iri_id'])
-            seg.set('idens', resultMap['ensemble_id'])
-            seg.set('iddec', resultMap['decoupage_id'])
-            seg.set('idseg', resultMap['element_id'])
-            seg.set('idvue', "")
-            seg.set('crit', "")
-  
-    return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") 
-
-
-
-@login_required         
-def list_ldt(request):
-    contents = Content.objects.all() #@UndefinedVariable
-    try:
-        owner = Owner.objects.get(user=request.user) #@UndefinedVariable
-    except:
-        return HttpResponseRedirect(settings.LOGIN_URL)
-    ldtProjects = Project.objects.filter(owner=owner) #@UndefinedVariable
-    context = {
-    'contents': contents,
-    'projects': ldtProjects.reverse(),
-    }
-    return render_to_response('ldt/ldt_utils/ldt_list.html', context, context_instance=RequestContext(request))
-
-@login_required         
-def list_content(request):
-    contents = Content.objects.all() #@UndefinedVariable
-    context = {
-        'contents': contents,
-    }
-    return render_to_response('ldt/ldt_utils/content_list.html', context, context_instance=RequestContext(request))
-
-@login_required
-def create_ldt_view(request):
-    if request.method == "POST" :
-        form = LdtAddForm(request.POST)
-        if form.is_valid():
-            user = request.user
-            Project.create_project(title=form.cleaned_data['title'], user=user, contents=form.cleaned_data['contents'])
-            form_status = "saved"
-            contents = []
-    else:
-        form = LdtAddForm()
-        contents = Content.objects.all() #@UndefinedVariable
-        form_status = "none"
-            
-    return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form, 'form_status':form_status, 'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request))
-     
-def created_ldt(request):
-    return render_to_response('ldt/ldt_utils/save_done.html', context_instance=RequestContext(request))
-
-
-def index_segment(request, project_id, content_id, cutting_id, ensemble_id, segment_id):
-    url_str = settings.WEB_URL + reverse("ldt.ldt_utils.views.init_segment", args=[project_id, content_id, ensemble_id, cutting_id, segment_id])
-    post_url = ""
-    language_code = request.LANGUAGE_CODE[:2]
-    readonly = 'true'
-    template_path = 'ldt/ldt_utils/init_ldt.html'
-    
-    return render_to_response(template_path, {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url_str, 'posturl': post_url, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request))
-
-def init_segment(request, project_id, content_id, ensemble_id, cutting_id, segment_id):
-    
-    ldtgen = LdtUtils()
-    doc = ldtgen.generateInit([project_id, content_id, ensemble_id, cutting_id, segment_id], 'ldt.ldt_utils.views.ldt_segment', 'ldt.ldt_utils.views.highlight_segment')
-    
-    return HttpResponse(lxml.etree.tostring(lxml.etree.ElementTree(doc), pretty_print=True), mimetype="text/xml;charset=utf-8")
-
-def highlight_segment(request, project_id, content_id, ensemble_id, cutting_id, segment_id):
-        
-    iri = lxml.etree.Element('iri')
-    doc = lxml.etree.ElementTree(iri)    
-
-    seg = lxml.etree.SubElement(iri, 'seg')
-    seg.set('idctt', content_id)
-    seg.set('idens', ensemble_id)
-    seg.set('iddec', cutting_id)
-    seg.set('idseg', segment_id)
-    seg.set('idvue', "")
-    seg.set('crit', "")
-  
-    return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") 
-
-
-def ldt_segment(request, project_id, content_id, ensemble_id, cutting_id, segment_id):
-
-    resp = HttpResponse(mimetype="text/xml")
-    resp['Cache-Control'] = 'no-cache, must-revalidate'
-    resp['Pragma'] = 'no-cache'
-    
-    if project_id and project_id != "_" :
-        project = Project.objects.get(ldt_id=project_id) #@UndefinedVariable
-        ldtdoc = lxml.etree.fromstring(project.ldt.encode("utf-8"))
-        displays_node = ldtdoc.find("displays")
-        if not displays_node:
-            displays_node = lxml.etree.SubElement(ldtdoc,u"displays")        
-        res = displays_node.xpath("display")
-        if len(res) > 0:
-            display_node = res[0]
-        else:
-            display_node  = lxml.etree.SubElement(displays_node, u"display", attrib={u'id':u'0', u'title': u'generated', u'idsel':unicode(content_id), u'tc':u'0'})
-        
-        res = display_node.xpath("content[@id='%s']/decoupage[(@id='%s') and (@idens='%s')]" % (content_id, cutting_id, ensemble_id))
-        if len(res) == 0:
-            #create node
-            res = display_node.xpath("content[@id='%s']" %(content_id))
-            if len(res) == 0:
-                content_node = lxml.etree.SubElement(display_node,u"content")
-            else:
-                content_node =  res[0]
-            lxml.etree.SubElement(content_node, u"decoupage", attrib={u'id':unicode(cutting_id), u'idens':unicode(ensemble_id)})
-        active_segment_node = displays_node.find(u"activeSegment")
-        if not active_segment_node:
-            active_segment_node = lxml.etree.SubElement(displays_node, u"activeSegment")
-        id_node = active_segment_node.find(u"id")
-        if id_node:
-            active_segment_node.remove(id_node)
-        lxml.etree.SubElement(active_segment_node, u"id", attrib={u"idctt":unicode(content_id), u"idens": unicode(ensemble_id), "idcut":unicode(cutting_id), u"idseg":unicode(segment_id)})
-                                    
-        resp.write(lxml.etree.tostring(ldtdoc, xml_declaration=True, encoding='utf-8', pretty_print=True))
-    else:
-        # generate ldt from 
-        ldtgen = LdtUtils()
-        content_list = Content.objects.filter(iri_id=content_id)
-        if request.user and request.user.username:
-            username = request.user.username
-        else:
-            username = "webuser"
-        
-        start_segment = {
-            'idcontent': content_id,
-            'idgroup' : ensemble_id,
-            'idcutting' : cutting_id,
-            'idsegment' : segment_id
-        }
-        
-        doc = ldtgen.generateLdt(content_list, "segment : ", author=username,  startSegment=start_segment)
-        
-        doc.write(resp, pretty_print = ('DEBUG' in dir(settings) and settings.DEBUG))
-        
-    return resp
-        
-#        ldtgen.
-    
-def index_project(request, id, full= False):
-
-    urlStr = settings.WEB_URL + reverse("space_ldt_init", args=['ldtProject', id])
-    posturl = settings.WEB_URL + reverse("ldt.ldt_utils.views.save_ldtProject")
-    language_code = request.LANGUAGE_CODE[:2]
-    
-    ldt = get_object_or_404(Project, ldt_id=id)
-    if ldt.state == 2: #published
-        readonly = 'true'
-    else:
-        readonly = 'false'
-    
-    if full:
-        template_path = 'ldt/ldt_utils/init_ldt_full.html'
-    else:
-        template_path = 'ldt/ldt_utils/init_ldt.html'
-        
-    return render_to_response(template_path, {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': urlStr, 'posturl': posturl, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request))
-    
-    
-def init(request, method, url):
-    ldtgen = LdtUtils()
-
-    doc = ldtgen.generateInit([url], 'ldt.ldt_utils.views.' + method, None)
-
-    resp = HttpResponse(mimetype="text/xml")
-    resp['Cache-Control'] = 'no-cache, must-revalidate'
-    resp['Pragma'] = 'no-cache'
-
-    resp.write(lxml.etree.tostring(doc, pretty_print=True, xml_declaration=True, encoding="utf-8")) 
-    return resp
-       
-def ldtProject(request, id):
-    resp = HttpResponse(mimetype="text/xml")
-    resp['Cache-Control'] = 'no-cache, must-revalidate'
-    resp['Pragma'] = 'no-cache'
-    
-    project = Project.objects.get(ldt_id=id) #@UndefinedVariable
-    resp.write(project.ldt)
-    return resp
-
-
-def project_json_id(request, id):
-    
-    project = get_object_or_404(Project, ldt_id=id)
-
-    return project_json(request, project, False)
-
-
-def project_json_externalid(request, id):
-        
-    res_proj = get_list_or_404(Project.objects.order_by('-modification_date'), contents__external_id=id) #@UndefinedVariable
-    
-    return project_json(request, res_proj[0], False)
-
-
-
-def project_json(request, project, serialize_contents=True):
-    
-    if not ldt_auth.checkAccess(request.user, project):
-        return HttpResponseForbidden(_("You can not access this project"))
-        
-    mimetype = request.REQUEST.get("mimetype")
-    if mimetype is None:
-        mimetype = "application/json; charset=utf-8"
-    else:
-        mimetype = mimetype.encode("utf-8")
-    if "charset" not in mimetype:
-        mimetype += "; charset=utf-8" 
-    resp = HttpResponse(mimetype=mimetype)
-    resp['Cache-Control'] = 'no-cache, must-revalidate'
-    resp['Pragma'] = 'no-cache'
-    
-    indent = request.REQUEST.get("indent")
-    if indent is None:
-        indent = settings.LDT_JSON_DEFAULT_INDENT
-    else:
-        indent = int(indent)
-    
-    callback = request.REQUEST.get("callback")
-    escape_str = request.REQUEST.get("escape")
-    escape_bool = False
-    if escape_str:
-        escape_bool = {'true': True, 'false': False, "0": False, "1": True}.get(escape_str.lower())
-        
-        
-    ps = ProjectSerializer(project, serialize_contents)
-    project_dict = ps.serialize_to_cinelab()
-    
-    json_str = simplejson.dumps(project_dict, ensure_ascii=False, indent=indent)
-    
-    if callback is not None:
-        json_str = "%s(%s)" % (callback, json_str)
-    
-    if escape_bool:
-        json_str = escape(json_str)
-    
-    resp.write(json_str)
-
-    return resp
-
-def project_annotations_rdf(request, ldt_id):
-
-    project = Project.objects.get(ldt_id=ldt_id); #@UndefinedVariable
-    
-    if not ldt_auth.checkAccess(request.user, project):
-        return HttpResponseForbidden(_("You can not access this project"))
-
-    mimetype = request.REQUEST.get("mimetype")
-    if mimetype is None:
-        mimetype = "application/rdf+xml; charset=utf-8"
-    else:
-        mimetype = mimetype.encode("utf-8")
-    if "charset" not in mimetype:
-        mimetype += "; charset=utf-8" 
-    resp = HttpResponse(mimetype=mimetype)
-    resp['Cache-Control'] = 'no-cache, must-revalidate'
-    resp['Pragma'] = 'no-cache'
-
-    ps = ProjectSerializer(project, from_contents=False, from_display=True) 
-    annotations = ps.getAnnotations(first_cutting=True)
-    
-    rdf_ns = u"http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-    dc_ns = u"http://purl.org/dc/elements/1.1/"
-    rdf = u"{%s}" % rdf_ns
-    dc = u"{%s}" % dc_ns
-    nsmap = {u'rdf' : rdf_ns, u'dc':dc_ns}
-    
-    rdf_root = lxml.etree.Element(rdf + u"RDF", nsmap=nsmap)
-    
-    logging.debug("RDF annotations : " + repr(annotations)) #@UndefinedVariable
-    
-    for annotation in annotations:
-        uri = u""
-        if 'uri' in annotation and annotation['uri']:
-            uri = unicode(annotation['uri'])
-        annot_desc = lxml.etree.SubElement(rdf_root, rdf + u"Description")
-        annot_desc.set(rdf + u'about', uri)
-        if annotation['title']:
-            lxml.etree.SubElement(annot_desc, dc + 'title').text = lxml.etree.CDATA(unicode(annotation['title']))
-        if annotation['desc']:
-            lxml.etree.SubElement(annot_desc, dc + 'description').text = lxml.etree.CDATA(unicode(annotation['desc']))
-        if annotation['tags']:
-            for tag in annotation['tags']:
-                lxml.etree.SubElement(annot_desc, dc + 'subject').text = lxml.etree.CDATA(unicode(tag))
-        lxml.etree.SubElement(annot_desc, dc + 'coverage').text = u"start=%s, duration=%s" % (annotation['begin'], annotation['duration'])
-        
-    resp.write(u"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
-    resp.write(u"<!DOCTYPE rdf:RDF PUBLIC \"-//DUBLIN CORE//DCMES DTD 2002/07/31//EN\" \"http://dublincore.org/documents/2002/07/31/dcmes-xml/dcmes-xml-dtd.dtd\">\n")
-    
-    resp.write(lxml.etree.tostring(rdf_root, xml_declaration=False, encoding="utf-8", pretty_print=True))
-
-    return resp
-
-def save_ldtProject(request):
-    if request.method == "POST":
-        ldt = request.POST['ldt']
-        id = request.POST['id']
-        ldtproject = Project.objects.get(ldt_id=id) #@UndefinedVariable
-
-        #save xml ldt
-        ldtproject.ldt = ldt
-
-
-        doc = lxml.etree.fromstring(ldtproject.ldt.encode("utf-8"))
-        result = doc.xpath("/iri/project")
-        
-        #set new title
-        ldtproject.title = result[0].get("title")
-        
-        #get new content list
-        new_contents = []
-        result = doc.xpath("/iri/medias/media")
-        for medianode in result:
-            id = medianode.get("id")
-            new_contents.append(id)
-    
-        #set new content list
-        for c in ldtproject.contents.all():
-            if not c.iri_id in new_contents:
-                ldtproject.contents.remove(c)
-    
-        ldtproject.save()
-    else:
-        ldt = ''
-        new_contents = []
-    
-    return render_to_response('ldt/ldt_utils/save_done.html', {'ldt': ldt, 'id':id, 'title':ldtproject.title, 'contents': new_contents}, context_instance=RequestContext(request))
-
-
-
-@login_required
-def publish(request, id, redirect=True):
-    ldt = get_object_or_404(Project, ldt_id=id)
-    ldt.state = 2 #published
-    ldt.save()
-    redirect = boolean_convert(redirect)
-    if redirect:
-        return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
-    else:
-        return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state, 'ldt_id': ldt.ldt_id}}, ensure_ascii=False), mimetype='application/json')
-    
-@login_required
-def unpublish(request, id, redirect=True):
-    ldt = get_object_or_404(Project, ldt_id=id)
-    ldt.state = 1 #edition
-    ldt.save()
-    redirect = boolean_convert(redirect)
-    if redirect:
-        return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
-    else:
-        return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state, 'ldt_id': ldt.ldt_id}}, ensure_ascii=False), mimetype='application/json')
-    
-
-def index(request, url):
-    
-    urlStr = settings.WEB_URL + reverse("ldt_init", args=['ldt', url])
-    language_code = request.LANGUAGE_CODE[:2]
-    
-    return render_to_response('ldt/ldt_utils/init_ldt.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': urlStr, 'weburl':settings.WEB_URL + settings.BASE_URL}, context_instance=RequestContext(request))
-
-
-def ldt(request, url, startSegment=None):
-    
-    resp = HttpResponse(mimetype="text/xml; charset=utf-8")
-    resp['Cache-Control'] = 'no-cache'
-
-    contentList = Content.objects.filter(iri_id=url) #@UndefinedVariable
-
-    ldtgen = LdtUtils()
-    doc = ldtgen.generateLdt(contentList, title=contentList[0].title, startSegment=startSegment)
-    doc.write(resp, pretty_print=True)
-
-    return resp
-
-
-def loading(request):
-    return render_to_response('ldt/ldt_utils/loading.html', context_instance=RequestContext(request))
-
-
-@login_required
-def create_project(request, iri_id):
-
-    content = get_object_or_404(Content, iri_id=iri_id)
-    contents = [ content, ]
-    if request.method == "POST" :
-        form = AddProjectForm(request.POST)
-        if form.is_valid():
-            user = request.user
-            project = Project.create_project(title=form.cleaned_data['title'], user=user, contents=contents)
-            # Modal window is not used with firefox
-            is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
-            if is_gecko :
-                return HttpResponseRedirect(reverse('index_project_full', args=[project.ldt_id]))
-            else:
-                return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))
-    else:
-        form = AddProjectForm()
-    # Modal window is not used with firefox, so we ask to submit the form in _parent in firefox case.
-    target_parent = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
-    return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'contents':contents, 'create_project_action':reverse("ldt.ldt_utils.views.create_project", args=[iri_id]), 'target_parent':target_parent}, context_instance=RequestContext(request))
-
-@login_required
-def update_project(request, ldt_id):
-
-    project = get_object_or_404(Project, ldt_id=ldt_id)
-    contents = project.contents.all()
-    if request.method == "POST" :
-        submit_action = request.REQUEST.get("submit_button", False)
-        if submit_action == "prepare_delete":
-            errors = []
-            if project.state == 2:
-                errors.append(_("the project %(title)s is published. please unpublish before deleting.") % {'title':project.title})
-                message = _("can not delete the project. Please correct the following error")
-                title = _('title error deleting project')
-            else:
-                message = _("please confirm deleting project %(title)s") % {'title':project.title}
-                title = _("confirm deletion")
-            return render_to_response('ldt/ldt_utils/error_confirm.html', {'errors':errors, 'message':message, 'title': title}, context_instance=RequestContext(request))
-        elif submit_action == "delete":
-            if project.state != 2:
-                project.delete()
-            form_status = 'deleted'
-            form = AddProjectForm()
-        else:
-            form_status = 'saved'
-            form = AddProjectForm(request.POST)
-            if form.is_valid():
-                if project.title != form.cleaned_data['title']:
-                    project.title = form.cleaned_data['title']
-                    ldt = lxml.etree.fromstring(project.ldt.encode("utf-8"))
-                    res = ldt.xpath("/iri/project")
-                    res[0].set("title", project.title)
-                    project.ldt = lxml.etree.tostring(ldt, pretty_print=True)
-                    project.save()
-    else:
-        form = AddProjectForm({'title':unicode(project.title)})
-        form_status = 'none'
-        
-    return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status':form_status, 'ldt_id': ldt_id, 'contents':contents, 'create_project_action':reverse("ldt.ldt_utils.views.update_project", args=[ldt_id])}, context_instance=RequestContext(request))
-
-
-@login_required
-def copy_project(request, ldt_id):
-
-    project = get_object_or_404(Project, ldt_id=ldt_id)
-    if request.method == "POST" :
-        form = CopyProjectForm(request.POST)
-        if form.is_valid():
-            user = request.user
-            project = project.copy_project(title=request.POST['title'], user=user)
-            is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
-            if is_gecko:
-                return HttpResponseRedirect(reverse('index_project_full', args=[project.ldt_id]))
-            else:
-                return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))
-    else:
-        form = CopyProjectForm
-    return render_to_response('ldt/ldt_utils/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request))
-
-
-def write_content_base(request, iri_id=None):
-
-    if iri_id:        
-        instance_content = Content.objects.get(iri_id=iri_id) #@UndefinedVariable
-        instance_media = instance_content.media_obj
-        logging.debug("write_content_base : valid form: for instance : media -> " + repr(instance_media) + " content : for instance : " + repr(instance_content)) #@UndefinedVariable
-    else:
-        logging.debug("No iri_id") #@UndefinedVariable
-        instance_content = None
-        instance_media = None
-    
-    form_status = 'none'        
-    if request.method == "POST":
-        
-        if instance_content is not None:
-            content_instance_val = model_to_dict(instance_content, exclude=ContentForm.Meta.exclude)
-        else:
-            content_instance_val = {}
-        
-        if instance_media is not None:
-            media_instance_val = model_to_dict(instance_media, exclude=MediaForm.Meta.exclude)
-        else:
-            media_instance_val = {}
-        #add prefix
-        
-        def add_prefix(dict, prefix):
-            for key, value in dict.items():
-                dict['%s-%s' % (prefix, key)] = value
-                del(dict[key])
-        
-        add_prefix(content_instance_val, "content")
-        add_prefix(media_instance_val, "media")        
-        
-        for k in request.POST.keys():
-            value = request.POST.get(k)
-            content_instance_val[k] = value
-            media_instance_val[k] = value
-        
-        content_form = ContentForm(content_instance_val, prefix="content", instance=instance_content)
-        media_form = MediaForm(media_instance_val, request.FILES, prefix="media", instance=instance_media)
-        
-        media_valid = media_form.is_valid()
-        content_valid = content_form.is_valid()
-        
-        logging.debug("write_content_base : valid form: for instance : " + repr(instance_media) + " -> media " + str(media_valid) + " content : for instance : " + repr(instance_content) + " : " + str(content_valid)) #@UndefinedVariable
-        
-        if media_valid and content_valid :
-            
-            # see if media must be created
-            cleaned_data = {}
-            cleaned_data.update(media_form.cleaned_data)
-            
-            media_input_type = content_form.cleaned_data["media_input_type"]
-            
-            if media_input_type == "none":
-                media = None
-            elif media_input_type == "link":
-                media = content_form.cleaned_data["media_obj"]
-                created = False
-            elif media_input_type == "create":
-                del cleaned_data["media_file"]
-                if not cleaned_data['videopath']:
-                    cleaned_data['videopath'] = settings.STREAM_URL
-                # if the source is already http:// or rtmp:// we don't have to add STREAM_URL
-                if cleaned_data['src'].startswith("rtmp://") or cleaned_data['src'].startswith("http://"):
-                    cleaned_data['videopath'] = ''
-                media, created = Media.objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) #@UndefinedVariable
-            elif media_input_type == "url" or media_input_type == "upload" :
-                # copy file
-                #complet src
-                destination_file = None
-                source_file = None
-                try:
-                    if media_input_type == "url":
-                        url = cleaned_data["external_src_url"]
-                        source_file = urllib2.urlopen(url)
-                        source_filename = source_file.info().get('Content-Disposition', None)
-                        if not source_filename:
-                            source_filename = urlparse.urlparse(url).path.rstrip("/").split('/')[-1]
-                    elif media_input_type == "upload":
-                        #source_file = request.FILES['media-media_file']
-                        # At this point the file has already be uploaded thanks to the upload view, and original file name is sent through a post var
-                        source_filename = request.POST["media-local_file_name"]
-                    
-                    source_filename = ldt_utils_path.sanitize_filename(source_filename)
-                    destination_filepath = os.path.join(settings.STREAM_PATH, source_filename)
-                    base_source_filename = source_filename
-                    extension = base_source_filename.split(".")[-1]
-                    if extension == base_source_filename:
-                        extension = ""
-                        base_basename_filename = base_source_filename
-                    else:
-                        base_basename_filename = base_source_filename[:-1 * (len(extension) + 1)]
-                    i = 0
-                    
-                    while os.path.exists(destination_filepath):
-                        base_source_filename = "%s.%d.%s" % (base_basename_filename, i, extension)
-                        destination_filepath = os.path.join(settings.STREAM_PATH, base_source_filename)
-                        i += 1
-                    
-                    if media_input_type == "url":
-                        # we upload the file if we are in url case
-                        destination_file = open(destination_filepath, "wb")
-                        chunck = source_file.read(2048)
-                        while chunck:
-                            destination_file.write(chunck)
-                            chunck = source_file.read(2048)
-                        
-                    elif media_input_type == "upload":
-                        # The media file has been uploaded in the session temp folder 
-                        # so we just have to move to the regular folder and rename it.
-                        if os.path.exists(os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", source_filename)):
-                            os.rename(os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", source_filename), os.path.join(settings.STREAM_PATH, base_source_filename))
-                    
-                    
-                    src_prefix = settings.STREAM_SRC_PREFIX.rstrip("/")
-                    if len(src_prefix) > 0:
-                        cleaned_data["src"] = src_prefix + "/" + base_source_filename
-                    else:
-                        cleaned_data["src"] = base_source_filename
-                    
-                    
-                except Exception as inst:
-                    logging.debug("write_content_base : POST error when processing file:" + str(inst)) #@UndefinedVariable
-                    form_status = "error"
-                    #set error for form
-                    if media_input_type == "url":
-                        errors = media_form._errors.setdefault("external_src_url", ErrorList())
-                        errors.append(_("Problem when downloading file from url : ") + url)
-                    elif media_input_type == "upload":
-                        errors = media_form._errors.setdefault("media_file", ErrorList())
-                        errors.append(_("Problem when uploading file : ") + str(inst))
-                finally:
-                    if media_input_type == "url":
-                        if destination_file:
-                            destination_file.close()
-                        if source_file:
-                            source_file.close()
-                
-                if form_status != "error":
-                    #try:
-                    del cleaned_data["media_file"]
-                    if not cleaned_data['videopath']:
-                        cleaned_data['videopath'] = settings.STREAM_URL
-                    mimetype = cleaned_data.get('mimetype_field', None)
-                    if not mimetype:
-                        mimetype = mimetypes.guess_type(cleaned_data['src'])
-                    cleaned_data['mimetype_field'] = mimetype
-                    media, created = Media.objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) #@UndefinedVariable
-                else:
-                    media = None
-                    
-
-            if media and not created:
-                for attribute in ('external_id', 'external_permalink', 'external_publication_url', 'external_src_url', 'media_creation_date', 'videopath', 'duration', 'description', 'title'):
-                    setattr(media, attribute, cleaned_data.get(attribute))
-                mimetype = cleaned_data.get('mimetype_field', None)
-                if not mimetype:
-                    mimetype = mimetypes.guess_type(media.src)
-                media.mimetype_field = mimetype
-                    
-                media.save()
-            
-            
-            if form_status != "error":
-                #try:
-                content_defaults = {}
-                content_defaults.update(content_form.cleaned_data)
-                content_defaults['media_obj'] = media
-                del content_defaults["media_input_type"]
-                content, created = Content.objects.get_or_create(iri_id=content_form.cleaned_data['iri_id'], defaults=content_defaults) #@UndefinedVariable
-                if not created:
-                    for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media_obj'):
-                        setattr(content, attribute, content_defaults[attribute])
-                content.save()
-                form_status = 'saved'
-                media_form = MediaForm(instance=media, prefix="media")
-                content_form = ContentForm(instance=content, prefix="content")
-        else:
-            form_status = 'error'
-    else:
-        form_status = 'empty'
-        initial = { 'media_input_type':"link"}
-        
-        content_form = ContentForm(prefix="content", instance=instance_content, initial=initial)
-        media_form = MediaForm(prefix="media", instance=instance_media)
-        
-        if instance_content is not None:
-            content_form.media_input_type = "link"
-    
-    return content_form, media_form, form_status
-
-@login_required
-def write_content(request, iri_id=None):
-    
-    submit_action = request.REQUEST.get("submit_button", False) 
-
-    if submit_action == "prepare_delete": 
-        errors, titles = prepare_delete_content(request, iri_id)
-        if errors and len(errors) > 0:
-            message = ungettext("There is %(count)d error when deleting content", "There are %(count)d errors when deleting content", len(errors)) % { 'count': len(errors)}
-            title_msg = _('title error deleting content')
-        else:
-            message = _("Confirm delete content %(titles)s") % { 'titles' : ",".join(titles) }
-            title_msg = _("confirm delete content")
-        return render_to_response('ldt/ldt_utils/error_confirm.html', {'errors':errors, 'message':message, 'title': title_msg}, context_instance=RequestContext(request))  
-    elif submit_action == "delete":
-        delete_content(request, iri_id)
-        form_status = "deleted"
-        content_form = ContentForm()
-        media_form = MediaForm()
-    else:
-        content_form, media_form, form_status = write_content_base(request, iri_id)
-
-    if iri_id:
-        create_content_action = reverse('ldt.ldt_utils.views.write_content', kwargs={'iri_id':iri_id})
-    else:
-        create_content_action = reverse('ldt.ldt_utils.views.write_content')
-    
-    session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
-    cookie_name = settings.SESSION_COOKIE_NAME
-    
-    return render_to_response('ldt/ldt_utils/create_content.html', {'content_form': content_form, 'media_form': media_form, 'form_status': form_status, 'create_content_action': create_content_action, 'iri_id': iri_id, 'session_key':session_key, 'cookie_name':cookie_name}, context_instance=RequestContext(request))
-
-@login_required
-def prepare_delete_content(request, iri_id=None):
-    errors = []
-    titles = []
-    if not iri_id:
-        iri_id = request.REQUEST.get("iri_id", None)
-        
-    if iri_id:
-        for content in Content.objects.filter(iri_id=iri_id): #@UndefinedVariable
-            titles.append(unicode(content.title))
-            projects = content.project_set.all()
-            projects_nb = len(projects)
-            if projects_nb > 0:
-                project_titles = map(lambda p: unicode(p.title), projects)
-                errors.append(ungettext("Content '%(title)s' is referenced by this project : %(project_titles)s. Please delete it beforehand.", "Content '%(title)s' is referenced by %(count)d projects: %(project_titles)s. Please delete them beforehand.", projects_nb) % {'title':unicode(content.title), 'count':projects_nb, 'project_titles': ",".join(project_titles)})
- 
-        
-    return errors, titles
-
-
-@login_required
-def delete_content(request, iri_id=None):
-    if not iri_id:
-        iri_id = request.REQUEST.get("iri_id", None)
-        
-    if iri_id:
-        Content.objects.filter(iri_id=iri_id).delete() #@UndefinedVariable
-
-
-def upload(request):
-    if request.method == 'POST':
-        for field_name in request.FILES:
-            # We get the file name
-            source_file = request.FILES[field_name]
-            source_filename = source_file.name
-            # We sanitize the file name : no space, only lower case.
-            source_filename = ldt_utils_path.sanitize_filename(source_filename)
-            # We create the session temp folder if necessary
-            if not os.path.exists(os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME])):
-                os.makedirs(os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME]))
-            destination_filepath = os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", source_filename)
-            # We delete the existing file if necessary
-            if os.path.exists(destination_filepath):
-                os.remove(destination_filepath)
-            
-            destination_file = open(destination_filepath, "wb")
-            
-            for chunk in source_file.chunks():
-                destination_file.write(chunk)
-            destination_file.close()
-            
-        # indicate that everything is OK for SWFUpload
-        return HttpResponse("ok", mimetype="text/plain")
-    else:
-        return HttpResponse("notok", mimetype="text/plain")
-
-def removetempfile(request):
-    # The filename arrives with a GET var.
-    file_path = os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", ldt_utils_path.sanitize_filename(request.GET["filename"]))
-    if os.path.exists(file_path):
-        os.remove(file_path)
-    return HttpResponse("remove ok", mimetype="text/plain")
-    
+from django.conf import settings
+from django.contrib.auth.decorators import login_required
+from django.core.urlresolvers import reverse
+from django.db.models import Q
+from django.forms.models import model_to_dict
+from django.forms.util import ErrorList
+from django.http import (HttpResponse, HttpResponseRedirect,
+    HttpResponseForbidden, HttpResponseServerError)
+from django.shortcuts import (render_to_response, get_object_or_404,
+    get_list_or_404)
+from django.template import RequestContext
+from django.template.loader import render_to_string
+from django.utils import simplejson
+from django.utils.html import escape
+from django.utils.translation import ugettext as _, ungettext
+from forms import (LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm,
+    ContentForm, MediaForm)
+from ldt.core.models import Owner
+from ldt.ldt_utils.models import Content
+from ldt.ldt_utils.utils import boolean_convert, LdtUtils, LdtSearch
+from lxml.html import fragment_fromstring
+from models import Media, Project
+from projectserializer import ProjectSerializer
+from urllib2 import urlparse
+import base64
+import django.core.urlresolvers
+import ldt.auth as ldt_auth
+import ldt.utils.path as ldt_utils_path
+import logging
+import lxml.etree
+import mimetypes
+import os
+import urllib2
+import subprocess
+import re
+import datetime
+
+
+
+@login_required
+def workspace(request):
+
+    # list of contents
+    content_list = Content.objects.all() #@UndefinedVariable
+
+    # get list of projects
+    project_list = Project.objects.all() #@UndefinedVariable
+    
+    is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+    
+    # render list
+    return render_to_response("ldt/ldt_utils/workspace.html",
+                              {'contents': content_list, 'projects': project_list,
+                               'is_gecko': is_gecko},
+                              context_instance=RequestContext(request))
+
+
+def popup_embed(request):
+
+    json_url = request.GET.get("json_url")
+    player_id = request.GET.get("player_id")
+    ldt_id = request.GET.get("ldt_id")
+
+
+    project = Project.objects.get(ldt_id=ldt_id); #@UndefinedVariable
+
+    stream_mode = project.stream_mode
+    if stream_mode != "video":
+        stream_mode = 'radio'
+
+    player_width = 650
+    player_height = 480
+    
+    if stream_mode == 'radio':
+        player_height = 1
+        
+    if not ldt_auth.checkAccess(request.user, project):
+        return HttpResponseForbidden(_("You can not access this project"))
+
+    ps = ProjectSerializer(project, from_contents=False, from_display=True)
+    annotations = ps.getAnnotations(first_cutting=True)
+    
+    rend_dict = {'json_url':json_url, 'player_id':player_id, 'annotations':annotations, 'ldt_id': ldt_id, 'stream_mode': stream_mode, 'player_width': player_width, 'player_height': player_height}
+
+    embed_rendered = dict((typestr,
+                           (lambda s:escape(lxml.etree.tostring(fragment_fromstring(render_to_string("ldt/ldt_utils/partial/embed_%s.html" % (s), rend_dict, context_instance=RequestContext(request))), pretty_print=True)))(typestr))
+                           for typestr in ('player', 'seo_body', 'seo_meta', 'links'))
+
+    rend_dict['embed_rendered'] = embed_rendered
+
+    return render_to_response("ldt/ldt_utils/embed_popup.html",
+                              rend_dict,
+                              context_instance=RequestContext(request))
+
+
+
+@login_required
+def projectsfilter(request, filter, is_owner=False, status=0):
+
+    is_owner = boolean_convert(is_owner)
+    status = int(status)
+    query = Q()
+
+    if is_owner:
+        owner = None
+        try:
+            owner = Owner.objects.get(user=request.user) #@UndefinedVariable
+        except:
+            return HttpResponseServerError("<h1>User not found</h1>")
+        query &= Q(owner=owner)
+
+    if status > 0:
+        query &= Q(state=status)
+
+    if filter:
+        if len(filter) > 0 and filter[0] == '_':
+            filter = filter[1:]
+        query &= Q(title__icontains=filter)
+
+    project_list = Project.objects.filter(query) #@UndefinedVariable
+    
+    is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+
+    return render_to_response("ldt/ldt_utils/partial/projectslist.html",
+                              {'projects': project_list, 'is_gecko': is_gecko},
+                              context_instance=RequestContext(request))
+
+
+
+@login_required
+def contentsfilter(request, filter):
+    if filter and len(filter) > 0 and filter[0] == '_':
+        filter = filter[1:]
+
+    if filter:
+        content_list = Content.objects.filter(title__icontains=filter) #@UndefinedVariable
+    else:
+        content_list = Content.objects.all() #@UndefinedVariable
+
+    return render_to_response("ldt/ldt_utils/partial/contentslist.html",
+                              {'contents': content_list},
+                              context_instance=RequestContext(request))
+
+
+def searchForm(request):
+    form = SearchForm()
+    return render_to_response('ldt/ldt_utils/search_form.html', {'form': form} , context_instance=RequestContext(request))
+
+def searchIndex(request):
+    
+    sform = SearchForm(request.POST)
+    if sform.is_valid():
+        search = sform.cleaned_data["search"]
+        queryStr = base64.urlsafe_b64encode(search.encode('utf8'))
+        field = request.POST["field"]
+        language_code = request.LANGUAGE_CODE[:2]
+        
+        if request.POST.has_key("ldt_pres"):
+            ldt_pres = True
+        else:
+            ldt_pres = False
+        
+        url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, queryStr])
+        
+        # For the moment, we always display the results in a regular LDT template
+        if ldt_pres :
+            return render_to_response('ldt/ldt_utils/init_ldt_full.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
+        else :
+            return render_to_response('ldt/ldt_utils/init_ldt_full.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
+    else:
+        resp = HttpResponse()
+        resp.write("<html><head></head><body>Error : No result</body></html>");
+        return resp
+
+def searchIndexGet(request, field, query):
+
+    language_code = request.LANGUAGE_CODE[:2]
+    
+    url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, query])
+    return render_to_response('ldt/ldt_utils/init_ldt.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
+
+def searchInit(request, field, query):
+    
+    ldtgen = LdtUtils()
+    
+    doc = ldtgen.generateInit([field, query], 'ldt.ldt_utils.views.searchLdt', 'ldt.ldt_utils.views.searchSegments')
+    
+    resp = HttpResponse(mimetype="text/xml;charset=utf-8")
+    resp.write(lxml.etree.tostring(doc, pretty_print=True, encoding="utf-8")) 
+    return resp
+
+def searchLdt(request, field, query, edition=None):
+    
+    contentList = []
+    resp = HttpResponse(mimetype="text/xml")
+    queryStr = ""
+
+    if query and len(query) > 0:        
+        queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8")
+        searcher = LdtSearch()
+        ids = {}
+        projIds = {}
+        
+        for result in searcher.query(field, queryStr):
+            ids[result["iri_id"]] = ""
+            projIds[result["project_id"]] = ""
+
+        id_list = ids.keys()
+        projId_list = projIds.keys()
+        
+        #if edition is not None:
+        #    ids_editions = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id")))            
+        #    id_list = filter(lambda id: id in id_list, ids_editions)
+            
+        contentList = Content.objects.filter(iri_id__in=id_list)        #@UndefinedVariable
+        projectList = Project.objects.filter(ldt_id__in=projId_list);
+    
+            
+    ldtgen = LdtUtils()
+    #            generateLdt(contentList, title=u"", author=u"IRI Web", web_url=u"", startSegment=None, projects=None):
+    doc = ldtgen.generateLdt(contentList, title=u"Recherche : " + queryStr, projects=projectList)
+    doc.write(resp, pretty_print=True)
+
+    
+    return resp
+
+
+def searchSegments(request, field, query, edition=None):
+    
+    if query and len(query) > 0:
+        searcher = LdtSearch()
+        
+        queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8")
+        res = searcher.query(field, queryStr)
+    else:
+        res = []
+        
+    iri_ids = None
+    
+    #if edition is not None:
+    #    iri_ids = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id")))
+
+    iri = lxml.etree.Element('iri')
+    doc = lxml.etree.ElementTree(iri)
+
+    for resultMap in res:
+        if iri_ids is None or resultMap['iri_id'] in iri_ids:
+            seg = lxml.etree.SubElement(iri, 'seg')
+            seg.set('idctt', resultMap['iri_id'])
+            seg.set('idens', resultMap['ensemble_id'])
+            seg.set('iddec', resultMap['decoupage_id'])
+            seg.set('idseg', resultMap['element_id'])
+            seg.set('idvue', "")
+            seg.set('crit', "")
+  
+    #return doc  
+    
+    return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") 
+
+
+
+@login_required         
+def list_ldt(request):
+    contents = Content.objects.all() #@UndefinedVariable
+    try:
+        owner = Owner.objects.get(user=request.user) #@UndefinedVariable
+    except:
+        return HttpResponseRedirect(settings.LOGIN_URL)
+    ldtProjects = Project.objects.filter(owner=owner) #@UndefinedVariable
+    context = {
+    'contents': contents,
+    'projects': ldtProjects.reverse(),
+    }
+    return render_to_response('ldt/ldt_utils/ldt_list.html', context, context_instance=RequestContext(request))
+
+@login_required         
+def list_content(request):
+    contents = Content.objects.all() #@UndefinedVariable
+    context = {
+        'contents': contents,
+    }
+    return render_to_response('ldt/ldt_utils/content_list.html', context, context_instance=RequestContext(request))
+
+@login_required
+def create_ldt_view(request):
+    if request.method == "POST" :
+        form = LdtAddForm(request.POST)
+        if form.is_valid():
+            user = request.user
+            Project.create_project(title=form.cleaned_data['title'], user=user, contents=form.cleaned_data['contents'])
+            form_status = "saved"
+            contents = []
+    else:
+        form = LdtAddForm()
+        contents = Content.objects.all() #@UndefinedVariable
+        form_status = "none"
+            
+    return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form, 'form_status':form_status, 'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request))
+     
+def created_ldt(request):
+    return render_to_response('ldt/ldt_utils/save_done.html', context_instance=RequestContext(request))
+
+
+def index_segment(request, project_id, content_id, cutting_id, ensemble_id, segment_id):
+    url_str = settings.WEB_URL + reverse("ldt.ldt_utils.views.init_segment", args=[project_id, content_id, ensemble_id, cutting_id, segment_id])
+    post_url = ""
+    language_code = request.LANGUAGE_CODE[:2]
+    readonly = 'true'
+    template_path = 'ldt/ldt_utils/init_ldt.html'
+    
+    return render_to_response(template_path, {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url_str, 'posturl': post_url, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request))
+
+def init_segment(request, project_id, content_id, ensemble_id, cutting_id, segment_id):
+    
+    ldtgen = LdtUtils()
+    doc = ldtgen.generateInit([project_id, content_id, ensemble_id, cutting_id, segment_id], 'ldt.ldt_utils.views.ldt_segment', 'ldt.ldt_utils.views.highlight_segment')
+    
+    return HttpResponse(lxml.etree.tostring(lxml.etree.ElementTree(doc), pretty_print=True), mimetype="text/xml;charset=utf-8")
+
+def highlight_segment(request, project_id, content_id, ensemble_id, cutting_id, segment_id):
+        
+    iri = lxml.etree.Element('iri')
+    doc = lxml.etree.ElementTree(iri)    
+
+    seg = lxml.etree.SubElement(iri, 'seg')
+    seg.set('idctt', content_id)
+    seg.set('idens', ensemble_id)
+    seg.set('iddec', cutting_id)
+    seg.set('idseg', segment_id)
+    seg.set('idvue', "")
+    seg.set('crit', "")
+  
+    return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") 
+
+
+def ldt_segment(request, project_id, content_id, ensemble_id, cutting_id, segment_id):
+
+    resp = HttpResponse(mimetype="text/xml")
+    resp['Cache-Control'] = 'no-cache, must-revalidate'
+    resp['Pragma'] = 'no-cache'
+    
+    if project_id and project_id != "_" :
+        project = Project.objects.get(ldt_id=project_id) #@UndefinedVariable
+        ldtdoc = lxml.etree.fromstring(project.ldt.encode("utf-8"))
+        displays_node = ldtdoc.find("displays")
+        if not displays_node:
+            displays_node = lxml.etree.SubElement(ldtdoc,u"displays")        
+        res = displays_node.xpath("display")
+        if len(res) > 0:
+            display_node = res[0]
+        else:
+            display_node  = lxml.etree.SubElement(displays_node, u"display", attrib={u'id':u'0', u'title': u'generated', u'idsel':unicode(content_id), u'tc':u'0'})
+        
+        res = display_node.xpath("content[@id='%s']/decoupage[(@id='%s') and (@idens='%s')]" % (content_id, cutting_id, ensemble_id))
+        if len(res) == 0:
+            #create node
+            res = display_node.xpath("content[@id='%s']" %(content_id))
+            if len(res) == 0:
+                content_node = lxml.etree.SubElement(display_node,u"content")
+            else:
+                content_node =  res[0]
+            lxml.etree.SubElement(content_node, u"decoupage", attrib={u'id':unicode(cutting_id), u'idens':unicode(ensemble_id)})
+        active_segment_node = displays_node.find(u"activeSegment")
+        if not active_segment_node:
+            active_segment_node = lxml.etree.SubElement(displays_node, u"activeSegment")
+        id_node = active_segment_node.find(u"id")
+        if id_node:
+            active_segment_node.remove(id_node)
+        lxml.etree.SubElement(active_segment_node, u"id", attrib={u"idctt":unicode(content_id), u"idens": unicode(ensemble_id), "idcut":unicode(cutting_id), u"idseg":unicode(segment_id)})
+                                    
+        resp.write(lxml.etree.tostring(ldtdoc, xml_declaration=True, encoding='utf-8', pretty_print=True))
+    else:
+        # generate ldt from 
+        ldtgen = LdtUtils()
+        content_list = Content.objects.filter(iri_id=content_id)
+        if request.user and request.user.username:
+            username = request.user.username
+        else:
+            username = "webuser"
+        
+        start_segment = {
+            'idcontent': content_id,
+            'idgroup' : ensemble_id,
+            'idcutting' : cutting_id,
+            'idsegment' : segment_id
+        }
+        
+        doc = ldtgen.generateLdt(content_list, "segment : ", author=username,  startSegment=start_segment)
+        
+        doc.write(resp, pretty_print = ('DEBUG' in dir(settings) and settings.DEBUG))
+        
+    return resp
+        
+#        ldtgen.
+    
+def index_project(request, id, full= False):
+
+    urlStr = settings.WEB_URL + reverse("space_ldt_init", args=['ldtProject', id])
+    posturl = settings.WEB_URL + reverse("ldt.ldt_utils.views.save_ldtProject")
+    language_code = request.LANGUAGE_CODE[:2]
+    
+    ldt = get_object_or_404(Project, ldt_id=id)
+    if ldt.state == 2: #published
+        readonly = 'true'
+    else:
+        readonly = 'false'
+    
+    if full:
+        template_path = 'ldt/ldt_utils/init_ldt_full.html'
+    else:
+        template_path = 'ldt/ldt_utils/init_ldt.html'
+        
+    return render_to_response(template_path, {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': urlStr, 'posturl': posturl, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request))
+    
+    
+def init(request, method, url):
+    ldtgen = LdtUtils()
+
+    doc = ldtgen.generateInit([url], 'ldt.ldt_utils.views.' + method, None)
+
+    resp = HttpResponse(mimetype="text/xml")
+    resp['Cache-Control'] = 'no-cache, must-revalidate'
+    resp['Pragma'] = 'no-cache'
+
+    resp.write(lxml.etree.tostring(doc, pretty_print=True, xml_declaration=True, encoding="utf-8")) 
+    return resp
+       
+def ldtProject(request, id):
+    resp = HttpResponse(mimetype="text/xml")
+    resp['Cache-Control'] = 'no-cache, must-revalidate'
+    resp['Pragma'] = 'no-cache'
+    
+    project = Project.objects.get(ldt_id=id) #@UndefinedVariable
+    resp.write(project.ldt)
+    return resp
+
+
+def project_json_id(request, id):
+    
+    project = get_object_or_404(Project, ldt_id=id)
+
+    return project_json(request, project, False)
+
+
+def project_json_externalid(request, id):
+        
+    res_proj = get_list_or_404(Project.objects.order_by('-modification_date'), contents__external_id=id) #@UndefinedVariable
+    
+    return project_json(request, res_proj[0], False)
+
+
+
+def project_json(request, project, serialize_contents=True):
+    
+    if not ldt_auth.checkAccess(request.user, project):
+        return HttpResponseForbidden(_("You can not access this project"))
+        
+    mimetype = request.REQUEST.get("mimetype")
+    if mimetype is None:
+        mimetype = "application/json; charset=utf-8"
+    else:
+        mimetype = mimetype.encode("utf-8")
+    if "charset" not in mimetype:
+        mimetype += "; charset=utf-8" 
+    resp = HttpResponse(mimetype=mimetype)
+    resp['Cache-Control'] = 'no-cache, must-revalidate'
+    resp['Pragma'] = 'no-cache'
+    
+    indent = request.REQUEST.get("indent")
+    if indent is None:
+        indent = settings.LDT_JSON_DEFAULT_INDENT
+    else:
+        indent = int(indent)
+    
+    callback = request.REQUEST.get("callback")
+    escape_str = request.REQUEST.get("escape")
+    escape_bool = False
+    if escape_str:
+        escape_bool = {'true': True, 'false': False, "0": False, "1": True}.get(escape_str.lower())
+        
+        
+    ps = ProjectSerializer(project, serialize_contents)
+    project_dict = ps.serialize_to_cinelab()
+    
+    json_str = simplejson.dumps(project_dict, ensure_ascii=False, indent=indent)
+    
+    if callback is not None:
+        json_str = "%s(%s)" % (callback, json_str)
+    
+    if escape_bool:
+        json_str = escape(json_str)
+    
+    resp.write(json_str)
+
+    return resp
+
+def project_annotations_rdf(request, ldt_id):
+
+    project = Project.objects.get(ldt_id=ldt_id); #@UndefinedVariable
+    
+    if not ldt_auth.checkAccess(request.user, project):
+        return HttpResponseForbidden(_("You can not access this project"))
+
+    mimetype = request.REQUEST.get("mimetype")
+    if mimetype is None:
+        mimetype = "application/rdf+xml; charset=utf-8"
+    else:
+        mimetype = mimetype.encode("utf-8")
+    if "charset" not in mimetype:
+        mimetype += "; charset=utf-8" 
+    resp = HttpResponse(mimetype=mimetype)
+    resp['Cache-Control'] = 'no-cache, must-revalidate'
+    resp['Pragma'] = 'no-cache'
+
+    ps = ProjectSerializer(project, from_contents=False, from_display=True) 
+    annotations = ps.getAnnotations(first_cutting=True)
+    
+    rdf_ns = u"http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    dc_ns = u"http://purl.org/dc/elements/1.1/"
+    rdf = u"{%s}" % rdf_ns
+    dc = u"{%s}" % dc_ns
+    nsmap = {u'rdf' : rdf_ns, u'dc':dc_ns}
+    
+    rdf_root = lxml.etree.Element(rdf + u"RDF", nsmap=nsmap)
+    
+    logging.debug("RDF annotations : " + repr(annotations)) #@UndefinedVariable
+    
+    for annotation in annotations:
+        uri = u""
+        if 'uri' in annotation and annotation['uri']:
+            uri = unicode(annotation['uri'])
+        annot_desc = lxml.etree.SubElement(rdf_root, rdf + u"Description")
+        annot_desc.set(rdf + u'about', uri)
+        if annotation['title']:
+            lxml.etree.SubElement(annot_desc, dc + 'title').text = lxml.etree.CDATA(unicode(annotation['title']))
+        if annotation['desc']:
+            lxml.etree.SubElement(annot_desc, dc + 'description').text = lxml.etree.CDATA(unicode(annotation['desc']))
+        if annotation['tags']:
+            for tag in annotation['tags']:
+                lxml.etree.SubElement(annot_desc, dc + 'subject').text = lxml.etree.CDATA(unicode(tag))
+        lxml.etree.SubElement(annot_desc, dc + 'coverage').text = u"start=%s, duration=%s" % (annotation['begin'], annotation['duration'])
+        
+    resp.write(u"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
+    resp.write(u"<!DOCTYPE rdf:RDF PUBLIC \"-//DUBLIN CORE//DCMES DTD 2002/07/31//EN\" \"http://dublincore.org/documents/2002/07/31/dcmes-xml/dcmes-xml-dtd.dtd\">\n")
+    
+    resp.write(lxml.etree.tostring(rdf_root, xml_declaration=False, encoding="utf-8", pretty_print=True))
+
+    return resp
+
+def save_ldtProject(request):
+    if request.method == "POST":
+        ldt = request.POST['ldt']
+        id = request.POST['id']
+        ldtproject = Project.objects.get(ldt_id=id) #@UndefinedVariable
+
+        #save xml ldt
+        ldtproject.ldt = ldt
+
+
+        doc = lxml.etree.fromstring(ldtproject.ldt.encode("utf-8"))
+        result = doc.xpath("/iri/project")
+        
+        #set new title
+        ldtproject.title = result[0].get("title")
+        
+        #get new content list
+        new_contents = []
+        result = doc.xpath("/iri/medias/media")
+        for medianode in result:
+            id = medianode.get("id")
+            new_contents.append(id)
+    
+        #set new content list
+        for c in ldtproject.contents.all():
+            if not c.iri_id in new_contents:
+                ldtproject.contents.remove(c)
+    
+        ldtproject.save()
+    else:
+        ldt = ''
+        new_contents = []
+    
+    return render_to_response('ldt/ldt_utils/save_done.html', {'ldt': ldt, 'id':id, 'title':ldtproject.title, 'contents': new_contents}, context_instance=RequestContext(request))
+
+
+
+@login_required
+def publish(request, id, redirect=True):
+    ldt = get_object_or_404(Project, ldt_id=id)
+    ldt.state = 2 #published
+    ldt.save()
+    redirect = boolean_convert(redirect)
+    if redirect:
+        return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    else:
+        return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state, 'ldt_id': ldt.ldt_id}}, ensure_ascii=False), mimetype='application/json')
+    
+@login_required
+def unpublish(request, id, redirect=True):
+    ldt = get_object_or_404(Project, ldt_id=id)
+    ldt.state = 1 #edition
+    ldt.save()
+    redirect = boolean_convert(redirect)
+    if redirect:
+        return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    else:
+        return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state, 'ldt_id': ldt.ldt_id}}, ensure_ascii=False), mimetype='application/json')
+    
+
+def index(request, url):
+    
+    urlStr = settings.WEB_URL + reverse("ldt_init", args=['ldt', url])
+    language_code = request.LANGUAGE_CODE[:2]
+    
+    return render_to_response('ldt/ldt_utils/init_ldt.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': urlStr, 'weburl':settings.WEB_URL + settings.BASE_URL}, context_instance=RequestContext(request))
+
+
+def ldt(request, url, startSegment=None):
+    
+    resp = HttpResponse(mimetype="text/xml; charset=utf-8")
+    resp['Cache-Control'] = 'no-cache'
+
+    contentList = Content.objects.filter(iri_id=url) #@UndefinedVariable
+
+    ldtgen = LdtUtils()
+    doc = ldtgen.generateLdt(contentList, title=contentList[0].title, startSegment=startSegment)
+    doc.write(resp, pretty_print=True)
+
+    return resp
+
+
+def loading(request):
+    return render_to_response('ldt/ldt_utils/loading.html', context_instance=RequestContext(request))
+
+
+@login_required
+def create_project(request, iri_id):
+
+    content = get_object_or_404(Content, iri_id=iri_id)
+    contents = [ content, ]
+    if request.method == "POST" :
+        form = AddProjectForm(request.POST)
+        if form.is_valid():
+            user = request.user
+            project = Project.create_project(title=form.cleaned_data['title'], user=user, contents=contents)
+            # Modal window is not used with firefox
+            is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+            if is_gecko :
+                return HttpResponseRedirect(reverse('index_project_full', args=[project.ldt_id]))
+            else:
+                return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))
+    else:
+        form = AddProjectForm()
+    # Modal window is not used with firefox, so we ask to submit the form in _parent in firefox case.
+    target_parent = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+    return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'contents':contents, 'create_project_action':reverse("ldt.ldt_utils.views.create_project", args=[iri_id]), 'target_parent':target_parent}, context_instance=RequestContext(request))
+
+@login_required
+def update_project(request, ldt_id):
+
+    project = get_object_or_404(Project, ldt_id=ldt_id)
+    contents = project.contents.all()
+    if request.method == "POST" :
+        submit_action = request.REQUEST.get("submit_button", False)
+        if submit_action == "prepare_delete":
+            errors = []
+            if project.state == 2:
+                errors.append(_("the project %(title)s is published. please unpublish before deleting.") % {'title':project.title})
+                message = _("can not delete the project. Please correct the following error")
+                title = _('title error deleting project')
+            else:
+                message = _("please confirm deleting project %(title)s") % {'title':project.title}
+                title = _("confirm deletion")
+            return render_to_response('ldt/ldt_utils/error_confirm.html', {'errors':errors, 'message':message, 'title': title}, context_instance=RequestContext(request))
+        elif submit_action == "delete":
+            if project.state != 2:
+                project.delete()
+            form_status = 'deleted'
+            form = AddProjectForm()
+        else:
+            form_status = 'saved'
+            form = AddProjectForm(request.POST)
+            if form.is_valid():
+                if project.title != form.cleaned_data['title']:
+                    project.title = form.cleaned_data['title']
+                    ldt = lxml.etree.fromstring(project.ldt.encode("utf-8"))
+                    res = ldt.xpath("/iri/project")
+                    res[0].set("title", project.title)
+                    project.ldt = lxml.etree.tostring(ldt, pretty_print=True)
+                    project.save()
+    else:
+        form = AddProjectForm({'title':unicode(project.title)})
+        form_status = 'none'
+        
+    return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status':form_status, 'ldt_id': ldt_id, 'contents':contents, 'create_project_action':reverse("ldt.ldt_utils.views.update_project", args=[ldt_id])}, context_instance=RequestContext(request))
+
+
+@login_required
+def copy_project(request, ldt_id):
+
+    project = get_object_or_404(Project, ldt_id=ldt_id)
+    if request.method == "POST" :
+        form = CopyProjectForm(request.POST)
+        if form.is_valid():
+            user = request.user
+            project = project.copy_project(title=request.POST['title'], user=user)
+            is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+            if is_gecko:
+                return HttpResponseRedirect(reverse('index_project_full', args=[project.ldt_id]))
+            else:
+                return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))
+    else:
+        form = CopyProjectForm
+    return render_to_response('ldt/ldt_utils/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request))
+
+
+def write_content_base(request, iri_id=None):
+
+    if iri_id:        
+        instance_content = Content.objects.get(iri_id=iri_id) #@UndefinedVariable
+        instance_media = instance_content.media_obj
+        logging.debug("write_content_base : valid form: for instance : media -> " + repr(instance_media) + " content : for instance : " + repr(instance_content)) #@UndefinedVariable
+    else:
+        logging.debug("No iri_id") #@UndefinedVariable
+        instance_content = None
+        instance_media = None
+    
+    form_status = 'none'        
+    if request.method == "POST":
+        
+        if instance_content is not None:
+            content_instance_val = model_to_dict(instance_content, exclude=ContentForm.Meta.exclude)
+        else:
+            content_instance_val = {}
+        
+        if instance_media is not None:
+            media_instance_val = model_to_dict(instance_media, exclude=MediaForm.Meta.exclude)
+        else:
+            media_instance_val = {}
+        #add prefix
+        
+        def add_prefix(dict, prefix):
+            for key, value in dict.items():
+                dict['%s-%s' % (prefix, key)] = value
+                del(dict[key])
+        
+        add_prefix(content_instance_val, "content")
+        add_prefix(media_instance_val, "media")        
+        
+        for k in request.POST.keys():
+            value = request.POST.get(k)
+            content_instance_val[k] = value
+            media_instance_val[k] = value
+        
+        content_form = ContentForm(content_instance_val, prefix="content", instance=instance_content)
+        media_form = MediaForm(media_instance_val, request.FILES, prefix="media", instance=instance_media)
+        
+        media_valid = media_form.is_valid()
+        content_valid = content_form.is_valid()
+        
+        logging.debug("write_content_base : valid form: for instance : " + repr(instance_media) + " -> media " + str(media_valid) + " content : for instance : " + repr(instance_content) + " : " + str(content_valid)) #@UndefinedVariable
+        
+        if media_valid and content_valid :
+            
+            # see if media must be created
+            cleaned_data = {}
+            cleaned_data.update(media_form.cleaned_data)
+            
+            media_input_type = content_form.cleaned_data["media_input_type"]
+            
+            if media_input_type == "none":
+                media = None
+            elif media_input_type == "link":
+                media = content_form.cleaned_data["media_obj"]
+                created = False
+            elif media_input_type == "create":
+                del cleaned_data["media_file"]
+                if not cleaned_data['videopath']:
+                    cleaned_data['videopath'] = settings.STREAM_URL
+                # if the source is already http:// or rtmp:// we don't have to add STREAM_URL
+                if cleaned_data['src'].startswith("rtmp://") or cleaned_data['src'].startswith("http://"):
+                    cleaned_data['videopath'] = ''
+                media, created = Media.objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) #@UndefinedVariable
+            elif media_input_type == "url" or media_input_type == "upload" :
+                # copy file
+                #complet src
+                destination_file = None
+                source_file = None
+                try:
+                    if media_input_type == "url":
+                        url = cleaned_data["external_src_url"]
+                        source_file = urllib2.urlopen(url)
+                        source_filename = source_file.info().get('Content-Disposition', None)
+                        if not source_filename:
+                            source_filename = urlparse.urlparse(url).path.rstrip("/").split('/')[-1]
+                    elif media_input_type == "upload":
+                        #source_file = request.FILES['media-media_file']
+                        # At this point the file has already be uploaded thanks to the upload view, and original file name is sent through a post var
+                        source_filename = request.POST["media-local_file_name"]
+                    
+                    source_filename = ldt_utils_path.sanitize_filename(source_filename)
+                    destination_filepath = os.path.join(settings.STREAM_PATH, source_filename)
+                    base_source_filename = source_filename
+                    extension = base_source_filename.split(".")[-1]
+                    if extension == base_source_filename:
+                        extension = ""
+                        base_basename_filename = base_source_filename
+                    else:
+                        base_basename_filename = base_source_filename[:-1 * (len(extension) + 1)]
+                    i = 0
+                    
+                    while os.path.exists(destination_filepath):
+                        base_source_filename = "%s.%d.%s" % (base_basename_filename, i, extension)
+                        destination_filepath = os.path.join(settings.STREAM_PATH, base_source_filename)
+                        i += 1
+                    
+                    if media_input_type == "url":
+                        # we upload the file if we are in url case
+                        destination_file = open(destination_filepath, "wb")
+                        chunck = source_file.read(2048)
+                        while chunck:
+                            destination_file.write(chunck)
+                            chunck = source_file.read(2048)
+                        
+                    elif media_input_type == "upload":
+                        # The media file has been uploaded in the session temp folder 
+                        # so we just have to move to the regular folder and rename it.
+                        if os.path.exists(os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", source_filename)):
+                            os.rename(os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", source_filename), os.path.join(settings.STREAM_PATH, base_source_filename))
+                    
+                    
+                    src_prefix = settings.STREAM_SRC_PREFIX.rstrip("/")
+                    if len(src_prefix) > 0:
+                        cleaned_data["src"] = src_prefix + "/" + base_source_filename
+                    else:
+                        cleaned_data["src"] = base_source_filename
+                    
+                    
+                except Exception as inst:
+                    logging.debug("write_content_base : POST error when processing file:" + str(inst)) #@UndefinedVariable
+                    form_status = "error"
+                    #set error for form
+                    if media_input_type == "url":
+                        errors = media_form._errors.setdefault("external_src_url", ErrorList())
+                        errors.append(_("Problem when downloading file from url : ") + url)
+                    elif media_input_type == "upload":
+                        errors = media_form._errors.setdefault("media_file", ErrorList())
+                        errors.append(_("Problem when uploading file : ") + str(inst))
+                finally:
+                    if media_input_type == "url":
+                        if destination_file:
+                            destination_file.close()
+                        if source_file:
+                            source_file.close()
+                
+                if form_status != "error":
+                    #try:
+                    del cleaned_data["media_file"]
+                    if not cleaned_data['videopath']:
+                        cleaned_data['videopath'] = settings.STREAM_URL
+                    mimetype = cleaned_data.get('mimetype_field', None)
+                    if not mimetype:
+                        mimetype = mimetypes.guess_type(cleaned_data['src'])
+                    cleaned_data['mimetype_field'] = mimetype
+                    media, created = Media.objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) #@UndefinedVariable
+                else:
+                    media = None
+                    
+
+            if media and not created:
+                for attribute in ('external_id', 'external_permalink', 'external_publication_url', 'external_src_url', 'media_creation_date', 'videopath', 'duration', 'description', 'title'):
+                    setattr(media, attribute, cleaned_data.get(attribute))
+                mimetype = cleaned_data.get('mimetype_field', None)
+                if not mimetype:
+                    mimetype = mimetypes.guess_type(media.src)
+                media.mimetype_field = mimetype
+                    
+                media.save()
+            
+            
+            if form_status != "error":
+                #try:
+                content_defaults = {}
+                content_defaults.update(content_form.cleaned_data)
+                content_defaults['media_obj'] = media
+                del content_defaults["media_input_type"]
+                content, created = Content.objects.get_or_create(iri_id=content_form.cleaned_data['iri_id'], defaults=content_defaults) #@UndefinedVariable
+                if not created:
+                    for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media_obj'):
+                        setattr(content, attribute, content_defaults[attribute])
+                content.save()
+                form_status = 'saved'
+                media_form = MediaForm(instance=media, prefix="media")
+                content_form = ContentForm(instance=content, prefix="content")
+        else:
+            form_status = 'error'
+    else:
+        form_status = 'empty'
+        initial = { 'media_input_type':"link"}
+        
+        content_form = ContentForm(prefix="content", instance=instance_content, initial=initial)
+        media_form = MediaForm(prefix="media", instance=instance_media)
+        
+        if instance_content is not None:
+            content_form.media_input_type = "link"
+    
+    return content_form, media_form, form_status
+
+@login_required
+def write_content(request, iri_id=None):
+    
+    submit_action = request.REQUEST.get("submit_button", False) 
+
+    if submit_action == "prepare_delete": 
+        errors, titles = prepare_delete_content(request, iri_id)
+        if errors and len(errors) > 0:
+            message = ungettext("There is %(count)d error when deleting content", "There are %(count)d errors when deleting content", len(errors)) % { 'count': len(errors)}
+            title_msg = _('title error deleting content')
+        else:
+            message = _("Confirm delete content %(titles)s") % { 'titles' : ",".join(titles) }
+            title_msg = _("confirm delete content")
+        return render_to_response('ldt/ldt_utils/error_confirm.html', {'errors':errors, 'message':message, 'title': title_msg}, context_instance=RequestContext(request))  
+    elif submit_action == "delete":
+        delete_content(request, iri_id)
+        form_status = "deleted"
+        content_form = ContentForm()
+        media_form = MediaForm()
+    else:
+        content_form, media_form, form_status = write_content_base(request, iri_id)
+
+    if iri_id:
+        create_content_action = reverse('ldt.ldt_utils.views.write_content', kwargs={'iri_id':iri_id})
+    else:
+        create_content_action = reverse('ldt.ldt_utils.views.write_content')
+    
+    session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
+    cookie_name = settings.SESSION_COOKIE_NAME
+    
+    return render_to_response('ldt/ldt_utils/create_content.html', {'content_form': content_form, 'media_form': media_form, 'form_status': form_status, 'create_content_action': create_content_action, 'iri_id': iri_id, 'session_key':session_key, 'cookie_name':cookie_name}, context_instance=RequestContext(request))
+
+@login_required
+def prepare_delete_content(request, iri_id=None):
+    errors = []
+    titles = []
+    if not iri_id:
+        iri_id = request.REQUEST.get("iri_id", None)
+        
+    if iri_id:
+        for content in Content.objects.filter(iri_id=iri_id): #@UndefinedVariable
+            titles.append(unicode(content.title))
+            projects = content.project_set.all()
+            projects_nb = len(projects)
+            if projects_nb > 0:
+                project_titles = map(lambda p: unicode(p.title), projects)
+                errors.append(ungettext("Content '%(title)s' is referenced by this project : %(project_titles)s. Please delete it beforehand.", "Content '%(title)s' is referenced by %(count)d projects: %(project_titles)s. Please delete them beforehand.", projects_nb) % {'title':unicode(content.title), 'count':projects_nb, 'project_titles': ",".join(project_titles)})
+ 
+        
+    return errors, titles
+
+
+@login_required
+def delete_content(request, iri_id=None):
+    if not iri_id:
+        iri_id = request.REQUEST.get("iri_id", None)
+        
+    if iri_id:
+        Content.objects.filter(iri_id=iri_id).delete() #@UndefinedVariable
+
+
+def upload(request):
+    if request.method == 'POST':
+        for field_name in request.FILES:
+            # We get the file name
+            source_file = request.FILES[field_name]
+            source_filename = source_file.name
+            # We sanitize the file name : no space, only lower case.
+            source_filename = ldt_utils_path.sanitize_filename(source_filename)
+            # We create the session temp folder if necessary
+            if not os.path.exists(os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME])):
+                os.makedirs(os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME]))
+            destination_filepath = os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", source_filename)
+            # We delete the existing file if necessary
+            if os.path.exists(destination_filepath):
+                os.remove(destination_filepath)
+            
+            destination_file = open(destination_filepath, "wb")
+            
+            for chunk in source_file.chunks():
+                destination_file.write(chunk)
+            destination_file.close()
+            
+        # indicate that everything is OK for SWFUpload
+        return HttpResponse("ok", mimetype="text/plain")
+    else:
+        return HttpResponse("notok", mimetype="text/plain")
+
+def removetempfile(request):
+    # The filename arrives with a GET var.
+    file_path = os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", ldt_utils_path.sanitize_filename(request.GET["filename"]))
+    if os.path.exists(file_path):
+        os.remove(file_path)
+    return HttpResponse("remove ok", mimetype="text/plain")
+
+def get_duration(request):
+    try:
+        # The filename arrives with a GET var.
+        file_path = os.path.join(settings.STREAM_PATH, "tmp/" + request.COOKIES[settings.SESSION_COOKIE_NAME] + "/", ldt_utils_path.sanitize_filename(request.GET["filename"]))
+        if settings.FFMPEG_PATH and os.path.exists(file_path):
+            output = str(subprocess.Popen([settings.FFMPEG_PATH, "-i", file_path],stderr = subprocess.PIPE).communicate()[1])
+            m = re.search("Duration:\s*?([\d.:]+)", output, re.M)
+            dur_arr = m.group(1).split(":")
+            td = datetime.timedelta(hours=int(dur_arr[0]),minutes=int(dur_arr[1]),seconds=float(dur_arr[2]))
+            str_duration = str((td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**3)
+            return HttpResponse(str_duration, mimetype="text/plain")
+        else:
+            return HttpResponse("", mimetype="text/plain")
+    except Exception as inst:
+        return HttpResponse("", mimetype="text/plain")
+    
Binary file src/ldt/ldt/locale/fr/LC_MESSAGES/django.mo has changed
--- a/src/ldt/ldt/locale/fr/LC_MESSAGES/django.po	Fri May 20 14:19:15 2011 +0200
+++ b/src/ldt/ldt/locale/fr/LC_MESSAGES/django.po	Tue May 24 12:44:05 2011 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-05-11 17:30+0200\n"
+"POT-Creation-Date: 2011-05-24 12:17+0200\n"
 "PO-Revision-Date: 2010-03-09 15:52+0100\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,31 +24,43 @@
 msgid "Time"
 msgstr "Time"
 
-#: .\ldt_utils\forms.py:39 .\ldt_utils\models.py:101
+#: .\ldt_utils\forms.py:25 .\templates\ldt\ldt_base.html.py:112
+msgid "Search"
+msgstr "Recherche"
+
+#: .\ldt_utils\forms.py:26
+msgid "Fields"
+msgstr "Champs"
+
+#: .\ldt_utils\forms.py:27
+msgid "Display the results in Lignes De Temps"
+msgstr "Afficher les résultats dans Lignes De Temps"
+
+#: .\ldt_utils\forms.py:40 .\ldt_utils\models.py:101
 msgid "content.content_creation_date"
 msgstr "Date de creation du contenu"
 
-#: .\ldt_utils\forms.py:40
+#: .\ldt_utils\forms.py:41
 msgid "content.media_input_type"
 msgstr "Source du média"
 
-#: .\ldt_utils\forms.py:40
+#: .\ldt_utils\forms.py:41
 msgid "file_upload"
 msgstr "upload fichier"
 
-#: .\ldt_utils\forms.py:40
+#: .\ldt_utils\forms.py:41
 msgid "url"
 msgstr "url"
 
-#: .\ldt_utils\forms.py:40
+#: .\ldt_utils\forms.py:41
 msgid "existing_media"
 msgstr "média existant"
 
-#: .\ldt_utils\forms.py:40
+#: .\ldt_utils\forms.py:41
 msgid "create_media"
 msgstr "source externe : fichier streamé, statique, url youtube..."
 
-#: .\ldt_utils\forms.py:40
+#: .\ldt_utils\forms.py:41
 msgid "none_media"
 msgstr "Aucun"
 
@@ -141,70 +153,70 @@
 msgid "content.duration"
 msgstr "Durée (ms)"
 
-#: .\ldt_utils\models.py:289
+#: .\ldt_utils\models.py:292
 msgid "created by"
 msgstr "créé par"
 
-#: .\ldt_utils\models.py:290
+#: .\ldt_utils\models.py:293
 msgid "changed by"
 msgstr "modifié par"
 
-#: .\ldt_utils\views.py:74 .\ldt_utils\views.py:350 .\ldt_utils\views.py:396
+#: .\ldt_utils\views.py:78 .\ldt_utils\views.py:456 .\ldt_utils\views.py:502
 msgid "You can not access this project"
 msgstr "vous n'avez pas l'autorisation d'accéder à ce projet"
 
-#: .\ldt_utils\views.py:561
+#: .\ldt_utils\views.py:668
 #, python-format
 msgid "the project %(title)s is published. please unpublish before deleting."
 msgstr "Le projet %(title)s est publié. Déplublier le avant de l'effacer."
 
-#: .\ldt_utils\views.py:562
+#: .\ldt_utils\views.py:669
 msgid "can not delete the project. Please correct the following error"
 msgstr ""
 "Le projet ne peut pas être effacé. Veuillez corriger les erreurs suivantes."
 
-#: .\ldt_utils\views.py:563
+#: .\ldt_utils\views.py:670
 msgid "title error deleting project"
 msgstr "Erreur lors de l'effacement du projet"
 
-#: .\ldt_utils\views.py:565
+#: .\ldt_utils\views.py:672
 #, python-format
 msgid "please confirm deleting project %(title)s"
 msgstr "Confirmer l'effacement du projet intitulé %(title)s"
 
-#: .\ldt_utils\views.py:566
+#: .\ldt_utils\views.py:673
 msgid "confirm deletion"
 msgstr "Confirmation d'effacement"
 
-#: .\ldt_utils\views.py:734
+#: .\ldt_utils\views.py:845
 msgid "Problem when downloading file from url : "
 msgstr "Problème lors du téléchargement du fichier : "
 
-#: .\ldt_utils\views.py:737
+#: .\ldt_utils\views.py:848
 msgid "Problem when uploading file : "
 msgstr "Problème lors de l'upload du fichier : "
 
-#: .\ldt_utils\views.py:806
+#: .\ldt_utils\views.py:917
 #, python-format
 msgid "There is %(count)d error when deleting content"
 msgid_plural "There are %(count)d errors when deleting content"
 msgstr[0] "Il y a %(count)d erreur lors de l'effacement du contenu"
 msgstr[1] "Il y a %(count)d erreurs lors de l'effacement du contenu"
 
-#: .\ldt_utils\views.py:807
+#: .\ldt_utils\views.py:918
 msgid "title error deleting content"
 msgstr "Erreur lors de l'effacement du contenu"
 
-#: .\ldt_utils\views.py:809
+#: .\ldt_utils\views.py:920
 #, python-format
 msgid "Confirm delete content %(titles)s"
 msgstr "Veuillez confirmer l'effacement du contenu %(titles)s"
 
-#: .\ldt_utils\views.py:810
+#: .\ldt_utils\views.py:921
 msgid "confirm delete content"
 msgstr "Confirmation effacement contenu"
 
-#: .\ldt_utils\views.py:844
+#: .\ldt_utils\views.py:955
 #, python-format
 msgid ""
 "Content '%(title)s' is referenced by this project : %(project_titles)s. "
@@ -287,7 +299,7 @@
 msgid "Cancel upload"
 msgstr "Annuler le téléversement"
 
-#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:52
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:53
 msgid ""
 "The operation could not be performed because one or more error(s) occurred."
 "<br />Please resubmit the content form after making the following changes:"
@@ -295,7 +307,7 @@
 "Opération impossible à cause d'une ou plusieurs erreurs.<br />Veuillez "
 "resoumettre le formulaire contenu après avoir fait les changements suivants:"
 
-#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:63
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:64
 msgid ""
 "The operation could not be performed because one or more error(s) occurred."
 "<br />Please resubmit the media form after making the following changes:"
@@ -303,26 +315,26 @@
 "opération impossible à cause d'une ou plusieurs erreurs.<br />Veuillez "
 "resoumettre le formulaire media après avoir fait les changements suivants:"
 
-#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:73
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:74
 #: .\ldt_utils\templates\ldt\ldt_utils\partial\contentslist.html.py:21
 msgid "Create content"
 msgstr "Créer un contenu"
 
-#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:117
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:118
 msgid "media file is being processed please wait."
 msgstr "Le fichier média est en cours de traitement. Veuillez patienter."
 
-#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:121
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:122
 #: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:59
 #: .\ldt_utils\templates\ldt\ldt_utils\error_confirm.html.py:49
 msgid "close_cancel"
 msgstr "Fermer"
 
-#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:122
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:123
 msgid "delete"
 msgstr "Effacer"
 
-#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:123
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:124
 msgid "write"
 msgstr "Enregistrer"
 
@@ -419,6 +431,10 @@
 msgid "search"
 msgstr "Recherche"
 
+#: .\ldt_utils\templates\ldt\ldt_utils\search_form.html.py:10
+msgid "The search field can not be empty."
+msgstr "Le champ de recherche ne peut pas être vide."
+
 #: .\ldt_utils\templates\ldt\ldt_utils\workspace_base.html.py:53
 msgid "content list"
 msgstr "Liste des contenus"
@@ -662,7 +678,7 @@
 msgstr "Modifier le mot de passe"
 
 #: .\templates\cms\admin\cms\page\change_form.html.py:11
-#: .\templates\ldt\ldt_base.html.py:121
+#: .\templates\ldt\ldt_base.html.py:122
 #: .\user\templates\ldt\user\login_form.html.py:34
 msgid "Log out"
 msgstr "Déconnexion"
@@ -683,19 +699,19 @@
 msgid "home"
 msgstr "accueil"
 
-#: .\templates\ldt\ldt_base.html.py:112
+#: .\templates\ldt\ldt_base.html.py:113
 msgid "contents"
 msgstr "Liste des contenus"
 
-#: .\templates\ldt\ldt_base.html.py:113
+#: .\templates\ldt\ldt_base.html.py:114
 msgid "indexation projects"
 msgstr "Projets d'indexation"
 
-#: .\templates\ldt\ldt_base.html.py:114
+#: .\templates\ldt\ldt_base.html.py:115
 msgid "accounts"
 msgstr "Comptes"
 
-#: .\templates\ldt\ldt_base.html.py:115
+#: .\templates\ldt\ldt_base.html.py:116
 #: .\user\templates\ldt\user\change_email.html.py:6
 #: .\user\templates\ldt\user\change_email_done.html.py:6
 #: .\user\templates\ldt\user\login_form.html.py:32
@@ -704,7 +720,7 @@
 msgid "Profiles"
 msgstr "Mon profil"
 
-#: .\templates\ldt\ldt_base.html.py:129
+#: .\templates\ldt\ldt_base.html.py:130
 msgid "Langue"
 msgstr "Langue"
 
--- a/src/ldt/ldt/static/ldt/js/projectscontents.js	Fri May 20 14:19:15 2011 +0200
+++ b/src/ldt/ldt/static/ldt/js/projectscontents.js	Tue May 24 12:44:05 2011 +0200
@@ -433,11 +433,12 @@
 //
 // Functions used in the create content view.
 //
-function onCreateContentReady(url_upload, media_prefix, post_added_params, btn_label, success_label, wait_label, cancel_label, remove_url) {
+function onCreateContentReady(url_upload, media_prefix, post_added_params, btn_label, success_label, wait_label, cancel_label, remove_url, ask_dur_url) {
 	
     window.upload_from_local_done = false;
     window.submit_asked = false;
     window.remove_temp_file_url = remove_url;
+    window.ask_duration_url = ask_dur_url;
     
     $("#close_button").click(function (e) {
         e.preventDefault();
@@ -527,6 +528,22 @@
                     if(window.submit_asked==true){
                         $('#my_form').submit();
                     }
+                    else{
+                        // We ask the uploaded media's duration
+                        if(window.ask_duration_url){
+                            $.ajax({
+                                type: "GET",
+                                url: window.ask_duration_url,
+                                data: "filename="+ $('#id_media-local_file_name').val(),
+                                cache: false,
+                                success: function(data, status, request){
+                                    if(data && data!=""){
+                                        $('#id_content-duration').val(data);
+                                    }
+                                }
+                            });
+                        }
+                    }
                 }
                 catch (ex) {
                     //this.debug(ex);
Binary file src/ldt/ldt/static/ldt/swf/ldt/LignesDeTempsFlex.swf has changed
--- a/src/ldt/ldt/templates/ldt/ldt_base.html	Fri May 20 14:19:15 2011 +0200
+++ b/src/ldt/ldt/templates/ldt/ldt_base.html	Tue May 24 12:44:05 2011 +0200
@@ -97,7 +97,6 @@
         {% endblock %}
     </div>
     <div id="content" class="span-24 last">
-    
         <div id="toolbar" class="span-24 last">
         {% block toolbar %}
             <div class="block span-24 last">
@@ -107,8 +106,10 @@
                 {% url ldt.ldt_utils.views.list_ldt as space_url %}
                 {% url ldt.ldt_utils.views.list_content as content_url %}
                 {% url ldt.user.views.profile  as profile_url %}
+                {% url ldt.ldt_utils.views.searchForm  as search_url %}
                     <ul class="tabs">
                         <li class='{% active request "active" workspace_url %}'><a href="{{ workspace_url }}" >{% trans "home" %}</a></li>
+                        <li class='{% active request "active" search_url %}'><a href="{{ search_url }}" >{% trans "Search" %}</a></li>
                         <!--li class='{% active request "active" content_url %}'><a href="{{ content_url }}">{% trans "contents" %}</a></li>
                         <li class='{% active request "active" space_url %}'><a href="{{ space_url }}">{% trans "indexation projects" %}</a></li>
                         <li class='{% active request "active" "" %}'><a href="#">{% trans "accounts" %}</a></li>
--- a/web/ldtplatform/config.py.tmpl	Fri May 20 14:19:15 2011 +0200
+++ b/web/ldtplatform/config.py.tmpl	Tue May 24 12:44:05 2011 +0200
@@ -23,6 +23,9 @@
 # DO NOT forget to do command line ./manage.py collectstatic to gather static media into the web/static folder
 STATIC_ROOT = BASE_STATIC_ROOT + "site/"
 
+# PATH to the ffmpeg executable, used to know automatically the media file duration 
+FFMPEG_PATH = "C:/path/to/ffmpeg.exe"
+
 
 CONTENT_ROOT = BASE_STATIC_ROOT + "content/"
 
--- a/web/ldtplatform/settings.py	Fri May 20 14:19:15 2011 +0200
+++ b/web/ldtplatform/settings.py	Tue May 24 12:44:05 2011 +0200
@@ -48,22 +48,22 @@
 
 # Absolute path to the directory that holds media.
 # Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = ''
+#MEDIA_ROOT = ''
 
 # Root of static files used by each app, generated by code or uploaded by users
-STATIC_URL = '/static/'
+#STATIC_URL = '/static/'
 
 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
 # trailing slash if there is a path component (optional in other cases).
 # Examples: "http://media.lawrence.com", "http://example.com/media/"
-MEDIA_URL = ''
+#MEDIA_URL = ''
 
 # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
 # trailing slash.
 # Examples: "http://foo.com/media/", "/media/".
-ADMIN_MEDIA_PREFIX = '/media/'
+#ADMIN_MEDIA_PREFIX = '/media/'
 
-LDT_MEDIA_PREFIX = '/ldt/'
+#LDT_MEDIA_PREFIX = '/ldt/'
 
 # Make this unique, and don't share it with anybody.
 SECRET_KEY = 't^lii5_z@tho$%6t&b#dm#t9nz$$ylyclxvkdiyqbl+(dnt(ma'