From 5312276df286bda53d38736797e3da18332a609e Mon Sep 17 00:00:00 2001 From: Arthur Gerbaud Date: Sun, 24 Sep 2017 11:42:05 +0200 Subject: [PATCH] work on import_csv command, added ordering to models --- core/management/commands/import_csv.py | 51 ++++++++++++++++++-------- core/models.py | 5 +++ 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/core/management/commands/import_csv.py b/core/management/commands/import_csv.py index 9a93c75..cfebb80 100644 --- a/core/management/commands/import_csv.py +++ b/core/management/commands/import_csv.py @@ -1,3 +1,4 @@ +import datetime import csv import collections from django.core.management.base import BaseCommand, CommandError @@ -5,7 +6,7 @@ from core.models import Enregistrement, Etiquette class Command(BaseCommand): help = "Importe des enregistrement à partir d'un fichier .csv" - mapping = ("date", "description", "etiquette", "montant") + mapping = ("year", "month", "day", "etiquette", "description", "montant") def add_arguments(self, parser): parser.add_argument("files", nargs="+", type=str) @@ -18,9 +19,11 @@ class Command(BaseCommand): header += " ==\n%s" % (self.mapping,) self.stdout.write(self.style.MIGRATE_HEADING(header)) + # Find recors in each files for filepath in options['files']: with open(filepath, 'r') as f: - self.stdout.write(self.style.WARNING("[-] %s " % filepath), ending='') + # Get all data from file + self.stdout.write(self.style.WARNING("[-] %s. " % filepath), ending='') reader = csv.reader(f) results = list() for row in reader: @@ -28,18 +31,34 @@ class Command(BaseCommand): 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))) - + self.stdout.write(self.style.SUCCESS("Ok (found %i results)." % len(results))) + # Then, create new objects if necessary + self.errors = [] 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)) + date = datetime.date(int(result['year']), int(result['month']), int(result['day'])) + etiquette, created = Etiquette.objects.get_or_create(nom=result['etiquette']) + data = {'date':date, + 'description':str(result['description']), + 'etiquette':etiquette, + 'montant':float(result['montant'])} + + output = "." + formatter = self.style.WARNING + if not options['test']: + try: # Check that object does not already exists + obj = Enregistrement.objects.get(**data) + except Enregistrement.DoesNotExist: + try: + obj = Enregistrement(**data) + obj.save() + output = "+" + formatter = self.style.SUCCESS + except Exception as e: + output = "E" + formatter = self.style.ERROR + if created: + output += "(added %s)" % etiquette + self.stdout.write(formatter(output), ending='') + self.stdout.write('\n') + for error in self.errors: + self.stdout.write(self.style.ERROR('%s' % error)) diff --git a/core/models.py b/core/models.py index d14b166..c2e68ff 100644 --- a/core/models.py +++ b/core/models.py @@ -81,6 +81,8 @@ class Enregistrement(models.Model): def __str__(self): return "" % self.etiquette + class Meta: + ordering = ('date',) class EnregistrementRecursif(models.Model): jour = models.IntegerField() @@ -89,6 +91,9 @@ class EnregistrementRecursif(models.Model): description = models.CharField(max_length=512) created_date = models.DateField() + class Meta: + ordering = ('jour',) + def is_older(self, month, year): return (self.created_date.month <= month and self.created_date.year <= year)