Merge branch 'main' into avm99963-monorail

Merged commit cd4b3b336f1f14afa02990fdc2eec5d9467a827e

GitOrigin-RevId: e67bbf185d5538e1472bb42e0abb2a141f88bac1
diff --git a/flaskregisterpages.py b/flaskregisterpages.py
index 1f0a949..af73a7f 100644
--- a/flaskregisterpages.py
+++ b/flaskregisterpages.py
@@ -5,11 +5,82 @@
 """This file sets up all the urls for monorail pages."""
 
 import logging
-from framework import excessiveactivity
 import settings
-from flask import Flask
 
+import flask
+
+from features import banspammer
+from features import inboundemail
+from features import hotlistcreate
+from features import savedqueries
+from features import userhotlists
+from framework import banned
+from framework import clientmon
+from framework import warmup
+from framework import reap
+from framework import deleteusers
+from framework import excessiveactivity
+from framework import ts_mon_js
+from framework import trimvisitedpages
+from project import peopledetail
+from project import peoplelist
+from project import projectadmin
+from project import projectadminadvanced
+from project import projectexport
+from project import projectsummary
+from project import projectupdates
 from project import project_constants
+from project import redirects
+from services import cachemanager_svc
+from services import client_config_svc
+from sitewide import custom_404
+from sitewide import hostinghome
+from sitewide import moved
+from sitewide import userclearbouncing
+from sitewide import userupdates
+from sitewide import userprofile
+from sitewide import projectcreate
+from sitewide import usersettings
+from sitewide import groupadmin
+from sitewide import groupcreate
+from sitewide import groupdetail
+from sitewide import grouplist
+from features import rerankhotlist
+from features import hotlistdetails
+from features import hotlistissues
+from features import hotlistissuescsv
+from features import hotlistpeople
+from features import dateaction
+from features import filterrules
+from features import pubsub
+from features import notify
+from features import hotlistcreate
+from features import savedqueries
+from features import userhotlists
+from features import banspammer
+from search import backendnonviewable
+from search import backendsearch
+from tracker import componentcreate
+from tracker import fltconversion
+from tracker import fieldcreate
+from tracker import fielddetail
+from tracker import templatecreate
+from tracker import templatedetail
+from tracker import issueadmin
+from tracker import issueadvsearch
+from tracker import issueattachment
+from tracker import issueattachmenttext
+from tracker import issuebulkedit
+from tracker import issuedetailezt
+from tracker import issueentry
+from tracker import issueentryafterlogin
+from tracker import issueexport
+from tracker import issueoriginal
+from tracker import issuereindex
+from tracker import issuetips
+from tracker import issueimport
+
+from tracker import webcomponentspage
 
 
 class ServletRegistry(object):
@@ -50,10 +121,796 @@
     """Register all the monorail request handlers."""
     return self.routes
 
