diff -r 97b12f5f2c7a -r 9202807b4cec web/ldt/ldt_utils/views.py --- a/web/ldt/ldt_utils/views.py Wed Sep 29 10:10:07 2010 +0200 +++ b/web/ldt/ldt_utils/views.py Tue Oct 12 03:23:33 2010 +0200 @@ -1,37 +1,40 @@ -import django.core.urlresolvers -from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden -from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404 +from Ft.Xml import MarkupWriter +from contentindexer import * +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.core import serializers +from django.core.urlresolvers import reverse +from django.forms.util import ErrorList +from django.http import HttpResponse, HttpResponseRedirect, \ + HttpResponseForbidden +from django.shortcuts import render_to_response, get_object_or_404, \ + get_list_or_404 from django.template import RequestContext -from django.core.urlresolvers import reverse -from django.contrib.auth.decorators import login_required -from django.conf import settings -from django.core import serializers from django.utils import simplejson from django.utils.html import escape +from django.utils.translation import ugettext as _, ungettext from fileimport import * -from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm, ContentForm, MediaForm +from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, \ + CopyProjectForm, ContentForm, MediaForm from ldt.core.models import Owner from models import * -from utils import * -from contentindexer import * from projectserializer import * from string import Template -from Ft.Xml import MarkupWriter +from urllib2 import urlparse +from utils import * +import base64 import cgi +import django.core.urlresolvers +import ldt.auth as ldt_auth +import ldt.utils.path as ldt_utils_path +import logging +import lucene +import tempfile +import urllib2 import uuid -import base64 -import lucene import xml.dom import xml.dom.ext import xml.dom.minidom -import tempfile -import urllib2 -from urllib2 import urlparse -from jogging import logging -import ldt.utils.path -import ldt.auth as ldt_auth -from django.utils.translation import ugettext as _ - def searchForm(request): @@ -159,11 +162,15 @@ if form.is_valid(): user = request.user Project.create_project(title=form.cleaned_data['title'], user=user, contents=form.cleaned_data['contents']) - return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt")) + form_status = "saved" + contents=[] + #return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt")) else: form = LdtAddForm() - contents = Content.objects.all() - return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form,'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request)) + contents = Content.objects.all() + 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/done.html', context_instance=RequestContext(request)) @@ -358,7 +365,42 @@ return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id])) else: form = AddProjectForm() - return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'contents':contents, 'iri_id':iri_id, 'create_project_action':reverse("ldt.ldt_utils.views.create_project",args=[iri_id])}, context_instance=RequestContext(request)) + 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])}, 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(): + project.title=form.cleaned_data['title'] + 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): @@ -377,6 +419,7 @@ def write_content_base(request, iri_id=None): + logging.debug(repr(request)) if iri_id: instance_content = Content.objects.get(iri_id=iri_id) instance_media = instance_content.media_obj @@ -408,59 +451,70 @@ elif media_input_type == "link": media = content_form.cleaned_data["media_obj"] created = False - elif media_input_type == "url" or media_input_type == "upload" or media_input_type == "create": + elif media_input_type == "create": + del cleaned_data["media_file"] + if not cleaned_data['videopath']: + cleaned_data['videopath'] = settings.STREAM_URL + media, created = Media.objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) + elif media_input_type == "url" or media_input_type == "upload" : # copy file #complet src destination_file = None source_file = None destination_file_path = None - if media_input_type != "create": - 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'] - source_filename = source_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 - - destination_file = open(destination_filepath, "w") - 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 + 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'] + source_filename = source_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 + destination_file = open(destination_filepath, "w") + 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 + + chunck = source_file.read(2048) + while chunck: + destination_file.write(chunck) chunck = source_file.read(2048) - while chunck: - destination_file.write(chunck) - chunck = source_file.read(2048) - - except Exception as inst: - logging.debug("write_content_base : POST error when processing file:" + str(inst)) - form_status = "error" - finally: - if destination_file: - destination_file.close() - if source_file: - source_file.close() + + except Exception as inst: + logging.debug("write_content_base : POST error when processing file:" + str(inst)) + 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 : ")+str(inst)) + elif media_input_type == "upload": + errors = media_form._errors.setdefault("media_file", ErrorList()) + errors.append(_("Problem when uploading file : ") + str(inst)) + finally: + if destination_file: + destination_file.close() + if source_file: + source_file.close() if form_status != "error": #try: @@ -517,18 +571,61 @@ return content_form, media_form, form_status - +@login_required def write_content(request, iri_id=None): - logging.debug("write_content : " + str(iri_id) ) - content_form, media_form, form_status = write_content_base(request, iri_id) - + 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(write_content, kwargs={'iri_id':iri_id}) else: create_content_action = reverse(write_content) + - 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}, context_instance=RequestContext(request)) + 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}, 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): + titles.append(unicode(content.title)) + projects = Content.objects.all()[0].project_set.all() + projects_nb = len(projects) + if projects_nb > 0: + project_titles = [lambda p: p.title for p in 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':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() + \ No newline at end of file