Skip to content

Commit 5538e3e

Browse files
committed
added status to lod_links and corrected approval mechanism + warning if not approved
1 parent f298979 commit 5538e3e

File tree

7 files changed

+118
-82
lines changed

7 files changed

+118
-82
lines changed

app/controllers/lod_links_controller.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ def lod_link_params
6060
:source,
6161
:linkable_type,
6262
:linkable_id,
63-
:revision_comment
63+
:revision_comment,
64+
:status
6465
])
6566
end
6667

app/models/lod_link.rb

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
# == Schema Information
22
#
3-
# Table name: wikidata_links
3+
# Table name: lod_links
44
#
5-
# id :bigint not null, primary key
6-
# qid :integer
7-
# wikidata_linkable_type :string
8-
# created_at :datetime not null
9-
# updated_at :datetime not null
10-
# wikidata_linkable_id :bigint
5+
# id :bigint not null, primary key
6+
# data :jsonb
7+
# linkable_type :string not null
8+
# source :string not null
9+
# status :string default("pending"), not null
10+
# created_at :datetime not null
11+
# updated_at :datetime not null
12+
# external_id :string not null
13+
# linkable_id :bigint not null
1114
#
1215
# Indexes
1316
#
14-
# index_wikidata_links_on_linkable_type_and_linkable_id (wikidata_linkable_type,wikidata_linkable_id)
15-
# index_wikidata_links_on_qid (qid)
16-
# index_wikidata_links_on_wikidata_linkable (wikidata_linkable_type,wikidata_linkable_id)
17+
# index_lod_links_on_linkable_type_and_linkable_id (linkable_type,linkable_id)
18+
# index_lod_links_on_source_and_external_id (source,external_id) UNIQUE
1719
#
1820
class LodLink < ApplicationRecord
1921
include Turbo::Broadcastable
@@ -29,8 +31,14 @@ class LodLink < ApplicationRecord
2931

3032
validates :external_id, presence: true, numericality: { only_integer: true }
3133
validates :source, presence: true
34+
35+
enum status: { pending: "pending", approved: "approved"}
3236

3337
belongs_to :linkable, polymorphic: true
38+
39+
# Scopes for filtering matches
40+
scope :pending, -> { where(status: "pending") }
41+
scope :approved, -> { where(status: "approved") }
3442

3543
def qcode
3644
"Q#{external_id}"

app/models/site.rb

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class Site < ApplicationRecord
5353
@issues = [ :missing_coordinates, :invalid_coordinates, :missing_country_code ]
5454

5555
include NeedsLods
56-
@lods = [ :needs_wikidata_link ]
56+
@lods = [ :needs_wikidata_link, :pending_wikidata_link ]
5757

5858
include PgSearch::Model
5959
pg_search_scope :search,
@@ -122,21 +122,35 @@ def country_code_from_coordinates
122122
end
123123

124124
def self.wikidata_match_candidates_batch(sites)
125-
126-
# Filter for sites without a wikidata_link
127-
sites_without_wikidata_link = sites.select { |site| site.wikidata_link.nil? }
125+
# Filter for sites without a Wikidata link
126+
sites_without_wikidata_link = sites.select { |site| site.lod_links.where(source: "Wikidata").empty? }
128127

129128
return [] if sites_without_wikidata_link.empty?
130129

131-
# Generate a cache key based on site names
132-
cache_key = generate_cache_key(sites_without_wikidata_link)
133-
134-
Rails.cache.fetch(cache_key, expires_in: 24.hours) do
135-
site_names = extract_site_names(sites_without_wikidata_link)
136-
sparql_query = build_sparql_query(site_names)
137-
response = execute_sparql_request(sparql_query)
138-
parse_wikidata_response(response)
130+
# Prepare the data for SPARQL query
131+
site_names = extract_site_names(sites_without_wikidata_link)
132+
sparql_query = build_sparql_query(site_names)
133+
response = execute_sparql_request(sparql_query)
134+
wikidata_results = parse_wikidata_response(response)
135+
136+
# Iterate through the results and populate lod_links
137+
wikidata_results.each do |site_name, matches|
138+
site = sites_without_wikidata_link.find { |s| s.name == site_name }
139+
next unless site
140+
141+
matches.each do |match|
142+
# Find or create the LOD link for this Wikidata match
143+
site.lod_links.find_or_create_by(source: "Wikidata", external_id: match.qid) do |lod_link|
144+
lod_link.data = {
145+
label: match.label,
146+
description: match.description
147+
}
148+
lod_link.save!
149+
end
150+
end
139151
end
152+
153+
wikidata_results # Return results for reference
140154
end
141155

