Class: Document

Inherits:
Kithe::Work
  • Object
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_callbacksObject

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

Downloadable Resouce

Returns:

  • (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_jsonObject



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_urlsObject

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)
  # Distributable Document Assets
  # - Via DocumentAssets (Assets)
  # - With Downloadable URI
  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

Returns:

  • (Boolean)


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_dtObject



334
335
336
# File 'app/models/document.rb', line 334

def created_at_dt
  created_at&.utc&.iso8601
end

#current_versionObject



400
401
402
403
# File 'app/models/document.rb', line 400

def current_version
  # Will return 0 if no PaperTrail version exists yet
  versions&.last&.index || 0
end

#data_dictionary_downloadObject



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_jsonObject



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_sObject

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_bboxObject

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" convert to "ENVELOPE(W,E,N,S)"
    w, s, e, n = send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).split(",")
    "ENVELOPE(#{w},#{e},#{n},#{s})"
  else
    ""
  end
end

#derive_dcat_centroidObject



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_geometryObject



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_polygonObject

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?
    # Guard against a whole world polygons
    if send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]) == "-180,-90,180,90"
      "ENVELOPE(-180,180,90,-90)"
    else
      # "W,S,E,N" convert to "POLYGON((W N, E N, E S, W S, W N))"
      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_downloadObject



257
258
259
# File 'app/models/document.rb', line 257

def direct_download
  distributions.download.to_hash if distributions.download.present?
end

#display_noteObject



261
262
263
# File 'app/models/document.rb', line 261

def display_note
  send(Settings.FIELDS.DISPLAY_NOTE) || ""
end

#distributable_assetsObject



50
51
52
# File 'app/models/document.rb', line 50

def distributable_assets
  document_assets.select { |a| a.dct_references_uri_key.present? }
end

#distributionsObject

Distributions



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
  # Add DocumentDistributions to distributions
  distributions = document_distributions.to_aardvark_distributions
  logger.debug("Document#distributions > document_distributions: #{distributions}")

  # Apply Distributable Assets
  distributions = apply_assets(distributions)
  logger.debug("Document#distributions > assets: #{distributions}")

  # Flatten the arrays here to avoid the following potential error:
  # - ArgumentError: Please use symbols for polymorphic route arguments.
  # - Via: app/helpers/geoblacklight_helper.rb:224:in `render_references_url'
  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_csvObject



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
  # Initialize CSV
  # - [document_id, category, value, label]
  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_jsonObject

Distributions JSON

  • Indexes to Solr as dct_distributions_s



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_assetsObject

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

Returns:

  • (Boolean)


253
254
255
# File 'app/models/document.rb', line 253

def downloadable?
  (direct_download || download_types.present? || iiif_download) && available?
end

#external_urlObject



286
287
288
# File 'app/models/document.rb', line 286

def external_url
  distributions.url&.endpoint
end

#file_formatObject



307
308
309
# File 'app/models/document.rb', line 307

def file_format
  send(Settings.FIELDS.FORMAT) || ""
end

#gbl_mdModified_dtObject



338
339
340
# File 'app/models/document.rb', line 338

def gbl_mdModified_dt
  updated_at&.utc&.iso8601
end

#geom_fieldObject



294
295
296
# File 'app/models/document.rb', line 294

def geom_field
  send(Settings.FIELDS.GEOMETRY) || ""
end

#geometryObject



298
299
300
301
# File 'app/models/document.rb', line 298

def geometry
  # @TODO
  # @geometry ||= Geoblacklight::Geometry.new(geom_field)
end

#hgl_downloadObject



265
266
267
# File 'app/models/document.rb', line 265

def hgl_download
  distributions.hgl.to_hash if distributions.hgl.present?
end

#iiif_downloadObject



278
279
280
# File 'app/models/document.rb', line 278

def iiif_download
  distributions.iiif.to_hash if distributions.iiif.present?
end

#iso_language_mappingObject

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_viewerObject



11
12
13
# File 'app/models/document.rb', line 11

def item_viewer
  GeoblacklightAdmin::ItemViewer.new(distributions)
end

#itemtypeObject



290
291
292
# File 'app/models/document.rb', line 290

def itemtype
  "http://schema.org/Dataset"
end

#local?Boolean

Returns:

  • (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

Returns:

  • (Boolean)


236
237
238
# File 'app/models/document.rb', line 236

def local_restricted?
  local? && restricted?
end

#oembedObject



269
270
271
# File 'app/models/document.rb', line 269

def oembed
  distributions.oembed.endpoint if distributions.oembed.present?
end

#proper_case_format(format) ⇒ Object

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

Returns:

  • (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_documentObject



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

Returns:

  • (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_dataObject



249
250
251
# File 'app/models/document.rb', line 249

def rights_field_data
  send(Settings.FIELDS.ACCESS_RIGHTS) || ""
end

#same_institution?Boolean

Returns:

  • (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_geometryObject



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_jsonObject 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_machineObject

@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

#thumbnailObject

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_machineObject



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_csvObject

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"
      # @TODO: Downloads need to be handled differently
      # - Need to support multiple entries per key here
      # - Need to respect label and url
      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_trajectObject



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_identifierObject



303
304
305
# File 'app/models/document.rb', line 303

def wxs_identifier
  send(Settings.FIELDS.WXS_IDENTIFIER) || ""
end