diff --git a/frappe/tests/test_website.py b/frappe/tests/test_website.py index 28b8021aff..583bed6409 100644 --- a/frappe/tests/test_website.py +++ b/frappe/tests/test_website.py @@ -13,45 +13,47 @@ def set_request(**kwargs): class TestWebsite(unittest.TestCase): def test_page_load(self): + frappe.set_user('Guest') set_request(method='POST', path='login') response = render.render() - self.assertTrue(response.status_code, 200) + self.assertEquals(response.status_code, 200) html = frappe.safe_decode(response.get_data()) self.assertTrue('/* login-css */' in html) self.assertTrue('// login.js' in html) self.assertTrue('' in html) + frappe.set_user('Administrator') def test_redirect(self): import frappe.hooks frappe.hooks.website_redirects = [ - dict(source='/testfrom', target='://testto1'), - dict(source='/testfromregex.*', target='://testto2'), - dict(source='/testsub/(.*)', target='://testto3/\1') + dict(source=r'/testfrom', target=r'://testto1'), + dict(source=r'/testfromregex.*', target=r'://testto2'), + dict(source=r'/testsub/(.*)', target=r'://testto3/\1') ] frappe.cache().delete_key('app_hooks') frappe.cache().delete_key('website_redirects') set_request(method='GET', path='/testfrom') response = render.render() - self.assertTrue(response.status_code, 301) - self.assertTrue(response.headers.get('Location'), '://testto1') + self.assertEquals(response.status_code, 301) + self.assertEquals(response.headers.get('Location'), r'://testto1') set_request(method='GET', path='/testfromregex/test') response = render.render() - self.assertTrue(response.status_code, 301) - self.assertTrue(response.headers.get('Location'), '://testto2') + self.assertEquals(response.status_code, 301) + self.assertEquals(response.headers.get('Location'), r'://testto2') set_request(method='GET', path='/testsub/me') response = render.render() - self.assertTrue(response.status_code, 301) - self.assertTrue(response.headers.get('Location'), '://testto3/me') + self.assertEquals(response.status_code, 301) + self.assertEquals(response.headers.get('Location'), r'://testto3/me') set_request(method='GET', path='/test404') response = render.render() - self.assertTrue(response.status_code, 404) + self.assertEquals(response.status_code, 404) delattr(frappe.hooks, 'website_redirects') frappe.cache().delete_key('app_hooks') diff --git a/frappe/website/context.py b/frappe/website/context.py index f971fa0dcb..81962d7fec 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -48,7 +48,7 @@ def update_controller_context(context, controller): ret = module.get_context(context) if ret: context.update(ret) - except (frappe.PermissionError, frappe.DoesNotExistError): + except (frappe.PermissionError, frappe.DoesNotExistError, frappe.Redirect): raise except: if not frappe.flags.in_migrate: diff --git a/frappe/website/redirect.py b/frappe/website/redirect.py index b40e7cc658..8006ebaed7 100644 --- a/frappe/website/redirect.py +++ b/frappe/website/redirect.py @@ -16,7 +16,8 @@ def resolve_redirect(path): {"source": "/from", "target": "/main"}, # use regex - {"source": "/from/(.*)", "target": "/main/\1"} + {"source": r"/from/(.*)", "target": r"/main/\1"} + # use r as a string prefix if you use regex groups or want to escape any string literal ] ''' redirects = frappe.get_hooks('website_redirects') @@ -31,7 +32,7 @@ def resolve_redirect(path): for rule in redirects: pattern = rule['source'].strip('/ ') + '$' if re.match(pattern, path): - redirect_to = re.sub(pattern, rule['target'].replace('\\', '\\\\'), path) + redirect_to = re.sub(pattern, rule['target'], path) frappe.flags.redirect_location = redirect_to frappe.cache().hset('website_redirects', path, redirect_to) raise frappe.Redirect diff --git a/frappe/website/render.py b/frappe/website/render.py index a5006abae7..88e0eb235d 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -67,6 +67,9 @@ def render(path=None, http_status_code=None): except frappe.PermissionError as e: data, http_status_code = render_403(e, path) + except frappe.Redirect as e: + raise e + except Exception: path = "error" data = render_page(path) diff --git a/frappe/www/login.py b/frappe/www/login.py index e14dd85cf0..c2f83e45c3 100644 --- a/frappe/www/login.py +++ b/frappe/www/login.py @@ -15,8 +15,8 @@ from frappe.utils.html_utils import get_icon_html no_cache = True def get_context(context): - if frappe.session.user != "Guest" and frappe.session.data.user_type=="System User": - frappe.local.flags.redirect_location = "/desk" + if frappe.session.user != "Guest": + frappe.local.flags.redirect_location = "/" if frappe.session.data.user_type=="Website User" else "/desk" raise frappe.Redirect # get settings from site config