Skip to content

Commit 400133f

Browse files
committed
Merge branch 'master' into 3963-historize-irve-lines
2 parents 1b818dc + 703d3eb commit 400133f

File tree

11 files changed

+216
-9
lines changed

11 files changed

+216
-9
lines changed

apps/transport/client/stylesheets/reuser_space.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
}
1818
}
1919

20+
.reuser-space-section {
21+
background-color: var(--theme-background-grey);
22+
min-height: 80vh;
23+
}
24+
2025
.action-panel {
2126
display: flex;
2227
flex-grow: 1;

apps/transport/lib/transport_web/controllers/reuser_space_controller.ex

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ defmodule TransportWeb.ReuserSpaceController do
22
use TransportWeb, :controller
33
import Ecto.Query
44

5+
plug(:find_dataset_or_redirect when action in [:datasets_edit, :unfavorite])
6+
57
def espace_reutilisateur(%Plug.Conn{assigns: %{current_user: %{"id" => datagouv_user_id}}} = conn, _) do
68
contact = DB.Repo.get_by!(DB.Contact, datagouv_user_id: datagouv_user_id)
79
followed_datasets_ids = contact |> Ecto.assoc(:followed_datasets) |> select([d], d.id) |> DB.Repo.all()
@@ -12,5 +14,49 @@ defmodule TransportWeb.ReuserSpaceController do
1214
|> render("index.html")
1315
end
1416

15-
def datasets_edit(%Plug.Conn{} = conn, _), do: text(conn, "Coming later")
17+
def datasets_edit(%Plug.Conn{} = conn, _), do: render(conn, "datasets_edit.html")
18+
19+
def unfavorite(%Plug.Conn{assigns: %{dataset: %DB.Dataset{} = dataset, contact: %DB.Contact{} = contact}} = conn, _) do
20+
DB.DatasetFollower.unfollow!(contact, dataset)
21+
delete_notification_subscriptions(contact, dataset)
22+
23+
conn
24+
|> put_flash(
25+
:info,
26+
dgettext("reuser-space", "%{dataset_title} has been removed from your favorites",
27+
dataset_title: dataset.custom_title
28+
)
29+
)
30+
|> redirect(to: reuser_space_path(conn, :espace_reutilisateur))
31+
end
32+
33+
defp delete_notification_subscriptions(%DB.Contact{id: contact_id}, %DB.Dataset{id: dataset_id}) do
34+
DB.NotificationSubscription.base_query()
35+
|> where([notification_subscription: ns], ns.contact_id == ^contact_id and ns.dataset_id == ^dataset_id)
36+
|> DB.Repo.delete_all()
37+
end
38+
39+
defp find_dataset_or_redirect(
40+
%Plug.Conn{assigns: %{current_user: %{"id" => datagouv_user_id}}, path_params: %{"dataset_id" => dataset_id}} =
41+
conn,
42+
_options
43+
) do
44+
# This query makes sure that the dataset is in the user's favorites
45+
DB.Contact.base_query()
46+
|> join(:inner, [contact: c], d in assoc(c, :followed_datasets), as: :dataset)
47+
|> where([contact: c], c.datagouv_user_id == ^datagouv_user_id)
48+
|> where([dataset: d], d.id == ^dataset_id)
49+
|> select([contact: c, dataset: d], %{contact: c, dataset: d})
50+
|> DB.Repo.all()
51+
|> case do
52+
[%{contact: %DB.Contact{}, dataset: %DB.Dataset{}} = results] ->
53+
conn |> merge_assigns(results)
54+
55+
_ ->
56+
conn
57+
|> put_flash(:error, dgettext("alert", "Unable to get this dataset for the moment"))
58+
|> redirect(to: reuser_space_path(conn, :espace_reutilisateur))
59+
|> halt()
60+
end
61+
end
1662
end

apps/transport/lib/transport_web/live/followed_datasets_live.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ defmodule TransportWeb.Live.FollowedDatasetsLive do
6464
</div>
6565
</div>
6666
</div>
67+
<div class="panel__extra">
68+
<a href={reuser_space_path(@socket, :datasets_edit, dataset.id)} class="no-bg">
69+
<button class="button-outline primary small"><%= dgettext("reuser-space", "Edit") %></button>
70+
</a>
71+
</div>
6772
</div>
6873
<% end %>
6974
</div>

apps/transport/lib/transport_web/router.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ defmodule TransportWeb.Router do
109109
pipe_through([:reuser_space])
110110
get("/", ReuserSpaceController, :espace_reutilisateur)
111111
get("/datasets/:dataset_id", ReuserSpaceController, :datasets_edit)
112+
post("/datasets/:dataset_id/unfavorite", ReuserSpaceController, :unfavorite)
112113

113114
live_session :reuser_space, session: %{"role" => :reuser}, root_layout: {TransportWeb.LayoutView, :app} do
114115
live("/notifications", Live.NotificationsLive, :notifications, as: :reuser_space)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<section class="container pt-48 pb-24">
2+
<%= breadcrumbs([@conn, :datasets_edit, @dataset.custom_title]) %>
3+
</section>
4+
<section class="reuser-space-section">
5+
<div class="container pt-24">
6+
<div class="panel">
7+
<h2><%= @dataset.custom_title %></h2>
8+
<a href="#modal" class="button warning"><%= dgettext("reuser-space", "Remove from favorites") %></a>
9+
<div class="modal__backdrop" id="modal">
10+
<div class="modal">
11+
<p>
12+
Here we will have soon a few words highlighting how dangerous this action is. We also offer a complimentary escape option.
13+
</p>
14+
<%= form_for %{}, reuser_space_path(@conn, :unfavorite, @dataset.id), [class: "no-margin", method: "post"], fn _ -> %>
15+
<div class="form__group button__group">
16+
<button
17+
class="button warning"
18+
type="submit"
19+
data-tracking-category="reuser_space"
20+
data-tracking-action="confirm_unfavorite_dataset"
21+
>
22+
<%= dgettext("reuser-space", "Remove from favorites") %>
23+
</button>
24+
<a
25+
href="#"
26+
class="button secondary"
27+
data-tracking-category="reuser_space"
28+
data-tracking-action="abort_unfavorite_dataset"
29+
>
30+
<%= dgettext("reuser-space", "Cancel") %>
31+
</a>
32+
</div>
33+
<% end %>
34+
</div>
35+
</div>
36+
</div>
37+
</div>
38+
</section>
39+
40+
<script defer type="text/javascript" src={static_path(@conn, "/js/app.js")} />

apps/transport/lib/transport_web/views/bread_crumbs.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ defmodule TransportWeb.BreadCrumbs do
5454
]
5555
end
5656