-  def RegisterExcesiveActivity(self, service):
-    flaskapp_excessive_activity = Flask(__name__)
-    flaskapp_excessive_activity.add_url_rule(
-        '/',
-        view_func=excessiveactivity.ExcessiveActivity(services=service).handler,
-        methods=['GET'])
-    return flaskapp_excessive_activity
+  def _AddFlaskUrlRules(self, flask_instance, rule_tuple):
+    """Add url rules to a given Flask instance.
+
+    Args:
+      flask_instance: The Flask app to add URLs to.
+      rule_tuple: List of tuple of path, module and method to call, HTTP method
+
+    Returns:
+      The Flask instance.
+    """
+    for rule in rule_tuple:
+      flask_instance.add_url_rule(rule[0], view_func=rule[1], methods=rule[2])
+    return flask_instance
+
+  # pylint: disable=unused-argument
+  def RegisterGroupUrls(self, services):
+    flaskapp_group = flask.Flask(__name__)
+    _GROUP_URL = [
+        # ('/', grouplist.GroupList(services=services).GetGroupList, ['GET']),
+        # (
+        #     '/<string:viewed_username>/',
+        #     groupdetail.GroupDetail(services=services).GetGroupDetail,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/edit.do',
+        #     groupdetail.GroupDetail(services=services).PostGroupDetail,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/groupadmin',
+        #     groupadmin.GroupAdmin(services=services).GetGroupAdmin, ['GET']),
+        # (
+        #     '/<string:viewed_username>/groupadmin.do',
+        #     groupadmin.GroupAdmin(services=services).PostGroupAdmin,
+        #     ['POST']),
+    ]
+
+    return self._AddFlaskUrlRules(flaskapp_group, _GROUP_URL)
+
+  # pylint: disable=unused-argument
+  def RegisterHostingUrl(self, service):
+    flaskapp_hosting = flask.Flask(__name__)
+    _HOSTING_URL = [
+        # (
+        #     '/excessiveActivity',
+        #     excessiveactivity.ExcessiveActivity(
+        #         services=service).GetExcessiveActivity, ['GET']),
+        # (
+        #     '/settings',
+        #     usersettings.UserSettings(services=service).GetUserSetting, ['GET'
+        #                                                                 ]),
+        # (
+        #     '/settings.do',
+        #     usersettings.UserSettings(services=service).PostUserSetting,
+        #     ['POST']),
+        # ('/noAccess', banned.Banned(services=service).GetNoAccessPage,
+        #   ['GET']),
+        # (
+        #     '/moved', moved.ProjectMoved(services=service).GetProjectMoved,
+        #     ['GET']),
+        # (
+        #     '/createProject',
+        #     projectcreate.ProjectCreate(services=service).GetCreateProject,
+        #     ['GET']),
+        # (
+        #     '/createProject.do',
+        #     projectcreate.ProjectCreate(services=service).PostCreateProject,
+        #     ['POST']),
+        # (
+        #     '/createHotlist',
+        #     hotlistcreate.HotlistCreate(services=service).GetCreateHotlist,
+        #     ['GET']),
+        # (
+        #     '/createHotlist.do',
+        #     hotlistcreate.HotlistCreate(services=service).PostCreateHotlist,
+        #     ['POST']),
+        # (
+        #     '/createGroup',
+        #     groupcreate.GroupCreate(services=service).GetGroupCreate,
+        #     ['GET']),
+        # (
+        #     '/createGroup.do',
+        #     groupcreate.GroupCreate(services=service).PostGroupCreate,
+        #     ['POST']),
+        # (
+        #     '/deleteGroup',
+        #     grouplist.GroupDelete(services=service).GetGroupDelete,
+        #     ['GET']),
+        # (
+        #     '/deleteGroup.do',
+        #     grouplist.GroupDelete(services=service).PostGroupDelete,
+        #     ['POST']),
+    ]
+
+    flaskapp_hosting = self._AddFlaskUrlRules(flaskapp_hosting, _HOSTING_URL)
+
+    # pylint: disable=unused-variable
+    # for url /hosting/
+    @flaskapp_hosting.route('/')
+    def DefaultToMainPage():
+      url = flask.request.host_url
+      return flask.redirect(url)
+
+    return flaskapp_hosting
+
+  def RegisterOldHostUrl(self, service):
+    flaskapp_hosting_old = flask.Flask(__name__)
+
+    # pylint: disable=unused-variable
+    @flaskapp_hosting_old.route('/')
+    def GetHostingOld():
+      return hostinghome.HostingHome(services=service).GetOldHostingHome()
+
+    return flaskapp_hosting_old
+
+  def RegisterRedirectProjectUrl(self):
+    flaskapp_project_redirect = flask.Flask(__name__)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project_redirect.route('/')
+    def GetRedirectProject():
+      url = flask.request.host_url
+      return flask.redirect(url)
+
+    return flaskapp_project_redirect
+
+  def RegisterProjectUrls(self, service):
+    flaskapp_project = flask.Flask(__name__)
+    _PROJECT_URLS = [
+        # (
+        #     '/<string:project_name>/<string:unrecognized>',
+        #     custom_404.ErrorPage(services=service).Get404Page,
+        #     ['GET'],
+        # ),
+        # (
+        #     '/<string:project_name>/adminComponents',
+        #     issueadmin.AdminComponents(
+        #         services=service).GetAdminComponentsPage, ['GET']),
+        # (
+        #     '/<string:project_name>/adminComponents.do',
+        #     issueadmin.AdminComponents(
+        #         services=service).PostAdminComponentsPage, ['POST']),
+        # (
+        #     '/<string:project_name>/adminIntro',
+        #     projectsummary.ProjectSummary(
+        #         services=service).GetProjectSummaryPage, ['GET']),
+        # (
+        #     '/<string:project_name>/adminLabels',
+        #     issueadmin.AdminLabels(services=service).GetAdminLabelsPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminLabels.do',
+        #     issueadmin.AdminLabels(services=service).PostAdminLabelsPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/adminRules',
+        #     issueadmin.AdminRules(services=service).GetAdminRulesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminRules.do',
+        #     issueadmin.AdminRules(services=service).PostAdminRulesPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/adminStatuses',
+        #     issueadmin.AdminStatuses(services=service).GetAdminStatusesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminStatuses.do',
+        #     issueadmin.AdminStatuses(services=service).PostAdminStatusesPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/adminTemplates',
+        #     issueadmin.AdminTemplates(services=service).GetAdminTemplatesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminTemplates.do',
+        #     issueadmin.AdminTemplates(
+        #         services=service).PostAdminTemplatesPage, ['POST']),
+        # (
+        #     '/<string:project_name>/adminViews',
+        #     issueadmin.AdminViews(services=service).GetAdminViewsPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/adminViews.do',
+        #     issueadmin.AdminViews(services=service).PostAdminViewsPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/admin',
+        #     projectadmin.ProjectAdmin(services=service).GetProjectAdminPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/admin.do',
+        #     projectadmin.ProjectAdmin(services=service).PostProjectAdminPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/adminAdvanced',
+        #     projectadminadvanced.ProjectAdminAdvanced(
+        #         services=service).GetProjectAdminAdvancedPage, ['GET']),
+        # (
+        #     '/<string:project_name>/adminAdvanced.do',
+        #     projectadminadvanced.ProjectAdminAdvanced(
+        #         services=service).PostProjectAdminAdvancedPage, ['POST']),
+        # (
+        #     '/<string:project_name>/components/create',
+        #     componentcreate.ComponentCreate(
+        #         services=service).GetComponentCreatePage, ['GET']),
+        # (
+        #     '/<string:project_name>/components/create.do',
+        #     componentcreate.ComponentCreate(
+        #         services=service).PostComponentCreatePage, ['POST']),
+        # (
+        #     '/<string:project_name>/fields/create',
+        #     fieldcreate.FieldCreate(
+        #         services=service).GetFieldCreate, ['GET']),
+        # (
+        #     '/<string:project_name>/fields/create.do',
+        #     fieldcreate.FieldCreate(
+        #         services=service).PostFieldCreate, ['POST']),
+        # (
+        #     '/<string:project_name>/fields/detail',
+        #     fielddetail.FieldDetail(
+        #         services=service).GetFieldDetail, ['GET']),
+        # (
+        #     '/<string:project_name>/fields/detail.do',
+        #     fielddetail.FieldDetail(
+        #         services=service).PostFieldDetail, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/advsearch',
+        #     issueadvsearch.IssueAdvancedSearch(
+        #         services=service).GetIssueAdvSearchPage, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/advsearch.do',
+        #     issueadvsearch.IssueAdvancedSearch(
+        #         services=service).PostIssueAdvSearchPage, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/detail',
+        #     webcomponentspage.WebComponentsPage(
+        #         services=service).GetWebComponentsIssueDetail, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/export',
+        #     issueexport.IssueExport(services=service).GetIssueExport,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/issues/export/json',
+        #     issueexport.IssueExportJSON(services=service).GetIssueExportJSON,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/issues/export/json.do',
+        #     issueexport.IssueExportJSON(services=service).PostIssueExportJSON,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/issues/import',
+        #     issueimport.IssueImport(services=service).GetIssueImport,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/issues/import.do',
+        #     issueimport.IssueImport(services=service).PostIssueImport, ['POST'
+        #                                                                ]),
+        # (
+        #     '/<string:project_name>/issues/original',
+        #     issueoriginal.IssueOriginal(services=service).GetIssueOriginal,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/issues/entry',
+        #     issueentry.IssueEntry(
+        #         services=service).GetIssueEntry, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/entry.do',
+        #     issueentry.IssueEntry(
+        #         services=service).PostIssueEntry, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/entry_new',
+        #     webcomponentspage.WebComponentsPage(
+        #         services=service).GetWebComponentsIssueNewEntry, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/list',
+        #     webcomponentspage.WebComponentsPage(
+        #         services=service).GetWebComponentsIssueList, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/reindex',
+        #     issuereindex.IssueReindex(
+        #         services=service).GetIssueReindex, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/reindex.do',
+        #     issuereindex.IssueReindex(
+        #         services=service).PostIssueReindex, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/detail/list',
+        #     issuedetailezt.FlipperList(
+        #         services=service).GetFlipperList, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/detail/flipper',
+        #     issuedetailezt.FlipperIndex(
+        #         services=service).GetFlipperIndex, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/detail/flipper.do',
+        #     issuedetailezt.FlipperIndex(
+        #         services=service).PostFlipperIndex, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/wizard',
+        #     webcomponentspage.WebComponentsPage(
+        #         services=service).GetWebComponentsIssueWizard, ['GET']),
+        # (
+        #     '/<string:project_name>/templates/create',
+        #     templatecreate.TemplateCreate(
+        #         services=service).GetTemplateCreate, ['GET']),
+        # (
+        #     '/<string:project_name>/templates/create.do',
+        #     templatecreate.TemplateCreate(
+        #         services=service).PostTemplateCreate, ['POST']),
+        # (
+        #     '/<string:project_name>/templates/detail',
+        #     templatedetail.TemplateDetail(
+        #         services=service).GetTemplateDetail, ['GET']),
+        # (
+        #     '/<string:project_name>/templates/detail.do',
+        #     templatedetail.TemplateDetail(
+        #         services=service).PostTemplateDetail, ['POST']),
+        # (
+        #     '/<string:project_name>/people/list',
+        #     peoplelist.PeopleList(services=service).GetPeopleListPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/people/list.do',
+        #     peoplelist.PeopleList(services=service).PostPeopleListPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/people/detail',
+        #     peopledetail.PeopleDetail(services=service).GetPeopleDetailPage,
+        #     ['GET']),
+        # (
+        #     '/<string:project_name>/people/detail.do',
+        #     peopledetail.PeopleDetail(services=service).PostPeopleDetailPage,
+        #     ['POST']),
+        # (
+        #     '/<string:project_name>/projectExport',
+        #     projectexport.ProjectExport(
+        #         services=service).GetProjectExportPage, ['GET']),
+        # (
+        #     '/<string:project_name>/projectExport/json',
+        #     projectexport.ProjectExportJSON(
+        #         services=service).GetProjectExportJSONPage, ['GET']),
+        # (
+        #     '/<string:project_name>/projectExport/json.do',
+        #     projectexport.ProjectExportJSON(
+        #         services=service).PostProjectExportJSONPage, ['POST']),
+        # (
+        #     '/<string:project_name>/updates/list',
+        #     projectupdates.ProjectUpdates(
+        #         services=service).GetProjectUpdatesPage, ['GET']),
+        # (
+        #     '/<string:project_name>/w/list',
+        #     redirects.WikiRedirect(
+        #         services=service).GetWikiListRedirect, ['GET']),
+        # (
+        #     '/<string:project_name>/wiki/<string:wiki_page>',
+        #     redirects.WikiRedirect(
+        #         services=service).GetWikiRedirect, ['GET']),
+        # (
+        #     '/<string:project_name>/source/<string:source_page>',
+        #     redirects.SourceRedirect(
+        #         services=service).GetSourceRedirect, ['GET']),
+        #     '/<string:project_name>/issues/entryafterlogin',
+        #     issueentryafterlogin.IssueEntryAfterLogin(
+        #         services=service).GetIssueEntryAfterLogin,
+        #     ['GET'],
+        # ),
+        # (
+        #     '/<string:project_name>/issues/searchtips',
+        #     issuetips.IssueSearchTips(services=service).GetIssueSearchTips,
+        #     ['GET'],
+        # ),
+        # (
+        #    '/<string:project_name>/issues/attachment',
+        #    issueattachment.AttachmentPage(services=service).GetAttachmentPage,
+        #    ['GET'],
+        # ),
+        # (
+        #     '/<string:project_name>/issues/attachmentText',
+        #     issueattachmenttext.AttachmentText(
+        #         services=service).GetAttachmentText,
+        #     ['GET'],
+        # ),
+        # (
+        #     '/<string:project_name>/issues/bulkedit',
+        #     issuebulkedit.IssueBulkEdit(
+        #         services=service).GetIssueBulkEdit, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/bulkedit.do',
+        #     issuebulkedit.IssueBulkEdit(
+        #         services=service).PostIssueBulkEdit, ['POST']),
+        # (
+        #     '/<string:project_name>/issues/detail/next',
+        #     issuedetailezt.FlipperNext(
+        #         services=service).GetFlipperNextRedirectPage, ['GET']),
+        # (
+        #     '/<string:project_name>/issues/detail/previous',
+        #     issuedetailezt.FlipperPrev(
+        #         services=service).GetFlipperPrevRedirectPage, ['GET']),
+    ]
+    flaskapp_project = self._AddFlaskUrlRules(flaskapp_project, _PROJECT_URLS)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project.route('/<string:project_name>/issues/approval')
+    @flaskapp_project.route('/<string:project_name>/issues/detail_ezt')
+    def ProjectRedirectToIssueDetail(project_name):
+      host_url = flask.request.host_url
+      url = host_url + 'p/' + project_name + '/issues/detail'
+      query_string = flask.request.query_string
+      if query_string:
+        url = '%s?%s' % (url, query_string)
+      return flask.redirect(url)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project.route('/<string:project_name>/issues/list_new')
+    @flaskapp_project.route('/<string:project_name>/')
+    @flaskapp_project.route('/<string:project_name>/issues/')
+    def ProjectRedirectToIssueList(project_name):
+      host_url = flask.request.host_url
+      url = host_url + 'p/' + project_name + '/issues/list'
+      query_string = flask.request.query_string
+      if query_string:
+        url = '%s?%s' % (url, query_string)
+      return flask.redirect(url)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project.route('/')
+    def ProjectRedirectToMainPage():
+      url = flask.request.host_url
+      return flask.redirect(url)
+
+    # pylint: disable=unused-variable
+    @flaskapp_project.route('/<string:project_name>/people/')
+    def ProjectRedirectToPeopleList(project_name):
+      host_url = flask.request.host_url
+      url = host_url + 'p/' + project_name + '/people/list'
+      return flask.redirect(url)
+
+    return flaskapp_project
+
+  def RegisterUserUrls(self, service):
+    flaskapp_user = flask.Flask(__name__)
+    _USER_URLS = [
+        # (
+        #     '/<string:viewed_username>/queries',
+        #     savedqueries.SavedQueries(services=service).GetSavedQueriesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/queries.do',
+        #     savedqueries.SavedQueries(services=service).PostSavedQueriesPage,
+        #     ['Post']),
+        # (
+        #     '/<string:viewed_username>/hotlists',
+        #     userhotlists.UserHotlists(services=service).GetUserHotlistsPage,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/hotlists.do',
+        #     userhotlists.UserHotlists(services=service).PostUserHotlistsPage,
+        #     ['Post']),
+        # (
+        #     '/<string:viewed_username>/',
+        #     userprofile.UserProfile(services=service).GetUserProfilePage,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/edit.do',
+        #     userprofile.UserProfile(services=service).PostUserProfilePage,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/ban.do',
+        #     userprofile.BanUser(services=service).PostBanUserPage,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/banSpammer.do',
+        #     banspammer.BanSpammer(services=service).PostBanSpammerPage,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/clearBouncing',
+        #     userclearbouncing.UserClearBouncing(
+        #         services=service).GetUserClearBouncingPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/clearBouncing.do',
+        #     userclearbouncing.UserClearBouncing(
+        #         services=service).PostUserClearBouncingPage, ['Post']),
+        # (
+        #     '/<string:viewed_username>/updates/projects',
+        #     userupdates.UserUpdatesProjects(
+        #         services=service).GetUserUpdatesProjectsPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/updates/developers',
+        #     userupdates.UserUpdatesDevelopers(
+        #         services=service).GetUserUpdatesDevelopersPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/updates',
+        #     userupdates.UserUpdatesIndividual(
+        #         services=service).GetUserUpdatesPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>',
+        #    hotlistissues.HotlistIssues(services=service).GetHotlistIssuesPage,
+        #     ['GET']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>.do',
+        #   hotlistissues.HotlistIssues(services=service).PostHotlistIssuesPage,
+        #     ['POST']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>/csv',
+        #     hotlistissuescsv.HotlistIssuesCsv(
+        #         services=service).GetHotlistIssuesCsvPage, ['GET']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>/people',
+        #     hotlistpeople.HotlistPeopleList(
+        #         services=service).GetHotlistPeoplePage, ['GET']),
+        # (
+        #    '/<string:viewed_username>/hotlists/<string:hotlist_id>/people.do',
+        #     hotlistpeople.HotlistPeopleList(
+        #         services=service).PostHotlistPeoplePage, ['POST']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>/details',
+        #     hotlistdetails.HotlistDetails(
+        #         services=service).GetHotlistDetailsPage, ['GET']),
+        # (
+        #   '/<string:viewed_username>/hotlists/<string:hotlist_id>/details.do',
+        #     hotlistdetails.HotlistDetails(
+        #         services=service).PostHotlistDetailsPage, ['POST']),
+        # (
+        #     '/<string:viewed_username>/hotlists/<string:hotlist_id>/rerank',
+        #     rerankhotlist.RerankHotlistIssue(
+        #         services=service).GetRerankHotlistIssuePage, ['GET']),
+        # (
+        #   '/<string:viewed_username>/hotlists/<string:hotlist_id>/rerank.do',
+        #     rerankhotlist.RerankHotlistIssue(
+        #         services=service).PostRerankHotlistIssuePage, ['POST']),
+    ]
+
+    flaskapp_user = self._AddFlaskUrlRules(flaskapp_user, _USER_URLS)
+
+    # pylint: disable=unused-variable
+    # for url /u/
+    @flaskapp_user.route('/')
+    def UserRedirectToMainPage():
+      url = flask.request.host_url
+      return flask.redirect(url)
+
+    return flaskapp_user
+
+  # pylint: disable=unused-argument
+  def RegisterTaskUrl(self, service):
+    flaskapp_task = flask.Flask(__name__)
+    _TASK_URL = [
+        # (
+        #     '/banSpammer',
+        #     banspammer.BanSpammerTask(services=service).GetBanSpammer,
+        #     ['GET']),
+        # (
+        #     '/banSpammer.do',
+        #     banspammer.BanSpammerTask(services=service).PostBanSpammer,
+        #     ['POST']),
+        # (
+        #     '/sendWipeoutUserListsTask',
+        #     deleteusers.SendWipeoutUserListsTask(
+        #         services=service).GetSendWipeoutUserListsTask, ['GET']),
+        # (
+        #     '/sendWipeoutUserListsTask.do',
+        #     deleteusers.SendWipeoutUserListsTask(
+        #         services=service).PostSendWipeoutUserListsTask, ['POST']),
+        # (
+        #     '/deleteWipeoutUsersTask',
+        #     deleteusers.DeleteWipeoutUsersTask(
+        #         services=service).GetDeleteWipeoutUsersTask, ['GET']),
+        # (
+        #     '/deleteWipeoutUsersTask.do',
+        #     deleteusers.DeleteWipeoutUsersTask(
+        #         services=service).PostDeleteWipeoutUsersTask, ['POST']),
+        # (
+        #     '/deleteUsersTask',
+        #     deleteusers.DeleteUsersTask(services=service).GetDeleteUsersTask,
+        #     ['GET']),
+        # (
+        #     '/deleteUsersTask.do',
+        #     deleteusers.DeleteUsersTask(services=service).PostDeleteUsersTask,
+        #     ['POST']),
+        # (
+        #     '/notifyRulesDeleted',
+        #     notify.NotifyRulesDeletedTask(
+        #         services=service).GetNotifyRulesDeletedTask, ['GET']),
+        # (
+        #     '/notifyRulesDeleted.do',
+        #     notify.NotifyRulesDeletedTask(
+        #         services=service).PostNotifyRulesDeletedTask, ['POST']),
+        # (
+        #     '/notifyIssueChange', notify.NotifyIssueChangeTask(
+        #         services=service).GetNotifyIssueChangeTask, ['GET']),
+        # (
+        #     '/notifyIssueChange.do',
+        #     notify.NotifyIssueChangeTask(
+        #         services=service).PostNotifyIssueChangeTask, ['POST']),
+        # (
+        #     '/notifyBlockingChange',
+        #     notify.NotifyBlockingChangeTask(
+        #         services=service).GetNotifyBlockingChangeTask, ['GET']),
+        # (
+        #     '/notifyBlockingChange.do',
+        #     notify.NotifyBlockingChangeTask(
+        #         services=service).PostNotifyBlockingChangeTask, ['POST']),
+        # (
+        #     '/notifyBulkEdit', notify.NotifyBulkChangeTask(
+        #         services=service).GetNotifyBulkChangeTask, ['GET']),
+        # (
+        #     '/notifyBulkEdit.do', notify.NotifyBulkChangeTask(
+        #         services=service).PostNotifyBulkChangeTask, ['POST']),
+        # (
+        #     '/notifyApprovalChange',
+        #     notify.NotifyApprovalChangeTask(
+        #         services=service).GetNotifyApprovalChangeTask, ['GET']),
+        # (
+        #     '/notifyApprovalChange.do',
+        #     notify.NotifyApprovalChangeTask(
+        #         services=service).PostNotifyApprovalChangeTask, ['POST']),
+        # (
+        #     '/publishPubsubIssueChange',
+        #     pubsub.PublishPubsubIssueChangeTask(
+        #         services=service).GetPublishPubsubIssueChangeTask, ['GET']),
+        # (
+        #     '/publishPubsubIssueChange.do',
+        #     pubsub.PublishPubsubIssueChangeTask(
+        #         services=service).PostPublishPubsubIssueChangeTask, ['POST']),
+        # (
+        #     '/issueDateAction', dateaction.IssueDateActionTask(
+        #         services=service).GetIssueDateActionTask, ['GET']),
+        # (
+        #     '/issueDateAction.do',
+        #     dateaction.IssueDateActionTask(
+        #         services=service).PostIssueDateActionTask, ['POST']),
+        # (
+        #     '/fltConversionTask',
+        #     fltconversion.FLTConvertTask(services=service).GetFLTConvertTask,
+        #     ['GET']),
+        # (
+        #     '/fltConversionTask.do',
+        #     fltconversion.FLTConvertTask(services=service).PostFLTConvertTask,
+        #     ['POST']),
+        # (
+        #     '/outboundEmail',
+        #     notify.OutboundEmailTask(services=service).GetOutboundEmailTask,
+        #     ['GET']),
+        # (
+        #     '/outboundEmail.do',
+        #     notify.OutboundEmailTask(services=service).PostOutboundEmailTask,
+        #     ['POST']),
+        # (
+        #     '/recomputeDerivedFields',
+        #     filterrules.RecomputeDerivedFieldsTask(
+        #         services=service).GetRecomputeDerivedFieldsTask, ['GET']),
+        # (
+        #     '/recomputeDerivedFields.do',
+        #     filterrules.RecomputeDerivedFieldsTask(
+        #         services=service).PostRecomputeDerivedFieldsTask, ['POST']),
+    ]
+
+    for rule in _TASK_URL:
+      flaskapp_task.add_url_rule(rule[0], view_func=rule[1], methods=rule[2])
+
+    return flaskapp_task
+
+  # pylint: disable=unused-argument
+  def RegisterCronUrl(self, service):
+    flaskapp_cron = flask.Flask(__name__)
+    _CRON_URL = [
+        # (
+        #     '/wipeoutSync',
+        #     deleteusers.WipeoutSyncCron(services=service).GetWipeoutSyncCron,
+        #     ['GET']),
+        # (
+        #     '/wipeoutSync.do',
+        #     deleteusers.WipeoutSyncCron(services=service).PostWipeoutSyncCron,
+        #     ['POST']),
+        # (
+        #     '/reindexQueue',
+        #     filterrules.ReindexQueueCron(
+        #       services=service).GetReindexQueueCron,
+        #     ['GET']),
+        # (
+        #     '/reindexQueue.do',
+        #     filterrules.ReindexQueueCron(
+        #       services=service).PostReindexQueueCron,
+        #     ['POST']),
+        # (
+        #     '/dateAction',
+        #     dateaction.DateActionCron(services=service).GetDateActionCron,
+        #     ['GET']),
+        # (
+        #     '/dateAction.do',
+        #     dateaction.DateActionCron(services=service).PostDateActionCron,
+        #     ['POST']),
+        # (
+        #     '/ramCacheConsolidate',
+        #     cachemanager_svc.RamCacheConsolidate(
+        #         services=service).GetRamCacheConsolidate, ['GET']),
+        # (
+        #     '/ramCacheConsolidate.do',
+        #     cachemanager_svc.RamCacheConsolidate(
+        #         services=service).PostRamCacheConsolidate, ['POST']),
+        # ('/reap', reap.Reap(services=service).GetReap, ['GET']),
+        # ('/reap.do', reap.Reap(services=service).PostReap, ['POST']),
+        # (
+        #     '/loadApiClientConfigs',
+        #     client_config_svc.LoadApiClientConfigs().GetLoadApiClientConfigs,
+        #     ['GET']),
+        # (
+        #     '/trimVisitedPages',
+        #     trimvisitedpages.TrimVisitedPages(
+        #         services=service).GetTrimVisitedPages, ['GET']),
+        # (
+        #     '/trimVisitedPages.do',
+        #     trimvisitedpages.TrimVisitedPages(
+        #         services=service).PostTrimVisitedPages, ['POST']),
+    ]
+
+    for rule in _CRON_URL:
+      flaskapp_cron.add_url_rule(rule[0], view_func=rule[1], methods=rule[2])
+
+    return flaskapp_cron
+
+  # pylint: disable=unused-argument
+  def RegisterBackendUrl(self, service):
+    flaskapp_backend = flask.Flask(__name__)
+    _BACKEND_URL = [
+        # (
+        #     '/search',
+        #     backendsearch.BackendSearch(services=service).GetBackendSearch,
+        #     ['GET']),
+        # (
+        #     '/search.do',
+        #     backendsearch.BackendSearch(services=service).PostBackendSearch,
+        #     ['POST']),
+        # (
+        #     '/nonviewable',
+        #     backendnonviewable.BackendNonviewable(
+        #         services=service).GetBackendNonviewable,
+        #     ['GET']),
+        # (
+        #     '/nonviewable.do',
+        #     backendnonviewable.BackendNonviewable(
+        #        services=service).PostBackendNonviewable,
+        #     ['POST']),
+    ]
+
+    for rule in _BACKEND_URL:
+      flaskapp_backend.add_url_rule(rule[0], view_func=rule[1], methods=rule[2])
+
+    return flaskapp_backend
+
+  # pylint: disable=unused-argument
+  def RegisterMONSetUrl(self, service):
+    flaskapp_mon = flask.Flask(__name__)
+    _MON_URL = [
+        # (
+        #     '/clientmon',
+        #     clientmon.ClientMonitor(services=service).GetClientMonitor, ['GET'
+        #                                                                 ]),
+        # (
+        #     '/clientmon.do',
+        #     clientmon.ClientMonitor(services=service).PostClientMonitor,
+        #     ['POST']),
+        # (
+        #     '/jstsmon.do',
+        #     ts_mon_js.FlaskMonorailTSMonJSHandler(
+        #         services=service).PostMonorailTSMonJSHandler,
+        #     ['POST'],
+        # )
+    ]
+
+    flaskapp_mon = self._AddFlaskUrlRules(flaskapp_mon, _MON_URL)
+    return flaskapp_mon
+
+  # pylint: disable=unused-argument
+  def RegisterAHUrl(self, service):
+    flaskapp_ah = flask.Flask(__name__)
+    _AH_URL = [
+        # ('/warmup', warmup.Warmup(services=service).GetWarmup, ['GET']),
+        # ('/start', warmup.Start(services=service).GetStart, ['GET']),
+        # ('/stop', warmup.Stop(services=service).GetStop, ['GET']),
+        # (
+        #     '/bounce',
+        #     inboundemail.BouncedEmail(services=service).postBouncedEmail,
+        #     ['POST']),
+        # (
+        #     '/mail/<string:project_addr>',
+        #     inboundemail.InboundEmail(services=service).HandleInboundEmail,
+        #     ['GET', 'POST'])
+    ]
+
+    flaskapp_ah = self._AddFlaskUrlRules(flaskapp_ah, _AH_URL)
+
+    return flaskapp_ah