Set Consolidated View's timezone to what majority of sites has (#5834)

* Set Consolidated View's timezone to what majority of sites has

* clean up
This commit is contained in:
Adam Rutkowski 2025-10-27 15:28:39 +01:00 committed by GitHub
parent ce02ab0799
commit 7de63a01ae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 69 additions and 3 deletions

View File

@ -26,6 +26,7 @@ defmodule Plausible.ConsolidatedView do
if has_sites_to_consolidate?(team) do
consolidated_view
|> change_stats_dates(team)
|> change_timezone(majority_sites_timezone(team))
|> bump_updated_at()
|> Repo.update!()
else
@ -110,6 +111,10 @@ defmodule Plausible.ConsolidatedView do
end
end
defp change_timezone(site_or_changeset, timezone) do
Ecto.Changeset.change(site_or_changeset, timezone: timezone)
end
defp bump_updated_at(struct_or_changeset) do
Ecto.Changeset.change(struct_or_changeset, updated_at: NaiveDateTime.utc_now(:second))
end
@ -119,7 +124,11 @@ defmodule Plausible.ConsolidatedView do
nil ->
{:ok, consolidated_view} =
team
|> Site.new_for_team(%{consolidated: true, domain: make_id(team)})
|> Site.new_for_team(%{
consolidated: true,
domain: make_id(team)
})
|> change_timezone(majority_sites_timezone(team))
|> change_stats_dates(team)
|> Repo.insert()
@ -160,4 +169,21 @@ defmodule Plausible.ConsolidatedView do
defp has_sites_to_consolidate?(%Team{} = team) do
Teams.owned_sites_count(team) > 0
end
defp majority_sites_timezone(%Team{} = team) do
q =
from(sr in Site.regular(),
where: sr.team_id == ^team.id,
group_by: sr.timezone,
select: {sr.timezone, count(sr.id)},
order_by: [desc: count(sr.id), asc: sr.timezone],
limit: 1
)
case Repo.one(q) do
{"UTC", _count} -> "Etc/UTC"
{timezone, _count} -> timezone
nil -> "Etc/UTC"
end
end
end

View File

@ -72,6 +72,34 @@ defmodule Plausible.ConsolidatedViewTest do
{ConsolidatedView.Cache.get(team.identifier) == [site.id], :ok}
end)
end
test "sets Etc/UTC by default", %{team: team} do
new_site(team: team)
team = Teams.complete_setup(team)
assert {:ok, %Plausible.Site{timezone: "Etc/UTC"}} =
ConsolidatedView.enable(team)
end
test "sets Etc/UTC for UTC sites", %{team: team} do
new_site(team: team, timezone: "UTC")
team = Teams.complete_setup(team)
assert {:ok, %Plausible.Site{timezone: "Etc/UTC"}} =
ConsolidatedView.enable(team)
end
test "sets majority timezone by default", %{team: team} do
new_site(team: team, timezone: "Etc/UTC")
new_site(team: team, timezone: "Europe/Tallinn")
new_site(team: team, timezone: "Europe/Warsaw")
new_site(team: team, timezone: "Europe/Tallinn")
team = Teams.complete_setup(team)
assert {:ok, %Plausible.Site{timezone: "Europe/Tallinn"}} =
ConsolidatedView.enable(team)
end
end
describe "disable/1" do
@ -174,12 +202,23 @@ defmodule Plausible.ConsolidatedViewTest do
@tag :slow
test "re-enables", %{team: team} do
_site = new_site(team: team, native_stats_start_at: ~N[2024-01-01 12:00:00])
_site =
new_site(
team: team,
native_stats_start_at: ~N[2024-01-01 12:00:00],
timezone: "Europe/Warsaw"
)
team = Teams.complete_setup(team)
{:ok, first_enable} = ConsolidatedView.enable(team)
another_site = new_site(team: team, native_stats_start_at: ~N[2024-01-01 10:00:00])
another_site =
new_site(
team: team,
native_stats_start_at: ~N[2024-01-01 10:00:00],
timezone: "Europe/Tallinn"
)
Process.sleep(1_000)
@ -189,6 +228,7 @@ defmodule Plausible.ConsolidatedViewTest do
consolidated_view = ConsolidatedView.get(team)
assert consolidated_view.native_stats_start_at == another_site.native_stats_start_at
assert NaiveDateTime.after?(consolidated_view.updated_at, first_enable.updated_at)
assert consolidated_view.timezone == "Europe/Tallinn"
end
end
end