Merge branch 'main' into avm99963-monorail

Merged commit 4137ed7879acadbf891e8c471108acb874dae886.

GitOrigin-RevId: b6100ffc5b1da355a35f37b13fcaaf746ee8b307
diff --git a/flaskregisterpages.py b/flaskregisterpages.py
new file mode 100644
index 0000000..1f0a949
--- /dev/null
+++ b/flaskregisterpages.py
@@ -0,0 +1,59 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://developers.google.com/open-source/licenses/bsd
+"""This file sets up all the urls for monorail pages."""
+
+import logging
+from framework import excessiveactivity
+import settings
+from flask import Flask
+
+from project import project_constants
+
+
+class ServletRegistry(object):
+
+  _PROJECT_NAME_REGEX = project_constants.PROJECT_NAME_PATTERN
+  _USERNAME_REGEX = r'[-+\w=.%]+(@([-a-z0-9]+\.)*[a-z0-9]+)?'
+  _HOTLIST_ID_NAME_REGEX = r'\d+|[a-zA-Z][-0-9a-zA-Z\.]*'
+
+  def __init__(self):
+    self.routes = []
+
+  def _AddRoute(
+      self, path_regex, servlet_handler, method='GET', does_write=False):
+    """Add a GET or POST handler to our flask route list.
+
+    Args:
+      path_regex: string with flask URL template regex.
+      servlet_handler: a servlet handler function.
+      method: string 'GET' or 'POST'.
+      does_write: True if the servlet could write to the database, we skip
+          registering such servlets when the site is in read_only mode. GET
+          handlers never write. Most, but not all, POST handlers do write.
+    """
+    if settings.read_only and does_write:
+      logging.info('Not registring %r because site is read-only', path_regex)
+    else:
+      self.routes.append([path_regex, servlet_handler, [method]])
+
+  def _SetupServlets(self, spec_dict, base='', post_does_write=True):
+    """Register each of the given servlets."""
+    for get_uri, servlet_handler in spec_dict.items():
+      self._AddRoute(base + get_uri, servlet_handler, 'GET')
+      post_uri = get_uri + ('edit.do' if get_uri.endswith('/') else '.do')
+      self._AddRoute(
+          base + post_uri, servlet_handler, 'POST', does_write=post_does_write)
+
+  def Register(self):
+    """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