diff --git a/budget/api.py b/budget/api.py index e768bd9..c307fdf 100644 --- a/budget/api.py +++ b/budget/api.py @@ -50,7 +50,7 @@ class MemberHandler(object): pass def list(self, project): - pass + return project.members def add(self, project): pass diff --git a/budget/models.py b/budget/models.py index 8feaccb..8d68746 100644 --- a/budget/models.py +++ b/budget/models.py @@ -7,6 +7,10 @@ db = SQLAlchemy() # define models class Project(db.Model): + + _to_serialize = ("id", "name", "password", "contact_email", + "members", "active_members") + id = db.Column(db.String, primary_key=True) name = db.Column(db.UnicodeText) @@ -68,6 +72,9 @@ class Project(db.Model): class Person(db.Model): + + _to_serialize = ("id", "name", "activated") + id = db.Column(db.Integer, primary_key=True) project_id = db.Column(db.Integer, db.ForeignKey("project.id")) bills = db.relationship("Bill", backref="payer") diff --git a/budget/rest.py b/budget/rest.py index 5ecee69..3a911ab 100644 --- a/budget/rest.py +++ b/budget/rest.py @@ -1,3 +1,5 @@ +import json + class RESTResource(object): """Represents a REST resource, with the different HTTP verbs""" _NEED_ID = ["get", "update", "delete"] @@ -70,6 +72,9 @@ class RESTResource(object): method = need_auth(self._authentifier, self._inject_name or self._name)(method) + # regarding the format, transform the response + method = serialize("json")(method) #FIXME handle headers + app.add_url_rule( self._get_route_for(action), "%s_%s" % (self._name, action), @@ -111,3 +116,27 @@ def need_auth(authentifier, name=None, remove_attr=True): raise werkzeug.exceptions.Forbidden() return wrapped return wrapper + + +# serializers + +def serialize(format): + def wrapper(func): + def wrapped(*args, **kwargs): + return SERIALIZERS[format].encode(func(*args, **kwargs)) + return wrapped + return wrapper + + +class JSONEncoder(json.JSONEncoder): + def default(self, o): + if hasattr(o, "_to_serialize"): + # build up the object + data = {} + for attr in o._to_serialize: + data[attr] = getattr(o, attr) + return data + else: + return json.JSONEncoder.default(self, o) + +SERIALIZERS = {"json": JSONEncoder()}