Skip to content

Commit a25f219

Browse files
committed
Display is correct
1 parent 247d69a commit a25f219

File tree

4 files changed

+87
-90
lines changed

4 files changed

+87
-90
lines changed

kitsune/wiki/forms.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,12 @@ def __init__(self, *args, **kwargs):
260260
locale_choices.append(choice)
261261

262262
related_documents_field.choices = locale_choices
263+
264+
# Update the widget with locale-aware documents for proper rendering
265+
if locale_aware_related_docs:
266+
related_documents_field.widget = RelatedDocumentsWidget(
267+
locale_aware_related_docs=locale_aware_related_docs
268+
)
263269
else:
264270
related_documents_field.choices = Document.objects.values_list("id", "title")
265271

kitsune/wiki/jinja2/wiki/includes/document_macros.html

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -406,32 +406,32 @@ <h4 class="document-vote--heading">{{ header }}</h4>
406406
{% endif %}
407407
{%- endmacro %}
408408

409-
{% macro related_documents(locale_aware_docs) %}
410-
{% if locale_aware_docs|length > 0 %}
409+
{% macro related_documents(locale_aware_related_documents) %}
410+
{% if locale_aware_related_documents|length > 0 %}
411411
<section id="related-documents" class="sumo-page-section wiki-related-documents">
412412
<div class="text-center">
413413
<h2 class="sumo-page-subheading">{{ _('Related Articles') }}</h2>
414414
</div>
415415
<div class="sumo-card-grid">
416416
<div class="scroll-wrap">
417-
{% for related in locale_aware_docs %}
418-
<div class="card card--article">
419-
<img class="card--icon-sm" src="{{ webpack_static('protocol/img/icons/reader-mode.svg') }}" alt="todo: title" />
420-
<div class="card--details">
421-
<h3 class="card--title">
422-
<a class="expand-this-link" href="{{ url('wiki.document', related.slug) }}"
423-
data-event-name="link_click"
424-
data-event-parameters='{"link_name": "related.kb-article"}'>
425-
{{ related.title }}
426-
</a>
427-
</h3>
428-
<div class="card--desc">
429-
<p>
430-
{{ related.html|striptags|truncate(length=150) }}
431-
</p>
417+
{% for related in locale_aware_related_documents %}
418+
<div class="card card--article">
419+
<img class="card--icon-sm" src="{{ webpack_static('protocol/img/icons/reader-mode.svg') }}" alt="todo: title" />
420+
<div class="card--details">
421+
<h3 class="card--title">
422+
<a class="expand-this-link" href="{{ url('wiki.document', related.slug) }}"
423+
data-event-name="link_click"
424+
data-event-parameters='{"link_name": "related.kb-article"}'>
425+
{{ related.title }}
426+
</a>
427+
</h3>
428+
<div class="card--desc">
429+
<p>
430+
{{ related.html|striptags|truncate(length=150) }}
431+
</p>
432+
</div>
432433
</div>
433-
</div>
434-
</div>
434+
</div>
435435
{% endfor %}
436436
</div>
437437
</div>

kitsune/wiki/views.py

Lines changed: 34 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,7 @@ def maybe_vary_on_accept_language(response):
314314
)
315315

316316
update_kb_visited(request.session, doc)
317-
318-
locale_aware_related_docs = _get_locale_aware_related_docs(
317+
locale_aware_related_docs = _get_locale_aware_related_documents(
319318
doc, request.LANGUAGE_CODE, request.user
320319
)
321320

@@ -602,13 +601,12 @@ def edit_document_metadata(request, document_slug, revision_id=None):
602601
can_edit_needs_change = doc.allows(user, "edit_needs_change")
603602
can_archive = doc.allows(user, "archive")
604603

605-
# Get locale-aware related docs for both initial values and form choices
606-
locale_aware_related_docs = _get_locale_aware_related_docs(
604+
locale_aware_related_docs = _get_locale_aware_related_documents(
607605
doc, request.LANGUAGE_CODE, request.user
608606
)
609607

610608
doc_form = DocumentForm(
611-
initial=_document_form_initial(doc, request.LANGUAGE_CODE, request.user),
609+
initial=_document_form_initial(doc),
612610
can_archive=can_archive,
613611
can_edit_needs_change=can_edit_needs_change,
614612
locale=request.LANGUAGE_CODE,
@@ -648,10 +646,6 @@ def edit_document_metadata(request, document_slug, revision_id=None):
648646
show_revision_warning = _show_revision_warning(doc, rev)
649647
locked, locked_by = _document_lock(doc.id, user.username)
650648

651-
locale_aware_related_docs = _get_locale_aware_related_docs(
652-
doc, request.LANGUAGE_CODE, request.user
653-
)
654-
655649
return render(
656650
request,
657651
"wiki/edit_metadata.html",
@@ -661,7 +655,6 @@ def edit_document_metadata(request, document_slug, revision_id=None):
661655
"show_revision_warning": show_revision_warning,
662656
"locked": locked,
663657
"locked_by": locked_by,
664-
"locale_aware_related_docs": locale_aware_related_docs,
665658
},
666659
)
667660

@@ -989,18 +982,15 @@ def translate(request, document_slug, revision_id=None):
989982
).first()
990983

991984
base_rev = doc_form = rev_form = None
992-
993-
# Get locale-aware related docs for the document (or parent if translating)
994-
doc_for_related = doc if doc else parent_doc
995-
locale_aware_related_docs = _get_locale_aware_related_docs(
996-
doc_for_related, request.LANGUAGE_CODE, user
997-
)
985+
locale_aware_related_docs = None
986+
if doc:
987+
locale_aware_related_docs = _get_locale_aware_related_documents(
988+
doc, request.LANGUAGE_CODE, request.user
989+
)
998990

999991
if user_has_doc_perm:
1000992
# Restore draft if draft is available and user requested to restore
1001-
doc_initial = (
1002-
_document_form_initial(doc, request.LANGUAGE_CODE, request.user) if doc else {}
1003-
)
993+
doc_initial = _document_form_initial(doc) if doc else {}
1004994
doc_form = DocumentForm(
1005995
initial=doc_initial,
1006996
locale=request.LANGUAGE_CODE,
@@ -1697,63 +1687,37 @@ def show_translations(request, document_slug):
16971687
)
16981688

16991689

1700-
def _get_locale_aware_related_docs(document, locale, user):
1690+
def _get_locale_aware_related_documents(document, locale, user):
17011691
"""Return visible related documents prioritizing the given locale."""
17021692

1703-
# For translated documents, we need to check both:
1704-
# 1. Documents directly related to this document
1705-
# 2. Documents related to the parent document (inheritance)
1706-
documents_to_check = [document]
1707-
if document.parent:
1708-
documents_to_check.append(document.parent)
1709-
1710-
# Get all related documents from both the document and its parent (if any)
1711-
related_docs = (
1712-
Document.objects.visible(user)
1713-
.filter(related_documents__in=documents_to_check)
1714-
.select_related("parent")
1715-
.distinct()
1716-
)
1693+
# Get the original document (parent if this is a translation, or self if original)
1694+
original_document = document.parent or document
17171695

1718-
def _should_include_doc(doc):
1719-
"""Determine if a document should be included in the results."""
1720-
if doc.locale == locale:
1721-
return doc
1696+
related_docs = original_document.related_documents.visible(user).select_related("parent")
17221697

1723-
if doc.locale == settings.WIKI_DEFAULT_LANGUAGE:
1724-
# English document - check for translation in target locale
1725-
if translation := doc.translated_to(locale, visible_for_user=user):
1726-
return translation
1727-
if locale == settings.WIKI_DEFAULT_LANGUAGE:
1728-
return doc
1729-
return None
1698+
final_related_docs = []
17301699

1731-
if doc.parent and doc.parent.locale == settings.WIKI_DEFAULT_LANGUAGE:
1732-
# Translation of English document - check if parent has translation in target locale
1733-
if translation := doc.parent.translated_to(locale, visible_for_user=user):
1734-
return translation
1735-
if locale == settings.WIKI_DEFAULT_LANGUAGE:
1736-
return doc
1737-
return None
1738-
1739-
# Non-English document without English parent
1740-
return doc if locale == doc.locale else None
1700+
for related_doc in related_docs:
1701+
if related_doc.locale == locale:
1702+
final_related_docs.append(related_doc)
1703+
elif related_doc.locale == settings.WIKI_DEFAULT_LANGUAGE:
1704+
if translation := related_doc.translated_to(locale, visible_for_user=user):
1705+
final_related_docs.append(translation)
1706+
else:
1707+
final_related_docs.append(related_doc)
1708+
elif related_doc.parent and related_doc.parent.locale == settings.WIKI_DEFAULT_LANGUAGE:
1709+
if translation := related_doc.parent.translated_to(locale, visible_for_user=user):
1710+
final_related_docs.append(translation)
1711+
else:
1712+
final_related_docs.append(related_doc)
1713+
else:
1714+
final_related_docs.append(related_doc)
17411715

1742-
return [result for doc in related_docs if (result := _should_include_doc(doc)) is not None]
1716+
return final_related_docs
17431717

17441718

1745-
def _document_form_initial(document, locale=None, user=None):
1719+
def _document_form_initial(document):
17461720
"""Return a dict with the document data pertinent for the form."""
1747-
# Get locale-aware related documents if locale and user are provided
1748-
if locale and user:
1749-
locale_aware_related = _get_locale_aware_related_docs(document, locale, user)
1750-
related_docs_ids = [doc.id for doc in locale_aware_related]
1751-
else:
1752-
# Fallback to original behavior
1753-
related_docs_ids = Document.objects.filter(related_documents=document).values_list(
1754-
"id", flat=True
1755-
)
1756-
17571721
return {
17581722
"title": document.title,
17591723
"slug": document.slug,
@@ -1762,7 +1726,9 @@ def _document_form_initial(document, locale=None, user=None):
17621726
"is_archived": document.is_archived,
17631727
"topics": Topic.active.filter(document=document).values_list("id", flat=True),
17641728
"products": list(Product.active.filter(document=document).values_list("id", flat=True)),
1765-
"related_documents": related_docs_ids,
1729+
"related_documents": Document.objects.filter(related_documents=document).values_list(
1730+
"id", flat=True
1731+
),
17661732
"allow_discussion": document.allow_discussion,
17671733
"needs_change": document.needs_change,
17681734
"needs_change_comment": document.needs_change_comment,

kitsune/wiki/widgets.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,38 @@ def render(self, name, value, attrs=None, renderer=None):
7171
class RelatedDocumentsWidget(forms.widgets.SelectMultiple):
7272
"""A widget to render the related documents list and search field."""
7373

74+
def __init__(self, attrs=None, locale_aware_related_docs=None):
75+
super().__init__(attrs)
76+
self.locale_aware_related_docs = locale_aware_related_docs or []
77+
7478
def render(self, name, value, attrs=None, renderer=None):
7579
if isinstance(value, int):
76-
related_documents = Document.objects.filter(id__in=[value])
80+
value = [value]
7781
elif not isinstance(value, str) and isinstance(value, Iterable):
78-
related_documents = Document.objects.filter(id__in=value)
82+
value = list(value)
7983
else:
80-
related_documents = Document.objects.none()
84+
value = []
85+
86+
# Use locale-aware documents if available and matching the selected values
87+
related_documents = []
88+
if self.locale_aware_related_docs and value:
89+
# Map the locale-aware documents by ID for quick lookup
90+
locale_aware_by_id = {str(doc.id): doc for doc in self.locale_aware_related_docs}
91+
92+
for val in value:
93+
val_str = str(val)
94+
if val_str in locale_aware_by_id:
95+
related_documents.append(locale_aware_by_id[val_str])
96+
else:
97+
# Fallback to database query if not in locale-aware list
98+
try:
99+
doc = Document.objects.get(id=val)
100+
related_documents.append(doc)
101+
except Document.DoesNotExist:
102+
pass
103+
elif value:
104+
# Fallback to original behavior if no locale-aware docs provided
105+
related_documents = Document.objects.filter(id__in=value)
81106

82107
return render_to_string(
83108
"wiki/includes/related_docs_widget.html",

0 commit comments

Comments
 (0)