@@ -314,8 +314,7 @@ def maybe_vary_on_accept_language(response):
314
314
)
315
315
316
316
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 (
319
318
doc , request .LANGUAGE_CODE , request .user
320
319
)
321
320
@@ -602,13 +601,12 @@ def edit_document_metadata(request, document_slug, revision_id=None):
602
601
can_edit_needs_change = doc .allows (user , "edit_needs_change" )
603
602
can_archive = doc .allows (user , "archive" )
604
603
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 (
607
605
doc , request .LANGUAGE_CODE , request .user
608
606
)
609
607
610
608
doc_form = DocumentForm (
611
- initial = _document_form_initial (doc , request . LANGUAGE_CODE , request . user ),
609
+ initial = _document_form_initial (doc ),
612
610
can_archive = can_archive ,
613
611
can_edit_needs_change = can_edit_needs_change ,
614
612
locale = request .LANGUAGE_CODE ,
@@ -648,10 +646,6 @@ def edit_document_metadata(request, document_slug, revision_id=None):
648
646
show_revision_warning = _show_revision_warning (doc , rev )
649
647
locked , locked_by = _document_lock (doc .id , user .username )
650
648
651
- locale_aware_related_docs = _get_locale_aware_related_docs (
652
- doc , request .LANGUAGE_CODE , request .user
653
- )
654
-
655
649
return render (
656
650
request ,
657
651
"wiki/edit_metadata.html" ,
@@ -661,7 +655,6 @@ def edit_document_metadata(request, document_slug, revision_id=None):
661
655
"show_revision_warning" : show_revision_warning ,
662
656
"locked" : locked ,
663
657
"locked_by" : locked_by ,
664
- "locale_aware_related_docs" : locale_aware_related_docs ,
665
658
},
666
659
)
667
660
@@ -989,18 +982,15 @@ def translate(request, document_slug, revision_id=None):
989
982
).first ()
990
983
991
984
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
+ )
998
990
999
991
if user_has_doc_perm :
1000
992
# 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 {}
1004
994
doc_form = DocumentForm (
1005
995
initial = doc_initial ,
1006
996
locale = request .LANGUAGE_CODE ,
@@ -1697,63 +1687,37 @@ def show_translations(request, document_slug):
1697
1687
)
1698
1688
1699
1689
1700
- def _get_locale_aware_related_docs (document , locale , user ):
1690
+ def _get_locale_aware_related_documents (document , locale , user ):
1701
1691
"""Return visible related documents prioritizing the given locale."""
1702
1692
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
1717
1695
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" )
1722
1697
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 = []
1730
1699
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 )
1741
1715
1742
- return [ result for doc in related_docs if ( result := _should_include_doc ( doc )) is not None ]
1716
+ return final_related_docs
1743
1717
1744
1718
1745
- def _document_form_initial (document , locale = None , user = None ):
1719
+ def _document_form_initial (document ):
1746
1720
"""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
-
1757
1721
return {
1758
1722
"title" : document .title ,
1759
1723
"slug" : document .slug ,
@@ -1762,7 +1726,9 @@ def _document_form_initial(document, locale=None, user=None):
1762
1726
"is_archived" : document .is_archived ,
1763
1727
"topics" : Topic .active .filter (document = document ).values_list ("id" , flat = True ),
1764
1728
"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
+ ),
1766
1732
"allow_discussion" : document .allow_discussion ,
1767
1733
"needs_change" : document .needs_change ,
1768
1734
"needs_change_comment" : document .needs_change_comment ,
0 commit comments