#
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.core.cache import get_cache
from django.core.urlresolvers import reverse
+from django.utils.functional import lazy
from django.utils.timezone import utc
from piston.handler import AnonymousBaseHandler, BaseHandler
from piston.utils import rc
from api.models import Deleted
from catalogue.forms import BookImportForm
from catalogue.models import Book, Tag, BookMedia, Fragment, Collection
-from catalogue.utils import related_tag_name
from picture.models import Picture
from picture.forms import PictureImportForm
from wolnelektury.utils import tz
from stats.utils import piwik_track
-API_BASE = WL_BASE = MEDIA_BASE = 'http://' + Site.objects.get_current().domain
+API_BASE = WL_BASE = MEDIA_BASE = lazy(
+ lambda: u'http://' + Site.objects.get_current().domain, unicode)()
category_singular = {
'themes': 'theme',
'books': 'book',
}
-category_plural={}
+category_plural = {}
for k, v in category_singular.items():
category_plural[v] = k
:raises: ValueError when tags can't be found
"""
if not tags:
- return []
+ return [], []
tags = tags.strip('/').split('/')
real_tags = []
+ books = []
while tags:
category = tags.pop(0)
slug = tags.pop(0)
if not category in allowed:
raise ValueError('Category not allowed.')
- # !^%@#$^#!
if category == 'book':
- slug = 'l-' + slug
+ books.append(Book.objects.get(slug=slug))
try:
real_tags.append(Tag.objects.get(category=category, slug=slug))
except Tag.DoesNotExist:
raise ValueError('Tag not found')
- return real_tags
+ return real_tags, books
# RESTful handlers
@classmethod
def director(cls, media):
return media.extra_info.get('director_name', '')
-
class BookDetails(object):
are returned.
"""
try:
- tags = read_tags(tags, allowed=book_tag_categories)
+ tags, ancestors_ = read_tags(tags, allowed=book_tag_categories)
except ValueError:
return rc.NOT_FOUND
books = Book.tagged.with_all(tags)
else:
books = Book.objects.all()
-
+
if top_level:
books = books.filter(parent=None)
if audiobooks:
def _tag_getter(category):
@classmethod
def get_tag(cls, book):
- return ", ".join(related_tag_name(t) for t in book.related_info()['tags'].get(category, []))
+ return ', '.join(tag.name for tag in book.tags.filter(category=category))
return get_tag
for plural, singular in category_singular.items():
setattr(BookDetails, plural, _tags_getter(singular))
@piwik_track
def read(self, request, slug):
- print slug
""" Returns details of a collection, identified by slug. """
try:
return Collection.objects.get(slug=slug)
except KeyError, e:
return rc.NOT_FOUND
- tags = Tag.objects.filter(category=category_sng).exclude(book_count=0)
+ tags = Tag.objects.filter(category=category_sng).exclude(items=None)
if tags.exists():
return tags
else:
def href(cls, fragment):
""" Returns URI in the API for the fragment. """
- return API_BASE + reverse("api_fragment",
+ return API_BASE + reverse("api_fragment",
args=[fragment.book.slug, fragment.anchor])
@classmethod
"""
try:
- tags = read_tags(tags, allowed=self.categories)
+ tags, ancestors = read_tags(tags, allowed=self.categories)
except ValueError:
return rc.NOT_FOUND
fragments = Fragment.tagged.with_all(tags).select_related('book')
obj[field] = book.get_absolute_url()
elif field == 'tags':
- obj[field] = [t.id for t in book.tags.exclude(category__in=('book', 'set')).iterator()]
+ obj[field] = [t.id for t in book.tags.exclude(category='set').iterator()]
elif field == 'author':
obj[field] = ", ".join(t.name for t in book.tags.filter(category='author').iterator())
if updated:
changes['updated'] = updated
- for book in Deleted.objects.filter(content_type=Book,
+ for book in Deleted.objects.filter(content_type=Book,
deleted_at__gte=since,
deleted_at__lt=until,
created_at__lt=since).iterator():
updated = []
deleted = []
- for tag in Tag.objects.filter(category__in=categories,
+ for tag in Tag.objects.filter(category__in=categories,
changed_at__gte=since,
- changed_at__lt=until).iterator():
- # only serve non-empty tags
- if tag.book_count:
- tag_d = cls.tag_dict(tag, fields)
- updated.append(tag_d)
- elif tag.created_at < since:
- deleted.append(tag.id)
+ changed_at__lt=until
+ ).exclude(items=None).iterator():
+ tag_d = cls.tag_dict(tag, fields)
+ updated.append(tag_d)
+ for tag in Tag.objects.filter(category__in=categories,
+ created_at__lt=since,
+ changed_at__gte=since,
+ changed_at__lt=until,
+ items=None).iterator():
+ deleted.append(tag.id)
if updated:
changes['updated'] = updated
for tag in Deleted.objects.filter(category__in=categories,
- content_type=Tag,
+ content_type=Tag,
deleted_at__gte=since,
deleted_at__lt=until,
created_at__lt=since).iterator():