57+
def crumbs(conn, :datasets_edit, dataset_custom_title) do
58+
crumbs(conn, :reuser_space) ++ [{dataset_custom_title, nil}]
59+
end
60+
5761
def crumbs(conn, :select_resource, id) do
5862
crumbs(conn, :espace_producteur) ++
5963
[

apps/transport/priv/gettext/en/LC_MESSAGES/reuser-space.po

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,19 @@ msgstr ""
106106
#, elixir-autogen, elixir-format
107107
msgid "reuser-space-intro"
108108
msgstr "To add a favorite and benefit from monitoring and quality improvement services for the datasets you reuse, you must first log in and then click on the ❤️ icon on the dataset page."
109+
110+
#, elixir-autogen, elixir-format
111+
msgid "%{dataset_title} has been removed from your favorites"
112+
msgstr ""
113+
114+
#, elixir-autogen, elixir-format
115+
msgid "Cancel"
116+
msgstr ""
117+
118+
#, elixir-autogen, elixir-format
119+
msgid "Edit"
120+
msgstr ""
121+
122+
#, elixir-autogen, elixir-format
123+
msgid "Remove from favorites"
124+
msgstr ""

apps/transport/priv/gettext/fr/LC_MESSAGES/reuser-space.po

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,19 @@ msgstr "transport.data.gouv.fr est affilié à data.gouv.fr : la plateforme ouve
106106
#, elixir-autogen, elixir-format
107107
msgid "reuser-space-intro"
108108
msgstr "Pour ajouter un favori et bénéficier des services de suivi et d'amélioration de la qualité des jeux de données que vous réutilisez, vous devez au préalable vous connecter puis cliquer sur l'icône ❤️ sur la page du jeu de données."
109+
110+
#, elixir-autogen, elixir-format
111+
msgid "%{dataset_title} has been removed from your favorites"
112+
msgstr "%{dataset_title} a été retiré de vos favoris"
113+
114+
#, elixir-autogen, elixir-format
115+
msgid "Cancel"
116+
msgstr "Annuler"
117+
118+
#, elixir-autogen, elixir-format
119+
msgid "Edit"
120+
msgstr "Éditer"
121+
122+
#, elixir-autogen, elixir-format
123+
msgid "Remove from favorites"
124+
msgstr "Retirer de vos favoris"

apps/transport/priv/gettext/reuser-space.pot

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,19 @@ msgstr ""
106106
#, elixir-autogen, elixir-format
107107
msgid "reuser-space-intro"
108108
msgstr ""
109+
110+
#, elixir-autogen, elixir-format
111+
msgid "%{dataset_title} has been removed from your favorites"
112+
msgstr ""
113+
114+
#, elixir-autogen, elixir-format
115+
msgid "Cancel"
116+
msgstr ""
117+
118+
#, elixir-autogen, elixir-format
119+
msgid "Edit"
120+
msgstr ""
121+
122+
#, elixir-autogen, elixir-format
123+
msgid "Remove from favorites"
124+
msgstr ""

apps/transport/test/transport_web/controllers/reuser_space_controller_test.exs

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,71 @@ defmodule TransportWeb.ReuserSpaceControllerTest do
3636
assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Vous devez être préalablement connecté"
3737
end
3838

39-
test "logged in", %{conn: conn} do
39+
test "logged in, the requested dataset is not in the user's favorites", %{conn: conn} do
4040
contact = insert_contact(%{datagouv_user_id: Ecto.UUID.generate()})
41+
dataset = insert(:dataset)
42+
43+
conn =
44+
conn
45+
|> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}})
46+
|> get(reuser_space_path(conn, :datasets_edit, dataset.id))
47+
48+
assert redirected_to(conn, 302) == reuser_space_path(conn, :espace_reutilisateur)
49+
assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "Impossible de récupérer ce jeu de données pour le moment"
50+
end
51+
52+
test "logged in, with a favorited dataset", %{conn: conn} do
53+
contact = insert_contact(%{datagouv_user_id: Ecto.UUID.generate()})
54+
dataset = insert(:dataset)
55+
insert(:dataset_follower, contact_id: contact.id, dataset_id: dataset.id, source: :follow_button)
4156

