1 # -*- encoding: utf-8 -*-
3 __author__= "Ćukasz Rekucki"
4 __date__ = "$2009-09-26 00:32:18$"
5 __doc__ = "Extensible HTTP Responses."
7 from django.http import HttpResponse
8 from django.utils import simplejson as json
10 MIME_PLAIN = 'text/plain'
11 MIME_JSON = 'application/json'
13 class ResponseObject(object):
15 def __init__(self, code, mimetype=MIME_JSON):
19 def django_response(self, body=None):
22 elif self._mime == MIME_JSON:
23 data = json.dumps(body, default=lambda o: repr(o) )
25 data = u"%s\n%s" % (self.MESSAGE, unicode(body))
26 data = data.encode('utf-8')
28 return HttpResponse(content=data, status=self._code, \
29 content_type=self._mime+'; charset=utf-8' )
31 class SuccessAllOk(ResponseObject):
32 def __init__(self, **kwargs):
33 ResponseObject.__init__(self, 200, **kwargs)
35 class EntityCreated(ResponseObject):
37 def __init__(self, **kwargs):
38 ResponseObject.__init__(self, 201, **kwargs)
40 def django_response(self, url, body):
41 response = ResponseObject.django_response(self, body)
42 response['Location'] = url
45 class RequestAccepted(ResponseObject):
47 def __init__(self, **kwargs):
48 ResponseObject.__init__(self, 202, **kwargs)
50 def django_response(self, ticket_status, ticket_uri):
51 return ResponseObject.django_response(self, {
52 'status': ticket_status,
53 'refer_to': ticket_uri })
55 class SuccessNoContent(ResponseObject):
57 def __init__(self, **kwargs):
58 ResponseObject.__init__(self, 204, **kwargs)
60 def django_response(self):
61 return ResponseObject.django_response(self, body=None)
67 class BadRequest(ResponseObject):
69 def __init__(self, **kwargs):
70 ResponseObject.__init__(self, 400, **kwargs)
72 class AccessDenied(ResponseObject):
74 def __init__(self, **kwargs):
75 ResponseObject.__init__(self, 403, **kwargs)
77 def django_response(self, reason):
78 return ResponseObject.django_response(self, \
79 body={'reason': reason})
81 class EntityNotFound(ResponseObject):
83 def __init__(self, **kwargs):
84 ResponseObject.__init__(self, 404, **kwargs)
86 class EntityGone(ResponseObject):
88 def __init__(self, **kwargs):
89 ResponseObject.__init__(self, 410, **kwargs)
92 class EntityConflict(ResponseObject):
94 def __init__(self, **kwargs):
95 ResponseObject.__init__(self, 409, **kwargs)
101 class NotImplemented(ResponseObject):
103 def __init__(self, **kwargs):
104 ResponseObject.__init__(self, 501, **kwargs)
106 def validate_form(formclass, source='GET'):
107 from functools import wraps
111 def decorated(self, request, *args, **kwargs):
112 form = formclass(getattr(request, source), request.FILES)
114 if not form.is_valid():
115 errorlist = [{'field': k, 'errors': e} for k,e in form.errors]
116 return BadRequest().django_response(errorlist)
118 return func(self, request, form, *args, **kwargs)