Project import generated by Copybara.
GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/framework/monorailcontext.py b/framework/monorailcontext.py
new file mode 100644
index 0000000..76ecff4
--- /dev/null
+++ b/framework/monorailcontext.py
@@ -0,0 +1,76 @@
+# Copyright 2018 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
+
+"""Context object to hold utility objects used during request processing.
+"""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+
+import logging
+
+from framework import authdata
+from framework import permissions
+from framework import profiler
+from framework import sql
+from framework import template_helpers
+
+
+class MonorailContext(object):
+ """Context with objects used in request handling mechanics.
+
+ Attrributes:
+ cnxn: MonorailConnection to the SQL DB.
+ auth: AuthData object that identifies the account making the request.
+ perms: PermissionSet for requesting user, set by LookupLoggedInUserPerms().
+ profiler: Profiler object.
+ warnings: A list of warnings to present to the user.
+ errors: A list of errors to present to the user.
+
+ Unlike MonorailRequest, this object does not parse any part of the request,
+ retrieve any business objects (other than the User PB for the requesting
+ user), or check any permissions.
+ """
+
+ def __init__(
+ self, services, cnxn=None, requester=None, auth=None, perms=None,
+ autocreate=True):
+ """Construct a MonorailContext.
+
+ Args:
+ services: Connection to backends.
+ cnxn: Optional connection to SQL database.
+ requester: String email address of user making the request or None.
+ auth: AuthData object used during testing.
+ perms: PermissionSet used during testing.
+ autocreate: Set to False to require that a row in the User table already
+ exists for this user, otherwise raise NoSuchUserException.
+ """
+ self.cnxn = cnxn or sql.MonorailConnection()
+ self.auth = auth or authdata.AuthData.FromEmail(
+ self.cnxn, requester, services, autocreate=autocreate)
+ self.perms = perms # Usually None until LookupLoggedInUserPerms() called.
+ self.profiler = profiler.Profiler()
+
+ # TODO(jrobbins): make self.errors not be UI-centric.
+ self.warnings = []
+ self.errors = template_helpers.EZTError()
+
+ def LookupLoggedInUserPerms(self, project):
+ """Look up perms for user making a request in project (can be None)."""
+ with self.profiler.Phase('looking up signed in user permissions'):
+ self.perms = permissions.GetPermissions(
+ self.auth.user_pb, self.auth.effective_ids, project)
+
+ def CleanUp(self):
+ """Close the DB cnxn and any other clean up."""
+ if self.cnxn:
+ self.cnxn.Close()
+ self.cnxn = None
+
+ def __repr__(self):
+ """Return a string more useful for debugging."""
+ return '%s(cnxn=%r, auth=%r, perms=%r)' % (
+ self.__class__.__name__, self.cnxn, self.auth, self.perms)