#
from datetime import datetime, timedelta
import json
-from urlparse import urljoin
from django.conf import settings
from django.contrib.sites.models import Site
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
'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():