#264: fixed history in lessons
[wolnelektury.git] / apps / catalogue / models.py
index e692ad8..28db00d 100644 (file)
@@ -13,6 +13,8 @@ from django.utils.translation import get_language
 from django.core.urlresolvers import reverse
 from datetime import datetime
 
 from django.core.urlresolvers import reverse
 from datetime import datetime
 
+from django.conf import settings
+
 from newtagging.models import TagBase, tags_updated
 from newtagging import managers
 from catalogue.fields import JSONField
 from newtagging.models import TagBase, tags_updated
 from newtagging import managers
 from catalogue.fields import JSONField
@@ -44,7 +46,7 @@ class TagSubcategoryManager(models.Manager):
 class Tag(TagBase):
     name = models.CharField(_('name'), max_length=50, db_index=True)
     slug = models.SlugField(_('slug'), max_length=120, db_index=True)
 class Tag(TagBase):
     name = models.CharField(_('name'), max_length=50, db_index=True)
     slug = models.SlugField(_('slug'), max_length=120, db_index=True)
-    sort_key = models.SlugField(_('sort key'), max_length=120, db_index=True)
+    sort_key = models.CharField(_('sort key'), max_length=120, db_index=True)
     category = models.CharField(_('category'), max_length=50, blank=False, null=False,
         db_index=True, choices=TAG_CATEGORIES)
     description = models.TextField(_('description'), blank=True)
     category = models.CharField(_('category'), max_length=50, blank=False, null=False,
         db_index=True, choices=TAG_CATEGORIES)
     description = models.TextField(_('description'), blank=True)
@@ -169,7 +171,7 @@ class Book(models.Model):
     title = models.CharField(_('title'), max_length=120)
     slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)
     description = models.TextField(_('description'), blank=True)
     title = models.CharField(_('title'), max_length=120)
     slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)
     description = models.TextField(_('description'), blank=True)
-    created_at = models.DateTimeField(_('creation date'), auto_now=True)
+    created_at = models.DateTimeField(_('creation date'), auto_now_add=True)
     _short_html = models.TextField(_('short HTML'), editable=False)
     parent_number = models.IntegerField(_('parent number'), default=0)
     extra_info = JSONField(_('extra information'))
     _short_html = models.TextField(_('short HTML'), editable=False)
     parent_number = models.IntegerField(_('parent number'), default=0)
     extra_info = JSONField(_('extra information'))
@@ -245,7 +247,7 @@ class Book(models.Model):
         book_tag, created = Tag.objects.get_or_create(slug=slug, category='book')
         if created:
             book_tag.name = self.title[:50]
         book_tag, created = Tag.objects.get_or_create(slug=slug, category='book')
         if created:
             book_tag.name = self.title[:50]
-            book_tag.sort_key = slug
+            book_tag.sort_key = self.title.lower()
             book_tag.save()
         return book_tag
 
             book_tag.save()
         return book_tag
 
@@ -360,7 +362,7 @@ class Book(models.Model):
         try:
             epub.transform(BookImportDocProvider(self), self.slug, epub_file)
             self.epub_file.save('%s.epub' % self.slug, ContentFile(epub_file.getvalue()), save=False)
         try:
             epub.transform(BookImportDocProvider(self), self.slug, epub_file)
             self.epub_file.save('%s.epub' % self.slug, ContentFile(epub_file.getvalue()), save=False)
-            self.save()
+            self.save(refresh_mp3=False)
             FileRecord(slug=self.slug, type='epub', sha1=sha1(epub_file.getvalue()).hexdigest()).save()
         except NoDublinCore:
             pass
             FileRecord(slug=self.slug, type='epub', sha1=sha1(epub_file.getvalue()).hexdigest()).save()
         except NoDublinCore:
             pass
@@ -371,7 +373,7 @@ class Book(models.Model):
             if remove_descendants and child_book.has_epub_file():
                 child_book.epub_file.delete()
             # save anyway, to refresh short_html
             if remove_descendants and child_book.has_epub_file():
                 child_book.epub_file.delete()
             # save anyway, to refresh short_html
-            child_book.save()
+            child_book.save(refresh_mp3=False)
             book_descendants += list(child_book.children.all())
 
 
             book_descendants += list(child_book.children.all())
 
 
