pretty book descriptions and don't hide short descriptions
[wolnelektury.git] / apps / catalogue / models.py
index d63581f..cf270f2 100644 (file)
@@ -55,7 +55,7 @@ class Tag(TagBase):
     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)
-    
+
     categories_rev = {
         'autor': 'author',
         'epoka': 'epoch',
@@ -102,8 +102,10 @@ class Tag(TagBase):
     def get_tag_list(tags):
         if isinstance(tags, basestring):
             real_tags = []
+            ambiguous_slugs = []
             category = None
-            for name in tags.split('/'):
+            tags_splitted = tags.split('/')
+            for index, name in enumerate(tags_splitted):
                 if name in Tag.categories_rev:
                     category = Tag.categories_rev[name]
                 else:
@@ -111,19 +113,31 @@ class Tag(TagBase):
                         real_tags.append(Tag.objects.get(slug=name, category=category))
                         category = None
                     else:
-                        real_tags.append(Tag.objects.get(slug=name))
+                        try:
+                            real_tags.append(Tag.objects.exclude(category='book').get(slug=name))
+                        except Tag.MultipleObjectsReturned, e:
+                            ambiguous_slugs.append(name)
+
             if category:
-                raise Http404
-            return real_tags
+                # something strange left off
+                raise Tag.DoesNotExist()
+            if ambiguous_slugs:
+                # some tags should be qualified
+                e = Tag.MultipleObjectsReturned()
+                e.tags = real_tags
+                e.ambiguous_slugs = ambiguous_slugs
+                raise e
+            else:
+                return real_tags
         else:
             return TagBase.get_tag_list(tags)
-    
+
     @property
     def url_chunk(self):
         return '/'.join((Tag.categories_dict[self.category], self.slug))
 
 
-# TODO: why is this hard-coded ? 
+# TODO: why is this hard-coded ?
 def book_upload_path(ext):
     def get_dynamic_path(book, filename):
         return 'lektura/%s.%s' % (book.slug, ext)
@@ -157,7 +171,7 @@ class Book(models.Model):
     objects = models.Manager()
     tagged = managers.ModelTaggedItemManager(Tag)
     tags = managers.TagDescriptor(Tag)
-    
+
     _tag_counter = JSONField(null=True, editable=False)
     _theme_counter = JSONField(null=True, editable=False)
 
@@ -175,8 +189,12 @@ class Book(models.Model):
     def save(self, force_insert=False, force_update=False, reset_short_html=True, refresh_mp3=True):
         if reset_short_html:
             # Reset _short_html during save
+            update = {}
             for key in filter(lambda x: x.startswith('_short_html'), self.__dict__):
+                update[key] = ''
                 self.__setattr__(key, '')
+            # Fragment.short_html relies on book's tags, so reset it here too
+            self.fragments.all().update(**update)
 
         book = super(Book, self).save(force_insert, force_update)
 
@@ -196,7 +214,7 @@ class Book(models.Model):
     @property
     def name(self):
         return self.title
-    
+
     def book_tag(self):
         slug = ('l-' + self.slug)[:120]
         book_tag, created = Tag.objects.get_or_create(slug=slug, category='book')
@@ -385,8 +403,8 @@ class Book(models.Model):
 
         book.save()
         return book
-    
-    
+
+
     def refresh_tag_counter(self):
         tags = {}
         for child in self.children.all().order_by():
@@ -397,7 +415,7 @@ class Book(models.Model):
         self.set__tag_counter_value(tags)
         self.save(reset_short_html=False, refresh_mp3=False)
         return tags
-    
+
     @property
     def tag_counter(self):
         if self._tag_counter is None:
@@ -412,13 +430,13 @@ class Book(models.Model):
         self.set__theme_counter_value(tags)
         self.save(reset_short_html=False, refresh_mp3=False)
         return tags
-    
+
     @property
     def theme_counter(self):
         if self._theme_counter is None:
             return self.refresh_theme_counter()
         return dict((int(k), v) for k, v in self.get__theme_counter_value().iteritems())
-    
+
 
 
 class Fragment(models.Model):
@@ -446,11 +464,8 @@ class Fragment(models.Model):
         if short_html and len(short_html):
             return mark_safe(short_html)
         else:
-            book_authors = [mark_safe(u'<a href="%s">%s</a>' % (tag.get_absolute_url(), tag.name))
-                for tag in self.book.tags if tag.category == 'author']
-
             setattr(self, key, unicode(render_to_string('catalogue/fragment_short.html',
-                {'fragment': self, 'book': self.book, 'book_authors': book_authors})))
+                {'fragment': self})))
             self.save()
             return mark_safe(getattr(self, key))