Skip to content

Commit

Permalink
Affiche score de disponibilité (#3366)
Browse files Browse the repository at this point in the history
Co-authored-by: Thibaut Barrère <[email protected]>
  • Loading branch information
AntoineAugusti and thbar authored Aug 7, 2023
1 parent 24acd98 commit b4b198d
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 10 deletions.
22 changes: 21 additions & 1 deletion apps/transport/lib/db/dataset_score.ex
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,31 @@ defmodule DB.DatasetScore do
Latest score for a given dataset and topic
"""
@spec get_latest(DB.Dataset.t(), atom()) :: DB.DatasetScore.t() | nil
def get_latest(%DB.Dataset{id: dataset_id}, topic) do
def get_latest(%DB.Dataset{id: dataset_id}, topic) when is_atom(topic) do
__MODULE__.base_query()
|> where([dataset_score: ds], ds.dataset_id == ^dataset_id and ds.topic == ^topic)
|> order_by([ds], desc: ds.timestamp)
|> limit(1)
|> DB.Repo.one()
end

@doc """
Latest scores for a given dataset and a list of topics
"""
@spec get_latest_scores(DB.Dataset.t(), [atom()]) :: %{required(atom()) => DB.DatasetScore.t()}
def get_latest_scores(%DB.Dataset{id: dataset_id}, topics) when is_list(topics) do
ids =
__MODULE__.base_query()
|> where([dataset_score: ds], ds.dataset_id == ^dataset_id and ds.topic in ^topics)
|> select(
[dataset_score: ds],
ds.id |> first_value() |> over(partition_by: ds.topic, order_by: [desc: ds.timestamp])
)
|> distinct(true)

__MODULE__.base_query()
|> where([dataset_score: ds], ds.id in subquery(ids))
|> DB.Repo.all()
|> Enum.into(%{}, fn %__MODULE__{topic: topic} = ds -> {topic, ds} end)
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ defmodule TransportWeb.DatasetController do
)
|> assign(:latest_resources_history_infos, DB.ResourceHistory.latest_dataset_resources_history_infos(dataset.id))
|> assign(:notifications_sent, DB.Notification.recent_reasons_binned(dataset, days_notifications_sent()))
|> assign(:freshness_score, DB.DatasetScore.get_latest(dataset, :freshness))
|> assign(:dataset_scores, DB.DatasetScore.get_latest_scores(dataset, Ecto.Enum.values(DB.DatasetScore, :topic)))
|> put_status(if dataset.is_active, do: :ok, else: :not_found)
|> render("details.html")
else
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<div :if={@dataset_scores != %{}} class="light-grey pt-6">
<% freshness_score = Map.get(@dataset_scores, :freshness) %>
<div>
<%= unless is_nil(freshness_score) do %>
Score fraicheur : <%= freshness_score.score %>
<span class="small">
<%= freshness_score.timestamp |> Shared.DateTimeDisplay.format_datetime_to_paris(@locale) %>
</span>
<% else %>
Pas de score fraicheur
<% end %>
</div>
<% availability_score = Map.get(@dataset_scores, :availability) %>
<div>
<%= unless is_nil(availability_score) do %>
Score de disponibilité : <%= availability_score.score %>
<span class="small">
<%= availability_score.timestamp |> Shared.DateTimeDisplay.format_datetime_to_paris(@locale) %>
</span>
<% else %>
Pas de score de disponibilité
<% end %>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,7 @@
<%= if admin?(assigns[:current_user]) do %>
<i class="fa fa-external-link-alt"></i>
<%= link("backoffice", to: backoffice_page_path(@conn, :edit, @dataset.id)) %>
<div class="light-grey pt-6">
<%= if not is_nil(@freshness_score) do %>
Score fraicheur : <%= @freshness_score.score %><br />
<%= @freshness_score.timestamp |> Shared.DateTimeDisplay.format_datetime_to_paris(locale) %>
<% else %>
Pas de score fraicheur
<% end %>
</div>
<%= render("_dataset_scores.html", dataset_scores: @dataset_scores, locale: locale) %>
<% end %>
</div>
<div class="dataset-page">
Expand Down
35 changes: 35 additions & 0 deletions apps/transport/test/db/dataset_score_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,39 @@ defmodule DB.DatasetScoreTest do
test "get unexisting latest score" do
assert %DB.Dataset{id: 123_456} |> DB.DatasetScore.get_latest(:freshness) |> is_nil()
end

test "get_latest_scores" do
dataset = insert(:dataset)
other_dataset = insert(:dataset)

# old
insert(:dataset_score,
dataset: dataset,
timestamp: DateTime.utc_now() |> DateTime.add(-1, :day),
score: 1.0,
topic: :freshness
)

# the expected results
freshness_score =
insert(:dataset_score,
dataset_id: dataset.id,
timestamp: DateTime.utc_now() |> DateTime.add(-1, :hour),
score: 0.55,
topic: :freshness
)

availability_score =
insert(:dataset_score, dataset_id: dataset.id, timestamp: DateTime.utc_now(), score: 1.0, topic: :availability)

# other dataset
insert(:dataset_score, dataset: other_dataset, timestamp: DateTime.utc_now(), score: 1.0, topic: :freshness)

assert %{freshness: freshness_score} == DB.DatasetScore.get_latest_scores(dataset, [:freshness])

assert %{freshness: freshness_score, availability: availability_score} ==
DB.DatasetScore.get_latest_scores(dataset, [:freshness, :availability])

assert %{} == DB.DatasetScore.get_latest_scores(%DB.Dataset{id: 123_456}, [:freshness, :availability])
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,32 @@ defmodule TransportWeb.DatasetControllerTest do
|> Phoenix.HTML.safe_to_string()
end

test "displays dataset scores for admins", %{conn: conn} do
dataset = insert(:dataset, is_active: true)

insert(:dataset_score,
dataset: dataset,
timestamp: DateTime.utc_now() |> DateTime.add(-1, :hour),
score: 0.55,
topic: :freshness
)

set_empty_mocks()

content =
conn
|> setup_admin_in_session()
|> get(dataset_path(conn, :details, dataset.slug))
|> html_response(200)

assert content =~ "Score fraicheur : 0.55"

# For someone who's not an admin
set_empty_mocks()
content = conn |> get(dataset_path(conn, :details, dataset.slug)) |> html_response(200)
refute content =~ "Score fraicheur"
end

test "gtfs-rt entities" do
dataset = %{id: dataset_id} = insert(:dataset, type: "public-transit")
%{id: resource_id_1} = insert(:resource, dataset_id: dataset_id, format: "gtfs-rt")
Expand Down

0 comments on commit b4b198d

Please sign in to comment.