feat(app): allow changing date and datetime format as a user setting

This commit is contained in:
Herculino Trotta
2025-01-20 19:35:22 -03:00
parent f68e954bc0
commit 60fe4c9681
21 changed files with 426 additions and 130 deletions

View File

@@ -88,13 +88,11 @@ class TransactionsFilter(django_filters.FilterSet):
date_start = django_filters.DateFilter(
field_name="date",
lookup_expr="gte",
widget=AirDatePickerInput(),
label=_("Date from"),
)
date_end = django_filters.DateFilter(
field_name="date",
lookup_expr="lte",
widget=AirDatePickerInput(),
label=_("Until"),
)
reference_date_start = MonthYearFilter(
@@ -135,7 +133,7 @@ class TransactionsFilter(django_filters.FilterSet):
"to_amount",
]
def __init__(self, data=None, *args, **kwargs):
def __init__(self, data=None, user=None, *args, **kwargs):
# if filterset is bound, use initial values as defaults
if data is not None:
# get a mutable copy of the QueryDict
@@ -184,3 +182,5 @@ class TransactionsFilter(django_filters.FilterSet):
self.form.fields["to_amount"].widget = ArbitraryDecimalDisplayNumberInput()
self.form.fields["from_amount"].widget = ArbitraryDecimalDisplayNumberInput()
self.form.fields["date_start"].widget = AirDatePickerInput(user=user)
self.form.fields["date_end"].widget = AirDatePickerInput(user=user)

View File

