Skip to content

Commit

Permalink
Validation NeTEx automatique
Browse files Browse the repository at this point in the history
  • Loading branch information
ptitfred committed Sep 19, 2024
1 parent f95d9a5 commit 4ac870b
Show file tree
Hide file tree
Showing 7 changed files with 239 additions and 29 deletions.
73 changes: 52 additions & 21 deletions apps/transport/lib/transport_web/controllers/resource_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ defmodule TransportWeb.ResourceController do
Transport.Validators.GTFSRT,
Transport.Validators.GBFSValidator,
Transport.Validators.TableSchema,
Transport.Validators.EXJSONSchema
Transport.Validators.EXJSONSchema,
Transport.Validators.NeTEx
])

def details(conn, %{"id" => id} = params) do
Expand All @@ -31,10 +32,10 @@ defmodule TransportWeb.ResourceController do
|> assign(:multi_validation, latest_validation(resource))
|> put_resource_flash(resource.dataset.is_active)

if Resource.gtfs?(resource) do
render_gtfs_details(conn, params, resource)
else
conn |> assign(:resource, resource) |> render("details.html")
cond do
Resource.gtfs?(resource) -> render_gtfs_details(conn, params, resource)
Resource.netex?(resource) -> render_netex_details(conn, params, resource)
true -> render_details(conn, resource)
end
end

Expand Down Expand Up @@ -126,40 +127,70 @@ defmodule TransportWeb.ResourceController do
DB.MultiValidation.resource_latest_validation(resource_id, validator)
end

defp render_gtfs_details(conn, params, resource) do
config = make_pagination_config(params)
def render_details(conn, resource) do
conn |> assign(:resource, resource) |> render("details.html")
end

validation = resource |> latest_validation()
defp render_gtfs_details(conn, params, resource) do
validator = Transport.Validators.GTFSTransport

{validation_summary, severities_count, metadata, modes, issues} =
case validation do
%{result: validation_result, metadata: %DB.ResourceMetadata{metadata: metadata, modes: modes}} ->
{Transport.Validators.GTFSTransport.summary(validation_result),
Transport.Validators.GTFSTransport.count_by_severity(validation_result), metadata, modes,
Transport.Validators.GTFSTransport.get_issues(validation_result, params)}
validation = latest_validation(resource)

nil ->
{nil, nil, nil, [], []}
end
validation_details = {_, _, _, _, issues} = build_validation_details(params, resource, validator)

issue_type =
case params["issue_type"] do
nil -> Transport.Validators.GTFSTransport.issue_type(issues)
nil -> validator.issue_type(issues)
issue_type -> issue_type
end

conn
|> assign_base_resource_details(params, resource, validation_details, validator)
|> assign(:data_vis, encoded_data_vis(issue_type, validation))
|> render("gtfs_details.html")
end

defp render_netex_details(conn, params, resource) do
validator = Transport.Validators.NeTEx

validation_details = build_validation_details(params, resource, validator)

conn
|> assign_base_resource_details(params, resource, validation_details, validator)
|> assign(:data_vis, nil)
|> render("netex_details.html")
end

defp build_validation_details(params, resource, validator) do
case latest_validation(resource) do
%{result: validation_result, metadata: metadata = %DB.ResourceMetadata{}} ->
summary = validator.summary(validation_result)
stats = validator.count_by_severity(validation_result)
issues = validator.get_issues(validation_result, params)

{summary, stats, metadata.metadata, metadata.modes, issues}

nil ->
{nil, nil, nil, [], []}
end
end

defp assign_base_resource_details(conn, params, resource, validation_details, validator) do
config = make_pagination_config(params)

{validation_summary, severities_count, metadata, modes, issues} = validation_details

conn
|> assign(:related_files, Resource.get_related_files(resource))
|> assign(:resource, resource)
|> assign(:other_resources, Resource.other_resources(resource))
|> assign(:issues, Scrivener.paginate(issues, config))
|> assign(:data_vis, encoded_data_vis(issue_type, validation))
|> assign(:validation_summary, validation_summary)
|> assign(:severities_count, severities_count)
|> assign(:validation, validation)
|> assign(:validation, latest_validation(resource))
|> assign(:metadata, metadata)
|> assign(:modes, modes)
|> render("gtfs_details.html")
|> assign(:validator, validator)
end

