[snowy] REST API changes, handle ObjectNotFound in a clever way
- From: Brad Taylor <btaylor src gnome org>
- To: svn-commits-list gnome org
- Subject: [snowy] REST API changes, handle ObjectNotFound in a clever way
- Date: Fri, 15 May 2009 10:39:02 -0400 (EDT)
commit 163176224a05541323aa581f3a84a234c48c8ac3
Author: Brad Taylor <brad getcoded net>
Date: Fri May 15 10:38:24 2009 -0400
REST API changes, handle ObjectNotFound in a clever way
---
api/handlers.py | 90 ++++++++++++++++++++++++++++++++++--------------------
api/urls.py | 9 +++--
2 files changed, 62 insertions(+), 37 deletions(-)
diff --git a/api/handlers.py b/api/handlers.py
index 3278f0d..0f95ae0 100644
--- a/api/handlers.py
+++ b/api/handlers.py
@@ -24,54 +24,78 @@ from piston.utils import rc, HttpStatusCode
from snowy.notes.models import Note
-def get_user_or_not_here(username):
- try:
- return User.objects.get(username=username)
- except ObjectDoesNotExist:
- raise HttpStatusCode('Gone', code=410)
+class catch_and_return(object):
+ def __init__(self, err, response):
+ self.err = err
+ self.response = response
-def get_note_or_not_here(note_id):
- try:
- return Note.objects.get(pk=note_id)
- except ObjectDoesNotExist:
- raise HttpStatusCode('Gone', code=410)
+ def __call__(self, fn):
+ def wrapper(*args, **kwargs):
+ try:
+ return fn(*args, **kwargs)
+ except self.err:
+ return self.response
+ return wrapper
class UserHandler(AnonymousBaseHandler):
allow_methods = ('GET',)
+ @catch_and_return(ObjectDoesNotExist, rc.NOT_HERE)
def read(self, request, username):
- user = get_user_or_not_here(username)
+ user = User.objects.get(username=username)
+ reverse_args = {'username': username}
return {
- 'first name': user.first_name,
- 'last name': user.last_name,
- 'notes-ref': reverse('note_index', kwargs={'username': username}),
- 'notes-api-ref': reverse('note_api_index', kwargs={'username': username}),
+ 'first-name': user.first_name,
+ 'last-name': user.last_name,
+ 'notes-ref': {
+ 'api-ref': reverse('note_api_index', kwargs=reverse_args),
+ 'href': reverse('note_index', kwargs=reverse_args),
+ },
}
class ListNoteRefsHandler(BaseHandler):
allow_methods = ('GET',)
+ @catch_and_return(ObjectDoesNotExist, rc.NOT_HERE)
def read(self, request, username):
- user = get_user_or_not_here(username)
- return {'note-refs': [
- {'guid': n.guid, 'href': n.get_absolute_url(), 'title': n.title }
- for n in Note.objects.filter(author=user)
- ]}
+ user = User.objects.get(username=username)
+ if request.GET.has_key('include_notes'):
+ return {'notes': [describe_note(n) for n in Note.objects.filter(author=user)] }
+ else:
+ return {'note-refs': [{
+ 'guid': n.guid,
+ 'ref': {
+ 'api-ref': reverse('note_api_detail', kwargs={
+ 'username': n.author.username,
+ 'note_id': n.pk,
+ 'slug': n.slug,
+ }),
+ 'href': n.get_absolute_url(),
+ },
+ 'title': n.title,
+ }
+ for n in Note.objects.filter(author=user)
+ ]}
class NoteHandler(BaseHandler):
allow_methods = ('GET',)
model = Note
- def read(self, request, username, note_id, slug=None):
- user = get_user_or_not_here(username)
- note = get_note_or_not_here(note_id)
- return {
- 'guid': note.guid,
- 'title': note.title,
- 'note-content': note.content,
- 'last-change-date': note.user_modified,
- 'last-metadata-change-date': note.modified,
- 'create-date': note.created,
- 'open-on-startup': note.open_on_startup,
- 'tags': [t.name for t in note.tags.all()],
- }
+ @catch_and_return(ObjectDoesNotExist, rc.NOT_HERE)
+ def read(self, request, username, note_id, slug):
+ user = User.objects.get(username=username)
+ note = Note.objects.get(pk=note_id, slug=slug)
+ return {'note': [describe_note(note)]}
+
+
+def describe_note(note):
+ return {
+ 'guid': note.guid,
+ 'title': note.title,
+ 'note-content': note.content,
+ 'last-change-date': note.user_modified,
+ 'last-metadata-change-date': note.modified,
+ 'create-date': note.created,
+ 'open-on-startup': note.open_on_startup,
+ 'tags': [t.name for t in note.tags.all()],
+ }
diff --git a/api/urls.py b/api/urls.py
index ccf33f7..3c4c098 100644
--- a/api/urls.py
+++ b/api/urls.py
@@ -24,8 +24,9 @@ user_handler = Resource(UserHandler)
list_note_refs_handler = Resource(ListNoteRefsHandler)
note_handler = Resource(NoteHandler)
-urlpatterns = patterns('1.0',
- url(r'(?P<username>\w+)/notes/(?P<note_id>\d+)/(?P<slug>[^/]+)/$', note_handler, name='note_api_detail'),
- url(r'(?P<username>\w+)/notes/$', list_note_refs_handler, name='note_api_index'),
- url(r'(?P<username>\w+)/$', user_handler),
+urlpatterns = patterns('',
+ # 1.0 API methods
+ url(r'1.0/(?P<username>\w+)/notes/(?P<note_id>\d+)/(?P<slug>[^/]+)/$', note_handler, name='note_api_detail'),
+ url(r'1.0/(?P<username>\w+)/notes/$', list_note_refs_handler, name='note_api_index'),
+ url(r'1.0/(?P<username>\w+)/$', user_handler),
)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]