@@ -60,9 +60,7 @@ class TransactionForm(forms.ModelForm):
widget=TomSelect(clear_button=False, group_by="group"),
)
date = forms.DateField(
widget=AirDatePickerInput(clear_button=False), label=_("Date")
)
date = forms.DateField(label=_("Date"))
reference_date = forms.DateField(
widget=AirMonthYearPickerInput(), label=_("Reference Date"), required=False
@@ -88,7 +86,7 @@ class TransactionForm(forms.ModelForm):
"account": TomSelect(clear_button=False, group_by="group"),
}
def __init__(self, *args, **kwargs):
def __init__(self, *args, user=None, **kwargs):
super().__init__(*args, **kwargs)
# if editing a transaction display non-archived items and it's own item even if it's archived
@@ -139,6 +137,7 @@ class TransactionForm(forms.ModelForm):
)
self.fields["reference_date"].required = False
self.fields["date"].widget = AirDatePickerInput(clear_button=False, user=user)
if self.instance and self.instance.pk:
decimal_places = self.instance.account.currency.decimal_places
@@ -240,9 +239,7 @@ class TransferForm(forms.Form):
queryset=TransactionTag.objects.filter(active=True),
)
date = forms.DateField(
widget=AirDatePickerInput(clear_button=False), label=_("Date")
)
date = forms.DateField(label=_("Date"))
reference_date = forms.DateField(
widget=AirMonthYearPickerInput(), label=_("Reference Date"), required=False
@@ -259,7 +256,7 @@ class TransferForm(forms.Form):
label=_("Notes"),
)
def __init__(self, *args, **kwargs):
def __init__(self, *args, user=None, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
@@ -327,8 +324,8 @@ class TransferForm(forms.Form):
)
self.fields["from_amount"].widget = ArbitraryDecimalDisplayNumberInput()
self.fields["to_amount"].widget = ArbitraryDecimalDisplayNumberInput()
self.fields["date"].widget = AirDatePickerInput(clear_button=False, user=user)
def clean(self):
cleaned_data = super().clean()
@@ -439,10 +436,9 @@ class InstallmentPlanForm(forms.ModelForm):
"account": TomSelect(),
"recurrence": TomSelect(clear_button=False),
"notes": forms.Textarea(attrs={"rows": 3}),
"start_date": AirDatePickerInput(clear_button=False),
}
def __init__(self, *args, **kwargs):
def __init__(self, *args, user=None, **kwargs):
super().__init__(*args, **kwargs)
# if editing display non-archived items and it's own item even if it's archived
@@ -499,6 +495,9 @@ class InstallmentPlanForm(forms.ModelForm):
)
self.fields["installment_amount"].widget = ArbitraryDecimalDisplayNumberInput()
self.fields["start_date"].widget = AirDatePickerInput(
clear_button=False, user=user
)
if self.instance and self.instance.pk:
self.helper.layout.append(
@@ -677,8 +676,6 @@ class RecurringTransactionForm(forms.ModelForm):
"entities",
]
widgets = {
"start_date": AirDatePickerInput(clear_button=False),
"end_date": AirDatePickerInput(),
"reference_date": AirMonthYearPickerInput(),
"recurrence_type": TomSelect(clear_button=False),
"notes": forms.Textarea(
@@ -688,7 +685,7 @@ class RecurringTransactionForm(forms.ModelForm):
),
}
def __init__(self, *args, **kwargs):
def __init__(self, *args, user=None, **kwargs):
super().__init__(*args, **kwargs)
# if editing display non-archived items and it's own item even if it's archived
@@ -745,6 +742,10 @@ class RecurringTransactionForm(forms.ModelForm):
)
self.fields["amount"].widget = ArbitraryDecimalDisplayNumberInput()
self.fields["start_date"].widget = AirDatePickerInput(
clear_button=False, user=user
)
self.fields["end_date"].widget = AirDatePickerInput(user=user)
if self.instance and self.instance.pk:
self.helper.layout.append(

View File

@@ -82,7 +82,7 @@ def installment_plan_transactions(request, installment_plan_id):
@require_http_methods(["GET", "POST"])
def installment_plan_add(request):
if request.method == "POST":
form = InstallmentPlanForm(request.POST)
form = InstallmentPlanForm(request.POST, user=request.user)
if form.is_valid():
form.save()
messages.success(request, _("Installment Plan added successfully"))
@@ -94,7 +94,7 @@ def installment_plan_add(request):
},
)
else:
form = InstallmentPlanForm()
form = InstallmentPlanForm(user=request.user)
return render(
request,
@@ -110,7 +110,9 @@ 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)
form = InstallmentPlanForm(
request.POST, instance=installment_plan, user=request.user
)
if form.is_valid():
form.save()
messages.success(request, _("Installment Plan updated successfully"))
@@ -122,7 +124,7 @@ def installment_plan_edit(request, installment_plan_id):
},
)
else:
form = InstallmentPlanForm(instance=installment_plan)
form = InstallmentPlanForm(instance=installment_plan, user=request.user)
return render(
request,

View File

@@ -108,7 +108,7 @@ def recurring_transaction_transactions(request, recurring_transaction_id):
@require_http_methods(["GET", "POST"])
def recurring_transaction_add(request):
if request.method == "POST":
form = RecurringTransactionForm(request.POST)
form = RecurringTransactionForm(request.POST, user=request.user)
if form.is_valid():
form.save()
messages.success(request, _("Recurring Transaction added successfully"))
@@ -120,7 +120,7 @@ def recurring_transaction_add(request):
},
)
else:
form = RecurringTransactionForm()
form = RecurringTransactionForm(user=request.user)
return render(
request,
@@ -138,7 +138,9 @@ def recurring_transaction_edit(request, recurring_transaction_id):
)
if request.method == "POST":
form = RecurringTransactionForm(request.POST, instance=recurring_transaction)
form = RecurringTransactionForm(
request.POST, instance=recurring_transaction, user=request.user
)
if form.is_valid():
form.save()
messages.success(request, _("Recurring Transaction updated successfully"))
@@ -150,7 +152,9 @@ def recurring_transaction_edit(request, recurring_transaction_id):
},
)
else:
form = RecurringTransactionForm(instance=recurring_transaction)
form = RecurringTransactionForm(
instance=recurring_transaction, user=request.user
)
return render(
request,

View File

@@ -41,7 +41,7 @@ def transaction_add(request):
).date()
if request.method == "POST":
form = TransactionForm(request.POST)
form = TransactionForm(request.POST, user=request.user)
if form.is_valid():
form.save()
messages.success(request, _("Transaction added successfully"))
@@ -52,10 +52,11 @@ def transaction_add(request):
)
else:
form = TransactionForm(
user=request.user,
initial={
"date": expected_date,
"type": transaction_type,
}
},
)
return render(
@@ -72,7 +73,7 @@ def transaction_edit(request, transaction_id, **kwargs):
transaction = get_object_or_404(Transaction, id=transaction_id)
if request.method == "POST":
form = TransactionForm(request.POST, instance=transaction)
form = TransactionForm(request.POST, user=request.user, instance=transaction)
if form.is_valid():
form.save()
messages.success(request, _("Transaction updated successfully"))
@@ -82,7 +83,7 @@ def transaction_edit(request, transaction_id, **kwargs):
headers={"HX-Trigger": "updated, hide_offcanvas"},
)
else:
form = TransactionForm(instance=transaction)
form = TransactionForm(instance=transaction, user=request.user)
return render(
request,
@@ -172,7 +173,7 @@ def transactions_transfer(request):
).date()
if request.method == "POST":
form = TransferForm(request.POST)
form = TransferForm(request.POST, user=request.user)
if form.is_valid():
form.save()
messages.success(request, _("Transfer added successfully"))
@@ -185,7 +186,8 @@ def transactions_transfer(request):
initial={
"reference_date": expected_date,
"date": expected_date,
}
},
user=request.user,
)
return render(request, "transactions/fragments/transfer.html", {"form": form})
@@ -214,7 +216,7 @@ def transaction_pay(request, transaction_id):
@login_required
@require_http_methods(["GET"])
def transaction_all_index(request):
f = TransactionsFilter(request.GET)
f = TransactionsFilter(request.GET, user=request.user)
return render(request, "transactions/pages/transactions.html", {"filter": f})
@@ -236,7 +238,7 @@ def transaction_all_list(request):
transactions = default_order(transactions, order=order)
f = TransactionsFilter(request.GET, queryset=transactions)
f = TransactionsFilter(request.GET, user=request.user, queryset=transactions)
page_number = request.GET.get("page", 1)
paginator = Paginator(f.qs, 100)
@@ -266,7 +268,7 @@ def transaction_all_summary(request):
"installment_plan",
).all()
f = TransactionsFilter(request.GET, queryset=transactions)
f = TransactionsFilter(request.GET, user=request.user, queryset=transactions)
currency_data = calculate_currency_totals(f.qs.all(), ignore_empty=True)
currency_percentages = calculate_percentage_distribution(currency_data)