diff options
| author | Alexis Metaireau <alexis@notmyidea.org> | 2017-07-07 00:06:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-07 00:06:56 +0200 |
| commit | 3a4282fd75e3b3317b2b08b4aa2e6ac154310e73 (patch) | |
| tree | 9470c907ba1f884246af87d26d55c3aaac6d6dc5 /ihatemoney/api.py | |
| parent | 0e374cd5e0ef5a9be67084365f91de2ab84f636c (diff) | |
| download | ihatemoney-mirror-3a4282fd75e3b3317b2b08b4aa2e6ac154310e73.zip ihatemoney-mirror-3a4282fd75e3b3317b2b08b4aa2e6ac154310e73.tar.gz ihatemoney-mirror-3a4282fd75e3b3317b2b08b4aa2e6ac154310e73.tar.bz2 | |
Absolute imports & some other improvements (#243)
* Use absolute imports and rename package to ihatemoney
* Add a ihatemoney command
* Factorize application creation logic
* Refactor the tests
* Update the wsgi.py module with the new create_app() function
* Fix some styling thanks to Flake8.
* Automate Flake8 check in the CI.
Diffstat (limited to 'ihatemoney/api.py')
| -rw-r--r-- | ihatemoney/api.py | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/ihatemoney/api.py b/ihatemoney/api.py new file mode 100644 index 0000000..a34fa12 --- /dev/null +++ b/ihatemoney/api.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +from flask import Blueprint, request +from flask_rest import RESTResource, need_auth + +from ihatemoney.models import db, Project, Person, Bill +from ihatemoney.forms import (ProjectForm, EditProjectForm, MemberForm, + get_billform_for) + + +api = Blueprint("api", __name__, url_prefix="/api") + + +def check_project(*args, **kwargs): + """Check the request for basic authentication for a given project. + + Return the project if the authorization is good, False otherwise + """ + auth = request.authorization + + # project_id should be contained in kwargs and equal to the username + if auth and "project_id" in kwargs and \ + auth.username == kwargs["project_id"]: + project = Project.query.get(auth.username) + if project and project.password == auth.password: + return project + return False + + +class ProjectHandler(object): + + def add(self): + form = ProjectForm(meta={'csrf': False}) + if form.validate(): + project = form.save() + db.session.add(project) + db.session.commit() + return 201, project.id + return 400, form.errors + + @need_auth(check_project, "project") + def get(self, project): + return 200, project + + @need_auth(check_project, "project") + def delete(self, project): + db.session.delete(project) + db.session.commit() + return 200, "DELETED" + + @need_auth(check_project, "project") + def update(self, project): + form = EditProjectForm(meta={'csrf': False}) + if form.validate(): + form.update(project) + db.session.commit() + return 200, "UPDATED" + return 400, form.errors + + +class MemberHandler(object): + + def get(self, project, member_id): + member = Person.query.get(member_id, project) + if not member or member.project != project: + return 404, "Not Found" + return 200, member + + def list(self, project): + return 200, project.members + + def add(self, project): + form = MemberForm(project, meta={'csrf': False}) + if form.validate(): + member = Person() + form.save(project, member) + db.session.commit() + return 201, member.id + return 400, form.errors + + def update(self, project, member_id): + form = MemberForm(project, meta={'csrf': False}) + if form.validate(): + member = Person.query.get(member_id, project) + form.save(project, member) + db.session.commit() + return 200, member + return 400, form.errors + + def delete(self, project, member_id): + if project.remove_member(member_id): + return 200, "OK" + return 404, "Not Found" + + +class BillHandler(object): + + def get(self, project, bill_id): + bill = Bill.query.get(project, bill_id) + if not bill: + return 404, "Not Found" + return 200, bill + + def list(self, project): + return project.get_bills().all() + + def add(self, project): + form = get_billform_for(project, True, meta={'csrf': False}) + if form.validate(): + bill = Bill() + form.save(bill, project) + db.session.add(bill) + db.session.commit() + return 201, bill.id + return 400, form.errors + + def update(self, project, bill_id): + form = get_billform_for(project, True, meta={'csrf': False}) + if form.validate(): + bill = Bill.query.get(project, bill_id) + form.save(bill, project) + db.session.commit() + return 200, bill.id + return 400, form.errors + + def delete(self, project, bill_id): + bill = Bill.query.delete(project, bill_id) + db.session.commit() + if not bill: + return 404, "Not Found" + return 200, "OK" + + +project_resource = RESTResource( + name="project", + route="/projects", + app=api, + actions=["add", "update", "delete", "get"], + handler=ProjectHandler()) + +member_resource = RESTResource( + name="member", + inject_name="project", + route="/projects/<project_id>/members", + app=api, + handler=MemberHandler(), + authentifier=check_project) + +bill_resource = RESTResource( + name="bill", + inject_name="project", + route="/projects/<project_id>/bills", + app=api, + handler=BillHandler(), + authentifier=check_project) |
