# 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 %}
-
-
-
{% 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 %}