import csv import collections from django.core.management.base import BaseCommand, CommandError from core.models import Enregistrement, Etiquette class Command(BaseCommand): help = "Importe des enregistrement à partir d'un fichier .csv" mapping = ("date", "description", "etiquette", "montant") def add_arguments(self, parser): parser.add_argument("files", nargs="+", type=str) parser.add_argument("-t", "--test", action="store_true") def handle(self, *args, **options): header = "== Importation au format .csv" if options['test']: header += " (test)" header += " ==\n%s" % (self.mapping,) self.stdout.write(self.style.MIGRATE_HEADING(header)) for filepath in options['files']: with open(filepath, 'r') as f: self.stdout.write(self.style.WARNING("[-] %s " % filepath), ending='') reader = csv.reader(f) results = list() for row in reader: result = collections.OrderedDict() for i, field in enumerate(self.mapping): result[field] = row[i] results.append(result) self.stdout.write(self.style.SUCCESS("Ok (%i results):" % len(results))) for result in results: output = ", ".join(map(lambda t: "%s:%s" % (t[0][0:4], t[1]), result.items())) if not options['test']: # Création d'un nouvel enregistrement date = result['date'] # TODO: format date ! etiquette, created = Etiquette.objects.get_or_create(nom=result['etiquette']) Enregistrement.objects.create(date=result['date'], description=result['description'], etiquette=etiquette, montant=result['montant']) output = "+" + output if created: output += "(added %s)" % etiquette self.stdout.write(self.style.SUCCESS(" " + output))