~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/webapp/base/rest.py

  • Committer: William Grant
  • Date: 2010-02-11 05:09:56 UTC
  • Revision ID: grantw@unimelb.edu.au-20100211050956-t5i2z6b8iulxteza
Unbreak existing tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
17
 
18
 
# Author: Matt Giuca, Will Grant
 
18
# Author: Matt Giuca, Will Grant, Nick Chadwick
19
19
 
 
20
import os
20
21
import cgi
 
22
import urlparse
21
23
import inspect
22
24
 
23
25
import cjson
 
26
import genshi.template
24
27
 
25
28
from ivle.webapp.base.views import BaseView
26
29
from ivle.webapp.errors import BadRequest, MethodNotAllowed, Unauthorized
32
35
    """
33
36
    content_type = "application/octet-stream"
34
37
 
35
 
    def __init__(self, req, *args, **kwargs):
36
 
        for key in kwargs:
37
 
            setattr(self, key, kwargs[key])
38
 
 
39
38
    def render(self, req):
40
39
        raise NotImplementedError()
41
40
 
58
57
 
59
58
        if op._rest_api_permission not in self.get_permissions(req.user):
60
59
            raise Unauthorized()
 
60
    
 
61
    def convert_bool(self, value):
 
62
        if value in ('True', 'true', True):
 
63
            return True
 
64
        elif value in ('False', 'false', False):
 
65
            return False
 
66
        else:
 
67
            raise BadRequest()
61
68
 
62
69
    def render(self, req):
63
70
        if req.method not in self._allowed_methods:
87
94
        # POST implies named operation.
88
95
        elif req.method == 'POST':
89
96
            # TODO: Check Content-Type and implement multipart/form-data.
90
 
            opargs = dict(cgi.parse_qsl(req.read()))
 
97
            data = req.read()
 
98
            opargs = dict(cgi.parse_qsl(data, keep_blank_values=1))
91
99
            try:
92
100
                opname = opargs['ivle.op']
93
101
                del opargs['ivle.op']
131
139
            outjson = op(req, **opargs)
132
140
 
133
141
        req.content_type = self.content_type
 
142
        self.write_json(req, outjson)
 
143
 
 
144
    #This is a separate function to allow additional data to be passed through
 
145
    def write_json(self, req, outjson):
134
146
        if outjson is not None:
135
147
            req.write(cjson.encode(outjson))
136
148
            req.write("\n")
137
149
 
 
150
 
 
151
class XHTMLRESTView(JSONRESTView):
 
152
    """A special type of RESTView which takes enhances the standard JSON
 
153
    with genshi XHTML functions.
 
154
    
 
155
    XHTMLRESTViews should have a template, which is rendered using their
 
156
    context. This is returned in the JSON as 'html'"""
 
157
    template = None
 
158
    ctx = genshi.template.Context()
 
159
 
 
160
    def render_fragment(self):
 
161
        if self.template is None:
 
162
            raise NotImplementedError()
 
163
 
 
164
        rest_template = os.path.join(os.path.dirname(
 
165
                inspect.getmodule(self).__file__), self.template)
 
166
        loader = genshi.template.TemplateLoader(".", auto_reload=True)
 
167
        tmpl = loader.load(rest_template)
 
168
 
 
169
        return tmpl.generate(self.ctx).render('xhtml', doctype='xhtml')
 
170
    
 
171
    # This renders the template and adds it to the json
 
172
    def write_json(self, req, outjson):
 
173
        outjson["html"] = self.render_fragment()
 
174
        req.write(cjson.encode(outjson))
 
175
        req.write("\n")
 
176
 
138
177
class named_operation(object):
139
178
    '''Declare a function to be accessible to HTTP users via the REST API.
140
179
    '''
155
194
    def __call__(self, func):
156
195
        func._rest_api_permission = self.permission
157
196
        return func
158