def encoded_data_vis(_, nil), do: nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ associated_netex = get_associated_netex(@related_files) %>
conn: @conn,
data_vis: @data_vis,
token: nil,
validator: Transport.Validators.GTFSTransport
validator: @validator
) %>
</nav>
<div class="main-pane">
Expand All @@ -120,14 +120,16 @@ associated_netex = get_associated_netex(@related_files) %>
<%= raw(
dgettext(
"validations",
~s(Validation carried out using the <a href="%{gtfs_link}">current GTFS file</a> the %{date} using the <a href="%{validator_url}" target="_blank">PAN GTFS validator</a>.),
gtfs_link: Map.fetch!(@validation.resource_history.payload, "permanent_url"),
~s(Validation carried out using the <a href="%{link}">current %{format} file</a> the %{date} using the <a href="%{validator_url}" target="_blank">%{validator_name}</a>.),
link: Map.fetch!(@validation.resource_history.payload, "permanent_url"),
format: "GTFS",
date:
DateTimeDisplay.format_datetime_to_paris(
@validation.validation_timestamp,
get_session(@conn, :locale)
),
validator_url: gtfs_validator_url()
validator_url: gtfs_validator_url(),
validator_name: dgettext("validations", "PAN GTFS validator")
)
) %>
</p>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
<section>
<div class="grey-background">
<div class="container">
<h2 class="mt-48"><%= dgettext("validations", "Resource details") %></h2>
<div class="panel">
<p>
<%= dgettext("validations", "File name") %> :
<a href={DB.Resource.download_url(@resource)}>
<strong><%= @resource.title %></strong>
</a>
</p>
<div :if={should_display_description?(@resource)} class="panel mt-24" lang="fr">
<%= description(@resource) %>
</div>
<p>
<%= dgettext("validations", "This resource file is part of the dataset") %> <%= link(
@resource.dataset.custom_title,
to: dataset_path(@conn, :details, @resource.dataset.slug)
) %>.
</p>
<%= render("_resources_details.html", conn: @conn, metadata: @metadata, modes: @modes) %>
</div>

<h2 id="download-availability"><%= dgettext("page-dataset-details", "Download availability") %></h2>
<%= render("_download_availability.html", uptime_per_day: @uptime_per_day, conn: @conn) %>

<h2 class="mt-48" id="visualization">
<%= dgettext("validations", "Stops and routes visualization of the GTFS file") %>
</h2>
<h2 id="validation-report" class="mt-48"><%= dgettext("validations", "Validation report") %></h2>
<div class="panel" id="issues">
<%= if is_nil(@validation_summary) do %>
<%= dgettext("validations", "No validation available") %>
<% end %>
<%= unless is_nil(@validation_summary) do %>
<%= if @issues.total_entries == 0 do %>
<%= dgettext("validations", "No validation error") %>.
<% else %>
<nav class="issues-list validation" role="navigation">
<%= render("_validation_summary.html",
validation_summary: @validation_summary,
severities_count: @severities_count,
issues: @issues,
conn: @conn,
data_vis: nil,
token: nil,
validator: @validator
) %>
</nav>
<div class="main-pane">
<%= pagination_links(@conn, @issues, [@resource.id],
issue_type: Transport.Validators.GTFSTransport.issue_type(@issues.entries),
path: &resource_path/4,
action: :details
) %>
<%= render(gtfs_template(@issues), issues: @issues || [], conn: @conn) %>
</div>
<% end %>
<p>
<%= raw(
dgettext(
"validations",
~s(Validation carried out using the <a href="%{link}">current %{format} file</a> the %{date} using the <a href="%{validator_url}" target="_blank">%{validator_name}</a>.),
link: Map.fetch!(@validation.resource_history.payload, "permanent_url"),
format: "NeTEx",
date:
DateTimeDisplay.format_datetime_to_paris(
@validation.validation_timestamp,
get_session(@conn, :locale)
),
validator_url: gtfs_validator_url(),
validator_name: dgettext("validations", "enRoute Chouette Valid")
)
) %>
</p>
<% end %>
</div>
<%= if length(@other_resources) > 0 do %>
<h2><%= TransportWeb.Gettext.dgettext("validations", "Other resources") %></h2>
<div class="panel">
<ul>
<%= for resource <- @other_resources do %>
<li>
<%= link(resource.title,
to: resource_path(@conn, :details, resource.id)
) %>
</li>
<% end %>
</ul>
</div>
<% end %>
</div>
</div>
</section>
<script src={static_path(@conn, "/js/utils.js")} />
<script>
document.addEventListener("DOMContentLoaded", function() {
addSeeMore("5em",
".networks-start-end",
"<%= dgettext("page-dataset-details", "Display more") %>",
"<%= dgettext("page-dataset-details", "Display less") %>",
"gtfs_dates_per_network"
)
})
</script>
10 changes: 9 additions & 1 deletion apps/transport/priv/gettext/en/LC_MESSAGES/validations.po
Original file line number Diff line number Diff line change
Expand Up @@ -275,9 +275,17 @@ msgid "Upload in progress"
msgstr ""

#, elixir-autogen, elixir-format, fuzzy
msgid "Validation carried out using the <a href=\"%{gtfs_link}\">current GTFS file</a> the %{date} using the <a href=\"%{validator_url}\" target=\"_blank\">PAN GTFS validator</a>."
msgid "Validation carried out using the <a href=\"%{link}\">current %{format} file</a> the %{date} using the <a href=\"%{validator_url}\" target=\"_blank\">%{validator_name}</a>."
msgstr ""

