diff --git a/combo/data/utils.py b/combo/data/utils.py index 590b36ad..8765442d 100644 --- a/combo/data/utils.py +++ b/combo/data/utils.py @@ -31,7 +31,8 @@ from .models import Page, extract_context_from_sub_slug class MissingSubSlug(Exception): - pass + def __init__(self, page): + self.page = page class ImportSiteError(Exception): @@ -241,7 +242,7 @@ def get_page_from_url_parts(parts, request=None): break if page.sub_slug: if parts[i + 1 :] == []: - raise MissingSubSlug + raise MissingSubSlug(page) extra = extract_context_from_sub_slug(page.sub_slug, parts[i + 1]) if extra is None: page = None diff --git a/combo/manager/urls.py b/combo/manager/urls.py index e6703a59..5b68248c 100644 --- a/combo/manager/urls.py +++ b/combo/manager/urls.py @@ -141,6 +141,11 @@ urlpatterns = [ ), url(r'^pages/(?P\d+)/order$', views.cell_order, name='combo-manager-cell-order'), url(r'^pages/order$', views.page_order, name='combo-manager-page-order'), + url( + r'^pages/(?P[\w/_-]+)/$', + views.page_redirect_to_edit, + name='combo-manager-page-redirect-to-edit', + ), url(r'^ckeditor/upload/', ckeditor_views.upload, name='ckeditor_upload'), url(r'^ckeditor/browse/', never_cache(assets_views.browse), name='ckeditor_browse'), ] diff --git a/combo/manager/views.py b/combo/manager/views.py index db3aac07..dd44575b 100644 --- a/combo/manager/views.py +++ b/combo/manager/views.py @@ -47,7 +47,15 @@ from django.views.generic import ( from combo import plugins from combo.data.library import get_cell_class from combo.data.models import CellBase, LinkListCell, Page, PageSnapshot, ParentContentCell -from combo.data.utils import ImportSiteError, export_site, export_site_tar, import_site, import_site_tar +from combo.data.utils import ( + ImportSiteError, + MissingSubSlug, + export_site, + export_site_tar, + get_page_from_url_parts, + import_site, + import_site_tar, +) from combo.urls_utils import staff_required from .forms import ( @@ -572,6 +580,20 @@ class SnapshotRestoreView(ManagedPageMixin, DetailView): snapshot_restore = SnapshotRestoreView.as_view() +class PageRedirectToEditView(RedirectView): + permanent = False + + def get_redirect_url(self, page_path): + try: + page = get_page_from_url_parts(page_path.split('/')) + except MissingSubSlug as e: + page = e.page + return reverse('combo-manager-page-view', kwargs={'pk': page.pk}) + + +page_redirect_to_edit = PageRedirectToEditView.as_view() + + class PageAddCellView(ManagedPageMixin, RedirectView): permanent = False diff --git a/tests/test_manager.py b/tests/test_manager.py index 0f9d537b..7c4d1642 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -2614,3 +2614,22 @@ def test_restricted_page_edit(app, admin_user, john_doe): (page5.id, 1), (page4.id, 0), ] + + +def test_redirect_to_page_edit(app, admin_user): + page = Page.objects.create(title='One', slug='one') + page2 = Page.objects.create(title='Two', slug='two', parent=page) + page3 = Page.objects.create(title='User', slug='users', sub_slug='(?P[a-z]+)') + + app = login(app) + resp = app.get('/manage/pages/one/', status=302) + assert resp.location == '/manage/pages/%s/' % page.pk + + resp = app.get('/manage/pages/one/two/', status=302) + assert resp.location == '/manage/pages/%s/' % page2.pk + + resp = app.get('/manage/pages/users/', status=302) + assert resp.location == '/manage/pages/%s/' % page3.pk + + resp = app.get('/manage/pages/users/xxx/', status=302) + assert resp.location == '/manage/pages/%s/' % page3.pk