Added column and UI to prevent automatic deletion

This commit is contained in:
Kieran Eglin 2024-04-03 10:15:16 -07:00
parent 86fa3a11dd
commit 1931fc0bda
No known key found for this signature in database
GPG key ID: 193984967FCF432D
7 changed files with 48 additions and 1 deletions

View file

@ -22,7 +22,6 @@ defmodule Pinchflat.Media do
Repo.all(MediaItem)
end
# TODO: add attr for excluding media items from this list (ie: keep forever)
@doc """
Returns a list of media_items that are cullable based on the retention period
of the source they belong to.
@ -34,6 +33,7 @@ defmodule Pinchflat.Media do
|> MediaQuery.join_sources()
|> MediaQuery.with_media_filepath()
|> MediaQuery.with_passed_retention_period()
|> MediaQuery.with_no_culling_prevention()
|> Repo.all()
end

View file

@ -33,6 +33,7 @@ defmodule Pinchflat.Media.MediaItem do
:nfo_filepath,
# These are user or system controlled fields
:prevent_download,
:prevent_culling,
:culled_at
]
# Pretty much all the fields captured at index are required.
@ -74,6 +75,7 @@ defmodule Pinchflat.Media.MediaItem do
field :subtitle_filepaths, {:array, {:array, :string}}, default: []
field :prevent_download, :boolean, default: false
field :prevent_culling, :boolean, default: false
field :culled_at, :utc_datetime
field :matching_search_term, :string, virtual: true

View file

@ -49,6 +49,10 @@ defmodule Pinchflat.Media.MediaQuery do
)
end
def with_no_culling_prevention(query) do
where(query, [mi], mi.prevent_culling == false)
end
def with_id(query, id) do
where(query, [mi], mi.id == ^id)
end

View file

@ -20,5 +20,12 @@
help="Checking excludes this media item from being downloaded"
/>
<.input
field={f[:prevent_culling]}
type="toggle"
label="Prevent Automatic Deletion"
help="Checking excludes media from being automatically deleted based on media retention rules"
/>
<.button class="my-10 sm:mb-7.5 w-full sm:w-auto" rounding="rounded-lg">Save Media Item</.button>
</.simple_form>

View file

@ -4,6 +4,7 @@ defmodule Pinchflat.Repo.Migrations.AddCulledAtToMediaItems do
def change do
alter table(:media_items) do
add :culled_at, :utc_datetime
add :prevent_culling, :boolean, default: false
end
end
end

View file

@ -4,6 +4,7 @@ defmodule Pinchflat.Downloading.MediaRetentionWorkerTest do
import Pinchflat.MediaFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.Media
alias Pinchflat.Downloading.MediaRetentionWorker
describe "perform/1" do
@ -36,6 +37,17 @@ defmodule Pinchflat.Downloading.MediaRetentionWorkerTest do
assert Repo.reload!(old_media_item).culled_at
assert DateTime.diff(now(), Repo.reload!(old_media_item).culled_at) < 1
end
test "doesn't cull media items that have prevent_culling set" do
{_source, old_media_item, _new_media_item} = prepare_records()
Media.update_media_item(old_media_item, %{prevent_culling: true})
perform_job(MediaRetentionWorker, %{})
assert File.exists?(old_media_item.media_filepath)
assert Repo.reload!(old_media_item).media_filepath
end
end
defp prepare_records do

View file

@ -107,6 +107,27 @@ defmodule Pinchflat.MediaTest do
assert Media.list_cullable_media_items() == [expected_media_item]
end
test "doesn't return items that are set to prevent culling" do
source = source_fixture(%{retention_period_days: 2})
_media_item =
media_item_fixture(%{
source_id: source.id,
media_filepath: "/video/#{Faker.File.file_name(:video)}",
media_downloaded_at: now_minus(3, :days),
prevent_culling: true
})
expected_media_item =
media_item_fixture(%{
source_id: source.id,
media_filepath: "/video/#{Faker.File.file_name(:video)}",
media_downloaded_at: now_minus(3, :days)
})
assert Media.list_cullable_media_items() == [expected_media_item]
end
end
describe "list_pending_media_items_for/1" do