diff -r b2b823466a8b -r 8c38b546a3cf app/soc/views/user/profile.py --- a/app/soc/views/user/profile.py Wed Aug 20 21:59:00 2008 +0000 +++ b/app/soc/views/user/profile.py Fri Aug 22 13:44:50 2008 +0000 @@ -53,16 +53,16 @@ """ #: db.Model subclass for which the form will gather information model = soc.models.user.User - + #: list of model fields which will *not* be gathered by the form exclude = ['id'] def clean_link_name(self): linkname = self.cleaned_data.get('link_name') linkname_user = soc.models.user.User.getUserForLinkname(linkname) - user = users.get_current_user() + current_id = users.get_current_user() # if linkname exist in datastore and doesn't belong to current user - if linkname_user and (linkname_user.id != user): + if linkname_user and (linkname_user.id != current_id): raise forms.ValidationError("This link name is already in use.") elif not self.LINKNAME_REGEX.match(linkname): raise forms.ValidationError("This link name is in wrong format.") @@ -83,28 +83,42 @@ """ #TODO(solydzajs): create controller for User and cleanup code in this handler - #: If user not signed in redirect to sign-in page - user = users.get_current_user() - if not user: + #TODO(solydzajs): use makeSiblingTemplatePath from templates_helpers and pass + # result to public view + + # TODO: use something like the code below, define global public tmpl + # template_choices = [makeSiblingTemplatePath(template, 'public.html'), + # DEF_USER_PROFILE_PUBLIC_TMPL]) + # public(request, linkname=linkname, template=template_choices) + + #: If user not signed and there is no linkname redirect to sign-in page + #: otherwise show public profile for linkname user + current_id = users.get_current_user() + if not current_id and not linkname: return http.HttpResponseRedirect(users.create_login_url(request.path)) - - soc_user = soc.models.user.User.getUser(user) + elif not current_id and linkname: + return public(request, linkname) + + user = soc.models.user.User.getUserForId(current_id) - #: Show custom 404 page when linkname in url doesn't match current user + #: Show custom 404 page when linkname doesn't exist in datastore + #: or show public view for linkname user if linkname: linkname_user = soc.models.user.User.getUserForLinkname(linkname) - if (linkname_user and linkname_user.id != user) or not linkname_user: + if not linkname_user: return http.HttpResponseNotFound('No user exists with that link name "%s"' % linkname) + elif linkname_user and (linkname_user.id != current_id): + return public(request, linkname) #: GET method - if (request.method != 'POST') and soc_user: - form = UserForm(initial={'nick_name': soc_user.nick_name, - 'link_name': soc_user.link_name}) + if (request.method != 'POST') and user: + form = UserForm(initial={'nick_name': user.nick_name, + 'link_name': user.link_name}) return response_helpers.respond(request, template, {'template': template, 'form': form, - 'soc_nick_name': soc_user.nick_name}) + 'user': user}) #: POST method form = UserForm() @@ -114,18 +128,46 @@ if form.is_valid(): linkname = form.cleaned_data.get('link_name') nickname = form.cleaned_data.get("nick_name") - if not soc_user: - soc_user = soc.models.user.User(id = user,link_name = linkname, + if not user: + user = soc.models.user.User(id = user,link_name = linkname, nick_name = nickname) else: - soc_user.nick_name = nickname - soc_user.link_name = linkname - soc_user.put() + user.nick_name = nickname + user.link_name = linkname + user.put() return response_helpers.respond(request, template, {'template': template, - 'form': form, - 'soc_nick_name': nickname, - 'submit_message': 'Profile saved.'}) + 'form': form, + 'user': user, + 'submit_message': 'Profile saved.'}) return response_helpers.respond(request, template, {'template': template, 'form': form}) + + +def public(request, linkname=None, + template='soc/user/profile/public.html'): + """A "general public" view of a User on the site. + + Args: + request: the standard django request object. + linkname: the User's site-unique "linkname" extracted from the URL + template: the template path to use for rendering the template. + + Returns: + A subclass of django.http.HttpResponse with generated template. + """ + #: If linkname is empty or not a valid linkname on the site, display + #: "user does not exist", otherwise render public view for linkname user + if linkname: + linkname_user = soc.models.user.User.getUserForLinkname(linkname) + if not linkname_user: + return http.HttpResponseNotFound('No user exists with that link name "%s"' % + linkname) + else: + return response_helpers.respond(request, + template, {'template': template, + 'user': linkname_user}) + + return http.HttpResponseNotFound('No user exists with that link name "%s"' % + linkname)