@@ -395,6 +397,17 @@ class Book(models.Model):
         from markupstring import MarkupString
         from django.core.files.storage import default_storage
 
         from markupstring import MarkupString
         from django.core.files.storage import default_storage
 
+        # check for parts before we do anything
+        children = []
+        if hasattr(book_info, 'parts'):
+            for part_url in book_info.parts:
+                base, slug = part_url.rsplit('/', 1)
+                try:
+                    children.append(Book.objects.get(slug=slug))
+                except Book.DoesNotExist, e:
+                    raise Book.DoesNotExist(_('Book with slug = "%s" does not exist.') % slug)
+
+
         # Read book metadata
         book_base, book_slug = book_info.url.rsplit('/', 1)
         book, created = Book.objects.get_or_create(slug=book_slug)
         # Read book metadata
         book_base, book_slug = book_info.url.rsplit('/', 1)
         book, created = Book.objects.get_or_create(slug=book_slug)
@@ -427,7 +440,7 @@ class Book(models.Model):
                 tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name), category=category)
                 if created:
                     tag.name = tag_name
                 tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name), category=category)
                 if created:
                     tag.name = tag_name
-                    tag.sort_key = slughifi(tag_sort_key)
+                    tag.sort_key = tag_sort_key.lower()
                     tag.save()
                 book_tags.append(tag)
 
                     tag.save()
                 book_tags.append(tag)
 
@@ -435,16 +448,10 @@ class Book(models.Model):
 
         book_tag = book.book_tag()
 
 
         book_tag = book.book_tag()
 
-        if hasattr(book_info, 'parts'):
-            for n, part_url in enumerate(book_info.parts):
-                base, slug = part_url.rsplit('/', 1)
-                try:
-                    child_book = Book.objects.get(slug=slug)
-                    child_book.parent = book
-                    child_book.parent_number = n
-                    child_book.save()
-                except Book.DoesNotExist, e:
-                    raise Book.DoesNotExist(_('Book with slug = "%s" does not exist.') % slug)
+        for n, child_book in enumerate(children):
+            child_book.parent = book
+            child_book.parent_number = n
+            child_book.save()
 
         # Save XML and HTML files
         book.xml_file.save('%s.xml' % book.slug, raw_file, save=False)
 
         # Save XML and HTML files
         book.xml_file.save('%s.xml' % book.slug, raw_file, save=False)
@@ -477,7 +484,7 @@ class Book(models.Model):
                     tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name), category='theme')
                     if created:
                         tag.name = theme_name
                     tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name), category='theme')
                     if created:
                         tag.name = theme_name
-                        tag.sort_key = slughifi(theme_name)
+                        tag.sort_key = theme_name.lower()
                         tag.save()
                     themes.append(tag)
                 if not themes:
                         tag.save()
                     themes.append(tag)
                 if not themes:
@@ -493,8 +500,8 @@ class Book(models.Model):
                 new_fragment.save()
                 new_fragment.tags = set(book_tags + themes + [book_tag] + ancestor_tags)
 
                 new_fragment.save()
                 new_fragment.tags = set(book_tags + themes + [book_tag] + ancestor_tags)
 
-        if not book.parent:
-            book.build_epub(remove_descendants=False)
+        if not settings.NO_BUILD_EPUB:
+            book.root_ancestor().build_epub()
 
         book_descendants = list(book.children.all())
         # add l-tag to descendants and their fragments
 
         book_descendants = list(book.children.all())
         # add l-tag to descendants and their fragments
@@ -502,8 +509,6 @@ class Book(models.Model):
         while len(book_descendants) > 0:
             child_book = book_descendants.pop(0)
             child_book.tags = list(child_book.tags) + [book_tag]
         while len(book_descendants) > 0:
             child_book = book_descendants.pop(0)
             child_book.tags = list(child_book.tags) + [book_tag]
-            if child_book.has_epub_file():
-                child_book.epub_file.delete()
             child_book.save()
             for fragment in child_book.fragments.all():
                 fragment.tags = set(list(fragment.tags) + [book_tag])
             child_book.save()
             for fragment in child_book.fragments.all():
                 fragment.tags = set(list(fragment.tags) + [book_tag])