Moved the logic in the make_txn_form_from_post() utility to the constructor of the transaction form, and moved the logic in the make_txn_form_from_status() utility to the txn_form view, and applied the standardized control flow to the txn_form view in the accounting application.
This commit is contained in:
parent
5e8e8e815e
commit
0996fa59f8
@ -34,7 +34,7 @@ class RecordForm(forms.Form):
|
||||
"""An accounting record form.
|
||||
|
||||
Attributes:
|
||||
transaction (Transaction|None): The current transaction or None.
|
||||
txn_form (TransactionForm): The parent transaction form.
|
||||
is_credit (bool): Whether this is a credit record.
|
||||
"""
|
||||
id = forms.IntegerField(
|
||||
@ -64,7 +64,7 @@ class RecordForm(forms.Form):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.transaction = None
|
||||
self.txn_form = None
|
||||
self.is_credit = None
|
||||
|
||||
def account_title(self):
|
||||
@ -109,7 +109,7 @@ class RecordForm(forms.Form):
|
||||
"""
|
||||
if "id" in self.errors:
|
||||
return
|
||||
if self.transaction is None:
|
||||
if self.txn_form.transaction is None:
|
||||
if "id" in self.data:
|
||||
raise forms.ValidationError(
|
||||
_("This record is not for this transaction."),
|
||||
@ -117,7 +117,7 @@ class RecordForm(forms.Form):
|
||||
else:
|
||||
if "id" in self.data:
|
||||
record = Record.objects.get(pk=self.data["id"])
|
||||
if record.transaction.pk != self.transaction.pk:
|
||||
if record.transaction.pk != self.txn_form.transaction.pk:
|
||||
raise forms.ValidationError(
|
||||
_("This record is not for this transaction."),
|
||||
code="not_belong")
|
||||
@ -192,10 +192,45 @@ class TransactionForm(forms.Form):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.txn_type = None
|
||||
self.transaction = None
|
||||
# Populates the belonging record forms
|
||||
self.debit_records = []
|
||||
self.credit_records = []
|
||||
if len(args) > 0 and isinstance(args[0], dict):
|
||||
by_rec_id = {}
|
||||
for key in args[0].keys():
|
||||
m = re.match(
|
||||
("^((debit|credit)-([1-9][0-9]*))-"
|
||||
"(id|ord|account|summary|amount)$"),
|
||||
key)
|
||||
if m is None:
|
||||
continue
|
||||
rec_id = m.group(1)
|
||||
column = m.group(4)
|
||||
if rec_id not in by_rec_id:
|
||||
by_rec_id[rec_id] = {
|
||||
"is_credit": m.group(2) == "credit",
|
||||
"no": int(m.group(3)),
|
||||
"data": {},
|
||||
}
|
||||
by_rec_id[rec_id]["data"][column] = args[0][key]
|
||||
debit_data_list = [x for x in by_rec_id.values()
|
||||
if not x["is_credit"]]
|
||||
debit_data_list.sort(key=lambda x: x["no"])
|
||||
for x in debit_data_list:
|
||||
record_form = RecordForm(x["data"])
|
||||
record_form.txn_form = self
|
||||
record_form.is_credit = False
|
||||
self.debit_records.append(record_form)
|
||||
credit_data_list = [x for x in by_rec_id.values()
|
||||
if x["is_credit"]]
|
||||
credit_data_list.sort(key=lambda x: x["no"])
|
||||
for x in credit_data_list:
|
||||
record_form = RecordForm(x["data"])
|
||||
record_form.txn_form = self
|
||||
record_form.is_credit = True
|
||||
self.credit_records.append(record_form)
|
||||
self.txn_type = None
|
||||
self.transaction = None
|
||||
|
||||
def clean(self):
|
||||
"""Validates the form globally.
|
||||
|
@ -641,7 +641,7 @@ def make_txn_form_from_model(txn_type, txn):
|
||||
except ObjectDoesNotExist:
|
||||
pass
|
||||
record_form = RecordForm(data)
|
||||
record_form.transaction = form.transaction
|
||||
record_form.txn_form = form
|
||||
record_form.is_credit = record.is_credit
|
||||
if record.is_credit:
|
||||
form.credit_records.append(record_form)
|
||||
@ -650,62 +650,6 @@ def make_txn_form_from_model(txn_type, txn):
|
||||
return form
|
||||
|
||||
|
||||
def make_txn_form_from_post(post, txn_type, txn):
|
||||
"""Converts the POSTed data to a transaction form.
|
||||
|
||||
Args:
|
||||
post (dict[str]): The POSTed data.
|
||||
txn_type (str): The transaction type.
|
||||
txn (Transaction|None): The current transaction, or None
|
||||
if there is no current transaction.
|
||||
|
||||
Returns:
|
||||
TransactionForm: The transaction form.
|
||||
"""
|
||||
form = TransactionForm(
|
||||
{x: post[x] for x in ("date", "notes") if x in post})
|
||||
form.transaction = txn
|
||||
form.txn_type = txn_type
|
||||
# The records
|
||||
max_no = _find_max_record_no(txn_type, post)
|
||||
for record_type in max_no.keys():
|
||||
records = []
|
||||
is_credit = (record_type == "credit")
|
||||
for i in range(max_no[record_type]):
|
||||
no = i + 1
|
||||
record_form = RecordForm(
|
||||
{x: post[F"{record_type}-{no}-{x}"]
|
||||
for x in ["id", "account", "summary", "amount"]
|
||||
if F"{record_type}-{no}-{x}" in post})
|
||||
record_form.transaction = form.transaction
|
||||
record_form.is_credit = is_credit
|
||||
records.append(record_form)
|
||||
if record_type == "debit":
|
||||
form.debit_records = records
|
||||
else:
|
||||
form.credit_records = records
|
||||
return form
|
||||
|
||||
|
||||
def make_txn_form_from_status(request, txn_type, txn):
|
||||
"""Converts the previously-stored status to a transaction form.
|
||||
|
||||
Args:
|
||||
request (HttpRequest): The request.
|
||||
txn_type (str): The transaction type.
|
||||
txn (Transaction|None): The current transaction, or None
|
||||
if there is no current transaction.
|
||||
|
||||
Returns:
|
||||
TransactionForm: The transaction form, or None if there is no
|
||||
previously-stored status.
|
||||
"""
|
||||
form = stored_post.get_previous_post(request)
|
||||
if form is None:
|
||||
return None
|
||||
return make_txn_form_from_post(form, txn_type, txn)
|
||||
|
||||
|
||||
def _find_max_record_no(txn_type, post):
|
||||
"""Finds the max debit and record numbers from the POSTed form.
|
||||
|
||||
|
@ -820,14 +820,17 @@ def txn_form(request, txn_type, txn=None):
|
||||
Returns:
|
||||
HttpResponse: The response.
|
||||
"""
|
||||
form = utils.make_txn_form_from_status(request, txn_type, txn)
|
||||
if form is None:
|
||||
if txn is None:
|
||||
form = TransactionForm()
|
||||
form.debit_records.append(RecordForm())
|
||||
form.credit_records.append(RecordForm())
|
||||
else:
|
||||
form = utils.make_txn_form_from_model(txn_type, txn)
|
||||
previous_post = stored_post.get_previous_post(request)
|
||||
if previous_post is not None:
|
||||
form = TransactionForm(previous_post)
|
||||
elif txn is not None:
|
||||
form = utils.make_txn_form_from_model(txn_type, txn)
|
||||
else:
|
||||
form = TransactionForm()
|
||||
form.debit_records.append(RecordForm())
|
||||
form.credit_records.append(RecordForm())
|
||||
form.transaction = txn
|
||||
form.txn_type = txn_type
|
||||
new_record_context = {"record": RecordForm(),
|
||||
"record_type": "TTT",
|
||||
"no": "NNN",
|
||||
@ -863,7 +866,10 @@ def txn_store(request, txn_type, txn=None):
|
||||
post = request.POST.dict()
|
||||
strip_post(post)
|
||||
utils.sort_post_txn_records(post)
|
||||
form = utils.make_txn_form_from_post(post, txn_type, txn)
|
||||
form = TransactionForm(post)
|
||||
form.transaction = txn
|
||||
form.txn_type = txn_type
|
||||
#form = utils.make_txn_form_from_post(post, txn_type, txn)
|
||||
if not form.is_valid():
|
||||
if txn is None:
|
||||
url = reverse("accounting:transactions.create", args=(txn_type,))
|
||||
|
Loading…
Reference in New Issue
Block a user