app/soc/logic/site/id_user.py
author Todd Larsen <tlarsen@google.com>
Fri, 12 Sep 2008 19:01:44 +0000
changeset 136 a95f511bfcf8
parent 135 a7ccde9d9eed
child 137 0f572149449d
permissions -rw-r--r--
Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement that new function in terms of only the existing doesLinkNameExist() and doesLinkNameBelongToId(). Patch by: Todd Larsen Review by: Pawel Solyga Review via: discussion of patches on melange-soc-dev mailing list
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     1
#!/usr/bin/python2.5
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     2
#
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     3
# Copyright 2008 the Melange authors.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     4
#
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     5
# Licensed under the Apache License, Version 2.0 (the "License");
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     6
# you may not use this file except in compliance with the License.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     7
# You may obtain a copy of the License at
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     8
#
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     9
#   http://www.apache.org/licenses/LICENSE-2.0
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    10
#
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    11
# Unless required by applicable law or agreed to in writing, software
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    12
# distributed under the License is distributed on an "AS IS" BASIS,
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    14
# See the License for the specific language governing permissions and
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    15
# limitations under the License.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    16
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    17
"""Basic ID (Google Account) and User (Model) query functions.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    18
"""
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    19
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    20
__authors__ = [
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    21
  '"Todd Larsen" <tlarsen@google.com>',
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    22
  ]
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    23
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    24
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    25
import re
135
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
    26