4257
assert conn
4358
|> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}})
44-
|> get(reuser_space_path(conn, :datasets_edit, 42))
45-
|> text_response(200) == "Coming later"
59+
|> get(reuser_space_path(conn, :datasets_edit, dataset.id))
60+
|> html_response(200)
61+
|> Floki.parse_document!()
62+
|> Floki.find("h2")
63+
|> Floki.text() == dataset.custom_title
64+
end
65+
end
66+
67+
describe "unfavorite" do
68+
test "requested dataset is not in the user's favorites", %{conn: conn} do
69+
contact = insert_contact(%{datagouv_user_id: Ecto.UUID.generate()})
70+
dataset = insert(:dataset)
71+
72+
conn =
73+
conn
74+
|> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}})
75+
|> post(reuser_space_path(conn, :unfavorite, dataset.id))
76+
77+
assert redirected_to(conn, 302) == reuser_space_path(conn, :espace_reutilisateur)
78+
assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "Impossible de récupérer ce jeu de données pour le moment"
79+
end
80+
81+
test "with a favorite dataset", %{conn: conn} do
82+
contact = insert_contact(%{datagouv_user_id: Ecto.UUID.generate()})
83+
dataset = insert(:dataset, custom_title: "FooBar")
84+
insert(:dataset_follower, contact_id: contact.id, dataset_id: dataset.id, source: :follow_button)
85+
86+
insert(:notification_subscription,
87+
contact_id: contact.id,
88+
dataset_id: dataset.id,
89+
source: :user,
90+
reason: :expiration,
91+
role: :reuser
92+
)
93+
94+
conn =
95+
conn
96+
|> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}})
97+
|> post(reuser_space_path(conn, :unfavorite, dataset.id))
98+
99+
assert redirected_to(conn, 302) == reuser_space_path(conn, :espace_reutilisateur)
100+
assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "FooBar a été retiré de vos favoris"
101+
102+
assert %DB.Contact{notification_subscriptions: [], followed_datasets: []} =
103+
DB.Repo.preload(contact, [:followed_datasets, :notification_subscriptions])
46104
end
47105
end
48106
end

livebook/irve-total.livemd

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ opts = [
2828
{:ok, conn} = Kino.start_child({Postgrex, opts})
2929
```
3030

31-
<!-- livebook:{"attrs":{"cache_query":true,"connection":{"type":"postgres","variable":"conn"},"data_frame_alias":"Elixir.Explorer.DataFrame","query":"select id, payload ->> 'permanent_url' as url, inserted_at \nfrom resource_history rh\nwhere rh.resource_id = 79624\norder by inserted_at asc","result_variable":"result","timeout":null},"chunks":null,"kind":"Elixir.KinoDB.SQLCell","livebook_object":"smart_cell"} -->
31+
<!-- livebook:{"attrs":{"cache_query":true,"connection":{"type":"postgres","variable":"conn"},"data_frame_alias":"Elixir.Explorer.DataFrame","query":"select id, payload ->> 'permanent_url' as url, inserted_at \nfrom resource_history rh\nwhere rh.resource_id = 81623\norder by inserted_at asc","result_variable":"result","timeout":null},"chunks":null,"kind":"Elixir.KinoDB.SQLCell","livebook_object":"smart_cell"} -->
3232

3333
```elixir
3434
result =
@@ -37,7 +37,7 @@ result =
3737
"""
3838
select id, payload ->> 'permanent_url' as url, inserted_at
3939
from resource_history rh
40-
where rh.resource_id = 79624
40+
where rh.resource_id = 81623
4141
order by inserted_at asc
4242
""",
4343
[]
@@ -58,14 +58,14 @@ snapshots =
5858
```
5959

6060
```elixir
61-
path = Path.join(__ENV__.file, "../../scripts/irve/req_custom_cache.exs") |> Path.expand()
61+
path = Path.join(__ENV__.file, "../../apps/shared/lib/req_custom_cache.ex") |> Path.expand()
6262
Code.require_file(path)
6363

6464
defmodule Query do
6565
def cache_dir, do: Path.join(__ENV__.file, "../cache-dir") |> Path.expand()
6666

6767
def cached_get!(url) do
68-
req = Req.new() |> CustomCache.attach()
68+
req = Req.new() |> Transport.Shared.ReqCustomCache.attach()
6969
Req.get!(req, url: url, receive_timeout: 100_000, custom_cache_dir: cache_dir())
7070
end
7171
end
@@ -87,7 +87,7 @@ data =
8787
task,
8888
max_concurrency: 25,
8989
on_timeout: :kill_task,
90-
timeout: 25_000
90+
timeout: 50_000
9191
)
9292
|> Stream.map(fn {:ok, result} -> result end)
9393
|> Stream.map(fn x -> Map.take(x, ["inserted_at", "row_count"]) end)

0 commit comments

Comments
 (0)