From 9ecf8279b4271ef0db970ba77a73b1d7b5aedb08 Mon Sep 17 00:00:00 2001 From: pawelaugustyn <26120235+pawelaugustyn@users.noreply.github.com> Date: Sun, 15 Feb 2026 22:59:17 +0100 Subject: [PATCH] feat: default account for new transactions --- app/apps/transactions/forms.py | 11 +++++++++ app/apps/users/forms.py | 24 +++++++++++++++++++ .../0024_usersettings_default_account.py | 20 ++++++++++++++++ app/apps/users/models.py | 6 +++++ 4 files changed, 61 insertions(+) create mode 100644 app/apps/users/migrations/0024_usersettings_default_account.py diff --git a/app/apps/transactions/forms.py b/app/apps/transactions/forms.py index f6f9b70..04fafe8 100644 --- a/app/apps/transactions/forms.py +++ b/app/apps/transactions/forms.py @@ -5,6 +5,7 @@ from apps.common.fields.forms.dynamic_select import ( DynamicModelChoiceField, DynamicModelMultipleChoiceField, ) +from apps.common.middleware.thread_local import get_current_user from apps.common.widgets.crispy.daisyui import Switch from apps.common.widgets.crispy.submit import NoClassSubmit from apps.common.widgets.datepicker import AirDatePickerInput, AirMonthYearPickerInput @@ -116,6 +117,9 @@ class TransactionForm(forms.ModelForm): self.fields["account"].queryset = Account.objects.filter( is_archived=False, ) + user_settings = get_current_user().settings + if user_settings.default_account: + self.fields["account"].initial = user_settings.default_account self.fields["category"].queryset = TransactionCategory.objects.filter( active=True @@ -768,6 +772,9 @@ class InstallmentPlanForm(forms.ModelForm): ).distinct() else: self.fields["account"].queryset = Account.objects.filter(is_archived=False) + user_settings = get_current_user().settings + if user_settings.default_account: + self.fields["account"].initial = user_settings.default_account self.fields["category"].queryset = TransactionCategory.objects.filter( active=True @@ -1010,6 +1017,10 @@ class RecurringTransactionForm(forms.ModelForm): ).distinct() else: self.fields["account"].queryset = Account.objects.filter(is_archived=False) + + user_settings = get_current_user().settings + if user_settings.default_account: + self.fields["account"].initial = user_settings.default_account self.fields["category"].queryset = TransactionCategory.objects.filter( active=True diff --git a/app/apps/users/forms.py b/app/apps/users/forms.py index e48aaac..71e1b5f 100644 --- a/app/apps/users/forms.py +++ b/app/apps/users/forms.py @@ -1,6 +1,8 @@ from apps.common.middleware.thread_local import get_current_user from apps.common.widgets.crispy.submit import NoClassSubmit +from apps.common.widgets.tom_select import TomSelect from apps.users.models import UserSettings +from apps.accounts.models import Account from crispy_forms.bootstrap import ( FormActions, ) @@ -116,6 +118,15 @@ class UserSettingsForm(forms.ModelForm): label=_("Number Format"), ) + default_account = forms.ModelChoiceField( + queryset=Account.objects.filter( + is_archived=False, + ), + label=_("Default Account"), + widget=TomSelect(clear_button=False, group_by="group"), + required=False, + ) + class Meta: model = UserSettings fields = [ @@ -126,11 +137,19 @@ class UserSettingsForm(forms.ModelForm): "datetime_format", "number_format", "volume", + "default_account", ] + widgets = { + "default_account": TomSelect(clear_button=False, group_by="group"), + } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.fields["default_account"].queryset = Account.objects.filter( + is_archived=False, + ) + self.helper = FormHelper() self.helper.form_tag = False self.helper.form_method = "post" @@ -141,6 +160,7 @@ class UserSettingsForm(forms.ModelForm): "date_format", "datetime_format", "number_format", + "default_account", HTML('