docs: def profile(request, status=200):
      """
      Get the user's profile. If the user has no assigned profile, the HTTP 404
      is returned. Make a POST request to modify the user's profile.
  
      GET parameters:
          html
              turn on the HTML version of the API
          username:
              username of user (only for users with public profile)
          stats:
              attache addition user statistics
  
      POST parameters (JSON):
          send_emails:
              switcher turning on sending e-mails to user
          public:
              swicher making the user's profile publicly available
          user:
              password:
                  user's password
              password_check:
                  user's password again to check it
              first_name (optional):
                  user's first name
              last_name (optional):
                  user's last name
      """
      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))