mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-02-17 11:04:22 +01:00
fixes #124, uploads not blocked for DNP
This commit is contained in:
parent
91ebd70966
commit
d7f5cbcb77
9 changed files with 91 additions and 8 deletions
|
@ -64,6 +64,7 @@ defmodule Philomena.Images do
|
||||||
%Image{}
|
%Image{}
|
||||||
|> Image.creation_changeset(attrs, attribution)
|
|> Image.creation_changeset(attrs, attribution)
|
||||||
|> Image.tag_changeset(attrs, [], tags)
|
|> Image.tag_changeset(attrs, [], tags)
|
||||||
|
|> Image.dnp_changeset(attribution[:user])
|
||||||
|> Uploader.analyze_upload(attrs)
|
|> Uploader.analyze_upload(attrs)
|
||||||
|
|
||||||
Multi.new()
|
Multi.new()
|
||||||
|
|
72
lib/philomena/images/dnp_validator.ex
Normal file
72
lib/philomena/images/dnp_validator.ex
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
defmodule Philomena.Images.DnpValidator do
|
||||||
|
import Ecto.Changeset
|
||||||
|
import Ecto.Query
|
||||||
|
alias Philomena.Repo
|
||||||
|
alias Philomena.Tags.Tag
|
||||||
|
|
||||||
|
def validate_dnp(changeset, uploader) do
|
||||||
|
tags =
|
||||||
|
changeset
|
||||||
|
|> get_field(:tags)
|
||||||
|
|> extract_tags()
|
||||||
|
|
||||||
|
edit_present? = MapSet.member?(tags, "edit")
|
||||||
|
|
||||||
|
tags_with_dnp =
|
||||||
|
Tag
|
||||||
|
|> where([t], t.name in ^extract_artists(tags))
|
||||||
|
|> preload(dnp_entries: :requesting_user)
|
||||||
|
|> Repo.all()
|
||||||
|
|> Enum.filter(&(length(&1.dnp_entries) > 0))
|
||||||
|
|
||||||
|
changeset
|
||||||
|
|> validate_artist_only(tags_with_dnp, uploader)
|
||||||
|
|> validate_no_edits(tags_with_dnp, uploader, edit_present?)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp validate_artist_only(changeset, tags_with_dnp, uploader) do
|
||||||
|
Enum.reduce(tags_with_dnp, changeset, fn tag, changeset ->
|
||||||
|
case Enum.any?(
|
||||||
|
tag.dnp_entries,
|
||||||
|
&(&1.dnp_type == "Artist Upload Only" and
|
||||||
|
not same_user?(&1.requesting_user, uploader))
|
||||||
|
) do
|
||||||
|
true ->
|
||||||
|
add_error(changeset, :image, "DNP (Artist upload only)")
|
||||||
|
|
||||||
|
false ->
|
||||||
|
changeset
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp validate_no_edits(changeset, _tags_with_dnp, _uploader, false), do: changeset
|
||||||
|
|
||||||
|
defp validate_no_edits(changeset, tags_with_dnp, uploader, true) do
|
||||||
|
Enum.reduce(tags_with_dnp, changeset, fn tag, changeset ->
|
||||||
|
case Enum.any?(
|
||||||
|
tag.dnp_entries,
|
||||||
|
&(&1.dnp_type == "No Edits" and not same_user?(&1.requesting_user, uploader))
|
||||||
|
) do
|
||||||
|
true ->
|
||||||
|
add_error(changeset, :image, "DNP (No edits)")
|
||||||
|
|
||||||
|
false ->
|
||||||
|
changeset
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp same_user?(%{id: id}, %{id: id}), do: true
|
||||||
|
defp same_user?(_user1, _user2), do: false
|
||||||
|
|
||||||
|
defp extract_tags(tags) do
|
||||||
|
tags
|
||||||
|
|> Enum.map(& &1.name)
|
||||||
|
|> MapSet.new()
|
||||||
|
end
|
||||||
|
|
||||||
|
defp extract_artists(tags) do
|
||||||
|
Enum.filter(tags, &String.starts_with?(&1, "artist:"))
|
||||||
|
end
|
||||||
|
end
|
|
@ -18,6 +18,7 @@ defmodule Philomena.Images.Image do
|
||||||
|
|
||||||
alias Philomena.Images.TagDiffer
|
alias Philomena.Images.TagDiffer
|
||||||
alias Philomena.Images.TagValidator
|
alias Philomena.Images.TagValidator
|
||||||
|
alias Philomena.Images.DnpValidator
|
||||||
alias Philomena.Repo
|
alias Philomena.Repo
|
||||||
|
|
||||||
schema "images" do
|
schema "images" do
|
||||||
|
@ -176,6 +177,12 @@ defmodule Philomena.Images.Image do
|
||||||
|> cache_changeset()
|
|> cache_changeset()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def dnp_changeset(image, user) do
|
||||||
|
image
|
||||||
|
|> change()
|
||||||
|
|> DnpValidator.validate_dnp(user)
|
||||||
|
end
|
||||||
|
|
||||||
def thumbnail_changeset(image, attrs) do
|
def thumbnail_changeset(image, attrs) do
|
||||||
image
|
image
|
||||||
|> cast(attrs, [:image_sha512_hash, :image_size])
|
|> cast(attrs, [:image_sha512_hash, :image_size])
|
||||||
|
|
|
@ -33,7 +33,12 @@ defmodule Philomena.Processors.Svg do
|
||||||
[{:symlink_original, "full.svg"}, {:copy, preview, "full.png"}]
|
[{:symlink_original, "full.svg"}, {:copy, preview, "full.png"}]
|
||||||
end
|
end
|
||||||
|
|
||||||
defp scale_if_smaller(_file, {width, height}, preview, {thumb_name, {target_width, target_height}}) do
|
defp scale_if_smaller(
|
||||||
|
_file,
|
||||||
|
{width, height},
|
||||||
|
preview,
|
||||||
|
{thumb_name, {target_width, target_height}}
|
||||||
|
) do
|
||||||
if width > target_width or height > target_height do
|
if width > target_width or height > target_height do
|
||||||
scaled = scale(preview, {target_width, target_height})
|
scaled = scale(preview, {target_width, target_height})
|
||||||
|
|
||||||
|
|
|
@ -161,8 +161,7 @@ defmodule PhilomenaWeb.GalleryController do
|
||||||
defp gallery_image(offset, conn, query) do
|
defp gallery_image(offset, conn, query) do
|
||||||
pagination_params = %{page_number: offset + 1, page_size: 1}
|
pagination_params = %{page_number: offset + 1, page_size: 1}
|
||||||
|
|
||||||
{:ok, {image, _tags}} =
|
{:ok, {image, _tags}} = ImageLoader.search_string(conn, query, pagination: pagination_params)
|
||||||
ImageLoader.search_string(conn, query, pagination: pagination_params)
|
|
||||||
|
|
||||||
case Enum.to_list(image) do
|
case Enum.to_list(image) do
|
||||||
[image] -> image
|
[image] -> image
|
||||||
|
|
|
@ -31,8 +31,7 @@ defmodule PhilomenaWeb.Image.RandomController do
|
||||||
defp query(_user, _), do: %{match_all: %{}}
|
defp query(_user, _), do: %{match_all: %{}}
|
||||||
|
|
||||||
defp random_image_id(query, filter) do
|
defp random_image_id(query, filter) do
|
||||||
%{query: query, sorts: sort} =
|
%{query: query, sorts: sort} = ImageSorter.parse_sort(%{"sf" => "random"}, query)
|
||||||
ImageSorter.parse_sort(%{"sf" => "random"}, query)
|
|
||||||
|
|
||||||
Elasticsearch.search_records(
|
Elasticsearch.search_records(
|
||||||
Image,
|
Image,
|
||||||
|
|
|
@ -33,8 +33,7 @@ defmodule PhilomenaWeb.ImageNavigator do
|
||||||
|> Map.merge(empty_fields())
|
|> Map.merge(empty_fields())
|
||||||
|> ElasticsearchIndex.as_json()
|
|> ElasticsearchIndex.as_json()
|
||||||
|
|
||||||
%{query: compiled_query, sorts: sort} =
|
%{query: compiled_query, sorts: sort} = ImageSorter.parse_sort(params, compiled_query)
|
||||||
ImageSorter.parse_sort(params, compiled_query)
|
|
||||||
|
|
||||||
{sorts, filters} =
|
{sorts, filters} =
|
||||||
sort
|
sort
|
||||||
|
|
|
@ -64,7 +64,7 @@ defmodule PhilomenaWeb.ImageSorter do
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
p Upload a file from your computer, or provide a link to the page containing the image and click Fetch.
|
p Upload a file from your computer, or provide a link to the page containing the image and click Fetch.
|
||||||
.field
|
.field
|
||||||
= file_input f, :image, class: "input js-scraper"
|
= file_input f, :image, class: "input js-scraper"
|
||||||
|
= error_tag f, :image
|
||||||
= error_tag f, :image_size
|
= error_tag f, :image_size
|
||||||
= error_tag f, :image_width
|
= error_tag f, :image_width
|
||||||
= error_tag f, :image_height
|
= error_tag f, :image_height
|
||||||
|
|
Loading…
Reference in a new issue