Use safe_division in more places
This commit is contained in:
parent
cb99d8b656
commit
06a4319623
|
@ -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
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue