Skip to content

Commit e37ea42

Browse files
author
Chris Glass
committed
Merge branch 'master' of https://github.com/bobkarreman/django-cms into bobkarreman-master
2 parents 39c8c26 + 1ca25ff commit e37ea42

File tree

10 files changed

+135
-36
lines changed

10 files changed

+135
-36
lines changed

cms/middleware/multilingual.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ def get_language_from_request (self,request):
2424
prefix = has_lang_prefix(request.path_info)
2525
pages_root = urllib.unquote(reverse("pages-root"))
2626
if prefix:
27-
request.path = request.path.split("/")
28-
del request.path[pages_root.count('/')]
29-
request.path = "/".join(request.path)
27+
request.path = "/" + "/".join(request.path.split("/")[2:])
3028
request.path_info = "/" + "/".join(request.path_info.split("/")[2:])
3129
t = prefix
3230
if t in SUPPORTED:
@@ -111,14 +109,14 @@ def process_response(self, request, response):
111109
))
112110

113111
# Documentation comments for HREF_URL_FIX_RE above explain each match group (\1, \4, \5) represents.
114-
decoded_response = HREF_URL_FIX_RE.sub(ur'<a\1href="%s%s/\4"\5>' % (pages_root, request.LANGUAGE_CODE), decoded_response)
112+
decoded_response = HREF_URL_FIX_RE.sub(ur'<a\1href="/%s%s\4"\5>' % (request.LANGUAGE_CODE, pages_root), decoded_response)
115113
response.content = FORM_URL_FIX_RE.sub(ur'<form\1action="%s%s/\4"\5>' % (pages_root, request.LANGUAGE_CODE), decoded_response).encode("utf8")
116114

117115
if (response.status_code == 301 or response.status_code == 302 ):
118116
location = response['Location']
119117
if not has_lang_prefix(location) and location.startswith("/") and \
120118
not location.startswith(settings.MEDIA_URL) and \
121119
not location.startswith(settings.ADMIN_MEDIA_PREFIX):
122-
response['Location'] = "%s%s%s" % (pages_root, language, location[len(pages_root)-1:])
120+
response['Location'] = "/%s%s" % (language, location)
123121
response.set_cookie("django_language", language)
124122
return response

cms/tests/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from cms.tests.permmod import PermissionModeratorTestCase
1111
from cms.tests.site import SiteTestCase
1212
from cms.tests.navextender import NavExtenderTestCase
13+
from cms.tests.nonroot import NonRootCase
1314
from cms.tests.plugins import PluginsTestCase
1415
from cms.tests.menu import MenusTestCase
1516
from cms.tests.rendering import RenderingTestCase
@@ -36,6 +37,7 @@ def suite():
3637

3738
s.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(SiteTestCase))
3839
s.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(NavExtenderTestCase))
40+
s.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(NonRootCase))
3941
if "cms.plugins.text" in settings.INSTALLED_APPS:
4042
s.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(PluginsTestCase))
4143
if "reversion" in settings.INSTALLED_APPS:

cms/tests/base.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
from django.conf import settings
33
from django.core.exceptions import ObjectDoesNotExist
44
from django.core.handlers.wsgi import WSGIRequest
5+
from django.core.urlresolvers import reverse
56
from django.template.defaultfilters import slugify
67
from django.test.testcases import TestCase
78
import copy
89
import sys
10+
import urllib
911
import warnings
1012

1113
URL_CMS_PAGE = "/admin/cms/page/"
@@ -56,7 +58,7 @@ def showWarning(message, category, filename, lineno, file=None, line=None):
5658

5759
class CMSTestCase(TestCase):
5860
counter = 1
59-
61+
6062
def _pre_setup(self):
6163
"""We are doing a lot of setting modifications in our tests, this
6264
mechanism will restore to original settings after each test case.
@@ -200,16 +202,23 @@ def reload_page(self, page):
200202
page = self.assertObjectExist(Page.objects, id=page.pk)
201203
return page
202204

203-
204-
def get_context(self, path="/"):
205+
def get_pages_root(self):
206+
return urllib.unquote(reverse("pages-root"))
207+
208+
def get_context(self, path=None):
209+
if not path:
210+
path = self.get_pages_root()
205211
context = {}
206212
request = self.get_request(path)
207213

208214
context['request'] = request
209215

210216
return context
211217

212-
def get_request(self, path="/"):
218+
def get_request(self, path=None):
219+
if not path:
220+
path = self.get_pages_root()
221+
213222
environ = {
214223
'HTTP_COOKIE': self.client.cookies,
215224
'PATH_INFO': path,

cms/tests/menu.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from menus.menu_pool import menu_pool
1010
from menus.base import NavigationNode
1111

12-
1312
class MenusTestCase(CMSTestCase):
1413

1514
def setUp(self):
@@ -58,7 +57,7 @@ def create_some_nodes(self):
5857

5958
def test_01_basic_cms_menu(self):
6059
self.assertEqual(len(menu_pool.menus), 1)
61-
response = self.client.get("/")
60+
response = self.client.get(self.get_pages_root())
6261
self.assertEquals(response.status_code, 200)
6362
request = self.get_request()
6463

@@ -78,7 +77,7 @@ def test_02_show_menu(self):
7877
self.assertEqual(nodes[0].descendant, False)
7978
self.assertEqual(nodes[0].children[0].descendant, True)
8079
self.assertEqual(nodes[0].children[0].children[0].descendant, True)
81-
self.assertEqual(nodes[0].get_absolute_url(), "/")
80+
self.assertEqual(nodes[0].get_absolute_url(), self.get_pages_root())
8281
self.assertEqual(nodes[1].get_absolute_url(), self.page4.get_absolute_url())
8382
self.assertEqual(nodes[1].sibling, True)
8483
self.assertEqual(nodes[1].selected, False)
@@ -167,7 +166,7 @@ def test_10_show_breadcrumb(self):
167166
context = self.get_context(path=self.page2.get_absolute_url())
168167
nodes = show_breadcrumb(context)['ancestors']
169168
self.assertEqual(len(nodes), 2)
170-
self.assertEqual(nodes[0].get_absolute_url(), "/")
169+
self.assertEqual(nodes[0].get_absolute_url(), self.get_pages_root())
171170
self.assertEqual(isinstance(nodes[0], NavigationNode), True)
172171
self.assertEqual(nodes[1].get_absolute_url(), page2.get_absolute_url())
173172

@@ -228,8 +227,8 @@ def test_15_home_not_in_menu(self):
228227
context = self.get_context()
229228
nodes = show_menu(context, 0, 100, 100, 100)['children']
230229
self.assertEqual(len(nodes), 1)
231-
self.assertEqual(nodes[0].get_absolute_url(), "/%s/" % self.page2.get_slug())
232-
self.assertEqual(nodes[0].children[0].get_absolute_url(), "/%s/%s/" % (self.page2.get_slug(), self.page3.get_slug()))
230+
self.assertEqual(nodes[0].get_absolute_url(), "%s%s/" % (self.get_pages_root(), self.page2.get_slug()))
231+
self.assertEqual(nodes[0].children[0].get_absolute_url(), "%s%s/%s/" % (self.get_pages_root(), self.page2.get_slug(), self.page3.get_slug()))
233232
page4 = Page.objects.get(pk=self.page4.pk)
234233
page4.in_navigation = True
235234
page4.save()

cms/tests/nonroot.py

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# -*- coding: utf-8 -*-
2+
from django.conf import settings
3+
from django.contrib.auth.models import User
4+
from cms.tests.base import CMSTestCase
5+
from cms.tests.menu import MenusTestCase
6+
from cms.models import Page
7+
from menus.templatetags.menu_tags import show_menu, show_breadcrumb
8+
from menus.menu_pool import menu_pool
9+
from menus.base import NavigationNode
10+
11+
class NonRootCase(CMSTestCase):
12+
urls = 'nonroot_urls'
13+
14+
def setUp(self):
15+
settings.CMS_MODERATOR = False
16+
u = User(username="test", is_staff = True, is_active = True, is_superuser = True)
17+
u.set_password("test")
18+
u.save()
19+
self.login_user(u)
20+
21+
self.create_some_pages()
22+
23+
# def tearDown(self):
24+
# menu_pool.menus = self.old_menu
25+
26+
def create_some_pages(self):
27+
"""
28+
Creates the following structure:
29+
30+
+ P1
31+
| + P2
32+
| + P3
33+
+ P4
34+
| + P5
35+
36+
"""
37+
self.page1 = self.create_page(parent_page=None, published=True, in_navigation=True)
38+
self.page2 = self.create_page(parent_page=self.page1, published=True, in_navigation=True)
39+
self.page3 = self.create_page(parent_page=self.page2, published=True, in_navigation=True)
40+
self.page4 = self.create_page(parent_page=None, published=True, in_navigation=True)
41+
self.all_pages = [self.page1, self.page2, self.page3, self.page4]
42+
self.top_level_pages = [self.page1, self.page4]
43+
self.level1_pages = [self.page2]
44+
self.level2_pages = [self.page3]
45+
46+
47+
def test_01_basic_cms_menu(self):
48+
response = self.client.get(self.get_pages_root())
49+
self.assertEquals(response.status_code, 200)
50+
self.assertEquals(self.get_pages_root(), "/content/")
51+
52+
def test_02_show_menu(self):
53+
context = self.get_context()
54+
nodes = show_menu(context)['children']
55+
self.assertEqual(nodes[0].get_absolute_url(), self.get_pages_root())
56+
self.assertEqual(nodes[0].get_absolute_url(), "/content/")
57+
58+
def test_03_show_breadcrumb(self):
59+
page2 = Page.objects.get(pk=self.page2.pk)
60+
context = self.get_context(path=self.page2.get_absolute_url())
61+
nodes = show_breadcrumb(context)['ancestors']
62+
self.assertEqual(nodes[0].get_absolute_url(), self.get_pages_root())
63+
self.assertEqual(nodes[0].get_absolute_url(), "/content/")
64+
self.assertEqual(isinstance(nodes[0], NavigationNode), True)
65+
self.assertEqual(nodes[1].get_absolute_url(), page2.get_absolute_url())

cms/tests/page.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def test_04_details_view(self):
7373
Test the details view
7474
"""
7575
try:
76-
response = self.client.get('/')
76+
response = self.client.get(self.get_pages_root())
7777
except TemplateDoesNotExist, e:
7878
if e.args != ('404.html',):
7979
raise
@@ -83,7 +83,7 @@ def test_04_details_view(self):
8383
response = self.client.post(URL_CMS_PAGE_ADD, page_data)
8484
self.assertRedirects(response, URL_CMS_PAGE)
8585
try:
86-
response = self.client.get('/')
86+
response = self.client.get(self.get_pages_root())
8787
except TemplateDoesNotExist, e:
8888
if e.args != ('404.html',):
8989
raise
@@ -93,7 +93,7 @@ def test_04_details_view(self):
9393
response = self.client.post(URL_CMS_PAGE_ADD, page_data)
9494
response = self.client.get(URL_CMS_PAGE)
9595

