diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py
index 8ad71bf..53b7b82 100644
--- a/nummi/history/templatetags/history_extras.py
+++ b/nummi/history/templatetags/history_extras.py
@@ -9,6 +9,8 @@ register = template.Library()
@register.simple_tag
def calendar_opacity(v, vmax):
+ if v is None:
+ return "0%"
return f"{math.sin(min(1, math.fabs(v/vmax))*math.pi/2):.0%}"
@@ -29,6 +31,8 @@ def empty_calendar_cells_end(n):
@register.simple_tag
def up_down_icon(val):
+ if val is None:
+ return ""
if val > 0:
return remix("arrow-up-s", "green")
elif val < 0:
@@ -41,15 +45,18 @@ def up_down_icon(val):
def plot_bar(s, sum_pm, s_max):
_res = ""
- if sum_pm:
- _w = abs(sum_pm / s_max)
- _res += f"""
"""
- if sum_pm is not None and s * sum_pm > 0:
- _w = abs(s / s_max)
- _res += (
- f""""""
- f"""{pmrvalue(s)}
"""
- )
+ if s_max:
+ if sum_pm:
+ _w = abs(sum_pm / s_max)
+ _res += f""""""
+ if sum_pm is not None and s * sum_pm > 0:
+ _w = abs(s / s_max)
+ _res += (
+ f""""""
+ f"""{pmrvalue(s)}
"""
+ )
+ else:
+ _res += ""
return mark_safe(_res)
@@ -64,4 +71,4 @@ def calendar_head():
@register.filter
def sum_year(y_data):
- return sum(y["sum"] for y in y_data)
+ return sum(y["sum"] or 0 for y in y_data)
diff --git a/nummi/history/utils.py b/nummi/history/utils.py
index c61fc88..1238469 100644
--- a/nummi/history/utils.py
+++ b/nummi/history/utils.py
@@ -1,7 +1,7 @@
import datetime
from django.db.models import Q, Sum
-from django.db.models.functions import Abs, TruncMonth
+from django.db.models.functions import Abs, Greatest, TruncMonth
def history(transaction_set):
@@ -14,15 +14,19 @@ def history(transaction_set):
_first_month = _transaction_month.last()["month"]
_last_month = _transaction_month.first()["month"]
- _history = _transaction_month.annotate(
- sum_p=Sum("value", filter=Q(value__gt=0)),
- sum_m=Sum("value", filter=Q(value__lt=0)),
- sum=Sum("value"),
- ).order_by("-month")
+ _history = (
+ _transaction_month.annotate(
+ sum_p=Sum("value", filter=Q(value__gt=0), default=0),
+ sum_m=Sum("value", filter=Q(value__lt=0), default=0),
+ sum=Sum("value"),
+ )
+ .annotate(max_sum=Greatest("sum_p", Abs("sum_m")))
+ .order_by("-month")
+ )
_data = [
_history.filter(month=datetime.date(y, m + 1, 1)).first()
- or {"month": datetime.date(y, m + 1, 1), "sum": 0}
+ or {"month": datetime.date(y, m + 1, 1), "sum": None}
for y in range(
_first_month.year,
_last_month.year + 1,
@@ -37,10 +41,9 @@ def history(transaction_set):
"data": _data,
"max": {
"pm": 125
- * max(
- _history.order_by("-sum_p")[len(_history) // 10]["sum_p"],
- _history.order_by("-sum_m")[len(_history) // 10]["sum_m"],
- )
+ * _history.order_by("-max_sum")[len(_history.exclude(max_sum=0)) // 10][
+ "max_sum"
+ ]
/ 100,
"sum": 125
* _history.annotate(abs_sum=Abs("sum")).order_by("-abs_sum")[