merge context_processors.py and enable upload cancel and remove temp file. Creation of a session temp folder for upload.
authorcavaliet
Mon, 09 May 2011 18:57:23 +0200
changeset 103 5578dcb54f4d
parent 102 db9549cf9fce
child 104 b62a2a3e272d
merge context_processors.py and enable upload cancel and remove temp file. Creation of a session temp folder for upload.
src/ldt/ldt/ldt_utils/contentindexer.py
src/ldt/ldt/ldt_utils/models.py
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html
src/ldt/ldt/ldt_utils/urls.py
src/ldt/ldt/ldt_utils/views.py
src/ldt/ldt/media/js/projectscontents.js
src/ldt/ldt/settings.py
src/ldt/ldt/utils/context_processors.py
web/ldtplatform/config.py.tmpl
web/ldtplatform/settings.py
web/static/ldt/js/projectscontents.js
--- a/src/ldt/ldt/ldt_utils/contentindexer.py	Fri May 06 02:10:25 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/contentindexer.py	Mon May 09 18:57:23 2011 +0200
@@ -1,195 +1,196 @@
-from django.conf import settings
-from django.db.models.signals import post_save
-from django.dispatch import receiver
-from ldt.ldt_utils.models import Segment, Content, Project
-from ldt.ldt_utils.utils import reduce_text_node
-import ldt.indexation
-import lucene
-import lxml.etree
-import urllib #@UnresolvedImport
-# import ldt.utils.log
-
-def Property(func):
-    return property(**func()) 
-
-
-class LdtIndexer(object):
-    
-    def __init__(self, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST):
-            self.__decoupage_blacklist = decoupage_blackList
-            self.__writer = writer
-        
-    @Property
-    def decoupage_blacklist(): #@NoSelf
-        doc = """get blacklist""" #@UnusedVariable
-       
-        def fget(self):
-            if self.__decoupage_blacklist is None:
-                self.__decoupage_blacklist = ()
-            return self.__decoupage_blacklist
-           
-        def fset(self, value):
-            self.__decoupage_blacklist = value
-           
-        def fdel(self):
-            del self.__decoupage_blacklist
-           
-        return locals()
-    
-    @Property
-    def writer(): #@NoSelf
-        def fget(self):
-            return self.__writer
-        return locals()
-
-    def index_all(self):
-        raise NotImplemented
-    
-    def index_ensemble(self, ensemble, content, project=None):
-        ensembleId = ensemble.get(u"id", None)
-        
-        for decoupageNode in ensemble.getchildren():
-            if decoupageNode.tag != "decoupage"  or decoupageNode.get(u"id", None) in self.decoupage_blacklist:
-                continue
-            
-            decoupId = decoupageNode.get(u"id", None)
-            res = decoupageNode.xpath("elements/element")
-            for elementNode in res:
-                
-                elementId = elementNode.get(u"id", None)
-                tags = elementNode.get(u"tags", None)
-                
-                if tags is not None:                            
-                    tags.replace(u",", u";")
-                
-                if tags is None or len(tags) == 0:
-                    tags = u""
-                    restagnode = elementNode.xpath("tag/text()", smart_strings=False)
-                    for tagnode in restagnode:
-                        tags = tags + u" ; " + tagnode
-                        
-                if tags is None or len(tags) == 0:
-                    tags = u""
-                    restagnode = elementNode.xpath("tags/tag/text()", smart_strings=False)
-
-                    for tagnode in restagnode:
-                        tags = tags + u" ; " + tagnode
-                
-                if tags is None:
-                    tags = u""
-                tags = u";".join([tag[0:50] for tag in tags.split(u";")])
-                
-
-                title = reduce_text_node(elementNode, "title/text()")                
-                abstract = reduce_text_node(elementNode, "abstract/text()")
-                
-                author = elementNode.get("author", "")
-                start_ts = int(float(elementNode.get("begin", "-1")))
-                duration = int(float(elementNode.get("dur", "0")))
-                date_str = elementNode.get("date", "")
-                ldt_id = u""
-                if project:
-                    ldt_id = project.ldt_id
-
-                doc = lucene.Document()
-                doc.add(lucene.Field("type_doc", "annotation", lucene.Field.Store.NO, lucene.Field.Index.NOT_ANALYZED))        
-                doc.add(lucene.Field("iri_id", content.iri_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED))
-                doc.add(lucene.Field("project_id", ldt_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED))
-                doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
-                doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))                        
-                doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
-                doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
-                doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
-                doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
-
-                seg = Segment(content=content,
-                              iri_id=content.iri_id,
-                              ensemble_id=ensembleId,
-                              cutting_id=decoupId,
-                              element_id=elementId,
-                              tags=tags,
-                              title=title,
-                              abstract=abstract,
-                              duration=duration,
-                              author=author,
-                              start_ts=start_ts,
-                              date=date_str,
-                              project_obj=project,
-                              project_id=ldt_id)
-                seg.save()
-                self.writer.addDocument(doc)
-
-
-
-class ContentIndexer(LdtIndexer):
-        
-        def __init__(self, contentList, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST):
-            super(ContentIndexer, self).__init__(writer, decoupage_blackList)
-            self.__contentList = contentList
-                                       
-        def index_all(self):
-            for content in self.__contentList:
-                self.index_content(content)
-                
-        def index_content(self, content):
-            url = content.iri_url()
-            filepath = urllib.urlopen(url)
-            doc = lxml.etree.parse(filepath) #@UndefinedVariable
-           
-            self.writer.deleteDocuments(lucene.Term("iri_id", content.iri_id))
-            Segment.objects.filter(iri_id=content.iri_id).delete() #@UndefinedVariable
-            
-            res = doc.xpath("/iri/body/ensembles/ensemble")
-
-            for ensemble in res:                
-                self.index_ensemble(ensemble, content)
-            
-            self.writer.commit()
-            
-            
-class ProjectIndexer(LdtIndexer):
-        
-        def __init__(self, projectList, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST):
-            super(ProjectIndexer, self).__init__(writer, decoupage_blackList)                
-            self.__projectList = projectList
-                                   
-        def index_all(self):
-            for project in self.__projectList:
-                self.index_project(project)
- 
-        def index_project(self, project):
-            
-            # pocketfilms.utils.log.debug("Indexing project : "+str(project.iri_id))
-            doc = lxml.etree.fromstring(project.ldt) #@UndefinedVariable
-
-            self.writer.deleteDocuments(lucene.Term("project_id", project.ldt_id))
-            Segment.objects.filter(project_obj__ldt_id=project.ldt_id).delete() #@UndefinedVariable
-            
-            res = doc.xpath("/iri/annotations/content")
-
-            for content in res:
-                contentId = content.get(u"id", None)
-                content_obj = None
-                
-                clist = Content.objects.filter(iri_id = contentId) #@UndefinedVariable
-                if len(clist) > 0:
-                    content_obj = clist[0]
- 
-                for ensemble in content.getchildren():
-                    self.index_ensemble(ensemble, content_obj, project)
-            
-            self.writer.commit()
-
-@receiver(post_save, sender=Project)
-def index_project(sender, **kwargs):
-    instance = kwargs['instance']
-    writer = ldt.indexation.get_writer()
-    if instance.state != 2:
-        writer.deleteDocuments(lucene.Term("project_id", instance.ldt_id))
-        Segment.objects.filter(project_obj__ldt_id=instance.ldt_id).delete() #@UndefinedVariable
-    else:
-        projectIndexer = ProjectIndexer([instance], writer)
-        projectIndexer.index_all()
-        
-
+from django.conf import settings
+from django.db.models.signals import post_save
+from django.dispatch import receiver
+from ldt.ldt_utils.models import Segment, Content, Project
+from ldt.ldt_utils.utils import reduce_text_node
+import ldt.indexation
+import lucene
+import lxml.etree
+import urllib #@UnresolvedImport
+# import ldt.utils.log
+
+def Property(func):
+    return property(**func()) 
+
+
+class LdtIndexer(object):
+    
+    def __init__(self, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST):
+            self.__decoupage_blacklist = decoupage_blackList
+            self.__writer = writer
+        
+    @Property
+    def decoupage_blacklist(): #@NoSelf
+        doc = """get blacklist""" #@UnusedVariable
+       
+        def fget(self):
+            if self.__decoupage_blacklist is None:
+                self.__decoupage_blacklist = ()
+            return self.__decoupage_blacklist
+           
+        def fset(self, value):
+            self.__decoupage_blacklist = value
+           
+        def fdel(self):
+            del self.__decoupage_blacklist
+           
+        return locals()
+    
+    @Property
+    def writer(): #@NoSelf
+        def fget(self):
+            return self.__writer
+        return locals()
+
+    def index_all(self):
+        raise NotImplemented
+    
+    def index_ensemble(self, ensemble, content, project=None):
+        ensembleId = ensemble.get(u"id", None)
+        
+        for decoupageNode in ensemble.getchildren():
+            if decoupageNode.tag != "decoupage"  or decoupageNode.get(u"id", None) in self.decoupage_blacklist:
+                continue
+            
+            decoupId = decoupageNode.get(u"id", None)
+            res = decoupageNode.xpath("elements/element")
+            for elementNode in res:
+                
+                elementId = elementNode.get(u"id", None)
+                tags = elementNode.get(u"tags", None)
+                
+                if tags is not None:                            
+                    tags.replace(u",", u";")
+                
+                if tags is None or len(tags) == 0:
+                    tags = u""
+                    restagnode = elementNode.xpath("tag/text()", smart_strings=False)
+                    for tagnode in restagnode:
+                        tags = tags + u" ; " + tagnode
+                        
+                if tags is None or len(tags) == 0:
+                    tags = u""
+                    restagnode = elementNode.xpath("tags/tag/text()", smart_strings=False)
+
+                    for tagnode in restagnode:
+                        tags = tags + u" ; " + tagnode
+                
+                if tags is None:
+                    tags = u""
+                tags = u";".join([tag[0:50] for tag in tags.split(u";")])
+                
+
+                title = reduce_text_node(elementNode, "title/text()")                
+                abstract = reduce_text_node(elementNode, "abstract/text()")
+                
+                author = elementNode.get("author", "")
+                start_ts = int(float(elementNode.get("begin", "-1")))
+                duration = int(float(elementNode.get("dur", "0")))
+                date_str = elementNode.get("date", "")
+                ldt_id = u""
+                if project:
+                    ldt_id = project.ldt_id
+
+                doc = lucene.Document()
+                doc.add(lucene.Field("type_doc", "annotation", lucene.Field.Store.NO, lucene.Field.Index.NOT_ANALYZED))        
+                doc.add(lucene.Field("iri_id", content.iri_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED))
+                doc.add(lucene.Field("project_id", ldt_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED))
+                doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO))
+                doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO))                        
+                doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+                doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED))
+
+                seg = Segment(content=content,
+                              iri_id=content.iri_id,
+                              ensemble_id=ensembleId,
+                              cutting_id=decoupId,
+                              element_id=elementId,
+                              tags=tags,
+                              title=title,
+                              abstract=abstract,
+                              duration=duration,
+                              author=author,
+                              start_ts=start_ts,
+                              date=date_str,
+                              project_obj=project,
+                              project_id=ldt_id)
+                seg.save()
+                self.writer.addDocument(doc)
+
+
+
+class ContentIndexer(LdtIndexer):
+        
+        def __init__(self, contentList, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST):
+            super(ContentIndexer, self).__init__(writer, decoupage_blackList)
+            self.__contentList = contentList
+                                       
+        def index_all(self):
+            for content in self.__contentList:
+                self.index_content(content)
+                
+        def index_content(self, content):
+            url = content.iri_url()
+            filepath = urllib.urlopen(url)
+            doc = lxml.etree.parse(filepath) #@UndefinedVariable
+           
+            self.writer.deleteDocuments(lucene.Term("iri_id", content.iri_id))
+            Segment.objects.filter(iri_id=content.iri_id).delete() #@UndefinedVariable
+            
+            res = doc.xpath("/iri/body/ensembles/ensemble")
+
+            for ensemble in res:                
+                self.index_ensemble(ensemble, content)
+            
+            self.writer.commit()
+            
+            
+class ProjectIndexer(LdtIndexer):
+        
+        def __init__(self, projectList, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST):
+            super(ProjectIndexer, self).__init__(writer, decoupage_blackList)                
+            self.__projectList = projectList
+                                   
+        def index_all(self):
+            for project in self.__projectList:
+                self.index_project(project)
+ 
+        def index_project(self, project):
+            
+            # pocketfilms.utils.log.debug("Indexing project : "+str(project.iri_id))
+            doc = lxml.etree.fromstring(project.ldt) #@UndefinedVariable
+
+            self.writer.deleteDocuments(lucene.Term("project_id", project.ldt_id))
+            Segment.objects.filter(project_obj__ldt_id=project.ldt_id).delete() #@UndefinedVariable
+            
+            res = doc.xpath("/iri/annotations/content")
+
+            for content in res:
+                contentId = content.get(u"id", None)
+                content_obj = None
+                
+                clist = Content.objects.filter(iri_id = contentId) #@UndefinedVariable
+                if len(clist) > 0:
+                    content_obj = clist[0]
+ 
+                for ensemble in content.getchildren():
+                    self.index_ensemble(ensemble, content_obj, project)
+            
+            self.writer.commit()
+
+@receiver(post_save, sender=Project)
+def index_project(sender, **kwargs):
+    if settings.AUTO_INDEX_AFTER_SAVE:
+        instance = kwargs['instance']
+        writer = ldt.indexation.get_writer()
+        if instance.state != 2:
+            writer.deleteDocuments(lucene.Term("project_id", instance.ldt_id))
+            Segment.objects.filter(project_obj__ldt_id=instance.ldt_id).delete() #@UndefinedVariable
+        else:
+            projectIndexer = ProjectIndexer([instance], writer)
+            projectIndexer.index_all()
+        
+
--- a/src/ldt/ldt/ldt_utils/models.py	Fri May 06 02:10:25 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/models.py	Mon May 09 18:57:23 2011 +0200
@@ -161,7 +161,7 @@
     #TODO: better manage the change in .iri name and error scenario (save in temp file + rename
     def save(self, *args, **kwargs):
         