96-
response = self.client.get('/')
96+
response = self.client.get(self.get_pages_root())
9797
self.assertEqual(response.status_code, 200)
9898

9999
def test_05_edit_page(self):
@@ -191,20 +191,20 @@ def test_10_move_page(self):
191191
# check page2 path and url
192192
page2 = Page.objects.get(pk=page2.pk)
193193
self.assertEqual(page2.get_path(), page_data1['slug']+"/"+page_data2['slug'])
194-
self.assertEqual(page2.get_absolute_url(), "/"+page_data1['slug']+"/"+page_data2['slug']+"/")
194+
self.assertEqual(page2.get_absolute_url(), self.get_pages_root()+page_data1['slug']+"/"+page_data2['slug']+"/")
195195
# check page3 path and url
196196
page3 = Page.objects.get(pk=page3.pk)
197197
self.assertEqual(page3.get_path(), page_data1['slug']+"/"+page_data2['slug']+"/"+page_data3['slug'])
198-
self.assertEqual(page3.get_absolute_url(), "/"+page_data1['slug']+"/"+page_data2['slug']+"/"+page_data3['slug']+"/")
198+
self.assertEqual(page3.get_absolute_url(), self.get_pages_root()+page_data1['slug']+"/"+page_data2['slug']+"/"+page_data3['slug']+"/")
199199
# publish page 1 (becomes home)
200200
page1 = Page.objects.all()[0]
201201
page1.published = True
202202
page1.save()
203203
# check that page2 and page3 url have changed
204204
page2 = Page.objects.get(pk=page2.pk)
205-
self.assertEqual(page2.get_absolute_url(), "/"+page_data2['slug']+"/")
205+
self.assertEqual(page2.get_absolute_url(), self.get_pages_root()+page_data2['slug']+"/")
206206
page3 = Page.objects.get(pk=page3.pk)
207-
self.assertEqual(page3.get_absolute_url(), "/"+page_data2['slug']+"/"+page_data3['slug']+"/")
207+
self.assertEqual(page3.get_absolute_url(), self.get_pages_root()+page_data2['slug']+"/"+page_data3['slug']+"/")
208208
# move page2 back to root and check path of 2 and 3
209209
response = self.client.post("/admin/cms/page/%s/move-page/" % page2.pk, {"target":page1.pk, "position":"left" })
210210
self.assertEqual(response.status_code, 200)