142156
def n_c14s
@@ -193,32 +207,12 @@ def needs_wikidata_link?
193207
wikidata_link.blank?
194208
end
195209

196-
# scope :with_potential_wikidata_match, -> {
197-
# cache_keys = Rails.cache.instance_variable_get(:@data).keys # Inspect cached keys
198-
#
199-
# matched_ids = []
200-
#
201-
# cache_keys.each do |key|
202-
# cached_data = Rails.cache.read(key)
203-
# next if cached_data.blank?
204-
#
205-
# logger.debug "*******************"
206-
# logger.debug cached_data.to_yaml
207-
# logger.debug "*******************"
208-
#
209-
# # Find sites matching cached names but exclude those with existing wikidata_links
210-
# matched_ids += Site.where(name: cached_data.keys).where.not(id: LodLink.where(linkable_type: "Site", source: "Wikidata").select(:linkable_id)).pluck(:id)
211-
# end
212-
#
213-
# where(id: matched_ids.uniq)
214-
# }
215-
# def with_potential_wikidata_match?
216-
# return false if wikidata_link.present? # Exclude if a Wikidata link already exists
217-
#
218-
# cache_key = Site.generate_cache_key([self])
219-
# cached_matches = Rails.cache.read(cache_key) || {}
220-
# cached_matches.key?(self.name)
221-
# end
210+
scope :pending_wikidata_link, -> {
211+
joins(:lod_links).where(lod_links: { source: "Wikidata", status: "pending" })
212+
}
213+
def pending_wikidata_link?
214+
wikidata_link&.status == "pending"
215+
end
222216

223217
private
224218

app/views/lod_links/_lod_link.html.erb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@
1313
<dd class="col-sm text-sm-end">
1414
<%= link_to @wikidata_link.qcode, @wikidata_link.url, title: "#{@wikidata_link.title} - Wikidata" %>
1515
<% if item.present? %>(<%= item.label("en") %>)<% end %>
16+
<% if @wikidata_link.status == "pending" %>
17+
<span class="text-muted">
18+
<%= bs_icon "exclamation-circle",
19+
class: "text-warning",
20+
data: { "bs-toggle": "tooltip", controller: "tooltips" },
21+
title: "Wikidata link inferred from site name."
22+
%>
23+
</span>
24+
<% end %>
1625
</dd>
1726
</div>
1827

@@ -26,6 +35,15 @@
2635
<dd class="col-sm text-sm-end">
2736
<span class="badge text-bg-info">en</span>
2837
<%= link_to item.sitelink_title("enwiki"), item.sitelink_url("enwiki"), title: "#{item.sitelink_title('enwiki')} - Wikipedia" %>
38+
<% if @wikidata_link.status == "pending" %>
39+
<span class="text-muted">
40+
<%= bs_icon "exclamation-circle",
41+
class: "text-warning",
42+
data: { "bs-toggle": "tooltip", controller: "tooltips" },
43+
title: "Wikipedia link link inferred from site name."
44+
%>
45+
</span>
46+
<% end %>
2947
</dd>
3048
</div>
3149
<% end %>
@@ -38,6 +56,15 @@
3856
</dt>
3957
<dd class="col-sm text-sm-end">
4058
<%= link_to item.sitelink_title("commonswiki"), item.sitelink_url("commonswiki"), title: "#{item.sitelink_title('commonswiki')} - Wikimedia Commons" %>
59+
<% if @wikidata_link.status == "pending" %>
60+
<span class="text-muted">
61+
<%= bs_icon "exclamation-circle",
62+
class: "text-warning",
63+
data: { "bs-toggle": "tooltip", controller: "tooltips" },
64+
title: "Wikicommons link inferred from site name."
65+
%>
66+
</span>
67+
<% end %>
4168
</dd>
4269
</div>
4370
<% end %>

