From e016e651b2e8cf24914adcaefdf34abc12e8794d Mon Sep 17 00:00:00 2001 From: Antoine Augusti Date: Wed, 5 Feb 2025 11:49:34 +0100 Subject: [PATCH] =?UTF-8?q?Espace=20r=C3=A9utilisateur=20:=20formulaire=20?= =?UTF-8?q?pour=20ajouter=20des=20donn=C3=A9es=20am=C3=A9lior=C3=A9es=20(#?= =?UTF-8?q?4437)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/stylesheets/reuser_space.scss | 4 + apps/transport/lib/db/reuser_improved_data.ex | 30 ++++++ .../controllers/reuser_space_controller.ex | 76 ++++++++++++++- .../live/backoffice/custom_tags_live.ex | 4 + .../plugs/custom_secure_browser_headers.ex | 26 +++--- apps/transport/lib/transport_web/router.ex | 1 + .../reuser_space/datasets_edit.html.heex | 58 +++++++++++- .../gettext/en/LC_MESSAGES/reuser-space.po | 28 ++++++ .../gettext/fr/LC_MESSAGES/reuser-space.po | 28 ++++++ apps/transport/priv/gettext/reuser-space.pot | 28 ++++++ .../20250204084455_reuser_improved_data.exs | 18 ++++ .../reuser_space_controller_test.exs | 93 +++++++++++++++++++ config/config.exs | 1 + config/data_sharing_pilot.exs | 14 +++ 14 files changed, 392 insertions(+), 17 deletions(-) create mode 100644 apps/transport/lib/db/reuser_improved_data.ex create mode 100644 apps/transport/priv/repo/migrations/20250204084455_reuser_improved_data.exs create mode 100644 config/data_sharing_pilot.exs diff --git a/apps/transport/client/stylesheets/reuser_space.scss b/apps/transport/client/stylesheets/reuser_space.scss index 5b6b88e07c..0904afb9d6 100644 --- a/apps/transport/client/stylesheets/reuser_space.scss +++ b/apps/transport/client/stylesheets/reuser_space.scss @@ -54,3 +54,7 @@ form.search-followed-datasets { .align-right { text-align: right; } + +form.full-width { + max-width: 100%; +} diff --git a/apps/transport/lib/db/reuser_improved_data.ex b/apps/transport/lib/db/reuser_improved_data.ex new file mode 100644 index 0000000000..e9708f9cc0 --- /dev/null +++ b/apps/transport/lib/db/reuser_improved_data.ex @@ -0,0 +1,30 @@ +defmodule DB.ReuserImprovedData do + @moduledoc """ + Represents improved static data shared by reusers. + """ + use Ecto.Schema + use TypedEctoSchema + import Ecto.Changeset + + typed_schema "reuser_improved_data" do + belongs_to(:dataset, DB.Dataset) + belongs_to(:resource, DB.Resource) + belongs_to(:contact, DB.Contact) + belongs_to(:organization, DB.Organization, type: :string) + field(:download_url, :string) + timestamps(type: :utc_datetime_usec) + end + + def changeset(%__MODULE__{} = struct, attrs \\ %{}) do + fields = [:dataset_id, :resource_id, :contact_id, :organization_id, :download_url] + + struct + |> cast(attrs, fields) + |> validate_required(fields) + |> assoc_constraint(:dataset) + |> assoc_constraint(:resource) + |> assoc_constraint(:contact) + |> assoc_constraint(:organization) + |> unique_constraint([:resource_id, :organization_id]) + end +end diff --git a/apps/transport/lib/transport_web/controllers/reuser_space_controller.ex b/apps/transport/lib/transport_web/controllers/reuser_space_controller.ex index bcd8d07747..efab3f903a 100644 --- a/apps/transport/lib/transport_web/controllers/reuser_space_controller.ex +++ b/apps/transport/lib/transport_web/controllers/reuser_space_controller.ex @@ -2,7 +2,7 @@ defmodule TransportWeb.ReuserSpaceController do use TransportWeb, :controller import Ecto.Query - plug(:find_dataset_or_redirect when action in [:datasets_edit, :unfavorite]) + plug(:find_dataset_or_redirect when action in [:datasets_edit, :unfavorite, :add_improved_data]) def espace_reutilisateur(%Plug.Conn{assigns: %{current_user: %{"id" => datagouv_user_id}}} = conn, _) do contact = DB.Repo.get_by!(DB.Contact, datagouv_user_id: datagouv_user_id) @@ -14,7 +14,54 @@ defmodule TransportWeb.ReuserSpaceController do |> render("index.html") end - def datasets_edit(%Plug.Conn{} = conn, _), do: render(conn, "datasets_edit.html") + def datasets_edit( + %Plug.Conn{assigns: %{dataset: %DB.Dataset{} = dataset, contact: %DB.Contact{} = contact}} = conn, + _ + ) do + contact = DB.Repo.preload(contact, :organizations) + eligible_organizations = data_sharing_eligible_orgs(contact) + + conn + |> assign(:contact, contact) + |> assign(:dataset, DB.Repo.preload(dataset, :resources)) + |> assign(:eligible_to_data_sharing_pilot, data_sharing_pilot?(dataset, contact)) + |> assign(:eligible_organizations, eligible_organizations) + |> assign(:existing_improved_data, existing_improved_data(dataset, eligible_organizations)) + |> render("datasets_edit.html") + end + + defp existing_improved_data(%DB.Dataset{id: dataset_id}, [%DB.Organization{id: organization_id}]) do + DB.ReuserImprovedData + |> where([r], r.dataset_id == ^dataset_id and r.organization_id == ^organization_id) + |> DB.Repo.one() + end + + defp existing_improved_data(%DB.Dataset{}, _orgs), do: nil + + def add_improved_data( + %Plug.Conn{ + assigns: %{dataset: %DB.Dataset{} = dataset, contact: %DB.Contact{} = contact}, + params: %{ + "resource_id" => resource_id, + "organization_id" => organization_id, + "download_url" => download_url + } + } = conn, + _ + ) do + DB.ReuserImprovedData.changeset(%DB.ReuserImprovedData{}, %{ + dataset_id: dataset.id, + resource_id: resource_id, + contact_id: contact.id, + organization_id: organization_id, + download_url: download_url + }) + |> DB.Repo.insert!() + + conn + |> put_flash(:info, dgettext("reuser-space", "Your improved data has been saved.")) + |> redirect(to: reuser_space_path(conn, :datasets_edit, dataset.id)) + end def unfavorite(%Plug.Conn{assigns: %{dataset: %DB.Dataset{} = dataset, contact: %DB.Contact{} = contact}} = conn, _) do DB.DatasetFollower.unfollow!(contact, dataset) @@ -59,4 +106,29 @@ defmodule TransportWeb.ReuserSpaceController do |> halt() end end + + @doc """ + Is the following dataset eligible for the data sharing pilot for this contact, member + of various organizations? + """ + @spec data_sharing_pilot?(DB.Dataset.t(), DB.Contact.t()) :: boolean() + def data_sharing_pilot?(%DB.Dataset{} = dataset, %DB.Contact{} = contact) do + eligible_dataset_type = dataset.type == "public-transit" + has_dataset_tag = DB.Dataset.has_custom_tag?(dataset, config_value(:dataset_custom_tag)) + member_eligible_org = data_sharing_eligible_orgs(contact) |> Enum.count() == 1 + + Enum.all?([eligible_dataset_type, has_dataset_tag, member_eligible_org]) + end + + def data_sharing_eligible_orgs(%DB.Contact{organizations: organizations}) do + data_sharing_eligible_orgs(organizations) + end + + def data_sharing_eligible_orgs(organizations) when is_list(organizations) do + Enum.filter(organizations, &(&1.id in config_value(:eligible_datagouv_organization_ids))) + end + + defp config_value(key) do + Application.fetch_env!(:transport, :"data_sharing_pilot_#{key}") + end end diff --git a/apps/transport/lib/transport_web/live/backoffice/custom_tags_live.ex b/apps/transport/lib/transport_web/live/backoffice/custom_tags_live.ex index bdb1f2a2b3..e677d2ad4a 100644 --- a/apps/transport/lib/transport_web/live/backoffice/custom_tags_live.ex +++ b/apps/transport/lib/transport_web/live/backoffice/custom_tags_live.ex @@ -76,6 +76,10 @@ defmodule TransportWeb.CustomTagsLive do %{ name: "experimental", doc: "Ajoute sur la page du JDD une bannière indiquant que le jeu est expérimental" + }, + %{ + name: Application.fetch_env!(:transport, :data_sharing_pilot_dataset_custom_tag), + doc: "Indique que ce jeu de données est éligible à l'expérimentation du repartage de données améliorées" } ] end diff --git a/apps/transport/lib/transport_web/plugs/custom_secure_browser_headers.ex b/apps/transport/lib/transport_web/plugs/custom_secure_browser_headers.ex index 31c71971a3..1c1786572d 100644 --- a/apps/transport/lib/transport_web/plugs/custom_secure_browser_headers.ex +++ b/apps/transport/lib/transport_web/plugs/custom_secure_browser_headers.ex @@ -9,7 +9,7 @@ defmodule TransportWeb.Plugs.CustomSecureBrowserHeaders do def call(conn, _opts) do nonce = generate_nonce() - csp_headers = csp_headers(Application.fetch_env!(:transport, :app_env), nonce) + csp_headers = csp_headers(Mix.env(), Application.fetch_env!(:transport, :app_env), nonce) headers = Map.merge(csp_headers, %{"x-frame-options" => "DENY"}) conn @@ -23,16 +23,16 @@ defmodule TransportWeb.Plugs.CustomSecureBrowserHeaders do Returns content-security-policy headers for an app environment. iex> nonce = "foo" - iex> match?(%{"content-security-policy" => _csp_content}, csp_headers(:production, nonce)) + iex> match?(%{"content-security-policy" => _csp_content}, csp_headers(:prod, :production, nonce)) true - iex> match?(%{"content-security-policy" => _csp_content}, csp_headers(:staging, nonce)) + iex> match?(%{"content-security-policy" => _csp_content}, csp_headers(:prod, :staging, nonce)) true - iex> csp_headers(:staging, nonce) != csp_headers(:production, nonce) + iex> csp_headers(:prod, :staging, nonce) != csp_headers(:prod, :production, nonce) true - iex> String.contains?("report-uri", csp_headers(:dev, nonce) |> Map.fetch!("content-security-policy")) + iex> String.contains?("report-uri", csp_headers(:dev, :dev, nonce) |> Map.fetch!("content-security-policy")) false """ - def csp_headers(app_env, nonce) do + def csp_headers(mix_env, app_env, nonce) do # https://github.com/vega/vega-embed/issues/1214#issuecomment-1670812445 vega_hash_values = "'sha256-9uoGUaZm3j6W7+Fh2wfvjI8P7zXcclRw5tVUu3qKZa0=' 'sha256-MmUum7+PiN7Rz79EUMm0OmUFWjCx6NZ97rdjoIbTnAg='" @@ -51,7 +51,7 @@ defmodule TransportWeb.Plugs.CustomSecureBrowserHeaders do "report-uri" => "" } |> Enum.map(fn {directive, value} -> - extra = " #{additional_content(directive, app_env)}" |> String.trim() + extra = " #{additional_content(directive, mix_env, app_env) |> String.trim()}" {directive, value <> extra} end) |> Enum.reject(fn {_, v} -> v == "" end) @@ -60,15 +60,19 @@ defmodule TransportWeb.Plugs.CustomSecureBrowserHeaders do %{"content-security-policy" => policy} end - defp additional_content("img-src", :staging) do - "https://demo-static.data.gouv.fr https://demo.data.gouv.fr" + defp additional_content("img-src", mix_env, app_env) do + if mix_env == :dev or app_env == :staging do + "https://demo-static.data.gouv.fr https://demo.data.gouv.fr" + else + "" + end end - defp additional_content("report-uri", app_env) when app_env in [:production, :staging] do + defp additional_content("report-uri", _mix_env, app_env) when app_env in [:production, :staging] do Application.fetch_env!(:sentry, :csp_url) end - defp additional_content(_directive, _app_env) do + defp additional_content(_directive, _mix_env, _app_env) do "" end end diff --git a/apps/transport/lib/transport_web/router.ex b/apps/transport/lib/transport_web/router.ex index cb9f5dfeb8..90dd249ca6 100644 --- a/apps/transport/lib/transport_web/router.ex +++ b/apps/transport/lib/transport_web/router.ex @@ -121,6 +121,7 @@ defmodule TransportWeb.Router do pipe_through([:reuser_space]) get("/", ReuserSpaceController, :espace_reutilisateur) get("/datasets/:dataset_id", ReuserSpaceController, :datasets_edit) + post("/datasets/:dataset_id/add_improved_data", ReuserSpaceController, :add_improved_data) post("/datasets/:dataset_id/unfavorite", ReuserSpaceController, :unfavorite) live_session :reuser_space, session: %{"role" => :reuser}, root_layout: {TransportWeb.LayoutView, :app} do diff --git a/apps/transport/lib/transport_web/templates/reuser_space/datasets_edit.html.heex b/apps/transport/lib/transport_web/templates/reuser_space/datasets_edit.html.heex index 2dab85bf9f..bac0b66328 100644 --- a/apps/transport/lib/transport_web/templates/reuser_space/datasets_edit.html.heex +++ b/apps/transport/lib/transport_web/templates/reuser_space/datasets_edit.html.heex @@ -14,11 +14,61 @@

<%= dgettext("reuser-space", "Manage notifications") %>

<%= live_render(@conn, TransportWeb.Live.DatasetNotificationsLive, session: %{"dataset_id" => @dataset.id}) %> -
+

<%= dgettext("reuser-space", "Improved data sharing") %>

-

- <%= dgettext("reuser-space", "This feature is coming soon!") %> -

+ <%= if @eligible_to_data_sharing_pilot do %> + <% [organization] = @eligible_organizations %> + <%= if is_nil(@existing_improved_data) do %> +
+ +
+ <%= form_for @conn, reuser_space_path(@conn, :add_improved_data, @dataset.id), [class: "full-width"], fn f -> %> +

+ <%= dgettext("reuser-space", "Step 1: choose the initial resource from the producer") %> +

+
+ <%= for resource <- @dataset.resources |> Enum.filter(&DB.Resource.gtfs?/1) do %> +
+

+ <%= radio_button(f, :resource_id, resource.id, id: "resource-#{resource.id}", required: true) %> + <%= label f, resource.id, class: "label-inline", for: "resource-#{resource.id}" do %> + <%= resource.title %> + <% end %> +

+ +
+
+
+ <%= resource.format %> +
+
+
+
+ <% end %> +
+

+ <%= dgettext("reuser-space", "Only GTFS files are eligible for now.") %> +

+
+

+ <%= dgettext("reuser-space", "Step 2: add the URL to download your improved data") %> +

+ <%= label(f, :download_url, dgettext("reuser-space", "Your improved data URL")) %> + <%= text_input(f, :download_url, type: "url", required: true) %> +
+ <%= hidden_input(f, :organization_id, value: organization.id) %> + <%= submit(dgettext("reuser-space", "Share improved data"), class: "button") %> + <% end %> + <% else %> +

+ <%= dgettext("reuser-space", "You already shared improved data for this dataset, thanks!") %> +

+ <% end %> + <% else %> +

+ <%= dgettext("reuser-space", "This feature is coming soon!") %> +

+ <% end %>

<%= dgettext("reuser-space", "Discussions") %>

diff --git a/apps/transport/priv/gettext/en/LC_MESSAGES/reuser-space.po b/apps/transport/priv/gettext/en/LC_MESSAGES/reuser-space.po index c38d3f235c..0f3f98b744 100644 --- a/apps/transport/priv/gettext/en/LC_MESSAGES/reuser-space.po +++ b/apps/transport/priv/gettext/en/LC_MESSAGES/reuser-space.po @@ -138,3 +138,31 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Warning, you are going to remove \"%{dataset_title}\" from your favorites. You will lose any settings or actions you previously performed on this dataset." msgstr "" + +#, elixir-autogen, elixir-format +msgid "Only GTFS files are eligible for now." +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Share improved data" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Your improved data URL" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Step 1: choose the initial resource from the producer" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Step 2: add the URL to download your improved data" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "You already shared improved data for this dataset, thanks!" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Your improved data has been saved." +msgstr "" diff --git a/apps/transport/priv/gettext/fr/LC_MESSAGES/reuser-space.po b/apps/transport/priv/gettext/fr/LC_MESSAGES/reuser-space.po index 78155322e4..0085c6d2e8 100644 --- a/apps/transport/priv/gettext/fr/LC_MESSAGES/reuser-space.po +++ b/apps/transport/priv/gettext/fr/LC_MESSAGES/reuser-space.po @@ -138,3 +138,31 @@ msgstr "Cette fonctionnalité arrive bientôt !" #, elixir-autogen, elixir-format msgid "Warning, you are going to remove \"%{dataset_title}\" from your favorites. You will lose any settings or actions you previously performed on this dataset." msgstr "Attention, vous allez supprimer le jeu de données \"%{dataset_title}\" de vos favoris. Vous allez perdre tous les paramétrages ou actions que vous avez réalisés précédemment sur ce jeu de données." + +#, elixir-autogen, elixir-format +msgid "Only GTFS files are eligible for now." +msgstr "Seuls les fichiers GTFS sont éligibles pour le moment." + +#, elixir-autogen, elixir-format +msgid "Share improved data" +msgstr "Repartager vos données améliorées" + +#, elixir-autogen, elixir-format +msgid "Your improved data URL" +msgstr "Lien vers vos données améliorées" + +#, elixir-autogen, elixir-format +msgid "Step 1: choose the initial resource from the producer" +msgstr "Étape 1 : sélectionnez la ressource initiale du producteur" + +#, elixir-autogen, elixir-format +msgid "Step 2: add the URL to download your improved data" +msgstr "Étape 2 : renseignez l'URL de téléchargement de votre fichier amélioré" + +#, elixir-autogen, elixir-format +msgid "You already shared improved data for this dataset, thanks!" +msgstr "Vous avez déjà partagé des données améliorées pour ce jeu de données, merci !" + +#, elixir-autogen, elixir-format +msgid "Your improved data has been saved." +msgstr "Vos données améliorées ont bien été sauvegardées." diff --git a/apps/transport/priv/gettext/reuser-space.pot b/apps/transport/priv/gettext/reuser-space.pot index bd7c84242c..3bfb1cdc37 100644 --- a/apps/transport/priv/gettext/reuser-space.pot +++ b/apps/transport/priv/gettext/reuser-space.pot @@ -138,3 +138,31 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Warning, you are going to remove \"%{dataset_title}\" from your favorites. You will lose any settings or actions you previously performed on this dataset." msgstr "" + +#, elixir-autogen, elixir-format +msgid "Only GTFS files are eligible for now." +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Share improved data" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Your improved data URL" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Step 1: choose the initial resource from the producer" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Step 2: add the URL to download your improved data" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "You already shared improved data for this dataset, thanks!" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "Your improved data has been saved." +msgstr "" diff --git a/apps/transport/priv/repo/migrations/20250204084455_reuser_improved_data.exs b/apps/transport/priv/repo/migrations/20250204084455_reuser_improved_data.exs new file mode 100644 index 0000000000..f47ce51673 --- /dev/null +++ b/apps/transport/priv/repo/migrations/20250204084455_reuser_improved_data.exs @@ -0,0 +1,18 @@ +defmodule DB.Repo.Migrations.ReuserImprovedData do + use Ecto.Migration + + def change do + create table(:reuser_improved_data) do + add(:dataset_id, references(:dataset, on_delete: :delete_all), null: false) + add(:resource_id, references(:resource, on_delete: :delete_all), null: false) + add(:contact_id, references(:contact, on_delete: :delete_all), null: false) + add(:organization_id, references(:organization, type: :string, on_delete: :delete_all), null: false) + add(:download_url, :string, null: false) + timestamps(type: :utc_datetime_usec) + end + + create(index(:reuser_improved_data, [:dataset_id])) + create(index(:reuser_improved_data, [:organization_id])) + create(unique_index(:reuser_improved_data, [:resource_id, :organization_id])) + end +end diff --git a/apps/transport/test/transport_web/controllers/reuser_space_controller_test.exs b/apps/transport/test/transport_web/controllers/reuser_space_controller_test.exs index f6ab217596..a307d0775e 100644 --- a/apps/transport/test/transport_web/controllers/reuser_space_controller_test.exs +++ b/apps/transport/test/transport_web/controllers/reuser_space_controller_test.exs @@ -1,9 +1,11 @@ defmodule TransportWeb.ReuserSpaceControllerTest do # `async: false` because we change the app config in a test use TransportWeb.ConnCase, async: false + import TransportWeb.ReuserSpaceController import DB.Factory @home_url reuser_space_path(TransportWeb.Endpoint, :espace_reutilisateur) + @google_maps_org_id "63fdfe4f4cd1c437ac478323" setup do Ecto.Adapters.SQL.Sandbox.checkout(DB.Repo) @@ -63,6 +65,28 @@ defmodule TransportWeb.ReuserSpaceControllerTest do |> Floki.find(".reuser-space-section h2") |> Floki.text() == dataset.custom_title end + + test "logged in, dataset is eligible for the data sharing pilot", %{conn: conn} do + organization = insert(:organization, id: @google_maps_org_id) + dataset = insert(:dataset, custom_tags: ["repartage_donnees"], type: "public-transit") + + contact = + insert_contact(%{ + datagouv_user_id: Ecto.UUID.generate(), + organizations: [organization |> Map.from_struct()] + }) + + insert(:dataset_follower, contact_id: contact.id, dataset_id: dataset.id, source: :follow_button) + + assert conn + |> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}}) + |> get(reuser_space_path(conn, :datasets_edit, dataset.id)) + |> html_response(200) + |> Floki.parse_document!() + |> Floki.find("#data-sharing") + |> Floki.text() + |> String.trim() =~ "Étape 1 : sélectionnez la ressource initiale du producteur" + end end describe "unfavorite" do @@ -104,4 +128,73 @@ defmodule TransportWeb.ReuserSpaceControllerTest do DB.Repo.preload(contact, [:followed_datasets, :notification_subscriptions]) end end + + test "add_improved_data", %{conn: conn} do + %DB.Organization{id: organization_id} = organization = insert(:organization, id: @google_maps_org_id) + %DB.Dataset{id: dataset_id} = insert(:dataset, custom_tags: ["repartage_donnees"], type: "public-transit") + %DB.Resource{id: gtfs_id} = insert(:resource, dataset_id: dataset_id, format: "GTFS") + + %DB.Contact{id: contact_id} = + contact = + insert_contact(%{ + datagouv_user_id: Ecto.UUID.generate(), + organizations: [organization |> Map.from_struct()] + }) + + download_url = "https://example.com/#{Ecto.UUID.generate()}" + + insert(:dataset_follower, contact_id: contact_id, dataset_id: dataset_id, source: :follow_button) + + conn = + conn + |> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}}) + |> post( + reuser_space_path(conn, :add_improved_data, dataset_id, %{ + "resource_id" => gtfs_id, + "organization_id" => @google_maps_org_id, + "download_url" => download_url + }) + ) + + redirection_path = redirected_to(conn, 302) + assert reuser_space_path(conn, :datasets_edit, dataset_id) == redirection_path + assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Vos données améliorées ont bien été sauvegardées." + + assert [ + %DB.ReuserImprovedData{ + dataset_id: ^dataset_id, + resource_id: ^gtfs_id, + contact_id: ^contact_id, + organization_id: ^organization_id, + download_url: ^download_url + } + ] = DB.ReuserImprovedData |> DB.Repo.all() + + assert get(recycle(conn), redirection_path) + |> html_response(200) + |> Floki.parse_document!() + |> Floki.find("#data-sharing p.notification") + |> Floki.text() + |> String.trim() == "Vous avez déjà partagé des données améliorées pour ce jeu de données, merci !" + end + + describe "data_sharing_pilot?" do + test "contact is not a member of an eligible organization" do + dataset = %DB.Dataset{type: "public-transit", custom_tags: ["repartage_donnees"]} + contact = %DB.Contact{organizations: []} + refute data_sharing_pilot?(dataset, contact) + end + + test "dataset does not have the required tag" do + dataset = %DB.Dataset{type: "public-transit", custom_tags: []} + contact = %DB.Contact{organizations: [%DB.Organization{id: @google_maps_org_id}]} + refute data_sharing_pilot?(dataset, contact) + end + + test "dataset is eligible for contact" do + dataset = %DB.Dataset{type: "public-transit", custom_tags: ["repartage_donnees"]} + contact = %DB.Contact{organizations: [%DB.Organization{id: @google_maps_org_id}]} + assert data_sharing_pilot?(dataset, contact) + end + end end diff --git a/config/config.exs b/config/config.exs index fc8df2f239..7ed3c498f8 100644 --- a/config/config.exs +++ b/config/config.exs @@ -246,4 +246,5 @@ import_config "gtfs_validator.exs" import_config "gbfs_validator.exs" import_config "mail.exs" import_config "mailchimp.exs" +import_config "data_sharing_pilot.exs" import_config "#{config_env()}.exs" diff --git a/config/data_sharing_pilot.exs b/config/data_sharing_pilot.exs new file mode 100644 index 0000000000..659b2faabd --- /dev/null +++ b/config/data_sharing_pilot.exs @@ -0,0 +1,14 @@ +import Config + +config :transport, + data_sharing_pilot_dataset_custom_tag: "repartage_donnees", + data_sharing_pilot_eligible_datagouv_organization_ids: [ + # transport.data.gouv.fr + "5abca8d588ee386ee6ece479", + # Google Maps + "63fdfe4f4cd1c437ac478323", + # Transit + "5c9a6477634f4133c7a5fc01", + # Citymapper / Via + "5f7cade93fb405c7d8f6d554" + ]