app/soc/views/site/user/profile.py
changeset 512 aae25d2b4464
parent 500 44ea4620c5c0
equal deleted inserted replaced
511:52557918ec8f 512:aae25d2b4464
    59   """
    59   """
    60   account = forms.EmailField(required=False,
    60   account = forms.EmailField(required=False,
    61       label=soc.models.user.User.account.verbose_name,
    61       label=soc.models.user.User.account.verbose_name,
    62       help_text=soc.models.user.User.account.help_text)
    62       help_text=soc.models.user.User.account.help_text)
    63 
    63 
    64   link_name = forms.CharField(required=False,
    64   link_id = forms.CharField(required=False,
    65       label=soc.models.user.User.link_name.verbose_name,
    65       label=soc.models.user.User.link_id.verbose_name,
    66       help_text=soc.models.user.User.link_name.help_text)
    66       help_text=soc.models.user.User.link_id.help_text)
    67 
    67 
    68   class Meta:
    68   class Meta:
    69     model = None
    69     model = None
    70 
    70 
    71   def clean_link_name(self):
    71   def clean_link_id(self):
    72     link_name = self.cleaned_data.get('link_name')
    72     link_id = self.cleaned_data.get('link_id')
    73 
    73 
    74     if not link_name:
    74     if not link_id:
    75       # link name not supplied (which is OK), so do not try to validate it
    75       # link ID not supplied (which is OK), so do not try to validate it
    76       return None
    76       return None
    77 
    77 
    78     if not validate.isLinkNameFormatValid(link_name):
    78     if not validate.isLinkIdFormatValid(link_id):
    79       raise forms.ValidationError('This link name is in wrong format.')
    79       raise forms.ValidationError('This link ID is in wrong format.')
    80     
    80     
    81     return link_name
    81     return link_id
    82 
    82 
    83   def clean_account(self):
    83   def clean_account(self):
    84     email = self.cleaned_data.get('account')
    84     email = self.cleaned_data.get('account')
    85     
    85     
    86     if not email:
    86     if not email:
   147             
   147             
   148           if nearest_user_range_start is not None:            
   148           if nearest_user_range_start is not None:            
   149             context['lookup_link'] = './list?offset=%s&limit=%s' % (
   149             context['lookup_link'] = './list?offset=%s&limit=%s' % (
   150                 nearest_user_range_start, range_width)
   150                 nearest_user_range_start, range_width)
   151       if not user:
   151       if not user:
   152         # user not found yet, so see if link name was provided
   152         # user not found yet, so see if link ID was provided
   153         link_name = form.cleaned_data.get('link_name')
   153         link_id = form.cleaned_data.get('link_id')
   154         
   154         
   155         if link_name:
   155         if link_id:
   156           # link name provided, so try to look up by link name 
   156           # link ID provided, so try to look up by link ID 
   157           user = models.user.logic.getForFields({'link_name': link_name},
   157           user = models.user.logic.getForFields({'link_id': link_id},
   158                                                 unique=True)        
   158                                                 unique=True)        
   159           if user:
   159           if user:
   160             lookup_message = ugettext_lazy('User found by link name.')
   160             lookup_message = ugettext_lazy('User found by link ID.')
   161             # clear previous error, since User was found
   161             # clear previous error, since User was found
   162             email_error = None
   162             email_error = None
   163             # clear previous lookup_link, since User was found, the lookup_link
   163             # clear previous lookup_link, since User was found, the lookup_link
   164             # is not needed to display.
   164             # is not needed to display.
   165             context['lookup_link'] = None
   165             context['lookup_link'] = None
   166           else:
   166           else:
   167             context['link_name_error'] = ugettext_lazy(
   167             context['link_id_error'] = ugettext_lazy(
   168                 'User with that link name not found.')
   168                 'User with that link ID not found.')
   169             if context['lookup_link'] is None:
   169             if context['lookup_link'] is None:
   170               range_width = helper.lists.getPreferredListPagination()
   170               range_width = helper.lists.getPreferredListPagination()
   171               nearest_user_range_start = (
   171               nearest_user_range_start = (
   172                 models.user.logic.findNearestEntitiesOffset(
   172                 models.user.logic.findNearestEntitiesOffset(
   173                     width, [('link_name', link_name)]))
   173                     width, [('link_id', link_id)]))
   174             
   174             
   175               if nearest_user_range_start is not None:
   175               if nearest_user_range_start is not None:
   176                 context['lookup_link'] = './list?offset=%s&limit=%s' % (
   176                 context['lookup_link'] = './list?offset=%s&limit=%s' % (
   177                     nearest_user_range_start, range_width)
   177                     nearest_user_range_start, range_width)
   178     # else: form was not valid
   178     # else: form was not valid
   180 
   180 
   181   if user:
   181   if user:
   182     # User entity found, so populate form with existing User information
   182     # User entity found, so populate form with existing User information
   183     # context['found_user'] = user
   183     # context['found_user'] = user
   184     form = LookupForm(initial={'account': user.account.email(),
   184     form = LookupForm(initial={'account': user.account.email(),
   185                                'link_name': user.link_name})
   185                                'link_id': user.link_id})
   186 
   186 
   187     if request.path.endswith('lookup'):
   187     if request.path.endswith('lookup'):
   188       # convert /lookup path into /profile/link_name path
   188       # convert /lookup path into /profile/link_id path
   189       context['edit_link'] = helper.requests.replaceSuffix(
   189       context['edit_link'] = helper.requests.replaceSuffix(
   190           request.path, 'lookup', 'profile/%s' % user.link_name)
   190           request.path, 'lookup', 'profile/%s' % user.link_id)
   191     # else: URL is not one that was expected, so do not display edit link
   191     # else: URL is not one that was expected, so do not display edit link
   192   elif not form:
   192   elif not form:
   193     # no pre-populated form was constructed, so show the empty look-up form
   193     # no pre-populated form was constructed, so show the empty look-up form
   194     form = LookupForm()
   194     form = LookupForm()
   195 
   195 
   211   """
   211   """
   212   account = forms.EmailField(
   212   account = forms.EmailField(
   213       label=soc.models.user.User.account.verbose_name,
   213       label=soc.models.user.User.account.verbose_name,
   214       help_text=soc.models.user.User.account.help_text)
   214       help_text=soc.models.user.User.account.help_text)
   215 
   215 
   216   link_name = forms.CharField(
   216   link_id = forms.CharField(
   217       label=soc.models.user.User.link_name.verbose_name,
   217       label=soc.models.user.User.link_id.verbose_name,
   218       help_text=soc.models.user.User.link_name.help_text)
   218       help_text=soc.models.user.User.link_id.help_text)
   219 
   219 
   220   nick_name = forms.CharField(
   220   nick_name = forms.CharField(
   221       label=soc.models.user.User.nick_name.verbose_name)
   221       label=soc.models.user.User.nick_name.verbose_name)
   222 
   222 
   223   is_developer = forms.BooleanField(required=False,
   223   is_developer = forms.BooleanField(required=False,
   227   key_name = forms.CharField(widget=forms.HiddenInput)
   227   key_name = forms.CharField(widget=forms.HiddenInput)
   228   
   228   
   229   class Meta:
   229   class Meta:
   230     model = None
   230     model = None
   231  
   231  
   232   def clean_link_name(self):
   232   def clean_link_id(self):
   233     link_name = self.cleaned_data.get('link_name')
   233     link_id = self.cleaned_data.get('link_id')
   234     if not validate.isLinkNameFormatValid(link_name):
   234     if not validate.isLinkIdFormatValid(link_id):
   235       raise forms.ValidationError("This link name is in wrong format.")
   235       raise forms.ValidationError("This link ID is in wrong format.")
   236 
   236 
   237     key_name = self.data.get('key_name')
   237     key_name = self.data.get('key_name')
   238     if key_name:
   238     if key_name:
   239       key_name_user = user_logic.logic.getFromKeyName(key_name)
   239       key_name_user = user_logic.logic.getFromKeyName(key_name)
   240 
   240 
   241       if link_name_user and key_name_user and \
   241       if link_id_user and key_name_user and \
   242           link_name_user.account != key_name_user.account:
   242           link_id_user.account != key_name_user.account:
   243         raise forms.ValidationError("This link name is already in use.")
   243         raise forms.ValidationError("This link ID is already in use.")
   244 
   244 
   245     return link_name
   245     return link_id
   246 
   246 
   247   def clean_account(self):
   247   def clean_account(self):
   248     form_account = users.User(email=self.cleaned_data.get('account'))
   248     form_account = users.User(email=self.cleaned_data.get('account'))
   249     if not accounts.isAccountAvailable(
   249     if not accounts.isAccountAvailable(
   250         form_account, existing_key_name=self.data.get('key_name')):
   250         form_account, existing_key_name=self.data.get('key_name')):
   259 DEF_CREATE_NEW_USER_MSG = ' You can create a new user by visiting' \
   259 DEF_CREATE_NEW_USER_MSG = ' You can create a new user by visiting' \
   260                           ' <a href="/site/user/profile">Create ' \
   260                           ' <a href="/site/user/profile">Create ' \
   261                           'a New User</a> page.'
   261                           'a New User</a> page.'
   262 
   262 
   263 @decorators.view
   263 @decorators.view
   264 def edit(request, page_name=None, link_name=None,
   264 def edit(request, page_name=None, link_id=None,
   265          template=DEF_SITE_USER_PROFILE_EDIT_TMPL):
   265          template=DEF_SITE_USER_PROFILE_EDIT_TMPL):
   266   """View for a Developer to modify the properties of a User Model entity.
   266   """View for a Developer to modify the properties of a User Model entity.
   267 
   267 
   268   Args:
   268   Args:
   269     request: the standard django request object
   269     request: the standard django request object
   270     page_name: the page name displayed in templates as page and header title
   270     page_name: the page name displayed in templates as page and header title
   271     link_name: the User's site-unique "link_name" extracted from the URL
   271     link_id: the User's site-unique "link_id" extracted from the URL
   272     template: the "sibling" template (or a search list of such templates)
   272     template: the "sibling" template (or a search list of such templates)
   273       from which to construct the public.html template name (or names)
   273       from which to construct the public.html template name (or names)
   274 
   274 
   275   Returns:
   275   Returns:
   276     A subclass of django.http.HttpResponse which either contains the form to
   276     A subclass of django.http.HttpResponse which either contains the form to
   286   context = helper.responses.getUniversalContext(request)
   286   context = helper.responses.getUniversalContext(request)
   287   context['page_name'] = page_name
   287   context['page_name'] = page_name
   288 
   288 
   289   user = None  # assume that no User entity will be found
   289   user = None  # assume that no User entity will be found
   290 
   290 
   291   # try to fetch User entity corresponding to link_name if one exists
   291   # try to fetch User entity corresponding to link_id if one exists
   292   try:
   292   try:
   293     if link_name:
   293     if link_id:
   294       user = accounts.getUserFromLinkNameOr404(link_name)
   294       user = accounts.getUserFromLinkIdOr404(link_id)
   295   except out_of_band.ErrorResponse, error:
   295   except out_of_band.ErrorResponse, error:
   296     # show custom 404 page when link name doesn't exist in Datastore
   296     # show custom 404 page when link ID doesn't exist in Datastore
   297     error.message = error.message + DEF_CREATE_NEW_USER_MSG
   297     error.message = error.message + DEF_CREATE_NEW_USER_MSG
   298     return simple.errorResponse(request, page_name, error, template, context)
   298     return simple.errorResponse(request, page_name, error, template, context)
   299 
   299 
   300 
   300 
   301   if request.method == 'POST':
   301   if request.method == 'POST':
   302     form = EditForm(request.POST)
   302     form = EditForm(request.POST)
   303 
   303 
   304     if form.is_valid():
   304     if form.is_valid():
   305       key_name = form.cleaned_data.get('key_name')
   305       key_name = form.cleaned_data.get('key_name')
   306       new_link_name = form.cleaned_data.get('link_name')
   306       new_link_id = form.cleaned_data.get('link_id')
   307 
   307 
   308       properties = {}
   308       properties = {}
   309       properties['account'] = form.cleaned_data.get('account')
   309       properties['account'] = form.cleaned_data.get('account')
   310       properties['link_name']  = new_link_name
   310       properties['link_id']  = new_link_id
   311       properties['nick_name']  = form.cleaned_data.get('nick_name')
   311       properties['nick_name']  = form.cleaned_data.get('nick_name')
   312       properties['is_developer'] = form.cleaned_data.get('is_developer')
   312       properties['is_developer'] = form.cleaned_data.get('is_developer')
   313       
   313       
   314       user = models.user.logic.updateOrCreateFromKeyName(properties, key_name)
   314       user = models.user.logic.updateOrCreateFromKeyName(properties, key_name)
   315 
   315 
   316       if not user:
   316       if not user:
   317         return http.HttpResponseRedirect('/')
   317         return http.HttpResponseRedirect('/')
   318         
   318         
   319       # redirect to new /site/user/profile/new_link_name?s=0
   319       # redirect to new /site/user/profile/new_link_id?s=0
   320       # (causes 'Profile saved' message to be displayed)
   320       # (causes 'Profile saved' message to be displayed)
   321       return helper.responses.redirectToChangedSuffix(
   321       return helper.responses.redirectToChangedSuffix(
   322           request, link_name, new_link_name,
   322           request, link_id, new_link_id,
   323           params=profile.SUBMIT_PROFILE_SAVED_PARAMS)
   323           params=profile.SUBMIT_PROFILE_SAVED_PARAMS)
   324   else: # method == 'GET':
   324   else: # method == 'GET':
   325     # try to fetch User entity corresponding to link name if one exists
   325     # try to fetch User entity corresponding to link ID if one exists
   326     if link_name:
   326     if link_id:
   327       if user:
   327       if user:
   328         # is 'Profile saved' parameter present, but referrer was not ourself?
   328         # is 'Profile saved' parameter present, but referrer was not ourself?
   329         # (e.g. someone bookmarked the GET that followed the POST submit) 
   329         # (e.g. someone bookmarked the GET that followed the POST submit) 
   330         if (request.GET.get(profile.SUBMIT_MSG_PARAM_NAME)
   330         if (request.GET.get(profile.SUBMIT_MSG_PARAM_NAME)
   331             and (not helper.requests.isReferrerSelf(request,
   331             and (not helper.requests.isReferrerSelf(request,
   332                                                     suffix=link_name))):
   332                                                     suffix=link_id))):
   333           # redirect to aggressively remove 'Profile saved' query parameter
   333           # redirect to aggressively remove 'Profile saved' query parameter
   334           return http.HttpResponseRedirect(request.path)
   334           return http.HttpResponseRedirect(request.path)
   335     
   335     
   336         # referrer was us, so select which submit message to display
   336         # referrer was us, so select which submit message to display
   337         # (may display no message if ?s=0 parameter is not present)
   337         # (may display no message if ?s=0 parameter is not present)
   340                 request, profile.SUBMIT_MSG_PARAM_NAME,
   340                 request, profile.SUBMIT_MSG_PARAM_NAME,
   341                 values=profile.SUBMIT_MESSAGES))
   341                 values=profile.SUBMIT_MESSAGES))
   342 
   342 
   343         # populate form with the existing User entity
   343         # populate form with the existing User entity
   344         form = EditForm(initial={'key_name': user.key().name(),
   344         form = EditForm(initial={'key_name': user.key().name(),
   345             'account': user.account.email(), 'link_name': user.link_name,
   345             'account': user.account.email(), 'link_id': user.link_id,
   346             'nick_name': user.nick_name, 'is_developer': user.is_developer})
   346             'nick_name': user.nick_name, 'is_developer': user.is_developer})
   347       else:
   347       else:
   348         if request.GET.get(profile.SUBMIT_MSG_PARAM_NAME):
   348         if request.GET.get(profile.SUBMIT_MSG_PARAM_NAME):
   349           # redirect to aggressively remove 'Profile saved' query parameter
   349           # redirect to aggressively remove 'Profile saved' query parameter
   350           return http.HttpResponseRedirect(request.path)
   350           return http.HttpResponseRedirect(request.path)
   351           
   351           
   352         context['lookup_error'] = ugettext_lazy(
   352         context['lookup_error'] = ugettext_lazy(
   353             'User with that link name not found.')
   353             'User with that link ID not found.')
   354         form = EditForm(initial={'link_name': link_name})
   354         form = EditForm(initial={'link_id': link_id})
   355     else:  # no link name specified in the URL
   355     else:  # no link ID specified in the URL
   356       if request.GET.get(profile.SUBMIT_MSG_PARAM_NAME):
   356       if request.GET.get(profile.SUBMIT_MSG_PARAM_NAME):
   357         # redirect to aggressively remove 'Profile saved' query parameter
   357         # redirect to aggressively remove 'Profile saved' query parameter
   358         return http.HttpResponseRedirect(request.path)
   358         return http.HttpResponseRedirect(request.path)
   359 
   359 
   360       # no link name specified, so start with an empty form
   360       # no link ID specified, so start with an empty form
   361       form = EditForm()
   361       form = EditForm()
   362 
   362 
   363   context.update({'form': form,
   363   context.update({'form': form,
   364                   'existing_user': user})
   364                   'existing_user': user})
   365 
   365 
   376   """
   376   """
   377   account = forms.EmailField(
   377   account = forms.EmailField(
   378       label=soc.models.user.User.account.verbose_name,
   378       label=soc.models.user.User.account.verbose_name,
   379       help_text=soc.models.user.User.account.help_text)
   379       help_text=soc.models.user.User.account.help_text)
   380 
   380 
   381   link_name = forms.CharField(
   381   link_id = forms.CharField(
   382       label=soc.models.user.User.link_name.verbose_name,
   382       label=soc.models.user.User.link_id.verbose_name,
   383       help_text=soc.models.user.User.link_name.help_text)
   383       help_text=soc.models.user.User.link_id.help_text)
   384 
   384 
   385   nick_name = forms.CharField(
   385   nick_name = forms.CharField(
   386       label=soc.models.user.User.nick_name.verbose_name)
   386       label=soc.models.user.User.nick_name.verbose_name)
   387 
   387 
   388   is_developer = forms.BooleanField(required=False,
   388   is_developer = forms.BooleanField(required=False,
   390       help_text=soc.models.user.User.is_developer.help_text)
   390       help_text=soc.models.user.User.is_developer.help_text)
   391   
   391   
   392   class Meta:
   392   class Meta:
   393     model = None
   393     model = None
   394   
   394   
   395   def clean_link_name(self):
   395   def clean_link_id(self):
   396     link_name = self.cleaned_data.get('link_name')
   396     link_id = self.cleaned_data.get('link_id')
   397     if not validate.isLinkNameFormatValid(link_name):
   397     if not validate.isLinkIdFormatValid(link_id):
   398       raise forms.ValidationError("This link name is in wrong format.")
   398       raise forms.ValidationError("This link ID is in wrong format.")
   399     else:
   399     else:
   400       if models.user.logic.getForFields({'link_name': link_name},
   400       if models.user.logic.getForFields({'link_id': link_id},
   401                                         unique=True):
   401                                         unique=True):
   402         raise forms.ValidationError("This link name is already in use.")
   402         raise forms.ValidationError("This link ID is already in use.")
   403     return link_name
   403     return link_id
   404 
   404 
   405   def clean_account(self):
   405   def clean_account(self):
   406     new_email = self.cleaned_data.get('account')
   406     new_email = self.cleaned_data.get('account')
   407     form_account = users.User(email=new_email)
   407     form_account = users.User(email=new_email)
   408     if models.user.logic.getForFields({'account': form_account}, unique=True):
   408     if models.user.logic.getForFields({'account': form_account}, unique=True):
   442   if request.method == 'POST':
   442   if request.method == 'POST':
   443     form = CreateForm(request.POST)
   443     form = CreateForm(request.POST)
   444 
   444 
   445     if form.is_valid():
   445     if form.is_valid():
   446       form_account = form.cleaned_data.get('account')
   446       form_account = form.cleaned_data.get('account')
   447       link_name = form.cleaned_data.get('link_name')
   447       link_id = form.cleaned_data.get('link_id')
   448 
   448 
   449       properties = {
   449       properties = {
   450         'account': form_account,
   450         'account': form_account,
   451         'link_name': link_name,
   451         'link_id': link_id,
   452         'nick_name': form.cleaned_data.get('nick_name'),
   452         'nick_name': form.cleaned_data.get('nick_name'),
   453         'is_developer': form.cleaned_data.get('is_developer'),
   453         'is_developer': form.cleaned_data.get('is_developer'),
   454       }
   454       }
   455 
   455 
   456       key_fields = {'email': form_account.email()}
   456       key_fields = {'email': form_account.email()}
   458                                                         key_fields)
   458                                                         key_fields)
   459 
   459 
   460       if not user:
   460       if not user:
   461         return http.HttpResponseRedirect('/')
   461         return http.HttpResponseRedirect('/')
   462 
   462 
   463       # redirect to new /site/user/profile/new_link_name?s=0
   463       # redirect to new /site/user/profile/new_link_id?s=0
   464       # (causes 'Profile saved' message to be displayed)
   464       # (causes 'Profile saved' message to be displayed)
   465       return helper.responses.redirectToChangedSuffix(
   465       return helper.responses.redirectToChangedSuffix(
   466           request, 'create', 'edit/' + link_name,
   466           request, 'create', 'edit/' + link_id,
   467           params=profile.SUBMIT_PROFILE_SAVED_PARAMS)
   467           params=profile.SUBMIT_PROFILE_SAVED_PARAMS)
   468   else: # method == 'GET':
   468   else: # method == 'GET':
   469     # no link name specified, so start with an empty form
   469     # no link ID specified, so start with an empty form
   470     form = CreateForm()
   470     form = CreateForm()
   471 
   471 
   472   context['form'] = form
   472   context['form'] = form
   473 
   473 
   474   return helper.responses.respond(request, template, context)
   474   return helper.responses.respond(request, template, context)