thirdparty/google_appengine/google/appengine/api/users.py
changeset 109 620f9b141567
child 1278 a7766286a7be
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thirdparty/google_appengine/google/appengine/api/users.py	Tue Aug 26 21:49:54 2008 +0000
@@ -0,0 +1,203 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+"""Python datastore class User to be used as a datastore data type.
+
+Classes defined here:
+  User: object representing a user.
+  Error: base exception type
+  BadRequestError: UserService exception
+  UserNotFoundError: UserService exception
+  BackendError: UserService exception
+"""
+
+
+
+
+
+
+import os
+from google.appengine.api import apiproxy_stub_map
+from google.appengine.api import user_service_pb
+from google.appengine.api import api_base_pb
+from google.appengine.runtime import apiproxy_errors
+
+
+class Error(Exception):
+  """Base User error type."""
+
+
+class UserNotFoundError(Error):
+  """Raised by User.__init__() when there's no email argument and no user is
+  logged in."""
+
+
+class RedirectTooLongError(Error):
+  """Raised by UserService calls if the generated redirect URL was too long.
+  """
+
+
+class User(object):
+  """A user.
+
+  We provide here the email address, nickname, and auth domain for a user.
+
+  A nickname is a human-readable string which uniquely identifies a Google
+  user, akin to a username. It will be an email address for some users, but
+  not all.
+  """
+
+
+  def __init__(self, email=None, _auth_domain=None):
+    """Constructor.
+
+    Args:
+      # email is optional. it defaults to the current user.
+      email: string
+    """
+    if _auth_domain is None:
+      _auth_domain = os.environ.get('AUTH_DOMAIN')
+    else:
+      assert email is not None
+
+    assert _auth_domain
+
+    if email is None:
+      assert 'USER_EMAIL' in os.environ
+      email = os.environ['USER_EMAIL']
+
+    if not email:
+      raise UserNotFoundError
+
+    self.__email = email
+    self.__auth_domain = _auth_domain
+
+  def nickname(self):
+    """Return this user's nickname.
+
+    The nickname will be a unique, human readable identifier for this user
+    with respect to this application. It will be an email address for some
+    users, but not all.
+    """
+    if (self.__email and self.__auth_domain and
+        self.__email.endswith('@' + self.__auth_domain)):
+      suffix_len = len(self.__auth_domain) + 1
+      return self.__email[:-suffix_len]
+    else:
+      return self.__email
+
+  def email(self):
+    """Return this user's email address."""
+    return self.__email
+
+  def auth_domain(self):
+    """Return this user's auth domain."""
+    return self.__auth_domain
+
+  def __unicode__(self):
+    return unicode(self.nickname())
+
+  def __str__(self):
+    return str(self.nickname())
+
+  def __repr__(self):
+    return "users.User(email='%s')" % self.email()
+
+  def __hash__(self):
+    return hash((self.__email, self.__auth_domain))
+
+  def __cmp__(self, other):
+    if not isinstance(other, User):
+      return NotImplemented
+    return cmp((self.__email, self.__auth_domain),
+               (other.__email, other.__auth_domain))
+
+
+def create_login_url(dest_url):
+  """Computes the login URL for this request and specified destination URL.
+
+  Args:
+    dest_url: String that is the desired final destination URL for the user
+              once login is complete. If 'dest_url' does not have a host
+              specified, we will use the host from the current request.
+
+  Returns:
+    string
+  """
+  req = user_service_pb.StringProto()
+  resp = user_service_pb.StringProto()
+  req.set_value(dest_url)
+  try:
+    apiproxy_stub_map.MakeSyncCall('user', 'CreateLoginURL', req, resp)
+  except apiproxy_errors.ApplicationError, e:
+    if (e.application_error ==
+        user_service_pb.UserServiceError.REDIRECT_URL_TOO_LONG):
+      raise RedirectTooLongError
+    else:
+      raise e
+  return resp.value()
+
+CreateLoginURL = create_login_url
+
+
+def create_logout_url(dest_url):
+  """Computes the logout URL for this request and specified destination URL.
+
+  Args:
+    dest_url: String that is the desired final destination URL for the user
+              once logout is complete. If 'dest_url' does not have a host
+              specified, we will use the host from the current request.
+
+  Returns:
+    string
+  """
+  req = user_service_pb.StringProto()
+  resp = user_service_pb.StringProto()
+  req.set_value(dest_url)
+  try:
+    apiproxy_stub_map.MakeSyncCall('user', 'CreateLogoutURL', req, resp)
+  except apiproxy_errors.ApplicationError, e:
+    if (e.application_error ==
+        user_service_pb.UserServiceError.REDIRECT_URL_TOO_LONG):
+      raise RedirectTooLongError
+    else:
+      raise e
+  return resp.value()
+
+CreateLogoutURL = create_logout_url
+
+
+def get_current_user():
+  try:
+    return User()
+  except UserNotFoundError:
+    return None
+
+GetCurrentUser = get_current_user
+
+
+def is_current_user_admin():
+  """Return true if the user making this request is an admin for this
+  application, false otherwise.
+
+  We specifically make this a separate function, and not a member function of
+  the User class, because admin status is not persisted in the datastore. It
+  only exists for the user making this request right now.
+  """
+  return (os.environ.get('USER_IS_ADMIN', '0')) == "1"
+
+IsCurrentUserAdmin = is_current_user_admin