Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2021-03-23 15:18:03 +01:00
parent adaaef6914
commit 86c2512c62
87 changed files with 7816 additions and 1387 deletions

73
lib/web/email/activity.ex Normal file
View File

@@ -0,0 +1,73 @@
defmodule Mobilizon.Web.Email.Activity do
@moduledoc """
Handles emails sent about activity notifications.
"""
use Bamboo.Phoenix, view: Mobilizon.Web.EmailView
import Bamboo.Phoenix
import Mobilizon.Web.Gettext
alias Mobilizon.Activities.Activity
alias Mobilizon.Actors.Actor
alias Mobilizon.Config
alias Mobilizon.Web.{Email, Gettext}
@spec direct_activity(String.t(), list(), String.t()) ::
Bamboo.Email.t()
def direct_activity(
email,
activities,
locale \\ "en"
) do
Gettext.put_locale(locale)
subject =
gettext(
"Activity notification for %{instance}",
instance: Config.instance_name()
)
chunked_activities = chunk_activities(activities)
Email.base_email(to: email, subject: subject)
|> assign(:locale, locale)
|> assign(:subject, subject)
|> assign(:activities, chunked_activities)
|> assign(:total_number_activities, length(activities))
|> render(:email_direct_activity)
end
@spec chunk_activities(list()) :: map()
defp chunk_activities(activities) do
activities
|> Enum.reduce(%{}, fn %Activity{group: %Actor{id: group_id}} = activity, acc ->
Map.update(acc, group_id, [activity], fn activities -> activities ++ [activity] end)
end)
|> Enum.map(fn {key, value} ->
{key, Enum.sort(value, &(&1.inserted_at <= &2.inserted_at))}
end)
|> Enum.map(fn {key, value} -> {key, filter_duplicates(value)} end)
|> Enum.into(%{})
end
# We filter duplicates when subject_params are being the same
# so it will probably not catch much things
@spec filter_duplicates(list()) :: list()
defp filter_duplicates(activities) do
Enum.uniq_by(activities, fn %Activity{
author: %Actor{id: author_id},
group: %Actor{id: group_id},
type: type,
subject: subject,
subject_params: subject_params
} ->
%{
author_id: author_id,
group_id: group_id,
type: type,
subject: subject,
subject_params: subject_params
}
end)
end
end

View File

@@ -30,6 +30,7 @@ defmodule Mobilizon.Web do
quote do
use Phoenix.View,
root: "lib/web/templates",
pattern: "**/*",
namespace: Mobilizon.Web
# Import convenience functions from controllers

View File

@@ -0,0 +1,70 @@
<%= case @activity.subject do %>
<% :discussion_created -> %>
<%=
dgettext("activity", "%{profile} created the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:discussion,
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["discussion_title"]}
</a>"
}
) |> raw %>
<% :discussion_replied -> %>
<%=
dgettext("activity", "%{profile} replied to the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:discussion,
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["discussion_title"]}
</a>"
}
) |> raw %>
<% :discussion_renamed -> %>
<%=
dgettext("activity", "%{profile} renamed the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:discussion,
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["discussion_title"]}
</a>"
}
) |> raw %>
<% :discussion_archived -> %>
<%=
dgettext("activity", "%{profile} archived the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:discussion,
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["discussion_title"]}
</a>"
}
) |> raw %>
<% :discussion_deleted -> %>
<%=
dgettext("activity", "%{profile} deleted the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<b>#{@activity.subject_params["discussion_title"]}</b>"
}
) |> raw %>
<% end %>

View File

@@ -0,0 +1,30 @@
<%= case @activity.subject do %><% :discussion_created -> %><%= dgettext("activity", "%{profile} created the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_replied -> %><%= dgettext("activity", "%{profile} replied to the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_renamed -> %><%= dgettext("activity", "%{profile} renamed the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_archived -> %><%= dgettext("activity", "%{profile} archived the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_deleted -> %><%= dgettext("activity", "%{profile} deleted the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %><% end %>

View File

@@ -0,0 +1,66 @@
<%= case @activity.subject do %>
<% :discussion_created -> %>
<%=
dgettext("activity", "%{profile} created the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:discussion,
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["discussion_title"]}</a>"
}
) |> raw %>
<% :discussion_replied -> %>
<%=
dgettext("activity", "%{profile} replied to the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:discussion,
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["discussion_title"]}</a>"
}
) |> raw %>
<% :discussion_renamed -> %>
<%=
dgettext("activity", "%{profile} renamed the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:discussion,
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["discussion_title"]}</a>"
}
) |> raw %>
<% :discussion_archived -> %>
<%=
dgettext("activity", "%{profile} archived the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:discussion,
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["discussion_title"]}</a>"
}
) |> raw %>
<% :discussion_deleted -> %>
<%=
dgettext("activity", "%{profile} deleted the discussion %{discussion}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
discussion: "<b>#{@activity.subject_params["discussion_title"]}</b>"
}
) |> raw %>
<% end %>