app/views/lods/sites/_table.html.erb

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,12 @@
5050
<td class="font-monospace text-end"><%= site.c14s_count %></td>
5151
<td class="font-monospace text-end"><%= site.typos_count %></td>
5252
<td class="font-monospace text-end">
53-
<% if site.wikidata_link %>
53+
<% if site.wikidata_link && site.wikidata_link.status == "approved" %>
5454
<%= link_to site.wikidata_link.external_id, site.wikidata_link.url %>
55-
<% elsif @wikidata_matches.key?(site.name) && @wikidata_matches[site.name].present? %>
56-
<% suggested_match = @wikidata_matches[site.name].first %>
57-
<i>Suggestion: <%= suggested_match.qid %>:
58-
<%= link_to "#{suggested_match.label} (#{suggested_match.description})",
59-
suggested_match.url, target: "_blank" %>
55+
<% elsif site.wikidata_link && site.wikidata_link.status == "pending" %>
56+
<i>Suggestion: <%= site.wikidata_link.external_id %>:
57+
<%= link_to "#{site.wikidata_link.data['label']} (#{site.wikidata_link.data['description']})",
58+
site.wikidata_link.data['url'], target: "_blank" %>
6059
</i>
6160
<% else %>
6261
<span class="text-muted">No suggestions</span>
@@ -67,33 +66,34 @@
6766
<%= lod_badge(lod) %>
6867
<% end %>
6968
</td>
70-
<% if can?(:manage, Site) %>
71-
<td>
72-
<div class="btn-toolbar justify-content-end">
73-
<div class="btn-group me-2">
74-
<%= bootstrap_form_for LodLink.new, url: lod_links_path, method: :post do |f| %>
75-
<%= f.hidden_field :linkable_type, value: "Site" %>
76-
<%= f.hidden_field :linkable_id, value: site.id %>
77-
<%= f.hidden_field :source, value: "Wikidata" %>
69+
<% if can?(:manage, Site) %>
70+
<td>
71+
<div class="btn-toolbar justify-content-end">
72+
<div class="btn-group me-2">
73+
<% if site.wikidata_link %>
74+
<%= bootstrap_form_for site.wikidata_link, url: lod_link_path(site.wikidata_link), method: :patch do |f| %>
75+
<%= f.hidden_field :linkable_type, value: "Site" %>
76+
<%= f.hidden_field :linkable_id, value: site.id %>
77+
<%= f.hidden_field :source, value: "Wikidata" %>
7878

79-
<% if @wikidata_matches.key?(site.name) && @wikidata_matches[site.name].present? %>
80-
<% suggested_match = @wikidata_matches[site.name].first %>
81-
<%= f.hidden_field :external_id, value: suggested_match.qid %>
82-
<%= f.hidden_field :revision_comment, value: "Matched to Wikidata" %>
83-
<%= f.primary class: "btn btn-sm btn-primary", title: "Use suggested Wikidata match" do %>
84-
<%= bs_icon "check-lg" %>
85-
<% end %>
86-
<% else %>
87-
<%= button_tag class: "btn btn-sm btn-primary", disabled: true do %>
88-
<%= bs_icon "check-lg" %>
89-
<% end %>
90-
<% end %>
91-
<% end %>
92-
</div>
93-
<%= render "shared/action_buttons_compact", i: site %>
94-
</div>
95-
</td>
96-
<% end %>
79+
<% if site.wikidata_link.status == "pending" %>
80+
<%= f.hidden_field :status, value: "approved" %>
81+
<%= f.hidden_field :revision_comment, value: "Matched to Wikidata" %>
82+
<%= f.primary class: "btn btn-sm btn-primary", title: "Use suggested Wikidata match" do %>
83+
<%= bs_icon "check-lg" %>
84+
<% end %>
85+
<% else %>
86+
<%= button_tag class: "btn btn-sm btn-primary", disabled: true do %>
87+
<%= bs_icon "check-lg" %>
88+
<% end %>
89+
<% end %>
90+
<% end %>
91+
<% end %>
92+
</div>
93+
<%= render "shared/action_buttons_compact", i: site %>
94+
</div>
95+
</td>
96+
<% end %>
9797
</tr>
9898
<% end %>
9999
</tbody>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddStatusToLodLinks < ActiveRecord::Migration[7.0]
2+
def change
3+
add_column :lod_links, :status, :string, default: "pending", null: false
4+
end
5+
end

db/schema.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[7.0].define(version: 2024_12_15_071622) do
13+
ActiveRecord::Schema[7.0].define(version: 2024_12_15_102659) do
1414
# These are extensions that must be enabled in order to support this database
1515
enable_extension "pg_trgm"
1616
enable_extension "plpgsql"
@@ -139,6 +139,7 @@
139139
t.jsonb "data"
140140
t.datetime "created_at", null: false
141141
t.datetime "updated_at", null: false
142+
t.string "status", default: "pending", null: false
142143
t.index ["linkable_type", "linkable_id"], name: "index_lod_links_on_linkable_type_and_linkable_id"
143144
t.index ["source", "external_id"], name: "index_lod_links_on_source_and_external_id", unique: true
144145
end

0 commit comments

Comments
 (0)