diff --git a/nummi/api/__init__.py b/nummi/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nummi/api/admin.py b/nummi/api/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/nummi/api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/nummi/api/apps.py b/nummi/api/apps.py new file mode 100644 index 0000000..878e7d5 --- /dev/null +++ b/nummi/api/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "api" diff --git a/nummi/api/migrations/__init__.py b/nummi/api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nummi/api/models.py b/nummi/api/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/nummi/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/nummi/api/tests.py b/nummi/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/nummi/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/nummi/api/urls.py b/nummi/api/urls.py new file mode 100644 index 0000000..cb74a80 --- /dev/null +++ b/nummi/api/urls.py @@ -0,0 +1,11 @@ +from django.urls import path + +from . import views + +urlpatterns = [ + path("transactions", views.TransactionListView.as_view(), name="transactions"), + path("categories", views.CategoryListView.as_view(), name="categories"), + path("accounts", views.AccountListView.as_view(), name="accounts"), + path("snapshots", views.SnapshotListView.as_view(), name="snapshots"), + path("history", views.HistoryView.as_view(), name="history"), +] diff --git a/nummi/api/views.py b/nummi/api/views.py new file mode 100644 index 0000000..876d5fd --- /dev/null +++ b/nummi/api/views.py @@ -0,0 +1,51 @@ +from django.db.models import Sum +from django.db.models.functions import ExtractQuarter, ExtractYear +from django.http import JsonResponse +from django.views import View +from django.views.generic.list import MultipleObjectMixin + +from main.models import Account, Category, Snapshot, Transaction +from main.views import UserMixin + + +class TransactionListView(UserMixin, MultipleObjectMixin, View): + model = Transaction + + def get(self, request, *args, **kwargs): + return JsonResponse({"transactions": list(self.get_queryset().values())}) + + +class CategoryListView(UserMixin, MultipleObjectMixin, View): + model = Category + + def get(self, request, *args, **kwargs): + return JsonResponse({"categories": list(self.get_queryset().values())}) + + +class AccountListView(UserMixin, MultipleObjectMixin, View): + model = Account + + def get(self, request, *args, **kwargs): + return JsonResponse({"accounts": list(self.get_queryset().values())}) + + +class SnapshotListView(UserMixin, MultipleObjectMixin, View): + model = Snapshot + + def get(self, request, *args, **kwargs): + return JsonResponse({"snapshots": list(self.get_queryset().values())}) + + +class HistoryView(UserMixin, MultipleObjectMixin, View): + model = Transaction + + def get(self, request, *args, **kwargs): + return JsonResponse( + { + "data": list( + self.get_queryset() + .values("category__name", quarter=ExtractQuarter("date"), year=ExtractYear("date")) + .annotate(Sum("value")) + ) + } + ) diff --git a/nummi/nummi/urls.py b/nummi/nummi/urls.py index 14d3517..a888c80 100644 --- a/nummi/nummi/urls.py +++ b/nummi/nummi/urls.py @@ -20,6 +20,7 @@ from django.urls import include, path urlpatterns = i18n_patterns( path("", include("main.urls")), path("plot/", include("plot.urls")), + path("api/", include("api.urls")), path("admin/", admin.site.urls), prefix_default_language=False, )