def import_transactions_core(file, account, actually_import): transaction_id_col = 'TransactionId' reader = csv.DictReader(file) #for row in reader: # print("row: " + row) duplicates = Transaction.objects.none() duplicates_so_far = list(Transaction.objects.none()) labels = TransactionLabel.objects.all() account = BankAccount.objects.get(pk=account) if account != '' else None now = datetime.now() problems = [] existing_count = 0 count = 0 for row in reader: count += 1 transaction = Transaction() existing_transaction = False if transaction_id_col in row and row[transaction_id_col] != "": id_ = int(row[transaction_id_col]) transaction = Transaction.objects.get(pk=id_) new_temp = Transaction() populate_bank_transaction_info(new_temp, row, get_reimport_account_template()) if transaction.bank_account.id != int(row['AccountId']): problems.append( str(id_) + ": Account id changed " + str(transaction.bank_account.id) + " != " + row['AccountId']) for problem in check_bank_transaction_info_consistency( transaction, new_temp): problems.append(str(id_) + ": " + problem) existing_transaction = True existing_count += 1 else: transaction.bank_account = account transaction.date_imported = now if account == None: problems.append( "Could not parse transaction: Please select an account") else: try: populate_bank_transaction_info( transaction, row, account.bank_account_template) except Exception as e: problems.append("Could not parse transaction: '" + str(e) + "'") populate_meta_transaction_info(transaction, row, labels) if actually_import: if len(problems) > 0: file = "\n".join(["- " + x for x in problems]) raise Exception("Cannot save if there are problems:\n" + file) transaction.save() else: if not existing_transaction: duplicates = duplicates | Transaction.objects.all().filter( date=transaction.date, description=transaction.description, amount=transaction.amount, current_balance=transaction.current_balance, custom_date_1=transaction.custom_date_1, custom_text_1=transaction.custom_text_1, ) if count % 50 == 0: duplicates_so_far = duplicates_so_far + list(duplicates) duplicates = Transaction.objects.none() duplicates_so_far = duplicates_so_far + list(duplicates) return count, list(duplicates_so_far), existing_count, problems