# HG changeset patch # User rougeronj # Date 1352210331 -3600 # Node ID 94ad1a394732036db9307f2060651c3d8415d45e # Parent 2416fb719b87327019483de76444493ceb4482bc update of error management in the creation of content diff -r 2416fb719b87 -r 94ad1a394732 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):