-
Notifications
You must be signed in to change notification settings - Fork 41
/
Copy pathembargoable.rb
171 lines (145 loc) · 7.18 KB
/
embargoable.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
module Hydra
module AccessControls
module Embargoable
extend ActiveSupport::Concern
include Hydra::AccessControls::WithAccessRight
included do
validates :lease_expiration_date, :'hydra/future_date' => true, if: :enforce_future_date_for_lease?
validates :embargo_release_date, :'hydra/future_date' => true, if: :enforce_future_date_for_embargo?
belongs_to :embargo, predicate: Hydra::ACL.hasEmbargo, class_name: 'Hydra::AccessControls::Embargo'
belongs_to :lease, predicate: Hydra::ACL.hasLease, class_name: 'Hydra::AccessControls::Lease'
delegate :visibility_during_embargo, :visibility_during_embargo=, :visibility_after_embargo, :visibility_after_embargo=, :embargo_release_date, :embargo_release_date=, :embargo_history, :embargo_history=, to: :existing_or_new_embargo
delegate :visibility_during_lease, :visibility_during_lease=, :visibility_after_lease, :visibility_after_lease=, :lease_expiration_date, :lease_expiration_date=, :lease_history, :lease_history=, to: :existing_or_new_lease
end
def enforce_future_date_for_lease?
lease
end
def enforce_future_date_for_embargo?
embargo
end
# if the embargo exists return it, if not, build one and return it
def existing_or_new_embargo
embargo || build_embargo
end
# if the lease exists return it, if not, build one and return it
def existing_or_new_lease
lease || build_lease
end
def to_solr(solr_doc = {})
super.tap do |doc|
doc.merge!(embargo_indexer_class.new(embargo).generate_solr_document) if embargo
doc.merge!(lease_indexer_class.new(lease).generate_solr_document) if lease
end
end
def embargo_indexer_class
EmbargoIndexer
end
def lease_indexer_class
LeaseIndexer
end
def under_embargo?
embargo && embargo.active?
end
def active_lease?
lease && lease.active?
end
# If changing away from embargo or lease, this will deactivate the lease/embargo before proceeding.
# The lease_visibility! and embargo_visibility! methods rely on this to deactivate the lease when applicable.
def visibility=(value)
# If changing from embargo or lease, deactivate the lease/embargo and wipe out the associated metadata before proceeding
deactivate_embargo! if deactivate_embargo?(value)
deactivate_lease! if deactivate_lease?(value)
super
end
def apply_embargo(release_date, visibility_during=nil, visibility_after=nil)
self.embargo_release_date = release_date
self.visibility_during_embargo = visibility_during unless visibility_during.nil?
self.visibility_after_embargo = visibility_after unless visibility_after.nil?
embargo_visibility!
visibility_will_change! if embargo.changed?
end
# Deactivates the embargo and logs a message to the embargo object.
# Marks this record as dirty so that it will get reindexed.
def deactivate_embargo!
embargo && embargo.deactivate!
visibility_will_change!
end
# Validate that the current visibility is what is specified in the embargo
def validate_visibility_complies_with_embargo
return true unless embargo_release_date
if under_embargo?
expected_visibility = visibility_during_embargo
failure_message = "An embargo is in effect for this object until #{embargo_release_date}. Until that time the "
else
expected_visibility = visibility_after_embargo
failure_message = "The embargo expired on #{embargo_release_date}. The "
end
if visibility != expected_visibility
failure_message << "visibility should be #{expected_visibility} but it is currently #{visibility}. Call embargo_visibility! on this object to repair."
self.errors[:embargo] << failure_message
return false
end
true
end
# Set the current visibility to match what is described in the embargo.
def embargo_visibility!
return unless embargo_release_date
if under_embargo?
self.visibility_during_embargo = visibility_during_embargo ? visibility_during_embargo : Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
self.visibility_after_embargo = visibility_after_embargo ? visibility_after_embargo : Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
self.visibility = visibility_during_embargo
else
self.visibility = visibility_after_embargo ? visibility_after_embargo : Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
end
end
def validate_visibility_complies_with_lease
return true unless lease_expiration_date
if active_lease?
expected_visibility = visibility_during_lease
failure_message = "A lease is in effect for this object until #{lease_expiration_date}. Until that time the "
else
expected_visibility = visibility_after_lease
failure_message = "The lease expired on #{lease_expiration_date}. The "
end
if visibility != expected_visibility
failure_message << "visibility should be #{expected_visibility} but it is currently #{visibility}. Call lease_visibility! on this object to repair."
self.errors[:lease] << failure_message
return false
end
true
end
def apply_lease(release_date, visibility_during=nil, visibility_after=nil)
self.lease_expiration_date = release_date
self.visibility_during_lease = visibility_during unless visibility_during.nil?
self.visibility_after_lease = visibility_after unless visibility_after.nil?
lease_visibility!
visibility_will_change! if lease.changed?
end
def deactivate_lease!
lease && lease.deactivate!
visibility_will_change!
end
# Set the current visibility to match what is described in the lease.
def lease_visibility!
if lease_expiration_date
if active_lease?
self.visibility_during_lease = visibility_during_lease ? visibility_during_lease : Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
self.visibility_after_lease = visibility_after_lease ? visibility_after_lease : Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
self.visibility = visibility_during_lease
else
self.visibility = visibility_after_lease ? visibility_after_lease : Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
end
end
end
private
# @return [true, false] true if there is an embargo set up and the visibility will change
def deactivate_embargo?(value)
embargo && embargo.embargo_release_date && value != embargo.visibility_during_embargo
end
# @return [true, false] true if there is a lease set up and the visibility will change
def deactivate_lease?(value)
lease && lease.lease_expiration_date && value != lease.visibility_during_lease
end
end
end
end