Fixes #4028: bad publishing suggestion admin links.
[wolnelektury.git] / src / catalogue / views.py
index 66a2b91..aeed403 100644 (file)
@@ -5,7 +5,6 @@ from collections import OrderedDict
 import random
 
 from django.conf import settings
 import random
 
 from django.conf import settings
-from django.http.response import HttpResponseForbidden
 from django.template.loader import render_to_string
 from django.shortcuts import get_object_or_404, render, redirect
 from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponsePermanentRedirect
 from django.template.loader import render_to_string
 from django.shortcuts import get_object_or_404, render, redirect
 from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponsePermanentRedirect
@@ -28,14 +27,13 @@ from catalogue.helpers import get_top_level_related_tags
 from catalogue.models import Book, Collection, Tag, Fragment
 from catalogue.utils import split_tags
 from catalogue.models.tag import prefetch_relations
 from catalogue.models import Book, Collection, Tag, Fragment
 from catalogue.utils import split_tags
 from catalogue.models.tag import prefetch_relations
-from wolnelektury.utils import is_crawler
 
 staff_required = user_passes_test(lambda user: user.is_staff)
 
 
 def catalogue(request):
     return render(request, 'catalogue/catalogue.html', {
 
 staff_required = user_passes_test(lambda user: user.is_staff)
 
 
 def catalogue(request):
     return render(request, 'catalogue/catalogue.html', {
-        'books': Book.objects.filter(parent=None),
+        'books': Book.objects.filter(findable=True, parent=None),
         'pictures': Picture.objects.all(),
         'collections': Collection.objects.all(),
         'active_menu_item': 'all_works',
         'pictures': Picture.objects.all(),
         'collections': Collection.objects.all(),
         'active_menu_item': 'all_works',
@@ -81,10 +79,13 @@ def differentiate_tags(request, tags, ambiguous_slugs):
         })
     return render(
         request,
         })
     return render(
         request,
-        'catalogue/differentiate_tags.html', {'tags': tags, 'options': options, 'unparsed': ambiguous_slugs[1:]})
+        'catalogue/differentiate_tags.html',
+        {'tags': tags, 'options': options, 'unparsed': ambiguous_slugs[1:]}
+    )
 
 
 
 
-def object_list(request, objects, fragments=None, related_tags=None, tags=None, list_type='books', extra=None):
+def object_list(request, objects, fragments=None, related_tags=None, tags=None,
+                list_type='books', extra=None):
     if not tags:
         tags = []
     tag_ids = [tag.pk for tag in tags]
     if not tags:
         tags = []
     tag_ids = [tag.pk for tag in tags]
@@ -94,7 +95,9 @@ def object_list(request, objects, fragments=None, related_tags=None, tags=None,
         related_tag_lists.append(related_tags)
     else:
         related_tag_lists.append(
         related_tag_lists.append(related_tags)
     else:
         related_tag_lists.append(
-            Tag.objects.usage_for_queryset(objects, counts=True).exclude(category='set').exclude(pk__in=tag_ids))
+            Tag.objects.usage_for_queryset(
+                objects, counts=True
+            ).exclude(category='set').exclude(pk__in=tag_ids))
     if not (extra and extra.get('theme_is_set')):
         if fragments is None:
             if list_type == 'gallery':
     if not (extra and extra.get('theme_is_set')):
         if fragments is None:
             if list_type == 'gallery':
@@ -102,7 +105,9 @@ def object_list(request, objects, fragments=None, related_tags=None, tags=None,
             else:
                 fragments = Fragment.objects.filter(book__in=objects)
         related_tag_lists.append(
             else:
                 fragments = Fragment.objects.filter(book__in=objects)
         related_tag_lists.append(
-            Tag.objects.usage_for_queryset(fragments, counts=True).filter(category='theme').exclude(pk__in=tag_ids)
+            Tag.objects.usage_for_queryset(
+                fragments, counts=True
+            ).filter(category='theme').exclude(pk__in=tag_ids)
             .only('name', 'sort_key', 'category', 'slug'))
         if isinstance(objects, QuerySet):
             objects = prefetch_relations(objects, 'author')
             .only('name', 'sort_key', 'category', 'slug'))
         if isinstance(objects, QuerySet):
             objects = prefetch_relations(objects, 'author')
@@ -139,7 +144,7 @@ def object_list(request, objects, fragments=None, related_tags=None, tags=None,
 
 
 def literature(request):
 
 
 def literature(request):
-    books = Book.objects.filter(parent=None)
+    books = Book.objects.filter(parent=None, findable=True)
     return object_list(request, books, related_tags=get_top_level_related_tags([]))
 
 
     return object_list(request, books, related_tags=get_top_level_related_tags([]))
 
 
@@ -148,9 +153,9 @@ def gallery(request):
 
 
 def audiobooks(request):
 
 
 def audiobooks(request):
-    audiobooks = Book.objects.filter(media__type__in=('mp3', 'ogg')).distinct()
+    audiobooks = Book.objects.filter(findable=True, media__type__in=('mp3', 'ogg')).distinct()
     return object_list(request, audiobooks, list_type='audiobooks', extra={
     return object_list(request, audiobooks, list_type='audiobooks', extra={
-        'daisy': Book.objects.filter(media__type='daisy').distinct(),
+        'daisy': Book.objects.filter(findable=True, media__type='daisy').distinct(),
     })
 
 
     })
 
 
@@ -169,8 +174,7 @@ def analyse_tags(request, tag_str):
         chunks = tag_str.split('/')
         if len(chunks) == 2 and chunks[0] == 'autor':
             raise ResponseInstead(pdcounter_views.author_detail(request, chunks[1]))
         chunks = tag_str.split('/')
         if len(chunks) == 2 and chunks[0] == 'autor':
             raise ResponseInstead(pdcounter_views.author_detail(request, chunks[1]))
-        else:
-            raise Http404
+        raise Http404
     except Tag.MultipleObjectsReturned as e:
         # Ask the user to disambiguate
         raise ResponseInstead(differentiate_tags(request, e.tags, e.ambiguous_slugs))
     except Tag.MultipleObjectsReturned as e:
         # Ask the user to disambiguate
         raise ResponseInstead(differentiate_tags(request, e.tags, e.ambiguous_slugs))
@@ -199,6 +203,8 @@ def theme_list(request, tags, list_type):
         # TODO: Pictures on shelves not supported yet.
         books = Book.tagged.with_all(shelf_tags).order_by()
         fragments = fragments.filter(Q(book__in=books) | Q(book__ancestor__in=books))
         # TODO: Pictures on shelves not supported yet.
         books = Book.tagged.with_all(shelf_tags).order_by()
         fragments = fragments.filter(Q(book__in=books) | Q(book__ancestor__in=books))
+    elif list_type == 'books':
+        fragments = fragments.filter(book__findable=True)
 
     if not fragments and len(tags) == 1 and list_type == 'books':
         if PictureArea.tagged.with_any(tags).exists() or Picture.tagged.with_any(tags).exists():
 
     if not fragments and len(tags) == 1 and list_type == 'books':
         if PictureArea.tagged.with_any(tags).exists() or Picture.tagged.with_any(tags).exists():
@@ -216,9 +222,6 @@ def tagged_object_list(request, tags, list_type):
     except ResponseInstead as e:
         return e.response
 
     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 list_type == 'gallery' and any(tag.category == 'set' for tag in tags):
         raise Http404
 
@@ -231,19 +234,22 @@ def tagged_object_list(request, tags, list_type):
         if any(tag.category == 'set' for tag in tags):
             params = {'objects': books}
         else:
         if any(tag.category == 'set' for tag in tags):
             params = {'objects': books}
         else:
+            books = books.filter(findable=True)
             params = {
             params = {
-                'objects': Book.tagged_top_level(tags),
+                'objects': Book.tagged_top_level(tags).filter(findable=True),
                 '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':
                 '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()
+        audiobooks = Book.objects.filter(findable=True, media__type__in=('mp3', 'ogg')).distinct()
         params = {
             'objects': Book.tagged.with_all(tags, audiobooks),
             'extra': {
         params = {
             'objects': Book.tagged.with_all(tags, audiobooks),
             'extra': {
-                'daisy': Book.tagged.with_all(tags, audiobooks.filter(media__type='daisy').distinct()),
+                'daisy': Book.tagged.with_all(
+                    tags, audiobooks.filter(media__type='daisy').distinct()
+                ),
             }
         }
     else:
             }
         }
     else:
@@ -342,11 +348,13 @@ def import_book(request):
             exception = pprint.pformat(info[1])
             tb = '\n'.join(traceback.format_tb(info[2]))
             return HttpResponse(
             exception = pprint.pformat(info[1])
             tb = '\n'.join(traceback.format_tb(info[2]))
             return HttpResponse(
-                    _("An error occurred: %(exception)s\n\n%(tb)s") % {'exception': exception, 'tb': tb},
-                    mimetype='text/plain')
+                _("An error occurred: %(exception)s\n\n%(tb)s") % {
+                    'exception': exception, 'tb': tb
+                },
+                mimetype='text/plain'
+            )
         return HttpResponse(_("Book imported successfully"))
         return HttpResponse(_("Book imported successfully"))
-    else:
-        return HttpResponse(_("Error importing file: %r") % book_import_form.errors)
+    return HttpResponse(_("Error importing file: %r") % book_import_form.errors)
 
 
 # info views for API
 
 
 # info views for API
@@ -405,7 +413,7 @@ class CustomPDFFormView(AjaxableFormView):
 
     def validate_object(self, obj, request):
         book = obj
 
     def validate_object(self, obj, request):
         book = obj
-        if book.preview and not Membership_is_active_for(request.user):
+        if book.preview and not Membership.is_active_for(request.user):
             return HttpResponseRedirect(book.get_absolute_url())
         return super(CustomPDFFormView, self).validate_object(obj, request)
 
             return HttpResponseRedirect(book.get_absolute_url())
         return super(CustomPDFFormView, self).validate_object(obj, request)