src/iconolab_episteme/management/commands/importcollection.py
changeset 1 3b0a8a6e685e
parent 0 df27f9610c82
child 2 d3fe1866eb5b
equal deleted inserted replaced
0:df27f9610c82 1:3b0a8a6e685e
     1 # -*- coding: UTF-8 -*-
       
     2 import json
       
     3 import logging
       
     4 import os
       
     5 import pprint
       
     6 import re
       
     7 import shutil
       
     8 import imghdr
       
     9 
       
    10 from django.conf import settings
       
    11 from django.core.management.base import BaseCommand, CommandError
       
    12 from PIL import Image as ImagePIL
       
    13 from sorl.thumbnail import get_thumbnail
       
    14 
       
    15 from iconolab.management.commands.importimages import BaseImportImagesCommand
       
    16 from iconolab.models import (Collection, Folder, Image, ImageStats, Item,
       
    17                              ItemMetadata, MetaCategory)
       
    18 
       
    19 if settings.IMPORT_LOGGER_NAME and settings.LOGGING['loggers'].get(settings.IMPORT_LOGGER_NAME, ''):
       
    20     logger = logging.getLogger(settings.IMPORT_LOGGER_NAME)
       
    21 else:
       
    22     logger = logging.getLogger(__name__)
       
    23 
       
    24 class Command(BaseImportImagesCommand):
       
    25     help = 'import collection image and file from a directory'
       
    26 
       
    27     def add_arguments(self, parser):
       
    28         parser.add_argument('source_dir')
       
    29         parser.add_argument(
       
    30             '--encoding',
       
    31             dest='encoding',
       
    32             default='utf-8',
       
    33             help='JSON file encoding'
       
    34 
       
    35         )
       
    36         parser.add_argument(
       
    37             '--collection-json',
       
    38             dest='collection_json',
       
    39             default=False,
       
    40             help='creates a new collection from a json file, must be an object with fields : '+ 
       
    41                  '"name" (identifier), '+ 
       
    42                  '"verbose_name" (proper title name), '+ 
       
    43                  '"description" (description on homepage, html is supported), '+ 
       
    44                  '"image" (image on homepages, must be "uploads/<imgname>"), '+ 
       
    45                  '"height" and "width" (height and width of the image)',
       
    46         )
       
    47         parser.add_argument(
       
    48             '--collection-id',
       
    49             dest='collection_id',
       
    50             default=False,
       
    51             help='insert extracted data into the specified collection instead of trying to load a collection fixture',
       
    52         )
       
    53         parser.add_argument(
       
    54             '--no-jpg-conversion',
       
    55             dest='no-jpg-conversion',
       
    56             default=False,
       
    57             help='use this option if you only want the image copied and not converted'
       
    58         )
       
    59 
       
    60     def handle(self, *args, **options):
       
    61             
       
    62         print('# Logging with logger '+logger.name)
       
    63         logger.debug('# Initializing command with args: %r', options)
       
    64 
       
    65         '''Check we have a collection to store data into'''
       
    66         self.source_dir = options.get('source_dir')
       
    67         print('# Checking collection args')
       
    68         if options.get('collection_json'):
       
    69             print('## Finding collection json data in '+self.source_dir)
       
    70             collection_json_path = os.path.join(
       
    71                 self.source_dir, options.get('collection_json'))
       
    72             if not os.path.isfile(collection_json_path):
       
    73                 print('### No '+options.get('collection_json') +
       
    74                         '.json file was found in the source directory')
       
    75                 raise ValueError(
       
    76                     '!!! Json file '+collection_json_path+' was not found !!!')
       
    77             try:
       
    78                 with open(collection_json_path) as json_fixture_file:
       
    79                     collection_data = json.loads(json_fixture_file.read())
       
    80                     for key in ['name', 'verbose_name', 'description', 'image', 'height', 'width']:
       
    81                         if not key in collection_data.keys():
       
    82                             print('!!! Json file '+collection_json_path +
       
    83                                     ' has no '+key+' field !!!')
       
    84                             raise ValueError()
       
    85                     if not collection_data.get('name', ''):
       
    86                         print('!!! Collection data key "name" is empty')
       
    87                         raise ValueError()
       
    88                     if Collection.objects.filter(name=collection_data.get('name')).exists():
       
    89                         print(
       
    90                             '!!! A Collection with the provided name already exists!')
       
    91                         raise ValueError()
       
    92                     if collection_data.get('image', '') and not (collection_data.get('width', 0) and collection_data.get('height', 0)):
       
    93                         print(
       
    94                             '!!! Collection data has an image but no height and width')
       
    95                         raise ValueError()
       
    96             except ValueError as e:
       
    97                 raise ValueError('!!! JSON Data is invalid. !!!')
       
    98         elif options.get('collection_id'):
       
    99             print('## Finding collection with id ' + 
       
   100                     options.get('collection_id'))
       
   101             try:
       
   102                 collection = Collection.objects.get(
       
   103                     pk=options.get('collection_id'))
       
   104             except Collection.DoesNotExist:
       
   105                 raise ValueError('!!! Collection with primary key ' +
       
   106                                     options.get('collection_id')+' was not found, aborting !!!')
       
   107         else:
       
   108             raise ValueError(
       
   109                 '!!! No collection fixture or collection id, aborting because we can\'t properly generate data. !!!')
       
   110 
       
   111 
       
   112         '''Import image collection in target directory'''
       
   113            
       
   114         if options.get('collection_json'):
       
   115             print('## Loading collection json')
       
   116             collection = Collection.objects.create(
       
   117                 name=collection_data.get('name'),
       
   118                 verbose_name=collection_data.get('verbose_name', ''),
       
   119                 description=collection_data.get('description', ''),
       
   120                 image=collection_data.get('image', ''),
       
   121                 height=collection_data.get('height', 0),
       
   122                 width=collection_data.get('width', 0),
       
   123             )
       
   124 
       
   125             if collection.image:
       
   126                 collection_image_path = os.path.join(
       
   127                     settings.MEDIA_ROOT, str(collection.image))
       
   128                 if not os.path.isfile(collection_image_path):
       
   129                     print('### Moving collection image')
       
   130                     _, collection_image_name = os.path.split(
       
   131                         collection_image_path)
       
   132                     try:
       
   133                         col_im = ImagePIL.open(os.path.join(
       
   134                             self.source_dir, collection_image_name))
       
   135                         print('##### Generating or copying jpeg for ' +
       
   136                                 collection_image_name)
       
   137                         col_im.thumbnail(col_im.size)
       
   138                         col_im.save(collection_image_path, 'JPEG', quality=options.get(
       
   139                             'jpeg_quality', settings.IMG_JPG_DEFAULT_QUALITY))
       
   140                     except Exception as e:
       
   141                         print(e)
       
   142 
       
   143