better error management in importimages
authorymh <ymh.work@gmail.com>
Thu, 28 Jun 2018 15:14:22 +0200
changeset 557 7301141078de
parent 556 3fd4e04004f6
child 558 0ea81613eaf8
better error management in importimages
src/iconolab/management/commands/importimages.py
--- a/src/iconolab/management/commands/importimages.py	Wed Jun 27 15:50:14 2018 +0200
+++ b/src/iconolab/management/commands/importimages.py	Thu Jun 28 15:14:22 2018 +0200
@@ -4,6 +4,7 @@
 
 from django.conf import settings
 from django.core.management.base import BaseCommand, CommandError
+from django.db import transaction
 from PIL import Image as ImagePIL
 from sorl.thumbnail import get_thumbnail
 
@@ -29,66 +30,51 @@
         if not os.path.isdir(target_dir):
             raise CommandError("Image target dir does not exists : %s" % target_dir)
 
-        print('#### Creating item '+natural_key+' (natural key) in database')
-        item_object = Item.objects.create(
-            collection=collection
-        )
+        # TODO: Make it fully transactional. if there is a problem on the image creation, some data files can parsists.
+        with transaction.atomic():
+            print('#### Creating item '+natural_key+' (natural key) in database')
+            item_object = Item.objects.create(
+                collection=collection
+            )
 
-        ItemMetadata.objects.create(
-            item=item_object,
-            metadata=json.dumps(metadata_dict),
-            natural_key=natural_key
-        )
+            ItemMetadata.objects.create(
+                item=item_object,
+                metadata=json.dumps(metadata_dict),
+                natural_key=natural_key
+            )
 
-        print('#### Computing item image(s)')
-        for image in image_files:
-            (image_name, ext) = os.path.splitext(image)
-            if options.get('no-jpg-conversion') or ext in settings.NO_IMG_CONVERSION_EXTS:
-                print('##### Copying file '+str(image)+' without converting')
-                image_path = os.path.join(target_dir, image)
-                new_image_name = image
-                shutil.copy(os.path.join(source_dir, image), image_path)
-                try:
-                    im = ImagePIL.open(image_path)
-                    im_width, im_height = im.size
-                except Exception as e:
-                    print(e)
-                    continue
-            else:
-                image_path = os.path.join(target_dir, image_name) + '.jpg'
-                new_image_name = image_name+'.jpg'
-                if os.path.isfile(image_path):
-                    print('##### A jpeg file already exists in target dir for ' + image)
-                    try:
-                        im = ImagePIL.open(image_path)
-                        im_width, im_height = im.size
-                    except Exception as e:
-                        print(e)
-                        continue
+            print('#### Computing item image(s)')
+            for image in image_files:
+                (image_name, ext) = os.path.splitext(image)
+                if options.get('no-jpg-conversion') or ext in settings.NO_IMG_CONVERSION_EXTS:
+                    print('##### Copying file '+str(image)+' without converting')
+                    image_path = os.path.join(target_dir, image)
+                    new_image_name = image
+                    shutil.copy(os.path.join(source_dir, image), image_path)
                 else:
-                    jpeg_img_path = image_path
-                    try:
+                    image_path = os.path.join(target_dir, image_name) + '.jpg'
+                    new_image_name = image_name+'.jpg'
+                    if os.path.isfile(image_path):
+                        print('##### A jpeg file already exists in target dir for ' + image)
+                    else:
+                        jpeg_img_path = image_path
                         im = ImagePIL.open(os.path.join(source_dir, image))
                         print('##### Generating or copying jpeg for '+image)
                         im.thumbnail(im.size)
                         im.save(jpeg_img_path, 'JPEG', quality=options.get(
                             'jpeg_quality', settings.IMG_JPG_DEFAULT_QUALITY))
-                        im_width, im_height = im.size
-                    except Exception as e:
-                        print(e)
-                        continue
-            new_image = Image.objects.create(
-                item=item_object,
-                media='uploads/'+new_image_name,
-                name=new_image_name,
-                height=im_height,
-                width=im_width
-            )
-            ImageStats.objects.create(
-                image=new_image
-            )
-        print('### Generating thumbnails for item '+natural_key)
-        for image in item_object.images.all():
-            for size in settings.PREGENERATE_THUMBNAILS_SIZES:
-                print('#### Thumbnail for size '+size)
-                get_thumbnail(image.media, size, crop=False)
+
+                new_image = Image.objects.create(
+                    item=item_object,
+                    media='uploads/'+new_image_name,
+                    name=new_image_name
+                )
+                ImageStats.objects.create(
+                    image=new_image
+                )
+
+            print('### Generating thumbnails for item '+natural_key)
+            for image in item_object.images.all():
+                for size in settings.PREGENERATE_THUMBNAILS_SIZES:
+                    print('#### Thumbnail for size '+size)
+                    get_thumbnail(image.media, size, crop=False)