ddr-models 2.6.2 → 2.7.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -1
  4. data/Gemfile +2 -3
  5. data/app/models/collection.rb +11 -3
  6. data/app/models/component.rb +54 -4
  7. data/app/models/item.rb +1 -2
  8. data/config/initializers/active_fedora_base.rb +8 -5
  9. data/config/initializers/rubydora_monkey_patch.rb +11 -0
  10. data/config/initializers/subscriptions.rb +16 -9
  11. data/config/locales/ddr-models.en.yml +3 -0
  12. data/ddr-models.gemspec +3 -2
  13. data/lib/ddr/actions/virus_check.rb +10 -16
  14. data/lib/ddr/auth.rb +0 -8
  15. data/lib/ddr/datastreams.rb +13 -2
  16. data/lib/ddr/datastreams/administrative_metadata_datastream.rb +9 -0
  17. data/lib/ddr/datastreams/content_datastream.rb +5 -0
  18. data/lib/ddr/datastreams/datastream_behavior.rb +60 -15
  19. data/lib/ddr/datastreams/delete_external_files.rb +29 -0
  20. data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +33 -33
  21. data/lib/ddr/datastreams/external_file_datastream.rb +69 -0
  22. data/lib/ddr/datastreams/fits_datastream.rb +15 -5
  23. data/lib/ddr/datastreams/intermediate_file_datastream.rb +5 -0
  24. data/lib/ddr/datastreams/metadata_datastream.rb +15 -17
  25. data/lib/ddr/datastreams/multires_image_datastream.rb +5 -0
  26. data/lib/ddr/derivatives.rb +1 -0
  27. data/lib/ddr/derivatives/ptif_generator.rb +5 -1
  28. data/lib/ddr/derivatives/update_derivatives.rb +23 -0
  29. data/lib/ddr/events/deletion_event.rb +5 -9
  30. data/lib/ddr/events/event.rb +7 -9
  31. data/lib/ddr/events/ingestion_event.rb +5 -9
  32. data/lib/ddr/events/update_event.rb +12 -5
  33. data/lib/ddr/index.rb +0 -1
  34. data/lib/ddr/index/csv_query_result.rb +10 -2
  35. data/lib/ddr/index/fields.rb +10 -9
  36. data/lib/ddr/index/filter.rb +1 -0
  37. data/lib/ddr/managers/derivatives_manager.rb +84 -98
  38. data/lib/ddr/managers/technical_metadata_manager.rb +20 -5
  39. data/lib/ddr/models.rb +24 -24
  40. data/lib/ddr/models/base.rb +98 -74
  41. data/lib/ddr/models/cache.rb +20 -0
  42. data/lib/ddr/models/engine.rb +4 -6
  43. data/lib/ddr/models/file_management.rb +57 -152
  44. data/lib/ddr/models/fixity_checkable.rb +0 -5
  45. data/lib/ddr/models/has_admin_metadata.rb +4 -2
  46. data/lib/ddr/models/has_children.rb +35 -1
  47. data/lib/ddr/models/has_content.rb +3 -33
  48. data/lib/ddr/models/has_intermediate_file.rb +18 -0
  49. data/lib/ddr/models/has_multires_image.rb +12 -15
  50. data/lib/ddr/models/has_struct_metadata.rb +2 -38
  51. data/lib/ddr/models/indexing.rb +160 -163
  52. data/lib/ddr/models/permanent_id.rb +26 -49
  53. data/lib/ddr/models/solr_document.rb +21 -19
  54. data/lib/ddr/models/structure.rb +168 -41
  55. data/lib/ddr/models/structures/agent.rb +49 -0
  56. data/lib/ddr/models/structures/div.rb +64 -0
  57. data/lib/ddr/models/structures/f_locat.rb +54 -0
  58. data/lib/ddr/models/structures/file.rb +52 -0
  59. data/lib/ddr/models/structures/file_grp.rb +35 -0
  60. data/lib/ddr/models/structures/file_sec.rb +22 -0
  61. data/lib/ddr/models/structures/fptr.rb +31 -0
  62. data/lib/ddr/models/structures/mets_hdr.rb +37 -0
  63. data/lib/ddr/models/structures/mptr.rb +49 -0
  64. data/lib/ddr/models/structures/struct_map.rb +40 -0
  65. data/lib/ddr/models/version.rb +1 -1
  66. data/lib/ddr/notifications.rb +10 -12
  67. data/lib/ddr/utils.rb +29 -16
  68. data/lib/ddr/vocab.rb +15 -17
  69. data/lib/ddr/vocab/asset.rb +29 -19
  70. data/lib/ddr/vocab/contact.rb +5 -7
  71. data/lib/ddr/vocab/display.rb +6 -8
  72. data/lib/ddr/vocab/duke_terms.rb +8 -10
  73. data/lib/ddr/vocab/rdf_vocabulary_parser.rb +37 -39
  74. data/lib/ddr/vocab/roles.rb +17 -19
  75. data/lib/ddr/vocab/vocabulary.rb +26 -26
  76. data/spec/datastreams/external_file_datastream_spec.rb +37 -0
  77. data/spec/derivatives/png_generator_spec.rb +21 -25
  78. data/spec/derivatives/ptif_generator_spec.rb +22 -26
  79. data/spec/dummy/config/environments/test.rb +1 -1
  80. data/spec/dummy/db/schema.rb +23 -23
  81. data/spec/factories/structure_factories.rb +8 -2
  82. data/spec/fixtures/imageA.jpg +0 -0
  83. data/spec/fixtures/imageB.jpg +0 -0
  84. data/spec/index/csv_query_result_spec.rb +3 -3
  85. data/spec/index/fields_spec.rb +7 -6
  86. data/spec/managers/derivatives_manager_spec.rb +105 -112
  87. data/spec/managers/technical_metadata_manager_spec.rb +22 -18
  88. data/spec/models/active_fedora_base_spec.rb +0 -106
  89. data/spec/models/active_fedora_datastream_spec.rb +33 -2
  90. data/spec/models/attachment_spec.rb +0 -2
  91. data/spec/models/cache_spec.rb +32 -0
  92. data/spec/models/collection_spec.rb +43 -19
  93. data/spec/models/component_spec.rb +41 -51
  94. data/spec/models/descriptive_metadata_datastream_spec.rb +99 -87
  95. data/spec/models/events_spec.rb +50 -69
  96. data/spec/models/file_management_spec.rb +79 -187
  97. data/spec/models/has_children_spec.rb +54 -3
  98. data/spec/models/has_struct_metadata_spec.rb +32 -38
  99. data/spec/models/indexing_spec.rb +11 -6
  100. data/spec/models/item_spec.rb +21 -7
  101. data/spec/models/permanent_id_spec.rb +1 -5
  102. data/spec/models/solr_document_spec.rb +13 -41
  103. data/spec/models/structure_spec.rb +85 -16
  104. data/spec/models/structures/agent_spec.rb +30 -0
  105. data/spec/models/structures/div_spec.rb +26 -0
  106. data/spec/models/structures/f_locat_spec.rb +78 -0
  107. data/spec/models/structures/file_grp_spec.rb +23 -0
  108. data/spec/models/structures/file_sec_spec.rb +22 -0
  109. data/spec/models/structures/file_spec.rb +60 -0
  110. data/spec/models/structures/fptr_spec.rb +23 -0
  111. data/spec/models/structures/mets_hdr_spec.rb +26 -0
  112. data/spec/models/structures/mptr_spec.rb +25 -0
  113. data/spec/models/structures/struct_map_spec.rb +24 -0
  114. data/spec/models/target_spec.rb +0 -2
  115. data/spec/spec_helper.rb +4 -9
  116. data/spec/support/shared_examples_for_ddr_models.rb +96 -156
  117. data/spec/support/shared_examples_for_has_content.rb +56 -30
  118. data/spec/support/shared_examples_for_has_intermediate_spec.rb +28 -0
  119. data/spec/support/shared_examples_for_non_collection_models.rb +5 -0
  120. data/spec/support/structural_metadata_helper.rb +230 -59
  121. data/spec/utils_spec.rb +0 -2
  122. metadata +86 -44
  123. data/app/helpers/models_helper.rb +0 -10
  124. data/lib/ddr/auth/legacy/abstract_legacy_permissions.rb +0 -17
  125. data/lib/ddr/auth/legacy/legacy_authorization.rb +0 -44
  126. data/lib/ddr/auth/legacy/legacy_default_permissions.rb +0 -33
  127. data/lib/ddr/auth/legacy/legacy_permissions.rb +0 -33
  128. data/lib/ddr/auth/legacy/legacy_roles.rb +0 -25
  129. data/lib/ddr/index/legacy_license_fields.rb +0 -12
  130. data/lib/ddr/jobs.rb +0 -12
  131. data/lib/ddr/jobs/fits_file_characterization.rb +0 -13
  132. data/lib/ddr/jobs/fixity_check.rb +0 -13
  133. data/lib/ddr/jobs/job.rb +0 -36
  134. data/lib/ddr/jobs/queue.rb +0 -27
  135. data/lib/ddr/jobs/update_index.rb +0 -13
  136. data/lib/ddr/models/access_controllable.rb +0 -24
  137. data/lib/ddr/models/struct_div.rb +0 -63
  138. data/spec/auth/legacy_default_permissions_spec.rb +0 -37
  139. data/spec/auth/legacy_permissions_spec.rb +0 -37
  140. data/spec/helpers/models_helper_spec.rb +0 -11
  141. data/spec/jobs/fits_file_characterization_spec.rb +0 -16
  142. data/spec/jobs/fixity_check_spec.rb +0 -22
  143. data/spec/jobs/job_spec.rb +0 -40
  144. data/spec/jobs/update_index_spec.rb +0 -22
  145. data/spec/models/struct_div_spec.rb +0 -70
  146. data/spec/support/shared_examples_for_access_controllables.rb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6c395bff66fbd04838113521f876c94f2c50f0d5
