def document_listing()

in kitsune/products/views.py [0:0]


def document_listing(request, topic_slug, product_slug=None, subtopic_slug=None):
    """The document listing page for a product + topic."""

    topic_navigation = any(
        [
            request.resolver_match.url_name == "products.topic_documents",
            request.resolver_match.url_name == "products.topic_product_documents",
            topic_slug and not product_slug,
        ]
    )

    if topic_slug:
        try:
            old_topic_slug = TopicSlugHistory.objects.get(
                Q(slug=topic_slug) | Q(slug=subtopic_slug)
            )
            redirect_params = {
                "topic_slug": old_topic_slug.topic.slug,
                "permanent": True,
            }

            if product_slug:
                redirect_params["product_slug"] = product_slug
            return redirect(document_listing, **redirect_params)
        except TopicSlugHistory.DoesNotExist:
            ...
        except TopicSlugHistory.MultipleObjectsReturned:
            ...

    product = None
    if product_slug:
        product = get_object_or_404(Product, slug=product_slug)
        set_aaq_context(request, product)

    doc_kw = {
        "locale": request.LANGUAGE_CODE,
        "products": [product] if product else None,
    }
    subtopic = None
    topic_list = []
    product_topics = []
    relevant_products = []
    topic_kw = {
        "slug": topic_slug,
        "visible": True,
    }

    if topic_navigation:
        try:
            topic = Topic.active.get(**topic_kw)
        except Topic.DoesNotExist:
            raise Http404
        except Topic.MultipleObjectsReturned:
            topic = Topic.active.filter(**topic_kw).first()

        topic_list = Topic.active.filter(in_nav=True)
        relevant_products = Product.active.filter(m2m_topics=topic).filter(
            Exists(
                Document.objects.visible(
                    is_archived=False,
                    topics=topic,
                    products=OuterRef("pk"),
                    locale=request.LANGUAGE_CODE,
                    category__in=settings.IA_DEFAULT_CATEGORIES,
                )
            )
        )
    else:
        topic = get_object_or_404(
            Topic.active, slug=topic_slug, products=product, parent__isnull=True
        )
        product_topics = topics_for(request.user, product=product, parent=None)

        if subtopic_slug is not None:
            subtopic = get_object_or_404(
                Topic.active, slug=subtopic_slug, products=product, parent=topic
            )
            doc_kw["topics"] = [subtopic]

    if not doc_kw.get("topics"):
        doc_kw["topics"] = [topic]
    template = "products/documents.html"

    documents, fallback_documents = documents_for(request.user, **doc_kw)

    for document in documents:
        document["is_first_revision"] = (
            Revision.objects.filter(document=document["id"], is_approved=True).count() == 1
        )

    return render(
        request,
        template,
        {
            "product": product,
            "topic": topic,
            "subtopic": subtopic,
            "topics": product_topics,
            "subtopics": topics_for(request.user, product=product, parent=topic),
            "documents": documents,
            "fallback_documents": fallback_documents,
            "search_params": {"product": product_slug},
            "topic_navigation": topic_navigation,
            "topic_list": topic_list,
            "products": relevant_products,
        },
    )