diff options
| author | Jocelyn Delalande <jocelyn@crapouillou.net> | 2018-02-03 18:52:04 +0100 |
|---|---|---|
| committer | Jocelyn Delalande <jocelyn@crapouillou.net> | 2018-02-07 00:06:08 +0100 |
| commit | b95ea7f4e68a0794a44e68621a8210bb4db43e67 (patch) | |
| tree | 161190c22b4c6257d3a6839d610d865e0b63aa09 | |
| parent | 036cd05e5716a694f575b3c65f6541f04a8b48bf (diff) | |
| download | ihatemoney-mirror-b95ea7f4e68a0794a44e68621a8210bb4db43e67.zip ihatemoney-mirror-b95ea7f4e68a0794a44e68621a8210bb4db43e67.tar.gz ihatemoney-mirror-b95ea7f4e68a0794a44e68621a8210bb4db43e67.tar.bz2 | |
Add statistics support to API
| -rw-r--r-- | CHANGELOG.rst | 5 | ||||
| -rw-r--r-- | docs/api.rst | 22 | ||||
| -rw-r--r-- | ihatemoney/api.py | 8 | ||||
| -rw-r--r-- | ihatemoney/tests/tests.py | 34 |
4 files changed, 69 insertions, 0 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst index ea2b61e..fccb08d 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -17,6 +17,11 @@ Fixed - Fix the "IOError" crash when running `ihatemoney generate-config` (#308) - Made the left-hand sidebar scrollable (#318) +Added +===== + +- Statistics API (#343) + 2.0 (2017-12-27) ---------------- diff --git a/docs/api.rst b/docs/api.rst index b82c6f3..0ae4214 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -164,3 +164,25 @@ And you can of course `DELETE` them at `/api/projects/<id>/bills/<bill-id>`:: $ curl --basic -u demo:demo -X DELETE\ https://ihatemoney.org/api/projects/demo/bills/80\ "OK" + + +Statistics +---------- + +You can get some project stats with a `GET` on `/api/projects/<id>/statistics`:: + + $ curl --basic -u demo:demo https://ihatemoney.org/api/projects/demo/statistics + [ + { + "balance": 12.5, + "member": {"activated": True, "id": 1, "name": "alexis", "weight": 1.0}, + "paid": 25.0, + "spent": 12.5 + }, + { + "balance": -12.5, + "member": {"activated": True, "id": 2, "name": "fred", "weight": 1.0}, + "paid": 0, + "spent": 12.5 + } + ] diff --git a/ihatemoney/api.py b/ihatemoney/api.py index 31ed06c..6068cf7 100644 --- a/ihatemoney/api.py +++ b/ihatemoney/api.py @@ -65,6 +65,13 @@ class ProjectHandler(Resource): return form.errors, 400 +class ProjectStatsHandler(Resource): + method_decorators = [need_auth] + + def get(self, project): + return project.members_stats + + class APIMemberForm(MemberForm): """ Member is not disablable via a Form. @@ -163,6 +170,7 @@ class BillHandler(Resource): restful_api.add_resource(ProjectsHandler, '/projects') restful_api.add_resource(ProjectHandler, '/projects/<string:project_id>') restful_api.add_resource(MembersHandler, "/projects/<string:project_id>/members") +restful_api.add_resource(ProjectStatsHandler, "/projects/<string:project_id>/statistics") restful_api.add_resource(MemberHandler, "/projects/<string:project_id>/members/<int:member_id>") restful_api.add_resource(BillsHandler, "/projects/<string:project_id>/bills") restful_api.add_resource(BillHandler, "/projects/<string:project_id>/bills/<int:bill_id>") diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py index 3582032..3797f09 100644 --- a/ihatemoney/tests/tests.py +++ b/ihatemoney/tests/tests.py @@ -1325,6 +1325,40 @@ class APITestCase(IhatemoneyTestCase): headers=self.get_auth("raclette")) self.assertStatus(404, req) + def test_statistics(self): + # create a project + self.api_create("raclette") + + # add members + self.api_add_member("raclette", "alexis") + self.api_add_member("raclette", "fred") + + # add a bill + req = self.client.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 the list of bills (should be empty) + req = self.client.get("/api/projects/raclette/statistics", + headers=self.get_auth("raclette")) + self.assertStatus(200, req) + self.assertEqual([ + {'balance': 12.5, + 'member': {'activated': True, 'id': 1, + 'name': 'alexis', 'weight': 1.0}, + 'paid': 25.0, + 'spent': 12.5}, + {'balance': -12.5, + 'member': {'activated': True, 'id': 2, + 'name': 'fred', 'weight': 1.0}, + 'paid': 0, + 'spent': 12.5}], + json.loads(req.data.decode('utf-8'))) + def test_username_xss(self): # create a project # self.api_create("raclette") |
