Class: Document
- Inherits:
-
Kithe::Work
- Object
- Kithe::Work
- Document
show all
- Includes:
- ActiveModel::Validations, AttrJson::Record::QueryScopes
- Defined in:
- app/models/document.rb,
app/models/document/reference.rb,
app/models/document/bbox_validator.rb,
app/models/document/date_validator.rb,
app/models/document/geom_validator.rb,
app/models/document/controlled_lists.rb,
app/models/document/date_range_validator.rb
Overview
Date Range Validation
Allow: YYYY-YYYY, *-YYYY, YYYY-*, Start YYYY == End YYYY Disallow: YYYX-YYYY, YYYY-, 2000-1999, YYYY-YYYY?
Defined Under Namespace
Classes: BboxValidator, ControlledLists, DateRangeValidator, DateValidator, GeomValidator, Reference
Instance Attribute Summary collapse
Instance Method Summary
collapse
Instance Attribute Details
#skip_callbacks ⇒ Object
Returns the value of attribute skip_callbacks.
15
16
17
|
# File 'app/models/document.rb', line 15
def skip_callbacks
@skip_callbacks
end
|
Instance Method Details
#a_downloadable_resource? ⇒ Boolean
92
93
94
|
# File 'app/models/document.rb', line 92
def a_downloadable_resource?
json_attributes["dct_references_s"]&.any? { |ref| ref.category == "download" }
end
|
#access_json ⇒ Object
328
329
330
331
332
|
# File 'app/models/document.rb', line 328
def access_json
access = {}
access_urls.each { |au| access[au.institution_code] = au.access_url }
access.to_json
end
|
#access_urls ⇒ Object
Institutional Access URLs
406
407
408
|
# File 'app/models/document.rb', line 406
def access_urls
DocumentLicensedAccess.where(friendlier_id: friendlier_id).order(institution_code: :asc)
end
|
#apply_assets(distributions) ⇒ Object
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
|
# File 'app/models/document.rb', line 185
def apply_assets(distributions)
if distributable_assets.present?
distributable_assets.each do |asset|
if asset.dct_references_uri_key == "download"
distributions["http://schema.org/downloadUrl"] ||= []
distributions["http://schema.org/downloadUrl"] << asset.to_aardvark_reference["http://schema.org/downloadUrl"]
else
distributions.merge!(asset.to_aardvark_reference)
end
end
end
distributions
end
|
#asset_label(asset) ⇒ Object
177
178
179
180
181
182
183
|
# File 'app/models/document.rb', line 177
def asset_label(asset)
if asset.label.present?
asset.label
else
asset.title
end
end
|
#available? ⇒ Boolean
GBL SolrDocument convience methods
228
229
230
|
# File 'app/models/document.rb', line 228
def available?
public? || same_institution?
end
|
#checked_endpoint(type) ⇒ Object
Provides a convenience method to access a SolrDocument’s References endpoint url without having to check and see if it is available :type => a string which if its a Geoblacklight::Constants::URI key
will return a coresponding Geoblacklight::Reference
316
317
318
319
|
# File 'app/models/document.rb', line 316
def checked_endpoint(type)
type = distributions.send(type)
type.endpoint if type.present?
end
|
#created_at_dt ⇒ Object
334
335
336
|
# File 'app/models/document.rb', line 334
def created_at_dt
created_at&.utc&.iso8601
end
|
#current_version ⇒ Object
400
401
402
403
|
# File 'app/models/document.rb', line 400
def current_version
versions&.last&.index || 0
end
|
#data_dictionary_download ⇒ Object
282
283
284
|
# File 'app/models/document.rb', line 282
def data_dictionary_download
distributions.data_dictionary.to_hash if distributions.data_dictionary.present?
end
|
#date_range_json ⇒ Object
347
348
349
350
351
352
353
354
355
356
357
358
|
# File 'app/models/document.rb', line 347
def date_range_json
date_ranges = []
unless send(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range]).all?(&:blank?)
send(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range]).each do |date_range|
start_d, end_d = date_range.split("-")
start_d = "*" if start_d == "YYYY" || start_d.nil?
end_d = "*" if end_d == "YYYY" || end_d.nil?
date_ranges << "[#{start_d} TO #{end_d}]" if start_d.present?
end
end
date_ranges
end
|
#dct_references_s_to_csv(key, destination) ⇒ Object
392
393
394
395
396
397
398
|
# File 'app/models/document.rb', line 392
def dct_references_s_to_csv(key, destination)
send(destination).detect do |ref|
ref.category == GeoblacklightAdmin::Schema.instance.dct_references_mappings[key]
end.value
rescue NoMethodError
nil
end
|
#dct_title_s ⇒ Object
Ensures a manually created “title” makes it into the attr_json “title”
343
344
345
|
# File 'app/models/document.rb', line 343
def dct_title_s
title
end
|
#derive_dcat_bbox ⇒ Object
Convert GEOM for Solr Indexing
443
444
445
446
447
448
449
450
451
|
# File 'app/models/document.rb', line 443
def derive_dcat_bbox
if send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).present?
w, s, e, n = send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).split(",")
"ENVELOPE(#{w},#{e},#{n},#{s})"
else
""
end
end
|
#derive_dcat_centroid ⇒ Object
453
454
455
456
457
458
459
460
|
# File 'app/models/document.rb', line 453
def derive_dcat_centroid
if send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).present?
w, s, e, n = send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).split(",")
"#{(n.to_f + s.to_f) / 2},#{(e.to_f + w.to_f) / 2}"
else
""
end
end
|
#derive_locn_geometry ⇒ Object
410
411
412
413
414
415
416
417
418
|
# File 'app/models/document.rb', line 410
def derive_locn_geometry
if send(GeoblacklightAdmin::Schema.instance.solr_fields[:geometry]).present?
send(GeoblacklightAdmin::Schema.instance.solr_fields[:geometry])
elsif send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).present?
derive_polygon
else
""
end
end
|
#derive_polygon ⇒ Object
Convert BBOX to GEOM Polygon
421
422
423
424
425
426
427
428
429
430
431
432
433
434
|
# File 'app/models/document.rb', line 421
def derive_polygon
if send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).present?
if send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]) == "-180,-90,180,90"
"ENVELOPE(-180,180,90,-90)"
else
w, s, e, n = send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).split(",")
"POLYGON((#{w} #{n}, #{e} #{n}, #{e} #{s}, #{w} #{s}, #{w} #{n}))"
end
else
""
end
end
|
#direct_download ⇒ Object
257
258
259
|
# File 'app/models/document.rb', line 257
def direct_download
distributions.download.to_hash if distributions.download.present?
end
|
#display_note ⇒ Object
261
262
263
|
# File 'app/models/document.rb', line 261
def display_note
send(Settings.FIELDS.DISPLAY_NOTE) || ""
end
|
#distributable_assets ⇒ Object
50
51
52
|
# File 'app/models/document.rb', line 50
def distributable_assets
document_assets.select { |a| a.dct_references_uri_key.present? }
end
|
#distributions ⇒ Object
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
# File 'app/models/document.rb', line 117
def distributions
distributions = document_distributions.to_aardvark_distributions
logger.debug("Document#distributions > document_distributions: #{distributions}")
distributions = apply_assets(distributions)
logger.debug("Document#distributions > assets: #{distributions}")
distributions.each do |key, value|
next if key == "http://schema.org/downloadUrl"
if value.is_a?(Array) && value.length == 1
distributions[key] = value.first
end
end
distributions
end
|
#distributions_csv ⇒ Object
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
# File 'app/models/document.rb', line 148
def distributions_csv
csv = []
distributions.each do |key, value|
if key == "http://schema.org/downloadUrl" || key == :"http://schema.org/downloadUrl"
value.each do |download|
logger.debug("Document#distributions_csv > download: #{download.inspect}")
csv << [
friendlier_id,
ReferenceType.find_by(reference_uri: key).name,
download["url"],
download["label"]
]
end
else
csv << [
friendlier_id,
ReferenceType.find_by(reference_uri: key)&.name,
value,
nil
]
end
end
csv
end
|
#distributions_json ⇒ Object
141
142
143
144
145
146
|
# File 'app/models/document.rb', line 141
def distributions_json
logger.debug("Document#distributions_json > using document_distributions")
distributions = document_distributions.to_aardvark_distributions
distributions = apply_assets(distributions)
distributions.to_json
end
|
#document_assets ⇒ Object
DocumentAssets - Thumbnails, Attachments, etc @TODO: Redundant? Kithe also includes a members association
44
45
46
47
48
|
# File 'app/models/document.rb', line 44
def document_assets
scope = Kithe::Asset
scope = scope.where(parent_id: id).order(position: :asc)
scope.includes(:parent)
end
|
#download_text(format) ⇒ Object
Wraps download text with proper_case_format
218
219
220
221
222
223
|
# File 'app/models/document.rb', line 218
def download_text(format)
download_format = proper_case_format(format)
download_format.to_s.html_safe
rescue
format.to_s.html_safe
end
|
#downloadable? ⇒ Boolean
253
254
255
|
# File 'app/models/document.rb', line 253
def downloadable?
(direct_download || download_types.present? || iiif_download) && available?
end
|
#external_url ⇒ Object
286
287
288
|
# File 'app/models/document.rb', line 286
def external_url
distributions.url&.endpoint
end
|
307
308
309
|
# File 'app/models/document.rb', line 307
def file_format
send(Settings.FIELDS.FORMAT) || ""
end
|
#gbl_mdModified_dt ⇒ Object
338
339
340
|
# File 'app/models/document.rb', line 338
def gbl_mdModified_dt
updated_at&.utc&.iso8601
end
|
#geom_field ⇒ Object
294
295
296
|
# File 'app/models/document.rb', line 294
def geom_field
send(Settings.FIELDS.GEOMETRY) || ""
end
|
#geometry ⇒ Object
298
299
300
301
|
# File 'app/models/document.rb', line 298
def geometry
end
|
#hgl_download ⇒ Object
265
266
267
|
# File 'app/models/document.rb', line 265
def hgl_download
distributions.hgl.to_hash if distributions.hgl.present?
end
|
#iiif_download ⇒ Object
278
279
280
|
# File 'app/models/document.rb', line 278
def iiif_download
distributions.iiif.to_hash if distributions.iiif.present?
end
|
#iso_language_mapping ⇒ Object
Convert three char language code to proper string
463
464
465
466
467
468
469
470
471
472
|
# File 'app/models/document.rb', line 463
def iso_language_mapping
mapping = []
if send(GeoblacklightAdmin::Schema.instance.solr_fields[:language]).present?
send(GeoblacklightAdmin::Schema.instance.solr_fields[:language]).each do |lang|
mapping << GeoblacklightAdmin::IsoLanguageCodes.call[lang]
end
end
mapping
end
|
#item_viewer ⇒ Object
11
12
13
|
# File 'app/models/document.rb', line 11
def item_viewer
GeoblacklightAdmin::ItemViewer.new(distributions)
end
|
#itemtype ⇒ Object
290
291
292
|
# File 'app/models/document.rb', line 290
def itemtype
"http://schema.org/Dataset"
end
|
#local? ⇒ Boolean
240
241
242
243
|
# File 'app/models/document.rb', line 240
def local?
local = send(Settings.FIELDS.PROVIDER) || ""
local.casecmp(Settings.INSTITUTION)&.zero?
end
|
#local_restricted? ⇒ Boolean
236
237
238
|
# File 'app/models/document.rb', line 236
def local_restricted?
local? && restricted?
end
|
#oembed ⇒ Object
269
270
271
|
# File 'app/models/document.rb', line 269
def oembed
distributions.oembed.endpoint if distributions.oembed.present?
end
|
From GBL
Looks up properly formatted names for formats
207
208
209
210
211
212
213
|
# File 'app/models/document.rb', line 207
def proper_case_format(format)
if I18n.exists?("geoblacklight.formats.#{format.to_s.parameterize(separator: "_")}")
I18n.t("geoblacklight.formats.#{format.to_s.parameterize(separator: "_")}")
else
format
end
end
|
#public? ⇒ Boolean
232
233
234
|
# File 'app/models/document.rb', line 232
def public?
rights_field_data.present? && rights_field_data.casecmp("public").zero?
end
|
#raw_solr_document ⇒ Object
73
74
75
|
# File 'app/models/document.rb', line 73
def raw_solr_document
Blacklight.default_index.connection.get("select", {params: {q: "id:\"#{geomg_id_s}\""}})["response"]["docs"][0]
end
|
#restricted? ⇒ Boolean
245
246
247
|
# File 'app/models/document.rb', line 245
def restricted?
rights_field_data.blank? || rights_field_data.casecmp("restricted").zero?
end
|
#rights_field_data ⇒ Object
249
250
251
|
# File 'app/models/document.rb', line 249
def rights_field_data
send(Settings.FIELDS.ACCESS_RIGHTS) || ""
end
|
#same_institution? ⇒ Boolean
273
274
275
276
|
# File 'app/models/document.rb', line 273
def same_institution?
institution = send(Settings.FIELDS.PROVIDER) || ""
institution.casecmp(Settings.INSTITUTION.downcase).zero?
end
|
#set_geometry ⇒ Object
436
437
438
439
440
|
# File 'app/models/document.rb', line 436
def set_geometry
return unless locn_geometry.blank? && self&.dcat_bbox&.present?
self.locn_geometry = derive_polygon
end
|
#solr_year_json ⇒ Object
Also known as:
gbl_indexYear_im
360
361
362
363
364
365
|
# File 'app/models/document.rb', line 360
def solr_year_json
return [] if send(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range]).blank?
start_d, _end_d = send(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range]).first.split("-")
[start_d] if start_d.presence
end
|
#state_machine ⇒ Object
@TODO: Rename this to publication_state_machine
60
61
62
|
# File 'app/models/document.rb', line 60
def state_machine
@state_machine ||= DocumentStateMachine.new(self, transition_class: DocumentTransition)
end
|
#thumbnail ⇒ Object
Thumbnail is a special case of document_assets
324
325
326
|
# File 'app/models/document.rb', line 324
def thumbnail
members.find { |m| m.respond_to?(:thumbnail) && m.thumbnail? }
end
|
#thumbnail_state_machine ⇒ Object
69
70
71
|
# File 'app/models/document.rb', line 69
def thumbnail_state_machine
@thumbnail_state_machine ||= DocumentThumbnailStateMachine.new(self, transition_class: DocumentThumbnailTransition)
end
|
#to_csv ⇒ Object
Export Transformations - to_*
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
|
# File 'app/models/document.rb', line 369
def to_csv
attributes = GeoblacklightAdmin::Schema.instance.exportable_fields
attributes.map do |key, value|
if value[:delimited]
send(value[:destination])&.join("|")
elsif value[:destination] == "dct_references_s"
dct_references_s_to_csv(key, value[:destination])
elsif value[:destination] == "b1g_publication_state_s"
send(:current_state)
else
next if send(value[:destination]).blank?
send(value[:destination])
end
end
end
|
#to_traject ⇒ Object
388
389
390
|
# File 'app/models/document.rb', line 388
def to_traject
Kithe::Model.find_by_friendlier_id(friendlier_id).update_index(writer: Traject::DebugWriter.new({}))
end
|
#wxs_identifier ⇒ Object
303
304
305
|
# File 'app/models/document.rb', line 303
def wxs_identifier
send(Settings.FIELDS.WXS_IDENTIFIER) || ""
end
|