fix bug with related tags and object display when tag spanned both books and pictures
authorMarcin Koziej <marcin@lolownia.org>
Mon, 10 Feb 2014 14:52:12 +0000 (15:52 +0100)
committerMarcin Koziej <marcin@lolownia.org>
Mon, 10 Feb 2014 14:52:32 +0000 (15:52 +0100)
apps/catalogue/utils.py
apps/catalogue/views.py

index fd74c94..884c250 100644 (file)
@@ -215,22 +215,25 @@ class SortedMultiQuerySet(MultiQuerySet):
 
         while len(items) < total_len:
             candidate = None
+            candidate_i = None
             for i in i_s:
                 def get_next():
                     return self.querysets[i][sort_heads[i]]
                 try:
                     if candidate is None:
                         candidate = get_next()
+                        candidate_i = i
                     else:
                         competitor = get_next()
                         if self.sortfn(candidate, competitor) > 0:
                             candidate = competitor
+                            candidate_i = i
                 except IndexError:
                     continue # continue next sort_head
-                sort_heads[i] += 1
             # we have no more elements:
             if candidate is None:
                 break
+            sort_heads[candidate_i] += 1
             if skipped < offset:
                 skipped += 1
                 continue # continue next item
index 232b3a7..65b9c6c 100644 (file)
@@ -239,44 +239,36 @@ def tagged_object_list(request, tags=''):
 
         pictures = Picture.tagged.with_all(tags).order_by('sort_key_author')
             
+        related_counts = {}
         if books.count() > 0:
             # get related tags from `tag_counter` and `theme_counter`
-            related_counts = {}
             tags_pks = [tag.pk for tag in tags]
             for book in books:
                 for tag_pk, value in itertools.chain(book.tag_counter.iteritems(), book.theme_counter.iteritems()):
                     if tag_pk in tags_pks:
                         continue
                     related_counts[tag_pk] = related_counts.get(tag_pk, 0) + value
-            related_tags = models.Tag.objects.filter(pk__in=related_counts.keys())
-            related_tags = [tag for tag in related_tags if tag not in tags]
-            for tag in related_tags:
-                tag.count = related_counts[tag.pk]
-
-            categories = split_tags(related_tags)
-            del related_tags
 
         if pictures.count() > 0:
-            related_counts = {}
             tags_pks = [tag.pk for tag in tags]
             for picture in pictures:
                 for tag_pk, value in itertools.chain(picture.tag_counter.iteritems(), picture.theme_counter.iteritems()):
                     if tag_pk in tags_pks:
                         continue
-                    logging.info("counting tag not in tags_pks: %d", tag_pk)
                     related_counts[tag_pk] = related_counts.get(tag_pk, 0) + value
-            related_tags = models.Tag.objects.filter(pk__in=related_counts.keys())
-            related_tags = [tag for tag in related_tags if tag not in tags]
-            for tag in related_tags:
-                tag.count = related_counts[tag.pk]
 
-            categories = split_tags(related_tags)
-            del related_tags
+        related_tags = models.Tag.objects.filter(pk__in=related_counts.keys())
+        related_tags = [tag for tag in related_tags if tag not in tags]
 
-        logging.info("Returning %d picutres and %d books" % (pictures.count(), books.count()))
-        objects = SortedMultiQuerySet(pictures, books, order_by='sort_key_author')
+        for tag in related_tags:
+            tag.count = related_counts[tag.pk]
+
+        categories = split_tags(related_tags)
+        del related_tags
 
 
+        objects = SortedMultiQuerySet(pictures, books, order_by='sort_key_author')
+
 
     if not objects:
         only_author = len(tags) == 1 and tags[0].category == 'author'