mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-04-25 10:08:36 +02:00
feat: export (WIP)
This commit is contained in:
@@ -55,6 +55,7 @@ INSTALLED_APPS = [
|
|||||||
"hijack",
|
"hijack",
|
||||||
"hijack.contrib.admin",
|
"hijack.contrib.admin",
|
||||||
"django_filters",
|
"django_filters",
|
||||||
|
"import_export",
|
||||||
"apps.users.apps.UsersConfig",
|
"apps.users.apps.UsersConfig",
|
||||||
"procrastinate.contrib.django",
|
"procrastinate.contrib.django",
|
||||||
"apps.transactions.apps.TransactionsConfig",
|
"apps.transactions.apps.TransactionsConfig",
|
||||||
@@ -63,6 +64,7 @@ INSTALLED_APPS = [
|
|||||||
"apps.common.apps.CommonConfig",
|
"apps.common.apps.CommonConfig",
|
||||||
"apps.net_worth.apps.NetWorthConfig",
|
"apps.net_worth.apps.NetWorthConfig",
|
||||||
"apps.import_app.apps.ImportConfig",
|
"apps.import_app.apps.ImportConfig",
|
||||||
|
"apps.export_app.apps.ExportConfig",
|
||||||
"apps.api.apps.ApiConfig",
|
"apps.api.apps.ApiConfig",
|
||||||
"cachalot",
|
"cachalot",
|
||||||
"rest_framework",
|
"rest_framework",
|
||||||
|
|||||||
@@ -49,5 +49,6 @@ urlpatterns = [
|
|||||||
path("", include("apps.dca.urls")),
|
path("", include("apps.dca.urls")),
|
||||||
path("", include("apps.mini_tools.urls")),
|
path("", include("apps.mini_tools.urls")),
|
||||||
path("", include("apps.import_app.urls")),
|
path("", include("apps.import_app.urls")),
|
||||||
|
path("", include("apps.export_app.urls")),
|
||||||
path("", include("apps.insights.urls")),
|
path("", include("apps.insights.urls")),
|
||||||
]
|
]
|
||||||
|
|||||||
0
app/apps/export_app/__init__.py
Normal file
0
app/apps/export_app/__init__.py
Normal file
3
app/apps/export_app/admin.py
Normal file
3
app/apps/export_app/admin.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
6
app/apps/export_app/apps.py
Normal file
6
app/apps/export_app/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class ExportConfig(AppConfig):
|
||||||
|
default_auto_field = "django.db.models.BigAutoField"
|
||||||
|
name = "apps.export_app"
|
||||||
0
app/apps/export_app/migrations/__init__.py
Normal file
0
app/apps/export_app/migrations/__init__.py
Normal file
3
app/apps/export_app/models.py
Normal file
3
app/apps/export_app/models.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
0
app/apps/export_app/resources/__init__.py
Normal file
0
app/apps/export_app/resources/__init__.py
Normal file
39
app/apps/export_app/resources/transactions.py
Normal file
39
app/apps/export_app/resources/transactions.py
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
from import_export import fields, resources
|
||||||
|
|
||||||
|
from apps.export_app.widgets.foreign_key import AutoCreateForeignKeyWidget
|
||||||
|
from apps.export_app.widgets.many_to_many import AutoCreateManyToManyWidget
|
||||||
|
from apps.transactions.models import (
|
||||||
|
Transaction,
|
||||||
|
TransactionCategory,
|
||||||
|
TransactionTag,
|
||||||
|
TransactionEntity,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TransactionResource(resources.ModelResource):
|
||||||
|
account = fields.Field(
|
||||||
|
attribute="account",
|
||||||
|
column_name="account",
|
||||||
|
widget=AutoCreateForeignKeyWidget("accounts.Account", "name"),
|
||||||
|
)
|
||||||
|
|
||||||
|
category = fields.Field(
|
||||||
|
attribute="category",
|
||||||
|
column_name="category",
|
||||||
|
widget=AutoCreateForeignKeyWidget(TransactionCategory, "name"),
|
||||||
|
)
|
||||||
|
|
||||||
|
tags = fields.Field(
|
||||||
|
attribute="tags",
|
||||||
|
column_name="tags",
|
||||||
|
widget=AutoCreateManyToManyWidget(TransactionTag, field="name"),
|
||||||
|
)
|
||||||
|
|
||||||
|
entities = fields.Field(
|
||||||
|
attribute="entities",
|
||||||
|
column_name="entities",
|
||||||
|
widget=AutoCreateManyToManyWidget(TransactionEntity, field="name"),
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Transaction
|
||||||
3
app/apps/export_app/tests.py
Normal file
3
app/apps/export_app/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
6
app/apps/export_app/urls.py
Normal file
6
app/apps/export_app/urls.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.urls import path
|
||||||
|
import apps.export_app.views as views
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path("export/", views.export, name="export"),
|
||||||
|
]
|
||||||
9
app/apps/export_app/views.py
Normal file
9
app/apps/export_app/views.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
from apps.export_app.resources.transactions import TransactionResource
|
||||||
|
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
|
def export(request):
|
||||||
|
dataset = TransactionResource().export()
|
||||||
|
print(dataset.csv)
|
||||||
0
app/apps/export_app/widgets/__init__.py
Normal file
0
app/apps/export_app/widgets/__init__.py
Normal file
11
app/apps/export_app/widgets/foreign_key.py
Normal file
11
app/apps/export_app/widgets/foreign_key.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
from import_export.widgets import ForeignKeyWidget
|
||||||
|
|
||||||
|
|
||||||
|
class AutoCreateForeignKeyWidget(ForeignKeyWidget):
|
||||||
|
def clean(self, value, row=None, *args, **kwargs):
|
||||||
|
if value:
|
||||||
|
try:
|
||||||
|
return super().clean(value, row, **kwargs)
|
||||||
|
except self.model.DoesNotExist:
|
||||||
|
return self.model.objects.create(name=value)
|
||||||
|
return None
|
||||||
21
app/apps/export_app/widgets/many_to_many.py
Normal file
21
app/apps/export_app/widgets/many_to_many.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
from import_export.widgets import ManyToManyWidget
|
||||||
|
|
||||||
|
|
||||||
|
class AutoCreateManyToManyWidget(ManyToManyWidget):
|
||||||
|
def clean(self, value, row=None, *args, **kwargs):
|
||||||
|
if not value:
|
||||||
|
return []
|
||||||
|
|
||||||
|
values = value.split(self.separator)
|
||||||
|
cleaned_values = []
|
||||||
|
|
||||||
|
for val in values:
|
||||||
|
val = val.strip()
|
||||||
|
if val:
|
||||||
|
try:
|
||||||
|
obj = self.model.objects.get(**{self.field: val})
|
||||||
|
except self.model.DoesNotExist:
|
||||||
|
obj = self.model.objects.create(name=val)
|
||||||
|
cleaned_values.append(obj)
|
||||||
|
|
||||||
|
return cleaned_values
|
||||||
@@ -152,8 +152,6 @@ def category_sum_by_currency(request):
|
|||||||
else:
|
else:
|
||||||
currency_data = None
|
currency_data = None
|
||||||
|
|
||||||
print(currency_data)
|
|
||||||
|
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"insights/fragments/category_explorer/charts/currency.html",
|
"insights/fragments/category_explorer/charts/currency.html",
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ django-cotton~=1.2.1
|
|||||||
django-pwa~=2.0.1
|
django-pwa~=2.0.1
|
||||||
djangorestframework~=3.15.2
|
djangorestframework~=3.15.2
|
||||||
drf-spectacular~=0.27.2
|
drf-spectacular~=0.27.2
|
||||||
|
django-import-export~=4.3.5
|
||||||
|
|
||||||
gunicorn==22.0.0
|
gunicorn==22.0.0
|
||||||
whitenoise[brotli]==6.6.0
|
whitenoise[brotli]==6.6.0
|
||||||
|
|||||||
Reference in New Issue
Block a user