import logging
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    27
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    28
from google.appengine.api import users
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    29
from google.appengine.ext import db
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    30
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    31
from soc.logic import out_of_band
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    32
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    33
import soc.models.user
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    34
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    35
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    36
def getUserKeyNameFromId(id):
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    37
  """Return a Datastore key_name for a User derived from a Google Account.
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    38
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    39
  Args:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    40
    id: a Google Account (users.User) object
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    41
  """
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    42
  if not id:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    43
    return None
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    44
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    45
  return 'User:%s' % id.email()
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    46
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    47
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    48
def getIdIfMissing(id):
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    49
  """Gets Google Account of logged-in user (possibly None) if id is false.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    50
  
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    51
  This is a convenience function that simplifies a lot of view code that
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    52
  accepts an optional id argument from the caller (such as one looked up
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    53
  already by another view that decides to "forward" the request to this
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    54
  other view).
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    55
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    56
  Args:
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    57
    id: a Google Account (users.User) object, or None
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    58
    
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    59
  Returns:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    60
    If id is non-false, it is simply returned; otherwise, the Google Account
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    61
    of currently logged-in user is returned (which could be None if no user
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    62
    is logged in).
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    63
  """
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    64
  if not id:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    65
    # id not initialized, so check if a Google Account is currently logged in
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    66
    id = users.get_current_user()
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    67
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    68
  return id
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    69
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    70
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    71
def getUserFromId(id):
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    72
  """Returns User entity for a Google Account, or None if not found.  
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    73
    
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    74
  Args:
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    75
    id: a Google Account (users.User) object
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    76
  """
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    77
  # first, attempt a lookup by User:id key name
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    78
  key_name = getUserKeyNameFromId(id)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    79
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    80
  if key_name:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    81
    user = soc.models.user.User.get_by_key_name(key_name)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    82
  else:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    83
    user = None
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    84
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    85
  if user:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    86
    return user
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    87
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    88
  # email address may have changed, so query the id property
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    89
  user = soc.models.user.User.gql('WHERE id = :1', id).get()
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    90
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    91
  if user:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    92
    return user
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    93
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    94
  # last chance: perhaps the User changed their email address at some point
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    95
  user = soc.models.user.User.gql('WHERE former_ids = :1', id).get()
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    96
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    97
  return user
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    98
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
    99
  
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   100
def getUserIfMissing(user, id):
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   101
  """Conditionally returns User entity for a Google Account.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   102
  
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   103
  This function is used to look up the User entity corresponding to the
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   104
  supplied Google Account *if* the user parameter is false (usually None).
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   105
  This function is basically a no-op if user already refers to a User
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   106
  entity.  This is a convenience function that simplifies a lot of view
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   107
  code that accepts an optional user argument from the caller (such as
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   108
  one looked up already by another view that decides to "forward" the
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   109
  HTTP request to this other view).
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   110
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   111
  Args:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   112
    user: None (usually), or an existing User entity
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   113
    id: a Google Account (users.User) object
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   114
    
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   115
  Returns:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   116
    * user (which may have already been None if passed in that way by the
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   117
      caller) if id is false or user is non-false
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   118
    * results of getUserFromId() if user is false and id is non-false
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   119
  """
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   120
  if id and (not user):
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   121
    # Google Account supplied and User uninitialized, so look up User entity
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   122
    user = getUserFromId(id)
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   123
    
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   124
  return user
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   125
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   126
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   127
def doesUserExist(id):
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   128
  """Returns True if User exists in the Datastore for a Google Account.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   129
    
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   130
  Args:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   131
    id: a Google Account object
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   132
  """
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   133
  if getUserFromId(id):
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   134
    return True
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   135
  else:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   136
    return False
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   137
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   138
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   139
def isIdDeveloper(id=None):
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   140
  """Returns True if Google Account is a Developer with special privileges.
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   141
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   142
  Args:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   143
    id: a Google Account (users.User) object; if id is not supplied,
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   144
      the current logged-in user is checked using the App Engine Users API.
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   145
      THIS ARGUMENT IS CURRENTLY IGNORED AND ONLY THE CURRENTLY LOGGED-IN
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   146
      USER IS CHECKED!
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   147
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   148
  See the TODO in the code below...
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   149
  """
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   150
  if not id:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   151
    return users.is_current_user_admin()
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   152
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   153
  # TODO(tlarsen): this Google App Engine function only checks the currently
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   154
  #   logged in user.  There needs to be another way to do this, such as a
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   155
  #   field in the User Model...
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   156
  return users.is_current_user_admin()
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   157
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   158
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   159
LINKNAME_PATTERN = r'''(?x)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   160
    ^
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   161
    [0-9a-z]   # start with ASCII digit or lowercase
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   162
    (
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   163
     [0-9a-z]  # additional ASCII digit or lowercase
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   164
     |         # -OR-
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   165
     _[0-9a-z] # underscore and ASCII digit or lowercase
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   166
    )*         # zero or more of OR group
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   167
    $
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   168
'''
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   169
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   170
LINKNAME_REGEX = re.compile(LINKNAME_PATTERN)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   171
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   172
def isLinkNameFormatValid(link_name):
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   173
  """Returns True if link_name is in a valid format.
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   174
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   175
  Args:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   176
    link_name: link name used in URLs to identify user
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   177
  """
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   178
  if LINKNAME_REGEX.match(link_name):
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   179
    return True
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   180
  return False
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   181
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   182
112
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   183
def getUserFromLinkName(link_name):
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   184
  """Returns User entity for link_name or None if not found.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   185
    
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   186
  Args:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   187
    link_name: link name used in URLs to identify user
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   188
  """
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   189
  return soc.models.user.User.gql('WHERE link_name = :1', link_name).get()
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   190
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   191
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   192
def getUserIfLinkName(link_name):
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   193
  """Returns User entity for supplied link_name if one exists.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   194
  
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   195
  Args:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   196
    link_name: link name used in URLs to identify user
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   197
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   198
  Returns:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   199
    * None if link_name is false.
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   200
    * User entity that has supplied link_name
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   201
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   202
  Raises:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   203
    out_of_band.ErrorResponse if link_name is not false, but no User entity
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   204
    with the supplied link_name exists in the Datastore
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   205
  """
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   206
  if not link_name:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   207
    # exit without error, to let view know that link_name was not supplied
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   208
    return None
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   209
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   210
  link_name_user = getUserFromLinkName(link_name)
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   211
    
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   212
  if link_name_user:
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   213
    # a User has this link name, so return that corresponding User entity
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   214
    return link_name_user
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   215
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   216
  # else: a link name was supplied, but there is no User that has it
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   217
  raise out_of_band.ErrorResponse(
4d9895fb15bc Consolidate functions dealing with Google Accounts and look-up of User entities
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
   218
      'There is no user with a "link name" of "%s".' % link_name, status=404)
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   219
135
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   220
136
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   221
def isLinkNameAvailableForId(link_name, id=None):
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   222
  """Indicates if link name is available for the given Google Account.
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   223
  
135
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   224
  Args:
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   225
    link_name: link name used in URLs to identify user
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   226
    id: a Google Account object; optional, current logged-in user will
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   227
      be used (or False will be returned if no user is logged in)
136
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   228
      
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   229
  Returns:
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   230
    True: the link name does not exist in the Datastore,
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   231
      so it is currently "available" to any User
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   232
    True: the link name exists and already belongs to the User entity
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   233
      associated with the specified Google Account
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   234
    False: the link name exists and belongs to a User entity other than
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   235
      that associated with the supplied Google Account
135
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   236
  """
