Add languages to admin settings

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2020-10-07 15:37:23 +02:00
parent 17786b025a
commit 586d8c440d
15 changed files with 179 additions and 22 deletions

View File

@@ -8,6 +8,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
alias Mobilizon.{Actors, Admin, Config, Events}
alias Mobilizon.Actors.Actor
alias Mobilizon.Admin.{ActionLog, Setting}
alias Mobilizon.Cldr.Language
alias Mobilizon.Config
alias Mobilizon.Discussions.Comment
alias Mobilizon.Events.Event
@@ -156,6 +157,19 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
end
end
def get_list_of_languages(_parent, _args, _resolution) do
locale = Gettext.get_locale()
case Language.known_languages(locale) do
data when is_map(data) ->
data = Enum.map(data, fn {code, elem} -> %{code: code, name: elem.standard} end)
{:ok, data}
{:error, err} ->
{:error, err}
end
end
def get_dashboard(_parent, _args, %{context: %{current_user: %User{role: role}}})
when is_admin(role) do
last_public_event_published =
@@ -202,11 +216,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
res <-
res
|> Enum.map(fn {key, %Setting{value: value}} ->
case value do
"true" -> {key, true}
"false" -> {key, false}
value -> {key, value}
end
{key, Admin.get_setting_value(value)}
end)
|> Enum.into(%{}),
:ok <- eventually_update_instance_actor(res) do

View File

@@ -75,6 +75,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do
demo_mode: Config.instance_demo_mode?(),
description: Config.instance_description(),
long_description: Config.instance_long_description(),
languages: Config.instance_languages(),
anonymous: %{
participation: %{
allowed: Config.anonymous_participation?(),

View File

@@ -64,6 +64,11 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do
end)
end
object :language do
field(:code, :string, description: "The iso-639-3 language code")
field(:name, :string, description: "The language name")
end
object :dashboard do
field(:last_public_event_published, :event, description: "Last public event publish")
field(:number_of_users, :integer, description: "The number of local users")
@@ -85,6 +90,7 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do
field(:instance_privacy_policy_url, :string)
field(:instance_rules, :string)
field(:registrations_open, :boolean)
field(:instance_languages, list_of(:string))
end
enum :instance_terms_type do
@@ -107,6 +113,10 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do
resolve(&Admin.list_action_logs/3)
end
field :languages, type: list_of(:language) do
resolve(&Admin.get_list_of_languages/3)
end
field :dashboard, type: :dashboard do
resolve(&Admin.get_dashboard/3)
end
@@ -172,6 +182,7 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do
arg(:instance_privacy_policy_url, :string)
arg(:instance_rules, :string)
arg(:registrations_open, :boolean)
arg(:instance_languages, list_of(:string))
resolve(&Admin.save_settings/3)
end

View File

@@ -14,6 +14,7 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do
field(:long_description, :string)
field(:contact, :string)
field(:languages, list_of(:string))
field(:registrations_open, :boolean)
field(:registrations_allowlist, :boolean)
field(:demo_mode, :boolean)

View File

@@ -80,10 +80,31 @@ defmodule Mobilizon.Admin do
def get_admin_setting_value(group, name, fallback \\ nil)
when is_bitstring(group) and is_bitstring(name) do
case Repo.get_by(Setting, group: group, name: name) do
nil -> fallback
%Setting{value: ""} -> fallback
%Setting{value: nil} -> fallback
%Setting{value: value} -> value
nil ->
fallback
%Setting{value: ""} ->
fallback
%Setting{value: nil} ->
fallback
%Setting{value: value} ->
get_setting_value(value)
end
end
def get_setting_value(value) do
case Jason.decode(value) do
{:ok, val} ->
val
{:error, _} ->
case value do
"true" -> true
"false" -> false
value -> value
end
end
end
@@ -116,7 +137,7 @@ defmodule Mobilizon.Admin do
Setting.changeset(%Setting{}, %{
group: group,
name: Atom.to_string(key),
value: to_string(val)
value: convert_to_string(val)
}),
on_conflict: :replace_all,
conflict_target: [:group, :name]
@@ -124,4 +145,11 @@ defmodule Mobilizon.Admin do
do_save_setting(transaction, group, rest)
end
defp convert_to_string(val) do
case val do
val when is_list(val) -> Jason.encode!(val)
val -> to_string(val)
end
end
end

View File

@@ -5,5 +5,5 @@ defmodule Mobilizon.Cldr do
use Cldr,
locales: ["cs", "de", "en", "es", "fr", "it", "ja", "nl", "pl", "pt", "ru"],
providers: [Cldr.Number, Cldr.Calendar, Cldr.DateTime]
providers: [Cldr.Number, Cldr.Calendar, Cldr.DateTime, Cldr.Language]
end

View File

@@ -99,6 +99,15 @@ defmodule Mobilizon.Config do
)
)
@spec instance_languages :: list(String.t())
def instance_languages,
do:
Mobilizon.Admin.get_admin_setting_value(
"instance",
"instance_languages",
instance_config()[:languages]
)
@spec instance_registrations_allowlist :: list(String.t())
def instance_registrations_allowlist, do: instance_config()[:registration_email_allowlist]
@@ -319,7 +328,8 @@ defmodule Mobilizon.Config do
instance_privacy_policy: instance_privacy(),
instance_privacy_policy_type: instance_privacy_type(),
instance_privacy_policy_url: instance_privacy_url(),
instance_rules: instance_rules()
instance_rules: instance_rules(),
instance_languages: instance_languages()
}
end