4
- data.tar.gz: 2fcd6d04f47a3214354dfbded298988490c55ebb
3
+ metadata.gz: 6bcaaa83b0e74afeba6108c87f4d93f7a6055140
4
+ data.tar.gz: 274113e1be0b560d0a71bc6f991cb5bae6020161
5
5
  SHA512:
6
- metadata.gz: 3688a4d98852efab16a625f3d96b2000e97bfba7d0a43dc5f440e62ba4ee7e3ca5e1a68cf9c152e99fdde5960a54374bb56c95f0c4d1c7c1d0cd550f5bd7f49b
7
- data.tar.gz: a544cb5f06cad8ee3510052c37d6d60c3a9d5e88e1c49853701644a6d6f7fb5a6986a594dfa2dcfa6adcb88e0617ef9886cc9117480008d5987d5ec7758a09ac
6
+ metadata.gz: e17be5ca7d910555abeb9946f55776a3b84e8d9fe6c46f34c1498719887d725eefd65fb97014792fdb34fe48cedf45fcd6618a67691edd784747add6d3906921
7
+ data.tar.gz: 12ad20c8c046d291cea2d022672f5bffcb8bf599c2c31898ee7417fdcc50e622627c945f6478d0b51496768136d409d0e3f4b3907cf7f241b2823931261271b6
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.1.5
1
+ 2.3.1
data/.travis.yml CHANGED
@@ -5,7 +5,7 @@ before_install:
5
5
  - gem install bundler
