1
1

replace all usages of datetime with django.timezone and timedelta with relativedelta

This commit is contained in:
2020-02-26 18:38:35 +01:00
parent a9df49cf6d
commit 9f7778fc42
4 changed files with 23 additions and 81 deletions

View File

@@ -1,9 +1,8 @@
from django.contrib import admin from django.contrib import admin
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.safestring import mark_safe
from financeplanner.models import Transaction, Balance from financeplanner.models import Transaction, Balance
from financeplanner.utils import format_price, get_transaction_progress from financeplanner.utils import format_price
class AdminSite(admin.AdminSite): class AdminSite(admin.AdminSite):
@@ -23,35 +22,9 @@ def amount(obj):
amount.short_description = "amount" amount.short_description = "amount"
def progress(transaction):
total, paid = get_transaction_progress(transaction)
if total:
percentage = int((paid / total) * 100)
else:
percentage = 0
outer_style = (
"width: 90%;",
"height: 10px;",
"background-color: #dd4646;",
)
inner_style = (
f"width: {percentage}%;",
"height: 100%;",
"background-color: #70bf2b;",
)
return mark_safe(
f'<div style="{" ".join(outer_style)}">'
f'<div style="{" ".join(inner_style)}"></div>'
f'</div>'
)
progress.short_description = "progress"
@admin.register(Transaction, site=admin_site) @admin.register(Transaction, site=admin_site)
class TransactionAdmin(admin.ModelAdmin): class TransactionAdmin(admin.ModelAdmin):
list_display = ("subject", amount, "booking_date", "recurring_months", "not_recurring_after", progress) list_display = ("subject", amount, "booking_date", "recurring_months", "not_recurring_after")
@admin.register(Balance, site=admin_site) @admin.register(Balance, site=admin_site)

View File

@@ -1,11 +1,12 @@
from datetime import datetime, timedelta
from decimal import Decimal from decimal import Decimal
from dateutil.relativedelta import relativedelta
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.management import BaseCommand from django.core.management import BaseCommand
from financeplanner.management.commands.createadmin import USERNAME from financeplanner.management.commands.createadmin import USERNAME
from financeplanner.models import Transaction, Balance from financeplanner.models import Transaction, Balance
from financeplanner.utils import current_date
User = get_user_model() User = get_user_model()
@@ -15,29 +16,29 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
user = User.objects.get(**{User.USERNAME_FIELD: USERNAME}) user = User.objects.get(**{User.USERNAME_FIELD: USERNAME})
today = datetime.now().date() today = current_date()
Transaction.objects.create( Transaction.objects.create(
user=user, user=user,
subject="simple transaction some days ago", subject="simple transaction some days ago",
amount=Decimal("34.95"), amount=Decimal("34.95"),
booking_date=today - timedelta(days=5), booking_date=today - relativedelta(days=5),
) )
Transaction.objects.create( Transaction.objects.create(
user=user, user=user,
subject="simple transaction a week ahead", subject="simple transaction a week ahead",
amount=Decimal("66.66"), amount=Decimal("66.66"),
booking_date=today + timedelta(weeks=1), booking_date=today + relativedelta(weeks=1),
) )
Transaction.objects.create( Transaction.objects.create(
user=user, user=user,
subject="recurring stuff ending soon", subject="recurring stuff ending soon",
amount=Decimal("49"), amount=Decimal("49"),
booking_date=today - timedelta(days=180), booking_date=today - relativedelta(days=180),
recurring_months=1, recurring_months=1,
not_recurring_after=today + timedelta(weeks=6) not_recurring_after=today + relativedelta(weeks=6)
) )
Transaction.objects.create( Transaction.objects.create(
@@ -45,23 +46,23 @@ class Command(BaseCommand):
subject="recurring stuff beginning soon", subject="recurring stuff beginning soon",
amount=Decimal("30"), amount=Decimal("30"),
recurring_months=2, recurring_months=2,
booking_date=today + timedelta(weeks=2), booking_date=today + relativedelta(weeks=2),
) )
Balance.objects.create( Balance.objects.create(
user=user, user=user,
date=today - timedelta(weeks=7), date=today - relativedelta(weeks=7),
amount=Decimal("600"), amount=Decimal("600"),
) )
Balance.objects.create( Balance.objects.create(
user=user, user=user,
date=today - timedelta(weeks=3), date=today - relativedelta(weeks=3),
amount=Decimal("380"), amount=Decimal("380"),
) )
Balance.objects.create( Balance.objects.create(
user=user, user=user,
date=today - timedelta(days=2), date=today - relativedelta(days=2),
amount=Decimal("450"), amount=Decimal("450"),
) )

