From 1b1a89cc709dfd125f46b8eae51d136db25040e2 Mon Sep 17 00:00:00 2001 From: Antoine Augusti Date: Tue, 26 Dec 2023 14:38:07 +0100 Subject: [PATCH 1/5] Add a link to the producer space in the dropdown menu --- apps/shared/lib/helpers.ex | 9 ---- .../dataset_now_on_nap_notification_job.ex | 3 +- apps/transport/lib/transport_web.ex | 1 + .../controllers/session_controller.ex | 50 +++++++++++++------ apps/transport/lib/transport_web/router.ex | 9 ++-- .../dataset/_dataset_scores_chart.html.heex | 2 +- .../templates/dataset/details.html.heex | 2 +- .../templates/dataset/index.html.heex | 2 +- .../email/dataset_now_on_nap.html.md | 2 +- .../email/producer_with_subscriptions.html.md | 2 +- .../producer_without_subscriptions.html.md | 2 +- .../resource_unavailable_producer.html.md | 2 +- .../templates/layout/_header.html.heex | 7 ++- .../page/infos_producteurs.html.heex | 2 +- .../lib/transport_web/views/email_view.ex | 8 +++ apps/transport/priv/gettext/default.pot | 4 ++ .../priv/gettext/en/LC_MESSAGES/default.po | 4 ++ .../priv/gettext/fr/LC_MESSAGES/default.po | 4 ++ apps/transport/test/support/conn_case.ex | 9 +--- ...taset_now_on_nap_notification_job_test.exs | 2 +- ...minder_producers_notification_job_test.exs | 2 +- ...urce_unavailable_notification_job_test.exs | 2 +- .../backoffice/backoffice_controller_test.exs | 12 ++--- .../broken_urls_controller_test.exs | 15 +----- .../controllers/page_controller_test.exs | 31 ++++++++++-- .../controllers/session_controller_test.exs | 30 ++++++++--- 26 files changed, 136 insertions(+), 82 deletions(-) diff --git a/apps/shared/lib/helpers.ex b/apps/shared/lib/helpers.ex index fc224103e7..f1ba55eff4 100644 --- a/apps/shared/lib/helpers.ex +++ b/apps/shared/lib/helpers.ex @@ -57,13 +57,4 @@ defmodule Helpers do dates -> dates |> Enum.max(DateTime) |> DateTime.to_iso8601() end end - - @spec admin?(map | nil) :: boolean - def admin?(%{} = user) do - user - |> Map.get("organizations", []) - |> Enum.any?(fn org -> org["slug"] == "equipe-transport-data-gouv-fr" end) - end - - def admin?(nil), do: false end diff --git a/apps/transport/lib/jobs/dataset_now_on_nap_notification_job.ex b/apps/transport/lib/jobs/dataset_now_on_nap_notification_job.ex index c7b133f52f..67f57f5f0f 100644 --- a/apps/transport/lib/jobs/dataset_now_on_nap_notification_job.ex +++ b/apps/transport/lib/jobs/dataset_now_on_nap_notification_job.ex @@ -27,8 +27,7 @@ defmodule Transport.Jobs.DatasetNowOnNAPNotificationJob do Phoenix.View.render_to_string(TransportWeb.EmailView, "dataset_now_on_nap.html", dataset_url: TransportWeb.Router.Helpers.dataset_url(TransportWeb.Endpoint, :details, dataset.slug), dataset_custom_title: dataset.custom_title, - contact_email_address: Application.get_env(:transport, :contact_email), - espace_producteur_url: TransportWeb.Router.Helpers.page_url(TransportWeb.Endpoint, :espace_producteur) + contact_email_address: Application.get_env(:transport, :contact_email) ) ) diff --git a/apps/transport/lib/transport_web.ex b/apps/transport/lib/transport_web.ex index 5a7a64b74a..a263eb9efc 100644 --- a/apps/transport/lib/transport_web.ex +++ b/apps/transport/lib/transport_web.ex @@ -42,6 +42,7 @@ defmodule TransportWeb do use TransportWeb.InputHelpers import TransportWeb.Router.Helpers + import TransportWeb.Router, only: [is_transport_data_gouv_member?: 1] import TransportWeb.ErrorHelpers import TransportWeb.InputHelpers import TransportWeb.Gettext diff --git a/apps/transport/lib/transport_web/controllers/session_controller.ex b/apps/transport/lib/transport_web/controllers/session_controller.ex index 84a517089a..c13eb394ba 100644 --- a/apps/transport/lib/transport_web/controllers/session_controller.ex +++ b/apps/transport/lib/transport_web/controllers/session_controller.ex @@ -4,6 +4,7 @@ defmodule TransportWeb.SessionController do """ use TransportWeb, :controller alias Datagouvfr.Authentication + import Ecto.Query require Logger def new(conn, _) do @@ -127,24 +128,45 @@ defmodule TransportWeb.SessionController do end def save_current_user(%Plug.Conn{} = conn, %{} = user_params) do - conn |> put_session(:current_user, user_params |> user_params_for_session()) + conn |> put_session(:current_user, user_params_for_session(user_params)) + end + + def user_params_for_session(%{} = params) do + params + # Remove the list of `organizations` from the final map: it's already stored in the database + # and maintained up-to-date by `Transport.Jobs.UpdateContactsJob` + # and it can be too big to be stored in a cookie + |> Map.delete("organizations") + # - `is_admin` is needed to check permissions + # - `is_producer` is used to get access to the "Espace producteur" + |> Map.merge(%{"is_producer" => is_producer?(params), "is_admin" => is_admin?(params)}) end @doc """ - iex> pan_org = %{"slug" => "equipe-transport-data-gouv-fr", "name" => "PAN"} - iex> other_org = %{"slug" => "foo-inc", "name" => "Foo Inc"} - iex> user_params_for_session(%{"foo" => "bar", "organizations" => [pan_org, other_org]}) - %{"foo" => "bar", "organizations" => [pan_org]} + Are you a data producer? + You're a data producer if you're a member of an organization with an active dataset + on transport.data.gouv.fr. + This is set when you log in, we can refresh this field more often in the future. """ - def user_params_for_session(%{} = params) do - Map.put( - params, - "organizations", - Enum.filter( - params["organizations"], - &match?(%{"slug" => "equipe-transport-data-gouv-fr"}, &1) - ) - ) + def is_producer?(%{"organizations" => orgs}) do + org_ids = Enum.map(orgs, & &1["id"]) + + DB.Dataset.base_query() |> where([dataset: d], d.organization_id in ^org_ids) |> DB.Repo.exists?() + end + + @doc """ + Are you a transport.data.gouv.fr admin? + You're an admin if you're a member of the PAN organization on data.gouv.fr. + + iex> is_admin?(%{"organizations" => [%{"slug" => "equipe-transport-data-gouv-fr"}, %{"slug" => "foo"}]}) + true + iex> is_admin?(%{"organizations" => [%{"slug" => "foo"}]}) + false + iex> is_admin?(%{"organizations" => []}) + false + """ + def is_admin?(%{"organizations" => orgs}) do + Enum.any?(orgs, &(&1["slug"] == "equipe-transport-data-gouv-fr")) end defp get_redirect_path(%Plug.Conn{} = conn) do diff --git a/apps/transport/lib/transport_web/router.ex b/apps/transport/lib/transport_web/router.ex index fb968c2c3c..6268012abe 100644 --- a/apps/transport/lib/transport_web/router.ex +++ b/apps/transport/lib/transport_web/router.ex @@ -314,6 +314,7 @@ defmodule TransportWeb.Router do end defp assign_current_user(conn, _) do + # `current_user` is set by TransportWeb.SessionController.user_params_for_session/1 assign(conn, :current_user, get_session(conn, :current_user)) end @@ -353,11 +354,9 @@ defmodule TransportWeb.Router do end # NOTE: method visibility set to public because we need to call the same logic from LiveView - def is_transport_data_gouv_member?(current_user) do - current_user - |> Map.get("organizations", []) - |> Enum.any?(fn org -> org["slug"] == "equipe-transport-data-gouv-fr" end) - end + # `current_user` is set by TransportWeb.SessionController.user_params_for_session/1 + def is_transport_data_gouv_member?(%{"is_admin" => true} = _current_user), do: true + def is_transport_data_gouv_member?(_), do: false # Check that a secret key is passed in the URL in the `export_key` query parameter defp check_export_secret_key(%Plug.Conn{params: params} = conn, _) do diff --git a/apps/transport/lib/transport_web/templates/dataset/_dataset_scores_chart.html.heex b/apps/transport/lib/transport_web/templates/dataset/_dataset_scores_chart.html.heex index ecd59d75fa..beae528280 100644 --- a/apps/transport/lib/transport_web/templates/dataset/_dataset_scores_chart.html.heex +++ b/apps/transport/lib/transport_web/templates/dataset/_dataset_scores_chart.html.heex @@ -1,4 +1,4 @@ -
+

<%= dgettext("page-dataset-details", "Dataset scores") %>

diff --git a/apps/transport/lib/transport_web/templates/dataset/details.html.heex b/apps/transport/lib/transport_web/templates/dataset/details.html.heex index b974b4e859..2aa60c82f8 100644 --- a/apps/transport/lib/transport_web/templates/dataset/details.html.heex +++ b/apps/transport/lib/transport_web/templates/dataset/details.html.heex @@ -16,7 +16,7 @@

<%= @dataset.custom_title %>

- <%= if admin?(assigns[:current_user]) do %> + <%= if is_transport_data_gouv_member?(assigns[:current_user]) do %> <%= link("backoffice", to: backoffice_page_path(@conn, :edit, @dataset.id)) %> <%= render("_dataset_scores.html", dataset_scores: @dataset_scores, locale: locale) %> diff --git a/apps/transport/lib/transport_web/templates/dataset/index.html.heex b/apps/transport/lib/transport_web/templates/dataset/index.html.heex index b483ecb67c..110a4544bc 100644 --- a/apps/transport/lib/transport_web/templates/dataset/index.html.heex +++ b/apps/transport/lib/transport_web/templates/dataset/index.html.heex @@ -183,7 +183,7 @@ <%= dataset.custom_title %> - <%= if admin?(assigns[:current_user]) do %> + <%= if is_transport_data_gouv_member?(assigns[:current_user]) do %> <%= link("backoffice", to: backoffice_page_path(@conn, :edit, dataset.id)) %> diff --git a/apps/transport/lib/transport_web/templates/email/dataset_now_on_nap.html.md b/apps/transport/lib/transport_web/templates/email/dataset_now_on_nap.html.md index 2a317c8305..3df930b83a 100644 --- a/apps/transport/lib/transport_web/templates/email/dataset_now_on_nap.html.md +++ b/apps/transport/lib/transport_web/templates/email/dataset_now_on_nap.html.md @@ -2,7 +2,7 @@ Bonjour, Votre jeu de données [<%= @dataset_custom_title %>](<%= @dataset_url %>) a bien été référencé sur le Point d’Accès National aux données de transport, [transport.data.gouv.fr](https://transport.data.gouv.fr). -Rendez-vous sur votre [Espace Producteur](<%= @espace_producteur_url %>) pour mettre à jour vos données ou vous inscrire à des notifications en cas de péremption, d’indisponibilité ou d’erreurs bloquantes sur votre jeu de données. +Rendez-vous sur votre [Espace Producteur](<%= espace_producteur_url(:dataset_now_on_nap) %>) pour mettre à jour vos données ou vous inscrire à des notifications en cas de péremption, d’indisponibilité ou d’erreurs bloquantes sur votre jeu de données. Si vous avez des questions, n’hésitez pas à contacter notre équipe à l’adresse : <%= @contact_email_address %>. diff --git a/apps/transport/lib/transport_web/templates/email/producer_with_subscriptions.html.md b/apps/transport/lib/transport_web/templates/email/producer_with_subscriptions.html.md index 7705861efd..780d8152fd 100644 --- a/apps/transport/lib/transport_web/templates/email/producer_with_subscriptions.html.md +++ b/apps/transport/lib/transport_web/templates/email/producer_with_subscriptions.html.md @@ -11,7 +11,7 @@ Vous êtes inscrit à des notifications concernant les jeux de données suivants <% end %> -Les notifications vous permettent d’être alerté en cas d’expiration, d’indisponibilité et d’erreurs de vos données. Rendez-vous sur votre [Espace Producteur](<%= TransportWeb.Router.Helpers.page_url(TransportWeb.Endpoint, :espace_producteur) %>) pour les gérer de manière autonome. +Les notifications vous permettent d’être alerté en cas d’expiration, d’indisponibilité et d’erreurs de vos données. Rendez-vous sur votre [Espace Producteur](<%= espace_producteur_url(:periodic_reminder_producer_with_subscriptions) %>) pour les gérer de manière autonome. <%= if @has_other_producers_subscribers do %> Les autres personnes inscrites à ces notifications sont : <%= @other_producers_subscribers %>. diff --git a/apps/transport/lib/transport_web/templates/email/producer_without_subscriptions.html.md b/apps/transport/lib/transport_web/templates/email/producer_without_subscriptions.html.md index 8ab2bdc9d7..fed1ad1009 100644 --- a/apps/transport/lib/transport_web/templates/email/producer_without_subscriptions.html.md +++ b/apps/transport/lib/transport_web/templates/email/producer_without_subscriptions.html.md @@ -13,7 +13,7 @@ Le saviez-vous ? Il est possible de vous inscrire à des notifications concernan Les notifications vous permettent d’être alerté en cas d’expiration, d’indisponibilité et d’erreurs de vos données. -Pour vous inscrire, rien de plus simple : rendez-vous sur votre [Espace Producteur](<%= TransportWeb.Router.Helpers.page_url(TransportWeb.Endpoint, :espace_producteur) %>) dans le menu “Recevoir des notifications”. +Pour vous inscrire, rien de plus simple : rendez-vous sur votre [Espace Producteur](<%= espace_producteur_url(:periodic_reminder_producer_without_subscriptions) %>) dans le menu “Recevoir des notifications”. Nous restons disponibles pour vous accompagner si besoin. diff --git a/apps/transport/lib/transport_web/templates/email/resource_unavailable_producer.html.md b/apps/transport/lib/transport_web/templates/email/resource_unavailable_producer.html.md index a564e000ef..c987a79375 100644 --- a/apps/transport/lib/transport_web/templates/email/resource_unavailable_producer.html.md +++ b/apps/transport/lib/transport_web/templates/email/resource_unavailable_producer.html.md @@ -7,7 +7,7 @@ Il semble que vous ayez supprimé puis créé une nouvelle ressource : l’URL d Pour les prochaines mises à jour, afin de garantir une URL stable, nous vous invitons à remplacer votre ressource obsolète par la nouvelle. -Pour cela, rendez-vous sur votre [Espace Producteur](<%= TransportWeb.Router.Helpers.page_url(TransportWeb.Endpoint, :espace_producteur) %>) à partir duquel vous pourrez procéder à ces mises à jour. +Pour cela, rendez-vous sur votre [Espace Producteur](<%= espace_producteur_url(:resource_unavailable_producer) %>) à partir duquel vous pourrez procéder à ces mises à jour. Retrouvez la procédure pas à pas [sur notre documentation](https://doc.transport.data.gouv.fr/producteurs/mettre-a-jour-des-donnees). <% else %> diff --git a/apps/transport/lib/transport_web/templates/layout/_header.html.heex b/apps/transport/lib/transport_web/templates/layout/_header.html.heex index 2600d62e83..a3a641e65b 100644 --- a/apps/transport/lib/transport_web/templates/layout/_header.html.heex +++ b/apps/transport/lib/transport_web/templates/layout/_header.html.heex @@ -81,9 +81,14 @@ <% end %>