Use safe_division in more places

This commit is contained in:
Lukáš Kucharczyk 2023-11-09 10:06:14 +01:00
parent cdc6ca1324
commit c52cd822ae
2 changed files with 21 additions and 13 deletions

9
common/utils.py Normal file
View File

@ -0,0 +1,9 @@
def safe_division(numerator: int | float, denominator: int | float) -> int | float:
"""
Divides without triggering division by zero exception.
Returns 0 if denominator is 0.
"""
try:
return numerator / denominator
except ZeroDivisionError:
return 0

View File

@ -1,4 +1,5 @@
from common.time import format_duration, now as now_with_tz from common.time import format_duration, now as now_with_tz
from common.utils import safe_division
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.conf import settings from django.conf import settings
from django.db.models import Sum, F, Count from django.db.models import Sum, F, Count
@ -304,17 +305,13 @@ def stats(request, year: int = 0):
purchased_unfinished = all_purchased_without_refunded_this_year.filter( purchased_unfinished = all_purchased_without_refunded_this_year.filter(
date_finished__isnull=True date_finished__isnull=True
) )
if (
purchased_unfinished.count() == 0 unfinished_purchases_percent = int(
or all_purchased_refunded_this_year.count() == 0 safe_division(
): purchased_unfinished.count(), all_purchased_refunded_this_year.count()
unfinished_purchases_percent = 0
else:
unfinished_purchases_percent = int(
purchased_unfinished.count()
/ all_purchased_refunded_this_year.count()
* 100
) )
* 100
)
all_finished_this_year = Purchase.objects.filter(date_finished__year=year).order_by( all_finished_this_year = Purchase.objects.filter(date_finished__year=year).order_by(
"date_finished" "date_finished"
@ -374,7 +371,7 @@ def stats(request, year: int = 0):
"total_spent_currency": selected_currency, "total_spent_currency": selected_currency,
"all_purchased_this_year": all_purchased_without_refunded_this_year, "all_purchased_this_year": all_purchased_without_refunded_this_year,
"spent_per_game": int( "spent_per_game": int(
total_spent / all_purchased_without_refunded_this_year.count() safe_division(total_spent, all_purchased_without_refunded_this_year.count())
), ),
"all_finished_this_year": all_finished_this_year, "all_finished_this_year": all_finished_this_year,
"this_year_finished_this_year": this_year_finished_this_year, "this_year_finished_this_year": this_year_finished_this_year,
@ -385,8 +382,10 @@ def stats(request, year: int = 0):
"purchased_unfinished": purchased_unfinished, "purchased_unfinished": purchased_unfinished,
"unfinished_purchases_percent": unfinished_purchases_percent, "unfinished_purchases_percent": unfinished_purchases_percent,
"refunded_percent": int( "refunded_percent": int(
all_purchased_refunded_this_year.count() safe_division(
/ all_purchased_this_year.count() all_purchased_refunded_this_year.count(),
all_purchased_this_year.count(),
)
* 100 * 100
), ),
"all_purchased_refunded_this_year": all_purchased_refunded_this_year, "all_purchased_refunded_this_year": all_purchased_refunded_this_year,