X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/7f0caf88dd3aac2e4d5bb4ee064137e03ecd4f03..2d0cc46d3bc3357c19d13fc585c0a9492e5ee1b7:/apps/api/handlers.py diff --git a/apps/api/handlers.py b/apps/api/handlers.py index da5c0ed27..e1792af13 100644 --- a/apps/api/handlers.py +++ b/apps/api/handlers.py @@ -1,15 +1,16 @@ # -*- coding: utf-8 -*- # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. - +# 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 sorl.thumbnail import default @@ -18,12 +19,15 @@ from api.helpers import timestamp 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 = { @@ -34,7 +38,7 @@ category_singular = { 'themes': 'theme', 'books': 'book', } -category_plural={} +category_plural = {} for k, v in category_singular.items(): category_plural[v] = k @@ -99,7 +103,6 @@ class BookMediaHandler(BaseHandler): @classmethod def director(cls, media): return media.extra_info.get('director_name', '') - class BookDetails(object): @@ -195,7 +198,7 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): books = Book.tagged.with_all(tags) else: books = Book.objects.all() - + if top_level: books = books.filter(parent=None) if audiobooks: @@ -244,7 +247,7 @@ def _tags_getter(category): def _tag_getter(category): @classmethod def get_tag(cls, book): - return ", ".join(t[0] for t in book.related_info()['tags'].get(category, [])) + return ", ".join(related_tag_name(t) for t in book.related_info()['tags'].get(category, [])) return get_tag for plural, singular in category_singular.items(): setattr(BookDetails, plural, _tags_getter(singular)) @@ -292,7 +295,6 @@ class CollectionDetailHandler(BaseHandler, CollectionDetails): @piwik_track def read(self, request, slug): - print slug """ Returns details of a collection, identified by slug. """ try: return Collection.objects.get(slug=slug) @@ -381,7 +383,7 @@ class FragmentDetails(object): 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 @@ -465,7 +467,7 @@ class CatalogueHandler(BaseHandler): """ # set to five minutes ago, to avoid concurrency issues if t is None: - t = datetime.now() - timedelta(seconds=settings.API_WAIT) + t = datetime.utcnow().replace(tzinfo=utc) - timedelta(seconds=settings.API_WAIT) # set to whole second in case DB supports something smaller return t.replace(microsecond=0) @@ -536,7 +538,7 @@ class CatalogueHandler(BaseHandler): @classmethod def book_changes(cls, request=None, since=0, until=None, fields=None): - since = datetime.fromtimestamp(int(since)) + since = datetime.fromtimestamp(int(since), tz) until = cls.until(until) changes = { @@ -558,7 +560,7 @@ class CatalogueHandler(BaseHandler): 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(): @@ -602,7 +604,7 @@ class CatalogueHandler(BaseHandler): @classmethod def tag_changes(cls, request=None, since=0, until=None, fields=None, categories=None): - since = datetime.fromtimestamp(int(since)) + since = datetime.fromtimestamp(int(since), tz) until = cls.until(until) changes = { @@ -623,7 +625,7 @@ class CatalogueHandler(BaseHandler): 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 @@ -636,7 +638,7 @@ class CatalogueHandler(BaseHandler): 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():