diff -r 2204287da374 -r a46c238be8db app/soc/logic/site/id_user.py --- a/app/soc/logic/site/id_user.py Wed Oct 01 02:02:44 2008 +0000 +++ b/app/soc/logic/site/id_user.py Wed Oct 01 02:11:56 2008 +0000 @@ -18,6 +18,7 @@ """ __authors__ = [ + '"Chen Lunpeng" ', '"Todd Larsen" ', ] @@ -117,6 +118,79 @@ return user +def getNearestUsers(id=None, link_name=None): + """Get User entities just before and just after the specified User. + + Args: + id: a Google Account (users.User) object; default is None (not supplied) + link_name: link name string; default is None (not supplied) + + Returns: + User entities being those just before and just after the (possibly + non-existent) User for given id or link_name, + OR + possibly None if query had no results or neither id or link_name were + supplied. + """ + if id: + query = db.GqlQuery("SELECT * FROM User WHERE id > :1", id) + return query.fetch(1) + + #if id not supplied, try link name. + if link_name: + query = db.GqlQuery("SELECT * FROM User WHERE link_name > :1", link_name) + return query.fetch(1) + + return None + + +def findNearestUsersOffset(width, id=None, link_name=None): + """Finds offset of beginning of a range of Users around the nearest User. + + Args: + limit: the width of the "found" window around the nearest User found + id: a Google Account (users.User) object, or None + link_name: link name input in the Lookup form or None if not supplied. + + Returns: + an offset into the list of Users that is width/2 less than the + offset of the first User returned by getNearestUsers(), or zero if + that offset would be less than zero + OR + None if there are no nearest Users or the offset of the beginning of + the range cannot be found for some reason + """ + # find User "nearest" to supplied id (Google Account) or link_name + nearest_users = getNearestUsers(id=id, link_name=link_name) + + if not nearest_users: + # no "nearest" User, so indicate that with None + return None + + nearest_user = nearest_users[0] + + # start search for beginning of nearest Users range at offset zero + offset = 0 + users = getUsersForOffsetAndLimit(offset=offset, limit=width) + + while True: + for user in users: + if nearest_user.id == user.id: + # nearest User found in current search range, so return a range start + return max(0, (offset - (width/2))) + + offset = offset + 1 + + # nearest User was not in the current search range, so fetch the next set + users = getUsersForOffsetAndLimit(offset=offset, limit=width) + + if not users: + # nearest User never found, so indicate that with None + break + + return None + + def doesUserExist(id): """Returns True if User exists in the Datastore for a Google Account.