diff -r 9b07ddeb1412 -r 94834a1e6c01 app/soc/logic/accounts.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/soc/logic/accounts.py Sat Nov 15 03:12:33 2008 +0000 @@ -0,0 +1,129 @@ +#!/usr/bin/python2.5 +# +# Copyright 2008 the Melange authors. +# +# 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. + +"""Basic Google Account and User (Model) query functions. +""" + +__authors__ = [ + '"Chen Lunpeng" ', + '"Todd Larsen" ', + ] + + +from google.appengine.api import users + +from soc.logic import models +from soc.logic import out_of_band + +import soc.models.user +import soc.logic.models.user + + +def isDeveloper(account=None): + """Returns True if a Google Account is a Developer with special privileges. + + Since it only works on the current logged-in user, if account matches the + current logged-in Google Account, the App Engine Users API function + user.is_current_user_admin() is checked. If that returns False, or + account is not the currently logged-in user, the is_developer property of + the User entity corresponding to the Google Account is checked next. + + This solves the "chicken-and-egg" problem of no User entity having its + is_developer property set, but no one being able to set it. + + Args: + account: a Google Account (users.User) object; if not supplied, + the current logged-in user is checked + """ + + # Get the currently logged in user + current = users.get_current_user() + + if not (account or current): + # no Google Account was supplied or is logged in, so an unspecified + # User is definitely *not* a Developer + return False + + if (((not account) or (account == current)) + and users.is_current_user_admin()): + # no account supplied, or current logged-in user, and that user is in the + # Administration->Developers list in the App Engine console + return True + + if not account: + account = current + + user = models.user.logic.getForFields({'account': account}, unique=True) + + if not user: + # no User entity for this Google Account, and account is not the + # currently logged-in user, so there is no conclusive way to check the + # Administration->Developers list in the App Engine console + return False + + return user.is_developer + + +def isAccountAvailable(new_account, + existing_user=None, existing_key_name=None): + """Returns True if Google Account is available for use by existing User. + + Args: + new_account: a Google Account (users.User) object with a (possibly) + new email + existing_user: an existing User entity; default is None, in which case + existing_key_name is used to look up the User entity + existing_key_name: the key_name of an existing User entity, used + when existing_user is not supplied; default is None + """ + if not existing_user: + existing_user = models.user.logic.getFromKeyName(existing_key_name) + + if existing_user: + old_email = existing_user.account.email() + else: + old_email = None + + if new_account.email().lower() == old_email.lower(): + # "new" email is same as existing User wanting it, so it is "available" + return True + # else: "new" email truly is new to the existing User, so keep checking + + if not models.user.logic.getForFields({'account': new_account}, + unique=True): + # new email address also does not belong to any other User, + # so it is available + return True + + # email does not already belong to this User, but to some other User + return False + + +# TODO(tlarsen): make this generic for any Linkable and move elsewhere +def getUserFromLinkNameOr404(link_name): + """Like getUserFromLinkName but expects to find a user + + Raises: + out_of_band.ErrorResponse if no User entity is found + """ + user = models.user.logic.getForFields({'link_name': link_name}, + unique=True) + + if user: + return user + + raise out_of_band.ErrorResponse( + 'There is no user with a "link name" of "%s".' % link_name, status=404)