4
4
from cms .appresolver import get_app_urls
5
5
from cms .models import Title
6
6
from cms .utils import get_template_from_request , get_language_from_request
7
- from cms .utils .i18n import get_fallback_languages , force_language , get_public_languages , get_redirect_on_fallback , get_language_list , is_language_prefix_patterns_used
8
- from cms .utils .page_resolver import get_page_from_request
7
+ from cms .utils .i18n import (
8
+ force_language ,
9
+ get_public_languages ,
10
+ get_languages_for_page_user ,
11
+ get_languages_for_user ,
12
+ get_redirect_on_fallback ,
13
+ is_language_prefix_patterns_used ,
14
+ )
15
+ from cms .utils .page_resolver import get_fallback_languages_for_page , get_page_from_request
9
16
from cms .test_utils .util .context_managers import SettingsOverride
17
+
10
18
from django .conf import settings
11
19
from django .conf .urls .defaults import patterns
12
20
from django .core .urlresolvers import resolve , Resolver404 , reverse
16
24
from django .contrib .auth .views import redirect_to_login
17
25
from django .utils .http import urlquote
18
26
27
+
19
28
def _handle_no_page (request , slug ):
20
29
if not slug and settings .DEBUG :
21
30
return render_to_response ("cms/new.html" , RequestContext (request ))
@@ -31,64 +40,58 @@ def details(request, slug):
31
40
context = RequestContext (request )
32
41
# Get a Page model object from the request
33
42
page = get_page_from_request (request , use_path = slug )
43
+
34
44
if not page :
35
45
return _handle_no_page (request , slug )
36
46
37
47
current_language = get_language_from_request (request )
38
- # Check that the current page is available in the desired (current) language
39
- available_languages = []
40
- page_languages = page .get_languages ()
41
- user_languages = get_public_languages ()
42
- if hasattr (request , 'user' ) and request .user .is_staff :
43
- user_languages = get_language_list ()
44
- for frontend_lang in user_languages :
45
- if frontend_lang in page_languages :
46
- available_languages .append (frontend_lang )
48
+
49
+ # Languages specific to page that the current user can see.
50
+ available_languages = get_languages_for_page_user (page = page , user = request .user )
51
+
47
52
attrs = ''
48
53
if 'edit' in request .GET :
49
54
attrs = '?edit=1'
50
55
elif 'preview' in request .GET :
51
56
attrs = '?preview=1'
52
57
if 'draft' in request .GET :
53
58
attrs += '&draft=1'
54
- # Check that the language is in FRONTEND_LANGUAGES:
55
- if not current_language in user_languages :
59
+
60
+ # Check that the user has access to this language
61
+ # which is defined in FRONTEND_LANGUAGES:
62
+ if not current_language in get_languages_for_user (user = request .user ):
56
63
#are we on root?
57
- if not slug :
64
+ if not slug and available_languages :
58
65
#redirect to supported language
59
- languages = []
60
- for language in available_languages :
61
- languages .append ((language , language ))
62
- if languages :
63
- with SettingsOverride (LANGUAGES = languages , LANGUAGE_CODE = languages [0 ][0 ]):
64
- #get supported language
65
- new_language = get_language_from_request (request )
66
- if new_language in get_public_languages ():
67
- with force_language (new_language ):
68
- pages_root = reverse ('pages-root' )
69
- return HttpResponseRedirect (pages_root + attrs )
70
- else :
71
- _handle_no_page (request , slug )
66
+ languages = [(language , language ) for language in available_languages ]
67
+ with SettingsOverride (LANGUAGES = languages , LANGUAGE_CODE = languages [0 ][0 ]):
68
+ # get supported language
69
+ new_language = get_language_from_request (request )
70
+ if new_language in get_public_languages ():
71
+ with force_language (new_language ):
72
+ pages_root = reverse ('pages-root' )
73
+ return HttpResponseRedirect (pages_root + attrs )
72
74
else :
73
75
return _handle_no_page (request , slug )
76
+
74
77
if current_language not in available_languages :
75
- # If we didn't find the required page in the requested (current)
76
- # language, let's try to find a fallback
77
- found = False
78
- for alt_lang in get_fallback_languages (current_language ):
79
- if alt_lang in available_languages :
80
- if get_redirect_on_fallback (current_language ):
81
- with force_language (alt_lang ):
82
- path = page .get_absolute_url (language = alt_lang , fallback = True )
83
- # In the case where the page is not available in the
84
- # preferred language, *redirect* to the fallback page. This
85
- # is a design decision (instead of rendering in place)).
86
- return HttpResponseRedirect (path + attrs )
87
- else :
88
- found = True
89
- if not found :
78
+ fallback_languages = get_fallback_languages_for_page (page , current_language , request .user )
79
+ if fallback_languages :
80
+ if get_redirect_on_fallback (current_language ):
81
+ fallback_language = fallback_languages [0 ]
82
+ with force_language (fallback_language ):
83
+ path = page .get_absolute_url (language = fallback_language , fallback = True ) + attrs
84
+ return HttpResponseRedirect (path )
85
+ else :
90
86
# There is a page object we can't find a proper language to render it
91
- _handle_no_page (request , slug )
87
+ return _handle_no_page (request , slug )
88
+ else :
89
+ page_path = page .get_absolute_url (language = current_language )
90
+ page_slug = page .get_path (language = current_language ) or page .get_slug (language = current_language )
91
+ if slug and slug != page_slug and request .path [:len (page_path )] != page_path :
92
+ # The current language does not match it's slug.
93
+ # Redirect to the current language.
94
+ return HttpResponseRedirect (page_path + attrs )
92
95
93
96
if apphook_pool .get_apphooks ():
94
97
# There are apphooks in the pool. Let's see if there is one for the
@@ -134,13 +137,15 @@ def details(request, slug):
134
137
return redirect_to_login (urlquote (request .get_full_path ()), settings .LOGIN_URL )
135
138
136
139
template_name = get_template_from_request (request , page , no_current_page = True )
137
- # fill the context
140
+
141
+ has_view_permissions = page .has_view_permission (request )
142
+
143
+ # fill the context
138
144
context ['lang' ] = current_language
139
145
context ['current_page' ] = page
140
146
context ['has_change_permissions' ] = page .has_change_permission (request )
141
- context ['has_view_permissions' ] = page . has_view_permission ( request )
147
+ context ['has_view_permissions' ] = has_view_permissions
142
148
143
- if not context [ ' has_view_permissions' ] :
149
+ if not has_view_permissions :
144
150
return _handle_no_page (request , slug )
145
-
146
151
return render_to_response (template_name , context_instance = context )
0 commit comments