diff --git a/ihatemoney/forms.py b/ihatemoney/forms.py index 0fee9779..485867a2 100644 --- a/ihatemoney/forms.py +++ b/ihatemoney/forms.py @@ -14,6 +14,8 @@ from wtforms.fields import ( BooleanField, DateField, DecimalField, + HiddenField, + IntegerField, Label, PasswordField, SelectField, @@ -437,6 +439,22 @@ class BillForm(FlaskForm): raise ValidationError(msg) +class HiddenCommaDecimalField(HiddenField, CommaDecimalField): + pass + + +class HiddenIntegerField(HiddenField, IntegerField): + pass + + +class SettlementForm(FlaskForm): + """Used internally for validation, not directly visible to users""" + + amount = HiddenCommaDecimalField("Amount", validators=[DataRequired()]) + sender_id = HiddenIntegerField("Sender", validators=[DataRequired()]) + receiver_id = HiddenIntegerField("Receiver", validators=[DataRequired()]) + + class MemberForm(FlaskForm): name = StringField(_("Name"), validators=[DataRequired()], filters=[strip_filter]) diff --git a/ihatemoney/templates/settle_bills.html b/ihatemoney/templates/settle_bills.html index f4043621..f344c075 100644 --- a/ihatemoney/templates/settle_bills.html +++ b/ihatemoney/templates/settle_bills.html @@ -18,14 +18,24 @@ {{ transaction.amount|currency }} +
+ {{ settlement_form.csrf_token }} + {{ settlement_form.amount(value=transaction.amount) }} + {{ settlement_form.sender_id(value=transaction.ower.id) }} + {{ settlement_form.receiver_id(value=transaction.receiver.id) }} + +
-
{{ ("Settle") }}
diff --git a/ihatemoney/tests/budget_test.py b/ihatemoney/tests/budget_test.py index a3fc813f..9899aad6 100644 --- a/ihatemoney/tests/budget_test.py +++ b/ihatemoney/tests/budget_test.py @@ -1358,23 +1358,25 @@ class TestBudget(IhatemoneyTestCase): count = 0 for t in transactions: count += 1 - self.client.get( - "/raclette/settle" - + "/" - + str(t["amount"]) - + "/" - + str(t["ower"].id) - + "/" - + str(t["receiver"].id) + self.client.post( + "/raclette/settle", + data={ + "amount": t["amount"], + "sender_id": t["ower"].id, + "receiver_id": t["receiver"].id, + }, ) temp_transactions = project.get_transactions_to_settle_bill() # test if the one has disappeared assert len(temp_transactions) == len(transactions) - count - # test if theres a new one with bill_type reimbursement + # test if there is a new one with bill_type reimbursement bill = project.get_newest_bill() assert bill.bill_type == models.BillType.REIMBURSEMENT - return + + # There should be no more settlement to do at the end + transactions = project.get_transactions_to_settle_bill() + assert len(transactions) == 0 def test_settle_zero(self): self.post_project("raclette") diff --git a/ihatemoney/web.py b/ihatemoney/web.py index cb1bea56..23a749c7 100644 --- a/ihatemoney/web.py +++ b/ihatemoney/web.py @@ -56,6 +56,7 @@ from ihatemoney.forms import ( ProjectForm, ProjectFormWithCaptcha, ResetPasswordForm, + SettlementForm, get_billform_for, ) from ihatemoney.history import get_history, get_history_queries, purge_history @@ -853,16 +854,32 @@ def change_lang(lang): def settle_bill(): """Compute the sum each one have to pay to each other and display it""" transactions = g.project.get_transactions_to_settle_bill() - return render_template("settle_bills.html", transactions=transactions, current_view="settle_bill") + settlement_form = SettlementForm() + return render_template( + "settle_bills.html", + transactions=transactions, + settlement_form=settlement_form, + current_view="settle_bill", + ) + + +@main.route("//settle", methods=["POST"]) +def add_settlement_bill(): + """Create a bill to register a settlement""" + form = SettlementForm(id=g.project.id) + if not form.validate(): + flash( + format_form_errors(form, _("Error creating settlement bill")), + category="danger", + ) + return redirect(url_for(".settle_bill")) -@main.route("//settle///") -def add_settlement_bill(amount, sender_id, receiver_id): settlement = Bill( - amount=float(amount), + amount=form.amount.data, date=datetime.datetime.today(), - owers=[Person.query.get(receiver_id)], - payer_id=sender_id, + owers=[Person.query.get(form.receiver_id.data)], + payer_id=form.sender_id.data, project_default_currency=g.project.default_currency, bill_type=BillType.REIMBURSEMENT, what=_("Settlement"),