diff options
| author | Tom Christie | 2012-02-25 18:45:17 +0000 |
|---|---|---|
| committer | Tom Christie | 2012-02-25 18:45:17 +0000 |
| commit | 1cde31c86d9423e9b7a7409c2ef2ba7c0500e47f (patch) | |
| tree | ea24bce0f24507aa43f408776ccf7324f204256d /examples | |
| parent | 5fd4c639d7c64572dd07dc31dcd627bed9469b05 (diff) | |
| download | django-rest-framework-1cde31c86d9423e9b7a7409c2ef2ba7c0500e47f.tar.bz2 | |
Massive merge
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/blogpost/models.py | 3 | ||||
| -rw-r--r-- | examples/blogpost/resources.py | 13 | ||||
| -rw-r--r-- | examples/mixin/urls.py | 6 | ||||
| -rw-r--r-- | examples/modelresourceexample/models.py | 3 | ||||
| -rw-r--r-- | examples/modelresourceexample/resources.py | 7 | ||||
| -rw-r--r-- | examples/modelresourceexample/urls.py | 7 | ||||
| -rw-r--r-- | examples/objectstore/views.py | 52 | ||||
| -rw-r--r-- | examples/pygments_api/forms.py | 3 | ||||
| -rw-r--r-- | examples/pygments_api/tests.py | 7 | ||||
| -rw-r--r-- | examples/pygments_api/views.py | 23 | ||||
| -rw-r--r-- | examples/requestexample/views.py | 3 | ||||
| -rw-r--r-- | examples/resourceexample/forms.py | 1 | ||||
| -rw-r--r-- | examples/resourceexample/views.py | 8 | ||||
| -rw-r--r-- | examples/sandbox/views.py | 20 | ||||
| -rw-r--r-- | examples/urls.py | 6 |
15 files changed, 101 insertions, 61 deletions
diff --git a/examples/blogpost/models.py b/examples/blogpost/models.py index d77f530d..10732ab4 100644 --- a/examples/blogpost/models.py +++ b/examples/blogpost/models.py @@ -2,6 +2,7 @@ from django.db import models from django.template.defaultfilters import slugify import uuid + def uuid_str(): return str(uuid.uuid1()) @@ -14,6 +15,7 @@ RATING_CHOICES = ((0, 'Awful'), MAX_POSTS = 10 + class BlogPost(models.Model): key = models.CharField(primary_key=True, max_length=64, default=uuid_str, editable=False) title = models.CharField(max_length=128) @@ -37,4 +39,3 @@ class Comment(models.Model): comment = models.TextField() rating = models.IntegerField(blank=True, null=True, choices=RATING_CHOICES, help_text='How did you rate this post?') created = models.DateTimeField(auto_now_add=True) - diff --git a/examples/blogpost/resources.py b/examples/blogpost/resources.py index d11c5615..b3659cdf 100644 --- a/examples/blogpost/resources.py +++ b/examples/blogpost/resources.py @@ -11,8 +11,15 @@ class BlogPostResource(ModelResource): fields = ('created', 'title', 'slug', 'content', 'url', 'comments') ordering = ('-created',) + def url(self, instance): + return reverse('blog-post', + kwargs={'key': instance.key}, + request=self.request) + def comments(self, instance): - return reverse('comments', request, kwargs={'blogpost': instance.key}) + return reverse('comments', + kwargs={'blogpost': instance.key}, + request=self.request) class CommentResource(ModelResource): @@ -24,4 +31,6 @@ class CommentResource(ModelResource): ordering = ('-created',) def blogpost(self, instance): - return reverse('blog-post', request, kwargs={'key': instance.blogpost.key}) + return reverse('blog-post', + kwargs={'key': instance.blogpost.key}, + request=self.request) diff --git a/examples/mixin/urls.py b/examples/mixin/urls.py index 102f2c12..7a5697fd 100644 --- a/examples/mixin/urls.py +++ b/examples/mixin/urls.py @@ -10,11 +10,12 @@ from django.conf.urls.defaults import patterns, url class ExampleView(ResponseMixin, View): """An example view using Django 1.3's class based views. Uses djangorestframework's RendererMixin to provide support for multiple output formats.""" - renderer_classes = DEFAULT_RENDERERS + renderers = DEFAULT_RENDERERS def get(self, request): + url = reverse('mixin-view', request) response = Response({'description': 'Some example content', - 'url': reverse('mixin-view', request)}, status=200) + 'url': url}, status=200) self.response = self.prepare_response(response) return self.response @@ -22,4 +23,3 @@ class ExampleView(ResponseMixin, View): urlpatterns = patterns('', url(r'^$', ExampleView.as_view(), name='mixin-view'), ) - diff --git a/examples/modelresourceexample/models.py b/examples/modelresourceexample/models.py index ff0179c8..11f3eae2 100644 --- a/examples/modelresourceexample/models.py +++ b/examples/modelresourceexample/models.py @@ -2,6 +2,7 @@ from django.db import models MAX_INSTANCES = 10 + class MyModel(models.Model): foo = models.BooleanField() bar = models.IntegerField(help_text='Must be an integer.') @@ -15,5 +16,3 @@ class MyModel(models.Model): super(MyModel, self).save(*args, **kwargs) while MyModel.objects.all().count() > MAX_INSTANCES: MyModel.objects.all().order_by('-created')[0].delete() - - diff --git a/examples/modelresourceexample/resources.py b/examples/modelresourceexample/resources.py index 634ea6b3..b74b0572 100644 --- a/examples/modelresourceexample/resources.py +++ b/examples/modelresourceexample/resources.py @@ -1,7 +1,14 @@ from djangorestframework.resources import ModelResource +from djangorestframework.reverse import reverse from modelresourceexample.models import MyModel + class MyModelResource(ModelResource): model = MyModel fields = ('foo', 'bar', 'baz', 'url') ordering = ('created',) + + def url(self, instance): + return reverse('model-resource-instance', + kwargs={'id': instance.id}, + request=self.request) diff --git a/examples/modelresourceexample/urls.py b/examples/modelresourceexample/urls.py index b6a16542..c5e1f874 100644 --- a/examples/modelresourceexample/urls.py +++ b/examples/modelresourceexample/urls.py @@ -2,7 +2,10 @@ from django.conf.urls.defaults import patterns, url from djangorestframework.views import ListOrCreateModelView, InstanceModelView from modelresourceexample.resources import MyModelResource +my_model_list = ListOrCreateModelView.as_view(resource=MyModelResource) +my_model_instance = InstanceModelView.as_view(resource=MyModelResource) + urlpatterns = patterns('', - url(r'^$', ListOrCreateModelView.as_view(resource=MyModelResource), name='model-resource-root'), - url(r'^(?P<pk>[0-9]+)/$', InstanceModelView.as_view(resource=MyModelResource)), + url(r'^$', my_model_list, name='model-resource-root'), + url(r'^(?P<id>[0-9]+)/$', my_model_instance, name='model-resource-instance'), ) diff --git a/examples/objectstore/views.py b/examples/objectstore/views.py index b48bfac2..a8889cd8 100644 --- a/examples/objectstore/views.py +++ b/examples/objectstore/views.py @@ -28,6 +28,20 @@ def remove_oldest_files(dir, max_files): [os.remove(path) for path in ctime_sorted_paths[max_files:]] +def get_filename(key): + """ + Given a stored object's key returns the file's path. + """ + return os.path.join(OBJECT_STORE_DIR, key) + + +def get_file_url(key, request): + """ + Given a stored object's key returns the URL for the object. + """ + return reverse('stored-object', kwargs={'key': key}, request=request) + + class ObjectStoreRoot(View): """ Root of the Object Store API. @@ -38,20 +52,25 @@ class ObjectStoreRoot(View): """ Return a list of all the stored object URLs. (Ordered by creation time, newest first) """ - filepaths = [os.path.join(OBJECT_STORE_DIR, file) for file in os.listdir(OBJECT_STORE_DIR) if not file.startswith('.')] + filepaths = [os.path.join(OBJECT_STORE_DIR, file) + for file in os.listdir(OBJECT_STORE_DIR) + if not file.startswith('.')] ctime_sorted_basenames = [item[0] for item in sorted([(os.path.basename(path), os.path.getctime(path)) for path in filepaths], key=operator.itemgetter(1), reverse=True)] - return Response([reverse('stored-object', request, kwargs={'key':key}) for key in ctime_sorted_basenames]) + content = [get_file_url(key, request) + for key in ctime_sorted_basenames] + return Response(content) def post(self, request): """ Create a new stored object, with a unique key. """ key = str(uuid.uuid1()) - pathname = os.path.join(OBJECT_STORE_DIR, key) - pickle.dump(self.CONTENT, open(pathname, 'wb')) + filename = get_filename(key) + pickle.dump(self.CONTENT, open(filename, 'wb')) + remove_oldest_files(OBJECT_STORE_DIR, MAX_FILES) - url = reverse('stored-object', request, kwargs={'key':key}) + url = get_file_url(key, request) return Response(self.CONTENT, status.HTTP_201_CREATED, {'Location': url}) @@ -60,30 +79,31 @@ class StoredObject(View): Represents a stored object. The object may be any picklable content. """ - def get(self, request, key): """ - Return a stored object, by unpickling the contents of a locally stored file. + Return a stored object, by unpickling the contents of a locally + stored file. """ - pathname = os.path.join(OBJECT_STORE_DIR, key) - if not os.path.exists(pathname): + filename = get_filename(key) + if not os.path.exists(filename): return Response(status=status.HTTP_404_NOT_FOUND) - return Response(pickle.load(open(pathname, 'rb'))) + return Response(pickle.load(open(filename, 'rb'))) def put(self, request, key): """ - Update/create a stored object, by pickling the request content to a locally stored file. + Update/create a stored object, by pickling the request content to a + locally stored file. """ - pathname = os.path.join(OBJECT_STORE_DIR, key) - pickle.dump(self.CONTENT, open(pathname, 'wb')) + filename = get_filename(key) + pickle.dump(self.CONTENT, open(filename, 'wb')) return Response(self.CONTENT) def delete(self, request, key): """ Delete a stored object, by removing it's pickled file. """ - pathname = os.path.join(OBJECT_STORE_DIR, key) - if not os.path.exists(pathname): + filename = get_filename(key) + if not os.path.exists(filename): return Response(status=status.HTTP_404_NOT_FOUND) - os.remove(pathname) + os.remove(filename) return Response() diff --git a/examples/pygments_api/forms.py b/examples/pygments_api/forms.py index 30a59a84..cc147740 100644 --- a/examples/pygments_api/forms.py +++ b/examples/pygments_api/forms.py @@ -6,6 +6,7 @@ from pygments.styles import get_all_styles LEXER_CHOICES = sorted([(item[1][0], item[0]) for item in get_all_lexers()]) STYLE_CHOICES = sorted((item, item) for item in list(get_all_styles())) + class PygmentsForm(forms.Form): """A simple form with some of the most important pygments settings. The code to be highlighted can be specified either in a text field, or by URL. @@ -24,5 +25,3 @@ class PygmentsForm(forms.Form): initial='python') style = forms.ChoiceField(choices=STYLE_CHOICES, initial='friendly') - - diff --git a/examples/pygments_api/tests.py b/examples/pygments_api/tests.py index 24726647..b728c3c2 100644 --- a/examples/pygments_api/tests.py +++ b/examples/pygments_api/tests.py @@ -14,13 +14,13 @@ class TestPygmentsExample(TestCase): self.factory = RequestFactory()
self.temp_dir = tempfile.mkdtemp()
views.HIGHLIGHTED_CODE_DIR = self.temp_dir
-
+
def tearDown(self):
try:
shutil.rmtree(self.temp_dir)
except Exception:
pass
-
+
def test_get_to_root(self):
'''Just do a get on the base url'''
request = self.factory.get('/pygments')
@@ -44,6 +44,3 @@ class TestPygmentsExample(TestCase): response = view(request)
response_locations = json.loads(response.content)
self.assertEquals(locations, response_locations)
-
-
- diff --git a/examples/pygments_api/views.py b/examples/pygments_api/views.py index 75d36fea..a3812ef4 100644 --- a/examples/pygments_api/views.py +++ b/examples/pygments_api/views.py @@ -1,7 +1,6 @@ from __future__ import with_statement # for python 2.5 from django.conf import settings -from djangorestframework.resources import FormResource from djangorestframework.response import Response from djangorestframework.renderers import BaseRenderer from djangorestframework.reverse import reverse @@ -30,9 +29,13 @@ def list_dir_sorted_by_ctime(dir): """ Return a list of files sorted by creation time """ - filepaths = [os.path.join(dir, file) for file in os.listdir(dir) if not file.startswith('.')] - return [item[0] for item in sorted( [(path, os.path.getctime(path)) for path in filepaths], - key=operator.itemgetter(1), reverse=False) ] + filepaths = [os.path.join(dir, file) + for file in os.listdir(dir) + if not file.startswith('.')] + ctimes = [(path, os.path.getctime(path)) for path in filepaths] + ctimes = sorted(ctimes, key=operator.itemgetter(1), reverse=False) + return [filepath for filepath, ctime in ctimes] + def remove_oldest_files(dir, max_files): """ @@ -60,8 +63,11 @@ class PygmentsRoot(View): """ Return a list of all currently existing snippets. """ - unique_ids = [os.path.split(f)[1] for f in list_dir_sorted_by_ctime(HIGHLIGHTED_CODE_DIR)] - return Response([reverse('pygments-instance', request, args=[unique_id]) for unique_id in unique_ids]) + unique_ids = [os.path.split(f)[1] + for f in list_dir_sorted_by_ctime(HIGHLIGHTED_CODE_DIR)] + urls = [reverse('pygments-instance', args=[unique_id], request=request) + for unique_id in unique_ids] + return Response(urls) def post(self, request): """ @@ -81,7 +87,7 @@ class PygmentsRoot(View): remove_oldest_files(HIGHLIGHTED_CODE_DIR, MAX_FILES) - location = reverse('pygments-instance', request, args=[unique_id]) + location = reverse('pygments-instance', args=[unique_id], request=request) return Response(status=status.HTTP_201_CREATED, headers={'Location': location}) @@ -90,7 +96,7 @@ class PygmentsInstance(View): Simply return the stored highlighted HTML file with the correct mime type. This Resource only renders HTML and uses a standard HTML renderer rather than the renderers.DocumentingHTMLRenderer class. """ - renderer_classes = (HTMLRenderer,) + renderers = (HTMLRenderer, ) def get(self, request, unique_id): """ @@ -110,4 +116,3 @@ class PygmentsInstance(View): return Response(status=status.HTTP_404_NOT_FOUND) os.remove(pathname) return Response() - diff --git a/examples/requestexample/views.py b/examples/requestexample/views.py index b5d2c1e7..2036d6cd 100644 --- a/examples/requestexample/views.py +++ b/examples/requestexample/views.py @@ -22,7 +22,7 @@ class MyBaseViewUsingEnhancedRequest(RequestMixin, View): Base view enabling the usage of enhanced requests with user defined views. """ - parser_classes = parsers.DEFAULT_PARSERS + parsers = parsers.DEFAULT_PARSERS def dispatch(self, request, *args, **kwargs): self.request = request = self.create_request(request) @@ -41,4 +41,3 @@ class EchoRequestContentView(MyBaseViewUsingEnhancedRequest): def put(self, request, *args, **kwargs): return HttpResponse(("Found %s in request.DATA, content : %s" % (type(request.DATA), request.DATA))) - diff --git a/examples/resourceexample/forms.py b/examples/resourceexample/forms.py index aa6e7685..d21d601a 100644 --- a/examples/resourceexample/forms.py +++ b/examples/resourceexample/forms.py @@ -1,5 +1,6 @@ from django import forms + class MyForm(forms.Form): foo = forms.BooleanField(required=False) bar = forms.IntegerField(help_text='Must be an integer.') diff --git a/examples/resourceexample/views.py b/examples/resourceexample/views.py index 8e7be302..41a3111c 100644 --- a/examples/resourceexample/views.py +++ b/examples/resourceexample/views.py @@ -16,9 +16,11 @@ class ExampleView(View): Handle GET requests, returning a list of URLs pointing to three other views. """ - urls = [reverse('another-example', request, kwargs={'num': num}) - for num in range(3)] - return Response({"Some other resources": urls}) + resource_urls = [reverse('another-example', + kwargs={'num': num}, + request=request) + for num in range(3)] + return Response({"Some other resources": resource_urls}) class AnotherExampleView(View): diff --git a/examples/sandbox/views.py b/examples/sandbox/views.py index a9b82447..f4de2947 100644 --- a/examples/sandbox/views.py +++ b/examples/sandbox/views.py @@ -19,7 +19,7 @@ class Sandbox(View): For example, to get the default representation using curl: bash: curl -X GET http://rest.ep.io/ - + Or, to get the plaintext documentation represention: bash: curl -X GET http://rest.ep.io/ -H 'Accept: text/plain' @@ -49,19 +49,19 @@ class Sandbox(View): def get(self, request): return Response([ {'name': 'Simple Resource example', - 'url': reverse('example-resource', request)}, + 'url': reverse('example-resource', request=request)}, {'name': 'Simple ModelResource example', - 'url': reverse('model-resource-root', request)}, + 'url': reverse('model-resource-root', request=request)}, {'name': 'Simple Mixin-only example', - 'url': reverse('mixin-view', request)}, - {'name': 'Object store API' - 'url': reverse('object-store-root', request)}, + 'url': reverse('mixin-view', request=request)}, + {'name': 'Object store API', + 'url': reverse('object-store-root', request=request)}, {'name': 'Code highlighting API', - 'url': reverse('pygments-root', request)}, + 'url': reverse('pygments-root', request=request)}, {'name': 'Blog posts API', - 'url': reverse('blog-posts-root', request)}, + 'url': reverse('blog-posts-root', request=request)}, {'name': 'Permissions example', - 'url': reverse('permissions-example', request)}, + 'url': reverse('permissions-example', request=request)}, {'name': 'Simple request mixin example', - 'url': reverse('request-example', request)} + 'url': reverse('request-example', request=request)} ]) diff --git a/examples/urls.py b/examples/urls.py index f246828a..fda7942f 100644 --- a/examples/urls.py +++ b/examples/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls.defaults import patterns, include +from django.conf.urls.defaults import patterns, include, url from sandbox.views import Sandbox try: from django.contrib.staticfiles.urls import staticfiles_urlpatterns @@ -15,9 +15,7 @@ urlpatterns = patterns('', (r'^pygments/', include('pygments_api.urls')), (r'^blog-post/', include('blogpost.urls')), (r'^permissions-example/', include('permissionsexample.urls')), - (r'^request-example/', include('requestexample.urls')), - - (r'^', include('djangorestframework.urls')), + url(r'^restframework/', include('djangorestframework.urls', namespace='djangorestframework')), ) urlpatterns += staticfiles_urlpatterns() |