#, elixir-autogen, elixir-format
msgid "PAN GTFS validator"
msgstr ""

#, elixir-autogen, elixir-format
msgid "enRoute Chouette Valid"
msgstr "enRoute Chouette Valid validator"

#, elixir-autogen, elixir-format
msgid "from"
msgstr ""
Expand Down
12 changes: 10 additions & 2 deletions apps/transport/priv/gettext/fr/LC_MESSAGES/validations.po
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,16 @@ msgid "Upload in progress"
msgstr "Envoi en cours"

#, elixir-autogen, elixir-format
msgid "Validation carried out using the <a href=\"%{gtfs_link}\">current GTFS file</a> the %{date} using the <a href=\"%{validator_url}\" target=\"_blank\">PAN GTFS validator</a>."
msgstr "Validation effectuée en utilisant <a href=\"%{gtfs_link}\">le fichier GTFS en vigueur</a> le %{date} avec <a href=\"%{validator_url}\" target=\"_blank\">le validateur GTFS du <abbr title=\"Point d'Accès National\">PAN</abbr></a>."
msgid "Validation carried out using the <a href=\"%{link}\">current %{format} file</a> the %{date} using the <a href=\"%{validator_url}\" target=\"_blank\">%{validator_name}</a>."
msgstr "Validation effectuée en utilisant <a href=\"%{link}\">le fichier %{format} en vigueur</a> le %{date} avec <a href=\"%{validator_url}\" target=\"_blank\">%{validator_name}</a>."

#, elixir-autogen, elixir-format
msgid "PAN GTFS validator"
msgstr "le validateur GTFS du <abbr title=\"Point d’Accès National\">PAN</abbr>"

#, elixir-autogen, elixir-format
msgid "enRoute Chouette Valid"
msgstr "le validateur NeTEx d’enRoute"

#, elixir-autogen, elixir-format
msgid "from"
Expand Down
10 changes: 9 additions & 1 deletion apps/transport/priv/gettext/validations.pot
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ msgid "Upload in progress"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Validation carried out using the <a href=\"%{gtfs_link}\">current GTFS file</a> the %{date} using the <a href=\"%{validator_url}\" target=\"_blank\">PAN GTFS validator</a>."
msgid "Validation carried out using the <a href=\"%{link}\">current %{format} file</a> the %{date} using the <a href=\"%{validator_url}\" target=\"_blank\">%{validator_name}</a>."
msgstr ""

#, elixir-autogen, elixir-format
Expand Down Expand Up @@ -427,3 +427,11 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "less than 1 second"
msgstr ""

#, elixir-autogen, elixir-format
msgid "PAN GTFS validator"
msgstr ""

#, elixir-autogen, elixir-format
msgid "enRoute Chouette Valid"
msgstr ""
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,54 @@ defmodule TransportWeb.ResourceControllerTest do
|> html_response(200) =~ "couverture calendaire par réseau"
end

test "NeTEx validation is shown", %{conn: conn} do
%{id: dataset_id} = insert(:dataset)

%{id: resource_id} =
insert(:resource, %{
dataset_id: dataset_id,
format: "NeTEx",
url: "https://example.com/file"
})

conn1 = conn |> get(resource_path(conn, :details, resource_id))
assert conn1 |> html_response(200) =~ "Pas de validation disponible"

%{id: resource_history_id} =
insert(:resource_history, %{
resource_id: resource_id,
payload: %{"permanent_url" => permanent_url = "https://example.com/#{Ecto.UUID.generate()}"}
})

insert(:multi_validation, %{
resource_history_id: resource_history_id,
validator: Transport.Validators.NeTEx.validator_name(),
result: %{
"xsd-1871" => [
%{
"code" => "xsd-1871",
"message" =>
"Element '{http://www.netex.org.uk/netex}OppositeDIrectionRef': This element is not expected. Expected is ( {http://www.netex.org.uk/netex}OppositeDirectionRef ).",
"criticity" => "error"
}
]
},
max_error: "error",
metadata: %DB.ResourceMetadata{
metadata: %{},
modes: [],
features: []
},
validation_timestamp: ~U[2022-10-28 14:12:29.041243Z]
})

content = conn |> get(resource_path(conn, :details, resource_id)) |> html_response(200)
assert content =~ "Rapport de validation"

assert content =~
~s{Validation effectuée en utilisant <a href="#{permanent_url}">le fichier NeTEx en vigueur</a> le 28/10/2022 à 16h12 Europe/Paris}
end

test "GTFS-RT validation is shown", %{conn: conn} do
%{id: dataset_id} = insert(:dataset)
%{id: gtfs_id} = insert(:resource, format: "GTFS", dataset_id: dataset_id)
Expand Down

0 comments on commit 4ac870b

Please sign in to comment.