6
6
  bundler_args: --without production
7
7
  rvm:
8
- - 2.1.5
8
+ - 2.3.1
9
9
  script: "bundle exec rake ci"
10
10
  env:
11
11
  - DDR_AUX_API_URL=http://localhost:3000/api
data/Gemfile CHANGED
@@ -1,9 +1,8 @@
1
1
  source 'https://rubygems.org'
2
- ruby '2.1.5'
2
+ ruby '2.3.1'
3
3
 
4
4
  gemspec
5
5
 
6
6
  gem "devise"
7
- gem "rails", "4.1.16"
7
+ gem "rails", "4.2.7"
8
8
  gem "blacklight", "5.19.2"
9
- gem "rubydora", "~> 1.8"
@@ -3,10 +3,9 @@
3
3
  #
4
4
  class Collection < Ddr::Models::Base
5
5
 
6
- include Hydra::AdminPolicyBehavior
7
-
8
6
  include Ddr::Models::HasChildren
9
7
  include Ddr::Models::HasAttachments
8
+ include Ddr::Models::HasStructMetadata
10
9
 
11
10
  has_many :children, property: :is_member_of_collection, class_name: 'Item'
12
11
  has_many :targets, property: :is_external_target_for, class_name: 'Target'
@@ -45,7 +44,6 @@ class Collection < Ddr::Models::Base
45
44
  end
