1
1
import re
2
2
3
- from django .db .models import Q
3
+ from django .db .models import ExpressionWrapper , Q
4
+ from django .db .models .fields import BooleanField
4
5
from django .urls import reverse
5
6
from django .utils import timezone
6
7
from django .utils .encoding import force_str
@@ -76,7 +77,7 @@ def get_page_queryset(site, draft=True, published=False):
76
77
return Page .objects .public ().on_site (site )
77
78
78
79
79
- def get_page_from_path (site , path , preview = False , draft = False ):
80
+ def get_page_from_path (site , path , preview = False , draft = False , language_code = None ):
80
81
"""
81
82
Resolves a url path to a single page object.
82
83
Returns None if page does not exist
@@ -92,6 +93,17 @@ def get_page_from_path(site, path, preview=False, draft=False):
92
93
titles = titles .filter (publisher_is_draft = False )
93
94
else :
94
95
titles = titles .filter (published = True , publisher_is_draft = False )
96
+ if language_code is not None :
97
+ sublanguage = language_code
98
+ language = sublanguage .split ("-" , maxsplit = 1 )[0 ]
99
+ titles = titles .annotate (
100
+ matches_sublanguage = ExpressionWrapper (
101
+ Q (language = sublanguage ), output_field = BooleanField ()
102
+ ),
103
+ matches_language = ExpressionWrapper (
104
+ Q (language = language ), output_field = BooleanField ()
105
+ ),
106
+ ).order_by ("-matches_sublanguage" , "-matches_language" )
95
107
titles = titles .filter (path = (path or '' ))
96
108
97
109
for title in titles .iterator ():
@@ -163,10 +175,15 @@ def get_page_from_request(request, use_path=None, clean_path=None):
163
175
path = path [:- 1 ]
164
176
165
177
site = get_current_site ()
166
- page = get_page_from_path (site , path , preview , draft )
178
+ request_language_code = getattr (request , "LANGUAGE_CODE" , None )
179
+ page = get_page_from_path (
180
+ site , path , preview , draft , language_code = request_language_code
181
+ )
167
182
168
183
if draft and page and not user_can_view_page_draft (request .user , page ):
169
- page = get_page_from_path (site , path , preview , draft = False )
184
+ page = get_page_from_path (
185
+ site , path , preview , draft = False , language_code = request_language_code
186
+ )
170
187
171
188
# For public pages, check if any parent is hidden due to published dates
172
189
# In this case the selected page is not reachable
0 commit comments