import csv import datetime import re from decimal import Decimal from django.core.management.base import BaseCommand from main.models import FuelPurchase class Command(BaseCommand): help = "Import fuel purchases from CSV file" # Valintakenttien sanakirjat nimistä arvoiksi GAS_STATION_MAP = { 'Neste': 1, 'Teboil': 2, 'ABC': 3, 'Shell': 4, 'St1': 5, 'SEO': 6, 'ysi5': 7, '-': 0, } OCTANE_MAP = { '95': 95, '98': 98, } CAR_MAP = { '_': 0, 'Renault': 1, 'Nissan': 2, 'Smart': 3, } def add_arguments(self, parser): parser.add_argument('csvfile', type=str, help='Path to the CSV file') def parse_decimal(self, value_str): # Poista kaikki ei-numerot/pilkku/piste ja korvaa pilkut pisteeksi # esim. "10,00 €" -> "10.00" value_str = value_str.strip() # poista valuuttamerkit ja välilyönnit value_str = re.sub(r'[^\d,.-]', '', value_str) value_str = value_str.replace(',', '.') return Decimal(value_str) def parse_date(self, date_str): # Muoto: 08.02.2015 return datetime.datetime.strptime(date_str, "%d.%m.%Y").date() def handle(self, *args, **options): file_path = options['csvfile'] with open(file_path, newline='', encoding='utf-8') as csvfile: reader = csv.DictReader(csvfile, delimiter=';') count = 0 for row in reader: try: purchase_date = self.parse_date(row['Päivämäärä']) total_cost = self.parse_decimal(row['Hinta €']) price_per_litre = self.parse_decimal(row['Litrahinta €']) amount_litres = self.parse_decimal(row['Litraa']) gas_station_name = row['Asema'].strip() gas_station = self.GAS_STATION_MAP.get(gas_station_name, 0) octane_name = row['Polttoaine'].strip() octane = self.OCTANE_MAP.get(octane_name, 95) car_name = row['Auto'].strip() car = self.CAR_MAP.get(car_name, 0) obj, created = FuelPurchase.objects.get_or_create( purchase_date=purchase_date, gas_station=gas_station, octane=octane, car=car, total_cost=total_cost, price_per_litre=price_per_litre, amount_litres=amount_litres ) if created: count += 1 except Exception as e: self.stderr.write(f"Error processing row {row}: {e}") self.stdout.write(self.style.SUCCESS(f"Imported {count} fuel purchase records"))