46
45
 
47
46
  def grant_roles_to_creator(creator)
48
- roles.grant type: Ddr::Auth::Roles::CURATOR, agent: creator.agent, scope: Ddr::Auth::Roles::RESOURCE_SCOPE
49
47
  roles.grant type: Ddr::Auth::Roles::CURATOR, agent: creator.agent, scope: Ddr::Auth::Roles::POLICY_SCOPE
50
48
  end
51
49
 
@@ -55,6 +53,16 @@ class Collection < Ddr::Models::Base
55
53
 
56
54
  private
57
55
 
56
+ def default_roles
57
+ super.tap do |roles|
58
+ if Ddr::Auth.metadata_managers_group
59
+ roles << { type: Ddr::Auth::Roles::METADATA_EDITOR,
60
+ agent: Ddr::Auth.metadata_managers_group,
61
+ scope: Ddr::Auth::Roles::POLICY_SCOPE }
62
+ end
63
+ end
64
+ end
65
+
58
66
  def set_admin_policy
59
67
  reload
60
68
  self.admin_policy = self
@@ -6,14 +6,13 @@
6
6
  class Component < Ddr::Models::Base
7
7
 
8
8
  include Ddr::Models::HasContent
9
+ include Ddr::Models::HasIntermediateFile
9
10
  include Ddr::Models::HasMultiresImage
10
11
  include Ddr::Models::HasStructMetadata
11
12
 
12
13
  belongs_to :parent, :property => :is_part_of, :class_name => 'Item'
13
14
  belongs_to :target, :property => :has_external_target, :class_name => 'Target'
14
15
 
15
- after_save :index_parent, if: :has_extracted_text?, unless: "parent.nil?"
16
-
17
16
  alias_method :item, :parent
18
17
  alias_method :item=, :parent=
19
18
 
@@ -29,8 +28,59 @@ class Component < Ddr::Models::Base
29
28
  parent.present? && parent.published?
30
29
  end
31
30
 
32
- def index_parent
33
- Resque.enqueue(Ddr::Jobs::UpdateIndex, parent_id)
31
+ def default_structure
32
+ build_default_structure if has_content?
33
+ end
34
+
35
+ private
36
+
37
+ def build_default_structure
38
+ document = Ddr::Models::Structure.xml_template
39
+ structure = Ddr::Models::Structure.new(document)
40
+ metshdr = structure.add_metshdr
41
+ structure.add_agent(parent: metshdr, role: Ddr::Models::Structures::Agent::ROLE_CREATOR,
42
+ name: Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT)
43
+ filesec = structure.add_filesec
44
+ structmap = structure.add_structmap(type: Ddr::Models::Structure::TYPE_DEFAULT)
45
+ div = structure.add_div(parent: structmap)
46
+ filegrp = structure.add_filegrp(parent: filesec)
47
+ add_original_file(structure, filegrp, div)
48
+ add_preservation_master_file(structure, filegrp, div)
49
+ add_intermediate_file(structure, filegrp, div) if has_intermediate_file?
50
+ add_service_file(structure, filegrp, div)
51
+ add_thumbnail_image(structure, filegrp, div) if has_thumbnail?
52
+ structure
53
+ end
54
+
55
+ def add_original_file(structure, filegrp, div)
56
+ file = structure.add_file(parent: filegrp, use: Ddr::Models::Structure::USE_ORIGINAL_FILE)
57
+ structure.add_flocat(parent: file, loctype: 'OTHER', otherloctype: 'AttachedFile', href: Ddr::Datastreams::CONTENT)
58
+ structure.add_fptr(parent: div, fileid: file['ID'])
59
+ end
60
+
61
+ def add_preservation_master_file(structure, filegrp, div)
62
+ file = structure.add_file(parent: filegrp, use: Ddr::Models::Structure::USE_PRESERVATION_MASTER_FILE)
63
+ structure.add_flocat(parent: file, loctype: 'OTHER', otherloctype: 'AttachedFile', href: Ddr::Datastreams::CONTENT)
64
+ structure.add_fptr(parent: div, fileid: file['ID'])
65
+ end
66
+
67
+ def add_intermediate_file(structure, filegrp, div)
68
+ file = structure.add_file(parent: filegrp, use: Ddr::Models::Structure::USE_INTERMEDIATE_FILE)
69
+ structure.add_flocat(parent: file, loctype: 'OTHER', otherloctype: 'AttachedFile', href: Ddr::Datastreams::INTERMEDIATE_FILE)
70
+ structure.add_fptr(parent: div, fileid: file['ID'])
71
+ end
72
+
73
+ def add_service_file(structure, filegrp, div)
74
+ file = structure.add_file(parent: filegrp, use: Ddr::Models::Structure::USE_SERVICE_FILE)
75
+ service_file = has_multires_image? ? Ddr::Datastreams::MULTIRES_IMAGE : Ddr::Datastreams::CONTENT
76
+ structure.add_flocat(parent: file, loctype: 'OTHER', otherloctype: 'AttachedFile', href: service_file)
77
+ structure.add_fptr(parent: div, fileid: file['ID'])
78
+ end
79
+
80
+ def add_thumbnail_image(structure, filegrp, div)
81
+ file = structure.add_file(parent: filegrp, use: Ddr::Models::Structure::USE_THUMBNAIL_IMAGE)
82
+ structure.add_flocat(parent: file, loctype: 'OTHER', otherloctype: 'AttachedFile', href: Ddr::Datastreams::THUMBNAIL)
83
+ structure.add_fptr(parent: div, fileid: file['ID'])
34
84
  end