View File

@@ -0,0 +1,30 @@
<%= case @activity.subject do %><% :discussion_created -> %><%= dgettext("activity", "%{profile} created the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_replied -> %><%= dgettext("activity", "%{profile} replied to the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_renamed -> %><%= dgettext("activity", "%{profile} renamed the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_archived -> %><%= dgettext("activity", "%{profile} archived the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_deleted -> %><%= dgettext("activity", "%{profile} deleted the discussion %{discussion}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
discussion: @activity.subject_params["discussion_title"]
}
) %><% end %>

View File

@@ -0,0 +1,72 @@
<%= case @activity.subject do %>
<% :event_created -> %>
<%=
dgettext("activity", "The event %{event} was created by %{profile}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
event: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:event,
@activity.subject_params["event_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["event_title"]}
</a>"
}
) |> raw %>
<% :event_updated -> %>
<%=
dgettext("activity", "The event %{event} was updated by %{profile}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
event: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:event,
@activity.subject_params["event_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["event_title"]}
</a>"
}
) |> raw %>
<% :event_deleted -> %>
<%=
dgettext("activity", "The event %{event} was deleted by %{profile}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
event: "<b>#{@activity.subject_params["event_title"]}</b>"
}
) |> raw %>
<% :comment_posted -> %>
<%= if @activity.subject_params["comment_reply_to"] do %>
<%=
dgettext("activity", "%{profile} replied to a comment on the event %{event}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
event: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:event,
@activity.subject_params["event_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["event_title"]}
</a>"
}
) |> raw %>
<% else %>
<%=
dgettext("activity", "%{profile} posted a comment on the event %{event}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
event: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:event,
@activity.subject_params["event_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["event_title"]}
</a>"
}
) |> raw %>
<% end %>
<% end %>

View File

@@ -0,0 +1,31 @@
<%= case @activity.subject do %><% :event_created -> %><%= dgettext("activity", "The event %{event} was created by %{profile}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
event: @activity.subject_params["event_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :event, @activity.subject_params["event_uuid"]) |> URI.decode() %><% :event_updated -> %><%= dgettext("activity", "The event %{event} was updated by %{profile}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
event: @activity.subject_params["event_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :event, @activity.subject_params["event_uuid"]) |> URI.decode() %><% :event_deleted -> %><%= dgettext("activity", "The event %{event} was deleted by %{profile}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
event: @activity.subject_params["event_title"]
}
) %>
<% :comment_posted -> %><%= if @activity.subject_params["comment_reply_to"] do %><%= dgettext("activity", "%{profile} replied to a comment on the event %{event}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
event: @activity.subject_params["event_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :event, @activity.subject_params["event_uuid"]) |> URI.decode() %><% else %><%= dgettext("activity", "%{profile} posted a comment on the event %{event}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
event: @activity.subject_params["event_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :event, @activity.subject_params["event_uuid"]) |> URI.decode() %><% end %><% end %>

View File

@@ -0,0 +1,32 @@
<%= case @activity.subject do %>
<% :group_created -> %>
<%=
dgettext("activity", "%{profile} created the group %{group}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
group: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:actor,
@activity.subject_params["group_federated_username"]
) |> URI.decode()}\">
#{@activity.subject_params["group_name"]}
</a>"
}
) |> raw %>
<% :group_updated -> %>
<%=
dgettext("activity", "%{profile} updated the group %{group}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
group: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:actor,
@activity.subject_params["group_federated_username"]
) |> URI.decode()}\">
#{@activity.subject_params["group_name"]}
</a>"
}
) |> raw %>
<% end %>

View File

