src/iconolab_episteme/management/commands/importmetacategories.py
author Riwad Salim
Tue, 26 Jun 2018 15:55:08 +0200
changeset 0 df27f9610c82
permissions -rw-r--r--
Creating iconolab episteme project
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     1
# -*- coding: UTF-8 -*-
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     2
import json
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     3
import logging
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     4
import os
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     5
import pprint
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     6
import re
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     7
import shutil
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     8
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
     9
from django.conf import settings
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    10
from django.core.management.base import BaseCommand, CommandError
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    11
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    12
from iconolab.management.commands.importimages import BaseImportImagesCommand
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    13
from iconolab.models import (Collection, Folder, Image, ImageStats, Item,
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    14
                             ItemMetadata, MetaCategory)
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    15
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    16
if settings.IMPORT_LOGGER_NAME and settings.LOGGING['loggers'].get(settings.IMPORT_LOGGER_NAME, ''):
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    17
    logger = logging.getLogger(settings.IMPORT_LOGGER_NAME)
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    18
else:
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    19
    logger = logging.getLogger(__name__)
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    20
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    21
class Command(BaseImportImagesCommand):
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    22
    help = 'import metacategories files from a directory'
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    23
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    24
    def add_arguments(self, parser):
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    25
        parser.add_argument('source_dir')
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    26
        parser.add_argument(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    27
            '--encoding',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    28
            dest='encoding',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    29
            default='utf-8',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    30
            help='JSON file encoding'
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    31
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    32
        )
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    33
        parser.add_argument(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    34
            '--collection-id',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    35
            dest='collection_id',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    36
            default=False,
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    37
            help='insert extracted data into the specified collection instead of trying to load a collection fixture',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    38
        )
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    39
        parser.add_argument(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    40
            '--metacategories-json',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    41
            dest='metacategories_json',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    42
            default=False,
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    43
            help='add metacategories to the collection from a json file (json must be a list of object with "label" and "triggers_notifications" fields)',
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    44
        )
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    45
    
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    46
    def handle(self, *args, **options):
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    47
        
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    48
        print('# Logging with logger '+logger.name)
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    49
        logger.debug('# Initializing command with args: %r', options)
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    50
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    51
        self.source_dir = options.get('source_dir')
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    52
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    53
        if options.get('collection_id'):
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    54
            print('## Finding collection with id ' + 
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    55
                    options.get('collection_id'))
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    56
            try:
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    57
                collection = Collection.objects.get(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    58
                    pk=options.get('collection_id'))
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    59
            except Collection.DoesNotExist:
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    60
                raise ValueError('!!! Collection with primary key ' +
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    61
                                    options.get('collection_id')+' was not found, aborting !!!')
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    62
        else:
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    63
            raise ValueError(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    64
                '!!! No collection fixture or collection id, aborting because we can\'t properly generate data. !!!')
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    65
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    66
        if options.get('metacategories_json'):
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    67
            print('## Finding metacategories fixture json data in '+self.source_dir)
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    68
        metacategories_json_path = os.path.join(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    69
            self.source_dir, options.get('metacategories_json'))
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    70
        if not os.path.isfile(metacategories_json_path):
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    71
            print('### No '+options.get('metacategories_json')+
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    72
                '.json file was found in the source directory')
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    73
            raise ValueError(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    74
                '!!! Fixture file '+metacategories_json_path+' was not found !!!')
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    75
        with open(metacategories_json_path) as metacategories_json_file:
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    76
            metacategories_data = json.loads(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    77
                metacategories_json_file.read())
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    78
            for metacategory in metacategories_data:
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    79
                if metacategory.get('label', None) is None:
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    80
                    raise ValueError(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    81
                        '!!! Metacategory without label !!!')
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    82
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    83
        if options.get('metacategories_json'):
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    84
            for metacategory in metacategories_data:
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    85
                MetaCategory.objects.create(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    86
                    collection=collection,
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    87
                    label=metacategory.get('label'),
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    88
                    triggers_notifications=metacategory.get(
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    89
                        'triggers_notifications', 0)
df27f9610c82 Creating iconolab episteme project
Riwad Salim
parents:
diff changeset
    90
                )