work on import_csv command, added ordering to models

This commit is contained in:
Arthur Gerbaud
2017-09-24 11:42:05 +02:00
parent a80c3e4bed
commit 5312276df2
2 changed files with 40 additions and 16 deletions

View File

@@ -1,3 +1,4 @@
import datetime
import csv import csv
import collections import collections
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
@@ -5,7 +6,7 @@ from core.models import Enregistrement, Etiquette
class Command(BaseCommand): class Command(BaseCommand):
help = "Importe des enregistrement à partir d'un fichier .csv" 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): def add_arguments(self, parser):
parser.add_argument("files", nargs="+", type=str) parser.add_argument("files", nargs="+", type=str)
@@ -18,9 +19,11 @@ class Command(BaseCommand):
header += " ==\n%s" % (self.mapping,) header += " ==\n%s" % (self.mapping,)
self.stdout.write(self.style.MIGRATE_HEADING(header)) self.stdout.write(self.style.MIGRATE_HEADING(header))
# Find recors in each files
for filepath in options['files']: for filepath in options['files']:
with open(filepath, 'r') as f: 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) reader = csv.reader(f)
results = list() results = list()
for row in reader: for row in reader:
@@ -28,18 +31,34 @@ class Command(BaseCommand):
for i, field in enumerate(self.mapping): for i, field in enumerate(self.mapping):
result[field] = row[i] result[field] = row[i]
results.append(result) 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: for result in results:
output = ", ".join(map(lambda t: "%s:%s" % (t[0][0:4], t[1]), result.items())) date = datetime.date(int(result['year']), int(result['month']), int(result['day']))
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']) etiquette, created = Etiquette.objects.get_or_create(nom=result['etiquette'])
Enregistrement.objects.create(date=result['date'], data = {'date':date,
description=result['description'], 'description':str(result['description']),
etiquette=etiquette, 'etiquette':etiquette,
montant=result['montant']) 'montant':float(result['montant'])}
output = "+" + output
if created: output += "(added %s)" % etiquette output = "."
self.stdout.write(self.style.SUCCESS(" " + 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))

View File

@@ -81,6 +81,8 @@ class Enregistrement(models.Model):
def __str__(self): def __str__(self):
return "<Depense: %s>" % self.etiquette return "<Depense: %s>" % self.etiquette
class Meta:
ordering = ('date',)
class EnregistrementRecursif(models.Model): class EnregistrementRecursif(models.Model):
jour = models.IntegerField() jour = models.IntegerField()
@@ -89,6 +91,9 @@ class EnregistrementRecursif(models.Model):
description = models.CharField(max_length=512) description = models.CharField(max_length=512)
created_date = models.DateField() created_date = models.DateField()
class Meta:
ordering = ('jour',)
def is_older(self, month, year): def is_older(self, month, year):
return (self.created_date.month <= month return (self.created_date.month <= month
and self.created_date.year <= year) and self.created_date.year <= year)