35
85
 
36
86
  end
data/app/models/item.rb CHANGED
@@ -26,8 +26,7 @@ class Item < Ddr::Models::Base
26
26
  end
27
27
 
28
28
  def children_having_extracted_text
29
- item = self
30
- Ddr::Index::Query.new do
29
+ Ddr::Index::Query.build(self) do |item|
31
30
  is_part_of item
32
31
  where attached_files_having_content: "extractedText"
33
32
  fields :id, :extracted_text
@@ -37,11 +37,6 @@ module ActiveFedora
37
37
  governable? && admin_policy.present?
38
38
  end
39
39
 
40
- def has_rights_metadata?
41
- ds = self.datastreams[Ddr::Datastreams::RIGHTS_METADATA]
42
- ds && ds.size && ds.size > 0
43
- end
44
-
45
40
  def can_have_struct_metadata?
46
41
  datastreams.include? Ddr::Datastreams::STRUCT_METADATA
47
42
  end
@@ -50,6 +45,14 @@ module ActiveFedora
50
45
  can_have_struct_metadata? && structMetadata.has_content?
51
46
  end
52
47
 
48
+ def can_have_intermediate_file?
49
+ datastreams.include? Ddr::Datastreams::INTERMEDIATE_FILE
50
+ end
51
+
52
+ def has_intermediate_file?
53
+ can_have_intermediate_file? && datastreams[Ddr::Datastreams::INTERMEDIATE_FILE].has_content?
54
+ end
55
+
53
56
  def can_have_multires_image?
54
57
  datastreams.include? Ddr::Datastreams::MULTIRES_IMAGE
55
58
  end
@@ -0,0 +1,11 @@
1
+ module Rubydora
2
+ class Datastream
3
+ def entity_size(response)
4
+ if content_length = response["content-length"]
5
+ content_length.to_i
6
+ else
7
+ response.body.length
8
+ end
9
+ end
10
+ end
11
+ end
@@ -8,21 +8,28 @@ ActiveSupport::Notifications.subscribe(Ddr::Notifications::FIXITY_CHECK, Ddr::Ev
8
8
  # Virus Checks
9
9
  ActiveSupport::Notifications.subscribe(Ddr::Notifications::VIRUS_CHECK, Ddr::Events::VirusCheckEvent)
10
10
 
11
- # Creation
11
+ # Ingestion/Creation
12
12
  ActiveSupport::Notifications.subscribe(Ddr::Notifications::CREATION, Ddr::Events::CreationEvent)
13
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::INGEST, Ddr::Events::IngestionEvent)
14
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::INGEST, Ddr::Derivatives::UpdateDerivatives)
13
15
 
14
16
  # Update
15
17
  ActiveSupport::Notifications.subscribe(Ddr::Notifications::UPDATE, Ddr::Events::UpdateEvent)
