diff -r 000000000000 -r df27f9610c82 src/iconolab_episteme/management/commands/importmetacategories.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/iconolab_episteme/management/commands/importmetacategories.py Tue Jun 26 15:55:08 2018 +0200 @@ -0,0 +1,90 @@ +# -*- coding: UTF-8 -*- +import json +import logging +import os +import pprint +import re +import shutil + +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError + +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 metacategories files 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-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( + '--metacategories-json', + dest='metacategories_json', + default=False, + help='add metacategories to the collection from a json file (json must be a list of object with "label" and "triggers_notifications" fields)', + ) + + def handle(self, *args, **options): + + print('# Logging with logger '+logger.name) + logger.debug('# Initializing command with args: %r', options) + + self.source_dir = options.get('source_dir') + + if 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. !!!') + + if options.get('metacategories_json'): + print('## Finding metacategories fixture json data in '+self.source_dir) + metacategories_json_path = os.path.join( + self.source_dir, options.get('metacategories_json')) + if not os.path.isfile(metacategories_json_path): + print('### No '+options.get('metacategories_json')+ + '.json file was found in the source directory') + raise ValueError( + '!!! Fixture file '+metacategories_json_path+' was not found !!!') + with open(metacategories_json_path) as metacategories_json_file: + metacategories_data = json.loads( + metacategories_json_file.read()) + for metacategory in metacategories_data: + if metacategory.get('label', None) is None: + raise ValueError( + '!!! Metacategory without label !!!') + + if options.get('metacategories_json'): + for metacategory in metacategories_data: + MetaCategory.objects.create( + collection=collection, + label=metacategory.get('label'), + triggers_notifications=metacategory.get( + 'triggers_notifications', 0) + ) \ No newline at end of file