From b18bb73f4b336c9fda8abde2a09c0cbf00c7352c Mon Sep 17 00:00:00 2001 From: Toks Date: Thu, 22 May 2014 20:07:15 -0400 Subject: [PATCH] Implentation for #2141 --- app/assets/javascripts/related_tag.js | 7 ++++++ app/assets/javascripts/uploads.js | 3 +++ .../stylesheets/specific/wiki_pages.css.scss | 8 ++++++ app/helpers/wiki_page_versions_helper.rb | 20 +++++++++++++++ app/helpers/wiki_pages_helper.rb | 5 ++++ app/logical/sources/site.rb | 5 ++++ app/models/wiki_page.rb | 25 ++++++++++++++++--- app/models/wiki_page_version.rb | 5 +++- app/views/wiki_page_versions/diff.html.erb | 2 ++ app/views/wiki_page_versions/show.html.erb | 4 +++ app/views/wiki_pages/_form.html.erb | 2 ++ app/views/wiki_pages/search.html.erb | 1 + app/views/wiki_pages/show.html.erb | 4 +++ ...505000956_add_other_names_to_wiki_pages.rb | 10 ++++++++ 14 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20140505000956_add_other_names_to_wiki_pages.rb diff --git a/app/assets/javascripts/related_tag.js b/app/assets/javascripts/related_tag.js index bf87c744a..95d2dbfde 100644 --- a/app/assets/javascripts/related_tag.js +++ b/app/assets/javascripts/related_tag.js @@ -125,6 +125,7 @@ this.build_recent_and_frequent($dest); $dest.append(this.build_html(query, related_tags, "general")); + this.build_translated($dest); if (wiki_page_tags.length) { $dest.append(Danbooru.RelatedTag.build_html("wiki:" + query, wiki_page_tags, "wiki")); } @@ -173,6 +174,12 @@ } } + Danbooru.RelatedTag.build_translated = function($dest) { + if (Danbooru.RelatedTag.translated_tags && Danbooru.RelatedTag.translated_tags.length) { + $dest.append(this.build_html("translated", Danbooru.RelatedTag.translated_tags, "translated")); + } + } + Danbooru.RelatedTag.build_html = function(query, related_tags, name, is_wide_column) { if (query === null || query === "") { return ""; diff --git a/app/assets/javascripts/uploads.js b/app/assets/javascripts/uploads.js index 315191adb..97b8d3f0e 100644 --- a/app/assets/javascripts/uploads.js +++ b/app/assets/javascripts/uploads.js @@ -67,6 +67,9 @@ $("#source-artist").html('' + data.artist_name + ''); $("#source-tags").html(tag_html); + Danbooru.RelatedTag.translated_tags = data.translated_tags; + Danbooru.RelatedTag.build_all(); + var new_artist_link = 'new'; $("#source-record").html(new_artist_link); diff --git a/app/assets/stylesheets/specific/wiki_pages.css.scss b/app/assets/stylesheets/specific/wiki_pages.css.scss index 6c114ec19..bb0e3ad8f 100644 --- a/app/assets/stylesheets/specific/wiki_pages.css.scss +++ b/app/assets/stylesheets/specific/wiki_pages.css.scss @@ -27,4 +27,12 @@ div#c-wiki-pages { margin-left: 15em; padding-left: 1em; } + + .hint { + display: block; + } + + .other-name { + font-weight: bold; + } } diff --git a/app/helpers/wiki_page_versions_helper.rb b/app/helpers/wiki_page_versions_helper.rb index fa8e9c28f..b36604f92 100644 --- a/app/helpers/wiki_page_versions_helper.rb +++ b/app/helpers/wiki_page_versions_helper.rb @@ -48,4 +48,24 @@ module WikiPageVersionsHelper output.join.gsub(/\r?\n/, '
').html_safe end + + def wiki_page_other_names_diff(thispage, otherpage) + new_names = otherpage.other_names_array + old_names = thispage.other_names_array + added_names = new_names - old_names + removed_names = old_names - new_names + unchanged_names = new_names & old_names + + html = [] + added_names.each do |name| + html << '' + name + '' + end + removed_names.each do |name| + html << '' + name + '' + end + unchanged_names.each do |name| + html << '' + name + '' + end + return html.join(" ").html_safe + end end diff --git a/app/helpers/wiki_pages_helper.rb b/app/helpers/wiki_pages_helper.rb index afe7033fe..8b1f11674 100644 --- a/app/helpers/wiki_pages_helper.rb +++ b/app/helpers/wiki_pages_helper.rb @@ -47,4 +47,9 @@ module WikiPagesHelper html.html_safe end + + def wiki_page_other_names_list(wiki_page) + names_html = wiki_page.other_names_array.map{|name| content_tag("span", name, :class => "other-name")} + names_html.join(", ").html_safe + end end diff --git a/app/logical/sources/site.rb b/app/logical/sources/site.rb index b88d50201..1202fd8a6 100644 --- a/app/logical/sources/site.rb +++ b/app/logical/sources/site.rb @@ -18,12 +18,17 @@ module Sources end end + def translated_tags + WikiPage.other_names_match(tags.map(&:first)).map{|wiki_page| [wiki_page.title, wiki_page.category_name]} + end + def to_json return { :artist_name => artist_name, :profile_url => profile_url, :image_url => image_url, :tags => tags, + :translated_tags => translated_tags, :danbooru_name => artist_record.try(:first).try(:name), :danbooru_id => artist_record.try(:first).try(:id), :unique_id => unique_id diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 65ce87e2b..8a60ded8a 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -10,7 +10,7 @@ class WikiPage < ActiveRecord::Base validates_presence_of :title validate :validate_locker_is_janitor validate :validate_not_locked - attr_accessible :title, :body, :is_locked + attr_accessible :title, :body, :is_locked, :other_names has_one :tag, :foreign_key => "name", :primary_key => "title" has_one :artist, lambda {where(:is_active => true)}, :foreign_key => "name", :primary_key => "title" has_many :versions, lambda {order("wiki_page_versions.id ASC")}, :class_name => "WikiPageVersion", :dependent => :destroy @@ -32,6 +32,12 @@ class WikiPage < ActiveRecord::Base end end + def other_names_match(names) + names = names.map{|name| name.to_escaped_for_tsquery} + query_sql = names.join(" | ") + where("other_names_index @@ to_tsquery('danbooru', E?)", query_sql) + end + def search(params = {}) q = where("true") params = {} if params.blank? @@ -48,6 +54,10 @@ class WikiPage < ActiveRecord::Base q = q.body_matches(params[:body_matches]) end + if params[:other_names_match].present? + q = q.other_names_match(params[:other_names_match].split(" ")) + end + if params[:creator_name].present? q = q.where("creator_id = (select _.id from users _ where lower(_.name) = ?)", params[:creator_name].tr(" ", "_").mb_chars.downcase) end @@ -113,6 +123,7 @@ class WikiPage < ActiveRecord::Base self.title = version.title self.body = version.body self.is_locked = version.is_locked + self.other_names = version.other_names end def revert_to!(version) @@ -141,7 +152,8 @@ class WikiPage < ActiveRecord::Base prev.update_attributes( :title => title, :body => body, - :is_locked => is_locked + :is_locked => is_locked, + :other_names => other_names ) end @@ -156,12 +168,13 @@ class WikiPage < ActiveRecord::Base :updater_ip_addr => CurrentUser.ip_addr, :title => title, :body => body, - :is_locked => is_locked + :is_locked => is_locked, + :other_names => other_names ) end def create_version - if title_changed? || body_changed? || is_locked_changed? + if title_changed? || body_changed? || is_locked_changed? || other_names_changed? if merge_version? merge_version else @@ -207,4 +220,8 @@ class WikiPage < ActiveRecord::Base def visible? artist.blank? || !artist.is_banned? || CurrentUser.user.is_janitor? end + + def other_names_array + other_names.to_s.scan(/\S+/) + end end diff --git a/app/models/wiki_page_version.rb b/app/models/wiki_page_version.rb index 3d2b4bd23..dbf269bce 100644 --- a/app/models/wiki_page_version.rb +++ b/app/models/wiki_page_version.rb @@ -2,7 +2,7 @@ class WikiPageVersion < ActiveRecord::Base belongs_to :wiki_page belongs_to :updater, :class_name => "User" belongs_to :artist - attr_accessible :wiki_page_id, :title, :body, :is_locked, :updater_id, :updater_ip_addr, :version + attr_accessible :wiki_page_id, :title, :body, :is_locked, :updater_id, :updater_ip_addr, :version, :other_names module SearchMethods def for_user(user_id) @@ -43,4 +43,7 @@ class WikiPageVersion < ActiveRecord::Base artist.blank? || !artist.is_banned? || CurrentUser.user.is_janitor? end + def other_names_array + other_names.to_s.scan(/\S+/) + end end diff --git a/app/views/wiki_page_versions/diff.html.erb b/app/views/wiki_page_versions/diff.html.erb index 429be93d0..e70f1b79a 100644 --- a/app/views/wiki_page_versions/diff.html.erb +++ b/app/views/wiki_page_versions/diff.html.erb @@ -4,6 +4,8 @@

