nummi/nummi/transaction/forms.py

147 lines
4.1 KiB
Python

import json
from category.forms import CategorySelect
from django import forms
from django.forms import formset_factory
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.pop("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
self.fields["statement"].widget.attrs["hidden"] = True
class InvoiceForm(NummiForm):
prefix = "invoice"
class Meta:
model = Invoice
fields = [
"name",
"file",
]
widgets = {
"file": NummiFileInput,
}
class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True
class MultipleFileField(forms.FileField):
def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", MultipleFileInput())
super().__init__(*args, **kwargs)
def clean(self, data, initial=None):
single_file_clean = super().clean
if isinstance(data, (list, tuple)):
result = [single_file_clean(d, initial) for d in data]
else:
result = single_file_clean(data, initial)
return result
class MultipleInvoicesForm(forms.Form):
prefix = "invoices"
invoices = MultipleFileField()
InvoicesFormSet = formset_factory(MultipleInvoicesForm)