Skip to content

Commit

Permalink
fix: prefix_default_language = False redirect behavior fixes (#6851)
Browse files Browse the repository at this point in the history
* make is_language_prefix_patterns_used check for non-empty language_prefix insted of doing isinstance check on pattern only
* if prefix patterns are used get_language_from_request normally, otherwise default
* updated CHANGELOG
* remove previous details request_language change and replace it with page model cache workaround
* fix tests
* if prefix patterns are used get_language_from_request normally, otherwise default
* add language check workaround to menus as well

Co-authored-by: Radosław Stępień <rstepien@cloudferro.com>
Co-authored-by: Florian Delizy <florian.delizy@gmail.com>
  • Loading branch information
3 people committed May 19, 2021
1 parent 5976d39 commit 34a26bd
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 13 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
Changelog
=========

Unreleased
==================

* Fixed redirect issues when i18n_patterns had prefix_default_language = False


Unreleased
==================
Expand Down
20 changes: 10 additions & 10 deletions cms/utils/i18n.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,16 +193,16 @@ def hide_untranslated(language, site_id=None):

def is_language_prefix_patterns_used():
"""
Returns `True` if the `LocaleRegexURLResolver` or `LocalePrefixPattern` is
used at root level of the urlpatterns, else it returns `False`.
"""
return any(
isinstance(
getattr(url_pattern, 'pattern', url_pattern),
LocalePrefixPattern
)
for url_pattern in get_resolver(None).url_patterns
)
Returns `True` if the `LocaleRegexURLResolver` or `LocalePrefixPattern`
is used at root level of the urlpatterns and doesn't have empty
language_prefix, else it returns `False`.
"""
for url_pattern in get_resolver(None).url_patterns:
pattern = getattr(url_pattern, 'pattern', url_pattern)
if isinstance(pattern, LocalePrefixPattern):
if pattern.language_prefix != '':
return True
return False


def is_valid_site_language(language, site_id):
Expand Down
5 changes: 4 additions & 1 deletion cms/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,10 @@ def details(request, slug):
else:
user_languages = get_public_languages(site_id=site.pk)

request_language = get_language_from_request(request, check_path=True)
if is_language_prefix_patterns_used():
request_language = get_language_from_request(request, check_path=True)
else:
request_language = get_default_language_for_site(site.pk)

if not page.is_home and request_language not in user_languages:
# The homepage is treated differently because
Expand Down
9 changes: 7 additions & 2 deletions menus/menu_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
from django.utils.functional import cached_property
from django.utils.module_loading import autodiscover_modules
from django.utils.translation import get_language_from_request, gettext_lazy as _

from cms.utils import get_current_site
from cms.utils.i18n import (get_default_language_for_site,
is_language_prefix_patterns_used)
from cms.utils.conf import get_cms_setting
from cms.utils.moderator import use_draft

Expand Down Expand Up @@ -101,7 +103,10 @@ def __init__(self, pool, request):
# instance lives.
self.menus = pool.get_registered_menus(for_rendering=True)
self.request = request
self.request_language = get_language_from_request(request, check_path=True)
if is_language_prefix_patterns_used():
self.request_language = get_language_from_request(request, check_path=True)
else:
self.request_language = get_default_language_for_site(get_current_site().pk)
self.site = Site.objects.get_current(request)

@property
Expand Down

0 comments on commit 34a26bd

Please sign in to comment.