dynamicweb/cms/utils/__init__.py

81 lines
2.6 KiB
Python

# TODO: this is just stuff from utils.py - should be split / moved
from typing import TYPE_CHECKING
from django.http import HttpRequest
from cms.utils.compat.warnings import RemovedInDjangoCMS60Warning
from cms.utils.i18n import (
get_current_language,
get_default_language,
get_language_code,
get_language_list,
)
if TYPE_CHECKING:
from django.contrib.sites.models import Site
def get_current_site(request: HttpRequest = None) -> "Site":
"""
Returns the current Site instance associated with the given request.
"""
from django.contrib.sites.models import Site
if request is None:
import warnings
warnings.warn(
"get_current_site() called without request. This may lead to unexpected behavior. "
"Use get_current_site(request) instead.",
RemovedInDjangoCMS60Warning,
stacklevel=2,
)
# Allow middleware to identify the site
request_site = getattr(request, "site", None) if request else None
if request_site:
return request_site
# Fallback to the default site configuration by SITE_ID or through request
return Site.objects.get_current(request=request)
def get_language_from_request(request: HttpRequest, current_page=None) -> str:
"""
Return the most obvious language according the request
"""
if getattr(request, '_cms_language', None):
return request._cms_language
language = None
if hasattr(request, 'POST'):
language = request.POST.get('language', None)
if hasattr(request, 'GET') and not language:
language = request.GET.get('language', None)
site_id = current_page.site_id if current_page else get_current_site(request).pk
if language:
language = get_language_code(language, site_id=site_id)
if language not in get_language_list(site_id):
language = None
if not language and request:
# get the active language
language = get_current_language()
if language:
if language not in get_language_list(site_id):
language = None
if not language and current_page:
# in last resort, get the first language available in the page
languages = current_page.get_languages()
if len(languages) > 0:
language = languages[0]
if not language:
# language must be defined in CMS_LANGUAGES, so check first if there
# is any language with LANGUAGE_CODE, otherwise try to split it and find
# best match
language = get_default_language(site_id=site_id)
request._cms_language = language
return language