mirror of
https://github.com/spiral-project/ihatemoney.git
synced 2025-04-30 18:22:38 +02:00
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:
parent
620596e32c
commit
7cb339c0bb
3 changed files with 47 additions and 32 deletions
|
@ -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:
|
||||||
|
|
|
@ -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'))
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue