Merge branch 'main' into avm99963-monorail

Merged commit 34d8229ae2b51fb1a15bd208e6fe6185c94f6266

GitOrigin-RevId: 7ee0917f93a577e475f8e09526dd144d245593f4
diff --git a/project/peopledetail.py b/project/peopledetail.py
index af9cd49..b3b4bca 100644
--- a/project/peopledetail.py
+++ b/project/peopledetail.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """A class to display details about each project member."""
 from __future__ import print_function
@@ -14,7 +13,6 @@
 import ezt
 
 from framework import exceptions
-from framework import flaskservlet
 from framework import framework_bizobj
 from framework import framework_helpers
 from framework import framework_views
@@ -46,7 +44,7 @@
   """People detail page documents one partipant's involvement in a project."""
 
   _PAGE_TEMPLATE = 'project/people-detail-page.ezt'
-  _MAIN_TAB_MODE = flaskservlet.FlaskServlet.MAIN_TAB_PEOPLE
+  _MAIN_TAB_MODE = servlet.Servlet.MAIN_TAB_PEOPLE
 
   def AssertBasePermission(self, mr):
     """Check that the user is allowed to access this servlet."""
@@ -233,9 +231,7 @@
 
     role = post_data.get('role', '').lower()
     extra_perms = []
-    # TODO(crbug.com/monorail/10936): getall in Flask is getlist
-    # for ep in post_data.getlist('extra_perms'):
-    for ep in post_data.getall('extra_perms'):
+    for ep in post_data.getlist('extra_perms'):
       perm = framework_bizobj.CanonicalizeLabel(ep)
       # Perms with leading underscores are reserved.
       perm = perm.strip('_')
@@ -271,8 +267,8 @@
     self.services.project.UpdateProjectRoles(
         cnxn, project.project_id, owner_ids, committer_ids, contributor_ids)
 
-  # def GetPeopleDetailPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetPeopleDetailPage(self, **kwargs):
+    return self.handler(**kwargs)
 
-  # def PostPeopleDetailPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def PostPeopleDetailPage(self, **kwargs):
+    return self.handler(**kwargs)
diff --git a/project/peoplelist.py b/project/peoplelist.py
index f2aff1a..f888208 100644
--- a/project/peoplelist.py
+++ b/project/peoplelist.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """A class to display a paginated list of project members.
 
@@ -19,7 +18,6 @@
 import ezt
 
 from businesslogic import work_env
-from framework import flaskservlet
 from framework import framework_bizobj
 from framework import framework_constants
 from framework import framework_helpers
@@ -35,10 +33,10 @@
 
 
 class PeopleList(servlet.Servlet):
-  """People list page shows a paginatied list of project members."""
+  """People list page shows a paginated list of project members."""
 
   _PAGE_TEMPLATE = 'project/people-list-page.ezt'
-  _MAIN_TAB_MODE = flaskservlet.FlaskServlet.MAIN_TAB_PEOPLE
+  _MAIN_TAB_MODE = servlet.Servlet.MAIN_TAB_PEOPLE
 
   def AssertBasePermission(self, mr):
     super(PeopleList, self).AssertBasePermission(mr)
@@ -93,8 +91,8 @@
         mr.GetPositiveIntParam('start'), mr.project_name, urls.PEOPLE_LIST,
         url_params=url_params)
 
-    offer_membership_editing = mr.perms.HasPerm(
-        permissions.EDIT_PROJECT, mr.auth.user_id, mr.project)
+    offer_membership_editing = permissions.CanEditProjectConfig(
+        mr, self.services)
 
     check_abandonment = permissions.ShouldCheckForAbandonment(mr)
 
@@ -154,8 +152,7 @@
 
   def ProcessFormData(self, mr, post_data):
     """Process the posted form."""
-    permit_edit = mr.perms.HasPerm(
-        permissions.EDIT_PROJECT, mr.auth.user_id, mr.project)
+    permit_edit = permissions.CanEditProjectConfig(mr, self.services)
     if not permit_edit:
       raise permissions.PermissionException(
           'User is not permitted to edit project membership')
@@ -217,9 +214,7 @@
       String URL to redirect the user to after processing.
     """
     # 1. Parse and validate user input.
