X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/1405761d13e0ba62db4b1f9a9d5fa1472142b6d0..64cf4d889127d7dc3ea893e8a27711468276dc47:/apps/catalogue/models/book.py?ds=sidebyside
diff --git a/apps/catalogue/models/book.py b/apps/catalogue/models/book.py
index e6f08a91a..c865d1d87 100644
--- a/apps/catalogue/models/book.py
+++ b/apps/catalogue/models/book.py
@@ -3,7 +3,7 @@
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
import re
-from django.conf import settings as settings
+from django.conf import settings
from django.core.cache import get_cache
from django.db import models
from django.db.models import permalink
@@ -14,7 +14,7 @@ import jsonfield
from catalogue import constants
from catalogue.fields import EbookField
from catalogue.models import Tag, Fragment, BookMedia
-from catalogue.utils import create_zip, split_tags, book_upload_path
+from catalogue.utils import create_zip, split_tags, book_upload_path, related_tag_name
from catalogue import app_settings
from catalogue import tasks
from newtagging import managers
@@ -36,7 +36,7 @@ class Book(models.Model):
created_at = models.DateTimeField(_('creation date'), auto_now_add=True, db_index=True)
changed_at = models.DateTimeField(_('creation date'), auto_now=True, db_index=True)
parent_number = models.IntegerField(_('parent number'), default=0)
- extra_info = jsonfield.JSONField(_('extra information'), default='{}')
+ extra_info = jsonfield.JSONField(_('extra information'), default={})
gazeta_link = models.CharField(blank=True, max_length=240)
wiki_link = models.CharField(blank=True, max_length=240)
# files generated during publication
@@ -75,7 +75,7 @@ class Book(models.Model):
self.sort_key = sortify(self.title)
- ret = super(Book, self).save(force_insert, force_update)
+ ret = super(Book, self).save(force_insert, force_update, **kwargs)
if reset_short_html:
self.reset_short_html()
@@ -86,6 +86,11 @@ class Book(models.Model):
def get_absolute_url(self):
return ('catalogue.views.book_detail', [self.slug])
+ @staticmethod
+ @permalink
+ def create_url(slug):
+ return ('catalogue.views.book_detail', [slug])
+
@property
def name(self):
return self.title
@@ -189,20 +194,20 @@ class Book(models.Model):
paths = map(lambda bm: (None, bm.file.path), bm)
return create_zip(paths, "%s_%s" % (self.slug, format_))
- def search_index(self, book_info=None, reuse_index=False, index_tags=True):
+ def search_index(self, book_info=None, index=None, index_tags=True, commit=True):
import search
- if reuse_index:
- idx = search.ReusableIndex()
- else:
- idx = search.Index()
-
- idx.open()
+ if index is None:
+ index = search.Index()
try:
- idx.index_book(self, book_info)
+ index.index_book(self, book_info)
if index_tags:
- idx.index_tags()
- finally:
- idx.close()
+ index.index_tags()
+ if commit:
+ index.index.commit()
+ except Exception, e:
+ index.index.rollback()
+ raise e
+
@classmethod
def from_xml_file(cls, xml_file, **kwargs):
@@ -223,7 +228,7 @@ class Book(models.Model):
@classmethod
def from_text_and_meta(cls, raw_file, book_info, overwrite=False,
dont_build=None, search_index=True,
- search_index_tags=True, search_index_reuse=False):
+ search_index_tags=True):
if dont_build is None:
dont_build = set()
dont_build = set.union(set(dont_build), set(app_settings.DONT_BUILD))
@@ -274,12 +279,14 @@ class Book(models.Model):
cover_changed = old_cover != book.cover_info()
obsolete_children = set(b for b in book.children.all()
if b not in children)
+ notify_cover_changed = []
for n, child_book in enumerate(children):
+ new_child = child_book.parent != book
child_book.parent = book
child_book.parent_number = n
child_book.save()
- if cover_changed:
- child_book.parent_cover_changed()
+ if new_child or cover_changed:
+ notify_cover_changed.append(child_book)
# Disown unfaithful children and let them cope on their own.
for child in obsolete_children:
child.parent = None
@@ -287,7 +294,7 @@ class Book(models.Model):
child.save()
tasks.fix_tree_tags.delay(child)
if old_cover:
- child.parent_cover_changed()
+ notify_cover_changed.append(child)
# delete old fragments when overwriting
book.fragments.all().delete()
@@ -308,8 +315,10 @@ class Book(models.Model):
getattr(book, '%s_file' % format_).build_delay()
if not settings.NO_SEARCH_INDEX and search_index:
- book.search_index(index_tags=search_index_tags, reuse_index=search_index_reuse)
- #index_book.delay(book.id, book_info)
+ tasks.index_book.delay(book.id, book_info=book_info, index_tags=search_index_tags)
+
+ for child in notify_cover_changed:
+ child.parent_cover_changed()
cls.published.send(sender=book)
return book
@@ -393,8 +402,15 @@ class Book(models.Model):
'author', 'kind', 'genre', 'epoch'))
tags = split_tags(tags)
for category in tags:
- rel['tags'][category] = [
- (t.name, t.slug) for t in tags[category]]
+ cat = []
+ for tag in tags[category]:
+ tag_info = {'slug': tag.slug}
+ for lc, ln in settings.LANGUAGES:
+ tag_name = getattr(tag, "name_%s" % lc)
+ if tag_name:
+ tag_info["name_%s" % lc] = tag_name
+ cat.append(tag_info)
+ rel['tags'][category] = cat
for media_format in BookMedia.formats:
rel['media'][media_format] = self.has_media(media_format)
@@ -477,19 +493,19 @@ class Book(models.Model):
def pretty_title(self, html_links=False):
book = self
- names = list(book.tags.filter(category='author'))
-
- books = []
- while book:
- books.append(book)
- book = book.parent
- names.extend(reversed(books))
+ rel_info = book.related_info()
+ names = [(related_tag_name(tag), Tag.create_url('author', tag['slug']))
+ for tag in rel_info['tags'].get('author', ())]
+ if 'parents' in rel_info:
+ books = [(name, Book.create_url(slug))
+ for name, slug in rel_info['parents']]
+ names.extend(reversed(books))
+ names.append((self.title, self.get_absolute_url()))
if html_links:
- names = ['%s' % (tag.get_absolute_url(), tag.name) for tag in names]
+ names = ['%s' % (tag[1], tag[0]) for tag in names]
else:
- names = [tag.name for tag in names]
-
+ names = [tag[0] for tag in names]
return ', '.join(names)
@classmethod
@@ -502,10 +518,11 @@ class Book(models.Model):
"""
# get relevant books and their tags
objects = cls.tagged.with_all(tags)
+ parents = objects.filter(html_file='').only('slug')
# eliminate descendants
l_tags = Tag.objects.filter(category='book',
- slug__in=[book.book_tag_slug() for book in objects.iterator()])
- descendants_keys = [book.pk for book in cls.tagged.with_any(l_tags).iterator()]
+ slug__in=[book.book_tag_slug() for book in parents.iterator()])
+ descendants_keys = [book.pk for book in cls.tagged.with_any(l_tags).only('pk').iterator()]
if descendants_keys:
objects = objects.exclude(pk__in=descendants_keys)
@@ -551,6 +568,7 @@ class Book(models.Model):
return books_by_author, orphans, books_by_parent
_audiences_pl = {
+ "SP": (1, u"szkoÅa podstawowa"),
"SP1": (1, u"szkoÅa podstawowa"),
"SP2": (1, u"szkoÅa podstawowa"),
"P": (1, u"szkoÅa podstawowa"),
@@ -560,7 +578,7 @@ class Book(models.Model):
}
def audiences_pl(self):
audiences = self.extra_info.get('audiences', [])
- audiences = sorted(set([self._audiences_pl[a] for a in audiences]))
+ audiences = sorted(set([self._audiences_pl.get(a, (99, a)) for a in audiences]))
return [a[1] for a in audiences]
def choose_fragment(self):