Files
WYGIWYH/app/apps/transactions/views/quick_transactions.py
2025-11-22 00:44:57 -03:00

232 lines
6.5 KiB
Python

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.forms import model_to_dict
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.views.decorators.http import require_http_methods
from apps.common.decorators.htmx import only_htmx
from apps.transactions.forms import QuickTransactionForm
from apps.transactions.models import QuickTransaction, transaction_created
from apps.transactions.models import Transaction
@login_required
@require_http_methods(["GET"])
def quick_transactions_index(request):
return render(
request,
"quick_transactions/pages/index.html",
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def quick_transactions_list(request):
quick_transactions = QuickTransaction.objects.all().order_by("name")
return render(
request,
"quick_transactions/fragments/list.html",
context={"quick_transactions": quick_transactions},
)
@only_htmx
@login_required
@require_http_methods(["GET", "POST"])
def quick_transaction_add(request):
if request.method == "POST":
form = QuickTransactionForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, _("Item added successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas",
},
)
else:
form = QuickTransactionForm()
return render(
request,
"quick_transactions/fragments/add.html",
{"form": form},
)
@only_htmx
@login_required
@require_http_methods(["GET", "POST"])
def quick_transaction_edit(request, quick_transaction_id):
quick_transaction = get_object_or_404(QuickTransaction, id=quick_transaction_id)
if request.method == "POST":
form = QuickTransactionForm(request.POST, instance=quick_transaction)
if form.is_valid():
form.save()
messages.success(request, _("Item updated successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas",
},
)
else:
form = QuickTransactionForm(instance=quick_transaction)
return render(
request,
"quick_transactions/fragments/edit.html",
{"form": form, "quick_transaction": quick_transaction},
)
@only_htmx
@login_required
@require_http_methods(["DELETE"])
def quick_transaction_delete(request, quick_transaction_id):
quick_transaction = get_object_or_404(QuickTransaction, id=quick_transaction_id)
quick_transaction.delete()
messages.success(request, _("Item deleted successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas",
},
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def quick_transactions_create_menu(request):
quick_transactions = QuickTransaction.objects.all().order_by("name")
return render(
request,
"quick_transactions/fragments/create_menu.html",
context={"quick_transactions": quick_transactions},
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def quick_transaction_add_as_transaction(request, quick_transaction_id):
quick_transaction: QuickTransaction = get_object_or_404(
QuickTransaction, id=quick_transaction_id
)
today = timezone.localdate(timezone.now())
quick_transaction_data = model_to_dict(
quick_transaction,
exclude=[
"id",
"name",
"owner",
"account",
"category",
"tags",
"entities",
"internal_id",
],
)
new_transaction = Transaction(**quick_transaction_data)
new_transaction.account = quick_transaction.account
new_transaction.category = quick_transaction.category
new_transaction.date = today
new_transaction.reference_date = today.replace(day=1)
new_transaction.save()
new_transaction.tags.set(quick_transaction.tags.all())
new_transaction.entities.set(quick_transaction.entities.all())
transaction_created.send(sender=new_transaction)
messages.success(request, _("Transaction added successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas",
},
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def quick_transaction_add_as_quick_transaction(request, transaction_id):
transaction: Transaction = get_object_or_404(Transaction, pk=transaction_id)
if (
transaction.description
and QuickTransaction.objects.filter(
name__startswith=transaction.description
).exists()
) or QuickTransaction.objects.filter(
name__startswith=_("Quick Transaction")
).exists():
if transaction.description:
count = QuickTransaction.objects.filter(
name__startswith=transaction.description
).count()
qt_name = transaction.description + f" ({count + 1})"
else:
count = QuickTransaction.objects.filter(
name__startswith=_("Quick Transaction")
).count()
qt_name = _("Quick Transaction") + f" ({count + 1})"
else:
qt_name = transaction.description or _("Quick Transaction")
transaction_data = model_to_dict(
transaction,
exclude=[
"id",
"name",
"owner",
"account",
"category",
"tags",
"entities",
"date",
"reference_date",
"installment_plan",
"installment_id",
"recurring_transaction",
"deleted",
"deleted_at",
"internal_id",
],
)
new_quick_transaction = QuickTransaction(**transaction_data)
new_quick_transaction.account = transaction.account
new_quick_transaction.category = transaction.category
new_quick_transaction.name = qt_name
new_quick_transaction.save()
new_quick_transaction.tags.set(transaction.tags.all())
new_quick_transaction.entities.set(transaction.entities.all())
messages.success(request, _("Item added successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "toasts",
},
)