From 7cb339c0bb8aacaeae47838a68c7af60cf414618 Mon Sep 17 00:00:00 2001 From: Byron Ullauri Date: Wed, 26 Dec 2018 13:07:09 -0500 Subject: [PATCH] Resolve "Update API project list" (#409) * refactoring models _to_serialize property * updated project api members list * addressing flake8: line too long --- ihatemoney/models.py | 48 +++++++++++++++++++++++++++++++-------- ihatemoney/tests/tests.py | 25 +++++++------------- ihatemoney/utils.py | 6 +---- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/ihatemoney/models.py b/ihatemoney/models.py index 9e9fbeb8..3c36e76c 100644 --- a/ihatemoney/models.py +++ b/ihatemoney/models.py @@ -13,11 +13,6 @@ db = SQLAlchemy() class Project(db.Model): - _to_serialize = ( - "id", "name", "contact_email", "members", "active_members", - "balance" - ) - id = db.Column(db.String(64), primary_key=True) name = db.Column(db.UnicodeText) @@ -25,6 +20,23 @@ class Project(db.Model): contact_email = db.Column(db.String(128)) members = db.relationship("Person", backref="project") + @property + def _to_serialize(self): + obj = { + "id": self.id, + "name": self.name, + "contact_email": self.contact_email, + "members": [], + } + + 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) + + return obj + @property def active_members(self): return [m for m in self.members if m.activated] @@ -276,8 +288,6 @@ class Person(db.Model): query_class = PersonQuery - _to_serialize = ("id", "name", "weight", "activated") - id = db.Column(db.Integer, primary_key=True) project_id = db.Column(db.String(64), db.ForeignKey("project.id")) bills = db.relationship("Bill", backref="payer") @@ -286,6 +296,15 @@ class Person(db.Model): weight = db.Column(db.Float, default=1) activated = db.Column(db.Boolean, default=True) + @property + def _to_serialize(self): + return { + "id": self.id, + "name": self.name, + "weight": self.weight, + "activated": self.activated, + } + def has_bills(self): """return if the user do have bills or not""" bills_as_ower_number = db.session.query(billowers)\ @@ -330,9 +349,6 @@ class Bill(db.Model): query_class = BillQuery - _to_serialize = ("id", "payer_id", "owers", "amount", "date", - "creation_date", "what") - id = db.Column(db.Integer, primary_key=True) payer_id = db.Column(db.Integer, db.ForeignKey("person.id")) @@ -345,6 +361,18 @@ class Bill(db.Model): archive = db.Column(db.Integer, db.ForeignKey("archive.id")) + @property + def _to_serialize(self): + return { + "id": self.id, + "payer_id": self.payer_id, + "owers": self.owers, + "amount": self.amount, + "date": self.date, + "creation_date": self.creation_date, + "what": self.what, + } + def pay_each(self): """Compute what each share has to pay""" if self.owers: diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py index 17b3a8d9..2f3d4ac2 100644 --- a/ihatemoney/tests/tests.py +++ b/ihatemoney/tests/tests.py @@ -1084,12 +1084,10 @@ class APITestCase(IhatemoneyTestCase): self.assertTrue(200, resp.status_code) expected = { - "active_members": [], + "members": [], "name": "raclette", "contact_email": "raclette@notmyidea.org", - "members": [], "id": "raclette", - "balance": {}, } decoded_resp = json.loads(resp.data.decode('utf-8')) self.assertDictEqual(decoded_resp, expected) @@ -1108,12 +1106,10 @@ class APITestCase(IhatemoneyTestCase): self.assertEqual(200, resp.status_code) expected = { - "active_members": [], "name": "The raclette party", "contact_email": "yeah@notmyidea.org", "members": [], "id": "raclette", - "balance": {}, } decoded_resp = json.loads(resp.data.decode('utf-8')) self.assertDictEqual(decoded_resp, expected) @@ -1449,21 +1445,16 @@ class APITestCase(IhatemoneyTestCase): headers=self.get_auth("raclette")) expected = { - "active_members": [ - {"activated": True, "id": 1, "name": "alexis", "weight": 1.0}, - {"activated": True, "id": 2, "name": "freddy familly", "weight": 4.0}, - {"activated": True, "id": 3, "name": "arnaud", "weight": 1.0} + "members": [ + {"activated": True, "id": 1, "name": "alexis", "weight": 1.0, "balance": 20.0}, + {"activated": True, "id": 2, "name": "freddy familly", "weight": 4.0, + "balance": -20.0}, + {"activated": True, "id": 3, "name": "arnaud", "weight": 1.0, "balance": 0}, ], - "balance": {"1": 20.0, "2": -20.0, "3": 0}, "contact_email": "raclette@notmyidea.org", "id": "raclette", - - "members": [ - {"activated": True, "id": 1, "name": "alexis", "weight": 1.0}, - {"activated": True, "id": 2, "name": "freddy familly", "weight": 4.0}, - {"activated": True, "id": 3, "name": "arnaud", "weight": 1.0} - ], - "name": "raclette"} + "name": "raclette", + } self.assertStatus(200, req) decoded_req = json.loads(req.data.decode('utf-8')) diff --git a/ihatemoney/utils.py b/ihatemoney/utils.py index 19340df8..ec228343 100644 --- a/ihatemoney/utils.py +++ b/ihatemoney/utils.py @@ -192,11 +192,7 @@ class IhmJSONEncoder(JSONEncoder): Taken from the deprecated flask-rest package.""" def default(self, o): if hasattr(o, "_to_serialize"): - # build up the object - data = {} - for attr in o._to_serialize: - data[attr] = getattr(o, attr) - return data + return o._to_serialize elif hasattr(o, "isoformat"): return o.isoformat() else: