def _CheckForMovedProject(self, mr, request): """If the project moved, redirect there or to an informational page.""" if not mr.project: return # We are on a site-wide or user page. if not mr.project.moved_to: return # This project has not moved. admin_url = '/p/%s%s' % (mr.project_name, urls.ADMIN_META) if request.path.startswith(admin_url): return # It moved, but we are near the page that can un-move it. logging.info('project %s has moved: %s', mr.project.project_name, mr.project.moved_to) moved_to = mr.project.moved_to if framework_bizobj.RE_PROJECT_NAME.match(moved_to): # Use the redir query parameter to avoid redirect loops. if mr.redir is None: url = framework_helpers.FormatMovedProjectURL(mr, moved_to) if '?' in url: url += '&redir=1' else: url += '?redir=1' logging.info('trusted move to a new project on our site') self.redirect(url, abort=True) logging.info('not a trusted move, will display link to user to click') # Attach the project name as a url param instead of generating a /p/ # link to the destination project. url = framework_helpers.FormatAbsoluteURL(mr, urls.PROJECT_MOVED, include_project=False, copy_params=False, project=mr.project_name) self.redirect(url, abort=True)
def testFormatMovedProjectURL(self): """Project foo has been moved to bar. User is visiting /p/foo/...""" mr = testing_helpers.MakeMonorailRequest() mr.current_page_url = '/p/foo/' self.assertEqual('/p/bar/', framework_helpers.FormatMovedProjectURL(mr, 'bar')) mr.current_page_url = '/p/foo/issues/list' self.assertEqual('/p/bar/issues/list', framework_helpers.FormatMovedProjectURL(mr, 'bar')) mr.current_page_url = '/p/foo/issues/detail?id=123' self.assertEqual('/p/bar/issues/detail?id=123', framework_helpers.FormatMovedProjectURL(mr, 'bar')) mr.current_page_url = '/p/foo/issues/detail?id=123#c7' self.assertEqual('/p/bar/issues/detail?id=123#c7', framework_helpers.FormatMovedProjectURL(mr, 'bar'))