-        #self.sync_iri_file()        
+        self.sync_iri_file()        
         # update it 
         super(Content, self).save(*args, **kwargs)
     
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html	Fri May 06 02:10:25 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html	Mon May 09 18:57:23 2011 +0200
@@ -29,7 +29,7 @@
 	window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
 	
 	$(document).ready(function() {
-		// url_upload, media_prefix, post_added_params, btn_label, success_label
+		// url_upload, media_prefix, post_added_params, btn_label, success_label, wait_label, cancel_label
 		post_added_params = {"csrfmiddlewaretoken" : "{{csrf_token}}",
                     		"{{cookie_name}}" : "{{session_key}}"};
 		
@@ -37,7 +37,10 @@
 							"{{LDT_MEDIA_PREFIX}}", 
 							post_added_params,
 							'{% trans "Browse" %}',
-							'{% trans "File uploaded" %}');
+							'{% trans "File uploaded" %}',
+							'{% trans "Please wait, the upload is not finished yet" %}',
+							'{% trans "Cancel upload" %}',
+							"{% url ldt.ldt_utils.views.removetempfile %}");
 	});
 	
     </script>
--- a/src/ldt/ldt/ldt_utils/urls.py	Fri May 06 02:10:25 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/urls.py	Mon May 09 18:57:23 2011 +0200
@@ -49,5 +49,6 @@
         url(r'^space/ldt/publish/(?P<id>[\w-]*)(?:/(?P<redirect>true|false))?$', 'views.publish'),
         url(r'^space/ldt/unpublish/(?P<id>[\w-]*)(?:/(?P<redirect>true|false))?$', 'views.unpublish'),
         url(r'^space/upload/$', 'views.upload'),
+        url(r'^space/removetempfile/$', 'views.removetempfile'),
 
 )
--- a/src/ldt/ldt/ldt_utils/views.py	Fri May 06 02:10:25 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/views.py	Mon May 09 18:57:23 2011 +0200
@@ -670,7 +670,7 @@
                 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" :                
+            elif media_input_type == "url" or media_input_type == "upload" :
                 # copy file
                 #complet src
                 destination_file = None
@@ -697,8 +697,7 @@
                     else:
                         base_basename_filename = base_source_filename[:-1 * (len(extension) + 1)]
                     i = 0
-                    init_path = destination_filepath
-                    init_name = source_filename
+                    
                     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)
@@ -713,14 +712,10 @@
                             chunck = source_file.read(2048)
                         
                     elif media_input_type == "upload":
-                        # Since the file names have been 1 iteration too far, we rebuild the existing file name
-                        if i == 1 :
-                            base_source_filename = init_name
-                            destination_filepath = init_path
-                        else :
-                            i -= 2
-                            base_source_filename = "%s.%d.%s" % (base_basename_filename, i, extension)
-                            destination_filepath = os.path.join(settings.STREAM_PATH, base_source_filename)
+                        # 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("/")
@@ -766,7 +761,7 @@
                     setattr(media, attribute, cleaned_data.get(attribute))
                 mimetype = cleaned_data.get('mimetype_field', None)
                 if not mimetype:
-                    mimetype = mimetypes.guess_type(media.src) 
+                    mimetype = mimetypes.guess_type(media.src)
                 media.mimetype_field = mimetype
                     
                 media.save()
@@ -780,7 +775,6 @@
                 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()
@@ -870,30 +864,29 @@
             source_filename = source_file.name
             # We sanitize the file name : no space, only lower case.
             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
-            # We search if there is already a file with the same name, and rename the target by name.X.ext
-            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
-                
+            # 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")
     
--- a/src/ldt/ldt/media/js/projectscontents.js	Fri May 06 02:10:25 2011 +0200
+++ b/src/ldt/ldt/media/js/projectscontents.js	Mon May 09 18:57:23 2011 +0200
@@ -84,6 +84,30 @@
 	};
 }
 
+function testCreateAndClose(nm, close_fn) {
+	
+	return function(force) {
+	    // We get the frames vars
+        f = window.frames[0];
+        form_status =  $('#content_form_status',$.nmTop().store.iframe.contents()).val();
+	    // If form_status is "saved", we don't have to test anything, the form was was normally submitted.
+        // If was status is "empty" AND an upload from local was done
+        if(form_status!="saved" && f.upload_from_local_done==true && f.remove_temp_file_url){
+            // ERASE FILE
+            //alert("testCreateAndClose : " + "f = " + f + ", status = " + form_status + ", u = " + f.upload_from_local_done + ", s = " + f.submit_asked + ", url = " + f.remove_temp_file_url);
+            $.ajax({
+                type: "GET",
+                url: f.remove_temp_file_url,
+                data: "filename="+ $('#id_media-local_file_name',$.nmTop().store.iframe.contents()).val(),
+                cache: false,
+                success: function(data, status, request){
+                    //alert("remove success");
+                }
+            });
+        }
+        close_fn.apply(this);
+	};
+}
 
 function searchCallback(target, container_selector, url, timeout) {
 
@@ -156,6 +180,12 @@
             }
         }
     });
+    $('.content_link_create',base_node).each(function(i, e) {
+        nm = $(e).data('nmObj');
+        $(e).data('nmObj', $.extend(true, nm, {
+            close: testCreateAndClose(nm, nm.close)
+        }));
+    });  
     
     $('.contenttitlelink').each(function(i){
         $(this).attr("target","_blank");
@@ -259,7 +289,7 @@
             },
             afterClose: function(nm) {
                 searchCallback($('#searchprojectsinput'), "#projectslistcontainer", searchprojectfilterurl, 0);
-            }    
+            }
         }        
     });
     $('.ldt_link_create',base_node).each(function(i, e) {
@@ -403,9 +433,11 @@
 //
 // Functions used in the create content view.
 //
-function onCreateContentReady(url_upload, media_prefix, post_added_params, btn_label, success_label) {
+function onCreateContentReady(url_upload, media_prefix, post_added_params, btn_label, success_label, wait_label, cancel_label, remove_url) {
 	
-    var upload_from_local_done = false;
+    window.upload_from_local_done = false;
+    window.submit_asked = false;
+    window.remove_temp_file_url = remove_url;
     
     $("#close_button").click(function (e) {
         e.preventDefault();
@@ -425,10 +457,19 @@
     
     // We disable the default submit
     $('#my_form').submit(function() {
-        if($('#id_content-media_input_type').val()=="upload" && upload_from_local_done==false){
-            //alert("1. " + $('#id_content-media_input_type').val() + ", upload_done = " + upload_from_local_done);
-            startLocalUpload();
-            return false;
+        window.submit_asked = true;
+        if($('#id_content-media_input_type').val()=="upload"){
+            if(window.upload_from_local_done==false){
+                // The form has sent but the uploading has not ended.
+                if($('#upload_progress_info').children().size()>0){
+                    $('#progress_info').remove();
+                }
+                $('#upload_progress_info').append('<p id="progress_info"><font color="red"><strong>' + wait_label + '.</strong></font></p>');
+                return false;
+            }
+            else{
+                return true;
+            }
         }
         else{
             //alert("2. " + $('#id_content-media_input_type').val());
@@ -461,26 +502,38 @@
         file_upload_limit : "1",
         file_queue_limit : "1",
         
+        upload_error_handler : uploadError,
+        upload_start_handler : function(file) {
+            try {
+                if($('#upload_progress_info').children().size()>0){
+                    $('#progress_info').remove();
+                }
+                $('#upload_progress_info').append('<p id="progress_info"><a href="javascript:cancelSwfUpload()">' + cancel_label + '.</a></p>');
+            }
+            catch (ex) {
+                //this.debug(ex);
+            }
+        },
         upload_progress_handler : uploadProgress,
-        upload_error_handler : uploadError,
-        //upload_success_handler : uploadSuccess,
         upload_success_handler : function() {
                 try {
                     if($('#upload_progress_info').children().size()>0){
                         $('#progress_info').remove();
                     }
                     $('#upload_progress_info').append('<p id="progress_info">' + success_label + '.</p>');
-                    upload_from_local_done = true;
-                    // Now that the file is uploaded, we submit the form
-                    $('#my_form').submit();
+                    $("#upload_progress_bar > div").css({ 'background': '#90ffa8' });
+                    window.upload_from_local_done = true;
+                    // Now that the file is uploaded, we submit the form if asked
+                    if(window.submit_asked==true){
+                        $('#my_form').submit();
+                    }
                 }
                 catch (ex) {
                     //this.debug(ex);
                 }
             },
-        
         file_queued_handler : displayUploadPath,
-        //file_dialog_complete_handler: function() { this.startUpload(); },
+        file_dialog_complete_handler: function() { this.startUpload(); },
         //upload_complete_handler: function() { this.startUpload(); },
     });
 }
@@ -504,18 +557,10 @@
         //this.debug(ex);
     }
 }
-function uploadSuccess(success_label) {
-    try {
-        if($('#upload_progress_info').children().size()>0){
-            $('#progress_info').remove();
-        }
-        $('#upload_progress_info').append('<p id="progress_info">' + success_label + '.</p>');
-        upload_from_local_done = true;
-        // Now that the file is uploaded, we submit the form
-        $('#my_form').submit();
-    }
-    catch (ex) {
-        //this.debug(ex);
+function cancelSwfUpload(){
+    swfupload.cancelUpload();
+    if($('#media_field_upload').has($('#cancelupload')).length==0){
+        $('#cancelupload').remove();
     }
 }
 function uploadError(file, errorCode, message) {
--- a/src/ldt/ldt/settings.py	Fri May 06 02:10:25 2011 +0200
+++ b/src/ldt/ldt/settings.py	Mon May 09 18:57:23 2011 +0200
@@ -72,5 +72,5 @@
 LDT_MAX_SEARCH_NUMBER = 50
 LDT_JSON_DEFAULT_INDENT = 2
 
+AUTO_INDEX_AFTER_SAVE = getattr(settings, 'AUTO_INDEX_AFTER_SAVE', True)
 
-
--- a/src/ldt/ldt/utils/context_processors.py	Fri May 06 02:10:25 2011 +0200
+++ b/src/ldt/ldt/utils/context_processors.py	Mon May 09 18:57:23 2011 +0200
@@ -3,7 +3,7 @@
 
 
 def ldtcontext(request):
-    return {'BASE_URL': settings.BASE_URL, 'MEDIA_URL': settings.MEDIA_URL, 'TC1': 'TC1', \
+    return {'BASE_URL': settings.BASE_URL, 'MEDIA_URL': settings.MEDIA_URL, \
             'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'WEB_URL': settings.WEB_URL, \
              'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX, 'VERSION': ldt.get_version() }
 
--- a/web/ldtplatform/config.py.tmpl	Fri May 06 02:10:25 2011 +0200
+++ b/web/ldtplatform/config.py.tmpl	Mon May 09 18:57:23 2011 +0200
@@ -71,3 +71,6 @@
 LDT_JSON_DEFAULT_INDENT = 0
 
 EMPTY_MEDIA_EXTERNALID = None
+
+AUTO_INDEX_AFTER_SAVE = True
+
--- a/web/ldtplatform/settings.py	Fri May 06 02:10:25 2011 +0200
+++ b/web/ldtplatform/settings.py	Mon May 09 18:57:23 2011 +0200
@@ -177,6 +177,8 @@
 SOCIAL_AUTH_COMPLETE_URL_NAME  = 'complete'
 SOCIAL_AUTH_ASSOCIATE_URL_NAME = 'associate_complete'
 
+AUTO_INDEX_AFTER_SAVE = True
+
 from config import *
 
 if not "LOGIN_URL" in locals():
--- a/web/static/ldt/js/projectscontents.js	Fri May 06 02:10:25 2011 +0200
+++ b/web/static/ldt/js/projectscontents.js	Mon May 09 18:57:23 2011 +0200
@@ -84,6 +84,30 @@
 	};
 }
 
+function testCreateAndClose(nm, close_fn) {
+	
+	return function(force) {
+	    // We get the frames vars
+        f = window.frames[0];
+        form_status =  $('#content_form_status',$.nmTop().store.iframe.contents()).val();
+	    // If form_status is "saved", we don't have to test anything, the form was was normally submitted.
+        // If was status is "empty" AND an upload from local was done
+        if(form_status!="saved" && f.upload_from_local_done==true && f.remove_temp_file_url){
+            // ERASE FILE
+            //alert("testCreateAndClose : " + "f = " + f + ", status = " + form_status + ", u = " + f.upload_from_local_done + ", s = " + f.submit_asked + ", url = " + f.remove_temp_file_url);
+            $.ajax({
+                type: "GET",
+                url: f.remove_temp_file_url,
+                data: "filename="+ $('#id_media-local_file_name',$.nmTop().store.iframe.contents()).val(),
+                cache: false,
+                success: function(data, status, request){
+                    //alert("remove success");
+                }
+            });
+        }
+        close_fn.apply(this);
+	};
+}
 
 function searchCallback(target, container_selector, url, timeout) {
 
@@ -156,6 +180,12 @@
             }
         }
     });
+    $('.content_link_create',base_node).each(function(i, e) {
+        nm = $(e).data('nmObj');
+        $(e).data('nmObj', $.extend(true, nm, {
+            close: testCreateAndClose(nm, nm.close)
+        }));
+    });  
     
     $('.contenttitlelink').each(function(i){
         $(this).attr("target","_blank");
@@ -259,7 +289,7 @@
             },
             afterClose: function(nm) {
                 searchCallback($('#searchprojectsinput'), "#projectslistcontainer", searchprojectfilterurl, 0);
-            }    
+            }
         }        
     });
     $('.ldt_link_create',base_node).each(function(i, e) {
@@ -403,9 +433,11 @@
 //
 // Functions used in the create content view.
 //
-function onCreateContentReady(url_upload, media_prefix, post_added_params, btn_label, success_label) {
+function onCreateContentReady(url_upload, media_prefix, post_added_params, btn_label, success_label, wait_label, cancel_label, remove_url) {
 	
-    var upload_from_local_done = false;
+    window.upload_from_local_done = false;
+    window.submit_asked = false;
+    window.remove_temp_file_url = remove_url;
     
     $("#close_button").click(function (e) {
         e.preventDefault();
@@ -425,10 +457,19 @@
     
     // We disable the default submit
     $('#my_form').submit(function() {
-        if($('#id_content-media_input_type').val()=="upload" && upload_from_local_done==false){
-            //alert("1. " + $('#id_content-media_input_type').val() + ", upload_done = " + upload_from_local_done);
-            startLocalUpload();
-            return false;
+        window.submit_asked = true;
+        if($('#id_content-media_input_type').val()=="upload"){
+            if(window.upload_from_local_done==false){
+                // The form has sent but the uploading has not ended.
+                if($('#upload_progress_info').children().size()>0){
+                    $('#progress_info').remove();
+                }
+                $('#upload_progress_info').append('<p id="progress_info"><font color="red"><strong>' + wait_label + '.</strong></font></p>');
+                return false;
+            }
+            else{
+                return true;
+            }
         }
         else{
             //alert("2. " + $('#id_content-media_input_type').val());
@@ -461,25 +502,38 @@
         file_upload_limit : "1",
         file_queue_limit : "1",
         
+        upload_error_handler : uploadError,
+        upload_start_handler : function(file) {
+            try {
+                if($('#upload_progress_info').children().size()>0){
+                    $('#progress_info').remove();
+                }
+                $('#upload_progress_info').append('<p id="progress_info"><a href="javascript:cancelSwfUpload()">' + cancel_label + '.</a></p>');
+            }
+            catch (ex) {
+                //this.debug(ex);
+            }
+        },
         upload_progress_handler : uploadProgress,
-        upload_error_handler : uploadError,
         upload_success_handler : function() {
                 try {
                     if($('#upload_progress_info').children().size()>0){
                         $('#progress_info').remove();
                     }
                     $('#upload_progress_info').append('<p id="progress_info">' + success_label + '.</p>');
-                    upload_from_local_done = true;
-                    // Now that the file is uploaded, we submit the form
-                    $('#my_form').submit();
+                    $("#upload_progress_bar > div").css({ 'background': '#90ffa8' });
+                    window.upload_from_local_done = true;
+                    // Now that the file is uploaded, we submit the form if asked
+                    if(window.submit_asked==true){
+                        $('#my_form').submit();
+                    }
                 }
                 catch (ex) {
                     //this.debug(ex);
                 }
             },
-        
         file_queued_handler : displayUploadPath,
-        //file_dialog_complete_handler: function() { this.startUpload(); },
+        file_dialog_complete_handler: function() { this.startUpload(); },
         //upload_complete_handler: function() { this.startUpload(); },
     });
 }
@@ -503,18 +557,10 @@
         //this.debug(ex);
     }
 }
-function uploadSuccess(success_label) {
-    try {
-        if($('#upload_progress_info').children().size()>0){
-            $('#progress_info').remove();
-        }
-        $('#upload_progress_info').append('<p id="progress_info">' + success_label + '.</p>');
-        upload_from_local_done = true;
-        // Now that the file is uploaded, we submit the form
-        $('#my_form').submit();
-    }
-    catch (ex) {
-        //this.debug(ex);
+function cancelSwfUpload(){
+    swfupload.cancelUpload();
+    if($('#media_field_upload').has($('#cancelupload')).length==0){
+        $('#cancelupload').remove();
     }
 }
 function uploadError(file, errorCode, message) {