@@ -0,0 +1,13 @@
<%= case @activity.subject do %><% :group_created -> %><%= dgettext("activity", "%{profile} created the group %{group}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
group: @activity.subject_params["group_name"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :actor, @activity.subject_params["group_federated_username"]) |> URI.decode() %><% :group_updated -> %><%= dgettext("activity", "%{profile} updated the group %{group}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
group: @activity.subject_params["group_name"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :actor, @activity.subject_params["group_federated_username"]) |> URI.decode() %><% end %>

View File

@@ -0,0 +1,69 @@
<%= case @activity.subject do %>
<% :member_request -> %>
<%=
dgettext("activity", "%{member} requested to join the group.",
%{
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
}
) |> raw %>
<% :member_invited -> %>
<%=
dgettext("activity", "%{member} was invited by %{profile}.",
%{
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
}
) |> raw %>
<% :member_accepted_invitation -> %>
<%=
dgettext("activity", "%{member} accepted the invitation to join the group.",
%{
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
}
) |> raw %>
<% :member_rejected_invitation -> %>
<%=
dgettext("activity", "%{member} rejected the invitation to join the group.",
%{
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
}
) |> raw %>
<% :member_joined -> %>
<%=
dgettext("activity", "%{member} joined the group.",
%{
member: "<b title=\"#{@activity.subject_params["member_actor_federated_username"]}\">#{@activity.subject_params["member_actor_name"]}</b>",
}
) |> raw %>
<% :member_added -> %>
<%=
dgettext("activity", "%{profile} added the member %{member}.",
%{
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
}
) |> raw %>
<% :member_updated -> %>
<%=
dgettext("activity", "%{profile} updated the member %{member}.",
%{
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
}
) |> raw %>
<% :member_removed -> %>
<%=
dgettext("activity", "%{profile} excluded member %{member}.",
%{
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
}
) |> raw %>
<% :member_quit -> %>
<%=
dgettext("activity", "%{profile} quit the group.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
}
) |> raw %>
<% end %>

View File

@@ -0,0 +1,49 @@
<%= case @activity.subject do %><% :member_request -> %><%= dgettext("activity", "%{member} requested to join the group.",
%{
member: @activity.subject_params["member_actor_name"],
}
) %>
<% :member_invited -> %><%= dgettext("activity", "%{member} was invited by %{profile}.",
%{
member: @activity.subject_params["member_actor_name"],
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
}
) %>
<% :member_accepted_invitation -> %><%= dgettext("activity", "%{member} accepted the invitation to join the group.",
%{
member: @activity.subject_params["member_actor_name"],
}
) %>
<% :member_rejected_invitation -> %><%= dgettext("activity", "%{member} rejected the invitation to join the group.",
%{
member: @activity.subject_params["member_actor_name"],
}
) %>
<% :member_joined -> %><%= dgettext("activity", "%{member} joined the group.",
%{
member: @activity.subject_params["member_actor_name"],
}
) %>
<% :member_added -> %><%= dgettext("activity", "%{profile} added the member %{member}.",
%{
member: @activity.subject_params["member_actor_name"],
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
}
) %>
<% :member_updated -> %><%= dgettext("activity", "%{profile} updated the member %{member}.",
%{
member: @activity.subject_params["member_actor_name"],
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
}
) %>
<% :member_removed -> %><%= dgettext("activity", "%{profile} excluded member %{member}.",
%{
member: @activity.subject_params["member_actor_name"],
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
}
) %>
<% :member_quit -> %><%= dgettext("activity", "%{profile} quit the group.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
}
) %><% end %>

View File

@@ -0,0 +1,40 @@
<%= case @activity.subject do %>
<% :post_created -> %>
<%=
dgettext("activity", "The post %{post} was created by %{profile}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
post: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:post,
@activity.subject_params["post_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["post_title"]}
</a>"
}
) |> raw %>
<% :post_updated -> %>
<%=
dgettext("activity", "The post %{post} was updated by %{profile}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
post: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:post,
@activity.subject_params["post_slug"]
) |> URI.decode()}\">
#{@activity.subject_params["post_title"]}
</a>"
}
) |> raw %>
<% :post_deleted -> %>
<%=
dgettext("activity", "The post %{post} was deleted by %{profile}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
post: "<b>#{@activity.subject_params["post_title"]}</b>"
}
) |> raw %>
<% end %>

View File

