mirror of
https://github.com/YunoHost-Apps/ihatemoney_ynh.git
synced 2024-09-03 19:26:15 +02:00
API: Create and Update support
This commit is contained in:
parent
8528526f0b
commit
b0d41291af
5 changed files with 100 additions and 37 deletions
|
@ -2,6 +2,7 @@
|
||||||
from flask import *
|
from flask import *
|
||||||
|
|
||||||
from models import db, Project, Person, Bill
|
from models import db, Project, Person, Bill
|
||||||
|
from forms import ProjectForm
|
||||||
from utils import for_all_methods
|
from utils import for_all_methods
|
||||||
|
|
||||||
from rest import RESTResource, need_auth# FIXME make it an ext
|
from rest import RESTResource, need_auth# FIXME make it an ext
|
||||||
|
@ -21,7 +22,7 @@ def check_project(*args, **kwargs):
|
||||||
if auth and "project_id" in kwargs and \
|
if auth and "project_id" in kwargs and \
|
||||||
auth.username == kwargs["project_id"]:
|
auth.username == kwargs["project_id"]:
|
||||||
project = Project.query.get(auth.username)
|
project = Project.query.get(auth.username)
|
||||||
if project.password == auth.password:
|
if project and project.password == auth.password:
|
||||||
return project
|
return project
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -29,7 +30,13 @@ def check_project(*args, **kwargs):
|
||||||
class ProjectHandler(object):
|
class ProjectHandler(object):
|
||||||
|
|
||||||
def add(self):
|
def add(self):
|
||||||
pass
|
form = ProjectForm(csrf_enabled=False)
|
||||||
|
if form.validate():
|
||||||
|
project = form.save(Project())
|
||||||
|
db.session.add(project)
|
||||||
|
db.session.commit()
|
||||||
|
return 201, project.id
|
||||||
|
return 400, form.errors
|
||||||
|
|
||||||
@need_auth(check_project, "project")
|
@need_auth(check_project, "project")
|
||||||
def get(self, project):
|
def get(self, project):
|
||||||
|
@ -37,11 +44,18 @@ class ProjectHandler(object):
|
||||||
|
|
||||||
@need_auth(check_project, "project")
|
@need_auth(check_project, "project")
|
||||||
def delete(self, project):
|
def delete(self, project):
|
||||||
return "delete"
|
db.session.delete(project)
|
||||||
|
db.session.commit()
|
||||||
|
return 200, "DELETED"
|
||||||
|
|
||||||
@need_auth(check_project, "project")
|
@need_auth(check_project, "project")
|
||||||
def update(self, project):
|
def update(self, project):
|
||||||
return "update"
|
form = ProjectForm(csrf_enabled=False)
|
||||||
|
if form.validate():
|
||||||
|
form.save(project)
|
||||||
|
db.session.commit()
|
||||||
|
return 200, "UPDATED"
|
||||||
|
return 400, form.errors
|
||||||
|
|
||||||
|
|
||||||
class MemberHandler(object):
|
class MemberHandler(object):
|
||||||
|
@ -49,23 +63,34 @@ class MemberHandler(object):
|
||||||
def get(self, project, member_id):
|
def get(self, project, member_id):
|
||||||
member = Person.query.get(member_id)
|
member = Person.query.get(member_id)
|
||||||
if not member or member.project != project:
|
if not member or member.project != project:
|
||||||
return Response('Not Found', status=404)
|
return 404, "Not Found"
|
||||||
return member
|
return member
|
||||||
|
|
||||||
def list(self, project):
|
def list(self, project):
|
||||||
return project.members
|
return project.members
|
||||||
|
|
||||||
def add(self, project):
|
def add(self, project):
|
||||||
pass
|
form = MemberForm(csrf_enabled=False)
|
||||||
|
if form.validate():
|
||||||
|
member = Person()
|
||||||
|
form.save(project, member)
|
||||||
|
db.session.commit()
|
||||||
|
return 200, member.id
|
||||||
|
return 400, form.errors
|
||||||
|
|
||||||
def update(self, project, member_id):
|
def update(self, project, member_id):
|
||||||
pass
|
form = MemberForm(csrf_enabled=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):
|
def delete(self, project, member_id):
|
||||||
if project.remove_member(member_id):
|
if project.remove_member(member_id):
|
||||||
return Response('OK', status=200)
|
return 200, "OK"
|
||||||
else:
|
return 404, "Not Found"
|
||||||
return Response('Not Found', status=404)
|
|
||||||
|
|
||||||
|
|
||||||
class BillHandler(object):
|
class BillHandler(object):
|
||||||
|
@ -73,22 +98,34 @@ class BillHandler(object):
|
||||||
def get(self, project, bill_id):
|
def get(self, project, bill_id):
|
||||||
bill = Bill.query.get(project, bill_id)
|
bill = Bill.query.get(project, bill_id)
|
||||||
if not bill:
|
if not bill:
|
||||||
return Response('Not Found', status=404)
|
return 404, "Not Found"
|
||||||
return bill
|
return bill
|
||||||
|
|
||||||
def list(self, project):
|
def list(self, project):
|
||||||
return project.get_bills().all()
|
return project.get_bills().all()
|
||||||
|
|
||||||
def add(self, project):
|
def add(self, project):
|
||||||
pass
|
form = BillForm(csrf_enabled=False)
|
||||||
|
if form.validate():
|
||||||
|
bill = Bill()
|
||||||
|
form.save(bill)
|
||||||
|
db.session.add(bill)
|
||||||
|
db.session.commit()
|
||||||
|
return 200, bill.id
|
||||||
|
return 400, form.errors
|
||||||
|
|
||||||
def update(self, project, bill_id):
|
def update(self, project, bill_id):
|
||||||
pass
|
form = BillForm(csrf_enabled=False)
|
||||||
|
if form.validate():
|
||||||
|
form.save(bill)
|
||||||
|
db.session.commit()
|
||||||
|
return 200, bill.id
|
||||||
|
return 400, form.errors
|
||||||
|
|
||||||
def delete(self, project, bill_id):
|
def delete(self, project, bill_id):
|
||||||
bill = Bill.query.delete(project, bill_id)
|
bill = Bill.query.delete(project, bill_id)
|
||||||
if not bill:
|
if not bill:
|
||||||
return Response('Not Found', status=404)
|
return 404, "Not Found"
|
||||||
return bill
|
return bill
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from flaskext.wtf import *
|
from flaskext.wtf import *
|
||||||
from wtforms.widgets import html_params
|
from wtforms.widgets import html_params
|
||||||
from models import Project, Person, Bill
|
from models import Project, Person, Bill, db
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,6 +39,15 @@ class ProjectForm(Form):
|
||||||
contact_email=self.contact_email.data)
|
contact_email=self.contact_email.data)
|
||||||
return project
|
return project
|
||||||
|
|
||||||
|
def update(self, project):
|
||||||
|
"""Update the project with the information from the form"""
|
||||||
|
project.name = self.name.data
|
||||||
|
project.id = self.id.data
|
||||||
|
project.password = self.password.data
|
||||||
|
project.contact_email = self.contact_email.data
|
||||||
|
|
||||||
|
return project
|
||||||
|
|
||||||
|
|
||||||
class AuthenticationForm(Form):
|
class AuthenticationForm(Form):
|
||||||
id = TextField("Project identifier", validators=[Required()])
|
id = TextField("Project identifier", validators=[Required()])
|
||||||
|
@ -76,19 +85,26 @@ class BillForm(Form):
|
||||||
|
|
||||||
|
|
||||||
class MemberForm(Form):
|
class MemberForm(Form):
|
||||||
def __init__(self, project, *args, **kwargs):
|
|
||||||
super(MemberForm, self).__init__(*args, **kwargs)
|
|
||||||
self.project = project
|
|
||||||
|
|
||||||
name = TextField("Name", validators=[Required()])
|
name = TextField("Name", validators=[Required()])
|
||||||
submit = SubmitField("Add a member")
|
submit = SubmitField("Add a member")
|
||||||
|
|
||||||
|
def __init__(self, project, *args, **kwargs):
|
||||||
|
super(MemberForm, self).__init__(*args, **kwargs)
|
||||||
|
self.project = project
|
||||||
|
|
||||||
def validate_name(form, field):
|
def validate_name(form, field):
|
||||||
if Person.query.filter(Person.name == field.data)\
|
if Person.query.filter(Person.name == field.data)\
|
||||||
.filter(Person.project == form.project)\
|
.filter(Person.project == form.project)\
|
||||||
.filter(Person.activated == True).all():
|
.filter(Person.activated == True).all():
|
||||||
raise ValidationError("This project already have this member")
|
raise ValidationError("This project already have this member")
|
||||||
|
|
||||||
|
def save(self, project, person):
|
||||||
|
# if the user is already bound to the project, just reactivate him
|
||||||
|
person.name = self.name.data
|
||||||
|
person.project = project
|
||||||
|
|
||||||
|
return person
|
||||||
|
|
||||||
class InviteForm(Form):
|
class InviteForm(Form):
|
||||||
emails = TextAreaField("People to notify")
|
emails = TextAreaField("People to notify")
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from flaskext.sqlalchemy import SQLAlchemy
|
from flaskext.sqlalchemy import SQLAlchemy, BaseQuery
|
||||||
|
from flask import g
|
||||||
|
|
||||||
from sqlalchemy import orm
|
from sqlalchemy import orm
|
||||||
|
|
||||||
|
@ -75,6 +76,20 @@ class Project(db.Model):
|
||||||
|
|
||||||
class Person(db.Model):
|
class Person(db.Model):
|
||||||
|
|
||||||
|
class PersonQuery(BaseQuery):
|
||||||
|
def get_by_name(self, name, project):
|
||||||
|
return Person.query.filter(Person.name == name)\
|
||||||
|
.filter(Project.id == project.id).one()
|
||||||
|
|
||||||
|
def get(self, id, project=None):
|
||||||
|
if not project:
|
||||||
|
project = g.project
|
||||||
|
return Person.query.filter(Person.id == id)\
|
||||||
|
.filter(Project.id == project.id).one()
|
||||||
|
|
||||||
|
|
||||||
|
query_class = PersonQuery
|
||||||
|
|
||||||
_to_serialize = ("id", "name", "activated")
|
_to_serialize = ("id", "name", "activated")
|
||||||
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
@ -106,7 +121,7 @@ billowers = db.Table('billowers',
|
||||||
|
|
||||||
class Bill(db.Model):
|
class Bill(db.Model):
|
||||||
|
|
||||||
class BillQuery(orm.query.Query):
|
class BillQuery(BaseQuery):
|
||||||
|
|
||||||
def get(self, project, id):
|
def get(self, project, id):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -114,7 +114,7 @@ def need_auth(authentifier, name=None, remove_attr=True):
|
||||||
del kwargs["%s_id" % name]
|
del kwargs["%s_id" % name]
|
||||||
return func(*args, **kwargs)
|
return func(*args, **kwargs)
|
||||||
else:
|
else:
|
||||||
raise werkzeug.exceptions.Forbidden()
|
return 403, "Forbidden"
|
||||||
return wrapped
|
return wrapped
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
@ -128,13 +128,15 @@ def serialize(func):
|
||||||
# get the mimetype
|
# get the mimetype
|
||||||
mime = request.accept_mimetypes.best_match(SERIALIZERS.keys())
|
mime = request.accept_mimetypes.best_match(SERIALIZERS.keys())
|
||||||
data = func(*args, **kwargs)
|
data = func(*args, **kwargs)
|
||||||
|
serializer = SERIALIZERS[mime]
|
||||||
|
|
||||||
if isinstance(data, werkzeug.Response):
|
status = 200
|
||||||
return data
|
if len(data) == 2:
|
||||||
else:
|
status, data = data
|
||||||
# serialize it
|
|
||||||
return werkzeug.Response(SERIALIZERS[mime].encode(data),
|
# serialize it
|
||||||
status=200, mimetype=mime)
|
return werkzeug.Response(serializer.encode(data),
|
||||||
|
status=status, mimetype=mime)
|
||||||
|
|
||||||
return wrapped
|
return wrapped
|
||||||
|
|
||||||
|
|
|
@ -188,18 +188,11 @@ def add_member():
|
||||||
form = MemberForm(g.project)
|
form = MemberForm(g.project)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
if form.validate():
|
if form.validate():
|
||||||
# if the user is already bound to the project, just reactivate him
|
member = form.save(g.project, Person())
|
||||||
person = Person.query.filter(Person.name == form.name.data)\
|
|
||||||
.filter(Project.id == g.project.id).all()
|
|
||||||
if person:
|
|
||||||
person[0].activated = True
|
|
||||||
db.session.commit()
|
|
||||||
flash("%s is part of this project again" % person[0].name)
|
|
||||||
return redirect(url_for(".list_bills"))
|
|
||||||
|
|
||||||
db.session.add(Person(name=form.name.data, project=g.project))
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
flash("%s is had been added" % member.name)
|
||||||
return redirect(url_for(".list_bills"))
|
return redirect(url_for(".list_bills"))
|
||||||
|
|
||||||
return render_template("add_member.html", form=form)
|
return render_template("add_member.html", form=form)
|
||||||
|
|
||||||
@main.route("/<project_id>/members/<member_id>/reactivate", methods=["GET",])
|
@main.route("/<project_id>/members/<member_id>/reactivate", methods=["GET",])
|
||||||
|
|
Loading…
Add table
Reference in a new issue