-def main_page(request):
- if request.user.is_authenticated():
- shelves = models.Tag.objects.filter(category='set', user=request.user)
- new_set_form = forms.NewSetForm()
- extra_where = 'NOT catalogue_tag.category = "set"'
- tags = models.Tag.objects.usage_for_model(models.Book, counts=True, extra={'where': [extra_where]})
- fragment_tags = models.Tag.objects.usage_for_model(models.Fragment, counts=True,
- extra={'where': ['catalogue_tag.category = "theme"'] + [extra_where]})
- categories = split_tags(tags)
-
- form = forms.SearchForm()
- return render_to_response('catalogue/main_page.html', locals(),
+ objects = only_author = None
+ categories = {}
+ object_queries = []
+
+ if theme_is_set:
+ shelf_tags = [tag for tag in tags if tag.category == 'set']
+ fragment_tags = [tag for tag in tags if tag.category != 'set']
+ fragments = models.Fragment.tagged.with_all(fragment_tags)
+ areas = PictureArea.tagged.with_all(fragment_tags)
+
+ if shelf_tags:
+ books = models.Book.tagged.with_all(shelf_tags).order_by()
+ l_tags = models.Tag.objects.filter(category='book',
+ slug__in=[book.book_tag_slug() for book in books.iterator()])
+ fragments = models.Fragment.tagged.with_any(l_tags, fragments)
+
+ # newtagging goes crazy if we just try:
+ #related_tags = models.Tag.objects.usage_for_queryset(fragments, counts=True,
+ # extra={'where': ["catalogue_tag.category != 'book'"]})
+
+ related_tags = []
+
+ fragment_keys = [fragment.pk for fragment in fragments.iterator()]
+ if fragment_keys:
+ related_tags = models.Fragment.tags.usage(counts=True,
+ filters={'pk__in': fragment_keys},
+ extra={'where': ["catalogue_tag.category != 'book'"]})
+ related_tags = (tag for tag in related_tags if tag not in fragment_tags)
+ categories = split_tags(related_tags, categories)
+
+ object_queries.insert(0, fragments)
+
+ area_keys = [area.pk for area in areas.iterator()]
+ if area_keys:
+ related_tags = PictureArea.tags.usage(counts=True,
+ filters={'pk__in': area_keys})
+ related_tags = (tag for tag in related_tags if tag not in fragment_tags)
+
+ categories = split_tags(related_tags, categories)
+
+ # we want the Pictures to go first
+ object_queries.insert(0, areas)
+ objects = MultiQuerySet(*object_queries)
+ else:
+ if shelf_is_set:
+ books = models.Book.tagged.with_all(tags).order_by('sort_key_author')
+ else:
+ books = models.Book.tagged_top_level(tags).order_by('sort_key_author')
+
+ 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`
+ 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
+
+ if pictures.count() > 0:
+ 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
+ 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
+
+
+ objects = SortedMultiQuerySet(pictures, books, order_by='sort_key_author')
+
+
+ if not objects:
+ only_author = len(tags) == 1 and tags[0].category == 'author'
+ objects = models.Book.objects.none()
+
+ return render_to_response('catalogue/tagged_object_list.html',
+ {
+ 'object_list': objects,
+ 'categories': categories,
+ 'only_shelf': only_shelf,
+ 'only_author': only_author,
+ 'only_my_shelf': only_my_shelf,
+ 'formats_form': forms.DownloadFormatsForm(),
+ 'tags': tags,
+ 'theme_is_set': theme_is_set,
+ },