@@ -0,0 +1,18 @@
<%= case @activity.subject do %><% :post_created -> %><%= dgettext("activity", "The post %{post} was created by %{profile}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
post: @activity.subject_params["post_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :post, @activity.subject_params["post_slug"]) |> URI.decode() %><% :post_updated -> %><%= dgettext("activity", "The post %{post} was updated by %{profile}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
post: @activity.subject_params["post_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :post, @activity.subject_params["post_slug"]) |> URI.decode() %><% :post_deleted -> %><%= dgettext("activity", "The post %{post} was deleted by %{profile}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
post: @activity.subject_params["post_title"]
}
) %><% end %>

View File

@@ -0,0 +1,118 @@
<%= case @activity.subject do %>
<% :resource_created -> %>
<%= if @activity.subject_params["is_folder"] do %>
<%=
dgettext("activity", "%{profile} created the folder %{resource}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
resource: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:resource,
@activity.subject_params["resource_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["resource_title"]}
</a>"
}
) |> raw %>
<% else %>
<%=
dgettext("activity", "%{profile} created the resource %{resource}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
resource: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:resource,
@activity.subject_params["resource_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["resource_title"]}
</a>"
}
) |> raw %>
<% end %>
<% :resource_renamed -> %>
<%= if @activity.subject_params["is_folder"] do %>
<%=
dgettext("activity", "%{profile} renamed the folder from %{old_resource_title} to %{resource}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
resource: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:resource,
@activity.subject_params["resource_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["resource_title"]}
</a>",
old_resource_title: "<b>#{@activity.subject_params["old_resource_title"]}</b>"
}
) |> raw %>
<% else %>
<%=
dgettext("activity", "%{profile} renamed the resource from %{old_resource_title} to %{resource}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
resource: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:resource,
@activity.subject_params["resource_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["resource_title"]}
</a>",
old_resource_title: "<b>#{@activity.subject_params["old_resource_title"]}</b>"
}
) |> raw %>
<% end %>
<% :resource_moved -> %>
<%= if @activity.subject_params["is_folder"] do %>
<%=
dgettext("activity", "%{profile} moved the folder %{resource}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
resource: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:resource,
@activity.subject_params["resource_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["resource_title"]}
</a>"
}
) |> raw %>
<% else %>
<%=
dgettext("activity", "%{profile} moved the resource %{resource}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
resource: "<a href=\"#{
page_url(
Mobilizon.Web.Endpoint,
:resource,
@activity.subject_params["resource_uuid"]
) |> URI.decode()}\">
#{@activity.subject_params["resource_title"]}
</a>"
}
) |> raw %>
<% end %>
<% :resource_deleted -> %>
<%= if @activity.subject_params["is_folder"] do %>
<%=
dgettext("activity", "%{profile} deleted the folder %{resource}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
resource: "<b>#{@activity.subject_params["resource_title"]}</b>"
}
) |> raw %>
<% else %>
<%=
dgettext("activity", "%{profile} deleted the resource %{resource}.",
%{
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
resource: "<b>#{@activity.subject_params["resource_title"]}</b>"
}
) |> raw %>
<% end %>
<% end %>

View File

