from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from django.db.models import Value from apps.transactions.forms import TransactionForm from apps.transactions.forms import ImportForm from apps.transactions.models import Transaction from apps.transactions.importbtcde import ImportBtcDe import datetime import socket import xlwt from django.http import HttpResponse @login_required def add(request): if request.method == "POST": # request.POST is immutable, so make a copy values = request.POST.copy() values['owner'] = request.user.id form = TransactionForm(values) if form.is_valid(): try: form.save() return redirect('/transactions/show') except: pass else: form = TransactionForm() return render(request,'add.html',{'form':form}) @login_required def importbtcde(request): form = ImportForm() if request.method == "POST": form = ImportForm(request.POST) if form.is_valid(): # try: importBtcDe = ImportBtcDe() # importBtcDe.Import(request.POST['api_key'], request.POST['api_secret'], request.POST['start_date'], request.user.id) importBtcDe.Import(form.cleaned_data.get('api_key'), form.cleaned_data.get('api_secret'), form.cleaned_data.get('start_date'), request.user) return redirect('/transactions/show') # except: # pass hostname = socket.gethostname() my_ip = socket.gethostbyname(hostname) return render(request,'import.html',{'form':form, 'my_ip': my_ip}) @login_required def show(request): if 'crypto' in request.GET: crypto = request.GET['crypto'] else: crypto = None if crypto: transactions = Transaction.objects.filter(owner=request.user, crypto_currency=crypto).order_by('-date_valid').annotate(crypto_total=Value(0.0), fiat_total=Value(0.0)) else: transactions = Transaction.objects.filter(owner=request.user).order_by('-date_valid').annotate(crypto_total=Value(0.0), fiat_total=Value(0.0)) for tr in transactions: tr.crypto_total = 0.0 if tr.crypto_amount: tr.crypto_total += float(tr.crypto_amount) if tr.crypto_fee: tr.crypto_total += float(tr.crypto_fee) tr.fiat_total = 0.0 if tr.fiat_amount: tr.fiat_total += float(tr.fiat_amount) if tr.fiat_fee: tr.fiat_total += float(tr.fiat_fee) return render(request,"show.html",{'transactions':transactions, 'tax_limit_day': datetime.datetime.now() - datetime.timedelta(days=1*365), 'crypto': crypto}) @login_required def export(request): if 'crypto' in request.GET: crypto = request.GET['crypto'] else: crypto = None if crypto: filename="transactions-"+crypto+".xls" transactions = Transaction.objects.filter(owner=request.user, crypto_currency=crypto).order_by('-date_valid') else: transactions = Transaction.objects.filter(owner=request.user).order_by('-date_valid') filename="transactions.xls" response = HttpResponse(content_type='application/ms-excel') response['Content-Disposition'] = 'attachment; filename="'+filename+'"' wb = xlwt.Workbook(encoding='utf-8') ws = wb.add_sheet('Transactions') # header row_num = 0 font_style = xlwt.XFStyle() font_style.font.bold = True columns = ['Date', 'Type', 'Crypto Amount', 'Crypto Fee', 'Crypto Currency', 'Fiat Amount', 'Fiat Fee', 'Fiat Currency', 'Rate', 'Description', ] for col_num in range(len(columns)): ws.write(row_num, col_num, columns[col_num], font_style) # body font_style = xlwt.XFStyle() date_format = xlwt.XFStyle() date_format.num_format_str = 'dd/mm/yyyy' for row in transactions: row_num += 1 ws.write(row_num, 0, row.date_valid.replace(tzinfo=None), date_format) ws.write(row_num, 1, row.transaction_type, font_style) if row.transaction_type == 'B': ws.write(row_num, 2, row.crypto_amount, font_style) elif row.crypto_amount: ws.write(row_num, 2, -1*row.crypto_amount, font_style) if row.crypto_fee: ws.write(row_num, 3, -1*row.crypto_fee, font_style) ws.write(row_num, 4, row.crypto_currency, font_style) if row.transaction_type == 'B' and row.fiat_amount: ws.write(row_num, 5, -1*row.fiat_amount, font_style) else: ws.write(row_num, 5, row.fiat_amount, font_style) if row.fiat_fee: ws.write(row_num, 6, -1*row.fiat_fee, font_style) ws.write(row_num, 7, row.fiat_currency, font_style) ws.write(row_num, 8, row.exchange_rate, font_style) ws.write(row_num, 9, row.description, font_style) wb.save(response) return response @login_required def edit(request, id): transaction = Transaction.objects.get(id=id, owner=request.user) form = TransactionForm(request.POST or None, instance = transaction) return render(request,'edit.html', {'transaction':transaction, 'form': form}) @login_required def update(request, id): transaction = Transaction.objects.get(id=id, owner=request.user) # request.POST is immutable, so make a copy values = request.POST.copy() values['owner'] = request.user.id form = TransactionForm(values, instance = transaction) if form.is_valid(): form.save() return redirect("/transactions/show") return render(request, 'edit.html', {'transaction': transaction, 'form': form}) @login_required def destroy(request, id): transaction = Transaction.objects.get(id=id, owner=request.user.id) transaction.delete() return redirect("/transactions/show")