1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/ihatemoney_ynh.git synced 2024-09-03 19:26:15 +02:00

Add a serialization mechanism

This commit is contained in:
Alexis Metaireau 2011-09-13 11:27:36 +02:00
parent ef3d761fc7
commit d2e2260e52
3 changed files with 37 additions and 1 deletions

View file

@ -50,7 +50,7 @@ class MemberHandler(object):
pass pass
def list(self, project): def list(self, project):
pass return project.members
def add(self, project): def add(self, project):
pass pass

View file

@ -7,6 +7,10 @@ db = SQLAlchemy()
# define models # define models
class Project(db.Model): class Project(db.Model):
_to_serialize = ("id", "name", "password", "contact_email",
"members", "active_members")
id = db.Column(db.String, primary_key=True) id = db.Column(db.String, primary_key=True)
name = db.Column(db.UnicodeText) name = db.Column(db.UnicodeText)
@ -68,6 +72,9 @@ class Project(db.Model):
class Person(db.Model): class Person(db.Model):
_to_serialize = ("id", "name", "activated")
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
project_id = db.Column(db.Integer, db.ForeignKey("project.id")) project_id = db.Column(db.Integer, db.ForeignKey("project.id"))
bills = db.relationship("Bill", backref="payer") bills = db.relationship("Bill", backref="payer")

View file

@ -1,3 +1,5 @@
import json
class RESTResource(object): class RESTResource(object):
"""Represents a REST resource, with the different HTTP verbs""" """Represents a REST resource, with the different HTTP verbs"""
_NEED_ID = ["get", "update", "delete"] _NEED_ID = ["get", "update", "delete"]
@ -70,6 +72,9 @@ class RESTResource(object):
method = need_auth(self._authentifier, method = need_auth(self._authentifier,
self._inject_name or self._name)(method) self._inject_name or self._name)(method)
# regarding the format, transform the response
method = serialize("json")(method) #FIXME handle headers
app.add_url_rule( app.add_url_rule(
self._get_route_for(action), self._get_route_for(action),
"%s_%s" % (self._name, action), "%s_%s" % (self._name, action),
@ -111,3 +116,27 @@ def need_auth(authentifier, name=None, remove_attr=True):
raise werkzeug.exceptions.Forbidden() raise werkzeug.exceptions.Forbidden()
return wrapped return wrapped
return wrapper 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()}