cms/tests/permmod.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -612,8 +612,8 @@ def test_16_patricks_move(self):
612612
self.assertEqual(pg.publisher_public != None, True)
613613

614614
# check urls
615-
self.assertEqual(pg.publisher_public.get_absolute_url(), u'/master/slave-home/pb/pe/pg/')
616-
self.assertEqual(ph.publisher_public.get_absolute_url(), u'/master/slave-home/pb/pe/ph/')
615+
self.assertEqual(pg.publisher_public.get_absolute_url(), u'%smaster/slave-home/pb/pe/pg/' % self.get_pages_root())
616+
self.assertEqual(ph.publisher_public.get_absolute_url(), u'%smaster/slave-home/pb/pe/ph/' % self.get_pages_root())
617617

618618
# perform movings under slave...
619619
self.login_user(self.user_slave)
@@ -631,8 +631,8 @@ def test_16_patricks_move(self):
631631
ph = self.reload_page(ph)
632632

633633
# check urls - they should stay them same, there wasn't approved yet
634-
self.assertEqual(pg.publisher_public.get_absolute_url(), u'/master/slave-home/pb/pe/pg/')
635-
self.assertEqual(ph.publisher_public.get_absolute_url(), u'/master/slave-home/pb/pe/ph/')
634+
self.assertEqual(pg.publisher_public.get_absolute_url(), u'%smaster/slave-home/pb/pe/pg/' % self.get_pages_root())
635+
self.assertEqual(ph.publisher_public.get_absolute_url(), u'%smaster/slave-home/pb/pe/ph/' % self.get_pages_root())
636636

637637
# pg & pe should require approval
638638
self.assertEqual(pg.requires_approvement(), True)
@@ -652,8 +652,8 @@ def test_16_patricks_move(self):
652652
self.assertEqual(ph.publisher_public.parent.pk, pe.publisher_public_id)
653653

654654
# check if urls are correct after move
655-
self.assertEqual(pg.publisher_public.get_absolute_url(), u'/master/slave-home/pc/pg/')
656-
self.assertEqual(ph.publisher_public.get_absolute_url(), u'/master/slave-home/pc/pg/pe/ph/')
655+
self.assertEqual(pg.publisher_public.get_absolute_url(), u'%smaster/slave-home/pc/pg/' % self.get_pages_root())
656+
self.assertEqual(ph.publisher_public.get_absolute_url(), u'%smaster/slave-home/pc/pg/pe/ph/' % self.get_pages_root())
657657

