aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJocelyn Delande <jocelyn@crapouillou.net>2015-08-20 11:11:09 +0200
committerJocelyn Delande <jocelyn@crapouillou.net>2016-06-15 10:20:37 +0200
commit06f10d050814e026ebac3ddedd2bec2d5d616eca (patch)
treefc7e31f3995c8ba6dc85e605d6fe7469738a2e9d
parent2b071a1a3bc752bfaa0fd6c0b2d8f8460721d6d8 (diff)
downloadihatemoney-mirror-06f10d050814e026ebac3ddedd2bec2d5d616eca.zip
ihatemoney-mirror-06f10d050814e026ebac3ddedd2bec2d5d616eca.tar.gz
ihatemoney-mirror-06f10d050814e026ebac3ddedd2bec2d5d616eca.tar.bz2
Added member weights support to API
-rw-r--r--budget/models.py4
-rw-r--r--budget/tests.py72
2 files changed, 68 insertions, 8 deletions
diff --git a/budget/models.py b/budget/models.py
index 16cc6c1..afd29f1 100644
--- a/budget/models.py
+++ b/budget/models.py
@@ -153,7 +153,7 @@ class Person(db.Model):
query_class = PersonQuery
- _to_serialize = ("id", "name", "activated")
+ _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"))
@@ -219,7 +219,7 @@ class Bill(db.Model):
archive = db.Column(db.Integer, db.ForeignKey("archive.id"))
def pay_each(self):
- """Compute what each person has to pay"""
+ """Compute what each share has to pay"""
if self.owers:
# FIXME: SQL might dot that more efficiently
return self.amount / sum(i.weight for i in self.owers)
diff --git a/budget/tests.py b/budget/tests.py
index 021b425..f4dfcce 100644
--- a/budget/tests.py
+++ b/budget/tests.py
@@ -583,9 +583,10 @@ class APITestCase(TestCase):
'contact_email': contact
})
- def api_add_member(self, project, name):
+ def api_add_member(self, project, name, weight=1):
self.app.post("/api/projects/%s/members" % project,
- data={"name": name}, headers=self.get_auth(project))
+ data={"name": name, "weight": weight},
+ headers=self.get_auth(project))
def get_auth(self, username, password=None):
password = password or username
@@ -792,8 +793,8 @@ class APITestCase(TestCase):
"what": "fromage",
"payer_id": 1,
"owers": [
- {"activated": True, "id": 1, "name": "alexis"},
- {"activated": True, "id": 2, "name": "fred"}],
+ {"activated": True, "id": 1, "name": "alexis", "weight": 1},
+ {"activated": True, "id": 2, "name": "fred", "weight": 1}],
"amount": 25.0,
"date": "2011-08-10",
"id": 1}
@@ -835,8 +836,8 @@ class APITestCase(TestCase):
"what": "beer",
"payer_id": 2,
"owers": [
- {"activated": True, "id": 1, "name": "alexis"},
- {"activated": True, "id": 2, "name": "fred"}],
+ {"activated": True, "id": 1, "name": "alexis", "weight": 1},
+ {"activated": True, "id": 2, "name": "fred", "weight": 1}],
"amount": 25.0,
"date": "2011-09-10",
"id": 1}
@@ -853,6 +854,65 @@ class APITestCase(TestCase):
headers=self.get_auth("raclette"))
self.assertStatus(404, req)
+ def test_weighted_bills(self):
+ # create a project
+ self.api_create("raclette")
+
+ # add members
+ self.api_add_member("raclette", "alexis")
+ self.api_add_member("raclette", "freddy familly", 4)
+ self.api_add_member("raclette", "arnaud")
+
+ # add a bill
+ req = self.app.post("/api/projects/raclette/bills", data={
+ 'date': '2011-08-10',
+ 'what': "fromage",
+ 'payer': "1",
+ 'payed_for': ["1", "2"],
+ 'amount': '25',
+ }, headers=self.get_auth("raclette"))
+
+ # get this bill details
+ req = self.app.get("/api/projects/raclette/bills/1",
+ headers=self.get_auth("raclette"))
+
+ # compare with the added info
+ self.assertStatus(200, req)
+ expected = {
+ "what": "fromage",
+ "payer_id": 1,
+ "owers": [
+ {"activated": True, "id": 1, "name": "alexis", "weight": 1},
+ {"activated": True, "id": 2, "name": "freddy familly", "weight": 4}],
+ "amount": 25.0,
+ "date": "2011-08-10",
+ "id": 1}
+ self.assertDictEqual(expected, json.loads(req.data))
+
+ # getting it should return a 404
+ req = self.app.get("/api/projects/raclette",
+ 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}
+ ],
+ "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",
+ "password": "raclette"}
+
+ self.assertStatus(200, req)
+ self.assertEqual(expected, json.loads(req.data))
class ServerTestCase(APITestCase):
def setUp(self):