From 0fac78d15a111bf869843bd9f9950a9cdbb8bd2d Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Sat, 25 Jan 2025 13:44:39 -0300 Subject: [PATCH] feat: add bulk duplicate action and toasts for existing actions --- app/apps/transactions/urls.py | 5 ++ app/apps/transactions/views/actions.py | 81 ++++++++++++++++++- .../cotton/ui/transactions_action_bar.html | 7 ++ 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/app/apps/transactions/urls.py b/app/apps/transactions/urls.py index 76c5a70..5dae195 100644 --- a/app/apps/transactions/urls.py +++ b/app/apps/transactions/urls.py @@ -26,6 +26,11 @@ urlpatterns = [ views.bulk_delete_transactions, name="transactions_bulk_delete", ), + path( + "transactions/actions/duplicate/", + views.bulk_clone_transactions, + name="transactions_bulk_clone", + ), path( "transaction//pay/", views.transaction_pay, diff --git a/app/apps/transactions/views/actions.py b/app/apps/transactions/views/actions.py index 88b6a0a..2a87e82 100644 --- a/app/apps/transactions/views/actions.py +++ b/app/apps/transactions/views/actions.py @@ -1,5 +1,9 @@ +from copy import deepcopy + +from django.contrib import messages from django.contrib.auth.decorators import login_required from django.http import HttpResponse +from django.utils.translation import gettext_lazy as _, ngettext_lazy from apps.common.decorators.htmx import only_htmx from apps.transactions.models import Transaction @@ -9,7 +13,19 @@ from apps.transactions.models import Transaction @login_required def bulk_pay_transactions(request): selected_transactions = request.GET.getlist("transactions", []) - Transaction.objects.filter(id__in=selected_transactions).update(is_paid=True) + transactions = Transaction.objects.filter(id__in=selected_transactions) + count = transactions.count() + transactions.update(is_paid=True) + + messages.success( + request, + ngettext_lazy( + "%(count)s transaction marked as paid", + "%(count)s transactions marked as paid", + count, + ) + % {"count": count}, + ) return HttpResponse( status=204, @@ -21,7 +37,19 @@ def bulk_pay_transactions(request): @login_required def bulk_unpay_transactions(request): selected_transactions = request.GET.getlist("transactions", []) - Transaction.objects.filter(id__in=selected_transactions).update(is_paid=False) + transactions = Transaction.objects.filter(id__in=selected_transactions) + count = transactions.count() + transactions.update(is_paid=False) + + messages.success( + request, + ngettext_lazy( + "%(count)s transaction marked as not paid", + "%(count)s transactions marked as not paid", + count, + ) + % {"count": count}, + ) return HttpResponse( status=204, @@ -33,7 +61,54 @@ def bulk_unpay_transactions(request): @login_required def bulk_delete_transactions(request): selected_transactions = request.GET.getlist("transactions", []) - Transaction.objects.filter(id__in=selected_transactions).delete() + transactions = Transaction.objects.filter(id__in=selected_transactions) + count = transactions.count() + transactions.delete() + + messages.success( + request, + ngettext_lazy( + "%(count)s transaction deleted successfully", + "%(count)s transactions deleted successfully", + count, + ) + % {"count": count}, + ) + + return HttpResponse( + status=204, + headers={"HX-Trigger": "updated"}, + ) + + +@only_htmx +@login_required +def bulk_clone_transactions(request): + selected_transactions = request.GET.getlist("transactions", []) + transactions = Transaction.objects.filter(id__in=selected_transactions) + count = transactions.count() + + for transaction in transactions: + 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.internal_id = None + new_transaction.save() + + new_transaction.tags.add(*transaction.tags.all()) + new_transaction.entities.add(*transaction.entities.all()) + + messages.success( + request, + ngettext_lazy( + "%(count)s transaction duplicated successfully", + "%(count)s transactions duplicated successfully", + count, + ) + % {"count": count}, + ) return HttpResponse( status=204, diff --git a/app/templates/cotton/ui/transactions_action_bar.html b/app/templates/cotton/ui/transactions_action_bar.html index 6fd5e60..eb53f8e 100644 --- a/app/templates/cotton/ui/transactions_action_bar.html +++ b/app/templates/cotton/ui/transactions_action_bar.html @@ -65,6 +65,13 @@ +