View File

@@ -1,11 +1,10 @@
from datetime import datetime
from decimal import Decimal from decimal import Decimal
from dateutil.relativedelta import relativedelta from django.utils import timezone
def current_date(): def current_date():
return datetime.now().date() return timezone.now().date()
def round_with_dec_places(number, places): def round_with_dec_places(number, places):
@@ -19,35 +18,3 @@ def format_price(number):
if number is None: if number is None:
return None return None
return f"{round_with_dec_places(number, 2)}" return f"{round_with_dec_places(number, 2)}"
def _count_rates(start, end, months_delta):
delta = relativedelta(months=months_delta)
count = 0
current = start
while current <= end:
count += 1
current += delta
return count
def get_transaction_progress(transaction):
if rec_months := transaction.recurring_months:
start = transaction.booking_date
current = current_date()
if end := transaction.not_recurring_after:
total = _count_rates(start, end, rec_months)
if current >= end:
paid = total
else:
paid = _count_rates(start, current, rec_months)
else:
total = None
paid = _count_rates(start, current, rec_months)
else:
total = 1
if transaction.booking_date < current_date():
paid = 1
else:
paid = 0
return total, paid

View File

@@ -1,4 +1,3 @@
from datetime import datetime
from decimal import Decimal from decimal import Decimal
from math import floor from math import floor
@@ -7,6 +6,8 @@ from django.contrib.auth.decorators import login_required
from django.db.models import Q from django.db.models import Q
from django.shortcuts import render from django.shortcuts import render
from financeplanner.utils import current_date
def _get_relevant_balances(user, range_start, range_end): def _get_relevant_balances(user, range_start, range_end):
balance_list = [] balance_list = []
@@ -144,7 +145,7 @@ def _build_graph_data(range_start, range_end, calculation_start, balance_list, a
... ...
} }
""" """
today = datetime.now().date() today = current_date()
stats = _calculate_daily_stats(calculation_start, range_end, balance_list, actual_transactions) stats = _calculate_daily_stats(calculation_start, range_end, balance_list, actual_transactions)
stats = _trim_stats(stats, range_start) stats = _trim_stats(stats, range_start)
amount_limit = _calculate_scale(stats) amount_limit = _calculate_scale(stats)
@@ -179,7 +180,7 @@ def _build_graph_data(range_start, range_end, calculation_start, balance_list, a
def _calculate_analysis(user): def _calculate_analysis(user):
result = {} result = {}
today = datetime.now().date() today = current_date()
booked = Q(booking_date__lte=today) booked = Q(booking_date__lte=today)
outgoing = Q(amount__gt=0) outgoing = Q(amount__gt=0)
incoming = Q(amount__lt=0) incoming = Q(amount__lt=0)
@@ -200,9 +201,9 @@ def _calculate_analysis(user):
@login_required @login_required
def index(request): def index(request):
user = request.user user = request.user
today = datetime.now().date() today = current_date()
range_start = today - relativedelta(days=30) range_start = today - relativedelta(months=6)
range_end = today + relativedelta(days=50) range_end = today + relativedelta(months=6)
balance_list = _get_relevant_balances(user, range_start, range_end) balance_list = _get_relevant_balances(user, range_start, range_end)
calculation_start = balance_list[0].date if balance_list else range_start calculation_start = balance_list[0].date if balance_list else range_start
transaction_list = _get_relevant_transactions(user, calculation_start, range_end) transaction_list = _get_relevant_transactions(user, calculation_start, range_end)
@@ -213,9 +214,9 @@ def index(request):
graph_data = None graph_data = None
analysis = _calculate_analysis(user) analysis = _calculate_analysis(user)
context = { context = {
"today": today,
"range_start": range_start, "range_start": range_start,
"range_end": range_end, "range_end": range_end,
"today": today,
"balance_list": balance_list, "balance_list": balance_list,
"transaction_list": transaction_list, "transaction_list": transaction_list,
"actual_transactions": sorted(actual_transactions, key=lambda t: t[0]), "actual_transactions": sorted(actual_transactions, key=lambda t: t[0]),