# HG changeset patch # User cavaliet # Date 1306233845 -7200 # Node ID f3a013f66974445ae9c04a60c5ad8870d94fbe32 # Parent a95b0246db9948593211eb70faf01e9223600467 Add search form, displaying the results in a regular LDT template. Update language files. diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/ldt_utils/forms.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') + } diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html --- 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 %}"); }); diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html --- 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 %} -
+ // 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; + } + }); + }); + +{% endblock %} + +{% block content %} + - +{% csrf_token %} {{ form.as_table }}
- - {% endblock %} diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/ldt_utils/urls.py --- 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.*)/(?P.*)$', 'views.searchInit'), - url(r'^searchForm/$', 'views.searchForm'), - url(r'^search/$', 'views.searchIndex'), - url(r'^search/(?P.*)/(?P.*)$', 'views.searchIndexGet'), - url(r'^searchLdt/(?P.*)/(?P.*)$', 'views.searchLdt'), - url(r'^searchSeg/(?P.*)/(?P.*)$', 'views.searchSegments'), - url(r'^index/(?P.*)$', 'views.index'), - url(r'^init/(?P.*)/(?P.*)$', 'views.init', name='ldt_init'), - url(r'^ldt/(?P.*)$', 'views.ldt'), - url(r'^search/loading/$', 'views.loading'), - url(r'^create/(?P.*)$', 'views.create_project'), - url(r'^copy/(?P.*)$', 'views.copy_project'), - url(r'^update/(?P.*)$', 'views.update_project'), - url(r'^cljson/id/(?P.*)$', 'views.project_json_id'), - url(r'^cljson/externalid/(?P.*)$', 'views.project_json_externalid'), - url(r'^rdf/id/(?P.*)$', 'views.project_annotations_rdf'), - url(r'^/?$', "views.workspace", name="root-view"), - url(r'^filterprojects/_(?P[\w\%\_\-\+]*?)/(?Ptrue|false)/(?P\d)$', "views.projectsfilter",), - url(r'^filtercontents/_(?P[\w\%\_\-\+]*?)/$', "views.contentsfilter",), - (r'^embedpopup/?$', "views.popup_embed"), - url(r'^segment/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', 'views.index_segment'), - url(r'^segmentInit/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', 'views.init_segment'), - url(r'^segmentLdt/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', 'views.ldt_segment'), - url(r'^segmentHighlight/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', '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[\w-]+)$', 'views.write_content'), - url(r'^space/ldt/$', 'views.list_ldt'), - url(r'^space/ldt/indexproject/(?P.*)$', 'views.index_project', name='index_project'), - url(r'^space/ldt/indexprojectfull/(?P.*)$', 'views.index_project', {'full': True}, name='index_project_full'), - url(r'^space/ldt/init/(?P.*)/(?P.+)$', 'views.init', name='space_ldt_init'), - url(r'^space/ldt/project/(?P.*)$', '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[\w-]*)(?:/(?Ptrue|false))?$', 'views.publish'), - url(r'^space/ldt/unpublish/(?P[\w-]*)(?:/(?Ptrue|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.*)/(?P.*)$', 'views.searchInit'), + url(r'^searchForm/$', 'views.searchForm'), + url(r'^search/$', 'views.searchIndex'), + url(r'^search/(?P.*)/(?P.*)$', 'views.searchIndexGet'), + url(r'^searchLdt/(?P.*)/(?P.*)$', 'views.searchLdt'), + url(r'^searchSeg/(?P.*)/(?P.*)$', 'views.searchSegments'), + url(r'^index/(?P.*)$', 'views.index'), + url(r'^init/(?P.*)/(?P.*)$', 'views.init', name='ldt_init'), + url(r'^ldt/(?P.*)$', 'views.ldt'), + url(r'^search/loading/$', 'views.loading'), + url(r'^create/(?P.*)$', 'views.create_project'), + url(r'^copy/(?P.*)$', 'views.copy_project'), + url(r'^update/(?P.*)$', 'views.update_project'), + url(r'^cljson/id/(?P.*)$', 'views.project_json_id'), + url(r'^cljson/externalid/(?P.*)$', 'views.project_json_externalid'), + url(r'^rdf/id/(?P.*)$', 'views.project_annotations_rdf'), + url(r'^/?$', "views.workspace", name="root-view"), + url(r'^filterprojects/_(?P[\w\%\_\-\+]*?)/(?Ptrue|false)/(?P\d)$', "views.projectsfilter",), + url(r'^filtercontents/_(?P[\w\%\_\-\+]*?)/$', "views.contentsfilter",), + (r'^embedpopup/?$', "views.popup_embed"), + url(r'^segment/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', 'views.index_segment'), + url(r'^segmentInit/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', 'views.init_segment'), + url(r'^segmentLdt/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', 'views.ldt_segment'), + url(r'^segmentHighlight/(?P.*)/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', '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[\w-]+)$', 'views.write_content'), + url(r'^space/ldt/$', 'views.list_ldt'), + url(r'^space/ldt/indexproject/(?P.*)$', 'views.index_project', name='index_project'), + url(r'^space/ldt/indexprojectfull/(?P.*)$', 'views.index_project', {'full': True}, name='index_project_full'), + url(r'^space/ldt/init/(?P.*)/(?P.+)$', 'views.init', name='space_ldt_init'), + url(r'^space/ldt/project/(?P.*)$', '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[\w-]*)(?:/(?Ptrue|false))?$', 'views.publish'), + url(r'^space/ldt/unpublish/(?P[\w-]*)(?:/(?Ptrue|false))?$', 'views.unpublish'), + url(r'^space/upload/$', 'views.upload'), + url(r'^space/removetempfile/$', 'views.removetempfile'), + url(r'^space/getduration/$', 'views.get_duration'), + +) diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/ldt_utils/views.py --- 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("

User not found

") - 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("Error : No result"); - -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"\n") - resp.write(u"\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("

User not found

") + 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("Error : No result"); + 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"\n") + resp.write(u"\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") + diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/locale/fr/LC_MESSAGES/django.mo Binary file src/ldt/ldt/locale/fr/LC_MESSAGES/django.mo has changed diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/locale/fr/LC_MESSAGES/django.po --- 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 \n" "Language-Team: LANGUAGE \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." "
Please resubmit the content form after making the following changes:" @@ -295,7 +307,7 @@ "Opération impossible à cause d'une ou plusieurs erreurs.
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." "
Please resubmit the media form after making the following changes:" @@ -303,26 +315,26 @@ "opération impossible à cause d'une ou plusieurs erreurs.
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" diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/static/ldt/js/projectscontents.js --- 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); diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/static/ldt/swf/ldt/LignesDeTempsFlex.swf Binary file src/ldt/ldt/static/ldt/swf/ldt/LignesDeTempsFlex.swf has changed diff -r a95b0246db99 -r f3a013f66974 src/ldt/ldt/templates/ldt/ldt_base.html --- 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 %}
-
{% block toolbar %}
@@ -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 %}