16
- ActiveSupport::Notifications.subscribe("assign.permanent_id", Ddr::Events::UpdateEvent)
18
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::UPDATE, Ddr::Events::UpdateEvent)
19
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::UPDATE, Ddr::Models::PermanentId)
20
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::UPDATE, Ddr::Derivatives::UpdateDerivatives)
17
21
 
18
- # Deletion
22
+ # Delete
19
23
  ActiveSupport::Notifications.subscribe(Ddr::Notifications::DELETION, Ddr::Events::DeletionEvent)
20
- ActiveSupport::Notifications.subscribe(/destroy\.\w+/, Ddr::Events::DeletionEvent)
21
- ActiveSupport::Notifications.subscribe(/destroy\.\w+/, Ddr::Models::PermanentId)
24
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::DELETE, Ddr::Models::PermanentId)
25
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::DELETE, Ddr::Events::DeletionEvent)
26
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::DELETE, Ddr::Datastreams::DeleteExternalFiles)
22
27
 
23
28
  # Deaccession
24
- ActiveSupport::Notifications.subscribe(/deaccession\.\w+/, Ddr::Events::DeaccessionEvent)
25
- ActiveSupport::Notifications.subscribe(/deaccession\.\w+/, Ddr::Models::PermanentId)
29
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::DEACCESSION, Ddr::Models::PermanentId)
30
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::DEACCESSION, Ddr::Events::DeaccessionEvent)
31
+ ActiveSupport::Notifications.subscribe(Ddr::Models::Base::DEACCESSION, Ddr::Datastreams::DeleteExternalFiles)
26
32
 
27
- # Workflow
28
- ActiveSupport::Notifications.subscribe(/workflow/, Ddr::Models::PermanentId)
33
+ # Files
34
+ ActiveSupport::Notifications.subscribe(Ddr::Datastreams::DELETE, Ddr::Derivatives::UpdateDerivatives)
35
+ ActiveSupport::Notifications.subscribe(Ddr::Datastreams::DELETE, Ddr::Datastreams::DeleteExternalFiles)
@@ -56,6 +56,9 @@ en:
56
56
  techmd_image_width:
57
57
  label: "Image Width"
58
58
  heading: image_width
59
+ techmd_md5:
60
+ label: MD5
61
+ heading: md5
59
62
  techmd_media_type:
60
63
  label: "Media Type"
61
64
  heading: media_type
data/ddr-models.gemspec CHANGED
@@ -18,9 +18,10 @@ Gem::Specification.new do |s|
18
18
 
19
19
  s.require_paths = ["lib", "app/models"]
20
20
 
21
- s.add_dependency "rails", "~> 4.1"
21
+ s.add_dependency "rails", ">= 4.2.7", "< 5" # Hydra 7.x not compatible/tested with Rails 5
22
22
  s.add_dependency "activeresource"
23
- s.add_dependency "active-fedora", "~> 7.0"
23
+ s.add_dependency "active-fedora", ">= 7.3.1", "< 8"
24
+ s.add_dependency "rubydora", "~> 2.0"
24
25
  s.add_dependency "hydra-core", "~> 7.2"
25
26
  s.add_dependency "hydra-validations", "~> 0.5"
26
27
  s.add_dependency "devise", "~> 3.4"
@@ -1,26 +1,20 @@
1
- require "ostruct"
2
- require "shellwords"
3
-
4
1
  module Ddr::Actions
5
2
  class VirusCheck
6
3
 
7
4
  # @return [Hash] result data
8
5
  # @raises [Ddr::Antivirus::VirusFoundError]
9
6
  def self.call(file_path)
10
- unless File.exist?(file_path)
11
- raise Error, "File not found: #{file_path}"
12
- end
13
- result = {}
14
- begin
15
- scan_result = Ddr::Antivirus.scan(file_path)
16
- rescue Ddr::Antivirus::ScannerError => e
17
- result[:exception] = [e.class.name, e.to_s]
18
- scan_result = e.result
7
+ Hash.new.tap do |result|
8
+ begin
9
+ scan_result = Ddr::Antivirus.scan(file_path)
10
+ rescue Ddr::Antivirus::ScannerError => e
11
+ result[:exception] = [e.class.name, e.to_s]
12
+ scan_result = e.result
13
+ end
14
+ result[:event_date_time] = scan_result.scanned_at
15
+ result[:software] = scan_result.version
16
+ result[:detail] = scan_result.output
19
17
  end
