Exemplo n.º 1
0
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