redesign, added user system, added api endpoints

This commit is contained in:
Lyxminxx committed 2026-09-20 14:35:20 +02:00
1 parent 2c76e1df78
commit 72b8e569aa
17 files changed
+782 -99

No files matched your search

+27 -23
View File
@@ -1,30 +1,41 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.db.models import Sum
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login
from .models import Transaction
from .forms import TransactionForm
from .forms import TransactionForm, CustomUserCreationForm
import json
from datetime import timedelta
from django.utils import timezone
from django.db.models import Sum
def register(request):
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('home')
else:
form = CustomUserCreationForm()
return render(request, 'registration/register.html', {'form': form})
@login_required
def home(request):
# 1. Handle form submission
if request.method == 'POST':
form = TransactionForm(request.POST)
if form.is_valid():
form.save()
return redirect('home') # Refresh the page
transaction = form.save(commit=False)
transaction.user = request.user
transaction.save()
return redirect('home')
else:
form = TransactionForm()
# 2. Fetch data for the table
transactions = Transaction.objects.all()
# Calculate total balance (returns 0 if database is empty)
transactions = Transaction.objects.filter(user=request.user)
total_balance = transactions.aggregate(Sum('amount'))['amount__sum'] or 0
# 3. Send data to the template
context = {
'form': form,
'transactions': transactions,
@@ -32,9 +43,9 @@ def home(request):
}
return render(request, 'home.html', context)
@login_required
def edit_transaction(request, pk):
transaction = get_object_or_404(Transaction, pk=pk)
transaction = get_object_or_404(Transaction, pk=pk, user=request.user)
if request.method == 'POST':
form = TransactionForm(request.POST, instance=transaction)
if form.is_valid():
@@ -42,24 +53,22 @@ def edit_transaction(request, pk):
return redirect('home')
else:
form = TransactionForm(instance=transaction)
return render(request, 'edit.html', {'form': form, 'transaction': transaction})
@login_required
def delete_transaction(request, pk):
transaction = get_object_or_404(Transaction, pk=pk)
transaction = get_object_or_404(Transaction, pk=pk, user=request.user)
if request.method == 'POST':
transaction.delete()
return redirect('home')
@login_required
def stats(request):
# 1. Figure out what time period we are looking at
time_filter = request.GET.get('filter', 'all')
now = timezone.now().date()
# Start with only expenses (numbers less than 0)
expenses = Transaction.objects.filter(amount__lt=0)
expenses = Transaction.objects.filter(user=request.user, amount__lt=0)
# 2. Filter by date based on the button clicked
if time_filter == 'week':
expenses = expenses.filter(date__gte=now - timedelta(days=7))
elif time_filter == 'month':
@@ -67,18 +76,13 @@ def stats(request):
elif time_filter == 'year':
expenses = expenses.filter(date__gte=now - timedelta(days=365))
# 3. Group by category and sum the amounts
category_data = expenses.values('category__name').annotate(total=Sum('amount'))
# 4. Format data for Chart.js
labels = []
data = []
for item in category_data:
# If category is null, call it 'Uncategorized'
cat_name = item['category__name'] or 'Uncategorized'
labels.append(cat_name)
# Make the number positive for the chart (so it draws correctly)
data.append(abs(float(item['total'])))
context = {