# HG changeset patch # User Todd Larsen # Date 1222827116 0 # Node ID a46c238be8dbd457ffa759ca16213b2ac1d1a985 # Parent 2204287da37496983ffa864936423f6c169190b5 Show link to /site/user/list on /site/user/lookup when User is not found. http://code.google.com/p/soc/issues/detail?id=61 Patch by: Chen Lunpeng Review by: Todd Larsen (with modifications) 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. diff -r 2204287da374 -r a46c238be8db app/soc/templates/soc/site/user/profile/lookup.html --- a/app/soc/templates/soc/site/user/profile/lookup.html Wed Oct 01 02:02:44 2008 +0000 +++ b/app/soc/templates/soc/site/user/profile/lookup.html Wed Oct 01 02:11:56 2008 +0000 @@ -98,6 +98,17 @@ {% endif %} +{% if lookup_link %} + +   + + + + The specified User was not found, but similar + Users are listed here. + + +{% endif %}

diff -r 2204287da374 -r a46c238be8db app/soc/views/site/user/profile.py --- a/app/soc/views/site/user/profile.py Wed Oct 01 02:02:44 2008 +0000 +++ b/app/soc/views/site/user/profile.py Wed Oct 01 02:11:56 2008 +0000 @@ -32,6 +32,7 @@ from soc.logic.site import id_user from soc.views import simple from soc.views.helpers import forms_helpers +from soc.views.helpers import list_helpers from soc.views.helpers import request_helpers from soc.views.helpers import response_helpers from soc.views.user import profile @@ -127,7 +128,13 @@ lookup_message = ugettext_lazy('User found by email.') else: email_error = ugettext_lazy('User with that email not found.') - + range_width = list_helpers.getPreferredListPagination() + nearest_user_range_start = id_user.findNearestUsersOffset( + range_width, id=form_id) + + if nearest_user_range_start is not None: + context['lookup_link'] = './list?offset=%s&limit=%s' % ( + nearest_user_range_start, range_width) if not user: # user not found yet, so see if link name was provided linkname = form.cleaned_data.get('link_name') @@ -141,7 +148,14 @@ email_error = None # clear previous error, since User was found else: context['linkname_error'] = ugettext_lazy( - 'User with that link name not found.') + 'User with that link name not found.') + range_width = list_helpers.getPreferredListPagination() + nearest_user_range_start = id_user.findNearestUsersOffset( + range_width, link_name=linkname) + + if nearest_user_range_start is not None: + context['lookup_link'] = './list?offset=%s&limit=%s' % ( + nearest_user_range_start, range_width) # else: form was not valid # else: # method == 'GET' @@ -296,7 +310,7 @@ values=profile.SUBMIT_MESSAGES)) # populate form with the existing User entity - form = EditForm(initial={ 'key_name': user.key().name(), + form = EditForm(initial={'key_name': user.key().name(), 'id': user.id.email, 'link_name': user.link_name, 'nick_name': user.nick_name, 'is_developer': user.is_developer}) else: @@ -368,7 +382,7 @@ DEF_SITE_CREATE_USER_PROFILE_TMPL = 'soc/site/user/profile/edit.html' def create(request, template=DEF_SITE_CREATE_USER_PROFILE_TMPL): - """View for a Developer to modify the properties of a User Model entity. + """View for a Developer to create a new User Model entity. Args: request: the standard django request object @@ -414,4 +428,4 @@ context['form'] = form - return response_helpers.respond(request, template, context) \ No newline at end of file + return response_helpers.respond(request, template, context)