Add timeline per category
This commit is contained in:
parent
d88ba21869
commit
bbcaf1c1d3
2 changed files with 34 additions and 0 deletions
|
@ -5,4 +5,5 @@ from . import views
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("timeline", views.timeline, name="timeline"),
|
path("timeline", views.timeline, name="timeline"),
|
||||||
path("categories", views.categories, name="categories"),
|
path("categories", views.categories, name="categories"),
|
||||||
|
path("category/<uuid>", views.category, name="category"),
|
||||||
]
|
]
|
||||||
|
|
|
@ -5,6 +5,7 @@ import matplotlib.pyplot as plt
|
||||||
from matplotlib import dates as mdates
|
from matplotlib import dates as mdates
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
|
@ -63,3 +64,35 @@ def categories(request):
|
||||||
fig.savefig(_io, format="svg")
|
fig.savefig(_io, format="svg")
|
||||||
|
|
||||||
return HttpResponse(_io.getvalue(), headers={"Content-Type": "image/svg+xml"})
|
return HttpResponse(_io.getvalue(), headers={"Content-Type": "image/svg+xml"})
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def category(request, uuid):
|
||||||
|
_category = get_object_or_404(Category, id=uuid)
|
||||||
|
_values = (
|
||||||
|
Transaction.objects.filter(category=_category)
|
||||||
|
.annotate(m=models.functions.TruncMonth("date"))
|
||||||
|
.values("m")
|
||||||
|
.annotate(sum=models.Sum("value"))
|
||||||
|
.order_by("m")
|
||||||
|
)
|
||||||
|
|
||||||
|
fig, ax = plt.subplots()
|
||||||
|
ax.step(
|
||||||
|
[v["m"] for v in _values],
|
||||||
|
[v["sum"] for v in _values],
|
||||||
|
where="post",
|
||||||
|
)
|
||||||
|
ax.xaxis.set_major_formatter(
|
||||||
|
mdates.ConciseDateFormatter(ax.xaxis.get_major_locator())
|
||||||
|
)
|
||||||
|
ax.autoscale(True, "x", True)
|
||||||
|
_ym, _yp = ax.get_ylim()
|
||||||
|
ax.set(ylim=(min(_ym, 0), max(_yp, 0)))
|
||||||
|
ax.set(ylabel=f"{_category.name} (€)")
|
||||||
|
|
||||||
|
_io = io.StringIO()
|
||||||
|
|
||||||
|
fig.savefig(_io, format="svg")
|
||||||
|
|
||||||
|
return HttpResponse(_io.getvalue(), headers={"Content-Type": "image/svg+xml"})
|
||||||
|
|
Loading…
Reference in a new issue