From 315f4e126929fa1a41a6d4ba8039c84de3d58a6e Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Fri, 17 Jan 2025 23:53:39 -0300 Subject: [PATCH] feat: add a duplicate/clone action to each transaction --- app/apps/transactions/urls.py | 5 ++ app/apps/transactions/views/transactions.py | 51 +++++++++++++++++++++ app/templates/cotton/transaction/item.html | 8 ++++ 3 files changed, 64 insertions(+) diff --git a/app/apps/transactions/urls.py b/app/apps/transactions/urls.py index 844adad..44a6884 100644 --- a/app/apps/transactions/urls.py +++ b/app/apps/transactions/urls.py @@ -41,6 +41,11 @@ urlpatterns = [ views.transaction_edit, name="transaction_edit", ), + path( + "transaction//clone", + views.transaction_clone, + name="transaction_clone", + ), path( "transaction/add", views.transaction_add, diff --git a/app/apps/transactions/views/transactions.py b/app/apps/transactions/views/transactions.py index 262c4ca..3561fa4 100644 --- a/app/apps/transactions/views/transactions.py +++ b/app/apps/transactions/views/transactions.py @@ -1,4 +1,5 @@ import datetime +from copy import deepcopy from django.contrib import messages from django.contrib.auth.decorators import login_required @@ -12,6 +13,7 @@ from django.views.decorators.http import require_http_methods from apps.common.decorators.htmx import only_htmx from apps.common.utils.dicts import remove_falsey_entries +from apps.rules.signals import transaction_created from apps.transactions.filters import TransactionsFilter from apps.transactions.forms import TransactionForm, TransferForm from apps.transactions.models import Transaction @@ -89,6 +91,55 @@ def transaction_edit(request, transaction_id, **kwargs): ) +@only_htmx +@login_required +@require_http_methods(["GET", "POST"]) +def transaction_clone(request, transaction_id, **kwargs): + transaction = get_object_or_404(Transaction, id=transaction_id) + new_transaction = deepcopy(transaction) + new_transaction.pk = None + new_transaction.installment_plan = None + new_transaction.installment_id = None + new_transaction.recurring_transaction = None + new_transaction.save() + + new_transaction.tags.add(*transaction.tags.all()) + new_transaction.entities.add(*transaction.entities.all()) + + messages.success(request, _("Transaction duplicated successfully")) + + transaction_created.send(sender=transaction) + + # THIS HAS BEEN DISABLE DUE TO HTMX INCOMPATIBILITY + # SEE https://github.com/bigskysoftware/htmx/issues/3115 and https://github.com/bigskysoftware/htmx/issues/2706 + + # if request.GET.get("edit") == "true": + # return HttpResponse( + # status=200, + # headers={ + # "HX-Trigger": "updated", + # "HX-Push-Url": "false", + # "HX-Location": json.dumps( + # { + # "path": reverse( + # "transaction_edit", + # kwargs={"transaction_id": new_transaction.id}, + # ), + # "target": "#generic-offcanvas", + # "swap": "innerHTML", + # } + # ), + # }, + # ) + # else: + # transaction_created.send(sender=transaction) + + return HttpResponse( + status=204, + headers={"HX-Trigger": "updated"}, + ) + + @only_htmx @login_required @csrf_exempt diff --git a/app/templates/cotton/transaction/item.html b/app/templates/cotton/transaction/item.html index 8007599..02ba143 100644 --- a/app/templates/cotton/transaction/item.html +++ b/app/templates/cotton/transaction/item.html @@ -110,6 +110,14 @@ hx-get="{% url 'transaction_edit' transaction_id=transaction.id %}" hx-target="#generic-offcanvas" hx-swap="innerHTML"> + +