diff --git a/src/rest/resource.py b/src/rest/resource.py index 85aea8cfa..f14b2ba5d 100644 --- a/src/rest/resource.py +++ b/src/rest/resource.py @@ -284,6 +284,7 @@ class Resource(object): # Serialize the response content ret = self.cleanup_response(ret) content = emitter(self, request, status, headers, form).emit(ret) + print content # Build the HTTP Response resp = HttpResponse(content, mimetype=mimetype, status=status) diff --git a/src/testapp/models.py b/src/testapp/models.py index 75304c9ce..3960d0043 100644 --- a/src/testapp/models.py +++ b/src/testapp/models.py @@ -1,4 +1,6 @@ from django.db import models +from django.template.defaultfilters import slugify +from datetime import datetime import uuid def uuid_str(): @@ -28,4 +30,34 @@ class ExampleItem(models.Model): container = models.ForeignKey(ExampleContainer, related_name='items') index = models.IntegerField() note = models.CharField(max_length=1024) - unique_together = (container, index) \ No newline at end of file + unique_together = (container, index) + + +class BlogPost(models.Model): + slug = models.SlugField(editable=False, primary_key=True, default='blah') + title = models.CharField(max_length=128) + content = models.TextField() + when = models.DateTimeField(editable=False) + + @models.permalink + def get_absolute_url(self): + return ('testapp.views.BlogPostInstance', (self.slug,)) + + def save(self, *args, **kwargs): + self.slug = slugify(self.title) + self.when = datetime.now() + super(self.__class__, self).save(*args, **kwargs) + + +class Comment(models.Model): + blogpost = models.ForeignKey(BlogPost, related_name='comments') + name = models.CharField(max_length=128) + content = models.TextField() + when = models.DateTimeField(auto_now_add=True) + + @models.permalink + def get_absolute_url(self): + return ('testapp.views.CommentInstance', (self.blogpost.slug, self.id)) + + def save(self): + self.index = self.blogpost.comments.count() \ No newline at end of file diff --git a/src/testapp/tests.py b/src/testapp/tests.py index 0e2cde634..ec1607ad1 100644 --- a/src/testapp/tests.py +++ b/src/testapp/tests.py @@ -143,4 +143,4 @@ class CreatedModelTests(TestCase): self.assertEquals(resp.status_code, 200) container = json.loads(resp.content) self.assertEquals(container, self.container) - \ No newline at end of file + diff --git a/src/testapp/urls.py b/src/testapp/urls.py index b90590db7..6f87c698c 100644 --- a/src/testapp/urls.py +++ b/src/testapp/urls.py @@ -8,4 +8,7 @@ urlpatterns = patterns('testapp.views', (r'^model$', 'ModelFormResource'), (r'^container$', 'ContainerFactory'), (r'^container/((?P[^/]+))$', 'ContainerInstance'), + + (r'^blogpost/create$', 'BlogPostCreator'), + (r'^blogposts/(?P[^/]+)', 'BlogPostInstance'), ) diff --git a/src/testapp/views.py b/src/testapp/views.py index f121efa36..33e56bbd0 100644 --- a/src/testapp/views.py +++ b/src/testapp/views.py @@ -1,6 +1,6 @@ from rest.resource import Resource, ModelResource from testapp.forms import ExampleForm -from testapp.models import ExampleModel, ExampleContainer +from testapp.models import ExampleModel, ExampleContainer, BlogPost, Comment class RootResource(Resource): """This is my docstring @@ -12,7 +12,8 @@ class RootResource(Resource): 'write-only-api': self.reverse(WriteOnlyResource), 'read-write-api': self.reverse(ReadWriteResource), 'model-api': self.reverse(ModelFormResource), - 'create-container': self.reverse(ContainerFactory)}, {}) + 'create-container': self.reverse(ContainerFactory), + 'blog-post-creator': self.reverse(BlogPostCreator)}, {}) class ReadOnlyResource(Resource): @@ -61,3 +62,17 @@ class ContainerInstance(ModelResource): fields = ('absolute_uri', 'name', 'key') form_fields = ('name',) +####################### + + +class BlogPostCreator(ModelResource): + """A Resource with which blog posts may be created. + This is distinct from blog post instance so that it is discoverable by the client. + (ie the client doens't need to know how to form a blog post url in order to create a blog post)""" + allowed_operations = ('create',) + model = BlogPost + +class BlogPostInstance(ModelResource): + """Represents a single Blog Post.""" + allowed_operations = ('read', 'update', 'delete') + model = BlogPost \ No newline at end of file