136
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   237
  link_name_exists = doesLinkNameExist(link_name)
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   238
 
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   239
  if not link_name_exists:
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   240
    # if the link name does not exist, it is clearly available for any User
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   241
    return True
135
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   242
136
a95f511bfcf8 Replace checkLinkNameForId() with isLinkNameAvailableForId(), and implement
Todd Larsen <tlarsen@google.com>
parents: 135
diff changeset
   243
  return doesLinkNameBelongToId(link_name, id=id)
135
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   244
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   245
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   246
def doesLinkNameExist(link_name=None):
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   247
  """Returns True if link name exists in the Datastore.
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   248
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   249
  Args:
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   250
    link_name: link name used in URLs to identify user
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   251
  """
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   252
  if getUserFromLinkName(link_name):
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   253
    return True
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   254
  else:
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   255
    return False
a7ccde9d9eed Fixed one typo in response_helpers which caused is_admin context variable not to work correctly.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 131
diff changeset
   256
131
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   257
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   258
def doesLinkNameBelongToId(link_name, id=None):
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   259
  """Returns True if supplied link name belongs to supplied Google Account.
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   260
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   261
  Args:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   262
    link_name: link name used in URLs to identify user
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   263
    id: a Google Account object; optional, current logged-in user will
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   264
      be used (or False will be returned if no user is logged in)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   265
  """
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   266
  id = getIdIfMissing(id)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   267
    
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   268
  if not id:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   269
    # id not supplied and no Google Account logged in, so link name cannot
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   270
    # belong to an unspecified User
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   271
    return False
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   272
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   273
  user = getUserFromId(id)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   274
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   275
  if not user:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   276
    # no User corresponding to id Google Account, so no link name at all 
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   277
    return False
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   278
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   279
  if user.link_name != link_name:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   280
    # User exists for id, but does not have this link name
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   281
    return False
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   282
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   283
  return True  # link_name does actually belong to this Google Account
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   284
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   285
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   286
def updateOrCreateUserFromId(id, **user_properties):
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   287
  """Update existing User entity, or create new one with supplied properties.
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   288
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   289
  Args:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   290
    id: a Google Account object
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   291
    **user_properties: keyword arguments that correspond to User entity
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   292
      properties and their values
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   293
      
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   294
  Returns:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   295
    the User entity corresponding to the Google Account, with any supplied
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   296
    properties changed, or a new User entity now associated with the Google
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   297
    Account and with the supplied properties
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   298
  """
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   299
  # attempt to retrieve the existing User
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   300
  user = getUserFromId(id)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   301
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   302
  if not user:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   303
    # user did not exist, so create one in a transaction
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   304
    key_name = getUserKeyNameFromId(id)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   305
    user = soc.models.user.User.get_or_insert(
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   306
      key_name, id=id, **user_properties)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   307
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   308
  # there is no way to be sure if get_or_insert() returned a new User or
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   309
  # got an existing one due to a race, so update with user_properties anyway,
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   310
  # in a transaction
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   311
  return updateUserProperties(user, **user_properties)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   312
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   313
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   314
def updateUserProperties(user, **user_properties):
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   315
  """Update existing User entity using supplied User properties.
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   316
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   317
  Args:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   318
    user: a User entity
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   319
    **user_properties: keyword arguments that correspond to User entity
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   320
      properties and their values
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   321
      
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   322
  Returns:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   323
    the original User entity with any supplied properties changed 
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   324
  """
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   325
  def update():
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   326
    return _unsafeUpdateUserProperties(user, **user_properties)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   327
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   328
  return db.run_in_transaction(update)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   329
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   330
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   331
def _unsafeUpdateUserProperties(user, **user_properties):
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   332
  """(see updateUserProperties)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   333
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   334
  Like updateUserProperties(), but not run within a transaction. 
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   335
  """
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   336
  properties = user.properties()
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   337
  
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   338
  for prop in properties.values():
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   339
    if prop.name in user_properties:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   340
      if prop.name == 'former_ids':
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   341
        # former_ids cannot be overwritten directly
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   342
        continue
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   343
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   344
      value = user_properties[prop.name]
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   345
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   346
      if prop.name == 'id':
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   347
        old_id = user.id
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   348
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   349
        if value != old_id:
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   350
          user.former_ids.append(old_id)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   351
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   352
      prop.__set__(user, value)
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   353
        
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   354
  user.put()
Todd Larsen <tlarsen@google.com>
parents: 112
diff changeset
   355
  return user