feat: finish adding DCA Tracker tool

This commit is contained in:
Herculino Trotta
2024-11-12 11:40:50 -03:00
parent 7ebe3b6b5b
commit ba52e8740f
14 changed files with 887 additions and 369 deletions
+178 -15
View File
@@ -1,31 +1,119 @@
# apps/dca_tracker/views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.decorators import login_required
from django.db.models import Sum, Avg
from django.db.models.functions import TruncMonth
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404
from django.utils.translation import gettext_lazy as _
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from .models import DCAStrategy, DCAEntry
from .forms import DCAStrategyForm, DCAEntryForm
from apps.common.decorators.htmx import only_htmx
from apps.dca.models import DCAStrategy, DCAEntry
from apps.dca.forms import DCAEntryForm, DCAStrategyForm
@login_required
def strategy_index(request):
return render(request, "dca/pages/strategy_index.html")
@only_htmx
@login_required
def strategy_list(request):
strategies = DCAStrategy.objects.all()
return render(request, "dca/strategy_list.html", {"strategies": strategies})
strategies = DCAStrategy.objects.all().order_by("created_at")
return render(
request, "dca/fragments/strategy/list.html", {"strategies": strategies}
)
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages
from django.utils.translation import gettext_lazy as _
from django.db.models import Sum, Avg
from django.db.models.functions import TruncMonth
@only_htmx
@login_required
def strategy_add(request):
if request.method == "POST":
form = DCAStrategyForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, _("DCA Strategy added successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
form = DCAStrategyForm()
return render(
request,
"dca/fragments/strategy/add.html",
{"form": form},
)
@only_htmx
@login_required
def strategy_edit(request, strategy_id):
dca_strategy = get_object_or_404(DCAStrategy, id=strategy_id)
if request.method == "POST":
form = DCAStrategyForm(request.POST, instance=dca_strategy)
if form.is_valid():
form.save()
messages.success(request, _("DCA Strategy updated successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
form = DCAStrategyForm(instance=dca_strategy)
return render(
request,
"dca/fragments/strategy/edit.html",
{"form": form, "dca_strategy": dca_strategy},
)
@only_htmx
@login_required
@csrf_exempt
@require_http_methods(["DELETE"])
def strategy_delete(request, strategy_id):
dca_strategy = get_object_or_404(DCAStrategy, id=strategy_id)
dca_strategy.delete()
messages.success(request, _("DCA strategy deleted successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
@login_required
def strategy_detail(request, pk):
strategy = get_object_or_404(DCAStrategy, id=pk)
def strategy_detail_index(request, strategy_id):
strategy = get_object_or_404(DCAStrategy, id=strategy_id)
return render(
request,
"dca/pages/strategy_detail_index.html",
context={"strategy": strategy},
)
@only_htmx
@login_required
def strategy_detail(request, strategy_id):
strategy = get_object_or_404(DCAStrategy, id=strategy_id)
entries = strategy.entries.all()
# Calculate monthly aggregates
@@ -50,6 +138,7 @@ def strategy_detail(request, pk):
}
for entry in entries
]
entries_data.reverse()
context = {
"strategy": strategy,
@@ -64,4 +153,78 @@ def strategy_detail(request, pk):
"total_profit_loss": strategy.total_profit_loss(),
"total_profit_loss_percentage": strategy.total_profit_loss_percentage(),
}
return render(request, "dca/strategy_detail.html", context)
return render(request, "dca/fragments/strategy/details.html", context)
@only_htmx
@login_required
def strategy_entry_add(request, strategy_id):
strategy = get_object_or_404(DCAStrategy, id=strategy_id)
if request.method == "POST":
form = DCAEntryForm(request.POST)
if form.is_valid():
entry = form.save(commit=False)
entry.strategy = strategy
entry.save()
messages.success(request, _("Entry added successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
form = DCAEntryForm()
return render(
request,
"dca/fragments/entry/add.html",
{"form": form, "strategy": strategy},
)
@only_htmx
@login_required
def strategy_entry_edit(request, strategy_id, entry_id):
dca_entry = get_object_or_404(DCAEntry, id=entry_id, strategy__id=strategy_id)
if request.method == "POST":
form = DCAEntryForm(request.POST, instance=dca_entry)
if form.is_valid():
form.save()
messages.success(request, _("Entry updated successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
form = DCAEntryForm(instance=dca_entry)
return render(
request,
"dca/fragments/strategy/edit.html",
{"form": form, "dca_entry": dca_entry},
)
@only_htmx
@login_required
@csrf_exempt
@require_http_methods(["DELETE"])
def strategy_entry_delete(request, entry_id, strategy_id):
dca_entry = get_object_or_404(DCAEntry, id=entry_id, strategy__id=strategy_id)
dca_entry.delete()
messages.success(request, _("Entry deleted successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)