code: def profile(request, status=200):
      if request.method == 'GET':
          if request.GET.get("username", False):
              try:
                  user_profile = User.objects.get(username=request.GET.get("username"),
                                                  userprofile__public=True).userprofile
              except ObjectDoesNotExist:
                  raise Http404("user not found or have not public profile")
          else:
              user_id = get_user_id(request)
              if get_config('proso_user', 'google.openid.migration', default=True) and not is_user_id_overridden(request):
                  migrated_user = migrate_google_openid_user(request.user)
                  if migrated_user is not None:
                      auth.logout(request)
                      migrated_user.backend = 'social.backends.google.GoogleOAuth2'
                      auth.login(request, migrated_user)
              user_profile = get_object_or_404(UserProfile, user_id=user_id)
          return render_json(
              request, user_profile, status=status,
              template='user_profile.html', help_text=profile.__doc__)
      elif request.method == 'POST':
          with transaction.atomic():
              to_save = json_body(request.body.decode("utf-8"))
              user_id = get_user_id(request)
              user_profile = get_object_or_404(UserProfile, user_id=user_id)
              user = to_save.get('user', None)
              if 'send_emails' in to_save:
                  user_profile.send_emails = bool(to_save['send_emails'])
              if 'public' in to_save:
                  user_profile.public = bool(to_save['public'])
              if user:
                  error = _save_user(request, user, new=False)
                  if error:
                      return render_json(request, error, template='user_json.html', status=400)
              if 'properties' in to_save:
                  user_profile.save_properties(to_save['properties'])
              user_profile.save()
          request.method = "GET"
          return profile(request, status=202)
      else:
          return HttpResponseBadRequest("method %s is not allowed".format(request.method))