aboutsummaryrefslogtreecommitdiff
path: root/pyaggr3g470r/views/api/common.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyaggr3g470r/views/api/common.py')
-rw-r--r--pyaggr3g470r/views/api/common.py47
1 files changed, 22 insertions, 25 deletions
diff --git a/pyaggr3g470r/views/api/common.py b/pyaggr3g470r/views/api/common.py
index 872c4ae1..a116b9c3 100644
--- a/pyaggr3g470r/views/api/common.py
+++ b/pyaggr3g470r/views/api/common.py
@@ -2,12 +2,8 @@ from functools import wraps
from flask import request, g, session, Response, jsonify
from flask.ext.restful import Resource
-from pyaggr3g470r import db
from pyaggr3g470r.models import User
-
-
-class HttpError(Exception):
- pass
+from pyaggr3g470r.lib.exceptions import PyAggError
def authenticate(func):
@@ -43,8 +39,10 @@ def to_response(func):
def wrapper(*args, **kwargs):
try:
res = func(*args, **kwargs)
- except HttpError, error:
- return Response(*error.args)
+ except PyAggError, error:
+ response = jsonify(**error.message)
+ response.status_code = error.status_code
+ return response
if isinstance(res, tuple):
response = jsonify(**res[0])
if len(res) > 1:
@@ -55,25 +53,24 @@ def to_response(func):
class PyAggResource(Resource):
- db_cls = None
+ method_decorators = [authenticate, to_response]
+ controller_cls = None
+ editable_attrs = []
+
+ def __init__(self, *args, **kwargs):
+ self.controller = self.controller_cls(g.user.id)
+ super(PyAggResource, self).__init__(*args, **kwargs)
- def _get_or_raise(self, obj_id=None):
- if obj_id is None:
- raise HttpError({'message': 'No id given'}, 400)
- obj = self.db_cls.query.filter(self.db_cls.id == obj_id).first()
- if obj is None:
- raise HttpError({'message': 'Article not found'}, 404)
- if obj.user_id != g.user.id:
- raise HttpError({'message': "Unauthorized for %s."
- % self.db_cls.__class__.__name__}, 403)
- return obj
+ def get(self, obj_id=None):
+ return {'result': [self.controller.read(id=obj_id).dump()]}
- def get(self, id=None):
- return {'result': [self._get_or_raise(id).dump()]}
+ def put(self, obj_id=None):
+ args = self.reqparse.parse_args()
+ new_values = {key: args[key] for key in
+ set(args).intersection(self.editable_attrs)}
+ self.controller.update(obj_id, **new_values)
+ return {"message": "ok"}
- def delete(self, id):
- """Delete a feed."""
- feed = self._get_or_raise(id)
- db.session.delete(feed)
- db.session.commit()
+ def delete(self, obj_id=None):
+ self.controller.delete(obj_id)
return {"message": "ok"}, 204
bgstack15