From 72320c19d7ab74040a8f1895dbfedf7598cd84a1 Mon Sep 17 00:00:00 2001 From: chestnutFan Date: Mon, 12 Dec 2022 00:11:12 -0500 Subject: [PATCH] Moved the check function to the model --- ihatemoney/models.py | 16 ++++++++++++++++ ihatemoney/web.py | 22 ++++++---------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/ihatemoney/models.py b/ihatemoney/models.py index c591b85b..313090fc 100644 --- a/ihatemoney/models.py +++ b/ihatemoney/models.py @@ -752,6 +752,22 @@ class Bill(db.Model): else: return 0 + def involves_deactivated_members(self, project): + """Check whether the bill contains deactivated member. + Return: + True if it contains deactivated member, + False if not. + """ + owers_id = [int(m.id) for m in self.owers] + bill_member_id_list = owers_id + [self.payer_id] + deactivated_member_number = ( + Person.query.filter(Person.id.in_(bill_member_id_list)) + .filter(Person.project_id == project.id) + .filter(Person.activated == False) + .count() + ) + return deactivated_member_number != 0 + def __str__(self): return self.what diff --git a/ihatemoney/web.py b/ihatemoney/web.py index a3f44389..58b0580f 100644 --- a/ihatemoney/web.py +++ b/ihatemoney/web.py @@ -800,13 +800,8 @@ def delete_bill(bill_id): if not bill: return redirect(url_for(".list_bills")) - # Prevent deleting if the bill involves deactivated user. - active_member_id = [m.id for m in g.project.active_members] - owers_id = [int(m.id) for m in bill.owers] - deactivated_members = set([bill.payer_id] + owers_id).difference( - set(active_member_id) - ) - if len(deactivated_members): + # Check if the bill contains deactivated member. If yes, stop deleting. + if bill.involves_deactivated_members(g.project): flash( _("Deactivated users involved. This bill cannot be deleted."), category="warning", @@ -827,21 +822,16 @@ def edit_bill(bill_id): if not bill: raise NotFound() - form = get_billform_for(g.project, set_default=False) - - # Prevent editing if the bill involves deactivated user. - active_member_id = [m.id for m in g.project.active_members] - owers_id = [int(m.id) for m in bill.owers] - deactivated_members = set([bill.payer_id] + owers_id).difference( - set(active_member_id) - ) - if len(deactivated_members): + # Check if the bill contains deactivated member. If yes, stop editing. + if bill.involves_deactivated_members(g.project): flash( _("Deactivated users involved. This bill cannot be edited."), category="warning", ) return redirect(url_for(".list_bills")) + form = get_billform_for(g.project, set_default=False) + if request.method == "POST" and form.validate(): form.save(bill, g.project) db.session.commit()