Showing differences between <%= compact_time @thispage.created_at %> (<%= link_to_user @thispage.updater %>) and <%= compact_time @otherpage.created_at %> (<%= link_to_user @otherpage.updater %>)

+

<%= wiki_page_other_names_diff(@thispage, @otherpage) %>

+
<%= wiki_page_diff(@thispage, @otherpage) %>
diff --git a/app/views/wiki_page_versions/show.html.erb b/app/views/wiki_page_versions/show.html.erb index 9d0374dc3..95a1639bf 100644 --- a/app/views/wiki_page_versions/show.html.erb +++ b/app/views/wiki_page_versions/show.html.erb @@ -7,6 +7,10 @@
<% if @wiki_page_version.visible? %> + <% if @wiki_page_version.other_names.present? %> +

<%= wiki_page_other_names_list(@wiki_page_version) %>

+ <% end %> + <%= format_text(@wiki_page_version.body) %> <% else %>

This artist has requested removal of their information.

diff --git a/app/views/wiki_pages/_form.html.erb b/app/views/wiki_pages/_form.html.erb index 53dcd1bb1..19b1d06c9 100644 --- a/app/views/wiki_pages/_form.html.erb +++ b/app/views/wiki_pages/_form.html.erb @@ -6,6 +6,8 @@ <%= f.input :title, :as => :string %> <% end %> + <%= f.input :other_names, :as => :text, :hint => "Names used for this tag on other sites such as Pixiv. Separate with spaces." %> + <%= dtext_field "wiki_page", "body" %> <% if CurrentUser.user.is_janitor? %> diff --git a/app/views/wiki_pages/search.html.erb b/app/views/wiki_pages/search.html.erb index b343af1f9..9d102c7d4 100644 --- a/app/views/wiki_pages/search.html.erb +++ b/app/views/wiki_pages/search.html.erb @@ -4,6 +4,7 @@ <%= search_field "title", :hint => "Use * for wildcard searches" %> <%= search_field "creator_name" %> <%= search_field "body_matches", :label => "Body" %> + <%= search_field "other_names_match", :label => "Other names" %>
diff --git a/app/views/wiki_pages/show.html.erb b/app/views/wiki_pages/show.html.erb index 6549c8933..0c2178b06 100644 --- a/app/views/wiki_pages/show.html.erb +++ b/app/views/wiki_pages/show.html.erb @@ -14,6 +14,10 @@
<% if @wiki_page.visible? %> + <% if @wiki_page.other_names.present? %> +

<%= wiki_page_other_names_list(@wiki_page) %>

+ <% end %> + <%= format_text(@wiki_page.body) %> <% if @wiki_page.artist %> diff --git a/db/migrate/20140505000956_add_other_names_to_wiki_pages.rb b/db/migrate/20140505000956_add_other_names_to_wiki_pages.rb new file mode 100644 index 000000000..b6ee5d69d --- /dev/null +++ b/db/migrate/20140505000956_add_other_names_to_wiki_pages.rb @@ -0,0 +1,10 @@ +class AddOtherNamesToWikiPages < ActiveRecord::Migration + def change + add_column :wiki_pages, :other_names, :text + add_column :wiki_pages, :other_names_index, :tsvector + add_column :wiki_page_versions, :other_names, :text + + execute "CREATE INDEX index_wiki_pages_on_other_names_index ON wiki_pages USING GIN (other_names_index)" + execute "CREATE TRIGGER trigger_wiki_pages_on_update_for_other_names BEFORE INSERT OR UPDATE ON wiki_pages FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('other_names_index', 'public.danbooru', 'other_names')" + end +end