src/iconolab_episteme/management/commands/importimages.py
author ymh <ymh.work@gmail.com>
Thu, 02 Aug 2018 16:24:30 +0200
changeset 35 7fa549d6fc45
parent 30 7b479c7b6861
permissions -rw-r--r--
Added tag 0.3.6 for changeset 7aa2d3d62723
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     1
# -*- coding: UTF-8 -*-
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     2
import json
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     3
import logging
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     4
import os
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     5
import imghdr
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     6
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     7
from django.conf import settings
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     8
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
     9
from iconolab.management.commands.importimages import BaseImportImagesCommand
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    10
from iconolab.models import (Collection, ItemMetadata)
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    11
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    12
if settings.IMPORT_LOGGER_NAME and settings.LOGGING['loggers'].get(settings.IMPORT_LOGGER_NAME, ''):
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    13
    logger = logging.getLogger(settings.IMPORT_LOGGER_NAME)
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    14
else:
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    15
    logger = logging.getLogger(__name__)
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    16
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    17
class Command(BaseImportImagesCommand):
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    18
    help = 'import images from a directory into the media folder and creates item and image objects'
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    19
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    20
    def add_arguments(self, parser):
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    21
        parser.add_argument('source_dir')
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    22
        parser.add_argument(
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    23
            '--collection-name',
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    24
            dest='collection_name',
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    25
            default=False,
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    26
            help='insert extracted data into the specified collection'
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    27
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    28
        )
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    29
        parser.add_argument(
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    30
            '--no-jpg-conversion',
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    31
            dest='no-jpg-conversion',
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    32
            default=False,
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    33
            help='use this option if you only want the image copied and not converted'
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    34
        )
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    35
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    36
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    37
    def handle(self, *args, **options):
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    38
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    39
        print('# Logging with logger '+logger.name)
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    40
        logger.debug('# Initializing command with args: %r', options)
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    41
      
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    42
        self.source_dir = options.get('source_dir')
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    43
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    44
        collection_name = options.get('collection_name')
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    45
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    46
        if collection_name:
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    47
            print('## Finding collection with id ' + 
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    48
                  collection_name)
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    49
            try:
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    50
                collection = Collection.objects.get(
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    51
                    name=collection_name)
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    52
            except Collection.DoesNotExist:
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    53
                raise ValueError('!!! Collection with primary key ' +
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    54
                                 collection_name +' was not found, aborting !!!')
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    55
        else:
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    56
            raise ValueError(
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    57
                '!!! No collection fixture or collection id, aborting because we can\'t properly generate data. !!!')
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    58
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    59
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    60
        '''Listing image files in target directory'''
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    61
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    62
        print(
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    63
            '## Converting image and moving it to static dir, creating Image and Item objects')
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    64
        print('### Images will be stored in ' + os.path.join(settings.MEDIA_ROOT, 'uploads'))
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    65
30
7b479c7b6861 change the way images collection files are imported and named. upgrade iconolab dependency and increment version nb
ymh <ymh.work@gmail.com>
parents: 28
diff changeset
    66
        for dirname, _, files in os.walk(self.source_dir):
19
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    67
            for filename in files:
30
7b479c7b6861 change the way images collection files are imported and named. upgrade iconolab dependency and increment version nb
ymh <ymh.work@gmail.com>
parents: 28
diff changeset
    68
                filename_without_extension, _ = os.path.splitext(filename)
19
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    69
                if imghdr.what(os.path.join(dirname, filename)) is None:
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    70
                    continue
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    71
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    72
                json_path = os.path.join(dirname, filename_without_extension + ".json")
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    73
                if not os.path.isfile(json_path):
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    74
                    continue
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    75
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    76
                with open(json_path) as json_data:
30
7b479c7b6861 change the way images collection files are imported and named. upgrade iconolab dependency and increment version nb
ymh <ymh.work@gmail.com>
parents: 28
diff changeset
    77
                    item_data = json.load(json_data)
7b479c7b6861 change the way images collection files are imported and named. upgrade iconolab dependency and increment version nb
ymh <ymh.work@gmail.com>
parents: 28
diff changeset
    78
                    item_image = item_data['image']
19
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    79
                
28
15f63c5dfe3f Correct path for source image in path, take the real one, not the expected one. increase version nb
ymh <ymh.work@gmail.com>
parents: 19
diff changeset
    80
                    path_images = os.path.join(dirname, filename)
19
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    81
                    image_list = [path_images]
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    82
30
7b479c7b6861 change the way images collection files are imported and named. upgrade iconolab dependency and increment version nb
ymh <ymh.work@gmail.com>
parents: 28
diff changeset
    83
                    natural_key = ItemMetadata.get_natural_key(collection, item_image['id'])
19
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    84
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    85
                    if ItemMetadata.objects.filter(
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    86
                            item__collection=collection, natural_key=natural_key).exists():
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    87
                        print('#### An item with ' +
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    88
                              natural_key +' for natural key, already exists in database in the import collection')
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    89
                    else:
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    90
                        self.create_item_and_metadata(
30
7b479c7b6861 change the way images collection files are imported and named. upgrade iconolab dependency and increment version nb
ymh <ymh.work@gmail.com>
parents: 28
diff changeset
    91
                            natural_key, collection, item_data, image_list, options)
19
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    92
e46a1986a2f0 removing partners images from static folder
Riwad Salim
parents:
diff changeset
    93
        print('# All done!')