ddr-models 2.5.3 → 2.6.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.
- checksums.yaml +4 -4
- data/app/controllers/users/sessions_controller.rb +0 -5
- data/config/initializers/devise.rb +3 -2
- data/config/initializers/rsolr_monkey_patches.rb +7 -0
- data/config/initializers/subscriptions.rb +0 -2
- data/ddr-models.gemspec +2 -1
- data/lib/ddr/actions/virus_check.rb +0 -1
- data/lib/ddr/auth.rb +0 -4
- data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +9 -16
- data/lib/ddr/derivatives/generator.rb +0 -2
- data/lib/ddr/derivatives/png_generator.rb +2 -4
- data/lib/ddr/derivatives/ptif_generator.rb +6 -7
- data/lib/ddr/index/fields.rb +18 -2
- data/lib/ddr/jobs.rb +0 -4
- data/lib/ddr/managers.rb +0 -1
- data/lib/ddr/managers/derivatives_manager.rb +3 -4
- data/lib/ddr/managers/workflow_manager.rb +3 -0
- data/lib/ddr/models.rb +6 -3
- data/lib/ddr/models/base.rb +13 -0
- data/lib/ddr/models/has_admin_metadata.rb +4 -20
- data/lib/ddr/models/indexing.rb +16 -0
- data/lib/ddr/models/solr_document.rb +8 -0
- data/lib/ddr/models/version.rb +1 -1
- data/lib/ddr/models/year_facet.rb +60 -118
- data/spec/auth/ability_spec.rb +1 -1
- data/spec/auth/roles/role_spec.rb +9 -9
- data/spec/index/fields_spec.rb +96 -0
- data/spec/models/active_fedora_datastream_spec.rb +6 -5
- data/spec/models/has_admin_metadata_spec.rb +49 -125
- data/spec/models/indexing_spec.rb +50 -18
- data/spec/models/solr_document_spec.rb +28 -0
- data/spec/models/year_facet_spec.rb +49 -22
- data/spec/support/shared_examples_for_ddr_models.rb +54 -2
- metadata +21 -8
- data/lib/ddr/jobs/permanent_id.rb +0 -35
- data/lib/ddr/managers/permanent_id_manager.rb +0 -93
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edadac3d26e329ebd8cd6ce67e3d92c10e2233da
|
4
|
+
data.tar.gz: 70aefbe23b138eedb961dd6cc24886a3ad4691ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73f1a830f3a2763d9a867505260286d5c50836d530551d758b92351339af451c67eb4572f5924501017d271bedbef692a1ff9981469f589c4fe796e187e05bbe
|
7
|
+
data.tar.gz: 1a2541c01cdf459f64ec0b9ee291479f77446b845da398c13038d721c48c69d9a3641a25f83a56ea7f673d555e096f99ff2c1a670705d298dc773b444389c51e
|
@@ -218,14 +218,15 @@ Devise.setup do |config|
|
|
218
218
|
# Explicit require is needed here for devise to find strategy
|
219
219
|
require "omniauth-shibboleth"
|
220
220
|
config.omniauth :shibboleth, {
|
221
|
-
uid_field: "eppn",
|
221
|
+
uid_field: lambda { |rpm| rpm.call("eppn") || rpm.call("duDukeID") },
|
222
222
|
name_field: "displayName",
|
223
223
|
info_fields: {
|
224
224
|
email: "mail",
|
225
225
|
first_name: "givenName",
|
226
226
|
last_name: "sn",
|
227
227
|
nickname: "eduPersonNickname"
|
228
|
-
}
|
228
|
+
},
|
229
|
+
extra_fields: ["duDukeID"],
|
229
230
|
}
|
230
231
|
|
231
232
|
# ==> Warden configuration
|
@@ -17,8 +17,6 @@ ActiveSupport::Notifications.subscribe(Ddr::Notifications::UPDATE, Ddr::Events::
|
|
17
17
|
# Deletion
|
18
18
|
ActiveSupport::Notifications.subscribe(Ddr::Notifications::DELETION, Ddr::Events::DeletionEvent)
|
19
19
|
ActiveSupport::Notifications.subscribe(/destroy\.\w+/, Ddr::Events::DeletionEvent)
|
20
|
-
ActiveSupport::Notifications.subscribe(/destroy\.\w+/, Ddr::Jobs::PermanentId::MakeUnavailable)
|
21
20
|
|
22
21
|
# Deaccession
|
23
22
|
ActiveSupport::Notifications.subscribe(/deaccession\.\w+/, Ddr::Events::DeaccessionEvent)
|
24
|
-
ActiveSupport::Notifications.subscribe(/deaccession\.\w+/, Ddr::Jobs::PermanentId::MakeUnavailable)
|
data/ddr-models.gemspec
CHANGED
@@ -18,7 +18,7 @@ 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.1"
|
22
22
|
s.add_dependency "activeresource"
|
23
23
|
s.add_dependency "active-fedora", "~> 7.0"
|
24
24
|
s.add_dependency "hydra-core", "~> 7.2"
|
@@ -34,6 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.add_dependency "ddr-antivirus", "~> 2.1.1"
|
35
35
|
s.add_dependency "virtus", "~> 1.0.5"
|
36
36
|
s.add_dependency "hashie", "~> 3.4", "< 3.4.4"
|
37
|
+
s.add_dependency "edtf", "~> 3.0"
|
37
38
|
|
38
39
|
s.add_development_dependency "bundler", "~> 1.11"
|
39
40
|
s.add_development_dependency "rake"
|
data/lib/ddr/auth.rb
CHANGED
@@ -12,19 +12,20 @@ module Ddr
|
|
12
12
|
|
13
13
|
private
|
14
14
|
|
15
|
-
def has_permission?(permission,
|
16
|
-
permissions(
|
15
|
+
def has_permission?(permission, object_or_id)
|
16
|
+
permissions(object_or_id).include? permission
|
17
17
|
end
|
18
18
|
|
19
|
-
def permissions(
|
20
|
-
case
|
19
|
+
def permissions(object_or_id)
|
20
|
+
case object_or_id
|
21
21
|
when Ddr::Models::Base, SolrDocument
|
22
|
-
cached_permissions
|
23
|
-
|
22
|
+
cached_permissions(object_or_id.id) do
|
23
|
+
object_or_id.effective_permissions(agents)
|
24
24
|
end
|
25
25
|
when String
|
26
|
-
cached_permissions
|
27
|
-
|
26
|
+
cached_permissions(object_or_id) do
|
27
|
+
doc = SolrDocument.find(object_or_id) # raises SolrDocument::NotFound
|
28
|
+
doc.effective_permissions(agents)
|
28
29
|
end
|
29
30
|
end
|
30
31
|
end
|
@@ -33,14 +34,6 @@ module Ddr
|
|
33
34
|
cache[pid] ||= block.call
|
34
35
|
end
|
35
36
|
|
36
|
-
def permissions_doc(pid)
|
37
|
-
roles_query_result = ActiveFedora::SolrService.query("id:\"#{pid}\"", rows: 1).first
|
38
|
-
if roles_query_result.nil?
|
39
|
-
raise "Solr document not found for PID \"#{pid}\"."
|
40
|
-
end
|
41
|
-
SolrDocument.new roles_query_result
|
42
|
-
end
|
43
|
-
|
44
37
|
end
|
45
38
|
end
|
46
39
|
end
|
@@ -5,8 +5,6 @@ module Ddr
|
|
5
5
|
|
6
6
|
attr_reader :source, :output, :options
|
7
7
|
|
8
|
-
GeneratorResult = Struct.new(:stdout, :stderr, :status)
|
9
|
-
|
10
8
|
def initialize source, output, options=nil
|
11
9
|
raise ArgumentError, "Source must be a File or path to a file" unless Ddr::Utils.file_or_path?(source)
|
12
10
|
raise ArgumentError, "Output must be a File or path to a file" unless Ddr::Utils.file_or_path?(output)
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'open3'
|
2
|
-
|
3
1
|
module Ddr
|
4
2
|
module Derivatives
|
5
3
|
class PngGenerator < Generator
|
@@ -10,8 +8,8 @@ module Ddr
|
|
10
8
|
|
11
9
|
def generate
|
12
10
|
command = "convert #{Ddr::Utils.file_path(source)}[0] #{options} png:#{Ddr::Utils.file_path(output)}"
|
13
|
-
|
14
|
-
|
11
|
+
`#{command}`
|
12
|
+
$?.exitstatus
|
15
13
|
end
|
16
14
|
|
17
15
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'open3'
|
2
|
-
|
3
1
|
module Ddr
|
4
2
|
module Derivatives
|
5
3
|
class PtifGenerator < Generator
|
@@ -27,19 +25,20 @@ module Ddr
|
|
27
25
|
|
28
26
|
def run_generator(source_to_use)
|
29
27
|
command = "vips im_vips2tiff #{Ddr::Utils.file_path(source_to_use)} #{Ddr::Utils.file_path(output)}:#{options}"
|
30
|
-
|
31
|
-
|
28
|
+
`#{command}`
|
29
|
+
$?.exitstatus
|
32
30
|
end
|
33
31
|
|
34
32
|
def make_8_bit(tempdir)
|
35
33
|
temp_8_bit = File.new(File.join(tempdir, "temp_8_bit.v"), 'wb')
|
36
34
|
command = "vips im_msb #{Ddr::Utils.file_path(source)} #{Ddr::Utils::file_path(temp_8_bit)}"
|
37
|
-
|
38
|
-
|
35
|
+
`#{command}`
|
36
|
+
exitstatus = $?.exitstatus
|
37
|
+
if exitstatus == 0
|
39
38
|
return temp_8_bit
|
40
39
|
else
|
41
40
|
raise Ddr::Models::DerivativeGenerationFailure,
|
42
|
-
"Error converting #{Ddr::Utils.file_path(source)} to 8-bit
|
41
|
+
"Error converting #{Ddr::Utils.file_path(source)} to 8-bit"
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
data/lib/ddr/index/fields.rb
CHANGED
@@ -10,6 +10,7 @@ module Ddr::Index
|
|
10
10
|
ADMIN_SET_FACET = Field.new :admin_set_facet, :facetable
|
11
11
|
ADMIN_SET_TITLE = Field.new :admin_set_title, :stored_sortable
|
12
12
|
ALL_TEXT = Field.new :all_text, solr_name: "all_text_timv"
|
13
|
+
ARRANGER_FACET = Field.new :arranger_facet, :facetable
|
13
14
|
ASPACE_ID = Field.new :aspace_id, :stored_sortable
|
14
15
|
ATTACHED_FILES_HAVING_CONTENT =
|
15
16
|
Field.new :attached_files_having_content, :symbol
|
@@ -19,6 +20,7 @@ module Ddr::Index
|
|
19
20
|
COLLECTION_TITLE = Field.new :collection_title, :stored_sortable
|
20
21
|
COLLECTION_URI = Field.new :collection_uri, :symbol
|
21
22
|
COMPANY_FACET = Field.new :company_facet, :facetable
|
23
|
+
COMPOSER_FACET = Field.new :composer_facet, :facetable
|
22
24
|
CONTENT_CONTROL_GROUP = Field.new :content_control_group, :searchable, type: :string
|
23
25
|
CONTENT_CREATE_DATE = Field.new :content_create_date, :stored_sortable, type: :date
|
24
26
|
CONTENT_SIZE = Field.new :content_size, solr_name: "content_size_lsi"
|
@@ -31,12 +33,18 @@ module Ddr::Index
|
|
31
33
|
DISPLAY_FORMAT = Field.new :display_format, :stored_sortable
|
32
34
|
DOI = Field.new :doi, :symbol
|
33
35
|
EAD_ID = Field.new :ead_id, :stored_sortable
|
36
|
+
ENGRAVER_FACET = Field.new :engraver_facet, :facetable
|
34
37
|
EXTRACTED_TEXT = Field.new :extracted_text, solr_name: "extracted_text_tsm"
|
35
38
|
FOLDER_FACET = Field.new :folder_facet, :facetable
|
36
39
|
FORMAT_FACET = Field.new :format_facet, :facetable
|
40
|
+
GENRE_FACET = Field.new :genre_facet, :facetable
|
37
41
|
HAS_MODEL = Field.new :has_model, :symbol
|
38
42
|
IDENTIFIER_ALL = Field.new :identifier_all, :symbol
|
43
|
+
ILLUSTRATED_FACET = Field.new :illustrated_facet, :facetable
|
44
|
+
ILLUSTRATOR_FACET = Field.new :illustrator_facet, :facetable
|
45
|
+
INSTRUMENTATION_FACET = Field.new :instrumentation_facet, :facetable
|
39
46
|
INTERNAL_URI = Field.new :internal_uri, :stored_sortable
|
47
|
+
INTERVIEWER_NAME_FACET = Field.new :interviewer_name_facet, :facetable
|
40
48
|
IS_ATTACHED_TO = Field.new :is_attached_to, :symbol
|
41
49
|
IS_EXTERNAL_TARGET_FOR = Field.new :is_external_target_for, :symbol
|
42
50
|
IS_GOVERNED_BY = Field.new :is_governed_by, :symbol
|
@@ -49,7 +57,9 @@ module Ddr::Index
|
|
49
57
|
LAST_VIRUS_CHECK_ON = Field.new :last_virus_check_on, :stored_sortable, type: :date
|
50
58
|
LAST_VIRUS_CHECK_OUTCOME = Field.new :last_virus_check_outcome, :symbol
|
51
59
|
LICENSE = Field.new :license, :stored_sortable
|
60
|
+
LITHOGRAPHER_FACET = Field.new :lithographer_facet, :facetable
|
52
61
|
LOCAL_ID = Field.new :local_id, :stored_sortable
|
62
|
+
LYRICIST_FACET = Field.new :lyricist_facet, :facetable
|
53
63
|
MEDIA_SUB_TYPE = Field.new :content_media_sub_type, :facetable
|
54
64
|
MEDIA_MAJOR_TYPE = Field.new :content_media_major_type, :facetable
|
55
65
|
MEDIA_TYPE = Field.new :content_media_type, :symbol
|
@@ -59,20 +69,24 @@ module Ddr::Index
|
|
59
69
|
OBJECT_STATE = Field.new :object_state, :stored_sortable
|
60
70
|
OBJECT_CREATE_DATE = Field.new :system_create, :stored_sortable, type: :date
|
61
71
|
OBJECT_MODIFIED_DATE = Field.new :system_modified, :stored_sortable, type: :date
|
72
|
+
PERFORMER_FACET = Field.new :performer_facet, :facetable
|
62
73
|
PERMANENT_ID = Field.new :permanent_id, :stored_sortable, type: :string
|
63
74
|
PERMANENT_URL = Field.new :permanent_url, :stored_sortable, type: :string
|
64
75
|
PLACEMENT_COMPANY_FACET = Field.new :placement_company_facet, :facetable
|
65
76
|
POLICY_ROLE = Field.new :policy_role, :symbol
|
77
|
+
PRODUCER_FACET = Field.new :producer_facet, :facetable
|
66
78
|
PRODUCT_FACET = Field.new :product_facet, :facetable
|
67
79
|
PUBLICATION_FACET = Field.new :publication_facet, :facetable
|
68
80
|
PUBLISHER_FACET = Field.new :publisher_facet, :facetable
|
69
81
|
RESEARCH_HELP_CONTACT = Field.new :research_help_contact, :stored_sortable
|
70
82
|
RESOURCE_ROLE = Field.new :resource_role, :symbol
|
83
|
+
ROLL_NUMBER_FACET = Field.new :roll_number_facet, :facetable
|
71
84
|
SERIES_FACET = Field.new :series_facet, :facetable
|
72
85
|
SETTING_FACET = Field.new :setting_facet, :facetable
|
73
86
|
SPATIAL_FACET = Field.new :spatial_facet, :facetable
|
74
87
|
STRUCT_MAPS = Field.new :struct_maps, :stored_sortable
|
75
88
|
SUBJECT_FACET = Field.new :subject_facet, :facetable
|
89
|
+
SUBSERIES_FACET = Field.new :subseries_facet, :facetable
|
76
90
|
TECHMD_COLOR_SPACE = Field.new :techmd_color_space, :symbol
|
77
91
|
TECHMD_CREATING_APPLICATION = Field.new :techmd_creating_application, :symbol
|
78
92
|
TECHMD_CREATION_TIME = Field.new :techmd_creation_time, :stored_searchable, type: :date
|
@@ -90,9 +104,11 @@ module Ddr::Index
|
|
90
104
|
TECHMD_PRONOM_IDENTIFIER = Field.new :techmd_pronom_identifier, :symbol
|
91
105
|
TECHMD_VALID = Field.new :techmd_valid, :symbol
|
92
106
|
TECHMD_WELL_FORMED = Field.new :techmd_well_formed, :symbol
|
107
|
+
TEMPORAL_FACET = Field.new :temporal_facet, :facetable
|
93
108
|
TITLE = Field.new :title, :stored_sortable
|
94
109
|
TONE_FACET = Field.new :tone_facet, :facetable
|
95
110
|
TYPE_FACET = Field.new :type_facet, :facetable
|
111
|
+
VOLUME_FACET = Field.new :volume_facet, :facetable
|
96
112
|
WORKFLOW_STATE = Field.new :workflow_state, :stored_sortable
|
97
113
|
YEAR_FACET = Field.new :year_facet, solr_name: "year_facet_iim"
|
98
114
|
|
@@ -101,13 +117,13 @@ module Ddr::Index
|
|
101
117
|
end
|
102
118
|
|
103
119
|
def self.techmd
|
104
|
-
@techmd ||= constants(false).select { |c| c =~ /\ATECHMD_/ }.map { |c| const_get(c) }
|
120
|
+
@techmd ||= constants(false).select { |c| c =~ /\ATECHMD_/ }.map { |c| const_get(c) }.freeze
|
105
121
|
end
|
106
122
|
|
107
123
|
def self.descmd
|
108
124
|
@descmd ||= Ddr::Datastreams::DescriptiveMetadataDatastream.properties.map do |base, config|
|
109
125
|
Field.new base, *(config.behaviors)
|
110
|
-
end
|
126
|
+
end.freeze
|
111
127
|
end
|
112
128
|
|
113
129
|
def self.const_missing(name)
|
data/lib/ddr/jobs.rb
CHANGED
data/lib/ddr/managers.rb
CHANGED
@@ -56,17 +56,16 @@ module Ddr
|
|
56
56
|
tempdir = FileUtils.mkdir(tempdir_path).first
|
57
57
|
generator_source = create_source_file(tempdir)
|
58
58
|
generator_output = File.new(File.join(tempdir, "output.out"), 'wb')
|
59
|
-
|
59
|
+
exitstatus = derivative.generator.new(generator_source.path, generator_output.path, derivative.options).generate
|
60
60
|
generator_source.close unless generator_source.closed?
|
61
|
-
if
|
61
|
+
if exitstatus == 0
|
62
62
|
generator_output = File.open(generator_output, 'rb')
|
63
63
|
object.reload if object.persisted?
|
64
64
|
object.add_file generator_output, derivative.datastream, mime_type: derivative.generator.output_mime_type
|
65
65
|
object.save!
|
66
66
|
else
|
67
|
-
Rails.logger.error results.stderr
|
68
67
|
raise Ddr::Models::DerivativeGenerationFailure,
|
69
|
-
"Failure generating #{derivative.name} for #{object.pid}
|
68
|
+
"Failure generating #{derivative.name} for #{object.pid}"
|
70
69
|
end
|
71
70
|
generator_output.close unless generator_output.closed?
|
72
71
|
ensure
|
data/lib/ddr/models.rb
CHANGED
@@ -89,9 +89,6 @@ module Ddr
|
|
89
89
|
# Image server URL
|
90
90
|
mattr_accessor :image_server_url
|
91
91
|
|
92
|
-
# Whether permanent IDs should be automatically assigned on create
|
93
|
-
mattr_accessor :auto_assign_permanent_ids
|
94
|
-
|
95
92
|
mattr_accessor :permanent_id_target_url_base do
|
96
93
|
"https://repository.duke.edu/id/"
|
97
94
|
end
|
@@ -116,6 +113,12 @@ module Ddr
|
|
116
113
|
Dir.tmpdir
|
117
114
|
end
|
118
115
|
|
116
|
+
# Is repository locked? Default is false.
|
117
|
+
# A locked repository behaves as though each object in the repository is locked.
|
118
|
+
mattr_accessor :repository_locked do
|
119
|
+
false
|
120
|
+
end
|
121
|
+
|
119
122
|
# Yields an object with module configuration accessors
|
120
123
|
def self.configure
|
121
124
|
yield self
|
data/lib/ddr/models/base.rb
CHANGED
@@ -23,6 +23,8 @@ module Ddr
|
|
23
23
|
deprecation_deprecate *(Hydra::AccessControls::Permissions.public_instance_methods)
|
24
24
|
|
25
25
|
around_save :notify_save
|
26
|
+
around_save :notify_workflow_change, if: [:workflow_state_changed?, :persisted?]
|
27
|
+
after_create :notify_create
|
26
28
|
around_deaccession :notify_deaccession
|
27
29
|
around_destroy :notify_destroy
|
28
30
|
|
@@ -128,6 +130,17 @@ module Ddr
|
|
128
130
|
end
|
129
131
|
end
|
130
132
|
|
133
|
+
def notify_workflow_change
|
134
|
+
ActiveSupport::Notifications.instrument("#{workflow_state}.workflow.#{self.class.to_s.underscore}", pid: pid) do |payload|
|
135
|
+
yield
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def notify_create
|
140
|
+
ActiveSupport::Notifications.instrument("create.#{self.class.to_s.underscore}",
|
141
|
+
pid: pid)
|
142
|
+
end
|
143
|
+
|
131
144
|
def notify_deaccession
|
132
145
|
ActiveSupport::Notifications.instrument("deaccession.#{self.class.to_s.underscore}",
|
133
146
|
pid: pid,
|
@@ -22,16 +22,12 @@ module Ddr::Models
|
|
22
22
|
:ead_id,
|
23
23
|
:aspace_id,
|
24
24
|
:is_locked,
|
25
|
+
:doi,
|
25
26
|
datastream: "adminMetadata",
|
26
27
|
multiple: false
|
27
28
|
|
28
|
-
delegate :publish!, :unpublish!, :published?,
|
29
|
-
|
30
|
-
after_create :assign_permanent_id!, if: "Ddr::Models.auto_assign_permanent_ids"
|
31
|
-
end
|
32
|
-
|
33
|
-
def permanent_id_manager
|
34
|
-
@permanent_id_manager ||= Ddr::Managers::PermanentIdManager.new(self)
|
29
|
+
delegate :publish!, :unpublish!, :published?, :unpublished?,
|
30
|
+
to: :workflow
|
35
31
|
end
|
36
32
|
|
37
33
|
def roles
|
@@ -46,10 +42,6 @@ module Ddr::Models
|
|
46
42
|
@workflow ||= Ddr::Managers::WorkflowManager.new(self)
|
47
43
|
end
|
48
44
|
|
49
|
-
def assign_permanent_id!
|
50
|
-
permanent_id_manager.assign_later
|
51
|
-
end
|
52
|
-
|
53
45
|
def grant_roles_to_creator(creator)
|
54
46
|
roles.grant type: Ddr::Auth::Roles::EDITOR,
|
55
47
|
agent: creator,
|
@@ -83,7 +75,7 @@ module Ddr::Models
|
|
83
75
|
end
|
84
76
|
|
85
77
|
def locked?
|
86
|
-
!!is_locked
|
78
|
+
!!is_locked || Ddr::Models.repository_locked
|
87
79
|
end
|
88
80
|
|
89
81
|
def lock
|
@@ -104,13 +96,5 @@ module Ddr::Models
|
|
104
96
|
save
|
105
97
|
end
|
106
98
|
|
107
|
-
private
|
108
|
-
|
109
|
-
def update_permanent_id_on_destroy
|
110
|
-
@permanent_id = permanent_id
|
111
|
-
yield
|
112
|
-
Resque.enqueue(Ddr::Jobs::PermanentId::MakeUnavailable, @permanent_id, "deleted")
|
113
|
-
end
|
114
|
-
|
115
99
|
end
|
116
100
|
end
|