Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue 4646 refactor details view #5954

Open
wants to merge 27 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
b981a04
#4646 deliver pages with a class based view
philippze Apr 28, 2017
e45bf56
#4646 separate methods fetching page from cache or database
philippze Apr 28, 2017
c6fc4ba
#4646 get current language in separate method
philippze Apr 28, 2017
83dee0c
#4646 try&error pattern for returning not-normal pages
philippze Apr 28, 2017
a9a1b6f
#4646 remove duplicate code
philippze Apr 28, 2017
90f6989
#4646 encapsulate ugly language redirect code in its own function
philippze Apr 28, 2017
56bd96b
#4646 the page_from_database method
philippze Apr 28, 2017
8de8f82
#4646 use instance variables instead method arguments
philippze Apr 28, 2017
53e222e
#4646 improve method names
philippze Apr 28, 2017
86f1a35
#4646 condense page_from_database method
philippze Apr 28, 2017
6aa5fb7
#4646 DRY treatment of cms redirects
philippze Apr 28, 2017
0b92b1d
#4646 rename exception: NothingToDo -> NoHttpResponseReturned
philippze Apr 28, 2017
5ea07c2
#4646 always check for circular redirects. This simplifies code & nee…
philippze Apr 28, 2017
cfe33ba
#4646 separate function for completing url with language prefix
philippze Apr 28, 2017
ee95915
#4646 refactor apphook response delivery
philippze Apr 29, 2017
abd62bf
#4646 refactor redirect to login
philippze Apr 29, 2017
0c7fb6e
#4646 prefer test for none over exceptions in response attempts
philippze Apr 29, 2017
ef44d0a
#4646 handle redirections to another language in one single place
philippze Apr 29, 2017
177bd39
#4646 replace comment with meaningfully labelled function
philippze Apr 29, 2017
532134e
#4646 determine visible languages in i18n utils
philippze Apr 29, 2017
64647c8
#4646 separate methods handling the two kinds of language redirects
philippze Apr 29, 2017
291b7eb
#4646 refactor fallback language treatment
philippze Apr 29, 2017
30617f1
#4646 comment prompting to remove ugly method dedirect_root_url_if_ap…
philippze Apr 30, 2017
c79b0f8
#4646 readability improvements concerning fallback languages
philippze Apr 30, 2017
a044b3a
#4646 may little readability improvements
philippze Apr 30, 2017
79ddefc
#4646 reorder methods
philippze Apr 30, 2017
10b7440
#4646 another comment promting to remove code
philippze Apr 30, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion cms/appresolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.contrib.sites.models import Site
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import (RegexURLResolver, Resolver404, reverse,
RegexURLPattern)
RegexURLPattern, resolve)
from django.db import OperationalError, ProgrammingError
from django.utils import six
from django.utils.translation import get_language, override
Expand Down Expand Up @@ -182,6 +182,24 @@ def get_patterns_for_title(path, title):
return url_patterns


def get_app_response_for_page(page, language_code, request):
"""
Get the view matching a page and language_code.
If no view matches, return nothing or raise Resolver404 (implicitly).
"""
# TODO: I don't understand, why the logic her is so different from
# the logic in `get_patterns_for_title`, above.
app_urls = page.get_application_urls(language_code, False)
if app_urls:
app = apphook_pool.get_apphook(app_urls)
pattern_list = []
if app:
for urlpatterns in get_app_urls(app.get_urls(page, language_code)):
pattern_list += urlpatterns
view, args, kwargs = resolve('/', tuple(pattern_list))
return view(request, *args, **kwargs)


def get_app_patterns():
try:
return _get_app_patterns()
Expand Down
1 change: 1 addition & 0 deletions cms/models/pagemodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -1004,6 +1004,7 @@ def get_descendants(self, include_self=False):
return self.__class__.get_tree(self).exclude(pk=self.pk).filter(site_id=self.site_id)

def get_published_languages(self):
# TODO: this function name is misleading.
if self.publisher_is_draft:
return self.get_languages()
return sorted([language for language in self.get_languages() if self.is_published(language)])
Expand Down
13 changes: 9 additions & 4 deletions cms/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,7 @@ def get_template_from_request(request, obj=None, no_current_page=False):
return get_cms_setting('TEMPLATES')[0][0]


def get_language_from_request(request, current_page=None):
"""
Return the most obvious language according the request
"""
def get_desired_language(request, current_page=None):
language = None
if hasattr(request, 'POST'):
language = request.POST.get('language', None)
Expand All @@ -57,7 +54,15 @@ def get_language_from_request(request, current_page=None):
if language:
if not language in get_language_list(site_id):
language = None
return language


def get_language_from_request(request, current_page=None):
"""
Return the most obvious language according the request
"""
language = get_desired_language(request, current_page)
site_id = current_page.site_id if current_page else None
if not language and current_page:
# in last resort, get the first language available in the page
languages = current_page.get_languages()
Expand Down
25 changes: 25 additions & 0 deletions cms/utils/i18n.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,15 @@ def get_public_languages(site_id=None):
return [lang['code'] for lang in get_language_objects(site_id)
if lang.get('public', True)]

def get_visible_languages(request, site_id=None):
"""
:return: list of iso2codes of languages visible for requset user
"""
if hasattr(request, 'user') and request.user.is_staff:
return get_language_list()
else:
return get_public_languages()


def get_language_object(language_code, site_id=None):
"""
Expand Down Expand Up @@ -178,3 +187,19 @@ def is_language_prefix_patterns_used():
"""
return any(isinstance(url_pattern, LocaleRegexURLResolver)
for url_pattern in get_resolver(None).url_patterns)


def complete_i18n_url(url, language_code):
"""
Adds the language prefix if it is required and missing
:param url:
:param language_code:
:return: URL
"""
if (
is_language_prefix_patterns_used()
and url[0] == "/"
and not url.startswith('/%s/' % language_code)
):
url = "/%s/%s" % (language_code, url.lstrip("/"))
return url
Loading