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.
Will Larson
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
        data = serialize(self.serializer, object_list, ensure_ascii=False)
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
        data = serialize(self.serializer, [obj], ensure_ascii=False)
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
        pass
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
            # AssertionError: '2008-06-19 02:54:12.951959' != u'2008-06-19 02:54:12'
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
        pass
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
        # Requires PyYaml library to use.
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, AtomResponder, RssResponder)
5
responders = (HtmlResponder, JsonResponder, XmlResponder, 
6
              YamlResponder, AtomResponder, RssResponder)
6
7
articles = ModelView(Article.objects.all(),
7
8
                     responders=responders,
8
9
                     methods=('GET',))