changes, fixes and improvements

This commit is contained in:
Herculino Trotta
2024-10-16 00:16:48 -03:00
parent d0f4dcc957
commit 07cbfefb95
40 changed files with 1008 additions and 330 deletions

View File

@@ -2,3 +2,4 @@ from .transactions import *
from .tags import *
from .categories import *
from .actions import *
from .installment_plans import *

View File

@@ -33,9 +33,7 @@ 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, installment_plan__isnull=True
).delete()
Transaction.objects.filter(id__in=selected_transactions).delete()
return HttpResponse(
status=204,

View File

@@ -12,11 +12,25 @@ from apps.transactions.forms import TransactionCategoryForm
from apps.transactions.models import TransactionCategory
@login_required
@require_http_methods(["GET"])
def categories_index(request):
return render(
request,
"categories/pages/index.html",
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def categories_list(request):
categories = TransactionCategory.objects.all().order_by("id")
return render(request, "categories/pages/list.html", {"categories": categories})
return render(
request,
"categories/fragments/list.html",
{"categories": categories},
)
@only_htmx
@@ -32,8 +46,7 @@ def category_add(request, **kwargs):
return HttpResponse(
status=204,
headers={
"HX-Location": reverse("categories_list"),
"HX-Trigger": "hide_offcanvas, toasts",
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
@@ -61,8 +74,7 @@ def category_edit(request, category_id):
return HttpResponse(
status=204,
headers={
"HX-Location": reverse("categories_list"),
"HX-Trigger": "hide_offcanvas, toasts",
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
@@ -88,5 +100,7 @@ def category_delete(request, category_id):
return HttpResponse(
status=204,
headers={"HX-Location": reverse("categories_list")},
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)

View File

@@ -0,0 +1,139 @@
from django.contrib import messages
from django.contrib.auth.decorators import login_required
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.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from apps.common.decorators.htmx import only_htmx
from apps.transactions.forms import InstallmentPlanForm
from apps.transactions.models import InstallmentPlan
@login_required
@require_http_methods(["GET"])
def installment_plans_index(request):
return render(
request,
"installment_plans/pages/index.html",
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def installment_plans_list(request):
installment_plans = InstallmentPlan.objects.all().order_by("-end_date")
return render(
request,
"installment_plans/fragments/list.html",
{"installment_plans": installment_plans},
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def installment_plan_transactions(request, installment_plan_id):
installment_plan = get_object_or_404(InstallmentPlan, id=installment_plan_id)
transactions = installment_plan.transactions.all().order_by("reference_date", "id")
print(transactions)
return render(
request,
"installment_plans/fragments/list_transactions.html",
{"installment_plan": installment_plan, "transactions": transactions},
)
@only_htmx
@login_required
@require_http_methods(["GET", "POST"])
def installment_plan_add(request):
if request.method == "POST":
form = InstallmentPlanForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, _("Installment Plan added successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
form = InstallmentPlanForm()
return render(
request,
"installment_plans/fragments/add.html",
{"form": form},
)
@only_htmx
@login_required
@require_http_methods(["GET", "POST"])
def installment_plan_edit(request, installment_plan_id):
installment_plan = get_object_or_404(InstallmentPlan, id=installment_plan_id)
if request.method == "POST":
form = InstallmentPlanForm(request.POST, instance=installment_plan)
if form.is_valid():
form.save()
messages.success(request, _("Installment Plan updated successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
form = InstallmentPlanForm(instance=installment_plan)
return render(
request,
"installment_plans/fragments/edit.html",
{"form": form, "installment_plan": installment_plan},
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def installment_plan_refresh(request, installment_plan_id):
installment_plan = get_object_or_404(InstallmentPlan, id=installment_plan_id)
installment_plan.update_transactions()
messages.success(request, _("Installment Plan refreshed successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
@only_htmx
@login_required
@csrf_exempt
@require_http_methods(["DELETE"])
def installment_plan_delete(request, installment_plan_id):
installment_plan = get_object_or_404(InstallmentPlan, id=installment_plan_id)
installment_plan.delete()
messages.success(request, _("Installment Plan deleted successfully"))
return HttpResponse(
status=204,
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)

View File

@@ -14,9 +14,23 @@ from apps.transactions.models import TransactionTag
@login_required
@require_http_methods(["GET"])
def tag_list(request):
def tags_index(request):
return render(
request,
"tags/pages/index.html",
)
@only_htmx
@login_required
@require_http_methods(["GET"])
def tags_list(request):
tags = TransactionTag.objects.all().order_by("id")
return render(request, "tags/pages/list.html", {"tags": tags})
return render(
request,
"tags/fragments/list.html",
{"tags": tags},
)
@only_htmx
@@ -32,8 +46,7 @@ def tag_add(request, **kwargs):
return HttpResponse(
status=204,
headers={
"HX-Location": reverse("tags_list"),
"HX-Trigger": "hide_offcanvas, toasts",
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
@@ -61,8 +74,7 @@ def tag_edit(request, tag_id):
return HttpResponse(
status=204,
headers={
"HX-Location": reverse("tags_list"),
"HX-Trigger": "hide_offcanvas, toasts",
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)
else:
@@ -88,5 +100,7 @@ def tag_delete(request, tag_id):
return HttpResponse(
status=204,
headers={"HX-Location": reverse("tags_list")},
headers={
"HX-Trigger": "updated, hide_offcanvas, toasts",
},
)

View File

@@ -88,17 +88,9 @@ def transaction_edit(request, transaction_id, **kwargs):
def transaction_delete(request, transaction_id, **kwargs):
transaction = get_object_or_404(Transaction, id=transaction_id)
if transaction.installment_plan:
messages.error(
request,
_(
"This transaction is part of a Installment Plan, you can't delete it directly."
),
)
else:
transaction.delete()
transaction.delete()
messages.success(request, _("Transaction deleted successfully"))
messages.success(request, _("Transaction deleted successfully"))
return HttpResponse(
status=204,
@@ -152,30 +144,9 @@ def transaction_pay(request, transaction_id):
response = render(
request,
"transactions/fragments/item.html",
context={"transaction": transaction},
context={"transaction": transaction, **request.GET},
)
response.headers["HX-Trigger"] = (
f'{"paid" if new_is_paid else "unpaid"}, monthly_summary_update'
)
return response
class AddInstallmentPlanView(View):
template_name = "transactions/fragments/add_installment_plan.html"
def get(self, request):
form = InstallmentPlanForm()
return render(request, self.template_name, {"form": form})
def post(self, request):
form = InstallmentPlanForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, _("Installment plan created successfully"))
return HttpResponse(
status=204,
headers={"HX-Trigger": "updated, hide_offcanvas, toast"},
)
return render(request, self.template_name, {"form": form})