docs: def register(self):
          """ Registration """
  
          if not __options__.get("allow_registration"):
              abort(403, "Registration is not allowed. Contact admin if it's a mistake")
  
          page_attr("Register")
  
          if request.method == "POST":
              try:
                  if not recaptcha.verify():
                      raise mocha_exc.AppError("Invalid Security code")
  
                  email = request.form.get("email", "").strip()
                  username = request.form.get("username", "").strip()
                  password = request.form.get("password", "").strip()
                  password_confirm = request.form.get("password_confirm", "").strip()
                  first_name = request.form.get("first_name", "").strip()
                  last_name = request.form.get("last_name", "").strip()
  
                  with_oauth = request.form.get("with_oauth") == "1"
                  oauth_provider = request.form.get("oauth_provider")
                  oauth_user_id = request.form.get("oauth_user_id")
  
                  login_method = None
  
                  # Require username and email
                  if __options__.get("registration_username"):
                      if "@" in username:
                          raise exceptions.AuthError(_("Username can't be an email"))
                      if not utils.is_email_valid(email):
                          raise exceptions.AuthError(_("Invalid email address"))
                      login_method = "username"
  
                  # Require only email. Email will be used as username and email
                  elif __options__.get("registration_email"):
                      if not utils.is_email_valid(username):
                          raise exceptions.AuthError(_("Invalid email address"))
                      email = username
                      login_method = "email"
  
                  if not first_name:
                      raise mocha_exc.AppError(
                          _("First Name or Name is required"))
                  elif not password or password != password_confirm:
                      raise mocha_exc.AppError(_("Passwords don't match"))
  
                  if not login_method:
                      raise exceptions.AuthError(_("Registration is disabled"))
  
                  user = create_user(username=username,
                                     password=password,
                                     email=email,
                                     first_name=first_name,
                                     last_name=last_name,
                                     login_method=login_method)
  
                  # WITH OAUTH, we can straight up login user
                  if with_oauth and oauth_provider and oauth_user_id:
                      user.add_federation(oauth_provider, oauth_user_id)
                      create_session(user)
                      return redirect(request.form.get(
                          "next") or views.auth.Account.account_settings)
  
                  if __options__.get("require_email_verification"):
                      user.send_welcome_email(view_class=self)
                      flash_success(_("Please check your email. We've sent you a message"))
  
                  return redirect(
                      request.form.get("next") or __options__.get("login_view"))
  
              except (mocha_exc.AppError, exceptions.AuthError) as ex:
                  flash_error(str(ex))
              except Exception as e:
                  logging.exception(e)
                  flash_error("Unable to register")
              return redirect(self.register, next=request.form.get("next"))
  
          return {
              "reg_email": __options__.get("registration_email"),
              "reg_username": __options__.get("registration_username"),
              "reg_social": __options__.get("registration_social"),
              "reg_full_name": __options__.get("registration_full_name"),
              "login_url_next": request.args.get("next", ""),
  
              "with_oauth": has_oauth_request(),
              "oauth_provider": get_oauth_session().get("provider"),
              "oauth_user_id": get_oauth_session().get("user_id"),
              "email": get_oauth_session().get("email") or "",
              "name": get_oauth_session().get("name") or "",
          }