app/soc/views/user/profile.py
changeset 170 1fadf6e0348d
parent 137 0f572149449d
child 184 7c0b42aecd9b
equal deleted inserted replaced
169:a9b3d6c9d4f9 170:1fadf6e0348d
    19 
    19 
    20 __authors__ = [
    20 __authors__ = [
    21   '"Pawel Solyga" <pawel.solyga@gmail.com>',
    21   '"Pawel Solyga" <pawel.solyga@gmail.com>',
    22   ]
    22   ]
    23 
    23 
    24 import re
       
    25 import logging
       
    26 
    24 
    27 from google.appengine.api import users
    25 from google.appengine.api import users
    28 from django import http
    26 from django import http
    29 from django import shortcuts
    27 from django import shortcuts
    30 from django import newforms as forms
    28 from django import newforms as forms
       
    29 from django.utils.translation import ugettext_lazy
    31 
    30 
    32 from soc.logic import out_of_band
    31 from soc.logic import out_of_band
    33 from soc.logic.site import id_user
    32 from soc.logic.site import id_user
    34 from soc.views import simple
    33 from soc.views import simple
    35 from soc.views.helpers import forms_helpers
    34 from soc.views.helpers import forms_helpers
    59       raise forms.ValidationError("This link name is already in use.")
    58       raise forms.ValidationError("This link name is already in use.")
    60     return link_name
    59     return link_name
    61 
    60 
    62 
    61 
    63 DEF_USER_PROFILE_EDIT_TMPL = 'soc/user/profile/edit.html'
    62 DEF_USER_PROFILE_EDIT_TMPL = 'soc/user/profile/edit.html'
       
    63 
       
    64 SUBMIT_MSG_PARAM_NAME = 's'
       
    65 
       
    66 SUBMIT_MESSAGES = (
       
    67   ugettext_lazy('Profile saved.'),
       
    68 )
       
    69 
       
    70 SUBMIT_MSG_PROFILE_SAVED = 0
       
    71 
       
    72 SUBMIT_PROFILE_SAVED_PARAMS = {
       
    73   SUBMIT_MSG_PARAM_NAME: SUBMIT_MSG_PROFILE_SAVED,
       
    74 }
    64 
    75 
    65 def edit(request, linkname=None, template=DEF_USER_PROFILE_EDIT_TMPL):
    76 def edit(request, linkname=None, template=DEF_USER_PROFILE_EDIT_TMPL):
    66   """View for a User to modify the properties of a User Model entity.
    77   """View for a User to modify the properties of a User Model entity.
    67 
    78 
    68   Args:
    79   Args:
    94 
   105 
    95   # try to fetch User entity corresponding to linkname if one exists    
   106   # try to fetch User entity corresponding to linkname if one exists    
    96   try:
   107   try:
    97     linkname_user = id_user.getUserIfLinkName(linkname)
   108     linkname_user = id_user.getUserIfLinkName(linkname)
    98   except out_of_band.ErrorResponse, error:
   109   except out_of_band.ErrorResponse, error:
    99     # show custom 404 page when linkname doesn't exist in Datastore
   110     # show custom 404 page when link name doesn't exist in Datastore
   100     return simple.errorResponse(request, error, template, context)
   111     return simple.errorResponse(request, error, template, context)
   101   
   112   
   102   # linkname_user will be None here if linkname was already None...
   113   # linkname_user will be None here if link name was already None...
   103   if linkname_user and (linkname_user.id != id):
   114   if linkname_user and (linkname_user.id != id):
   104     # linkname_user exists but is not the currently logged in Google Account,
   115     # linkname_user exists but is not the currently logged in Google Account,
   105     # so show public view for that (other) User entity
   116     # so show public view for that (other) User entity
   106     return simple.public(request, template, linkname, context)
   117     return simple.public(request, template, linkname, context)
   107 
   118 
   108   if request.method == 'POST':
   119   if request.method == 'POST':
   109     form = UserForm(request.POST)
   120     form = UserForm(request.POST)
   110 
   121 
   111     if form.is_valid():
   122     if form.is_valid():
   112       linkname = form.cleaned_data.get('link_name')
   123       new_linkname = form.cleaned_data.get('link_name')
   113       nickname = form.cleaned_data.get("nick_name")
   124       nickname = form.cleaned_data.get("nick_name")
   114 
   125 
   115       user = id_user.updateOrCreateUserFromId(
   126       user = id_user.updateOrCreateUserFromId(
   116           id, link_name=linkname, nick_name=nickname)
   127           id, link_name=new_linkname, nick_name=nickname)
   117 
   128 
   118       # TODO(tlarsen):
   129       # redirect to new /user/profile/new_linkname&s=0
   119       # if old_linkname:  redirect to new /user/profile/new_linkname
   130       # (causes 'Profile saved' message to be displayed)
   120       #   (how to preserve displaying the "Profile saved" message?)
   131       return response_helpers.redirectToChangedSuffix(
   121       context.update({'submit_message': 'Profile saved.'})
   132           request, linkname, new_linkname, params=SUBMIT_PROFILE_SAVED_PARAMS)
   122   else: # request.method == 'GET'
   133   else: # request.method == 'GET'
   123     # try to fetch User entity corresponding to Google Account if one exists    
   134     # try to fetch User entity corresponding to Google Account if one exists    
   124     user = id_user.getUserFromId(id)
   135     user = id_user.getUserFromId(id)
   125 
   136 
   126     if user:
   137     if user:
       
   138       # is 'Profile saved' parameter present, but referrer was not ourself?
       
   139       # (e.g. someone bookmarked the GET that followed the POST submit) 
       
   140       if (request.GET.get(SUBMIT_MSG_PARAM_NAME)
       
   141           and (not response_helpers.isReferrerSelf(request,
       
   142                                                    suffix=linkname))):
       
   143         # redirect to aggressively remove 'Profile saved' query parameter
       
   144         return http.HttpResponseRedirect(request.path)
       
   145     
       
   146       # referrer was us, so select which submit message to display
       
   147       # (may display no message if ?s=0 parameter is not present)
       
   148       context['submit_message'] = (
       
   149           template_helpers.getSingleIndexedParamValue(
       
   150               request, SUBMIT_MSG_PARAM_NAME, values=SUBMIT_MESSAGES))
       
   151 
   127       # populate form with the existing User entity
   152       # populate form with the existing User entity
   128       form = UserForm(instance=user)
   153       form = UserForm(instance=user)
   129     else:
   154     else:
       
   155       if request.GET.get(SUBMIT_MSG_PARAM_NAME):
       
   156         # redirect to aggressively remove 'Profile saved' query parameter
       
   157         return http.HttpResponseRedirect(request.path)
       
   158 
   130       # no User entity exists for this Google Account, so show a blank form
   159       # no User entity exists for this Google Account, so show a blank form
   131       form = UserForm()
   160       form = UserForm()
   132 
   161 
   133   context.update({'form': form})
   162   context.update({'form': form})
   134   return response_helpers.respond(request, template, context)
   163   return response_helpers.respond(request, template, context)