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.
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