fnp
/
wolnelektury.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
use jsonfield from upstream, pip version is too buggy
[wolnelektury.git]
/
apps
/
api
/
handlers.py
diff --git
a/apps/api/handlers.py
b/apps/api/handlers.py
index
0255c05
..
437b3be
100644
(file)
--- a/
apps/api/handlers.py
+++ b/
apps/api/handlers.py
@@
-4,6
+4,7
@@
from datetime import datetime, timedelta
import json
from datetime import datetime, timedelta
import json
+from urlparse import urljoin
from django.conf import settings
from django.contrib.sites.models import Site
from django.conf import settings
from django.contrib.sites.models import Site
@@
-82,7
+83,7
@@
class BookMediaHandler(BaseHandler):
""" Responsible for representing media in Books. """
model = BookMedia
""" Responsible for representing media in Books. """
model = BookMedia
- fields = ['name', 'type', 'url']
+ fields = ['name', 'type', 'url'
, 'artist', 'director'
]
@classmethod
def url(cls, media):
@classmethod
def url(cls, media):
@@
-90,13
+91,22
@@
class BookMediaHandler(BaseHandler):
return MEDIA_BASE + media.file.url
return MEDIA_BASE + media.file.url
+ @classmethod
+ def artist(cls, media):
+ return media.extra_info.get('artist_name', '')
+
+ @classmethod
+ def director(cls, media):
+ return media.extra_info.get('director_name', '')
+
+
class BookDetails(object):
"""Custom fields used for representing Books."""
@classmethod
def author(cls, book):
class BookDetails(object):
"""Custom fields used for representing Books."""
@classmethod
def author(cls, book):
- return ",
".join(t.name for t in book.tags.filter(category='author'
))
+ return ",
".join(t[0] for t in book.related_info()['tags'].get('author', []
))
@classmethod
def href(cls, book):
@classmethod
def href(cls, book):
@@
-111,16
+121,19
@@
class BookDetails(object):
@classmethod
def children(cls, book):
@classmethod
def children(cls, book):
- """ Returns all
media
for a book. """
+ """ Returns all
children
for a book. """
return book.children.all()
@classmethod
def media(cls, book):
""" Returns all media for a book. """
return book.children.all()
@classmethod
def media(cls, book):
""" Returns all media for a book. """
-
return book.media.all()
return book.media.all()
+ @classmethod
+ def cover(cls, book):
+ return MEDIA_BASE + book.cover.url if book.cover else ''
+
class BookDetailHandler(BaseHandler, BookDetails):
class BookDetailHandler(BaseHandler, BookDetails):
@@
-130,7
+143,8
@@
class BookDetailHandler(BaseHandler, BookDetails):
"""
allowed_methods = ['GET']
fields = ['title', 'parent', 'children'] + Book.formats + [
"""
allowed_methods = ['GET']
fields = ['title', 'parent', 'children'] + Book.formats + [
- 'media', 'url'] + book_tag_categories
+ 'media', 'url', 'cover'] + [
+ category_plural[c] for c in book_tag_categories]
@piwik_track
def read(self, request, book):
@piwik_track
def read(self, request, book):
@@
-148,10
+162,11
@@
class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails):
"""
allowed_methods = ('GET',)
model = Book
"""
allowed_methods = ('GET',)
model = Book
- fields = ['author', 'href', 'title', 'url']
+ fields = ['author', 'href', 'title', 'url'
, 'cover'
]
@piwik_track
@piwik_track
- def read(self, request, tags, top_level=False):
+ def read(self, request, tags, top_level=False,
+ audiobooks=False, daisy=False):
""" Lists all books with given tags.
:param tags: filtering tags; should be a path of categories
""" Lists all books with given tags.
:param tags: filtering tags; should be a path of categories
@@
-171,26
+186,32
@@
class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails):
return books if books else rc.NOT_FOUND
else:
books = Book.tagged.with_all(tags)
return books if books else rc.NOT_FOUND
else:
books = Book.tagged.with_all(tags)
- elif top_level:
- books = Book.objects.filter(parent=None)
else:
books = Book.objects.all()
else:
books = Book.objects.all()
+
+ if top_level:
+ books = books.filter(parent=None)
+ if audiobooks:
+ books = books.filter(media__type='mp3')
+ if daisy:
+ books = books.filter(media__type='daisy')
if books.exists():
return books
else:
return rc.NOT_FOUND
if books.exists():
return books
else:
return rc.NOT_FOUND
- def create(self, request,
tags, top_level=False
):
+ def create(self, request,
*args, **kwargs
):
return rc.FORBIDDEN
class BooksHandler(BookDetailHandler):
return rc.FORBIDDEN
class BooksHandler(BookDetailHandler):
+ allowed_methods = ('GET', 'POST')
model = Book
fields = ['author', 'href', 'title', 'url']
anonymous = AnonymousBooksHandler
model = Book
fields = ['author', 'href', 'title', 'url']
anonymous = AnonymousBooksHandler
- def create(self, request,
tags, top_level=False
):
+ def create(self, request,
*args, **kwargs
):
if not request.user.has_perm('catalogue.add_book'):
return rc.FORBIDDEN
if not request.user.has_perm('catalogue.add_book'):
return rc.FORBIDDEN
@@
-389,7
+410,7
@@
class CatalogueHandler(BaseHandler):
def book_dict(book, fields=None):
all_fields = ['url', 'title', 'description',
'gazeta_link', 'wiki_link',
def book_dict(book, fields=None):
all_fields = ['url', 'title', 'description',
'gazeta_link', 'wiki_link',
- ] + Book.formats + BookMedia.formats + [
+ ] + Book.formats + BookMedia.formats
.keys()
+ [
'parent', 'parent_number',
'tags',
'license', 'license_description', 'source_name',
'parent', 'parent_number',
'tags',
'license', 'license_description', 'source_name',
@@
-401,7
+422,7
@@
class CatalogueHandler(BaseHandler):
else:
fields = all_fields
else:
fields = all_fields
- extra_info = book.
get_extra_info_value()
+ extra_info = book.
extra_info
obj = {}
for field in fields:
obj = {}
for field in fields:
@@
-416,7
+437,7
@@
class CatalogueHandler(BaseHandler):
elif field in BookMedia.formats:
media = []
elif field in BookMedia.formats:
media = []
- for m in book.media.filter(type=field):
+ for m in book.media.filter(type=field)
.iterator()
:
media.append({
'url': m.file.url,
'size': m.file.size,
media.append({
'url': m.file.url,
'size': m.file.size,
@@
-428,10
+449,10
@@
class CatalogueHandler(BaseHandler):
obj[field] = book.get_absolute_url()
elif field == 'tags':
obj[field] = book.get_absolute_url()
elif field == 'tags':
- obj[field] = [t.id for t in book.tags.exclude(category__in=('book', 'set'))]
+ obj[field] = [t.id for t in book.tags.exclude(category__in=('book', 'set'))
.iterator()
]
elif field == 'author':
elif field == 'author':
- obj[field] = ", ".join(t.name for t in book.tags.filter(category='author'))
+ obj[field] = ", ".join(t.name for t in book.tags.filter(category='author')
.iterator()
)
elif field == 'parent':
obj[field] = book.parent_id
elif field == 'parent':
obj[field] = book.parent_id
@@
-468,7
+489,7
@@
class CatalogueHandler(BaseHandler):
last_change = since
for book in Book.objects.filter(changed_at__gte=since,
last_change = since
for book in Book.objects.filter(changed_at__gte=since,
- changed_at__lt=until):
+ changed_at__lt=until)
.iterator()
:
book_d = cls.book_dict(book, fields)
updated.append(book_d)
if updated:
book_d = cls.book_dict(book, fields)
updated.append(book_d)
if updated:
@@
-477,7
+498,7
@@
class CatalogueHandler(BaseHandler):
for book in Deleted.objects.filter(content_type=Book,
deleted_at__gte=since,
deleted_at__lt=until,
for book in Deleted.objects.filter(content_type=Book,
deleted_at__gte=since,
deleted_at__lt=until,
- created_at__lt=since):
+ created_at__lt=since)
.iterator()
:
deleted.append(book.id)
if deleted:
changes['deleted'] = deleted
deleted.append(book.id)
if deleted:
changes['deleted'] = deleted
@@
-503,7
+524,7
@@
class CatalogueHandler(BaseHandler):
obj[field] = tag.get_absolute_url()
elif field == 'books':
obj[field] = tag.get_absolute_url()
elif field == 'books':
- obj[field] = [b.id for b in Book.tagged_top_level([tag])]
+ obj[field] = [b.id for b in Book.tagged_top_level([tag])
.iterator()
]
elif field == 'sort_key':
obj[field] = tag.sort_key
elif field == 'sort_key':
obj[field] = tag.sort_key
@@
-541,7
+562,7
@@
class CatalogueHandler(BaseHandler):
for tag in Tag.objects.filter(category__in=categories,
changed_at__gte=since,
for tag in Tag.objects.filter(category__in=categories,
changed_at__gte=since,
- changed_at__lt=until):
+ changed_at__lt=until)
.iterator()
:
# only serve non-empty tags
if tag.book_count:
tag_d = cls.tag_dict(tag, fields)
# only serve non-empty tags
if tag.book_count:
tag_d = cls.tag_dict(tag, fields)
@@
-555,7
+576,7
@@
class CatalogueHandler(BaseHandler):
content_type=Tag,
deleted_at__gte=since,
deleted_at__lt=until,
content_type=Tag,
deleted_at__gte=since,
deleted_at__lt=until,
- created_at__lt=since):
+ created_at__lt=since)
.iterator()
:
deleted.append(tag.id)
if deleted:
changes['deleted'] = deleted
deleted.append(tag.id)
if deleted:
changes['deleted'] = deleted