Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 1 | # Copyright 2022 The Chromium Authors |
| 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 4 | """This file sets up all the urls for monorail pages.""" |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 5 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 6 | import flask |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 7 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 8 | import urllib |
| 9 | |
| 10 | from components import endpoints_flask |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 11 | from components import prpc |
| 12 | |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 13 | from features import banspammer |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 14 | from features import inboundemail |
| 15 | from features import hotlistcreate |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 16 | from features import savedqueries |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 17 | from features import userhotlists |
| 18 | from framework import banned |
| 19 | from framework import clientmon |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 20 | from framework import csp_report |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 21 | from framework import warmup |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 22 | from framework import reap |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 23 | from framework import deleteusers |
| 24 | from framework import excessiveactivity |
| 25 | from framework import teardown |
| 26 | from framework import ts_mon_js |
| 27 | from framework import trimvisitedpages |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 28 | from project import peopledetail |
| 29 | from project import peoplelist |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 30 | from project import projectadmin |
| 31 | from project import projectadminadvanced |
| 32 | from project import projectexport |
| 33 | from project import projectsummary |
| 34 | from project import projectupdates |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 35 | from project import project_constants |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 36 | from project import redirects |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 37 | from services import api_svc_v1 |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 38 | from services import cachemanager_svc |
| 39 | from services import client_config_svc |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 40 | from sitewide import custom_404 |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 41 | from sitewide import hostinghome |
| 42 | from sitewide import moved |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 43 | from sitewide import userclearbouncing |
| 44 | from sitewide import userupdates |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 45 | from sitewide import userprofile |
| 46 | from sitewide import projectcreate |
| 47 | from sitewide import usersettings |
| 48 | from sitewide import groupadmin |
| 49 | from sitewide import groupcreate |
| 50 | from sitewide import groupdetail |
| 51 | from sitewide import grouplist |
| 52 | from features import rerankhotlist |
| 53 | from features import hotlistdetails |
| 54 | from features import hotlistissues |
| 55 | from features import hotlistissuescsv |
| 56 | from features import hotlistpeople |
| 57 | from features import dateaction |
| 58 | from features import filterrules |
| 59 | from features import pubsub |
| 60 | from features import notify |
| 61 | from features import hotlistcreate |
| 62 | from features import savedqueries |
| 63 | from features import userhotlists |
| 64 | from features import banspammer |
| 65 | from search import backendnonviewable |
| 66 | from search import backendsearch |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 67 | from tracker import componentcreate |
| 68 | from tracker import componentdetail |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 69 | from tracker import fltconversion |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 70 | from tracker import fieldcreate |
| 71 | from tracker import fielddetail |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 72 | from tracker import templatecreate |
| 73 | from tracker import templatedetail |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 74 | from tracker import issueadmin |
| 75 | from tracker import issueadvsearch |
| 76 | from tracker import issueattachment |
| 77 | from tracker import issueattachmenttext |
| 78 | from tracker import issuebulkedit |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 79 | from tracker import issuedetailezt |
| 80 | from tracker import issueentry |
| 81 | from tracker import issueentryafterlogin |
| 82 | from tracker import issueexport |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 83 | from tracker import issueoriginal |
| 84 | from tracker import issuereindex |
| 85 | from tracker import issuetips |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 86 | from tracker import issueimport |
| 87 | |
| 88 | from tracker import webcomponentspage |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 89 | |
| 90 | from api import api_routes as api_routes_v0 |
| 91 | from api.v3 import api_routes as api_routes_v3 |
| 92 | |
| 93 | |
| 94 | class ServletRegistry(object): |
| 95 | |
| 96 | _PROJECT_NAME_REGEX = project_constants.PROJECT_NAME_PATTERN |
| 97 | _USERNAME_REGEX = r'[-+\w=.%]+(@([-a-z0-9]+\.)*[a-z0-9]+)?' |
| 98 | _HOTLIST_ID_NAME_REGEX = r'\d+|[a-zA-Z][-0-9a-zA-Z\.]*' |
| 99 | |
| 100 | def __init__(self): |
| 101 | self.routes = [] |
| 102 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 103 | def _AppendUrlToRoutes(self, rule_tuple, base=''): |
| 104 | """Register each of the given servlets.""" |
| 105 | for rule in rule_tuple: |
| 106 | self.routes.append([base + rule[0], rule[1], rule[2]]) |
| 107 | |
| 108 | def Register(self, services, flask_instance): |
| 109 | """Register all the monorail request handlers.""" |
| 110 | self._RegisterGroupUrls(services) |
| 111 | self._RegisterHostingUrl(services) |
| 112 | self._RegisterOldHostUrl(services) |
| 113 | self._RegisterRedirectProjectUrl() |
| 114 | self._RegisterCSPUrl() |
| 115 | self._RegisterProjectUrls(services, flask_instance) |
| 116 | self._RegisterUserUrls(services) |
| 117 | self._RegisterTaskUrl(services) |
| 118 | self._RegisterCronUrl(services) |
| 119 | self._RegisterBackendUrl(services) |
| 120 | self._RegisterMONSetUrl(services) |
| 121 | self._RegisterAHUrl(services) |
| 122 | self._RegisterPrpcUrl(services) |
| 123 | self._RegisterWebComponentsUrl(services) |
| 124 | self._RegisterFlaskUrlRules(flask_instance, self.routes) |
| 125 | |
| 126 | def _RegisterFlaskUrlRules( |
| 127 | self, flask_instance, rule_tuple, removed_prefix=''): |
| 128 | """Add url rules to a given Flask instance. |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 129 | |
| 130 | Args: |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 131 | flask_instance: The Flask app to add URLs to. |
| 132 | rule_tuple: List of tuple of path, module and method to call, HTTP method |
| 133 | |
| 134 | Returns: |
| 135 | The Flask instance. |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 136 | """ |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 137 | for rule in rule_tuple: |
| 138 | url = rule[0][len(removed_prefix):] if rule[0].startswith( |
| 139 | removed_prefix) else rule[0] |
| 140 | flask_instance.add_url_rule(url, view_func=rule[1], methods=rule[2]) |
| 141 | return flask_instance |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 142 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 143 | # pylint: disable=unused-argument |
| 144 | def _RegisterGroupUrls(self, services): |
| 145 | _GROUP_URL = [ |
| 146 | ( |
| 147 | '/', grouplist.GroupList(services=services).GetGroupList, |
| 148 | ['GET']), |
| 149 | ( |
| 150 | '/<string:viewed_username>/', |
| 151 | groupdetail.GroupDetail(services=services).GetGroupDetail, ['GET']), |
| 152 | ( |
| 153 | '/<string:viewed_username>/edit.do', |
| 154 | groupdetail.GroupDetail(services=services).PostGroupDetail, |
| 155 | ['POST']), |
| 156 | ( |
| 157 | '/<string:viewed_username>/groupadmin', |
| 158 | groupadmin.GroupAdmin(services=services).GetGroupAdmin, ['GET']), |
| 159 | ( |
| 160 | '/<string:viewed_username>/groupadmin.do', |
| 161 | groupadmin.GroupAdmin(services=services).PostGroupAdmin, ['POST']), |
| 162 | ] |
| 163 | self._AppendUrlToRoutes(_GROUP_URL, '/g') |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 164 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 165 | # pylint: disable=unused-argument |
| 166 | def _RegisterHostingUrl(self, service): |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 167 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 168 | def DefaultToMainPage(): |
| 169 | url = flask.request.host_url |
| 170 | return flask.redirect(url) |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 171 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 172 | _HOSTING_URL = [ |
| 173 | ( |
| 174 | '/', |
| 175 | DefaultToMainPage, |
| 176 | ['GET'], |
| 177 | ), |
| 178 | ( |
| 179 | '/excessiveActivity', |
| 180 | excessiveactivity.ExcessiveActivity( |
| 181 | services=service).GetExcessiveActivity, ['GET']), |
| 182 | ( |
| 183 | '/settings', |
| 184 | usersettings.UserSettings(services=service).GetUserSetting, ['GET' |
| 185 | ]), |
| 186 | ( |
| 187 | '/settings.do', |
| 188 | usersettings.UserSettings(services=service).PostUserSetting, |
| 189 | ['POST']), |
| 190 | ('/noAccess', banned.Banned(services=service).GetNoAccessPage, ['GET']), |
| 191 | ( |
| 192 | '/moved', moved.ProjectMoved(services=service).GetProjectMoved, |
| 193 | ['GET']), |
| 194 | ( |
| 195 | '/createProject', |
| 196 | projectcreate.ProjectCreate(services=service).GetCreateProject, |
| 197 | ['GET']), |
| 198 | ( |
| 199 | '/createProject.do', |
| 200 | projectcreate.ProjectCreate(services=service).PostCreateProject, |
| 201 | ['POST']), |
| 202 | ( |
| 203 | '/createHotlist', |
| 204 | hotlistcreate.HotlistCreate(services=service).GetCreateHotlist, |
| 205 | ['GET']), |
| 206 | ( |
| 207 | '/createHotlist.do', |
| 208 | hotlistcreate.HotlistCreate(services=service).PostCreateHotlist, |
| 209 | ['POST']), |
| 210 | ( |
| 211 | '/createGroup', |
| 212 | groupcreate.GroupCreate(services=service).GetGroupCreate, ['GET']), |
| 213 | ( |
| 214 | '/createGroup.do', |
| 215 | groupcreate.GroupCreate(services=service).PostGroupCreate, ['POST' |
| 216 | ]), |
| 217 | ( |
| 218 | '/deleteGroup', |
| 219 | grouplist.GroupList(services=service).GetGroupDelete, ['GET']), |
| 220 | ( |
| 221 | '/deleteGroup.do', |
| 222 | grouplist.GroupList(services=service).PostGroupDelete, |
| 223 | ['POST']), |
| 224 | ] |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 225 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 226 | self._AppendUrlToRoutes(_HOSTING_URL, '/hosting') |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 227 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 228 | def _RegisterOldHostUrl(self, service): |
| 229 | _OLD_HOSTING_URL = [ |
| 230 | ( |
| 231 | '/hosting_old/', |
| 232 | hostinghome.HostingHome(services=service).GetOldHostingHome, |
| 233 | ['GET']), |
| 234 | ] |
| 235 | self._AppendUrlToRoutes(_OLD_HOSTING_URL, '') |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 236 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 237 | def _RegisterRedirectProjectUrl(self): |
| 238 | |
| 239 | def GetRedirectProject(): |
| 240 | url = flask.request.host_url |
| 241 | return flask.redirect(url) |
| 242 | |
| 243 | _PROJECT_REDIRECT_URL = [ |
| 244 | ('/projects/', GetRedirectProject, ['GET']), |
| 245 | ] |
| 246 | self._AppendUrlToRoutes(_PROJECT_REDIRECT_URL, '') |
| 247 | |
| 248 | def _RegisterCSPUrl(self): |
| 249 | self._AppendUrlToRoutes([('/csp.do', csp_report.postCsp, ['POST'])], '') |
| 250 | |
| 251 | def _RegisterProjectUrls(self, service, flaskapp_project): |
| 252 | _PROJECT_URLS = [ |
| 253 | ( |
| 254 | '/<string:project_name>/<string:unrecognized>', |
| 255 | custom_404.ErrorPage(services=service).Get404Page, |
| 256 | ['GET'], |
| 257 | ), |
| 258 | ( |
| 259 | '/<string:project_name>/adminComponents', |
| 260 | issueadmin.AdminComponents(services=service).GetAdminComponentsPage, |
| 261 | ['GET']), |
| 262 | ( |
| 263 | '/<string:project_name>/adminComponents.do', |
| 264 | issueadmin.AdminComponents( |
| 265 | services=service).PostAdminComponentsPage, ['POST']), |
| 266 | ( |
| 267 | '/<string:project_name>/adminIntro', |
| 268 | projectsummary.ProjectSummary( |
| 269 | services=service).GetProjectSummaryPage, ['GET']), |
| 270 | ( |
| 271 | '/<string:project_name>/adminLabels', |
| 272 | issueadmin.AdminLabels(services=service).GetAdminLabelsPage, |
| 273 | ['GET']), |
| 274 | ( |
| 275 | '/<string:project_name>/adminLabels.do', |
| 276 | issueadmin.AdminLabels(services=service).PostAdminLabelsPage, |
| 277 | ['POST']), |
| 278 | ( |
| 279 | '/<string:project_name>/adminRules', |
| 280 | issueadmin.AdminRules(services=service).GetAdminRulesPage, ['GET']), |
| 281 | ( |
| 282 | '/<string:project_name>/adminRules.do', |
| 283 | issueadmin.AdminRules(services=service).PostAdminRulesPage, |
| 284 | ['POST']), |
| 285 | ( |
| 286 | '/<string:project_name>/adminStatuses', |
| 287 | issueadmin.AdminStatuses(services=service).GetAdminStatusesPage, |
| 288 | ['GET']), |
| 289 | ( |
| 290 | '/<string:project_name>/adminStatuses.do', |
| 291 | issueadmin.AdminStatuses(services=service).PostAdminStatusesPage, |
| 292 | ['POST']), |
| 293 | ( |
| 294 | '/<string:project_name>/adminTemplates', |
| 295 | issueadmin.AdminTemplates(services=service).GetAdminTemplatesPage, |
| 296 | ['GET']), |
| 297 | ( |
| 298 | '/<string:project_name>/adminTemplates.do', |
| 299 | issueadmin.AdminTemplates(services=service).PostAdminTemplatesPage, |
| 300 | ['POST']), |
| 301 | ( |
| 302 | '/<string:project_name>/adminViews', |
| 303 | issueadmin.AdminViews(services=service).GetAdminViewsPage, ['GET']), |
| 304 | ( |
| 305 | '/<string:project_name>/adminViews.do', |
| 306 | issueadmin.AdminViews(services=service).PostAdminViewsPage, |
| 307 | ['POST']), |
| 308 | ( |
| 309 | '/<string:project_name>/admin', |
| 310 | projectadmin.ProjectAdmin(services=service).GetProjectAdminPage, |
| 311 | ['GET']), |
| 312 | ( |
| 313 | '/<string:project_name>/admin.do', |
| 314 | projectadmin.ProjectAdmin(services=service).PostProjectAdminPage, |
| 315 | ['POST']), |
| 316 | ( |
| 317 | '/<string:project_name>/adminAdvanced', |
| 318 | projectadminadvanced.ProjectAdminAdvanced( |
| 319 | services=service).GetProjectAdminAdvancedPage, ['GET']), |
| 320 | ( |
| 321 | '/<string:project_name>/adminAdvanced.do', |
| 322 | projectadminadvanced.ProjectAdminAdvanced( |
| 323 | services=service).PostProjectAdminAdvancedPage, ['POST']), |
| 324 | ( |
| 325 | '/<string:project_name>/components/create', |
| 326 | componentcreate.ComponentCreate( |
| 327 | services=service).GetComponentCreatePage, ['GET']), |
| 328 | ( |
| 329 | '/<string:project_name>/components/create.do', |
| 330 | componentcreate.ComponentCreate( |
| 331 | services=service).PostComponentCreatePage, ['POST']), |
| 332 | ( |
| 333 | '/<string:project_name>/components/detail', |
| 334 | componentdetail.ComponentDetail( |
| 335 | services=service).GetComponentDetailPage, ['GET']), |
| 336 | ( |
| 337 | '/<string:project_name>/components/detail.do', |
| 338 | componentdetail.ComponentDetail( |
| 339 | services=service).PostComponentDetailPage, ['POST']), |
| 340 | ( |
| 341 | '/<string:project_name>/fields/create', |
| 342 | fieldcreate.FieldCreate(services=service).GetFieldCreate, ['GET']), |
| 343 | ( |
| 344 | '/<string:project_name>/fields/create.do', |
| 345 | fieldcreate.FieldCreate(services=service).PostFieldCreate, ['POST' |
| 346 | ]), |
| 347 | ( |
| 348 | '/<string:project_name>/fields/detail', |
| 349 | fielddetail.FieldDetail(services=service).GetFieldDetail, ['GET']), |
| 350 | ( |
| 351 | '/<string:project_name>/fields/detail.do', |
| 352 | fielddetail.FieldDetail(services=service).PostFieldDetail, ['POST' |
| 353 | ]), |
| 354 | ( |
| 355 | '/<string:project_name>/issues/advsearch', |
| 356 | issueadvsearch.IssueAdvancedSearch( |
| 357 | services=service).GetIssueAdvSearchPage, ['GET']), |
| 358 | ( |
| 359 | '/<string:project_name>/issues/advsearch.do', |
| 360 | issueadvsearch.IssueAdvancedSearch( |
| 361 | services=service).PostIssueAdvSearchPage, ['POST']), |
| 362 | ( |
| 363 | '/<string:project_name>/issues/detail', |
| 364 | webcomponentspage.WebComponentsPage( |
| 365 | services=service).GetWebComponentsIssueDetail, ['GET']), |
| 366 | ( |
| 367 | '/<string:project_name>/issues/export', |
| 368 | issueexport.IssueExport(services=service).GetIssueExport, ['GET']), |
| 369 | ( |
| 370 | '/<string:project_name>/issues/export/json', |
| 371 | issueexport.IssueExportJSON(services=service).GetIssueExportJSON, |
| 372 | ['GET']), |
| 373 | ( |
| 374 | '/<string:project_name>/issues/export/json.do', |
| 375 | issueexport.IssueExportJSON(services=service).PostIssueExportJSON, |
| 376 | ['POST']), |
| 377 | ( |
| 378 | '/<string:project_name>/issues/import', |
| 379 | issueimport.IssueImport(services=service).GetIssueImport, ['GET']), |
| 380 | ( |
| 381 | '/<string:project_name>/issues/import.do', |
| 382 | issueimport.IssueImport(services=service).PostIssueImport, ['POST' |
| 383 | ]), |
| 384 | ( |
| 385 | '/<string:project_name>/issues/original', |
| 386 | issueoriginal.IssueOriginal(services=service).GetIssueOriginal, |
| 387 | ['GET']), |
| 388 | ( |
| 389 | '/<string:project_name>/issues/entry', |
| 390 | issueentry.IssueEntry(services=service).GetIssueEntry, ['GET']), |
| 391 | ( |
| 392 | '/<string:project_name>/issues/entry.do', |
| 393 | issueentry.IssueEntry(services=service).PostIssueEntry, ['POST']), |
| 394 | ( |
| 395 | '/<string:project_name>/issues/entry_new', |
| 396 | webcomponentspage.WebComponentsPage( |
| 397 | services=service).GetWebComponentsIssueNewEntry, ['GET']), |
| 398 | ( |
| 399 | '/<string:project_name>/issues/list', |
| 400 | webcomponentspage.WebComponentsPage( |
| 401 | services=service).GetWebComponentsIssueList, ['GET']), |
| 402 | ( |
| 403 | '/<string:project_name>/issues/reindex', |
| 404 | issuereindex.IssueReindex(services=service).GetIssueReindex, |
| 405 | ['GET']), |
| 406 | ( |
| 407 | '/<string:project_name>/issues/reindex.do', |
| 408 | issuereindex.IssueReindex(services=service).PostIssueReindex, |
| 409 | ['POST']), |
| 410 | ( |
| 411 | '/<string:project_name>/issues/detail/list', |
| 412 | issuedetailezt.FlipperList(services=service).GetFlipperList, |
| 413 | ['GET']), |
| 414 | ( |
| 415 | '/<string:project_name>/issues/detail/flipper', |
| 416 | issuedetailezt.FlipperIndex(services=service).GetFlipperIndex, |
| 417 | ['GET']), |
| 418 | ( |
| 419 | '/<string:project_name>/issues/detail/flipper.do', |
| 420 | issuedetailezt.FlipperIndex(services=service).PostFlipperIndex, |
| 421 | ['POST']), |
| 422 | ( |
| 423 | '/<string:project_name>/issues/wizard', |
| 424 | webcomponentspage.WebComponentsPage( |
| 425 | services=service).GetWebComponentsIssueWizard, ['GET']), |
| 426 | ( |
| 427 | '/<string:project_name>/templates/create', |
| 428 | templatecreate.TemplateCreate(services=service).GetTemplateCreate, |
| 429 | ['GET']), |
| 430 | ( |
| 431 | '/<string:project_name>/templates/create.do', |
| 432 | templatecreate.TemplateCreate(services=service).PostTemplateCreate, |
| 433 | ['POST']), |
| 434 | ( |
| 435 | '/<string:project_name>/templates/detail', |
| 436 | templatedetail.TemplateDetail(services=service).GetTemplateDetail, |
| 437 | ['GET']), |
| 438 | ( |
| 439 | '/<string:project_name>/templates/detail.do', |
| 440 | templatedetail.TemplateDetail(services=service).PostTemplateDetail, |
| 441 | ['POST']), |
| 442 | ( |
| 443 | '/<string:project_name>/people/list', |
| 444 | peoplelist.PeopleList(services=service).GetPeopleListPage, ['GET']), |
| 445 | ( |
| 446 | '/<string:project_name>/people/list.do', |
| 447 | peoplelist.PeopleList(services=service).PostPeopleListPage, |
| 448 | ['POST']), |
| 449 | ( |
| 450 | '/<string:project_name>/people/detail', |
| 451 | peopledetail.PeopleDetail(services=service).GetPeopleDetailPage, |
| 452 | ['GET']), |
| 453 | ( |
| 454 | '/<string:project_name>/people/detail.do', |
| 455 | peopledetail.PeopleDetail(services=service).PostPeopleDetailPage, |
| 456 | ['POST']), |
| 457 | ( |
| 458 | '/<string:project_name>/projectExport', |
| 459 | projectexport.ProjectExport(services=service).GetProjectExportPage, |
| 460 | ['GET']), |
| 461 | ( |
| 462 | '/<string:project_name>/projectExport/json', |
| 463 | projectexport.ProjectExportJSON( |
| 464 | services=service).GetProjectExportJSONPage, ['GET']), |
| 465 | ( |
| 466 | '/<string:project_name>/projectExport/json.do', |
| 467 | projectexport.ProjectExportJSON( |
| 468 | services=service).PostProjectExportJSONPage, ['POST']), |
| 469 | ( |
| 470 | '/<string:project_name>/updates/list', |
| 471 | projectupdates.ProjectUpdates( |
| 472 | services=service).GetProjectUpdatesPage, ['GET']), |
| 473 | ( |
| 474 | '/<string:project_name>/w/list', |
| 475 | redirects.WikiRedirect(services=service).GetWikiListRedirect, |
| 476 | ['GET']), |
| 477 | ( |
| 478 | '/<string:project_name>/wiki/<string:wiki_page>', |
| 479 | redirects.WikiRedirect(services=service).GetWikiRedirect, ['GET']), |
| 480 | ( |
| 481 | '/<string:project_name>/source/<string:source_page>', |
| 482 | redirects.SourceRedirect(services=service).GetSourceRedirect, |
| 483 | ['GET']), |
| 484 | ( |
| 485 | '/<string:project_name>/issues/entryafterlogin', |
| 486 | issueentryafterlogin.IssueEntryAfterLogin( |
| 487 | services=service).GetIssueEntryAfterLogin, |
| 488 | ['GET'], |
| 489 | ), |
| 490 | ( |
| 491 | '/<string:project_name>/issues/searchtips', |
| 492 | issuetips.IssueSearchTips(services=service).GetIssueSearchTips, |
| 493 | ['GET'], |
| 494 | ), |
| 495 | ( |
| 496 | '/<string:project_name>/issues/attachment', |
| 497 | issueattachment.AttachmentPage(services=service).GetAttachmentPage, |
| 498 | ['GET'], |
| 499 | ), |
| 500 | ( |
| 501 | '/<string:project_name>/issues/attachmentText', |
| 502 | issueattachmenttext.AttachmentText( |
| 503 | services=service).GetAttachmentText, |
| 504 | ['GET'], |
| 505 | ), |
| 506 | ( |
| 507 | '/<string:project_name>/issues/bulkedit', |
| 508 | issuebulkedit.IssueBulkEdit(services=service).GetIssueBulkEdit, |
| 509 | ['GET']), |
| 510 | ( |
| 511 | '/<string:project_name>/issues/bulkedit.do', |
| 512 | issuebulkedit.IssueBulkEdit(services=service).PostIssueBulkEdit, |
| 513 | ['POST']), |
| 514 | ( |
| 515 | '/<string:project_name>/issues/detail/next', |
| 516 | issuedetailezt.FlipperNext( |
| 517 | services=service).GetFlipperNextRedirectPage, ['GET']), |
| 518 | ( |
| 519 | '/<string:project_name>/issues/detail/previous', |
| 520 | issuedetailezt.FlipperPrev( |
| 521 | services=service).GetFlipperPrevRedirectPage, ['GET']), |
| 522 | ] |
| 523 | self._AppendUrlToRoutes(_PROJECT_URLS, '/p') |
| 524 | |
| 525 | # pylint: disable=unused-variable |
| 526 | @flaskapp_project.route('/p/<string:project_name>/issues/approval') |
| 527 | @flaskapp_project.route('/p/<string:project_name>/issues/detail_ezt') |
| 528 | def ProjectRedirectToIssueDetail(project_name): |
| 529 | host_url = flask.request.host_url |
| 530 | url = host_url + 'p/' + project_name + '/issues/detail' |
| 531 | query_string = flask.request.query_string |
| 532 | if query_string: |
| 533 | url = '%s?%s' % (url, query_string) |
| 534 | return flask.redirect(url) |
| 535 | |
| 536 | # pylint: disable=unused-variable |
| 537 | @flaskapp_project.route('/p/<string:project_name>/issues/list_new') |
| 538 | @flaskapp_project.route('/p/<string:project_name>/') |
| 539 | @flaskapp_project.route('/p/<string:project_name>/issues/') |
| 540 | def ProjectRedirectToIssueList(project_name): |
| 541 | host_url = flask.request.host_url |
| 542 | url = host_url + 'p/' + project_name + '/issues/list' |
| 543 | query_string = urllib.parse.urlencode(flask.request.args) |
| 544 | if query_string: |
| 545 | url = '%s?%s' % (url, query_string) |
| 546 | return flask.redirect(url) |
| 547 | |
| 548 | # pylint: disable=unused-variable |
| 549 | @flaskapp_project.route('/p/') |
| 550 | def ProjectRedirectToMainPage(): |
| 551 | url = flask.request.host_url |
| 552 | return flask.redirect(url) |
| 553 | |
| 554 | # pylint: disable=unused-variable |
| 555 | @flaskapp_project.route('/p/<string:project_name>/people/') |
| 556 | def ProjectRedirectToPeopleList(project_name): |
| 557 | host_url = flask.request.host_url |
| 558 | url = host_url + 'p/' + project_name + '/people/list' |
| 559 | return flask.redirect(url) |
| 560 | |
| 561 | def _RegisterUserUrls(self, service): |
| 562 | |
| 563 | def UserRedirectToMainPage(): |
| 564 | url = flask.request.host_url |
| 565 | return flask.redirect(url) |
| 566 | |
| 567 | _USER_URLS = [ |
| 568 | ( |
| 569 | '/', |
| 570 | UserRedirectToMainPage, |
| 571 | ['GET'], |
| 572 | ), |
| 573 | ( |
| 574 | '/<string:viewed_username>/queries', |
| 575 | savedqueries.SavedQueries(services=service).GetSavedQueriesPage, |
| 576 | ['GET']), |
| 577 | ( |
| 578 | '/<string:viewed_username>/queries.do', |
| 579 | savedqueries.SavedQueries(services=service).PostSavedQueriesPage, |
| 580 | ['Post']), |
| 581 | ( |
| 582 | '/<string:viewed_username>/hotlists', |
| 583 | userhotlists.UserHotlists(services=service).GetUserHotlistsPage, |
| 584 | ['GET']), |
| 585 | ( |
| 586 | '/<string:viewed_username>/hotlists.do', |
| 587 | userhotlists.UserHotlists(services=service).PostUserHotlistsPage, |
| 588 | ['Post']), |
| 589 | ( |
| 590 | '/<string:viewed_username>/', |
| 591 | userprofile.UserProfile(services=service).GetUserProfilePage, |
| 592 | ['GET']), |
| 593 | ( |
| 594 | '/<string:viewed_username>/edit.do', |
| 595 | userprofile.UserProfile(services=service).PostUserProfilePage, |
| 596 | ['POST']), |
| 597 | ( |
| 598 | '/<string:viewed_username>/ban.do', |
| 599 | userprofile.BanUser(services=service).PostBanUserPage, ['POST']), |
| 600 | ( |
| 601 | '/<string:viewed_username>/banSpammer.do', |
| 602 | banspammer.BanSpammer(services=service).PostBanSpammerPage, |
| 603 | ['POST']), |
| 604 | ( |
| 605 | '/<string:viewed_username>/clearBouncing', |
| 606 | userclearbouncing.UserClearBouncing( |
| 607 | services=service).GetUserClearBouncingPage, ['GET']), |
| 608 | ( |
| 609 | '/<string:viewed_username>/clearBouncing.do', |
| 610 | userclearbouncing.UserClearBouncing( |
| 611 | services=service).PostUserClearBouncingPage, ['Post']), |
| 612 | ( |
| 613 | '/<string:viewed_username>/updates/projects', |
| 614 | userupdates.UserUpdatesProjects( |
| 615 | services=service).GetUserUpdatesProjectsPage, ['GET']), |
| 616 | ( |
| 617 | '/<string:viewed_username>/updates/developers', |
| 618 | userupdates.UserUpdatesDevelopers( |
| 619 | services=service).GetUserUpdatesDevelopersPage, ['GET']), |
| 620 | ( |
| 621 | '/<string:viewed_username>/updates', |
| 622 | userupdates.UserUpdatesIndividual( |
| 623 | services=service).GetUserUpdatesPage, ['GET']), |
| 624 | ( |
| 625 | '/<string:viewed_username>/hotlists/<string:hotlist_id>', |
| 626 | hotlistissues.HotlistIssues(services=service).GetHotlistIssuesPage, |
| 627 | ['GET']), |
| 628 | ( |
| 629 | '/<string:viewed_username>/hotlists/<string:hotlist_id>.do', |
| 630 | hotlistissues.HotlistIssues(services=service).PostHotlistIssuesPage, |
| 631 | ['POST']), |
| 632 | ( |
| 633 | '/<string:viewed_username>/hotlists/<string:hotlist_id>/csv', |
| 634 | hotlistissuescsv.HotlistIssuesCsv( |
| 635 | services=service).GetHotlistIssuesCsvPage, ['GET']), |
| 636 | ( |
| 637 | '/<string:viewed_username>/hotlists/<string:hotlist_id>/people', |
| 638 | hotlistpeople.HotlistPeopleList( |
| 639 | services=service).GetHotlistPeoplePage, ['GET']), |
| 640 | ( |
| 641 | '/<string:viewed_username>/hotlists/<string:hotlist_id>/people.do', |
| 642 | hotlistpeople.HotlistPeopleList( |
| 643 | services=service).PostHotlistPeoplePage, ['POST']), |
| 644 | ( |
| 645 | '/<string:viewed_username>/hotlists/<string:hotlist_id>/details', |
| 646 | hotlistdetails.HotlistDetails( |
| 647 | services=service).GetHotlistDetailsPage, ['GET']), |
| 648 | ( |
| 649 | '/<string:viewed_username>/hotlists/<string:hotlist_id>/details.do', |
| 650 | hotlistdetails.HotlistDetails( |
| 651 | services=service).PostHotlistDetailsPage, ['POST']), |
| 652 | ( |
| 653 | '/<string:viewed_username>/hotlists/<string:hotlist_id>/rerank', |
| 654 | rerankhotlist.RerankHotlistIssue( |
| 655 | services=service).GetRerankHotlistIssuePage, ['GET']), |
| 656 | ( |
| 657 | '/<string:viewed_username>/hotlists/<string:hotlist_id>/rerank.do', |
| 658 | rerankhotlist.RerankHotlistIssue( |
| 659 | services=service).PostRerankHotlistIssuePage, ['POST']), |
| 660 | ] |
| 661 | |
| 662 | self._AppendUrlToRoutes(_USER_URLS, '/u') |
| 663 | |
| 664 | # pylint: disable=unused-argument |
| 665 | def _RegisterTaskUrl(self, service): |
| 666 | _TASK_URL = [ |
| 667 | ( |
| 668 | '/banSpammer.do', |
| 669 | banspammer.BanSpammerTask(services=service).PostBanSpammer, |
| 670 | ['POST']), |
| 671 | ( |
| 672 | '/sendWipeoutUserListsTask.do', |
| 673 | deleteusers.SendWipeoutUserListsTask( |
| 674 | services=service).PostSendWipeoutUserListsTask, ['POST']), |
| 675 | ( |
| 676 | '/deleteWipeoutUsersTask.do', |
| 677 | deleteusers.DeleteWipeoutUsersTask( |
| 678 | services=service).PostDeleteWipeoutUsersTask, ['POST']), |
| 679 | ( |
| 680 | '/deleteUsersTask.do', |
| 681 | deleteusers.DeleteUsersTask(services=service).PostDeleteUsersTask, |
| 682 | ['POST']), |
| 683 | ( |
| 684 | '/notifyRulesDeleted.do', |
| 685 | notify.NotifyRulesDeletedTask( |
| 686 | services=service).PostNotifyRulesDeletedTask, ['POST']), |
| 687 | ( |
| 688 | '/notifyIssueChange.do', |
| 689 | notify.NotifyIssueChangeTask( |
| 690 | services=service).PostNotifyIssueChangeTask, ['POST']), |
| 691 | ( |
| 692 | '/notifyBlockingChange.do', |
| 693 | notify.NotifyBlockingChangeTask( |
| 694 | services=service).PostNotifyBlockingChangeTask, ['POST']), |
| 695 | ( |
| 696 | '/notifyBulkEdit.do', notify.NotifyBulkChangeTask( |
| 697 | services=service).PostNotifyBulkChangeTask, ['POST']), |
| 698 | ( |
| 699 | '/notifyApprovalChange.do', |
| 700 | notify.NotifyApprovalChangeTask( |
| 701 | services=service).PostNotifyApprovalChangeTask, ['POST']), |
| 702 | ( |
| 703 | '/publishPubsubIssueChange.do', |
| 704 | pubsub.PublishPubsubIssueChangeTask( |
| 705 | services=service).PostPublishPubsubIssueChangeTask, ['POST']), |
| 706 | ( |
| 707 | '/issueDateAction.do', |
| 708 | dateaction.IssueDateActionTask( |
| 709 | services=service).PostIssueDateActionTask, ['POST']), |
| 710 | ( |
| 711 | '/fltConversionTask.do', |
| 712 | fltconversion.FLTConvertTask(services=service).PostFLTConvertTask, |
| 713 | ['POST']), |
| 714 | ( |
| 715 | '/outboundEmail.do', |
| 716 | notify.OutboundEmailTask(services=service).PostOutboundEmailTask, |
| 717 | ['POST']), |
| 718 | ( |
| 719 | '/recomputeDerivedFields.do', |
| 720 | filterrules.RecomputeDerivedFieldsTask( |
| 721 | services=service).PostRecomputeDerivedFieldsTask, ['POST']), |
| 722 | ] |
| 723 | self._AppendUrlToRoutes(_TASK_URL, '/_task') |
| 724 | |
| 725 | # pylint: disable=unused-argument |
| 726 | def _RegisterCronUrl(self, service): |
| 727 | _CRON_URL = [ |
| 728 | ( |
| 729 | '/wipeoutSync', |
| 730 | deleteusers.WipeoutSyncCron(services=service).GetWipeoutSyncCron, |
| 731 | ['GET']), |
| 732 | ( |
| 733 | '/reindexQueue', |
| 734 | filterrules.ReindexQueueCron(services=service).GetReindexQueueCron, |
| 735 | ['GET']), |
| 736 | ( |
| 737 | '/dateAction', |
| 738 | dateaction.DateActionCron(services=service).GetDateActionCron, |
| 739 | ['GET']), |
| 740 | ( |
| 741 | '/ramCacheConsolidate', |
| 742 | cachemanager_svc.RamCacheConsolidate( |
| 743 | services=service).GetRamCacheConsolidate, ['GET']), |
| 744 | ('/reap', reap.Reap(services=service).GetReap, ['GET']), |
| 745 | ( |
| 746 | '/loadApiClientConfigs', client_config_svc.GetLoadApiClientConfigs, |
| 747 | ['GET']), |
| 748 | ( |
| 749 | '/trimVisitedPages', |
| 750 | trimvisitedpages.TrimVisitedPages( |
| 751 | services=service).GetTrimVisitedPages, ['GET']), |
| 752 | ] |
| 753 | self._AppendUrlToRoutes(_CRON_URL, '/_cron') |
| 754 | |
| 755 | # pylint: disable=unused-argument |
| 756 | def _RegisterBackendUrl(self, service): |
| 757 | _BACKEND_URL = [ |
| 758 | ( |
| 759 | '/search', |
| 760 | backendsearch.BackendSearch(services=service).GetBackendSearch, |
| 761 | ['GET']), |
| 762 | ( |
| 763 | '/nonviewable', |
| 764 | backendnonviewable.BackendNonviewable( |
| 765 | services=service).GetBackendNonviewable, ['GET']), |
| 766 | ] |
| 767 | self._AppendUrlToRoutes(_BACKEND_URL, '/_backend') |
| 768 | |
| 769 | # pylint: disable=unused-argument |
| 770 | def _RegisterMONSetUrl(self, service): |
| 771 | _MON_URL = [ |
| 772 | ( |
| 773 | '/clientmon.do', |
| 774 | clientmon.ClientMonitor(services=service).PostClientMonitor, |
| 775 | ['POST']), |
| 776 | ( |
| 777 | '/jstsmon.do', |
| 778 | ts_mon_js.MonorailTSMonJSHandler( |
| 779 | services=service).PostMonorailTSMonJSHandler, |
| 780 | ['POST'], |
| 781 | ) |
| 782 | ] |
| 783 | self._AppendUrlToRoutes(_MON_URL, '/_') |
| 784 | |
| 785 | def _RegisterAHUrl(self, service): |
| 786 | _AH_URL = [ |
| 787 | ('/warmup', warmup.Warmup, ['GET']), ('/start', warmup.Start, ['GET']), |
| 788 | ('/stop', warmup.Stop, ['GET']), |
| 789 | ( |
| 790 | '/bounce', |
| 791 | inboundemail.BouncedEmail(services=service).postBouncedEmail, |
| 792 | ['POST']), |
| 793 | ( |
| 794 | '/mail/<string:project_addr>', |
| 795 | inboundemail.InboundEmail(services=service).HandleInboundEmail, |
| 796 | ['GET', 'POST']) |
| 797 | ] |
| 798 | self._AppendUrlToRoutes(_AH_URL, '/_ah') |
| 799 | |
| 800 | def _RegisterPrpcUrl(self, service): |
| 801 | prpc_server = prpc.FlaskServer( |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 802 | allowed_origins=client_config_svc.GetAllowedOriginsSet()) |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 803 | api_routes_v0.RegisterApiHandlers(prpc_server, service) |
| 804 | api_routes_v3.RegisterApiHandlers(prpc_server, service) |
| 805 | routes = prpc_server.get_routes() |
| 806 | self._AppendUrlToRoutes(routes, '') |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 807 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 808 | def _RegisterWebComponentsUrl(self, service): |
| 809 | self.routes.append( |
| 810 | [ |
| 811 | '/', |
| 812 | webcomponentspage.ProjectListPage( |
| 813 | services=service).GetProjectListPage, ['GET'] |
| 814 | ]) |
| 815 | self.routes.append( |
| 816 | [ |
| 817 | '/hotlists/<path:subpath>', |
| 818 | webcomponentspage.WebComponentsPage( |
| 819 | services=service).GetWebComponentsHotlist, ['GET'] |
| 820 | ]) |
| 821 | self.routes.append( |
| 822 | [ |
| 823 | '/users/<path:subpath>', |
| 824 | webcomponentspage.WebComponentsPage( |
| 825 | services=service).GetWebComponentsUser, ['GET'] |
| 826 | ]) |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 827 | |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 828 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 829 | def RegisterEndpointsUrls(app): |
| 830 | api_classes = [api_svc_v1.MonorailApi, api_svc_v1.ClientConfigApi] |
| 831 | routes = endpoints_flask.api_routes(api_classes, '/_ah/api') |
| 832 | for rule, endpoint, view_func, methods in routes: |
| 833 | app.add_url_rule( |
| 834 | rule, endpoint=endpoint, view_func=view_func, methods=methods) |
| 835 | app.view_functions['cors_handler'] = endpoints_flask.cors_handler |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 836 | |
Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 837 | |
Adrià Vilanova Martínez | f19ea43 | 2024-01-23 20:20:52 +0100 | [diff] [blame] | 838 | def RegisterTeardown(app): |
| 839 | app.teardown_request(teardown.Teardown) |