david / django-modelviews
Backup of an old repository with useful ideas. Initial goal: integrating REST to django admin (class-based views).
Clone this repository (size: 85.8 KB): HTTPS / SSH
$ hg clone http://code.welldev.org/django-modelviews
| commit 37: | e34bbc96c11f |
| parent 36: | 632e2eb93057 |
| branch: | default |
YamlResponder is now implemented, and has tests.
2 years ago
Changed (Δ1.2 KB):
raw changeset »
generic/rest_views.py (10 lines added, 2 lines removed)
tests/test_modelview/tests.py (28 lines added, 14 lines removed)
tests/urls.py (2 lines added, 1 lines removed)
Up to file-list generic/rest_views.py:
| … | … | @@ -191,8 +191,12 @@ class RssResponder(FeedResponder): |
191 |
191 |
class SerializingResponder(BaseResponder): |
192 |
192 |
serializer = "YourSerializerHere" |
193 |
193 |
mimetype = "Serializer's MimeType" |
194 |
ensure_ascii = False |
|
194 |
195 |
def render_list(self, request, object_list, paginator, page_obj): |
195 |
|
|
196 |
if self.ensure_ascii: |
|
197 |
data = serialize(self.serializer, object_list, ensure_ascii=False) |
|
198 |
else: |
|
199 |
data = serialize(self.serializer, object_list) |
|
196 |
200 |
response = HttpResponse(data, mimetype=self.mimetype) |
197 |
201 |
return response |
198 |
202 |
|
| … | … | @@ -200,7 +204,10 @@ class SerializingResponder(BaseResponder |
200 |
204 |
""" |
201 |
205 |
Renders single model objects to HttpResponse. |
202 |
206 |
""" |
203 |
|
|
207 |
if self.ensure_ascii: |
|
208 |
data = serialize(self.serializer, [obj], ensure_ascii=False) |
|
209 |
else: |
|
210 |
data = serialize(self.serializer, [obj]) |
|
204 |
211 |
response = HttpResponse(data, mimetype=self.mimetype) |
205 |
212 |
return response |
206 |
213 |
|
| … | … | @@ -208,6 +215,7 @@ class SerializingResponder(BaseResponder |
208 |
215 |
class JsonResponder(SerializingResponder): |
209 |
216 |
serializer = 'json' |
210 |
217 |
mimetype = 'application/json' |
218 |
ensure_ascii = True |
|
211 |
219 |
|
212 |
220 |
|
213 |
221 |
class XmlResponder(SerializingResponder): |
Up to file-list tests/test_modelview/tests.py:
1 |
1 |
from django.test import TestCase |
2 |
2 |
from models import Article |
3 |
3 |
from django.utils import simplejson |
4 |
from xml.dom.minidom import parseString |
|
4 |
5 |
|
5 |
6 |
class ArticleTest(TestCase): |
6 |
7 |
def test_model(self): |
| … | … | @@ -119,44 +120,57 @@ class ModelViewTest(TestCase): |
119 |
120 |
self.assertEqual(data[0]['fields']['body'], a.body) |
120 |
121 |
|
121 |
122 |
def test_json_responder_list(self): |
122 |
|
|
123 |
response = self.client.get('/articles/json/') |
|
124 |
self.assertEqual(response.status_code, 200) |
|
125 |
data = simplejson.loads(response.content) |
|
126 |
self.assertEqual(Article.objects.count(), len(data)) |
|
127 |
||
123 |
128 |
|
124 |
129 |
def test_xml_responder_detail(self): |
125 |
from xml.dom.minidom import parseString |
|
126 |
130 |
a = Article.objects.all()[0] |
127 |
131 |
response = self.client.get('/articles/%s/xml/' % a.slug) |
128 |
132 |
self.assertEqual(response.status_code, 200) |
129 |
||
130 |
133 |
dom = parseString(response.content) |
131 |
134 |
obj = dom.childNodes[0].childNodes[0] |
132 |
135 |
self.assertEqual(obj.attributes['pk'].value, str(a.pk)) |
133 |
136 |
for node in obj.childNodes: |
134 |
137 |
field = node.attributes['name'].value |
135 |
138 |
value = node.childNodes[0].nodeValue |
136 |
# ignoring date, because checking it was failing on |
|
137 |
# 'correct' but different results like: |
|
138 |
|
|
139 |
""" |
|
140 |
Ignoring date, because checking it was failing on |
|
141 |
'correct' but different results like: |
|
142 |
AssertionError: '2008-06-19 02:54:12.951959' != u'2008-06-19 02:54:12' |
|
143 |
""" |
|
139 |
144 |
if field != 'date': |
140 |
145 |
self.assertEqual(str(getattr(a,field)),value) |
141 |
146 |
|
142 |
147 |
|
143 |
148 |
def test_xml_responder_list(self): |
144 |
|
|
149 |
response = self.client.get('/articles/xml/') |
|
150 |
self.assertEqual(response.status_code, 200) |
|
151 |
dom = parseString(response.content) |
|
152 |
self.assertEqual(Article.objects.count(), len(dom.childNodes[0].childNodes)) |
|
145 |
153 |
|
146 |
154 |
def test_yaml_responder_detail(self): |
147 |
# require PyYaml library to use. |
|
148 |
155 |
try: |
149 |
156 |
import yaml |
157 |
a = Article.objects.all()[0] |
|
158 |
response = self.client.get(u'/articles/%s/yaml/' % a.slug) |
|
159 |
self.assertEqual(response.status_code, 200) |
|
160 |
data = yaml.load(response.content)[0] |
|
161 |
self.assertEqual(a.slug, data['fields']['slug']) |
|
162 |
self.assertEqual(a.body, data['fields']['body']) |
|
163 |
||
164 |
||
150 |
165 |
except ImportError: |
151 |
166 |
pass |
152 |
167 |
|
153 |
||
154 |
def test_yaml_responder_detail(self): |
|
155 |
|
|
168 |
def test_yaml_responder_list(self): |
|
156 |
169 |
try: |
157 |
170 |
import yaml |
171 |
response = self.client.get(u'/articles/yaml/') |
|
172 |
self.assertEqual(response.status_code, 200) |
|
173 |
data = yaml.load(response.content) |
|
174 |
self.assertEqual(len(data), Article.objects.count()) |
|
158 |
175 |
except ImportError: |
159 |
176 |
pass |
160 |
||
161 |
||
162 |
Up to file-list tests/urls.py:
| … | … | @@ -2,7 +2,8 @@ from django.conf.urls.defaults import * |
2 |
2 |
from test_modelview.models import Article |
3 |
3 |
from django_modelview.generic.rest_views import * |
4 |
4 |
|
5 |
responders = (HtmlResponder, JsonResponder, XmlResponder, |
|
5 |
responders = (HtmlResponder, JsonResponder, XmlResponder, |
|
6 |
YamlResponder, AtomResponder, RssResponder) |
|
6 |
7 |
articles = ModelView(Article.objects.all(), |
7 |
8 |
responders=responders, |
8 |
9 |
methods=('GET',)) |
