importbooks: no-build-epub and wait-until options
[wolnelektury.git] / apps / catalogue / models.py
index 1e85cdf..0091d8a 100644 (file)
@@ -12,7 +12,6 @@ from django.template.defaultfilters import slugify
 from django.utils.safestring import mark_safe
 from django.utils.translation import get_language
 from django.core.urlresolvers import reverse
-from datetime import datetime
 
 from django.conf import settings
 
@@ -61,7 +60,6 @@ class Tag(TagBase):
 
     user = models.ForeignKey(User, blank=True, null=True)
     book_count = models.IntegerField(_('book count'), blank=False, null=True)
-    death = models.IntegerField(_(u'year of death'), blank=True, null=True)
     gazeta_link = models.CharField(blank=True, max_length=240)
     wiki_link = models.CharField(blank=True, max_length=240)
 
@@ -96,17 +94,6 @@ class Tag(TagBase):
     has_description.short_description = _('description')
     has_description.boolean = True
 
-    def alive(self):
-        return self.death is None
-
-    def in_pd(self):
-        """ tests whether an author is in public domain """
-        return self.death is not None and self.goes_to_pd() <= datetime.now().year
-
-    def goes_to_pd(self):
-        """ calculates the year of public domain entry for an author """
-        return self.death + 71 if self.death is not None else None
-
     def get_count(self):
         """ returns global book count for book tags, fragment count for themes """
 
@@ -173,13 +160,17 @@ def book_upload_path(ext=None):
         # how to put related book's slug here?
         if not ext:
             ext = media.type
-        return 'lektura/%s.%s' % (slugify(filename), ext)
+        if not media.name:
+            name = slugify(filename.split(".")[0])
+        else:
+            name = slugify(media.name)
+        return 'lektura/%s.%s' % (name, ext)
     return get_dynamic_path
 
 
 class BookMedia(models.Model):
     type        = models.CharField(_('type'), choices=MEDIA_FORMATS, max_length="100")
-    name        = models.CharField(_('name'), max_length="100")
+    name        = models.CharField(_('name'), max_length="100", blank=True)
     file        = models.FileField(_('file'), upload_to=book_upload_path(), blank=True)    
     uploaded_at = models.DateTimeField(_('creation date'), auto_now_add=True, editable=False)
 
@@ -206,8 +197,9 @@ class Book(models.Model):
     html_file     = models.FileField(_('HTML file'), upload_to=book_upload_path('html'), blank=True)
     pdf_file      = models.FileField(_('PDF file'), upload_to=book_upload_path('pdf'), blank=True)
     epub_file     = models.FileField(_('EPUB file'), upload_to=book_upload_path('epub'), blank=True)    
+    txt_file      = models.FileField(_('TXT file'), upload_to=book_upload_path('txt'), blank=True)        
     # other files
-    medias        = models.ManyToManyField(BookMedia)
+    medias        = models.ManyToManyField(BookMedia, blank=True)
     
     parent        = models.ForeignKey('self', blank=True, null=True, related_name='children')
     objects  = models.Manager()
@@ -350,9 +342,9 @@ class Book(models.Model):
             if self.has_media("txt"):
                 formats.append(u'<a href="%s">TXT</a>' % self.get_media('txt').url)
             # other files
-            for m in self.media.order_by('type'):
+            for m in self.medias.order_by('type'):
                 formats.append(u'<a href="%s">%s</a>' % m.type, m.file.url)
+
             formats = [mark_safe(format) for format in formats]
 
             setattr(self, key, unicode(render_to_string('catalogue/book_short.html',
@@ -450,7 +442,7 @@ class Book(models.Model):
 
         epub_file = StringIO()
         try:
-            epub.transform(BookImportDocProvider(self), self.slug, epub_file)
+            epub.transform(BookImportDocProvider(self), self.slug, output_file=epub_file)
             self.epub_file.save('%s.epub' % self.slug, ContentFile(epub_file.getvalue()), save=False)
             self.save(refresh_mp3=False)
             FileRecord(slug=self.slug, type='epub', sha1=sha1(epub_file.getvalue()).hexdigest()).save()
@@ -468,7 +460,7 @@ class Book(models.Model):
 
 
     @classmethod
-    def from_xml_file(cls, xml_file, overwrite=False):
+    def from_xml_file(cls, xml_file, overwrite=False, build_epub=True):
         # use librarian to parse meta-data
         book_info = dcparser.parse(xml_file)
 
@@ -476,12 +468,12 @@ class Book(models.Model):
             xml_file = File(open(xml_file))
 
         try:
-            return cls.from_text_and_meta(xml_file, book_info, overwrite)
+            return cls.from_text_and_meta(xml_file, book_info, overwrite, build_epub=build_epub)
         finally:
             xml_file.close()
 
     @classmethod
-    def from_text_and_meta(cls, raw_file, book_info, overwrite=False):
+    def from_text_and_meta(cls, raw_file, book_info, overwrite=False, build_epub=True):
         from tempfile import NamedTemporaryFile
         from slughifi import slughifi
         from markupstring import MarkupString
@@ -590,7 +582,7 @@ class Book(models.Model):
                 new_fragment.save()
                 new_fragment.tags = set(book_tags + themes + [book_tag] + ancestor_tags)
 
-        if not settings.NO_BUILD_EPUB:
+        if not settings.NO_BUILD_EPUB and build_epub:
             book.root_ancestor().build_epub()
 
         book_descendants = list(book.children.all())
@@ -656,6 +648,24 @@ class Book(models.Model):
             return self.refresh_theme_counter()
         return dict((int(k), v) for k, v in self.get__theme_counter_value().iteritems())
 
+    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))
+
+        if html_links:
+            names = ['<a href="%s">%s</a>' % (tag.get_absolute_url(), tag.name) for tag in names]
+        else:
+            names = [tag.name for tag in names]
+
+        return ', '.join(names)
+
+
 class Fragment(models.Model):
     text = models.TextField()
     short_text = models.TextField(editable=False)
@@ -687,34 +697,6 @@ class Fragment(models.Model):
             return mark_safe(getattr(self, key))
 
 
-class BookStub(models.Model):
-    title = models.CharField(_('title'), max_length=120)
-    author = models.CharField(_('author'), max_length=120)
-    pd = models.IntegerField(_('goes to public domain'), null=True, blank=True)
-    slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)
-    translator = models.TextField(_('translator'), blank=True)
-    translator_death = models.TextField(_('year of translator\'s death'), blank=True)
-
-    class Meta:
-        ordering = ('title',)
-        verbose_name = _('book stub')
-        verbose_name_plural = _('book stubs')
-
-    def __unicode__(self):
-        return self.title
-
-    @permalink
-    def get_absolute_url(self):
-        return ('catalogue.views.book_detail', [self.slug])
-
-    def in_pd(self):
-        return self.pd is not None and self.pd <= datetime.now().year
-
-    @property
-    def name(self):
-        return self.title
-
-
 class FileRecord(models.Model):
     slug = models.SlugField(_('slug'), max_length=120, db_index=True)
     type = models.CharField(_('type'), max_length=20, db_index=True)