diff -r 000000000000 -r df27f9610c82 src/iconolab_episteme/management/commands/importcollection.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/iconolab_episteme/management/commands/importcollection.py Tue Jun 26 15:55:08 2018 +0200 @@ -0,0 +1,143 @@ +# -*- coding: UTF-8 -*- +import json +import logging +import os +import pprint +import re +import shutil +import imghdr + +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError +from PIL import Image as ImagePIL +from sorl.thumbnail import get_thumbnail + +from iconolab.management.commands.importimages import BaseImportImagesCommand +from iconolab.models import (Collection, Folder, Image, ImageStats, Item, + ItemMetadata, MetaCategory) + +if settings.IMPORT_LOGGER_NAME and settings.LOGGING['loggers'].get(settings.IMPORT_LOGGER_NAME, ''): + logger = logging.getLogger(settings.IMPORT_LOGGER_NAME) +else: + logger = logging.getLogger(__name__) + +class Command(BaseImportImagesCommand): + help = 'import collection image and file from a directory' + + def add_arguments(self, parser): + parser.add_argument('source_dir') + parser.add_argument( + '--encoding', + dest='encoding', + default='utf-8', + help='JSON file encoding' + + ) + parser.add_argument( + '--collection-json', + dest='collection_json', + default=False, + help='creates a new collection from a json file, must be an object with fields : '+ + '"name" (identifier), '+ + '"verbose_name" (proper title name), '+ + '"description" (description on homepage, html is supported), '+ + '"image" (image on homepages, must be "uploads/"), '+ + '"height" and "width" (height and width of the image)', + ) + parser.add_argument( + '--collection-id', + dest='collection_id', + default=False, + help='insert extracted data into the specified collection instead of trying to load a collection fixture', + ) + parser.add_argument( + '--no-jpg-conversion', + dest='no-jpg-conversion', + default=False, + help='use this option if you only want the image copied and not converted' + ) + + def handle(self, *args, **options): + + print('# Logging with logger '+logger.name) + logger.debug('# Initializing command with args: %r', options) + + '''Check we have a collection to store data into''' + self.source_dir = options.get('source_dir') + print('# Checking collection args') + if options.get('collection_json'): + print('## Finding collection json data in '+self.source_dir) + collection_json_path = os.path.join( + self.source_dir, options.get('collection_json')) + if not os.path.isfile(collection_json_path): + print('### No '+options.get('collection_json') + + '.json file was found in the source directory') + raise ValueError( + '!!! Json file '+collection_json_path+' was not found !!!') + try: + with open(collection_json_path) as json_fixture_file: + collection_data = json.loads(json_fixture_file.read()) + for key in ['name', 'verbose_name', 'description', 'image', 'height', 'width']: + if not key in collection_data.keys(): + print('!!! Json file '+collection_json_path + + ' has no '+key+' field !!!') + raise ValueError() + if not collection_data.get('name', ''): + print('!!! Collection data key "name" is empty') + raise ValueError() + if Collection.objects.filter(name=collection_data.get('name')).exists(): + print( + '!!! A Collection with the provided name already exists!') + raise ValueError() + if collection_data.get('image', '') and not (collection_data.get('width', 0) and collection_data.get('height', 0)): + print( + '!!! Collection data has an image but no height and width') + raise ValueError() + except ValueError as e: + raise ValueError('!!! JSON Data is invalid. !!!') + elif options.get('collection_id'): + print('## Finding collection with id ' + + options.get('collection_id')) + try: + collection = Collection.objects.get( + pk=options.get('collection_id')) + except Collection.DoesNotExist: + raise ValueError('!!! Collection with primary key ' + + options.get('collection_id')+' was not found, aborting !!!') + else: + raise ValueError( + '!!! No collection fixture or collection id, aborting because we can\'t properly generate data. !!!') + + + '''Import image collection in target directory''' + + if options.get('collection_json'): + print('## Loading collection json') + collection = Collection.objects.create( + name=collection_data.get('name'), + verbose_name=collection_data.get('verbose_name', ''), + description=collection_data.get('description', ''), + image=collection_data.get('image', ''), + height=collection_data.get('height', 0), + width=collection_data.get('width', 0), + ) + + if collection.image: + collection_image_path = os.path.join( + settings.MEDIA_ROOT, str(collection.image)) + if not os.path.isfile(collection_image_path): + print('### Moving collection image') + _, collection_image_name = os.path.split( + collection_image_path) + try: + col_im = ImagePIL.open(os.path.join( + self.source_dir, collection_image_name)) + print('##### Generating or copying jpeg for ' + + collection_image_name) + col_im.thumbnail(col_im.size) + col_im.save(collection_image_path, 'JPEG', quality=options.get( + 'jpeg_quality', settings.IMG_JPG_DEFAULT_QUALITY)) + except Exception as e: + print(e) + +