Release 3.0.0 (#5309)
* Update User schema with a field required by teams migration * Start cloak vault for self-hosted release migrations. Since this one is using schemas, existing encrypted columns do require cloak to be up. * Update changelog * Make trial notification ee-only * Replace `Plausible.ee?/0` with `ee?/0` across the codebase * Bump release date
This commit is contained in:
parent
2a18ba8f40
commit
96ebd01f00
10
CHANGELOG.md
10
CHANGELOG.md
|
|
@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
## v3.0.0 - 2025-04-11
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Ability to sort by and compare the `exit_rate` metric in the dashboard Exit Pages > Details report
|
- Ability to sort by and compare the `exit_rate` metric in the dashboard Exit Pages > Details report
|
||||||
- Add top 3 pages into the traffic spike email
|
- Add top 3 pages into the traffic spike email
|
||||||
|
|
@ -71,7 +79,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix Conversion Rate metrics column disappearing from reports when "Goal is ..." filter is within a segment
|
- Fix Conversion Rate metrics column disappearing from reports when "Goal is ..." filter is within a segment
|
||||||
- Graph tooltip now shows year when graph has data from multiple years
|
- Graph tooltip now shows year when graph has data from multiple years
|
||||||
|
|
||||||
## v2.1.5-rc.1 - 2025-01-17
|
## v2.1.5 - 2025-02-03
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,11 @@ defmodule Plausible.Auth.User do
|
||||||
has_many :owner_memberships, Plausible.Teams.Membership, where: [role: :owner]
|
has_many :owner_memberships, Plausible.Teams.Membership, where: [role: :owner]
|
||||||
has_many :owned_teams, through: [:owner_memberships, :team]
|
has_many :owned_teams, through: [:owner_memberships, :team]
|
||||||
|
|
||||||
|
on_ce do
|
||||||
|
# we only need this for backfill teams migration to work; let's figure out how to safely remove later on
|
||||||
|
field :trial_expiry_date, :date
|
||||||
|
end
|
||||||
|
|
||||||
timestamps()
|
timestamps()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,21 @@ defmodule Plausible.DataMigration.BackfillTeams do
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(opts \\ []) do
|
def run(opts \\ []) do
|
||||||
|
start_cloak()
|
||||||
|
|
||||||
dry_run? = Keyword.get(opts, :dry_run?, true)
|
dry_run? = Keyword.get(opts, :dry_run?, true)
|
||||||
Repo.transaction(fn -> backfill(dry_run?) end, timeout: :infinity)
|
Repo.transaction(fn -> backfill(dry_run?) end, timeout: :infinity)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp start_cloak() do
|
||||||
|
Application.ensure_all_started(:cloak)
|
||||||
|
Application.ensure_all_started(:cloak_ecto)
|
||||||
|
Plausible.Auth.TOTP.Vault.start_link(key: totp_vault_key())
|
||||||
|
rescue
|
||||||
|
_ ->
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
defp backfill(dry_run?) do
|
defp backfill(dry_run?) do
|
||||||
# Orphaned teams
|
# Orphaned teams
|
||||||
|
|
||||||
|
|
@ -614,4 +625,10 @@ defmodule Plausible.DataMigration.BackfillTeams do
|
||||||
defp log(msg) do
|
defp log(msg) do
|
||||||
IO.puts("[#{DateTime.utc_now(:second)}] #{msg}")
|
IO.puts("[#{DateTime.utc_now(:second)}] #{msg}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp totp_vault_key() do
|
||||||
|
:plausible
|
||||||
|
|> Application.fetch_env!(Plausible.Auth.TOTP)
|
||||||
|
|> Keyword.fetch!(:vault_key)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -554,7 +554,7 @@ defmodule PlausibleWeb.Email do
|
||||||
def priority_email(%{layout: layout}) do
|
def priority_email(%{layout: layout}) do
|
||||||
email = base_email(%{layout: layout})
|
email = base_email(%{layout: layout})
|
||||||
|
|
||||||
if Plausible.ee?() do
|
if ee?() do
|
||||||
put_param(email, "MessageStream", "priority")
|
put_param(email, "MessageStream", "priority")
|
||||||
else
|
else
|
||||||
email
|
email
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
You've activated
|
You've activated
|
||||||
<%= if Plausible.ee?() do %>
|
<%= if ee?() do %>
|
||||||
your free 30-day trial of
|
your free 30-day trial of
|
||||||
<% end %>
|
<% end %>
|
||||||
{Plausible.product_name()}, a simple and privacy-friendly website analytics tool. <br /><br />
|
{Plausible.product_name()}, a simple and privacy-friendly website analytics tool. <br /><br />
|
||||||
<a href={"#{plausible_url()}/sites/new"}>Click here</a>
|
<a href={"#{plausible_url()}/sites/new"}>Click here</a>
|
||||||
to add your website URL, your timezone and install our one-line JavaScript snippet to start collecting visitor statistics.
|
to add your website URL, your timezone and install our one-line JavaScript snippet to start collecting visitor statistics.
|
||||||
<%= if Plausible.ee?() do %>
|
<%= if ee?() do %>
|
||||||
<br /><br />Do reply back to this email if you have any questions or need some guidance.
|
<br /><br />Do reply back to this email if you have any questions or need some guidance.
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<%= if Plausible.ee?() and Plausible.Teams.on_trial?(@site_team) do %>
|
<%= if ee?() and Plausible.Teams.on_trial?(@site_team) do %>
|
||||||
You signed up for a free 30-day trial of Plausible, a simple and privacy-friendly website analytics tool.
|
You signed up for a free 30-day trial of Plausible, a simple and privacy-friendly website analytics tool.
|
||||||
<br /><br />
|
<br /><br />
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
@ -9,6 +9,6 @@ This Plausible script is 45 times smaller than Google Analytics script so you’
|
||||||
<br /><br /> On WordPress? We have a
|
<br /><br /> On WordPress? We have a
|
||||||
<a href="https://plausible.io/wordpress-analytics-plugin">WordPress plugin</a> that makes the process simpler. We also have
|
<a href="https://plausible.io/wordpress-analytics-plugin">WordPress plugin</a> that makes the process simpler. We also have
|
||||||
<a href="https://plausible.io/docs/integration-guides">integration guides</a> for different site builders to help you start counting stats in no time.
|
<a href="https://plausible.io/docs/integration-guides">integration guides</a> for different site builders to help you start counting stats in no time.
|
||||||
<%= if Plausible.ee?() do %>
|
<%= if ee?() do %>
|
||||||
<br /><br /> Do reply back to this email if you have any questions or need some guidance.
|
<br /><br /> Do reply back to this email if you have any questions or need some guidance.
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
resource="sites"
|
resource="sites"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<%= if is_nil(@current_team) or is_nil(@current_team.trial_expiry_date) do %>
|
<%= if ee?() and (is_nil(@current_team) or is_nil(@current_team.trial_expiry_date)) do %>
|
||||||
<div class="rounded-md bg-blue-50 dark:bg-transparent dark:border border-blue-200 p-4">
|
<div class="rounded-md bg-blue-50 dark:bg-transparent dark:border border-blue-200 p-4">
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<div class="flex-shrink-0">
|
<div class="flex-shrink-0">
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@ defmodule PlausibleWeb.BillingControllerTest do
|
||||||
assert %{
|
assert %{
|
||||||
"disableLogout" => true,
|
"disableLogout" => true,
|
||||||
"email" => user.email,
|
"email" => user.email,
|
||||||
"passthrough" => "ee:#{Plausible.ee?()};user:#{user.id};team:#{team.id}",
|
"passthrough" => "ee:#{ee?()};user:#{user.id};team:#{team.id}",
|
||||||
"product" => @configured_enterprise_plan_paddle_plan_id,
|
"product" => @configured_enterprise_plan_paddle_plan_id,
|
||||||
"success" => Routes.billing_path(PlausibleWeb.Endpoint, :upgrade_success),
|
"success" => Routes.billing_path(PlausibleWeb.Endpoint, :upgrade_success),
|
||||||
"theme" => "none"
|
"theme" => "none"
|
||||||
|
|
@ -337,7 +337,7 @@ defmodule PlausibleWeb.BillingControllerTest do
|
||||||
assert %{
|
assert %{
|
||||||
"disableLogout" => true,
|
"disableLogout" => true,
|
||||||
"email" => user.email,
|
"email" => user.email,
|
||||||
"passthrough" => "ee:#{Plausible.ee?()};user:#{user.id};team:#{team.id}",
|
"passthrough" => "ee:#{ee?()};user:#{user.id};team:#{team.id}",
|
||||||
"product" => @configured_enterprise_plan_paddle_plan_id,
|
"product" => @configured_enterprise_plan_paddle_plan_id,
|
||||||
"success" => Routes.billing_path(PlausibleWeb.Endpoint, :upgrade_success),
|
"success" => Routes.billing_path(PlausibleWeb.Endpoint, :upgrade_success),
|
||||||
"theme" => "none"
|
"theme" => "none"
|
||||||
|
|
|
||||||
|
|
@ -430,7 +430,7 @@ defmodule PlausibleWeb.SiteControllerTest do
|
||||||
assert html_response(conn, 200) =~
|
assert html_response(conn, 200) =~
|
||||||
"This domain cannot be registered. Perhaps one of your colleagues registered it?"
|
"This domain cannot be registered. Perhaps one of your colleagues registered it?"
|
||||||
|
|
||||||
if Plausible.ee?() do
|
if ee?() do
|
||||||
assert html_response(conn, 200) =~ "support@plausible.io"
|
assert html_response(conn, 200) =~ "support@plausible.io"
|
||||||
else
|
else
|
||||||
refute html_response(conn, 200) =~ "support@plausible.io"
|
refute html_response(conn, 200) =~ "support@plausible.io"
|
||||||
|
|
@ -453,7 +453,7 @@ defmodule PlausibleWeb.SiteControllerTest do
|
||||||
assert html_response(conn, 200) =~
|
assert html_response(conn, 200) =~
|
||||||
"This domain cannot be registered. Perhaps one of your colleagues registered it?"
|
"This domain cannot be registered. Perhaps one of your colleagues registered it?"
|
||||||
|
|
||||||
if Plausible.ee?() do
|
if ee?() do
|
||||||
assert html_response(conn, 200) =~ "support@plausible.io"
|
assert html_response(conn, 200) =~ "support@plausible.io"
|
||||||
else
|
else
|
||||||
refute html_response(conn, 200) =~ "support@plausible.io"
|
refute html_response(conn, 200) =~ "support@plausible.io"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue