aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--budget/api.py2
-rw-r--r--budget/models.py7
-rw-r--r--budget/rest.py29
3 files changed, 37 insertions, 1 deletions
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()}