-    remove_strs = post_data.getall('remove')
-    # TODO(crbug.com/monorail/10936): getall in Flask is getlist
-    # remove_strs = post_data.getlist('remove')
+    remove_strs = post_data.getlist('remove')
     logging.info('remove_strs = %r', remove_strs)
     remove_ids = set(
         self.services.user.LookupUserIDs(mr.cnxn, remove_strs).values())
@@ -236,8 +231,8 @@
     return framework_helpers.FormatAbsoluteURL(
         mr, urls.PEOPLE_LIST, saved=1, ts=int(time.time()))
 
-  # def GetPeopleListPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetPeopleListPage(self, **kwargs):
+    return self.handler(**kwargs)
 
-  # def PostPeopleListPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def PostPeopleListPage(self, **kwargs):
+    return self.handler(**kwargs)
diff --git a/project/project_constants.py b/project/project_constants.py
index f483b1f..4be3348 100644
--- a/project/project_constants.py
+++ b/project/project_constants.py
@@ -1,7 +1,6 @@
-# Copyright 2020 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
+# Copyright 2020 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Some constants used for managing Monorail Projects."""
 from __future__ import print_function
diff --git a/project/project_helpers.py b/project/project_helpers.py
index 23a2d46..3d02a2b 100644
--- a/project/project_helpers.py
+++ b/project/project_helpers.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Helper functions and classes used by the project pages."""
 from __future__ import print_function
@@ -20,7 +19,7 @@
 from framework import permissions
 from project import project_constants
 from project import project_views
-from proto import project_pb2
+from mrproto import project_pb2
 
 
 _RE_EMAIL_SEPARATORS = re.compile(r'\s|,|;')
@@ -231,6 +230,6 @@
 
 
 def AllProjectMembers(project):
-  # type: (proto.project_pb2.Project) -> Sequence[int]
+  # type: (mrproto.project_pb2.Project) -> Sequence[int]
   """Return a list of user IDs of all members in the given project."""
   return project.owner_ids + project.committer_ids + project.contributor_ids
diff --git a/project/project_views.py b/project/project_views.py
index e8698eb..eefea59 100644
--- a/project/project_views.py
+++ b/project/project_views.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """View objects to help display projects in EZT."""
 from __future__ import print_function
@@ -19,7 +18,7 @@
 from framework import template_helpers
 from framework import timestr
 from framework import urls
-from proto import project_pb2
+from mrproto import project_pb2
 
 
 class ProjectAccessView(object):
diff --git a/project/projectadmin.py b/project/projectadmin.py
index a6e0d3e..042b198 100644
--- a/project/projectadmin.py
+++ b/project/projectadmin.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Servlets for project administration main subtab."""
 from __future__ import print_function
@@ -16,7 +15,6 @@
 
 from businesslogic import work_env
 from framework import emailfmt
-from framework import flaskservlet
 from framework import framework_helpers
 from framework import gcs_helpers
 from framework import permissions
@@ -37,7 +35,7 @@
   """A page with project configuration options for the Project Owner(s)."""
 
   _PAGE_TEMPLATE = 'project/project-admin-page.ezt'
-  _MAIN_TAB_MODE = flaskservlet.FlaskServlet.MAIN_TAB_ADMIN
+  _MAIN_TAB_MODE = servlet.Servlet.MAIN_TAB_ADMIN
 
   def AssertBasePermission(self, mr):
     super(ProjectAdmin, self).AssertBasePermission(mr)
@@ -122,14 +120,14 @@
 
     logo_gcs_id = ''
     logo_file_name = ''
-    if 'logo' in post_data and not isinstance(post_data['logo'], string_types):
+    if 'logo' in post_data and post_data['logo'].filename != '':
       item = post_data['logo']
       logo_file_name = item.filename
       try:
         logo_gcs_id = gcs_helpers.StoreLogoInGCS(
-            logo_file_name, item.value, mr.project.project_id)
-      except gcs_helpers.UnsupportedMimeType, e:
-        mr.errors.logo = e.message
+            logo_file_name, item.read(), mr.project.project_id)
+      except gcs_helpers.UnsupportedMimeType as e:
+        mr.errors.logo = str(e)
     elif mr.project.logo_gcs_id and mr.project.logo_file_name:
       logo_gcs_id = mr.project.logo_gcs_id
       logo_file_name = mr.project.logo_file_name
@@ -189,8 +187,8 @@
 
     return summary, description
 
-  # def GetProjectAdminPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetProjectAdminPage(self, **kwargs):
+    return self.handler(**kwargs)
 
-  # def PostProjectAdminPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def PostProjectAdminPage(self, **kwargs):
+    return self.handler(**kwargs)
diff --git a/project/projectadminadvanced.py b/project/projectadminadvanced.py
index eafe912..dff718a 100644
--- a/project/projectadminadvanced.py
+++ b/project/projectadminadvanced.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Page and form handlers for project administration "advanced" subtab.
 
@@ -22,14 +21,13 @@
 import ezt
 
 from businesslogic import work_env
-from framework import flaskservlet
 from framework import framework_constants
 from framework import framework_helpers
 from framework import permissions
 from framework import servlet
 from framework import template_helpers
 from framework import urls
-from proto import project_pb2
+from mrproto import project_pb2
 from tracker import tracker_constants
 
 
@@ -37,7 +35,7 @@
   """A page with project state options for the Project Owner(s)."""
 
   _PAGE_TEMPLATE = 'project/project-admin-advanced-page.ezt'
-  _MAIN_TAB_MODE = flaskservlet.FlaskServlet.MAIN_TAB_ADMIN
+  _MAIN_TAB_MODE = servlet.Servlet.MAIN_TAB_ADMIN
 
   def AssertBasePermission(self, mr):
     """Make sure that the logged in user has permission to view this page.
@@ -212,8 +210,8 @@
         moved_to = post_data.get('moved_to', '')
         we.UpdateProject(mr.project.project_id, moved_to=moved_to)
 
-  # def GetProjectAdminAdvancedPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetProjectAdminAdvancedPage(self, **kwargs):
+    return self.handler(**kwargs)
 
-  # def PostProjectAdminAdvancedPage(self, **kwargs):
-  #   return self.handler(**kwargs)
\ No newline at end of file
+  def PostProjectAdminAdvancedPage(self, **kwargs):
+    return self.handler(**kwargs)
diff --git a/project/projectexport.py b/project/projectexport.py
index 177eea4..cc9353c 100644
--- a/project/projectexport.py
+++ b/project/projectexport.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Servlet to export a project's config in JSON format.
 """
@@ -9,24 +8,19 @@
 from __future__ import division
 from __future__ import absolute_import
 
-import logging
 import time
 
-import ezt
-
-from framework import flaskservlet
 from framework import permissions
 from framework import jsonfeed
 from framework import servlet
 from project import project_helpers
-from tracker import tracker_bizobj
 
 
 class ProjectExport(servlet.Servlet):
   """Only site admins can export a project"""
 
   _PAGE_TEMPLATE = 'project/project-export-page.ezt'
-  _MAIN_TAB_MODE = flaskservlet.FlaskServlet.MAIN_TAB_ADMIN
+  _MAIN_TAB_MODE = servlet.Servlet.MAIN_TAB_ADMIN
 
   def AssertBasePermission(self, mr):
     """Make sure that the logged in user has permission to view this page."""
@@ -43,11 +37,10 @@
         'page_perms': self.MakePagePerms(mr, None, permissions.CREATE_ISSUE),
     }
 
-  # def GetProjectExportPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetProjectExportPage(self, **kwargs):
+    return self.handler(**kwargs)
 
 
-# TODO(https://crbug.com/monorail/10936): Use FlaskJsonFeed
 class ProjectExportJSON(jsonfeed.JsonFeed):
   """ProjectExportJSON shows all configuration for a Project in JSON form."""
 
@@ -207,8 +200,8 @@
     }
     return component_json
 
-  # def GetProjectExportJSONPage(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetProjectExportJSONPage(self, **kwargs):
+    return self.handler(**kwargs)
 
-  # def PostProjectExportJSONPage(self, **kwargs):
-  #   return self.handler(**kwargs)
\ No newline at end of file
+  def PostProjectExportJSONPage(self, **kwargs):
+    return self.handler(**kwargs)
diff --git a/project/projectsummary.py b/project/projectsummary.py
index c0cad5a..316e1d5 100644
--- a/project/projectsummary.py
+++ b/project/projectsummary.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """A class to display the project summary page."""
 from __future__ import print_function
@@ -9,7 +8,6 @@
 from __future__ import absolute_import
 
 from businesslogic import work_env
-from framework import flaskservlet
 from framework import permissions
 from framework import servlet
 from project import project_helpers
@@ -20,7 +18,7 @@
   """Page to show brief project description and process documentation."""
 
   _PAGE_TEMPLATE = 'project/project-summary-page.ezt'
-  _MAIN_TAB_MODE = flaskservlet.FlaskServlet.MAIN_TAB_PROCESS
+  _MAIN_TAB_MODE = servlet.Servlet.MAIN_TAB_PROCESS
 
   def GatherPageData(self, mr):
     """Build up a dictionary of data values to use when rendering the page."""
@@ -70,5 +68,5 @@
 
     return help_data
 
-  # def GetProjectSummaryPage(self, **kwargs):
-  #   return self.handler(**kwargs)
\ No newline at end of file
+  def GetProjectSummaryPage(self, **kwargs):
+    return self.handler(**kwargs)
diff --git a/project/projectupdates.py b/project/projectupdates.py
index 304b435..7a0928a 100644
--- a/project/projectupdates.py
+++ b/project/projectupdates.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """A class to display a paginated list of activity stream updates."""
 from __future__ import print_function
@@ -10,10 +9,7 @@
 
 import logging
 
-import ezt
-
 from features import activities
-from framework import flaskservlet
 from framework import servlet
 from framework import urls
 
@@ -22,7 +18,7 @@
   """ProjectUpdates page shows a list of past activities."""
 
   _PAGE_TEMPLATE = 'project/project-updates-page.ezt'
-  _MAIN_TAB_MODE = flaskservlet.FlaskServlet.MAIN_TAB_UPDATES
+  _MAIN_TAB_MODE = servlet.Servlet.MAIN_TAB_UPDATES
 
   def GatherPageData(self, mr):
     """Build up a dictionary of data values to use when rendering the page."""
@@ -42,5 +38,5 @@
         ending='by_user', updates_page_url=url,
         autolink=self.services.autolink)
 
-  # def GetProjectUpdatesPage(self, **kwargs):
-  #   return self.handler(**kwargs)
\ No newline at end of file
+  def GetProjectUpdatesPage(self, **kwargs):
+    return self.handler(**kwargs)
diff --git a/project/redirects.py b/project/redirects.py
index 8c8b818..b49182a 100644
--- a/project/redirects.py
+++ b/project/redirects.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """A class to forward requests to configured urls.
 
@@ -15,7 +14,6 @@
 
 from six.moves import http_client
 
-from framework import flaskservlet
 from framework import framework_helpers
 from framework import servlet
 from framework import urls
@@ -24,47 +22,39 @@
 class WikiRedirect(servlet.Servlet):
   """Redirect to the wiki documentation, if provided."""
 
-  def get(self, **kwargs):
+  def get(self):
     """Construct a 302 pointing at project.docs_url, or at adminIntro."""
     if not self.mr.project:
-      # TODO(crbug.com/monorail/10936): status in Flask is status_code
-      # self.response.status_code = http_client.NOT_FOUND
-      self.response.status = http_client.NOT_FOUND
+      self.response.status_code = http_client.NOT_FOUND
       return
     docs_url = self.mr.project.docs_url
     if not docs_url:
       docs_url = framework_helpers.FormatAbsoluteURL(
           self.mr, urls.ADMIN_INTRO, include_project=True)
     self.response.location = docs_url
-    # TODO(crbug.com/monorail/10936): status in Flask is status_code
-    # self.response.status_code = http_client.MOVED_PERMANENTLY
-    self.response.status = http_client.MOVED_PERMANENTLY
+    self.response.status_code = http_client.MOVED_PERMANENTLY
 
-  # def GetWikiListRedirect(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetWikiListRedirect(self, **kwargs):
+    return self.handler(**kwargs)
 
-  # def GetWikiRedirect(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetWikiRedirect(self, **kwargs):
+    return self.handler(**kwargs)
 
 
 class SourceRedirect(servlet.Servlet):
   """Redirect to the source browser, if provided."""
 
-  def get(self, **kwargs):
+  def get(self):
     """Construct a 302 pointing at project.source_url, or at adminIntro."""
     if not self.mr.project:
-      # TODO(crbug.com/monorail/10936): status in Flask is status_code
-      # self.response.status_code = http_client.NOT_FOUND
-      self.response.status = http_client.NOT_FOUND
+      self.response.status_code = http_client.NOT_FOUND
       return
     source_url = self.mr.project.source_url
     if not source_url:
       source_url = framework_helpers.FormatAbsoluteURL(
           self.mr, urls.ADMIN_INTRO, include_project=True)
     self.response.location = source_url
-    # TODO(crbug.com/monorail/10936): status in Flask is status_code
-    # self.response.status_code = http_client.MOVED_PERMANENTLY
-    self.response.status = http_client.MOVED_PERMANENTLY
+    self.response.status_code = http_client.MOVED_PERMANENTLY
 
-  # def GetSourceRedirect(self, **kwargs):
-  #   return self.handler(**kwargs)
+  def GetSourceRedirect(self, **kwargs):
+    return self.handler(**kwargs)
diff --git a/project/test/peopledetail_test.py b/project/test/peopledetail_test.py
index 547df80..792ffb2 100644
--- a/project/test/peopledetail_test.py
+++ b/project/test/peopledetail_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittest for the people detail page."""
 from __future__ import print_function
@@ -12,13 +11,11 @@
 
 import unittest
 
-import webapp2
-
 from framework import authdata
 from framework import exceptions
 from framework import permissions
 from project import peopledetail
-from proto import project_pb2
+from mrproto import project_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -39,7 +36,7 @@
     self.project.owner_ids.extend([111, 222])
     self.project.committer_ids.extend([333, 444])
     self.project.contributor_ids.extend([555])
-    self.servlet = peopledetail.PeopleDetail('req', 'res', services=services)
+    self.servlet = peopledetail.PeopleDetail(services=services)
 
   def VerifyAccess(self, exception_expected):
     mr = testing_helpers.MakeMonorailRequest(
@@ -127,12 +124,12 @@
         333, self.servlet.ValidateMemberID('fake cnxn', 333, self.project))
 
     # 404 for user that does not exist
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet.ValidateMemberID('fake cnxn', 8933, self.project)
     self.assertEqual(404, cm.exception.code)
 
     # 404 for valid user that is not in this project
-    with self.assertRaises(webapp2.HTTPException) as cm:
+    with self.assertRaises(Exception) as cm:
       self.servlet.ValidateMemberID('fake cnxn', 999, self.project)
     self.assertEqual(404, cm.exception.code)
 
diff --git a/project/test/peoplelist_test.py b/project/test/peoplelist_test.py
index 6620df9..5459763 100644
--- a/project/test/peoplelist_test.py
+++ b/project/test/peoplelist_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittest for People List servlet."""
 from __future__ import print_function
@@ -13,7 +12,7 @@
 from framework import authdata
 from framework import permissions
 from project import peoplelist
-from proto import user_pb2
+from mrproto import user_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -35,7 +34,7 @@
     self.project.owner_ids.extend([111])
     self.project.committer_ids.extend([222])
     self.project.contributor_ids.extend([333])
-    self.servlet = peoplelist.PeopleList('req', 'res', services=services)
+    self.servlet = peoplelist.PeopleList(services=services)
 
   def VerifyAccess(self, exception_expected):
     mr = testing_helpers.MakeMonorailRequest(
diff --git a/project/test/project_helpers_test.py b/project/test/project_helpers_test.py
index 4732895..5252c77 100644
--- a/project/test/project_helpers_test.py
+++ b/project/test/project_helpers_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for helpers module."""
 from __future__ import print_function
@@ -16,7 +15,7 @@
 from framework import permissions
 from project import project_constants
 from project import project_helpers
-from proto import project_pb2
+from mrproto import project_pb2
 from services import service_manager
 from testing import fake
 
diff --git a/project/test/project_views_test.py b/project/test/project_views_test.py
index 940116e..a6b0ce5 100644
--- a/project/test/project_views_test.py
+++ b/project/test/project_views_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for project_views module."""
 from __future__ import print_function
@@ -12,7 +11,7 @@
 
 from framework import framework_views
 from project import project_views
-from proto import project_pb2
+from mrproto import project_pb2
 from services import service_manager
 from testing import fake
 
diff --git a/project/test/projectadmin_test.py b/project/test/projectadmin_test.py
index 0257cd0..0b2dc82 100644
--- a/project/test/projectadmin_test.py
+++ b/project/test/projectadmin_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for projectadmin module."""
 from __future__ import print_function
@@ -12,7 +11,7 @@
 
 from framework import permissions
 from project import projectadmin
-from proto import project_pb2
+from mrproto import project_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -25,7 +24,7 @@
     services = service_manager.Services(
         project=fake.ProjectService(),
         user=fake.UserService())
