diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index a1601a1..fdc4e46 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -1,9 +1,8 @@ -from category.models import Category from django.forms.widgets import TextInput from main.forms import NummiFileInput, NummiForm -from statement.models import Statement from .models import Invoice, Transaction +from .utils import get_datalist class TransactionForm(NummiForm): @@ -25,31 +24,16 @@ class TransactionForm(NummiForm): _user = kwargs.get("user") _disable_statement = kwargs.pop("disable_statement", False) super().__init__(*args, **kwargs) - self.fields["category"].queryset = Category.objects.filter(user=_user) - self.fields["statement"].queryset = Statement.objects.filter(user=_user) - self.fields["name"].widget = DatalistInput( - options=[ - t.name - for t in _user.transaction_set.exclude(name=None) - .order_by("name") - .distinct("name") - ] - ) + + self.fields["category"].queryset = _user.category_set + self.fields["statement"].queryset = _user.statement_set + + self.fields["name"].widget = DatalistInput(options=get_datalist(_user, "name")) self.fields["trader"].widget = DatalistInput( - options=[ - t.trader - for t in _user.transaction_set.exclude(trader=None) - .order_by("trader") - .distinct("trader") - ] + options=get_datalist(_user, "trader") ) self.fields["payment"].widget = DatalistInput( - options=[ - t.payment - for t in _user.transaction_set.exclude(payment=None) - .order_by("payment") - .distinct("payment") - ] + options=get_datalist(_user, "payment") ) if _disable_statement: self.fields["statement"].disabled = True diff --git a/nummi/transaction/utils.py b/nummi/transaction/utils.py index 399dcc2..359f7dd 100644 --- a/nummi/transaction/utils.py +++ b/nummi/transaction/utils.py @@ -1,3 +1,6 @@ +from django.db.models import Count + + def ac_url(url_name, url_params, context): if account := context.get("account"): url_name = "account_" + url_name @@ -7,3 +10,14 @@ def ac_url(url_name, url_params, context): url_params |= {"category": category.pk} return url_name, url_params + + +def get_datalist(user, field): + return [ + t[field] + for t in user.transaction_set.exclude(**{field: None}) + .values(field) + .order_by(field) + .annotate(n=Count(field)) + .order_by("-n") + ]