@@ -0,0 +1,50 @@
<%= case @activity.subject do %>
<% :resource_created -> %><%= if @activity.subject_params["is_folder"] do %><%= dgettext("activity", "%{profile} created the folder %{resource}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
resource: @activity.subject_params["resource_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% else %><%= dgettext("activity", "%{profile} created the resource %{resource}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
resource: @activity.subject_params["resource_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% end %><% :resource_renamed -> %><%= if @activity.subject_params["is_folder"] do %><%= dgettext("activity", "%{profile} renamed the folder from %{old_resource_title} to %{resource}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
resource: @activity.subject_params["resource_title"],
old_resource_title: @activity.subject_params["old_resource_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% else %><%= dgettext("activity", "%{profile} renamed the resource from %{old_resource_title} to %{resource}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
resource: @activity.subject_params["resource_title"],
old_resource_title: @activity.subject_params["old_resource_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% end %><% :resource_moved -> %><%= if @activity.subject_params["is_folder"] do %><%= dgettext("activity", "%{profile} moved the folder %{resource}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
resource: @activity.subject_params["resource_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% else %><%= dgettext("activity", "%{profile} moved the resource %{resource}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
resource: @activity.subject_params["resource_title"]
}
) %>
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% end %><% :resource_deleted -> %><%= if @activity.subject_params["is_folder"] do %><%= dgettext("activity", "%{profile} deleted the folder %{resource}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
resource: @activity.subject_params["resource_title"]
}
) %><% else %><%= dgettext("activity", "%{profile} deleted the resource %{resource}.",
%{
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
resource: @activity.subject_params["resource_title"]
}
) %><% end %><% end %>

View File

@@ -10,14 +10,15 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style type="text/css">
/* CLIENT-SPECIFIC STYLES */
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
* { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
table, td { mso-table-lspace: 0pt !important; mso-table-rspace: 0pt !important; }
img { -ms-interpolation-mode: bicubic; }
/* RESET STYLES */
img { border: 0; height: auto; line-height: 100%; outline: none; text-decoration: none; }
table { border-collapse: collapse !important; }
body { height: 100% !important; margin: 0 !important; padding: 0 !important; width: 100% !important; }
table { border-spacing: 0 !important; border-collapse: collapse !important; table-layout: fixed !important; margin: 0 auto !important; }
table table table { table-layout: auto; }
html, body { height: 100% !important; margin: 0 !important; padding: 0 !important; width: 100% !important; }
/* iOS BLUE LINKS */
a[x-apple-data-detectors] {
@@ -41,7 +42,7 @@
div[style*="margin: 16px 0;"] { margin: 0 !important; }
</style>
</head>
<body style="background-color: #ECEBF2; margin: 0 !important; padding: 0 !important;">
<body style="background-color: #ECEBF2; margin: 0 !important; padding: 0 !important;mso-line-height-rule: exactly;">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<!-- LOGO -->
<tr>

View File

@@ -0,0 +1,151 @@
<!-- HERO -->
<tr>
<td bgcolor="#474467" align="center" style="padding: 0px 10px 0px 10px;">
<!--[if (gte mso 9)|(IE)]>
<table align="center" border="0" cellspacing="0" cellpadding="0" width="600">
<tr>
<td align="center" valign="top" width="600">
<![endif]-->
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 600px;" >
<tr>
<td bgcolor="#ffffff" align="center" valign="top" style="padding: 40px 20px 20px 20px; border-radius: 4px 4px 0px 0px; color: #3A384C; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 48px; font-weight: 400; line-height: 48px;">
<h1 style="font-size: 48px; font-weight: 400; margin: 0;">
<%= @subject %>
</h1>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<!-- COPY BLOCK -->
<tr>
<td bgcolor="#E6E4F4" align="center" style="padding: 0px 10px 0px 10px;">
<!--[if (gte mso 9)|(IE)]>
<table align="center" border="0" cellspacing="0" cellpadding="0" width="600">
<tr>
<td align="center" valign="top" width="600">
<![endif]-->
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 600px;" >
<!-- COPY -->
<tr>
<td bgcolor="#ffffff" align="left" style="padding: 20px 5% 0px; color: #474467; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0;">
<%= dngettext("activity", "There has been an activity!", "There has been some activity!", @total_number_activities) %>
</p>
</td>
</tr>
<tr>
<td bgcolor="#ffffff" align="left">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" style="border-radius: 3px; text-align: left; padding: 10px 5% 0px 30px; color: #474467; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 16px; font-weight: 400;line-height: 25px;" >
<ul style="margin: 0 auto; padding-left: 15px;">
<%= for {_, group_activities} <- @activities do %>
<li style="list-style: none;border-bottom: solid 2px #d7d6de;padding: 10px 0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td align="left">
<table align="left">
<tr>
<%= if hd(group_activities).group.avatar do %>
<td width="85">
<a href="<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>" target="_blank" style="text-decoration: none;">
<img width="80" src="<%= hd(group_activities).group.avatar.url %>" style="width: 80px;max-height: 100px;" style="margin:0; padding:0; border:none; display:block;" border="0" alt="" />
</a>
</td>
<% end %>
<td width="400">
<table width="" cellpadding="0" cellspacing="0" border="0" style="max-width: 400px;width: 100%;" align="left">
<tr>
<td align="left">
<a href="<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>" target="_blank" style="text-decoration: none;color: #474467;font-family: 'Roboto', Helvetica, Arial, sans-serif;font-size: 18px;font-weight: bold;line-height: 25px;">
<%= hd(group_activities).group.name || "@#{Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)}" %>
</a>
</td>
</tr>
<%= if hd(group_activities).group.name do %>
<tr>
<td align="left">
<a href="<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>" target="_blank" style="text-decoration: none;display: block;color: #7a7a7a;font-family: 'Roboto', Helvetica, Arial, sans-serif;font-size: 16px;font-weight: 400;line-height: 25px;">
@<%= Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group) %>
</a>
</td>
</tr>
<% end %>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<ul style="padding-left: 25px;margin-top: 10px;">
<%= for activity <- Enum.take(group_activities, 5) do %>
<li style="margin-bottom: 7px;">
<p style="margin: 0;">
<%= case activity.type do %>
<% :discussion -> %>
<%= render("activity/_discussion_activity_item.html", activity: activity) %>
<% :event -> %>
<%= render("activity/_event_activity_item.html", activity: activity) %>
<% :group -> %>
<%= render("activity/_group_activity_item.html", activity: activity) %>
<% :member -> %>
<%= render("activity/_member_activity_item.html", activity: activity) %>
<% :post -> %>
<%= render("activity/_post_activity_item.html", activity: activity) %>
<% :resource -> %>
<%= render("activity/_resource_activity_item.html", activity: activity) %>
<% :comment -> %>
<%= render("activity/_comment_activity_item.html", activity: activity) %>
<% end %>
</p>
<em><%= datetime_relative(activity.inserted_at, @locale) %></em>
</li>
<% end %>
</ul>
<%= if length(group_activities) > 5 do %>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td bgcolor="#ffffff" align="center" style="padding: 20px 30px;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" style="border-radius: 3px;" bgcolor="#3C376E">
<a href="<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>/timeline" target="_blank" style="font-size: 20px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; padding: 15px 25px; border-radius: 2px; border: 1px solid #3C376E; display: inline-block;">
<%= dngettext "activity", "View one more activity", "View %{count} more activities", length(group_activities) - 5, %{count: length(group_activities) - 5} %>
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<% end %>
</li>
<% end %>
</ul>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="#ffffff" align="left" style="padding: 20px 30px 40px 30px; color: #474467; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 20px;" >
<p style="margin: 0">
<%= dgettext "activity", "Don't want to receive activity notifications? You may change frequency or disable them in your settings." %>
</p>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>

View File

@@ -0,0 +1,21 @@
<%= @subject %>
==
<%= dngettext("activity", "There has been an activity!", "There has been some activity!", @total_number_activities) %>
<%= for {_, group_activities} <- @activities do %>
==
<%= hd(group_activities).group.name || "@#{Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)}" %>
<%= for activity <- Enum.take(group_activities, 5) do %>
* <%= case activity.type do %><% :discussion -> %><%= render("activity/_discussion_activity_item.text", activity: activity) %><% :event -> %><%= render("activity/_event_activity_item.text", activity: activity) %><% :group -> %><%= render("activity/_group_activity_item.text", activity: activity) %>
<% :member -> %><%= render("activity/_member_activity_item.text", activity: activity) %><% :post -> %><%= render("activity/_post_activity_item.text", activity: activity) %><% :resource -> %><%= render("activity/_resource_activity_item.text", activity: activity) %><% :comment -> %><%= render("activity/_comment_activity_item.text", activity: activity) %><% end %>
<%= datetime_relative(activity.inserted_at, @locale) %>
<% end %>
<%= if length(group_activities) > 5 do %>
<%= dngettext "activity", "View one more activity", "View %{count} more activities", length(group_activities) - 5, %{count: length(group_activities) - 5} %>
<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>/timeline
<% end %>
<% end %>
<%= dgettext("activity", "Don't want to receive activity notifications? You may change frequency or disable them in your settings.") %>

View File

@@ -1,6 +1,7 @@
defmodule Mobilizon.Web.EmailView do
use Mobilizon.Web, :view
alias Cldr.DateTime.Relative
import Mobilizon.Web.Gettext
def datetime_to_string(%DateTime{} = datetime, locale \\ "en", format \\ :medium) do
@@ -27,4 +28,12 @@ defmodule Mobilizon.Web.EmailView do
datetime
end
end
@spec datetime_relative(DateTime.t(), String.t()) :: String.t()
def datetime_relative(%DateTime{} = datetime, locale \\ "en") do
Relative.to_string!(datetime, Mobilizon.Cldr,
relative_to: DateTime.utc_now(),
locale: locale
)
end
end