示例#1
0
    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'))