Order datalist items by count

This commit is contained in:
Edgar P. Burkhart 2025-01-01 14:14:11 +01:00
parent f98990d0a8
commit 804b2b38e0
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
2 changed files with 22 additions and 24 deletions

View file

@ -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

View file

@ -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")
]