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