658658
def test_17_plugins_get_published(self):
659659
self.login_user(self.user_super)

cms/utils/__init__.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
from django.template import RequestContext
44
from django.http import HttpResponse, HttpResponseRedirect
55
from django.conf import settings
6+
from django.core.urlresolvers import reverse
67

78
from cms.utils.i18n import get_default_language
9+
import urllib
810

911
# !IMPORTANT: Page cant be imported here, because we will get cyclic import!!
1012

@@ -97,6 +99,8 @@ def get_page_from_request(request):
9799
"""
98100
tries to get a page from a request if the page hasn't been handled by the cms urls.py
99101
"""
102+
103+
# TODO: Looks redundant this is also checked in cms.middleware.page and thats the only place this method get called
100104
if hasattr(request, '_current_page_cache'):
101105
return request._current_page_cache
102106
else:
@@ -109,7 +113,8 @@ def get_page_from_request(request):
109113
if path.startswith('/admin/'):
110114
kw['page_id']=path.split("/")[0]
111115
else:
112-
kw['slug']=path[1:-1]
116+
pages_root = urllib.unquote(reverse("pages-root"))
117+
kw['slug']=path[len(pages_root):-1]
113118
resp = details(request, no404=True, only_context=True, **kw)
114119
return resp['current_page']
115120

menus/templatetags/menu_tags.py

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import urllib
12
from menus.menu_pool import menu_pool
23
from django.contrib.sites.models import Site
34
from django import template
45
from django.conf import settings
56
from django.utils.translation import activate, get_language, ugettext
67
from django.core.cache import cache
7-
8+
from django.core.urlresolvers import reverse
89

910
class NOT_PROVIDED: pass
1011

@@ -101,7 +102,7 @@ def show_menu(context, from_level=0, to_level=100, extra_inactive=0, extra_activ
101102
nodes = new_nodes
102103
children = cut_levels(nodes, from_level, to_level, extra_inactive, extra_active)
103104
children = menu_pool.apply_modifiers(children, request, namespace, root_id, post_cut=True)
104-
105+
105106
try:
106107
context.update({'children':children,
107108
'template':template,
@@ -179,8 +180,7 @@ def show_breadcrumb(context, start_level=0, template="menu/breadcrumb.html", onl
179180
for node in nodes:
180181
if node.selected:
181182
selected = node
182-
# find home: TODO: maybe home is not on "/"?
183-
if node.get_absolute_url() == "/":
183+
if node.get_absolute_url() == urllib.unquote(reverse("pages-root")):
184184
home = node
185185
if selected and selected != home:
186186
n = selected
@@ -288,10 +288,8 @@ def page_language_url(context, lang):
288288
if page == "dummy":
289289
return ''
290290
try:
291-
from django.core.urlresolvers import reverse
292-
root = reverse('pages-root')
293291
url = page.get_absolute_url(language=lang, fallback=False)
294-
url = root + lang + "/" + url[len(root):]
292+
url = "/" + lang + url
295293
except:
296294
# no localized path/slug.
297295
url = ''

tests/testapp/nonroot_urls.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from django.conf import settings
2+
from django.conf.urls.defaults import handler500, handler404, patterns, include, \
3+
url
4+
from django.contrib import admin
5+
6+
admin.autodiscover()
7+
8+
urlpatterns = patterns('',
9+
(r'^admin/', include(admin.site.urls)),
10+
(r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'),
11+
# just for testing - native way to sampleapp urls
12+
# (r'^sampleapp-native/', include('sampleapp.urls')),
13+
)
14+
15+
if settings.DEBUG:
16+
urlpatterns+= patterns('',
17+
url(r'^media/cms/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.CMS_MEDIA_ROOT, 'show_indexes': True}),
18+
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True})
19+
)
20+
21+
urlpatterns += patterns('',
22+
url(r'^content/', include('cms.urls')),
23+
)

0 commit comments

Comments
 (0)