preview = models.BooleanField(_('preview'), default=False)
preview_until = models.DateField(_('preview until'), blank=True, null=True)
preview_key = models.CharField(max_length=32, blank=True, null=True)
+ findable = models.BooleanField(_('findable'), default=True, db_index=True)
# files generated during publication
cover = EbookField(
def genre_unicode(self):
return self.tag_unicode('genre')
+ def translators(self):
+ translators = self.get_extra_info_json().get('translators')
+ return [
+ '\xa0'.join(reversed(translator.split(', ', 1))) for translator in translators
+ ]
+
def translator(self):
translators = self.get_extra_info_json().get('translators')
if not translators:
@staticmethod
def format_audio_length(seconds):
+ """
+ >>> Book.format_audio_length(1)
+ '0:01'
+ >>> Book.format_audio_length(3661)
+ '1:01:01'
+ """
if seconds < 60*60:
minutes = seconds // 60
seconds = seconds % 60
format_)
field_name = "%s_file" % format_
- books = Book.objects.filter(parent=None).exclude(**{field_name: ""}).exclude(preview=True)
+ books = Book.objects.filter(parent=None).exclude(**{field_name: ""}).exclude(preview=True).exclude(findable=False)
paths = [(pretty_file_name(b), getattr(b, field_name).path) for b in books.iterator()]
return create_zip(paths, app_settings.FORMAT_ZIPS[format_])
return create_zip(paths, "%s_%s" % (self.slug, format_))
def search_index(self, book_info=None, index=None, index_tags=True, commit=True):
+ if not self.findable:
+ return
if index is None:
from search.index import Index
index = Index()
@classmethod
def from_text_and_meta(cls, raw_file, book_info, overwrite=False, dont_build=None, search_index=True,
- search_index_tags=True, remote_gallery_url=None, days=0):
+ search_index_tags=True, remote_gallery_url=None, days=0, findable=True):
if dont_build is None:
dont_build = set()
dont_build = set.union(set(dont_build), set(app_settings.DONT_BUILD))
if book.preview:
book.xml_file.set_readable(False)
+ book.findable = findable
book.language = book_info.language
book.title = book_info.title
if book_info.variant_of:
if format_ not in dont_build:
getattr(book, '%s_file' % format_).build_delay()
- if not settings.NO_SEARCH_INDEX and search_index:
+ if not settings.NO_SEARCH_INDEX and search_index and findable:
tasks.index_book.delay(book.id, book_info=book_info, index_tags=search_index_tags)
for child in notify_cover_changed:
def other_versions(self):
"""Find other versions (i.e. in other languages) of the book."""
- return type(self).objects.filter(common_slug=self.common_slug).exclude(pk=self.pk)
+ return type(self).objects.filter(common_slug=self.common_slug, findable=True).exclude(pk=self.pk)
def parents(self):
books = []
"""
objects = cls.tagged.with_all(tags)
- return objects.exclude(ancestor__in=objects)
+ return objects.filter(findable=True).exclude(ancestor__in=objects)
@classmethod
def book_list(cls, book_filter=None):
"""
books_by_parent = {}
- books = cls.objects.order_by('parent_number', 'sort_key').only('title', 'parent', 'slug', 'extra_info')
+ books = cls.objects.filter(findable=True).order_by('parent_number', 'sort_key').only('title', 'parent', 'slug', 'extra_info')
if book_filter:
books = books.filter(book_filter).distinct()