-    self.servlet = projectadmin.ProjectAdmin('req', 'res', services=services)
+    self.servlet = projectadmin.ProjectAdmin(services=services)
     self.project = services.project.TestAddProject(
         'proj', summary='a summary', description='a description')
     self.request, self.mr = testing_helpers.GetRequestObjects(
diff --git a/project/test/projectadminadvanced_test.py b/project/test/projectadminadvanced_test.py
index a654d98..bf1c5f1 100644
--- a/project/test/projectadminadvanced_test.py
+++ b/project/test/projectadminadvanced_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unit tests for projectadminadvanced module."""
 from __future__ import print_function
@@ -14,7 +13,7 @@
 
 from framework import permissions
 from project import projectadminadvanced
-from proto import project_pb2
+from mrproto import project_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -28,8 +27,7 @@
   def setUp(self):
     services = service_manager.Services(
         project=fake.ProjectService())
-    self.servlet = projectadminadvanced.ProjectAdminAdvanced(
-        'req', 'res', services=services)
+    self.servlet = projectadminadvanced.ProjectAdminAdvanced(services=services)
     self.project = services.project.TestAddProject('proj', owner_ids=[111])
     self.mr = testing_helpers.MakeMonorailRequest(
         project=self.project,
diff --git a/project/test/projectexport_test.py b/project/test/projectexport_test.py
index 6dbe990..d575f2a 100644
--- a/project/test/projectexport_test.py
+++ b/project/test/projectexport_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for the projectexport servlet."""
 from __future__ import print_function
@@ -14,7 +13,7 @@
 
 from framework import permissions
 from project import projectexport
-from proto import tracker_pb2
+from mrproto import tracker_pb2
 from services import service_manager
 from services.template_svc import TemplateService
 from testing import fake
@@ -25,8 +24,7 @@
 
   def setUp(self):
     self.services = service_manager.Services()
-    self.servlet = projectexport.ProjectExport(
-        'req', 'res', services=self.services)
+    self.servlet = projectexport.ProjectExport(services=self.services)
 
   def testAssertBasePermission(self):
     mr = testing_helpers.MakeMonorailRequest(
@@ -46,8 +44,7 @@
         user=fake.UserService(),
         template=Mock(spec=TemplateService))
     self.services.user.TestAddUser('user1@example.com', 111)
-    self.servlet = projectexport.ProjectExportJSON(
-        'req', 'res', services=self.services)
+    self.servlet = projectexport.ProjectExportJSON(services=self.services)
     self.project = fake.Project(project_id=789)
     self.mr = testing_helpers.MakeMonorailRequest(
         perms=permissions.OWNER_ACTIVE_PERMISSIONSET)
diff --git a/project/test/projectsummary_test.py b/project/test/projectsummary_test.py
index 32b2fde..6f6373b 100644
--- a/project/test/projectsummary_test.py
+++ b/project/test/projectsummary_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for Project Summary servlet."""
 from __future__ import print_function
@@ -12,8 +11,8 @@
 
 from framework import permissions
 from project import projectsummary
-from proto import project_pb2
-from proto import user_pb2
+from mrproto import project_pb2
+from mrproto import user_pb2
 from services import service_manager
 from testing import fake
 from testing import testing_helpers
@@ -30,8 +29,7 @@
     self.project = services.project.TestAddProject(
         'proj', project_id=123, summary='sum',
         description='desc')
-    self.servlet = projectsummary.ProjectSummary(
-        'req', 'res', services=services)
+    self.servlet = projectsummary.ProjectSummary(services=services)
 
   def testGatherPageData(self):
     mr = testing_helpers.MakeMonorailRequest(project=self.project)
diff --git a/project/test/projectupdates_test.py b/project/test/projectupdates_test.py
index e4c5cea..56cadce 100644
--- a/project/test/projectupdates_test.py
+++ b/project/test/projectupdates_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Unittests for monorail.project.projectupdates."""
 from __future__ import print_function
@@ -36,8 +35,7 @@
     self.mr = testing_helpers.MakeMonorailRequest(
         services=self.services, project=self.project)
     self.mr.project_name = self.project_name
-    self.project_updates = projectupdates.ProjectUpdates(
-        None, None, self.services)
+    self.project_updates = projectupdates.ProjectUpdates(self.services)
     self.mox = mox.Mox()
 
   def tearDown(self):
diff --git a/project/test/redirects_test.py b/project/test/redirects_test.py
index 0091571..1f71435 100644
--- a/project/test/redirects_test.py
+++ b/project/test/redirects_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 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
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for project handlers that redirect."""
 from __future__ import print_function
@@ -11,7 +10,7 @@
 from six.moves import http_client
 import unittest
 
-import webapp2
+import flask
 
 from framework import urls
 from project import redirects
@@ -24,9 +23,8 @@
 
   def setUp(self):
     self.services = service_manager.Services()
-    self.servlet = redirects.WikiRedirect(
-        webapp2.Request.blank('url'), webapp2.Response(),
-        services=self.services)
+    self.servlet = redirects.WikiRedirect(services=self.services)
+    self.servlet.response = flask.Response()
     self.project = fake.Project()
     self.servlet.mr = testing_helpers.MakeMonorailRequest(
         project=self.project)
@@ -58,9 +56,8 @@
 
   def setUp(self):
     self.services = service_manager.Services()
-    self.servlet = redirects.SourceRedirect(
-        webapp2.Request.blank('url'), webapp2.Response(),
-        services=self.services)
+    self.servlet = redirects.SourceRedirect(services=self.services)
+    self.servlet.response = flask.Response()
     self.project = fake.Project()
     self.servlet.mr = testing_helpers.MakeMonorailRequest(
         project=self.project)