web/ldt/ldt_utils/views.py
changeset 62 39b2dab4f939
parent 60 a8ad7ebf5902
child 67 90fd14c649bb
--- a/web/ldt/ldt_utils/views.py	Wed Sep 15 15:20:26 2010 +0200
+++ b/web/ldt/ldt_utils/views.py	Tue Sep 21 04:27:08 2010 +0200
@@ -9,7 +9,7 @@
 from django.utils import simplejson
 from django.utils.html import escape
 from fileimport import *
-from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm, ContentForm
+from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm, ContentForm, MediaForm
 from ldt.core.models import Owner
 from models import *
 from utils import *
@@ -24,6 +24,10 @@
 import xml.dom
 import xml.dom.ext
 import xml.dom.minidom
+import tempfile
+import urllib2
+from urllib2 import urlparse
+from jogging import logging
 
 
     
@@ -367,29 +371,114 @@
 
 def write_content_base(request):
     
+    logging.debug("write_content_base")
     form_status= 'none'        
     if request.method =="POST":
+        logging.debug("write_content_base : POST")
         content_form = ContentForm(request.POST, prefix="content")
-        media_form = MediaForm(request.POST, prefix="media")
+        media_form = MediaForm(request.POST, request.FILES, prefix="media")
         media_valid = media_form.is_valid()
         content_valid = content_form.is_valid()
         if media_valid and content_valid :
-            media, created = Media.objects.get_or_create(src=media_form.cleaned_data['src'], defaults=media_form.cleaned_data)
-            if 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, media_form.cleaned_data.get(attribute))
-            media.save()
+            
+            # 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"]
+            
+            logging.debug("write_content_base : POST media_input_type:" + media_input_type)
             
-            content_defaults = {'media': media }
-            content_defaults.update(content_form.cleaned_data)
-            content, created = Content.objects.get_or_create(iri_id = content_form.cleaned_data['iri_id'], defaults = content_defaults)
-            if not created:
-                for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media'):
-                    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")
+            if media_input_type == "none":
+                media = None
+            elif media_input_type == "link":
+                media = content_form.cleaned_data["media_obj"]
+            elif media_input_type == "url" or  media_input_type == "upload" or  media_input_type == "create":                
+                # 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
+                            
+    
+                        destination_filepath = os.path.join(settings.STREAM_PATH, source_filename)
+                        base_source_filename = source_filename
+                        i = 0
+                        while os.path.exists(destination_filepath):
+                            base_source_filename = source_filename+"(%d)" % (i)
+                            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)
+            
+                    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()
+                        
+                if form_status != "error":
+                    #try:
+                    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)
+                    if 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))
+                    media.save()
+                    #except Exception as inst:
+#                        logging.debug("write_content_base : POST error when saving media:" + str(inst))
+ #                       form_status = "error"
+                        #TODO: set error message
+                        #media_form.errors = _("Error when saving the media : " + e.message)
+
+            #if needed preparetemp file and copy temp file to destination
+            
+            
+            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)
+                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")
+                #except:
+                    #logging.debug("write_content_base : POST error when saving content:" + str(inst))
+                    #form_status = "error"
+                    #TODO : set error on content form
         else:
             form_status = 'error'
     else: