update of error management in the creation of content
authorrougeronj
Tue, 06 Nov 2012 14:58:51 +0100
changeset 898 94ad1a394732
parent 897 2416fb719b87
child 899 2f1fa9b1aa58
update of error management in the creation of content
src/ldt/ldt/ldt_utils/views/content.py
--- a/src/ldt/ldt/ldt_utils/views/content.py	Tue Nov 06 14:56:18 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/views/content.py	Tue Nov 06 14:58:51 2012 +0100
@@ -31,9 +31,12 @@
 import django.utils.simplejson as simplejson
 import urlparse  
 import tempfile
+import traceback
+import sys
 
 @transaction.commit_manually
-def write_content_base(request, iri_id=None): 
+def write_content_base(request, iri_id=None):
+    logging.debug("coucou entre")
     if iri_id:
         instance_content = Content.safe_objects.get(iri_id=iri_id) #@UndefinedVariable
         instance_media = instance_content.media_obj
@@ -47,240 +50,249 @@
         current_front_project = instance_content.front_project
     form_status = 'none'
     errors_transaction = []
-    transaction_succeed = True
     
     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):
-            return dict([('%s-%s' % (prefix, key), value) for key,value in _dict.items()])
-        
-        content_instance_val = add_prefix(content_instance_val, "content")
-        media_instance_val= 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
+        logging.debug("coucou entre POST")
+        try:
+            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):
+                return dict([('%s-%s' % (prefix, key), value) for key,value in _dict.items()])
             
-        content_instance_val['read_list'] = request.POST.getlist('read_list')
-        content_instance_val['write_list'] = request.POST.getlist('write_list')
-        content_instance_val['share'] = request.POST.get('share', True)
-        
-        content_form = ContentForm(content_instance_val, prefix="content", instance=instance_content)
-        media_form = MediaForm(media_instance_val, request.FILES, prefix="media", instance=instance_media)
-        picture_form = PictureForm(None, request.POST, request.FILES)
-   
-        if request.user.is_staff:
-            content_form.fields['front_project'].queryset = Project.objects.filter(contents__in=[instance_content])
-        
-        media_valid = media_form.is_valid()
-        content_valid = content_form.is_valid()
-        picture_valid = picture_form.is_valid()
-        if 'image' in request.POST.keys():
-            image_link = request.POST.get('url_image')
-            if picture_valid and image_link!='' :
-                try :
-                    r = requests.get(image_link)
-                    img_temp = tempfile.NamedTemporaryFile(suffix='.png')
-                    if img_temp:
-                        img_temp.write(r.content)
-                        img_temp.flush()
-                        picture_form.cleaned_data["image"]=File(img_temp) 
-                except Exception as inst:
-                    logging.debug("couldn't download video thumbnail from image_link : "+str(image_link))
-        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) + "picture : valid :" +str(picture_valid)) #@UndefinedVariable
-        
-        if media_valid and content_valid and picture_valid:
-
-            # see if media must be created
-            cleaned_data = {}
-            cleaned_data.update(media_form.cleaned_data)
-            cleaned_data.pop("media_public")
+            content_instance_val = add_prefix(content_instance_val, "content")
+            media_instance_val= 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_instance_val['read_list'] = request.POST.getlist('read_list')
+            content_instance_val['write_list'] = request.POST.getlist('write_list')
+            content_instance_val['share'] = request.POST.get('share', True)
             
-            media_input_type = content_form.cleaned_data["media_input_type"]
+            content_form = ContentForm(content_instance_val, prefix="content", instance=instance_content)
+            media_form = MediaForm(media_instance_val, request.FILES, prefix="media", instance=instance_media)
+            picture_form = PictureForm(None, request.POST, request.FILES)
+       
+            if request.user.is_staff:
+                content_form.fields['front_project'].queryset = Project.objects.filter(contents__in=[instance_content])
+            
+            media_valid = media_form.is_valid()
+            content_valid = content_form.is_valid()
+            picture_valid = picture_form.is_valid()
+            if 'image' in request.POST.keys():
+                image_link = request.POST.get('url_image')
+                if picture_valid and image_link!='' :
+                    try :
+                        r = requests.get(image_link)
+                        img_temp = tempfile.NamedTemporaryFile(suffix='.png')
+                        if img_temp:
+                            img_temp.write(r.content)
+                            img_temp.flush()
+                            picture_form.cleaned_data["image"]=File(img_temp) 
+                    except Exception as inst:
+                        logging.debug("couldn't download video thumbnail from image_link : " + str(image_link))
+            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) + "picture : valid :" +str(picture_valid)) #@UndefinedVariable
             
-            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'] = ''
-                try:
-                    media, created = Media.objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) #@UndefinedVariable
-                except:
-                    transaction_succeed = False
-            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)
+            if media_valid and content_valid and picture_valid:
+    
+                # see if media must be created
+                cleaned_data = {}
+                cleaned_data.update(media_form.cleaned_data)
+                cleaned_data.pop("media_public")
+                
+                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'] = ''
+                        
+                        try:
+                            media, created = Media.objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) #@UndefinedVariable
+                        except Exception, e:
+                            raise e
+                
+                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))
                         
-                    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()
                     
                     
-                    src_prefix = settings.STREAM_SRC_PREFIX.rstrip("/")
-                    if len(src_prefix) > 0:
-                        cleaned_data["src"] = src_prefix + "/" + base_source_filename
+                    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.safe_objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) #@UndefinedVariable
+                            cached_assign('view_media', request.user, media)
+                        except Exception, e:
+                            raise e
                     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()
-                
+                        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', 'front_project'):
+                        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
+                    cached_assign('view_media', request.user, media)
+                    cached_assign('change_media', request.user, media)
+                    media.save()
                 
-                if form_status != "error":
+                if form_status != "error": 
+                    content_defaults = {}
+                    content_defaults.update(content_form.cleaned_data)
+                    content_defaults['media_obj'] = media
+                                   
+                    for key in ["media_input_type", "groups", "is_public", "read_list", "write_list", "share" ]:
+                        del content_defaults[key]
                     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.safe_objects.get_or_create(src=cleaned_data['src'], defaults=cleaned_data) #@UndefinedVariable
-                        cached_assign('view_media', request.user, media)
-                    except:
-                        transaction_succeed = False
-                else:
-                    media = None
+                        content, created = Content.safe_objects.get_or_create(iri_id=content_form.cleaned_data['iri_id'], defaults=content_defaults) #@UndefinedVariable
+                    except Exception, e:
+                        raise e
+                                      
+                    if not created and not request.user.has_perm('ldt_utils.change_content', content):
+                        raise AttributeError("%s is not allowed to change content %s" % (request.user, content))
+                    
+                    cached_assign('change_content', request.user, content)
+                    cached_assign('view_content', request.user, content)
+                    everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
+                    
+                    if media_form.cleaned_data['media_public']:
+                        cached_assign('view_content', everyone, content)
+                        if media:
+                            cached_assign('view_media', everyone, media)
+                    else:
+                        remove_perm('ldt_utils.view_media', everyone, media)
+                        assign_perm_to_obj(content, content_form.cleaned_data['read_list'], content_form.cleaned_data['write_list'], request.user)
+                        if media:
+                            assign_perm_to_obj(media, content_form.cleaned_data['read_list'], content_form.cleaned_data['write_list'], request.user)
+                        if content_form.cleaned_data['is_public']:
+                            cached_assign('view_content', everyone, content)
+                        else:
+                            remove_perm('ldt_utils.view_content', everyone, content)
                     
-
-            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', 'front_project'):
-                    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
-                cached_assign('view_media', request.user, media)
-                cached_assign('change_media', request.user, media)
-                media.save()
+                    if not created:
+                        for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media_obj'):
+                            setattr(content, attribute, content_defaults[attribute])
+                            
+                        if request.user.is_staff and content_defaults.has_key('front_project'):
+                            content.front_project = content_defaults['front_project']
+                    
+                    try:
+                        content.save()
+                        picture_form.model = content
+                        picture_form.save()  
+                        form_status = 'saved'
+                        media_form = MediaForm(instance=media, prefix="media")
+                        content_form = ContentForm(instance=content, prefix="content")
+                        picture_form = PictureForm()
+                    except Exception, e:
+                        raise e
+            else:
+                form_status = 'error'
+        except Exception, e:
+            transaction.rollback()
+            type, value, tb = sys.exc_info()
+            errors_transaction.append(e)
+            errors_transaction.append(traceback.format_tb(tb))
+            return False, False, False, False, False, errors_transaction
             
