diff options
| author | Alexis M <alexis@notmyidea.org> | 2019-10-11 20:20:13 +0200 |
|---|---|---|
| committer | Alexis Metaireau <alexis@notmyidea.org> | 2019-10-14 21:20:38 +0200 |
| commit | f260a2c9e7b2f34d49ef4c2e50ce83a2361cf343 (patch) | |
| tree | dedf02275cb089fb2d954a668de6f8eff794036a /ihatemoney/models.py | |
| parent | f2a0b9f3f0e24617f698ce74943cdabdea01431e (diff) | |
| download | ihatemoney-mirror-f260a2c9e7b2f34d49ef4c2e50ce83a2361cf343.zip ihatemoney-mirror-f260a2c9e7b2f34d49ef4c2e50ce83a2361cf343.tar.gz ihatemoney-mirror-f260a2c9e7b2f34d49ef4c2e50ce83a2361cf343.tar.bz2 | |
Use black to refomat the files.
Diffstat (limited to 'ihatemoney/models.py')
| -rw-r--r-- | ihatemoney/models.py | 186 |
1 files changed, 108 insertions, 78 deletions
diff --git a/ihatemoney/models.py b/ihatemoney/models.py index 48e16a7..250f009 100644 --- a/ihatemoney/models.py +++ b/ihatemoney/models.py @@ -6,8 +6,12 @@ from flask import g, current_app from debts import settle from sqlalchemy import orm -from itsdangerous import (TimedJSONWebSignatureSerializer, URLSafeSerializer, - BadSignature, SignatureExpired) +from itsdangerous import ( + TimedJSONWebSignatureSerializer, + URLSafeSerializer, + BadSignature, + SignatureExpired, +) db = SQLAlchemy() @@ -33,8 +37,8 @@ class Project(db.Model): balance = self.balance for member in self.members: member_obj = member._to_serialize - member_obj['balance'] = balance.get(member.id, 0) - obj['members'].append(member_obj) + member_obj["balance"] = balance.get(member.id, 0) + obj["members"].append(member_obj) return obj @@ -45,14 +49,14 @@ class Project(db.Model): @property def balance(self): - balances, should_pay, should_receive = (defaultdict(int) - for time in (1, 2, 3)) + balances, should_pay, should_receive = (defaultdict(int) for time in (1, 2, 3)) # for each person for person in self.members: # get the list of bills he has to pay bills = Bill.query.options(orm.subqueryload(Bill.owers)).filter( - Bill.owers.contains(person)) + Bill.owers.contains(person) + ) for bill in bills.all(): if person != bill.payer: share = bill.pay_each() * person.weight @@ -72,18 +76,23 @@ class Project(db.Model): :return: one stat dict per member :rtype list: """ - return [{ - 'member': member, - 'paid': sum([ - bill.amount - for bill in self.get_member_bills(member.id).all() - ]), - 'spent': sum([ - bill.pay_each() * member.weight - for bill in self.get_bills().all() if member in bill.owers - ]), - 'balance': self.balance[member.id] - } for member in self.active_members] + return [ + { + "member": member, + "paid": sum( + [bill.amount for bill in self.get_member_bills(member.id).all()] + ), + "spent": sum( + [ + bill.pay_each() * member.weight + for bill in self.get_bills().all() + if member in bill.owers + ] + ), + "balance": self.balance[member.id], + } + for member in self.active_members + ] @property def uses_weights(self): @@ -99,22 +108,27 @@ class Project(db.Model): return transactions pretty_transactions = [] for transaction in transactions: - pretty_transactions.append({ - 'ower': transaction['ower'].name, - 'receiver': transaction['receiver'].name, - 'amount': round(transaction['amount'], 2) - }) + pretty_transactions.append( + { + "ower": transaction["ower"].name, + "receiver": transaction["receiver"].name, + "amount": round(transaction["amount"], 2), + } + ) return pretty_transactions # cache value for better performance members = {person.id: person for person in self.members} settle_plan = settle(self.balance.items()) or [] - transactions = [{ - 'ower': members[ower_id], - 'receiver': members[receiver_id], - 'amount': amount - } for ower_id, amount, receiver_id in settle_plan] + transactions = [ + { + "ower": members[ower_id], + "receiver": members[receiver_id], + "amount": amount, + } + for ower_id, amount, receiver_id in settle_plan + ] return prettify(transactions, pretty_output) @@ -140,23 +154,27 @@ class Project(db.Model): def get_bills(self): """Return the list of bills related to this project""" - return Bill.query.join(Person, Project)\ - .filter(Bill.payer_id == Person.id)\ - .filter(Person.project_id == Project.id)\ - .filter(Project.id == self.id)\ - .order_by(Bill.date.desc())\ - .order_by(Bill.creation_date.desc())\ + return ( + Bill.query.join(Person, Project) + .filter(Bill.payer_id == Person.id) + .filter(Person.project_id == Project.id) + .filter(Project.id == self.id) + .order_by(Bill.date.desc()) + .order_by(Bill.creation_date.desc()) .order_by(Bill.id.desc()) + ) def get_member_bills(self, member_id): """Return the list of bills related to a specific member""" - return Bill.query.join(Person, Project)\ - .filter(Bill.payer_id == Person.id)\ - .filter(Person.project_id == Project.id)\ - .filter(Person.id == member_id)\ - .filter(Project.id == self.id)\ - .order_by(Bill.date.desc())\ + return ( + Bill.query.join(Person, Project) + .filter(Bill.payer_id == Person.id) + .filter(Person.project_id == Project.id) + .filter(Person.id == member_id) + .filter(Project.id == self.id) + .order_by(Bill.date.desc()) .order_by(Bill.id.desc()) + ) def get_pretty_bills(self, export_format="json"): """Return a list of project's bills with pretty formatting""" @@ -166,16 +184,18 @@ class Project(db.Model): if export_format == "json": owers = [ower.name for ower in bill.owers] else: - owers = ', '.join([ower.name for ower in bill.owers]) - - pretty_bills.append({ - "what": bill.what, - "amount": round(bill.amount, 2), - "date": str(bill.date), - "payer_name": Person.query.get(bill.payer_id).name, - "payer_weight": Person.query.get(bill.payer_id).weight, - "owers": owers - }) + owers = ", ".join([ower.name for ower in bill.owers]) + + pretty_bills.append( + { + "what": bill.what, + "amount": round(bill.amount, 2), + "date": str(bill.date), + "payer_name": Person.query.get(bill.payer_id).name, + "payer_weight": Person.query.get(bill.payer_id).weight, + "owers": owers, + } + ) return pretty_bills def remove_member(self, member_id): @@ -210,12 +230,12 @@ class Project(db.Model): """ if expiration: serializer = TimedJSONWebSignatureSerializer( - current_app.config['SECRET_KEY'], - expiration) - token = serializer.dumps({'project_id': self.id}).decode('utf-8') + current_app.config["SECRET_KEY"], expiration + ) + token = serializer.dumps({"project_id": self.id}).decode("utf-8") else: - serializer = URLSafeSerializer(current_app.config['SECRET_KEY']) - token = serializer.dumps({'project_id': self.id}) + serializer = URLSafeSerializer(current_app.config["SECRET_KEY"]) + token = serializer.dumps({"project_id": self.id}) return token @staticmethod @@ -226,34 +246,40 @@ class Project(db.Model): :param token: Serialized TimedJsonWebToken """ if token_type == "timed_token": - serializer = TimedJSONWebSignatureSerializer(current_app.config['SECRET_KEY']) + serializer = TimedJSONWebSignatureSerializer( + current_app.config["SECRET_KEY"] + ) else: - serializer = URLSafeSerializer(current_app.config['SECRET_KEY']) + serializer = URLSafeSerializer(current_app.config["SECRET_KEY"]) try: data = serializer.loads(token) except SignatureExpired: return None except BadSignature: return None - return data['project_id'] + return data["project_id"] def __repr__(self): return "<Project %s>" % self.name class Person(db.Model): - class PersonQuery(BaseQuery): - def get_by_name(self, name, project): - return Person.query.filter(Person.name == name)\ - .filter(Project.id == project.id).one() + return ( + Person.query.filter(Person.name == name) + .filter(Project.id == project.id) + .one() + ) def get(self, id, project=None): if not project: project = g.project - return Person.query.filter(Person.id == id)\ - .filter(Project.id == project.id).one() + return ( + Person.query.filter(Person.id == id) + .filter(Project.id == project.id) + .one() + ) query_class = PersonQuery @@ -276,9 +302,11 @@ class Person(db.Model): def has_bills(self): """return if the user do have bills or not""" - bills_as_ower_number = db.session.query(billowers)\ - .filter(billowers.columns.get("person_id") == self.id)\ + bills_as_ower_number = ( + db.session.query(billowers) + .filter(billowers.columns.get("person_id") == self.id) .count() + ) return bills_as_ower_number != 0 or len(self.bills) != 0 def __str__(self): @@ -290,23 +318,24 @@ class Person(db.Model): # We need to manually define a join table for m2m relations billowers = db.Table( - 'billowers', - db.Column('bill_id', db.Integer, db.ForeignKey('bill.id')), - db.Column('person_id', db.Integer, db.ForeignKey('person.id')), + "billowers", + db.Column("bill_id", db.Integer, db.ForeignKey("bill.id")), + db.Column("person_id", db.Integer, db.ForeignKey("person.id")), ) class Bill(db.Model): - class BillQuery(BaseQuery): - def get(self, project, id): try: - return (self.join(Person, Project) - .filter(Bill.payer_id == Person.id) - .filter(Person.project_id == Project.id) - .filter(Project.id == project.id) - .filter(Bill.id == id).one()) + return ( + self.join(Person, Project) + .filter(Bill.payer_id == Person.id) + .filter(Person.project_id == Project.id) + .filter(Project.id == project.id) + .filter(Bill.id == id) + .one() + ) except orm.exc.NoResultFound: return None @@ -356,7 +385,8 @@ class Bill(db.Model): def __repr__(self): return "<Bill of %s from %s for %s>" % ( self.amount, - self.payer, ", ".join([o.name for o in self.owers]) + self.payer, + ", ".join([o.name for o in self.owers]), ) |