20
- result[:event_date_time] = scan_result.scanned_at
21
- result[:software] = scan_result.version
22
- result[:detail] = scan_result.output
23
- result
24
18
  end
25
19
 
26
20
  end
data/lib/ddr/auth.rb CHANGED
@@ -46,14 +46,6 @@ module Ddr
46
46
  autoload :SuperuserAbilityDefinitions
47
47
  end
48
48
 
49
- autoload_under 'legacy' do
50
- autoload :AbstractLegacyPermissions
51
- autoload :LegacyAuthorization
52
- autoload :LegacyDefaultPermissions
53
- autoload :LegacyPermissions
54
- autoload :LegacyRoles
55
- end
56
-
57
49
  # Name of group whose members are authorized to act as superuser
58
50
  mattr_accessor :superuser_group
59
51
 
@@ -7,16 +7,18 @@ module Ddr
7
7
  ADMIN_METADATA = "adminMetadata"
8
8
  CONTENT = "content"
9
9
  DC = "DC"
10
- DEFAULT_RIGHTS = "defaultRights"
11
10
  DESC_METADATA = "descMetadata"
12
11
  EXTRACTED_TEXT = "extractedText"
13
12
  FITS = "fits".freeze
13
+ INTERMEDIATE_FILE = "intermediateFile".freeze
14
14
  MULTIRES_IMAGE = "multiresImage"
15
15
  RELS_EXT = "RELS-EXT"
16
- RIGHTS_METADATA = "rightsMetadata"
17
16
  STRUCT_METADATA = "structMetadata"
18
17
  THUMBNAIL = "thumbnail"
19
18
 
19
+ SAVE = "save.repo_file"
20
+ DELETE = "delete.repo_file"
21
+
20
22
  CHECKSUM_TYPE_MD5 = "MD5"
21
23
  CHECKSUM_TYPE_SHA1 = "SHA-1"
22
24
  CHECKSUM_TYPE_SHA256 = "SHA-256"
@@ -26,12 +28,21 @@ module Ddr
26
28
  CHECKSUM_TYPES = [ CHECKSUM_TYPE_MD5, CHECKSUM_TYPE_SHA1, CHECKSUM_TYPE_SHA256, CHECKSUM_TYPE_SHA384, CHECKSUM_TYPE_SHA512 ]
27
29
 
28
30
  autoload :AdministrativeMetadataDatastream
31
+ autoload :ContentDatastream
29
32
  autoload :DatastreamBehavior
33
+ autoload :DeleteExternalFiles
30
34
  autoload :DescriptiveMetadataDatastream
35
+ autoload :ExternalFileDatastream
31
36
  autoload :FitsDatastream
37
+ autoload :IntermediateFileDatastream
32
38
  autoload :MetadataDatastream
39
+ autoload :MultiresImageDatastream
33
40
  autoload :PlainTextDatastream
34
41
  autoload :StructuralMetadataDatastream
35
42
 
43
+ mattr_accessor :update_derivatives_on_changed do
44
+ [ CONTENT, INTERMEDIATE_FILE ]
45
+ end
46
+
36
47
  end
37
48
  end
@@ -52,6 +52,15 @@ module Ddr
52
52
  property :is_locked,
53
53
  predicate: Ddr::Vocab::Asset.isLocked
54
54
 
55
+ property :ingested_by,
56
+ predicate: Ddr::Vocab::Asset.ingestedBy
57
+
58
+ property :ingestion_date,
59
+ predicate: Ddr::Vocab::Asset.ingestionDate
60
+
61
+ property :rights_note,
62
+ predicate: Ddr::Vocab::Asset.rightsNote
63
+
55
64
  end
56
65
  end
57
66
  end
@@ -0,0 +1,5 @@
1
+ module Ddr::Datastreams
2
+ class ContentDatastream < ExternalFileDatastream
3
+
4
+ end
5
+ end
@@ -1,17 +1,23 @@
1
1
  module Ddr
2
2
  module Datastreams
3
3
  module DatastreamBehavior
4
+ extend ActiveSupport::Concern
4
5
 
