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,
},
)