-
Notifications
You must be signed in to change notification settings - Fork 124
/
configuration.rb
553 lines (468 loc) · 17.9 KB
/
configuration.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
require 'hyrax/callbacks'
require 'hyrax/role_registry'
require 'samvera/nesting_indexer'
module Hyrax
class Configuration
include Callbacks
def initialize
@registered_concerns = []
@role_registry = Hyrax::RoleRegistry.new
@default_active_workflow_name = DEFAULT_ACTIVE_WORKFLOW_NAME
@nested_relationship_reindexer = default_nested_relationship_reindexer
end
DEFAULT_ACTIVE_WORKFLOW_NAME = 'default'.freeze
private_constant :DEFAULT_ACTIVE_WORKFLOW_NAME
# @api public
# When an admin set is created, we need to activate a workflow.
# The :default_active_workflow_name is the name of the workflow we will activate.
#
# @return [String]
# @see Sipity::Workflow
# @see AdminSet
# @note The active workflow for an admin set can be changed at a later point.
# @note Changing this value after other AdminSet(s) are created does not alter the already created AdminSet(s)
attr_accessor :default_active_workflow_name
# @return [Hyrax::RoleRegistry]
attr_reader :role_registry
private :role_registry
delegate :registered_role?, :persist_registered_roles!, to: :role_registry
# @api public
#
# Exposes a means to register application critical roles
#
# @example
# Hyrax.config.register_roles do |registry|
# registry.add(name: 'captaining', description: 'Grants captain duties')
# end
#
# @yield [Hyrax::RoleRegistry]
# @return [TrueClass]
def register_roles
yield(@role_registry)
true
end
# Path on the local file system where derivatives will be stored
attr_writer :derivatives_path
def derivatives_path
@derivatives_path ||= Rails.root.join('tmp', 'derivatives')
end
# Path on the local file system where originals will be staged before being ingested into Fedora.
attr_writer :working_path
def working_path
@working_path ||= Rails.root.join('tmp', 'uploads')
end
# Path on the local file system where where log and banners will be stored.
attr_writer :branding_path
def branding_path
@branding_path ||= Rails.root.join('public', 'branding')
end
attr_writer :enable_ffmpeg
def enable_ffmpeg
return @enable_ffmpeg unless @enable_ffmpeg.nil?
@enable_ffmpeg = false
end
attr_writer :ffmpeg_path
def ffmpeg_path
@ffmpeg_path ||= 'ffmpeg'
end
attr_writer :fits_message_length
def fits_message_length
@fits_message_length ||= 5
end
attr_writer :feature_config_path
def feature_config_path
@feature_config_path ||= Rails.root.join('config', 'features.yml')
end
attr_accessor :temp_file_base, :enable_local_ingest
attr_writer :display_microdata
def display_microdata?
return @display_microdata unless @display_microdata.nil?
@display_microdata = true
end
attr_writer :microdata_default_type
def microdata_default_type
@microdata_default_type ||= 'http://schema.org/CreativeWork'
end
attr_writer :max_days_between_fixity_checks
def max_days_between_fixity_checks
@max_days_between_fixity_checks ||= 7
end
attr_writer :enable_noids
def enable_noids?
return @enable_noids unless @enable_noids.nil?
@enable_noids = true
end
attr_writer :noid_template
def noid_template
@noid_template ||= '.reeddeeddk'
end
attr_writer :noid_minter_class
def noid_minter_class
@noid_minter_class ||= ::Noid::Rails::Minter::Db
end
attr_writer :minter_statefile
def minter_statefile
@minter_statefile ||= '/tmp/minter-state'
end
attr_writer :display_media_download_link
def display_media_download_link?
return @display_media_download_link unless @display_media_download_link.nil?
@display_media_download_link = true
end
attr_writer :fits_path
def fits_path
@fits_path ||= 'fits.sh'
end
# Override characterization runner
attr_accessor :characterization_runner
# Attributes for the lock manager which ensures a single process/thread is mutating a ore:Aggregation at once.
# @!attribute [w] lock_retry_count
# How many times to retry to acquire the lock before raising UnableToAcquireLockError
attr_writer :lock_retry_count
def lock_retry_count
@lock_retry_count ||= 600 # Up to 2 minutes of trying at intervals up to 200ms
end
# @!attribute [w] lock_time_to_live
# How long to hold the lock in milliseconds
attr_writer :lock_time_to_live
def lock_time_to_live
@lock_time_to_live ||= 60_000 # milliseconds
end
# @!attribute [w] lock_retry_delay
# Maximum wait time in milliseconds before retrying. Wait time is a random value between 0 and retry_delay.
attr_writer :lock_retry_delay
def lock_retry_delay
@lock_retry_delay ||= 200 # milliseconds
end
# @!attribute [w] ingest_queue_name
# ActiveJob queue to handle ingest-like jobs.
attr_writer :ingest_queue_name
def ingest_queue_name
@ingest_queue_name ||= :default
end
# @!attribute [w] import_export_jar_file_path
# Path to the jar file for the Fedora import/export tool
attr_writer :import_export_jar_file_path
def import_export_jar_file_path
@import_export_jar_file_path ||= "tmp/fcrepo-import-export.jar"
end
# @!attribute [w] bagit_dir
# Location where BagIt files are exported
attr_writer :bagit_dir
def bagit_dir
@bagit_dir ||= "tmp/descriptions"
end
# @!attribute [w] whitelisted_ingest_dirs
# List of directories which can be used for local file system ingestion.
attr_writer :whitelisted_ingest_dirs
def whitelisted_ingest_dirs
@whitelisted_ingest_dirs ||= \
if defined? BrowseEverything
file_system_dirs = Array.wrap(BrowseEverything.config['file_system'].try(:[], :home)).compact
# Include the Rails tmp directory for cases where the BrowseEverything provider is required to download the file to a temporary directory first
tmp_dir = [Rails.root.join('tmp').to_s]
file_system_dirs + tmp_dir
else
[]
end
end
callback.enable :after_create_concern, :after_create_fileset,
:after_update_content, :after_revert_content,
:after_update_metadata, :after_import_local_file_success,
:after_import_local_file_failure, :after_fixity_check_failure,
:after_destroy, :after_import_url_success,
:after_import_url_failure
# Registers the given curation concern model in the configuration
# @param [Array<Symbol>,Symbol] curation_concern_types
def register_curation_concern(*curation_concern_types)
Array.wrap(curation_concern_types).flatten.compact.each do |cc_type|
@registered_concerns << cc_type unless @registered_concerns.include?(cc_type)
end
end
# The normalization done by this method must occur after the initialization process
# so it can take advantage of irregular inflections from config/initializers/inflections.rb
# @return [Array<String>] the class names of the registered curation concerns
def registered_curation_concern_types
@registered_concerns.map { |cc_type| normalize_concern_name(cc_type) }
end
# @return [Array<Class>] the registered curation concerns
def curation_concerns
registered_curation_concern_types.map(&:constantize)
end
# A configuration point for changing the behavior of the license service.
#
# @!attribute [w] license_service_class
# A configuration point for changing the behavior of the license service.
#
# @see Hyrax::LicenseService for implementation details
attr_writer :license_service_class
def license_service_class
@license_service_class ||= Hyrax::LicenseService
end
# A configuration point for changing the behavior of the rights statement service.
#
# @!attribute [w] rights_statement_service_class
# A configuration point for changing the behavior of the rights statement service.
#
# @see Hyrax::RightsStatementService for implementation details
attr_writer :rights_statement_service_class
def rights_statement_service_class
@rights_statement_service_class ||= Hyrax::RightsStatementService
end
attr_writer :banner_image
def banner_image
# This image can be used for free and without attribution. See here for source and license: https://github.com/samvera/hyrax/issues/1551#issuecomment-326624909
@banner_image ||= 'https://user-images.githubusercontent.com/101482/29949206-ffa60d2c-8e67-11e7-988d-4910b8787d56.jpg'
end
attr_writer :persistent_hostpath
def persistent_hostpath
@persistent_hostpath ||= "http://localhost/files/"
end
attr_writer :redis_namespace
def redis_namespace
@redis_namespace ||= "hyrax"
end
attr_writer :libreoffice_path
def libreoffice_path
@libreoffice_path ||= "soffice"
end
attr_writer :browse_everything
def browse_everything?
@browse_everything ||= nil
end
attr_writer :analytics
attr_reader :analytics
def analytics?
@analytics ||= false
end
attr_writer :citations
def citations?
@citations ||= false
end
attr_writer :max_notifications_for_dashboard
def max_notifications_for_dashboard
@max_notifications_for_dashboard ||= 5
end
attr_writer :activity_to_show_default_seconds_since_now
def activity_to_show_default_seconds_since_now
@activity_to_show_default_seconds_since_now ||= 24 * 60 * 60
end
attr_writer :arkivo_api
def arkivo_api?
@arkivo_api ||= false
end
# rubocop:disable Metrics/LineLength
attr_writer :realtime_notifications
def realtime_notifications?
# Coerce @realtime_notifications to false if server software
# does not support WebSockets, and warn the user that we are
# overriding the value in their config unless it's already
# flipped to false
if ENV.fetch('SERVER_SOFTWARE', '').match(/Apache.*Phusion_Passenger/).present?
Rails.logger.warn('Cannot enable realtime notifications atop Passenger + Apache. Coercing `Hyrax.config.realtime_notifications` to `false`. Set this value to `false` in config/initializers/hyrax.rb to stop seeing this warning.') unless @realtime_notifications == false
@realtime_notifications = false
end
return @realtime_notifications unless @realtime_notifications.nil?
@realtime_notifications = true
end
# rubocop:enable Metrics/LineLength
def geonames_username=(username)
Qa::Authorities::Geonames.username = username
end
attr_writer :active_deposit_agreement_acceptance
def active_deposit_agreement_acceptance?
return true if @active_deposit_agreement_acceptance.nil?
@active_deposit_agreement_acceptance
end
attr_writer :admin_set_predicate
def admin_set_predicate
@admin_set_predicate ||= ::RDF::Vocab::DC.isPartOf
end
# Set predicate for rendering to dc:hasFormat as defined in
# IIIF Presentation API context: http://iiif.io/api/presentation/2/context.json
attr_writer :rendering_predicate
def rendering_predicate
@rendering_predicate ||= ::RDF::Vocab::DC.hasFormat
end
attr_writer :work_requires_files
def work_requires_files?
return true if @work_requires_files.nil?
@work_requires_files
end
attr_writer :show_work_item_rows
def show_work_item_rows
@show_work_item_rows ||= 10 # rows on show view
end
attr_writer :batch_user_key
def batch_user_key
@batch_user_key ||= 'batchuser@example.com'
end
attr_writer :audit_user_key
def audit_user_key
@audit_user_key ||= 'audituser@example.com'
end
# NOTE: This used to be called `working_path` in CurationConcerns
attr_writer :upload_path
def upload_path
@upload_path ||= ->() { Rails.root + 'tmp' + 'uploads' }
end
attr_writer :cache_path
def cache_path
@cache_path ||= ->() { Rails.root + 'tmp' + 'uploads' + 'cache' }
end
# Enable IIIF image service. This is required to use the
# IIIF viewer enabled show page
#
# If you have run the hyrax:riiif generator, an embedded riiif service
# will be used to deliver images via IIIF. If you have not, you will
# need to configure the following other configuration values to work
# with your image server.
#
# @see config.iiif_image_url_builder
# @see config.iiif_info_url_builder
# @see config.iiif_image_compliance_level_uri
# @see config.iiif_image_size_default
#
# @note Default is false
#
# @return [Boolean] true to enable, false to disable
def iiif_image_server?
return @iiif_image_server unless @iiif_image_server.nil?
@iiif_image_server = false
end
attr_writer :iiif_image_server
# URL that resolves to an image provided by a IIIF image server
#
# @return [#call] lambda/proc that generates a URL to an image
def iiif_image_url_builder
@iiif_image_url_builder ||= ->(file_id, base_url, _size) { "#{base_url}/downloads/#{file_id.split('/').first}" }
end
attr_writer :iiif_image_url_builder
# URL that resolves to an info.json file provided by a IIIF image server
#
# @return [#call] lambda/proc that generates a URL to image info
def iiif_info_url_builder
@iiif_info_url_builder ||= ->(_file_id, _base_url) { '' }
end
attr_writer :iiif_info_url_builder
# URL that indicates your IIIF image server compliance level
#
# @return [String] valid IIIF image compliance level URI
def iiif_image_compliance_level_uri
@iiif_image_compliance_level_uri ||= 'http://iiif.io/api/image/2/level2.json'
end
attr_writer :iiif_image_compliance_level_uri
# IIIF image size default
#
# @return [#String] valid IIIF image size parameter
def iiif_image_size_default
@iiif_image_size_default ||= '600,'
end
attr_writer :iiif_image_size_default
# IIIF metadata - fields to display in the metadata section
#
# @return [#Array] fields
def iiif_metadata_fields
@iiif_metadata_fields ||= Hyrax::Forms::WorkForm.required_fields
end
attr_writer :iiif_metadata_fields
# Duration in which we should cache the generated IIIF manifest.
# Default is 30 days (in seconds).
#
# @return [Integer] number of seconds
# @see https://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch
def iiif_manifest_cache_duration
@iiif_manifest_cache_duration ||= 30.days.to_i
end
attr_writer :iiif_manifest_cache_duration
# Should a button with "Share my work" show on the front page to users who are not logged in?
attr_writer :display_share_button_when_not_logged_in
def display_share_button_when_not_logged_in?
return true if @display_share_button_when_not_logged_in.nil?
@display_share_button_when_not_logged_in
end
attr_writer :google_analytics_id
def google_analytics_id
@google_analytics_id ||= nil
end
alias google_analytics_id? google_analytics_id
# Defaulting analytic start date to whenever the file was uploaded by leaving it blank
attr_writer :analytic_start_date
attr_reader :analytic_start_date
attr_writer :permission_levels
def permission_levels
@permission_levels ||= { "View/Download" => "read",
"Edit access" => "edit" }
end
attr_writer :owner_permission_levels
def owner_permission_levels
@owner_permission_levels ||= { "Edit access" => "edit" }
end
attr_writer :permission_options
def permission_options
@permission_options ||= { "Choose Access" => "none",
"View/Download" => "read",
"Edit" => "edit" }
end
attr_writer :translate_uri_to_id
def translate_uri_to_id
@translate_uri_to_id ||=
begin
baseparts = 2 + [(::Noid::Rails.config.template.gsub(/\.[rsz]/, '').length.to_f / 2).ceil, 4].min
lambda do |uri|
uri.to_s.split(ActiveFedora.fedora.base_path).last.split('/', baseparts).last
end
end
end
attr_writer :translate_id_to_uri
def translate_id_to_uri
@translate_id_to_uri ||= lambda do |id|
"#{ActiveFedora.fedora.host}#{ActiveFedora.fedora.base_path}/#{::Noid::Rails.treeify(id)}"
end
end
attr_writer :contact_email
def contact_email
@contact_email ||= "repo-admin@example.org"
end
attr_writer :subject_prefix
def subject_prefix
@subject_prefix ||= "Contact form:"
end
attr_writer :extract_full_text
def extract_full_text?
return @extract_full_text unless @extract_full_text.nil?
@extract_full_text = true
end
attr_writer :uploader
def uploader
@uploader ||= if Rails.env.development?
# use sequential uploads in development to avoid database locking problems with sqlite3.
default_uploader_config.merge(limitConcurrentUploads: 1, sequentialUploads: true)
else
default_uploader_config
end
end
attr_accessor :nested_relationship_reindexer
def default_nested_relationship_reindexer
->(id:, extent:) { Samvera::NestingIndexer.reindex_relationships(id: id, extent: extent) }
end
attr_writer :identifier_registrars
def identifier_registrars
@identifier_registrars ||= {}
end
private
# @param [Symbol, #to_s] model_name - symbol representing the model
# @return [String] the class name for the model
def normalize_concern_name(model_name)
model_name.to_s.camelize
end
# @return [Hash] config options for the uploader
def default_uploader_config
{
limitConcurrentUploads: 6,
maxNumberOfFiles: 100,
maxFileSize: 500.megabytes
}
end
end
end