ddr-models 2.6.2 → 2.7.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/Gemfile +2 -3
- data/app/models/collection.rb +11 -3
- data/app/models/component.rb +54 -4
- data/app/models/item.rb +1 -2
- data/config/initializers/active_fedora_base.rb +8 -5
- data/config/initializers/rubydora_monkey_patch.rb +11 -0
- data/config/initializers/subscriptions.rb +16 -9
- data/config/locales/ddr-models.en.yml +3 -0
- data/ddr-models.gemspec +3 -2
- data/lib/ddr/actions/virus_check.rb +10 -16
- data/lib/ddr/auth.rb +0 -8
- data/lib/ddr/datastreams.rb +13 -2
- data/lib/ddr/datastreams/administrative_metadata_datastream.rb +9 -0
- data/lib/ddr/datastreams/content_datastream.rb +5 -0
- data/lib/ddr/datastreams/datastream_behavior.rb +60 -15
- data/lib/ddr/datastreams/delete_external_files.rb +29 -0
- data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +33 -33
- data/lib/ddr/datastreams/external_file_datastream.rb +69 -0
- data/lib/ddr/datastreams/fits_datastream.rb +15 -5
- data/lib/ddr/datastreams/intermediate_file_datastream.rb +5 -0
- data/lib/ddr/datastreams/metadata_datastream.rb +15 -17
- data/lib/ddr/datastreams/multires_image_datastream.rb +5 -0
- data/lib/ddr/derivatives.rb +1 -0
- data/lib/ddr/derivatives/ptif_generator.rb +5 -1
- data/lib/ddr/derivatives/update_derivatives.rb +23 -0
- data/lib/ddr/events/deletion_event.rb +5 -9
- data/lib/ddr/events/event.rb +7 -9
- data/lib/ddr/events/ingestion_event.rb +5 -9
- data/lib/ddr/events/update_event.rb +12 -5
- data/lib/ddr/index.rb +0 -1
- data/lib/ddr/index/csv_query_result.rb +10 -2
- data/lib/ddr/index/fields.rb +10 -9
- data/lib/ddr/index/filter.rb +1 -0
- data/lib/ddr/managers/derivatives_manager.rb +84 -98
- data/lib/ddr/managers/technical_metadata_manager.rb +20 -5
- data/lib/ddr/models.rb +24 -24
- data/lib/ddr/models/base.rb +98 -74
- data/lib/ddr/models/cache.rb +20 -0
- data/lib/ddr/models/engine.rb +4 -6
- data/lib/ddr/models/file_management.rb +57 -152
- data/lib/ddr/models/fixity_checkable.rb +0 -5
- data/lib/ddr/models/has_admin_metadata.rb +4 -2
- data/lib/ddr/models/has_children.rb +35 -1
- data/lib/ddr/models/has_content.rb +3 -33
- data/lib/ddr/models/has_intermediate_file.rb +18 -0
- data/lib/ddr/models/has_multires_image.rb +12 -15
- data/lib/ddr/models/has_struct_metadata.rb +2 -38
- data/lib/ddr/models/indexing.rb +160 -163
- data/lib/ddr/models/permanent_id.rb +26 -49
- data/lib/ddr/models/solr_document.rb +21 -19
- data/lib/ddr/models/structure.rb +168 -41
- data/lib/ddr/models/structures/agent.rb +49 -0
- data/lib/ddr/models/structures/div.rb +64 -0
- data/lib/ddr/models/structures/f_locat.rb +54 -0
- data/lib/ddr/models/structures/file.rb +52 -0
- data/lib/ddr/models/structures/file_grp.rb +35 -0
- data/lib/ddr/models/structures/file_sec.rb +22 -0
- data/lib/ddr/models/structures/fptr.rb +31 -0
- data/lib/ddr/models/structures/mets_hdr.rb +37 -0
- data/lib/ddr/models/structures/mptr.rb +49 -0
- data/lib/ddr/models/structures/struct_map.rb +40 -0
- data/lib/ddr/models/version.rb +1 -1
- data/lib/ddr/notifications.rb +10 -12
- data/lib/ddr/utils.rb +29 -16
- data/lib/ddr/vocab.rb +15 -17
- data/lib/ddr/vocab/asset.rb +29 -19
- data/lib/ddr/vocab/contact.rb +5 -7
- data/lib/ddr/vocab/display.rb +6 -8
- data/lib/ddr/vocab/duke_terms.rb +8 -10
- data/lib/ddr/vocab/rdf_vocabulary_parser.rb +37 -39
- data/lib/ddr/vocab/roles.rb +17 -19
- data/lib/ddr/vocab/vocabulary.rb +26 -26
- data/spec/datastreams/external_file_datastream_spec.rb +37 -0
- data/spec/derivatives/png_generator_spec.rb +21 -25
- data/spec/derivatives/ptif_generator_spec.rb +22 -26
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/db/schema.rb +23 -23
- data/spec/factories/structure_factories.rb +8 -2
- data/spec/fixtures/imageA.jpg +0 -0
- data/spec/fixtures/imageB.jpg +0 -0
- data/spec/index/csv_query_result_spec.rb +3 -3
- data/spec/index/fields_spec.rb +7 -6
- data/spec/managers/derivatives_manager_spec.rb +105 -112
- data/spec/managers/technical_metadata_manager_spec.rb +22 -18
- data/spec/models/active_fedora_base_spec.rb +0 -106
- data/spec/models/active_fedora_datastream_spec.rb +33 -2
- data/spec/models/attachment_spec.rb +0 -2
- data/spec/models/cache_spec.rb +32 -0
- data/spec/models/collection_spec.rb +43 -19
- data/spec/models/component_spec.rb +41 -51
- data/spec/models/descriptive_metadata_datastream_spec.rb +99 -87
- data/spec/models/events_spec.rb +50 -69
- data/spec/models/file_management_spec.rb +79 -187
- data/spec/models/has_children_spec.rb +54 -3
- data/spec/models/has_struct_metadata_spec.rb +32 -38
- data/spec/models/indexing_spec.rb +11 -6
- data/spec/models/item_spec.rb +21 -7
- data/spec/models/permanent_id_spec.rb +1 -5
- data/spec/models/solr_document_spec.rb +13 -41
- data/spec/models/structure_spec.rb +85 -16
- data/spec/models/structures/agent_spec.rb +30 -0
- data/spec/models/structures/div_spec.rb +26 -0
- data/spec/models/structures/f_locat_spec.rb +78 -0
- data/spec/models/structures/file_grp_spec.rb +23 -0
- data/spec/models/structures/file_sec_spec.rb +22 -0
- data/spec/models/structures/file_spec.rb +60 -0
- data/spec/models/structures/fptr_spec.rb +23 -0
- data/spec/models/structures/mets_hdr_spec.rb +26 -0
- data/spec/models/structures/mptr_spec.rb +25 -0
- data/spec/models/structures/struct_map_spec.rb +24 -0
- data/spec/models/target_spec.rb +0 -2
- data/spec/spec_helper.rb +4 -9
- data/spec/support/shared_examples_for_ddr_models.rb +96 -156
- data/spec/support/shared_examples_for_has_content.rb +56 -30
- data/spec/support/shared_examples_for_has_intermediate_spec.rb +28 -0
- data/spec/support/shared_examples_for_non_collection_models.rb +5 -0
- data/spec/support/structural_metadata_helper.rb +230 -59
- data/spec/utils_spec.rb +0 -2
- metadata +86 -44
- data/app/helpers/models_helper.rb +0 -10
- data/lib/ddr/auth/legacy/abstract_legacy_permissions.rb +0 -17
- data/lib/ddr/auth/legacy/legacy_authorization.rb +0 -44
- data/lib/ddr/auth/legacy/legacy_default_permissions.rb +0 -33
- data/lib/ddr/auth/legacy/legacy_permissions.rb +0 -33
- data/lib/ddr/auth/legacy/legacy_roles.rb +0 -25
- data/lib/ddr/index/legacy_license_fields.rb +0 -12
- data/lib/ddr/jobs.rb +0 -12
- data/lib/ddr/jobs/fits_file_characterization.rb +0 -13
- data/lib/ddr/jobs/fixity_check.rb +0 -13
- data/lib/ddr/jobs/job.rb +0 -36
- data/lib/ddr/jobs/queue.rb +0 -27
- data/lib/ddr/jobs/update_index.rb +0 -13
- data/lib/ddr/models/access_controllable.rb +0 -24
- data/lib/ddr/models/struct_div.rb +0 -63
- data/spec/auth/legacy_default_permissions_spec.rb +0 -37
- data/spec/auth/legacy_permissions_spec.rb +0 -37
- data/spec/helpers/models_helper_spec.rb +0 -11
- data/spec/jobs/fits_file_characterization_spec.rb +0 -16
- data/spec/jobs/fixity_check_spec.rb +0 -22
- data/spec/jobs/job_spec.rb +0 -40
- data/spec/jobs/update_index_spec.rb +0 -22
- data/spec/models/struct_div_spec.rb +0 -70
- data/spec/support/shared_examples_for_access_controllables.rb +0 -6
@@ -1,9 +1,16 @@
|
|
1
|
-
module Ddr
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
self.description = "Object updated"
|
1
|
+
module Ddr::Events
|
2
|
+
class UpdateEvent < Event
|
3
|
+
self.description = "Object updated"
|
6
4
|
|
5
|
+
def self.call(*args)
|
6
|
+
super do |event, notification|
|
7
|
+
attrs_changed = notification.payload[:attributes_changed]
|
8
|
+
ds_changed = notification.payload[:datastreams_changed]
|
9
|
+
event.detail = ["Attributes changed: #{attrs_changed}",
|
10
|
+
"Datastreams changed: #{ds_changed.join(', ')}",
|
11
|
+
event.detail,
|
12
|
+
].compact.join("\n\n")
|
13
|
+
end
|
7
14
|
end
|
8
15
|
end
|
9
16
|
end
|
data/lib/ddr/index.rb
CHANGED
@@ -26,6 +26,7 @@ module Ddr::Index
|
|
26
26
|
|
27
27
|
def csv_opts
|
28
28
|
{ headers: csv_headers,
|
29
|
+
converters: [convert_semicolons, convert_escaped_newlines],
|
29
30
|
return_headers: false,
|
30
31
|
write_headers: true,
|
31
32
|
}
|
@@ -60,8 +61,15 @@ module Ddr::Index
|
|
60
61
|
end
|
61
62
|
|
62
63
|
def data
|
63
|
-
|
64
|
-
|
64
|
+
Connection.get("select", params: solr_csv_params)
|
65
|
+
end
|
66
|
+
|
67
|
+
def convert_semicolons
|
68
|
+
lambda { |f| f.gsub(/\\#{CSV_MV_SEPARATOR}/, CSV_MV_SEPARATOR) rescue f }
|
69
|
+
end
|
70
|
+
|
71
|
+
def convert_escaped_newlines
|
72
|
+
lambda { |f| f.gsub(/\\r/, "\r").gsub(/\\n/, "\n") rescue f }
|
65
73
|
end
|
66
74
|
|
67
75
|
end
|
data/lib/ddr/index/fields.rb
CHANGED
@@ -29,6 +29,7 @@ module Ddr::Index
|
|
29
29
|
CREATOR_FACET = Field.new :creator_facet, :facetable
|
30
30
|
DATE_FACET = Field.new :date_facet, :facetable
|
31
31
|
DATE_SORT = Field.new :date_sort, :sortable
|
32
|
+
DC_IS_PART_OF = Field.new :isPartOf, :symbol
|
32
33
|
DEPOSITOR = Field.new :depositor, :stored_sortable
|
33
34
|
DISPLAY_FORMAT = Field.new :display_format, :stored_sortable
|
34
35
|
DOI = Field.new :doi, :symbol
|
@@ -42,11 +43,14 @@ module Ddr::Index
|
|
42
43
|
IDENTIFIER_ALL = Field.new :identifier_all, :symbol
|
43
44
|
ILLUSTRATED_FACET = Field.new :illustrated_facet, :facetable
|
44
45
|
ILLUSTRATOR_FACET = Field.new :illustrator_facet, :facetable
|
46
|
+
INGESTED_BY = Field.new :ingested_by, :stored_sortable
|
47
|
+
INGESTION_DATE = Field.new :ingestion_date, :stored_sortable, type: :date
|
45
48
|
INSTRUMENTATION_FACET = Field.new :instrumentation_facet, :facetable
|
46
49
|
INTERNAL_URI = Field.new :internal_uri, :stored_sortable
|
47
50
|
INTERVIEWER_NAME_FACET = Field.new :interviewer_name_facet, :facetable
|
48
51
|
IS_ATTACHED_TO = Field.new :is_attached_to, :symbol
|
49
52
|
IS_EXTERNAL_TARGET_FOR = Field.new :is_external_target_for, :symbol
|
53
|
+
IS_FORMAT_OF = Field.new :isFormatOf, :symbol
|
50
54
|
IS_GOVERNED_BY = Field.new :is_governed_by, :symbol
|
51
55
|
IS_LOCKED = Field.new :is_locked, :stored_sortable
|
52
56
|
IS_MEMBER_OF = Field.new :is_member_of, :symbol
|
@@ -80,11 +84,12 @@ module Ddr::Index
|
|
80
84
|
PUBLISHER_FACET = Field.new :publisher_facet, :facetable
|
81
85
|
RESEARCH_HELP_CONTACT = Field.new :research_help_contact, :stored_sortable
|
82
86
|
RESOURCE_ROLE = Field.new :resource_role, :symbol
|
87
|
+
RIGHTS_NOTE = Field.new :rights_note, :stored_searchable
|
83
88
|
ROLL_NUMBER_FACET = Field.new :roll_number_facet, :facetable
|
84
89
|
SERIES_FACET = Field.new :series_facet, :facetable
|
85
90
|
SETTING_FACET = Field.new :setting_facet, :facetable
|
86
91
|
SPATIAL_FACET = Field.new :spatial_facet, :facetable
|
87
|
-
|
92
|
+
STRUCTURE = Field.new :structure, :stored_sortable
|
88
93
|
SUBJECT_FACET = Field.new :subject_facet, :facetable
|
89
94
|
SUBSERIES_FACET = Field.new :subseries_facet, :facetable
|
90
95
|
TECHMD_COLOR_SPACE = Field.new :techmd_color_space, :symbol
|
@@ -99,6 +104,7 @@ module Ddr::Index
|
|
99
104
|
TECHMD_ICC_PROFILE_VERSION = Field.new :techmd_icc_profile_version, :symbol
|
100
105
|
TECHMD_IMAGE_HEIGHT = Field.new :techmd_image_height, :stored_searchable, type: :integer
|
101
106
|
TECHMD_IMAGE_WIDTH = Field.new :techmd_image_width, :stored_searchable, type: :integer
|
107
|
+
TECHMD_MD5 = Field.new :techmd_md5, :stored_sortable
|
102
108
|
TECHMD_MEDIA_TYPE = Field.new :techmd_media_type, :symbol
|
103
109
|
TECHMD_MODIFICATION_TIME = Field.new :techmd_modification_time, :stored_searchable, type: :date
|
104
110
|
TECHMD_PRONOM_IDENTIFIER = Field.new :techmd_pronom_identifier, :symbol
|
@@ -131,15 +137,10 @@ module Ddr::Index
|
|
131
137
|
Deprecation.warn(Ddr::Index::Fields,
|
132
138
|
"`Ddr::Index::Fields::#{name}` is deprecated." \
|
133
139
|
" Use `Ddr::Index::Fields::ID` instead.")
|
134
|
-
|
140
|
+
ID
|
141
|
+
else
|
142
|
+
super
|
135
143
|
end
|
136
|
-
if const = LegacyLicenseFields.const_get(name)
|
137
|
-
# XXX Commented out b/c annoying, but maybe we want later ...
|
138
|
-
# Deprecation.warn(Ddr::Index::Fields,
|
139
|
-
# "`Ddr::Index::Fields::#{name}` is deprecated and will be removed in ddr-models 3.0.")
|
140
|
-
return const
|
141
|
-
end
|
142
|
-
super
|
143
144
|
end
|
144
145
|
|
145
146
|
end
|
data/lib/ddr/index/filter.rb
CHANGED
@@ -1,124 +1,110 @@
|
|
1
1
|
require "resque"
|
2
2
|
|
3
|
-
module Ddr
|
4
|
-
|
5
|
-
|
3
|
+
module Ddr::Managers
|
4
|
+
class DerivativesManager < Manager
|
5
|
+
extend Deprecation
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
SCHEDULE_LATER = :later
|
8
|
+
SCHEDULE_NOW = :now
|
9
|
+
SCHEDULES = [ SCHEDULE_LATER, SCHEDULE_NOW ]
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
ACTION_DELETE = "delete"
|
12
|
+
ACTION_GENERATE = "generate"
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
14
|
+
def update_derivatives(schedule=SCHEDULE_LATER)
|
15
|
+
raise ArgumentError, "Must be one of #{SCHEDULES}" unless SCHEDULES.include?(schedule)
|
16
|
+
Ddr::Derivatives::DERIVATIVES.values.each do |derivative|
|
17
|
+
if Ddr::Derivatives.update_derivatives.include?(derivative.name)
|
18
|
+
# Need to update derivative if object has a datastream for this type of derivative and
|
19
|
+
# either (or both) of the following conditions are true:
|
20
|
+
# - object already has content in the derivative's datastream (need to delete or replace it)
|
21
|
+
# - the derivative can be generated for this object
|
22
|
+
if object.datastreams.include?(derivative.datastream) &&
|
23
|
+
(object.datastreams[derivative.datastream].has_content? || generatable?(derivative))
|
24
|
+
schedule == SCHEDULE_NOW ? update_derivative(derivative) : Resque.enqueue(DerivativeJob, object.pid, derivative.name)
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
28
|
+
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
30
|
+
def update_derivative(derivative)
|
31
|
+
raise ArgumentError, "This object does not have a datastream for #{derivative.name} derivatives" unless
|
32
|
+
object.datastreams.include?(derivative.datastream)
|
33
|
+
if generatable? derivative
|
34
|
+
generate_derivative derivative
|
35
|
+
else
|
36
|
+
# Delete existing derivative (if there is one) if that type of derivative is no longer
|
37
|
+
# applicable to the object
|
38
|
+
if object.datastreams[derivative.datastream].has_content?
|
39
|
+
delete_derivative derivative
|
41
40
|
end
|
42
41
|
end
|
42
|
+
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
def generate_derivative!(derivative)
|
45
|
+
tempdir_path = File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname('',nil))
|
46
|
+
begin
|
47
|
+
tempdir = FileUtils.mkdir(tempdir_path).first
|
48
|
+
generator_source = create_source_file(tempdir)
|
49
|
+
generator_output = File.new(File.join(tempdir, "output.out"), 'wb')
|
50
|
+
exitstatus = derivative.generator.new(generator_source.path, generator_output.path, derivative.options).generate
|
51
|
+
generator_source.close unless generator_source.closed?
|
52
|
+
if exitstatus == 0
|
53
|
+
generator_output = File.open(generator_output, 'rb')
|
54
|
+
object.reload if object.persisted?
|
55
|
+
object.add_file generator_output, derivative.datastream, mime_type: derivative.generator.output_mime_type
|
56
|
+
object.save!
|
57
|
+
else
|
58
|
+
raise Ddr::Models::DerivativeGenerationFailure,
|
59
|
+
"Failure generating #{derivative.name} for #{object.pid}"
|
50
60
|
end
|
61
|
+
generator_output.close unless generator_output.closed?
|
62
|
+
ensure
|
63
|
+
FileUtils.remove_dir(tempdir_path) if File.exist?(tempdir_path)
|
51
64
|
end
|
65
|
+
end
|
52
66
|
|
53
|
-
|
54
|
-
tempdir_path = File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname('',nil))
|
55
|
-
begin
|
56
|
-
tempdir = FileUtils.mkdir(tempdir_path).first
|
57
|
-
generator_source = create_source_file(tempdir)
|
58
|
-
generator_output = File.new(File.join(tempdir, "output.out"), 'wb')
|
59
|
-
exitstatus = derivative.generator.new(generator_source.path, generator_output.path, derivative.options).generate
|
60
|
-
generator_source.close unless generator_source.closed?
|
61
|
-
if exitstatus == 0
|
62
|
-
generator_output = File.open(generator_output, 'rb')
|
63
|
-
object.reload if object.persisted?
|
64
|
-
object.add_file generator_output, derivative.datastream, mime_type: derivative.generator.output_mime_type
|
65
|
-
object.save!
|
66
|
-
else
|
67
|
-
raise Ddr::Models::DerivativeGenerationFailure,
|
68
|
-
"Failure generating #{derivative.name} for #{object.pid}"
|
69
|
-
end
|
70
|
-
generator_output.close unless generator_output.closed?
|
71
|
-
ensure
|
72
|
-
FileUtils.remove_dir(tempdir_path) if File.exist?(tempdir_path)
|
73
|
-
end
|
74
|
-
end
|
67
|
+
alias_method :generate_derivative, :generate_derivative!
|
75
68
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
end
|
69
|
+
def delete_derivative!(derivative)
|
70
|
+
File.unlink *object.datastreams[derivative.datastream].file_paths if
|
71
|
+
object.datastreams[derivative.datastream].external?
|
72
|
+
object.datastreams[derivative.datastream].delete
|
73
|
+
object.save!
|
74
|
+
end
|
84
75
|
|
85
|
-
|
86
|
-
File.unlink *object.datastreams[derivative.datastream].file_paths if
|
87
|
-
object.datastreams[derivative.datastream].external?
|
88
|
-
object.datastreams[derivative.datastream].delete
|
89
|
-
object.save!
|
90
|
-
end
|
76
|
+
alias_method :delete_derivative, :delete_derivative!
|
91
77
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
78
|
+
class DerivativeJob
|
79
|
+
@queue = :derivatives
|
80
|
+
def self.perform(pid, derivative_name)
|
81
|
+
object = ActiveFedora::Base.find(pid)
|
82
|
+
derivative = Ddr::Derivatives::DERIVATIVES[derivative_name.to_sym]
|
83
|
+
object.derivatives.update_derivative(derivative)
|
99
84
|
end
|
85
|
+
end
|
100
86
|
|
101
|
-
|
87
|
+
private
|
102
88
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
89
|
+
def create_source_file(dir)
|
90
|
+
generator_source = File.new(File.join(dir, "source"), "wb")
|
91
|
+
source_content = object.has_intermediate_file? ? object.intermediateFile.content : object.content.content
|
92
|
+
generator_source.write(source_content)
|
93
|
+
generator_source.close
|
94
|
+
generator_source
|
95
|
+
end
|
109
96
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
97
|
+
def generatable?(derivative)
|
98
|
+
return false unless object.has_content?
|
99
|
+
case derivative.name
|
100
|
+
when :multires_image
|
101
|
+
object.content_type == "image/tiff" || object.content_type == "image/jpeg"
|
102
|
+
when :thumbnail
|
103
|
+
object.image?
|
104
|
+
else
|
105
|
+
false
|
120
106
|
end
|
121
|
-
|
122
107
|
end
|
108
|
+
|
123
109
|
end
|
124
110
|
end
|
@@ -5,11 +5,21 @@ module Ddr::Managers
|
|
5
5
|
|
6
6
|
delegate :content, :fits, to: :object
|
7
7
|
|
8
|
-
delegate :
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
8
|
+
delegate :color_space,
|
9
|
+
:created,
|
10
|
+
:creating_application,
|
11
|
+
:extent,
|
12
|
+
:format_label,
|
13
|
+
:format_version,
|
14
|
+
:icc_profile_name,
|
15
|
+
:icc_profile_version,
|
16
|
+
:image_height,
|
17
|
+
:image_width,
|
18
|
+
:media_type,
|
19
|
+
:modified,
|
20
|
+
:pronom_identifier,
|
21
|
+
:valid,
|
22
|
+
:well_formed,
|
13
23
|
to: :fits
|
14
24
|
|
15
25
|
alias_method :last_modified, :modified
|
@@ -40,6 +50,10 @@ module Ddr::Managers
|
|
40
50
|
end
|
41
51
|
end
|
42
52
|
|
53
|
+
def md5
|
54
|
+
fits.md5.first
|
55
|
+
end
|
56
|
+
|
43
57
|
def checksum_digest
|
44
58
|
content.checksumType
|
45
59
|
end
|
@@ -86,6 +100,7 @@ module Ddr::Managers
|
|
86
100
|
Ddr::Index::Fields::TECHMD_ICC_PROFILE_VERSION => icc_profile_version,
|
87
101
|
Ddr::Index::Fields::TECHMD_IMAGE_HEIGHT => image_height,
|
88
102
|
Ddr::Index::Fields::TECHMD_IMAGE_WIDTH => image_width,
|
103
|
+
Ddr::Index::Fields::TECHMD_MD5 => md5,
|
89
104
|
Ddr::Index::Fields::TECHMD_MEDIA_TYPE => media_type,
|
90
105
|
Ddr::Index::Fields::TECHMD_PRONOM_IDENTIFIER => pronom_identifier,
|
91
106
|
Ddr::Index::Fields::TECHMD_VALID => valid,
|
data/lib/ddr/models.rb
CHANGED
@@ -1,11 +1,7 @@
|
|
1
1
|
require 'ddr/models/engine'
|
2
2
|
require 'ddr/models/version'
|
3
|
-
|
4
|
-
# Awful hack to make Hydra::AccessControls::Permissions accessible
|
5
|
-
$: << Gem.loaded_specs['hydra-access-controls'].full_gem_path + "/app/models/concerns"
|
6
|
-
|
3
|
+
require 'action_view' # https://github.com/haml/haml/issues/695
|
7
4
|
require 'active_record'
|
8
|
-
|
9
5
|
require 'hydra-core'
|
10
6
|
require 'hydra/validations'
|
11
7
|
|
@@ -19,7 +15,6 @@ module Ddr
|
|
19
15
|
autoload :Derivatives
|
20
16
|
autoload :Events
|
21
17
|
autoload :Index
|
22
|
-
autoload :Jobs
|
23
18
|
autoload :Managers
|
24
19
|
autoload :Metadata
|
25
20
|
autoload :Notifications
|
@@ -39,9 +34,9 @@ module Ddr
|
|
39
34
|
module Models
|
40
35
|
extend ActiveSupport::Autoload
|
41
36
|
|
42
|
-
autoload :AccessControllable
|
43
37
|
autoload :AdminSet
|
44
38
|
autoload :Base
|
39
|
+
autoload :Cache
|
45
40
|
autoload :ChecksumInvalid, 'ddr/models/error'
|
46
41
|
autoload :Contact
|
47
42
|
autoload :ContentModelError, 'ddr/models/error'
|
@@ -58,6 +53,7 @@ module Ddr
|
|
58
53
|
autoload :HasAttachments
|
59
54
|
autoload :HasChildren
|
60
55
|
autoload :HasContent
|
56
|
+
autoload :HasIntermediateFile
|
61
57
|
autoload :HasMultiresImage
|
62
58
|
autoload :HasStructMetadata
|
63
59
|
autoload :HasThumbnail
|
@@ -65,7 +61,6 @@ module Ddr
|
|
65
61
|
autoload :NotFoundError, 'ddr/models/error'
|
66
62
|
autoload :PermanentId
|
67
63
|
autoload :SolrDocument
|
68
|
-
autoload :StructDiv
|
69
64
|
autoload :Structure
|
70
65
|
autoload :WithContentFile
|
71
66
|
autoload :YearFacet
|
@@ -78,14 +73,20 @@ module Ddr
|
|
78
73
|
autoload :ParentLicense
|
79
74
|
end
|
80
75
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
76
|
+
module Structures
|
77
|
+
extend ActiveSupport::Autoload
|
78
|
+
|
79
|
+
autoload :Agent
|
80
|
+
autoload :Div
|
81
|
+
autoload :File
|
82
|
+
autoload :FileGrp
|
83
|
+
autoload :FileSec
|
84
|
+
autoload :FLocat
|
85
|
+
autoload :Fptr
|
86
|
+
autoload :MetsHdr
|
87
|
+
autoload :Mptr
|
88
|
+
autoload :StructMap
|
89
|
+
end
|
89
90
|
|
90
91
|
# Image server URL
|
91
92
|
mattr_accessor :image_server_url
|
@@ -128,19 +129,18 @@ module Ddr
|
|
128
129
|
false
|
129
130
|
end
|
130
131
|
|
132
|
+
# File path to vips
|
133
|
+
mattr_accessor :vips_path
|
134
|
+
|
135
|
+
mattr_accessor :default_mime_type do
|
136
|
+
"application/octet-stream"
|
137
|
+
end
|
138
|
+
|
131
139
|
# Yields an object with module configuration accessors
|
132
140
|
def self.configure
|
133
141
|
yield self
|
134
142
|
end
|
135
143
|
|
136
|
-
def self.external_file_subpath_pattern= (pattern)
|
137
|
-
unless /^-{1,2}(\/-{1,2}){0,3}$/ =~ pattern
|
138
|
-
raise "Invalid external file subpath pattern: #{pattern}"
|
139
|
-
end
|
140
|
-
re = pattern.split("/").map { |x| "(\\h{#{x.length}})" }.join("")
|
141
|
-
self.external_file_subpath_regexp = Regexp.new("^#{re}")
|
142
|
-
end
|
143
|
-
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|