From 580cc3bc9afc93a805f59a6e488a3998308a0295 Mon Sep 17 00:00:00 2001 From: evazion Date: Tue, 29 Nov 2022 01:39:14 -0600 Subject: [PATCH] Fix #5311: Unexpected error: Module::DelegationError on failed media assets. --- .../media_asset_component.html.erb | 8 +++- app/models/media_asset.rb | 2 +- app/views/media_assets/show.html.erb | 38 ++++++++++--------- .../media_assets_controller_test.rb | 11 +++++- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/app/components/media_asset_component/media_asset_component.html.erb b/app/components/media_asset_component/media_asset_component.html.erb index fae5aeadc..45b31f623 100644 --- a/app/components/media_asset_component/media_asset_component.html.erb +++ b/app/components/media_asset_component/media_asset_component.html.erb @@ -6,7 +6,13 @@ 100% - <% if !policy(media_asset).can_see_image? %> + <% if media_asset.expunged? || media_asset.deleted? %> +

Image deleted.

+ <% elsif media_asset.processing? %> +

<%= spinner_icon(class: "h-8") %>

+ <% elsif media_asset.failed? %> +

Upload failed.

+ <% elsif !media_asset.active? || !policy(media_asset).can_see_image? %>

Image unavailable.

<% elsif is_image? %> <%= tag.img src: variant(:original).file_url, width: image_width, height: image_height, draggable: "false", class: "media-asset-image max-h-inherit max-w-full h-full w-auto select-none" -%> diff --git a/app/models/media_asset.rb b/app/models/media_asset.rb index 1bb44d37f..a5795e799 100644 --- a/app/models/media_asset.rb +++ b/app/models/media_asset.rb @@ -21,7 +21,7 @@ class MediaAsset < ApplicationRecord has_many :uploaders, through: :uploads, class_name: "User", foreign_key: :uploader_id has_many :ai_tags - delegate :frame_delays, :metadata, to: :media_metadata + delegate :frame_delays, :metadata, to: :media_metadata, allow_nil: true delegate :is_non_repeating_animation?, :is_greyscale?, :is_rotated?, :is_ai_generated?, :has_sound?, to: :metadata scope :public_only, -> { where(is_public: true) } diff --git a/app/views/media_assets/show.html.erb b/app/views/media_assets/show.html.erb index 5b851bbb6..5e1d0d3a5 100644 --- a/app/views/media_assets/show.html.erb +++ b/app/views/media_assets/show.html.erb @@ -34,26 +34,28 @@
-
-

Tags

+ <% if @media_asset.ai_tags.present? %> +
+

Tags

-
    - <% @media_asset.ai_tags.undeprecated.sort_by { |tag| [TagCategory.split_header_list.index(tag.category_name.downcase), tag.name.starts_with?("rating:") ? 0 : 1, tag.name] }.each do |ai_tag| %> - <%= tag.li class: "tag-type-#{ai_tag.category} space-x-1 text-sm", "data-tag-name": ai_tag.name do %> - <% if ai_tag.tag.artist? %> - <%= link_to "?", show_or_new_artists_path(name: ai_tag.name) %> - <% elsif ai_tag.name =~ /\A\d+\z/ %> - <%= link_to "?", wiki_page_path("~#{ai_tag.name}") %> - <% else %> - <%= link_to "?", wiki_page_path(ai_tag.name) %> +
      + <% @media_asset.ai_tags.undeprecated.sort_by { |tag| [TagCategory.split_header_list.index(tag.category_name.downcase), tag.name.starts_with?("rating:") ? 0 : 1, tag.name] }.each do |ai_tag| %> + <%= tag.li class: "tag-type-#{ai_tag.category} space-x-1 text-sm", "data-tag-name": ai_tag.name do %> + <% if ai_tag.tag.artist? %> + <%= link_to "?", show_or_new_artists_path(name: ai_tag.name) %> + <% elsif ai_tag.name =~ /\A\d+\z/ %> + <%= link_to "?", wiki_page_path("~#{ai_tag.name}") %> + <% else %> + <%= link_to "?", wiki_page_path(ai_tag.name) %> + <% end %> + + <%= link_to ai_tag.pretty_name, media_assets_path(search: { ai_tags_match: ai_tag.name }), class: "break-word" %> + <%= tag.span "#{ai_tag.score}%", class: ["text-muted text-xs"] %> <% end %> - - <%= link_to ai_tag.pretty_name, media_assets_path(search: { ai_tags_match: ai_tag.name }), class: "break-word" %> - <%= tag.span "#{ai_tag.score}%", class: ["text-muted text-xs"] %> <% end %> - <% end %> -
    -
+ +
+ <% end %>
@@ -104,7 +106,7 @@ <% end %> - <% @media_asset.metadata.group_by { |key, value| key.split(":").first }.sort.each do |group, pairs| %> + <% @media_asset.metadata.to_h.group_by { |key, value| key.split(":").first }.sort.each do |group, pairs| %> diff --git a/test/functional/media_assets_controller_test.rb b/test/functional/media_assets_controller_test.rb index f789aded2..58115735a 100644 --- a/test/functional/media_assets_controller_test.rb +++ b/test/functional/media_assets_controller_test.rb @@ -21,7 +21,9 @@ class MediaAssetsControllerTest < ActionDispatch::IntegrationTest context "show action" do should "render" do @media_asset = create(:media_asset) - get media_asset_path(@media_asset), as: :json + @ai_tags = create_list(:ai_tag, 10, media_asset: @media_asset) + + get media_asset_path(@media_asset) assert_response :success end @@ -34,6 +36,13 @@ class MediaAssetsControllerTest < ActionDispatch::IntegrationTest assert_response :success assert_nil(response.parsed_body[:md5]) end + + should "work for a deleted asset" do + @media_asset = create(:media_asset, status: "deleted", media_metadata: nil) + get media_asset_path(@media_asset) + + assert_response :success + end end end end
<%= group.split(/[ _-]/).map(&:upcase_first).join(" ") %>