5
6
  DEFAULT_FILE_EXTENSION = "bin"
6
7
 
7
8
  STRFTIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%LZ"
8
9
 
10
+ included do
11
+ around_save :notify_save
12
+ around_destroy :notify_delete
13
+ end
14
+
9
15
  def validate_checksum! checksum, checksum_type=nil
10
16
  raise Ddr::Models::Error, "Checksum cannot be validated on new datastream." if new?
11
17
  raise Ddr::Models::Error, "Checksum cannot be validated on unpersisted content." if content_changed?
12
18
  raise Ddr::Models::ChecksumInvalid, "The repository internal checksum validation failed." unless dsChecksumValid
13
19
  algorithm = checksum_type || self.checksumType
14
- ds_checksum = if algorithm == self.checksumType
20
+ ds_checksum = if !external? && algorithm == self.checksumType
15
21
  self.checksum
16
22
  else
17
23
  content_digest(algorithm)
@@ -23,6 +29,10 @@ module Ddr
23
29
  end
24
30
  end
25
31
 
32
+ def version_history
33
+ versions.map(&:profile)
34
+ end
35
+
26
36
  def version_uri
27
37
  # E.g., info:fedora/duke:1/content/content.0
28
38
  ["info:fedora", pid, dsid, dsVersionID].join("/") unless new?
@@ -41,31 +51,35 @@ module Ddr
41
51
  Ddr::Utils.digest(self.content, algorithm)
42
52
  end
43
53
 
44
- # Returns a list of the external file paths for all versions of the datastream.
45
54
  def file_paths
46
- raise "The `file_paths' method is valid only for external datastreams." unless external?
47
- return Array(file_path) if new?
48
- versions.map(&:file_path).compact
55
+ if new?
56
+ return Array(file_path)
57
+ else
58
+ versions.map(&:file_path).compact
59
+ end
49
60
  end
50
61
 
51
- # Returns the external file path for the datastream.
52
- # Returns nil if dsLocation is not a file URI.
53
62
  def file_path
54
- raise "The `file_path' method is valid only for external datastreams." unless external?
55
- Ddr::Utils.path_from_uri(dsLocation) if Ddr::Utils.file_uri?(dsLocation)
63
+ if external? && dsLocation.present? && dsLocation.start_with?("file:")
64
+ Ddr::Utils.path_from_uri(dsLocation)
65
+ end
56
66
  end
57
67
 
58
- # Returns the file name of the external file for the datastream.
59
- # See #external_datastream_file_path(ds)
60
68
  def file_name
61
- raise "The `file_name' method is valid only for external datastreams." unless external?
62
- File.basename(file_path) rescue nil
69
+ if path = file_path
70
+ File.basename(path)
71
+ end
63
72
  end
64
73
 
65
74
  # Returns the size of the external file for the datastream.
66
75
  def file_size
67
- raise "The `file_size' method is valid only for external datastreams." unless external?
68
- File.size(file_path) rescue nil
76
+ if external?
77
+ if path = file_path
78
+ File.size(path)
79
+ end
80
+ else
81
+ dsSize
82
+ end
69
83
  end
70
84
 
71
85
  # Return default file extension for datastream based on MIME type
@@ -103,6 +117,37 @@ module Ddr
103
117
  end
104
118
  end
105
119
 
120
+ private
121
+
122
+ def default_notification_payload
123
+ { pid: pid, file_id: dsid, control_group: controlGroup }
124
+ end
125
+
126
+ def delete_notification_payload
127
+ default_notification_payload.merge(
128
+ profile: profile.dup,
129
+ version_history: version_history
130
+ )
131
+ end
132
+
133
+ def notify_save
134
+ ActiveSupport::Notifications.instrument(
135
+ Ddr::Datastreams::SAVE,
136
+ default_notification_payload.merge(attributes_changed: changes)
137
+ ) do |payload|
138
+ yield
139
+ payload[:profile] = profile.dup
140
+ end
141
+ end
142
+
143
+ def notify_delete
144
+ ActiveSupport::Notifications.instrument(
145
+ Ddr::Datastreams::DELETE, delete_notification_payload
146
+ ) do |payload|
147
+ yield
148
+ end
149
+ end
150
+
106
151
  end
107
152
  end
108
153
  end