6b685624049d723b1a54dbbff1efc75c1b477e14
[redakcja.git] / apps / api / response.py
1 # -*- encoding: utf-8 -*-
2
3 __author__= "Ɓukasz Rekucki"
4 __date__ = "$2009-09-26 00:32:18$"
5 __doc__ = "Extensible HTTP Responses."
6
7 from django.http import HttpResponse
8 from django.utils import simplejson as json
9
10 MIME_PLAIN = 'text/plain'
11 MIME_JSON = 'application/json'
12
13 class ResponseObject(object):
14
15     def __init__(self, code, mimetype=MIME_JSON):
16         self._code = code
17         self._mime = mimetype        
18
19     def django_response(self, body=None):
20         if body is None:
21             data = ''
22         elif self._mime == MIME_JSON:
23             data = json.dumps(body, default=lambda o: repr(o) )
24         else:
25             data = u"%s\n%s" % (self.MESSAGE, unicode(body))
26             data = data.encode('utf-8')
27             
28         return HttpResponse(content=data, status=self._code, \
29                 content_type=self._mime+'; charset=utf-8' )        
30     
31 class SuccessAllOk(ResponseObject):
32     def __init__(self, **kwargs):
33         ResponseObject.__init__(self, 200, **kwargs)
34         
35 class EntityCreated(ResponseObject):
36
37     def __init__(self, **kwargs):
38         ResponseObject.__init__(self, 201, **kwargs)
39
40     def django_response(self, url, body):        
41         response = ResponseObject.django_response(self, body)
42         response['Location'] = url
43         return response
44
45 class RequestAccepted(ResponseObject):
46
47     def __init__(self, **kwargs):
48         ResponseObject.__init__(self, 202, **kwargs)
49
50     def django_response(self, ticket_status, ticket_uri):
51         return ResponseObject.django_response(self, {
52             'status': ticket_status,
53             'refer_to': ticket_uri })     
54         
55 class SuccessNoContent(ResponseObject):
56
57     def __init__(self, **kwargs):
58         ResponseObject.__init__(self, 204, **kwargs)
59
60     def django_response(self):
61         return ResponseObject.django_response(self, body=None)
62
63 #
64 # Client errors
65 #
66
67 class BadRequest(ResponseObject):
68
69     def __init__(self, **kwargs):
70         ResponseObject.__init__(self, 400, **kwargs)
71     
72 class AccessDenied(ResponseObject):
73
74     def __init__(self, **kwargs):
75         ResponseObject.__init__(self, 403, **kwargs)
76
77     def django_response(self, reason):
78         return ResponseObject.django_response(self, \
79             body={'reason': reason})
80
81 class EntityNotFound(ResponseObject):
82
83     def __init__(self, **kwargs):
84         ResponseObject.__init__(self, 404, **kwargs)
85
86 class EntityGone(ResponseObject):
87
88     def __init__(self, **kwargs):
89         ResponseObject.__init__(self, 410, **kwargs)
90
91
92 class EntityConflict(ResponseObject):
93
94     def __init__(self, **kwargs):
95         ResponseObject.__init__(self, 409, **kwargs)
96
97
98 #
99 # Server side errors
100 #
101 class NotImplemented(ResponseObject):
102
103     def __init__(self, **kwargs):
104         ResponseObject.__init__(self, 501, **kwargs)
105
106 def validate_form(formclass, source='GET'):
107     from functools import wraps
108
109     def decorator(func):
110         @wraps(func)
111         def decorated(self, request, *args, **kwargs):
112             form = formclass(getattr(request,  source), request.FILES)
113
114             if not form.is_valid():
115                 errorlist = [{'field': k, 'errors': e} for k,e in form.errors]
116                 return BadRequest().django_response(errorlist)
117             
118             return func(self, request, form, *args, **kwargs)
119         return decorated
120     return decorator
121        
122
123
124     
125
126