def catalogue(request, as_json=False): common_categories = ('author',) split_categories = ('epoch', 'genre', 'kind') categories = split_tags( get_top_level_related_tags(categories=common_categories), models.Tag.objects.usage_for_model( models.Fragment, counts=True).filter(category='theme'), models.Tag.objects.usage_for_model( Picture, counts=True).filter(category__in=common_categories), models.Tag.objects.usage_for_model( PictureArea, counts=True).filter( category='theme') ) book_categories = split_tags( get_top_level_related_tags(categories=split_categories) ) picture_categories = split_tags( models.Tag.objects.usage_for_model( Picture, counts=True).filter( category__in=split_categories), ) collections = models.Collection.objects.all() def render_tag_list(tags): return render_to_string('catalogue/tag_list.html', tag_list(tags)) def render_split(with_books, with_pictures): ctx = {} if with_books: ctx['books'] = render_tag_list(with_books) if with_pictures: ctx['pictures'] = render_tag_list(with_pictures) return render_to_string('catalogue/tag_list_split.html', ctx) output = {} output['theme'] = render_tag_list(categories.get('theme', [])) for category in common_categories: output[category] = render_tag_list(categories.get(category, [])) for category in split_categories: output[category] = render_split( book_categories.get(category, []), picture_categories.get(category, [])) output['collections'] = render_to_string( 'catalogue/collection_list.html', collection_list(collections)) if as_json: return JsonResponse(output) else: return render_to_response('catalogue/catalogue.html', locals(), context_instance=RequestContext(request))
def literature(request): books = Book.objects.filter(parent=None) # last_published = Book.objects.exclude(cover_thumb='').filter(parent=None).order_by('-created_at')[:20] # most_popular = Book.objects.exclude(cover_thumb='')\ # .order_by('-popularity__count', 'sort_key_author', 'sort_key')[:20] return object_list(request, books, related_tags=get_top_level_related_tags([]))
def tagged_object_list(request, tags, list_type): try: tags = analyse_tags(request, tags) except ResponseInstead as e: return e.response if list_type == 'gallery' and any(tag.category == 'set' for tag in tags): raise Http404 if any(tag.category in ('theme', 'thing') for tag in tags): return theme_list(request, tags, list_type=list_type) if list_type == 'books': books = Book.tagged.with_all(tags) if any(tag.category == 'set' for tag in tags): params = {'objects': books} else: params = { 'objects': Book.tagged_top_level(tags), 'fragments': Fragment.objects.filter(book__in=books), 'related_tags': get_top_level_related_tags(tags), } elif list_type == 'gallery': params = {'objects': Picture.tagged.with_all(tags)} elif list_type == 'audiobooks': audiobooks = Book.objects.filter(media__type__in=('mp3', 'ogg')).distinct() params = { 'objects': Book.tagged.with_all(tags, audiobooks), 'extra': { 'daisy': Book.tagged.with_all( tags, audiobooks.filter(media__type='daisy').distinct()), } } else: raise Http404 return object_list(request, tags=tags, list_type=list_type, **params)
def tag_catalogue(request, category): if category == 'theme': tags = Tag.objects.usage_for_model( Fragment, counts=True).filter(category='theme') else: tags = list(get_top_level_related_tags((), categories=(category,))) described_tags = [tag for tag in tags if tag.description] if len(described_tags) > 4: best = random.sample(described_tags, 4) else: best = described_tags return render(request, 'catalogue/tag_catalogue.html', { 'tags': tags, 'best': best, 'title': constants.CATEGORIES_NAME_PLURAL[category], 'whole_category': constants.WHOLE_CATEGORY[category], 'active_menu_item': 'theme' if category == 'theme' else None, })
def tagged_object_list(request, tags, list_type): try: tags = analyse_tags(request, tags) except ResponseInstead as e: return e.response if is_crawler(request) and len(tags) > 1: return HttpResponseForbidden('address removed from crawling. check robots.txt') if list_type == 'gallery' and any(tag.category == 'set' for tag in tags): raise Http404 if any(tag.category in ('theme', 'thing') for tag in tags): return theme_list(request, tags, list_type=list_type) if list_type == 'books': books = Book.tagged.with_all(tags) if any(tag.category == 'set' for tag in tags): params = {'objects': books} else: params = { 'objects': Book.tagged_top_level(tags), 'fragments': Fragment.objects.filter(book__in=books), 'related_tags': get_top_level_related_tags(tags), } elif list_type == 'gallery': params = {'objects': Picture.tagged.with_all(tags)} elif list_type == 'audiobooks': audiobooks = Book.objects.filter(media__type__in=('mp3', 'ogg')).distinct() params = { 'objects': Book.tagged.with_all(tags, audiobooks), 'extra': { 'daisy': Book.tagged.with_all(tags, audiobooks.filter(media__type='daisy').distinct()), } } else: raise Http404 return object_list(request, tags=tags, list_type=list_type, **params)
def tag_catalogue(request, category): if category == 'theme': tags = Tag.objects.usage_for_model( Fragment, counts=True).filter(category='theme') else: tags = list(get_top_level_related_tags((), categories=(category, ))) described_tags = [tag for tag in tags if tag.description] if len(described_tags) > 4: best = random.sample(described_tags, 4) else: best = described_tags return render( request, 'catalogue/tag_catalogue.html', { 'tags': tags, 'best': best, 'title': constants.CATEGORIES_NAME_PLURAL[category], 'whole_category': constants.WHOLE_CATEGORY[category], 'active_menu_item': 'theme' if category == 'theme' else None, })
def literature(request): books = Book.objects.filter(parent=None) return object_list(request, books, related_tags=get_top_level_related_tags([]))
# we want the Pictures to go first objects = MultiQuerySet(areas, fragments) else: all_books = models.Book.tagged.with_all(tags) if shelf_is_set: books = all_books.order_by('sort_key_author', 'title') pictures = Picture.objects.none() related_book_tags = models.Tag.objects.usage_for_queryset( books, counts=True).exclude( category='set').exclude(pk__in=tags_pks) else: books = models.Book.tagged_top_level(tags).order_by( 'sort_key_author', 'title') pictures = Picture.tagged.with_all(tags).order_by( 'sort_key_author', 'title') related_book_tags = get_top_level_related_tags(tags) fragments = models.Fragment.objects.filter(book__in=all_books) areas = PictureArea.objects.filter(picture__in=pictures) categories = split_tags( related_book_tags, models.Tag.objects.usage_for_queryset( pictures, counts=True).exclude(pk__in=tags_pks), models.Tag.objects.usage_for_queryset( fragments, counts=True).filter( category='theme').exclude(pk__in=tags_pks), models.Tag.objects.usage_for_queryset( areas, counts=True).filter( category__in=('theme', 'thing')).exclude( pk__in=tags_pks),