nummi/nummi/transaction/forms.py
2025-01-03 18:50:50 +01:00

118 lines
3.3 KiB
Python

import json
from category.forms import CategorySelect
from main.forms import DatalistInput, NummiFileInput, NummiForm
from statement.forms import StatementSelect
from .models import Invoice, Transaction
from .utils import get_datalist
class TransactionForm(NummiForm):
class Meta:
model = Transaction
fields = [
"statement",
"name",
"value",
"date",
"real_date",
"category",
"trader",
"payment",
"description",
]
widgets = {
"statement": StatementSelect(),
"category": CategorySelect(),
"name": DatalistInput(),
"trader": DatalistInput(),
"payment": DatalistInput(),
}
meta_fieldsets = [
[
["statement"],
["name"],
["value"],
[
"date",
"real_date",
],
["category"],
["trader", "payment"],
],
[["description"]],
]
def __init__(self, *args, **kwargs):
_user = kwargs.get("user")
_disable_statement = kwargs.pop("disable_statement", False)
_autocomplete = kwargs.pop("autocomplete", False)
super().__init__(*args, **kwargs)
self.fields["category"].queryset = self.fields["category"].queryset.filter(
user=_user
)
self.fields["statement"].queryset = self.fields["statement"].queryset.filter(
user=_user
)
self.fields["name"].widget.options = get_datalist(_user, "name")
self.fields["trader"].widget.options = get_datalist(_user, "trader")
self.fields["payment"].widget.options = get_datalist(_user, "payment")
self.fields["category"].widget.attrs |= {
"class": "category",
"data-icons": json.dumps(
{
str(cat.id): cat.icon
for cat in self.fields["category"].queryset.only("id", "icon")
}
),
}
if _autocomplete:
self.autocomplete = {
"field": "name",
"data": {
t.name: [
{
"field": "value",
"value": t.value,
},
{
"field": "category",
"value": t.category.id if t.category else "",
},
{
"field": "trader",
"value": t.trader,
},
{
"field": "payment",
"value": t.payment,
},
]
for t in _user.transaction_set.order_by("name", "-date").distinct(
"name"
)
},
}
if _disable_statement:
self.fields["statement"].disabled = True
class InvoiceForm(NummiForm):
prefix = "invoice"
class Meta:
model = Invoice
fields = [
"name",
"file",
]
widgets = {
"file": NummiFileInput,
}