-            if form_status != "error": 
-                content_defaults = {}
-                content_defaults.update(content_form.cleaned_data)
-                content_defaults['media_obj'] = media
-                               
-                for key in ["media_input_type", "groups", "is_public", "read_list", "write_list", "share" ]:
-                    del content_defaults[key]
-                
-                try:   
-                    content, created = Content.safe_objects.get_or_create(iri_id=content_form.cleaned_data['iri_id'], defaults=content_defaults) #@UndefinedVariable
-                except:
-                    transaction_succeed = False
-                    
-                if not created and not request.user.has_perm('ldt_utils.change_content', content):
-                    raise AttributeError("%s is not allowed to change content %s" % (request.user, content))
-                
-                cached_assign('change_content', request.user, content)
-                cached_assign('view_content', request.user, content)
-                everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
-                
-                if media_form.cleaned_data['media_public']:
-                    cached_assign('view_content', everyone, content)
-                    if media:
-                        cached_assign('view_media', everyone, media)
-                else:
-                    remove_perm('ldt_utils.view_media', everyone, media)
-                    assign_perm_to_obj(content, content_form.cleaned_data['read_list'], content_form.cleaned_data['write_list'], request.user)
-                    if media:
-                        assign_perm_to_obj(media, content_form.cleaned_data['read_list'], content_form.cleaned_data['write_list'], request.user)
-                    if content_form.cleaned_data['is_public']:
-                        cached_assign('view_content', everyone, content)
-                    else:
-                        remove_perm('ldt_utils.view_content', everyone, content)
-                
-                if not created:
-                    for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media_obj'):
-                        setattr(content, attribute, content_defaults[attribute])
-                        
-                    if request.user.is_staff and content_defaults.has_key('front_project'):
-                        content.front_project = content_defaults['front_project']
-                
-                try:
-                    content.save()
-                    picture_form.model = content
-                    picture_form.save()  
-                    form_status = 'saved'
-                    media_form = MediaForm(instance=media, prefix="media")
-                    content_form = ContentForm(instance=content, prefix="content")
-                    picture_form = PictureForm()
-                except:
-                    transaction_succeed = False
-        else:
-            form_status = 'error'
     else:
+        logging.debug("coucou entree non Post")
         form_status = 'empty'
         initial_c = { 'media_input_type':"link"}
         initial_m = {}
@@ -302,19 +314,13 @@
             if request.user.is_staff:
                 content_form.fields['front_project'].queryset = Project.objects.filter(contents__in=[instance_content])
     
-    if transaction_succeed:
-        #Try to make sure the commit succeeded or not.
-        try:
-            transaction.commit()
-        except:
-            transaction.rollback()
-            errors_transaction.append(_("Commit of the content creation failed"))
-            return False, False, False, False, False, errors_transaction
-    else:
+    try:
+        transaction.commit()
+    except Exception, e:
         transaction.rollback()
-        errors_transaction.append(_("Content creation failure"))
+        errors_transaction.append(e)
         return False, False, False, False, False, errors_transaction
-    
+        
     return content_form, media_form, picture_form, form_status, current_front_project, errors_transaction
 
 @login_required
@@ -447,10 +453,11 @@
             content.delete()
             if project is not None:
                 Project.safe_objects.get(ldt_id= project.ldt_id).delete()
-        except:
+        except Exception, e:
             content.rollback()
             transaction.rollback()
             errors_transaction.append(_("Content deletion failure"))
+            errors_transaction.append(e)
             return False, errors_transaction
         else:
             try:
@@ -458,9 +465,10 @@
                 content.commit()
                 return True, errors_transaction
             except:
+                content.rollback()
                 transaction.rollback()
-                content.rollback()
                 errors_transaction.append(_("Commit of the content deletion failed"))
+                errors_transaction.append(e)
                 return False, errors_transaction
 
 def upload(request):