Resolve "Update API project list" (#409)

* refactoring models _to_serialize property

* updated project api members list

* addressing flake8: line too long
This commit is contained in:
Byron Ullauri 2018-12-26 13:07:09 -05:00 committed by Alexis Metaireau
parent 620596e32c
commit 7cb339c0bb
3 changed files with 47 additions and 32 deletions

View file

@ -13,11 +13,6 @@ db = SQLAlchemy()
class Project(db.Model): class Project(db.Model):
_to_serialize = (
"id", "name", "contact_email", "members", "active_members",
"balance"
)
id = db.Column(db.String(64), primary_key=True) id = db.Column(db.String(64), primary_key=True)
name = db.Column(db.UnicodeText) name = db.Column(db.UnicodeText)
@ -25,6 +20,23 @@ class Project(db.Model):
contact_email = db.Column(db.String(128)) contact_email = db.Column(db.String(128))
members = db.relationship("Person", backref="project") 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 @property
def active_members(self): def active_members(self):
return [m for m in self.members if m.activated] return [m for m in self.members if m.activated]
@ -276,8 +288,6 @@ class Person(db.Model):
query_class = PersonQuery query_class = PersonQuery
_to_serialize = ("id", "name", "weight", "activated")
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
project_id = db.Column(db.String(64), db.ForeignKey("project.id")) project_id = db.Column(db.String(64), db.ForeignKey("project.id"))
bills = db.relationship("Bill", backref="payer") bills = db.relationship("Bill", backref="payer")
@ -286,6 +296,15 @@ class Person(db.Model):
weight = db.Column(db.Float, default=1) weight = db.Column(db.Float, default=1)
activated = db.Column(db.Boolean, default=True) 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): def has_bills(self):
"""return if the user do have bills or not""" """return if the user do have bills or not"""
bills_as_ower_number = db.session.query(billowers)\ bills_as_ower_number = db.session.query(billowers)\
@ -330,9 +349,6 @@ class Bill(db.Model):
query_class = BillQuery query_class = BillQuery
_to_serialize = ("id", "payer_id", "owers", "amount", "date",
"creation_date", "what")
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
payer_id = db.Column(db.Integer, db.ForeignKey("person.id")) 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")) 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): def pay_each(self):
"""Compute what each share has to pay""" """Compute what each share has to pay"""
if self.owers: if self.owers:

View file

@ -1084,12 +1084,10 @@ class APITestCase(IhatemoneyTestCase):
self.assertTrue(200, resp.status_code) self.assertTrue(200, resp.status_code)
expected = { expected = {
"active_members": [], "members": [],
"name": "raclette", "name": "raclette",
"contact_email": "raclette@notmyidea.org", "contact_email": "raclette@notmyidea.org",
"members": [],
"id": "raclette", "id": "raclette",
"balance": {},
} }
decoded_resp = json.loads(resp.data.decode('utf-8')) decoded_resp = json.loads(resp.data.decode('utf-8'))
self.assertDictEqual(decoded_resp, expected) self.assertDictEqual(decoded_resp, expected)
@ -1108,12 +1106,10 @@ class APITestCase(IhatemoneyTestCase):
self.assertEqual(200, resp.status_code) self.assertEqual(200, resp.status_code)
expected = { expected = {
"active_members": [],
"name": "The raclette party", "name": "The raclette party",
"contact_email": "yeah@notmyidea.org", "contact_email": "yeah@notmyidea.org",
"members": [], "members": [],
"id": "raclette", "id": "raclette",
"balance": {},
} }
decoded_resp = json.loads(resp.data.decode('utf-8')) decoded_resp = json.loads(resp.data.decode('utf-8'))
self.assertDictEqual(decoded_resp, expected) self.assertDictEqual(decoded_resp, expected)
@ -1449,21 +1445,16 @@ class APITestCase(IhatemoneyTestCase):
headers=self.get_auth("raclette")) headers=self.get_auth("raclette"))
expected = { expected = {
"active_members": [ "members": [
{"activated": True, "id": 1, "name": "alexis", "weight": 1.0}, {"activated": True, "id": 1, "name": "alexis", "weight": 1.0, "balance": 20.0},
{"activated": True, "id": 2, "name": "freddy familly", "weight": 4.0}, {"activated": True, "id": 2, "name": "freddy familly", "weight": 4.0,
{"activated": True, "id": 3, "name": "arnaud", "weight": 1.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", "contact_email": "raclette@notmyidea.org",
"id": "raclette", "id": "raclette",
"name": "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"}
self.assertStatus(200, req) self.assertStatus(200, req)
decoded_req = json.loads(req.data.decode('utf-8')) decoded_req = json.loads(req.data.decode('utf-8'))

View file

@ -192,11 +192,7 @@ class IhmJSONEncoder(JSONEncoder):
Taken from the deprecated flask-rest package.""" Taken from the deprecated flask-rest package."""
def default(self, o): def default(self, o):
if hasattr(o, "_to_serialize"): if hasattr(o, "_to_serialize"):
# build up the object return o._to_serialize
data = {}
for attr in o._to_serialize:
data[attr] = getattr(o, attr)
return data
elif hasattr(o, "isoformat"): elif hasattr(o, "isoformat"):
return o.isoformat() return o.isoformat()
else: else: