User: Add raw_bio, storing unformatted bio
Related: https://git.pleroma.social/pleroma/pleroma/issues/1643
This commit is contained in:
parent
d74985af23
commit
e1b07402ab
8 changed files with 61 additions and 19 deletions
|
@ -79,6 +79,7 @@ defmodule Pleroma.User do
|
||||||
|
|
||||||
schema "users" do
|
schema "users" do
|
||||||
field(:bio, :string)
|
field(:bio, :string)
|
||||||
|
field(:raw_bio, :string)
|
||||||
field(:email, :string)
|
field(:email, :string)
|
||||||
field(:name, :string)
|
field(:name, :string)
|
||||||
field(:nickname, :string)
|
field(:nickname, :string)
|
||||||
|
@ -432,6 +433,7 @@ def update_changeset(struct, params \\ %{}) do
|
||||||
params,
|
params,
|
||||||
[
|
[
|
||||||
:bio,
|
:bio,
|
||||||
|
:raw_bio,
|
||||||
:name,
|
:name,
|
||||||
:emoji,
|
:emoji,
|
||||||
:avatar,
|
:avatar,
|
||||||
|
@ -607,7 +609,16 @@ def register_changeset(struct, params \\ %{}, opts \\ []) do
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|> confirmation_changeset(need_confirmation: need_confirmation?)
|
|> confirmation_changeset(need_confirmation: need_confirmation?)
|
||||||
|> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation, :emoji])
|
|> cast(params, [
|
||||||
|
:bio,
|
||||||
|
:raw_bio,
|
||||||
|
:email,
|
||||||
|
:name,
|
||||||
|
:nickname,
|
||||||
|
:password,
|
||||||
|
:password_confirmation,
|
||||||
|
:emoji
|
||||||
|
])
|
||||||
|> validate_required([:name, :nickname, :password, :password_confirmation])
|
|> validate_required([:name, :nickname, :password, :password_confirmation])
|
||||||
|> validate_confirmation(:password)
|
|> validate_confirmation(:password)
|
||||||
|> unique_constraint(:email)
|
|> unique_constraint(:email)
|
||||||
|
|
|
@ -165,6 +165,7 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p
|
||||||
end)
|
end)
|
||||||
|> Maps.put_if_present(:name, params[:display_name])
|
|> Maps.put_if_present(:name, params[:display_name])
|
||||||
|> Maps.put_if_present(:bio, params[:note])
|
|> Maps.put_if_present(:bio, params[:note])
|
||||||
|
|> Maps.put_if_present(:raw_bio, params[:note])
|
||||||
|> Maps.put_if_present(:avatar, params[:avatar])
|
|> Maps.put_if_present(:avatar, params[:avatar])
|
||||||
|> Maps.put_if_present(:banner, params[:header])
|
|> Maps.put_if_present(:banner, params[:header])
|
||||||
|> Maps.put_if_present(:background, params[:pleroma_background_image])
|
|> Maps.put_if_present(:background, params[:pleroma_background_image])
|
||||||
|
|
|
@ -224,7 +224,7 @@ defp do_render("show.json", %{user: user} = opts) do
|
||||||
fields: user.fields,
|
fields: user.fields,
|
||||||
bot: bot,
|
bot: bot,
|
||||||
source: %{
|
source: %{
|
||||||
note: prepare_user_bio(user),
|
note: user.raw_bio || "",
|
||||||
sensitive: false,
|
sensitive: false,
|
||||||
fields: user.raw_fields,
|
fields: user.raw_fields,
|
||||||
pleroma: %{
|
pleroma: %{
|
||||||
|
@ -259,17 +259,6 @@ defp do_render("show.json", %{user: user} = opts) do
|
||||||
|> maybe_put_unread_notification_count(user, opts[:for])
|
|> maybe_put_unread_notification_count(user, opts[:for])
|
||||||
end
|
end
|
||||||
|
|
||||||
defp prepare_user_bio(%User{bio: ""}), do: ""
|
|
||||||
|
|
||||||
defp prepare_user_bio(%User{bio: bio}) when is_binary(bio) do
|
|
||||||
bio
|
|
||||||
|> String.replace(~r(<br */?>), "\n")
|
|
||||||
|> Pleroma.HTML.strip_tags()
|
|
||||||
|> HtmlEntities.decode()
|
|
||||||
end
|
|
||||||
|
|
||||||
defp prepare_user_bio(_), do: ""
|
|
||||||
|
|
||||||
defp username_from_nickname(string) when is_binary(string) do
|
defp username_from_nickname(string) when is_binary(string) do
|
||||||
hd(String.split(string, "@"))
|
hd(String.split(string, "@"))
|
||||||
end
|
end
|
||||||
|
|
9
priv/repo/migrations/20200322174133_user_raw_bio.exs
Normal file
9
priv/repo/migrations/20200322174133_user_raw_bio.exs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.UserRawBio do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:users) do
|
||||||
|
add_if_not_exists(:raw_bio, :text)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,25 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.PopulateUserRawBio do
|
||||||
|
use Ecto.Migration
|
||||||
|
import Ecto.Query
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Repo
|
||||||
|
|
||||||
|
def change do
|
||||||
|
{:ok, _} = Application.ensure_all_started(:fast_sanitize)
|
||||||
|
|
||||||
|
User.Query.build(%{local: true})
|
||||||
|
|> select([u], struct(u, [:id, :ap_id, :bio]))
|
||||||
|
|> Repo.stream()
|
||||||
|
|> Enum.each(fn %{bio: bio} = user ->
|
||||||
|
if bio do
|
||||||
|
raw_bio =
|
||||||
|
bio
|
||||||
|
|> String.replace(~r(<br */?>), "\n")
|
||||||
|
|> Pleroma.HTML.strip_tags()
|
||||||
|
|
||||||
|
Ecto.Changeset.cast(user, %{raw_bio: raw_bio}, [:raw_bio])
|
||||||
|
|> Repo.update()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
|
@ -42,7 +42,8 @@ def user_factory do
|
||||||
user
|
user
|
||||||
| ap_id: User.ap_id(user),
|
| ap_id: User.ap_id(user),
|
||||||
follower_address: User.ap_followers(user),
|
follower_address: User.ap_followers(user),
|
||||||
following_address: User.ap_following(user)
|
following_address: User.ap_following(user),
|
||||||
|
raw_bio: user.bio
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -83,10 +83,9 @@ test "sets user settings in a generic way", %{conn: conn} do
|
||||||
test "updates the user's bio", %{conn: conn} do
|
test "updates the user's bio", %{conn: conn} do
|
||||||
user2 = insert(:user)
|
user2 = insert(:user)
|
||||||
|
|
||||||
conn =
|
raw_bio = "I drink #cofe with @#{user2.nickname}\n\nsuya.."
|
||||||
patch(conn, "/api/v1/accounts/update_credentials", %{
|
|
||||||
"note" => "I drink #cofe with @#{user2.nickname}\n\nsuya.."
|
conn = patch(conn, "/api/v1/accounts/update_credentials", %{"note" => raw_bio})
|
||||||
})
|
|
||||||
|
|
||||||
assert user_data = json_response_and_validate_schema(conn, 200)
|
assert user_data = json_response_and_validate_schema(conn, 200)
|
||||||
|
|
||||||
|
@ -94,6 +93,12 @@ test "updates the user's bio", %{conn: conn} do
|
||||||
~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe">#cofe</a> with <span class="h-card"><a class="u-url mention" data-user="#{
|
~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe">#cofe</a> with <span class="h-card"><a class="u-url mention" data-user="#{
|
||||||
user2.id
|
user2.id
|
||||||
}" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span><br/><br/>suya..)
|
}" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span><br/><br/>suya..)
|
||||||
|
|
||||||
|
assert user_data["source"]["note"] == raw_bio
|
||||||
|
|
||||||
|
user = Repo.get(User, user_data["id"])
|
||||||
|
|
||||||
|
assert user.raw_bio == raw_bio
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates the user's locking status", %{conn: conn} do
|
test "updates the user's locking status", %{conn: conn} do
|
||||||
|
|
|
@ -33,7 +33,8 @@ test "Represent a user account" do
|
||||||
bio:
|
bio:
|
||||||
"<script src=\"invalid-html\"></script><span>valid html</span>. a<br>b<br/>c<br >d<br />f '&<>\"",
|
"<script src=\"invalid-html\"></script><span>valid html</span>. a<br>b<br/>c<br >d<br />f '&<>\"",
|
||||||
inserted_at: ~N[2017-08-15 15:47:06.597036],
|
inserted_at: ~N[2017-08-15 15:47:06.597036],
|
||||||
emoji: %{"karjalanpiirakka" => "/file.png"}
|
emoji: %{"karjalanpiirakka" => "/file.png"},
|
||||||
|
raw_bio: "valid html. a\nb\nc\nd\nf '&<>\""
|
||||||
})
|
})
|
||||||
|
|
||||||
expected = %{
|
expected = %{
|
||||||
|
|
Loading…
Reference in a new issue