18
18
# Author: Matt Giuca, Will Grant
22
from ivle.webapp.errors import BadRequest
20
24
class BaseView(object):
22
26
Abstract base class for all view objects.
25
def __init__(self, req, context):
26
self.context = context
28
def render(self, req):
29
raise NotImplementedError()
31
def get_permissions(self, user):
32
return self.context.get_permissions(user)
34
def authorize(self, req):
35
self.perms = self.get_permissions(req.user)
37
return self.permission is None or self.permission in self.perms
28
def __init__(self, req, **kwargs):
30
def render(self, req):
33
class RESTView(BaseView):
35
A view which provides a RESTful interface. The content type is
36
unspecified (see JSONRESTView for a specific content type).
38
content_type = "application/octet-stream"
40
def __init__(self, req, *args, **kwargs):
43
def render(self, req):
44
if req.method == 'GET':
45
outstr = self.GET(req)
47
if req.method == 'PUT':
48
outstr = self.PATCH(req, req.read())
49
req.content_type = self.content_type
52
class JSONRESTView(RESTView):
54
A special case of RESTView which deals entirely in JSON.
56
content_type = "application/json"
58
def render(self, req):
59
if req.method == 'GET':
60
outjson = self.GET(req)
61
elif req.method == 'PATCH' or (req.method == 'PUT' and
62
'X-IVLE-Patch-Semantics' in req.headers_in and
63
req.headers_in['X-IVLE-Patch-Semantics'].lower() == 'yes'):
64
outjson = self.PATCH(req, cjson.decode(req.read()))
65
elif req.method == 'PUT':
66
outjson = self.PUT(req, cjson.decode(req.read()))
69
req.content_type = self.content_type
70
if outjson is not None:
71
req.write(cjson.encode(outjson))