curation_concerns 0.12.0.pre1 → 0.12.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +24 -16
- data/Gemfile +0 -4
- data/README.md +14 -0
- data/RELEASING.md +2 -2
- data/Rakefile +2 -0
- data/app/actors/concerns/curation_concerns/manages_embargoes_actor.rb +28 -0
- data/app/actors/curation_concerns/abstract_actor.rb +28 -0
- data/app/actors/curation_concerns/add_to_collection_actor.rb +38 -0
- data/app/actors/curation_concerns/apply_order_actor.rb +24 -0
- data/app/actors/curation_concerns/assign_identifier_actor.rb +7 -0
- data/app/actors/curation_concerns/assign_representative_actor.rb +18 -0
- data/app/actors/curation_concerns/attach_files_actor.rb +39 -0
- data/app/actors/curation_concerns/base_actor.rb +71 -0
- data/app/actors/curation_concerns/embargo_actor.rb +19 -0
- data/app/actors/curation_concerns/file_actor.rb +79 -0
- data/app/actors/curation_concerns/file_set_actor.rb +146 -0
- data/app/actors/curation_concerns/interpret_visibility_actor.rb +123 -0
- data/app/actors/curation_concerns/lease_actor.rb +19 -0
- data/app/actors/curation_concerns/root_actor.rb +17 -0
- data/app/actors/curation_concerns/work_actor_behavior.rb +8 -0
- data/app/assets/javascripts/curation_concerns/batch_select.js +42 -0
- data/app/assets/javascripts/curation_concerns/collections.js +13 -0
- data/app/assets/javascripts/curation_concerns/curation_concerns.js +2 -0
- data/app/assets/stylesheets/curation_concerns/_curation_concerns.scss +0 -3
- data/app/assets/stylesheets/curation_concerns/_modules.scss +1 -1
- data/app/assets/stylesheets/curation_concerns/_positioning.scss +3 -6
- data/app/assets/stylesheets/curation_concerns/_theme.scss +0 -39
- data/app/assets/stylesheets/curation_concerns/_typography.scss +0 -69
- data/app/assets/stylesheets/curation_concerns/modules/classify_work.scss +0 -2
- data/app/assets/stylesheets/curation_concerns/modules/collections.scss +4 -0
- data/app/assets/stylesheets/curation_concerns/modules/forms.scss +0 -4
- data/app/assets/stylesheets/curation_concerns/modules/site_actions.scss +34 -29
- data/app/assets/stylesheets/curation_concerns/modules/site_search.scss +0 -46
- data/app/assets/stylesheets/curation_concerns.scss +4 -0
- data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +166 -21
- data/app/controllers/concerns/curation_concerns/embargoes_controller_behavior.rb +1 -1
- data/app/controllers/concerns/curation_concerns/leases_controller_behavior.rb +1 -1
- data/app/controllers/concerns/curation_concerns/selects_collections.rb +65 -0
- data/app/forms/curation_concerns/forms/collection_edit_form.rb +0 -29
- data/app/forms/curation_concerns/forms/work_form.rb +2 -1
- data/app/helpers/batch_select_helper.rb +23 -0
- data/app/helpers/collections_helper.rb +4 -0
- data/app/helpers/curation_concerns/collections_helper.rb +2 -2
- data/app/helpers/curation_concerns/collections_helper_behavior.rb +56 -0
- data/app/helpers/curation_concerns/render_constraints_helper.rb +14 -35
- data/app/helpers/curation_concerns/title_helper.rb +4 -0
- data/app/indexers/curation_concerns/collection_indexer.rb +16 -0
- data/app/indexers/curation_concerns/file_set_indexer.rb +46 -0
- data/app/indexers/curation_concerns/work_indexer.rb +15 -0
- data/app/jobs/audit_job.rb +49 -0
- data/app/jobs/characterize_job.rb +11 -0
- data/app/jobs/create_derivatives_job.rb +21 -0
- data/app/jobs/import_url_job.rb +48 -0
- data/app/jobs/ingest_file_job.rb +30 -0
- data/app/jobs/ingest_local_file_job.rb +20 -0
- data/app/jobs/resolrize_job.rb +7 -0
- data/app/models/checksum_audit_log.rb +20 -0
- data/app/models/collection.rb +6 -0
- data/app/models/concerns/curation_concerns/ability.rb +49 -0
- data/app/models/concerns/curation_concerns/basic_metadata.rb +64 -0
- data/app/models/concerns/curation_concerns/collection.rb +16 -0
- data/app/models/concerns/curation_concerns/collection_behavior.rb +62 -0
- data/app/models/concerns/curation_concerns/file_set/belongs_to_works.rb +47 -0
- data/app/models/concerns/curation_concerns/file_set/derivatives.rb +65 -0
- data/app/models/concerns/curation_concerns/file_set/full_text_indexing.rb +11 -0
- data/app/models/concerns/curation_concerns/file_set/indexing.rb +14 -0
- data/app/models/concerns/curation_concerns/file_set/querying.rb +17 -0
- data/app/models/concerns/curation_concerns/file_set_behavior.rb +36 -0
- data/app/models/concerns/curation_concerns/has_representative.rb +13 -0
- data/app/models/concerns/curation_concerns/human_readable_type.rb +17 -0
- data/app/models/concerns/curation_concerns/naming.rb +17 -0
- data/app/models/concerns/curation_concerns/permissions/readable.rb +18 -0
- data/app/models/concerns/curation_concerns/permissions/writable.rb +34 -0
- data/app/models/concerns/curation_concerns/permissions.rb +7 -0
- data/app/models/concerns/curation_concerns/required_metadata.rb +30 -0
- data/app/models/concerns/curation_concerns/serializers.rb +13 -0
- data/app/models/concerns/curation_concerns/solr_document_behavior.rb +147 -0
- data/app/models/concerns/curation_concerns/user.rb +18 -0
- data/app/models/concerns/curation_concerns/with_file_sets.rb +37 -0
- data/app/models/concerns/curation_concerns/work_behavior.rb +45 -0
- data/app/models/curation_concerns/classify_concern.rb +49 -0
- data/app/models/curation_concerns/quick_classification_query.rb +38 -0
- data/app/models/single_use_link.rb +34 -0
- data/app/models/version_committer.rb +2 -0
- data/app/search_builders/curation_concerns/collection_member_search_builder.rb +1 -1
- data/app/search_builders/curation_concerns/collection_search_builder.rb +33 -0
- data/app/search_builders/curation_concerns/member_search_builder.rb +17 -0
- data/app/services/curation_concerns/derivative_path.rb +49 -0
- data/app/services/curation_concerns/file_set_audit_service.rb +105 -0
- data/app/services/curation_concerns/indexes_thumbnails.rb +30 -0
- data/app/services/curation_concerns/local_file_service.rb +10 -0
- data/app/services/curation_concerns/lock_manager.rb +39 -0
- data/app/services/curation_concerns/lockable.rb +16 -0
- data/app/services/curation_concerns/noid.rb +23 -0
- data/app/services/curation_concerns/persist_derivatives.rb +33 -0
- data/app/services/curation_concerns/persist_directly_contained_output_file_service.rb +26 -0
- data/app/services/curation_concerns/repository_audit_service.rb +7 -0
- data/app/services/curation_concerns/thumbnail_path_service.rb +46 -0
- data/app/services/curation_concerns/time_service.rb +7 -0
- data/app/services/curation_concerns/versioning_service.rb +26 -0
- data/app/validators/has_one_title_validator.rb +8 -0
- data/app/views/batch_select/_add_button.html.erb +3 -0
- data/app/views/batch_select/_check_all.html.erb +4 -0
- data/app/views/batch_select/_tools.html.erb +10 -0
- data/app/views/catalog/_action_menu_partials/_collection.html.erb +3 -3
- data/app/views/catalog/_action_menu_partials/_default.html.erb +1 -1
- data/app/views/catalog/_document_list.html.erb +1 -1
- data/app/views/collections/_bookmark_control.html.erb +2 -0
- data/app/views/collections/_button_create_collection.html.erb +2 -0
- data/app/views/collections/_button_for_creating_empty_collection.html.erb +1 -1
- data/app/views/collections/_button_for_delete_collection.html.erb +4 -0
- data/app/views/collections/_button_for_remove_selected_from_collection.html.erb +8 -0
- data/app/views/collections/_button_for_update_collection.html.erb +4 -0
- data/app/views/collections/_button_remove_from_collection.html.erb +4 -0
- data/app/views/collections/_document_header.html.erb +9 -0
- data/app/views/collections/_edit_actions.html.erb +1 -1
- data/app/views/collections/_edit_descriptions.html.erb +1 -1
- data/app/views/collections/_form.html.erb +2 -2
- data/app/views/collections/_form_for_select_destination_collection.html.erb +21 -0
- data/app/views/collections/_form_to_add_member.html.erb +1 -1
- data/app/views/collections/_index_default.html.erb +2 -0
- data/app/views/collections/_index_header_default.html.erb +2 -0
- data/app/views/collections/_media_display.html.erb +1 -1
- data/app/views/collections/_paginate.html.erb +1 -1
- data/app/views/collections/_paginate_compact.html.erb +1 -0
- data/app/views/collections/_results_pagination.html.erb +9 -0
- data/app/views/collections/_search_collection_dashboard_form.html.erb +1 -1
- data/app/views/collections/_search_form.html.erb +1 -1
- data/app/views/collections/_search_results.html.erb +23 -0
- data/app/views/collections/_show_actions.html.erb +1 -1
- data/app/views/collections/_sort_and_per_page.html.erb +1 -1
- data/app/views/collections/_view_type_group.html.erb +1 -1
- data/app/views/collections/index.html.erb +9 -0
- data/app/views/collections/new.html.erb +3 -0
- data/app/views/curation_concerns/base/_form_permission.html.erb +10 -11
- data/app/views/curation_concerns/base/_form_permission_embargo.html.erb +1 -1
- data/app/views/curation_concerns/base/_form_permission_lease.html.erb +1 -1
- data/app/views/curation_concerns/base/_legally_binding_text.html.erb +7 -7
- data/app/views/curation_concerns/base/_related_files.html.erb +1 -1
- data/app/views/curation_concerns/base/_visibility.html.erb +2 -2
- data/app/views/curation_concerns/file_sets/_actions.html.erb +1 -1
- data/app/views/embargoes/_list_expired_active_embargoes.html.erb +1 -1
- data/app/views/error/single_use_error.html.erb +1 -1
- data/app/views/shared/_add_content.html.erb +17 -15
- data/app/views/shared/_brand_bar.html.erb +19 -10
- data/app/views/shared/_header.html.erb +2 -6
- data/app/views/shared/_my_actions.html.erb +28 -27
- data/app/views/shared/_site_actions.html.erb +5 -1
- data/app/views/shared/_site_search.html.erb +3 -2
- data/app/views/shared/_title_bar.html.erb +7 -16
- data/app/views/welcome/index.html.erb +2 -2
- data/config/locales/curation_concerns.en.yml +25 -1
- data/curation_concerns.gemspec +21 -5
- data/lib/curation_concerns/collections/accepts_batches.rb +53 -0
- data/lib/curation_concerns/collections/search_service.rb +57 -0
- data/lib/curation_concerns/collections.rb +10 -0
- data/lib/curation_concerns/configuration.rb +167 -0
- data/lib/curation_concerns/engine.rb +22 -1
- data/lib/curation_concerns/messages.rb +68 -0
- data/lib/curation_concerns/models.rb +42 -0
- data/lib/curation_concerns/name.rb +20 -0
- data/lib/curation_concerns/null_logger.rb +10 -0
- data/lib/curation_concerns/rails/routes.rb +1 -3
- data/lib/curation_concerns/version.rb +1 -1
- data/lib/curation_concerns.rb +2 -0
- data/lib/generators/curation_concerns/abstract_migration_generator.rb +31 -0
- data/lib/generators/curation_concerns/clamav_generator.rb +19 -0
- data/lib/generators/curation_concerns/collection_generator.rb +15 -0
- data/lib/generators/curation_concerns/install_generator.rb +1 -2
- data/lib/generators/curation_concerns/models_generator.rb +62 -0
- data/lib/generators/curation_concerns/templates/app/models/collection.rb +6 -0
- data/lib/generators/curation_concerns/templates/app/models/file_set.rb +4 -0
- data/lib/generators/curation_concerns/templates/config/clamav.rb +1 -0
- data/lib/generators/curation_concerns/templates/config/curation_concerns.rb +61 -0
- data/lib/generators/curation_concerns/templates/config/mime_types.rb +6 -0
- data/lib/generators/curation_concerns/templates/config/redis.yml +9 -0
- data/lib/generators/curation_concerns/templates/config/redis_config.rb +29 -0
- data/lib/generators/curation_concerns/templates/config/resque-pool.yml +1 -0
- data/lib/generators/curation_concerns/templates/config/resque_config.rb +6 -0
- data/lib/generators/curation_concerns/templates/curation_concerns.scss +3 -2
- data/lib/generators/curation_concerns/templates/migrations/create_checksum_audit_logs.rb +19 -0
- data/lib/generators/curation_concerns/templates/migrations/create_single_use_links.rb +12 -0
- data/lib/generators/curation_concerns/templates/migrations/create_version_committers.rb +15 -0
- data/lib/tasks/migrate.rake +11 -0
- data/lib/tasks/resque.rake +14 -0
- data/lib/tasks/solr_reindex.rake +8 -0
- data/spec/actors/curation_concerns/file_set_actor_spec.rb +31 -0
- data/spec/controllers/accepts_batches_controller_spec.rb +65 -0
- data/spec/controllers/collections_controller_spec.rb +272 -0
- data/spec/controllers/curation_concerns/collections_controller_spec.rb +1 -2
- data/spec/controllers/selects_collections_controller_spec.rb +109 -0
- data/spec/features/create_work_spec.rb +1 -1
- data/spec/features/work_generator_spec.rb +1 -1
- data/spec/forms/collection_edit_form_spec.rb +2 -9
- data/spec/forms/work_form_spec.rb +5 -0
- data/spec/helpers/collections_helper_spec.rb +129 -0
- data/spec/helpers/curation_concerns/collections_helper_spec.rb +2 -2
- data/spec/helpers/render_constraints_helper_spec.rb +23 -1
- data/spec/lib/curation_concerns/collections/search_service_spec.rb +33 -0
- data/spec/models/collection_spec.rb +165 -0
- data/spec/tasks/rake_spec.rb +1 -1
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
- data/spec/views/curation_concerns/base/_form_permission.html.erb_spec.rb +4 -1
- data/spec/views/curation_concerns/file_sets/show.html.erb_spec.rb +1 -0
- data/spec/views/shared/_add_content.html.erb_spec.rb +3 -3
- metadata +341 -24
- data/VERSION +0 -1
- data/app/assets/stylesheets/curation_concerns/_global-variables.scss +0 -5
- data/app/assets/stylesheets/curation_concerns/modules/multi_value_fields.scss +0 -52
- data/app/views/collections/_form_required_information.html.erb +0 -11
- data/tasks/release.rake +0 -93
@@ -0,0 +1,146 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
# Actions are decoupled from controller logic so that they may be called from a controller or a background job.
|
3
|
+
class FileSetActor
|
4
|
+
include CurationConcerns::Lockable
|
5
|
+
|
6
|
+
attr_reader :file_set, :user, :attributes
|
7
|
+
|
8
|
+
def initialize(file_set, user)
|
9
|
+
@file_set = file_set
|
10
|
+
@user = user
|
11
|
+
end
|
12
|
+
|
13
|
+
# Adds the appropriate metadata, visibility and relationships to file_set
|
14
|
+
#
|
15
|
+
# *Note*: In past versions of Sufia this method did not perform a save because it is mainly used in conjunction with
|
16
|
+
# create_content, which also performs a save. However, due to the relationship between Hydra::PCDM objects,
|
17
|
+
# we have to save both the parent work and the file_set in order to record the "metadata" relationship
|
18
|
+
# between them.
|
19
|
+
# @param [ActiveFedora::Base] work the parent work that will contain the file_set.
|
20
|
+
# @param [Hash] file_set specifying the visibility, lease and/or embargo of the file set. If you don't provide at least one of visibility, embargo_release_date or lease_expiration_date, visibility will be copied from the parent.
|
21
|
+
|
22
|
+
def create_metadata(work, file_set_params = {})
|
23
|
+
file_set.apply_depositor_metadata(user)
|
24
|
+
now = CurationConcerns::TimeService.time_in_utc
|
25
|
+
file_set.date_uploaded = now
|
26
|
+
file_set.date_modified = now
|
27
|
+
file_set.creator = [user.user_key]
|
28
|
+
|
29
|
+
CurationConcern::ActorStack.new(file_set, user, [InterpretVisibilityActor]).create(file_set_params) if assign_visibility?(file_set_params)
|
30
|
+
attach_file_to_work(work, file_set, file_set_params) if work
|
31
|
+
yield(file_set) if block_given?
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param [File, ActionDigest::HTTP::UploadedFile, Tempfile] file the file uploaded by the user.
|
35
|
+
# @param [String] relation ('original_file')
|
36
|
+
def create_content(file, relation = 'original_file')
|
37
|
+
# If the file set doesn't have a title or label assigned, set a default.
|
38
|
+
file_set.label ||= file.respond_to?(:original_filename) ? file.original_filename : ::File.basename(file)
|
39
|
+
file_set.title = [file_set.label] if file_set.title.blank?
|
40
|
+
|
41
|
+
# Need to save the file_set in order to get an id
|
42
|
+
return false unless file_set.save
|
43
|
+
|
44
|
+
file_actor_class.new(file_set, relation, user).ingest_file(file)
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param [String] revision_id the revision to revert to
|
49
|
+
# @param [String] relation ('original_file')
|
50
|
+
def revert_content(revision_id, relation = 'original_file')
|
51
|
+
file_actor = file_actor_class.new(file_set, relation, user)
|
52
|
+
if file_actor.revert_to(revision_id)
|
53
|
+
CurationConcerns.config.callback.run(:after_revert_content, file_set, user, revision_id)
|
54
|
+
true
|
55
|
+
else
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param [File, ActionDigest::HTTP::UploadedFile, Tempfile] file the file uploaded by the user.
|
61
|
+
# @param [String] relation ('original_file')
|
62
|
+
def update_content(file, relation = 'original_file')
|
63
|
+
file_actor_class.new(file_set, relation, user).ingest_file(file)
|
64
|
+
CurationConcerns.config.callback.run(:after_update_content, file_set, user)
|
65
|
+
true
|
66
|
+
end
|
67
|
+
|
68
|
+
def update_metadata(attributes)
|
69
|
+
stack = CurationConcern::ActorStack.new(file_set,
|
70
|
+
user,
|
71
|
+
[InterpretVisibilityActor, BaseActor])
|
72
|
+
if result = stack.update(attributes)
|
73
|
+
CurationConcerns.config.callback.run(:after_update_metadata, file_set, user)
|
74
|
+
end
|
75
|
+
result
|
76
|
+
end
|
77
|
+
|
78
|
+
def destroy
|
79
|
+
file_set.destroy
|
80
|
+
CurationConcerns.config.callback.run(:after_destroy, file_set.id, user)
|
81
|
+
end
|
82
|
+
|
83
|
+
def file_actor_class
|
84
|
+
CurationConcerns::FileActor
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
# Takes an optional block and executes the block if the save was successful.
|
90
|
+
# returns false if the save was unsuccessful
|
91
|
+
def save
|
92
|
+
save_tries = 0
|
93
|
+
begin
|
94
|
+
return false unless file_set.save
|
95
|
+
rescue RSolr::Error::Http => error
|
96
|
+
ActiveFedora::Base.logger.warn "CurationConcerns::FileSetActor#save Caught RSOLR error #{error.inspect}"
|
97
|
+
save_tries += 1
|
98
|
+
# fail for good if the tries is greater than 3
|
99
|
+
raise error if save_tries >= 3
|
100
|
+
sleep 0.01
|
101
|
+
retry
|
102
|
+
end
|
103
|
+
yield if block_given?
|
104
|
+
true
|
105
|
+
end
|
106
|
+
|
107
|
+
# Adds a FileSet to the work using ore:Aggregations.
|
108
|
+
# Locks to ensure that only one process is operating on
|
109
|
+
# the list at a time.
|
110
|
+
def attach_file_to_work(work, file_set, file_set_params)
|
111
|
+
acquire_lock_for(work.id) do
|
112
|
+
# Ensure we have an up-to-date copy of the members association, so
|
113
|
+
# that we append to the end of the list.
|
114
|
+
work.reload unless work.new_record?
|
115
|
+
unless assign_visibility?(file_set_params)
|
116
|
+
copy_visibility(work, file_set)
|
117
|
+
end
|
118
|
+
work.ordered_members << file_set
|
119
|
+
set_representative(work, file_set)
|
120
|
+
set_thumbnail(work, file_set)
|
121
|
+
|
122
|
+
# Save the work so the association between the work and the file_set is persisted (head_id)
|
123
|
+
work.save
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def assign_visibility?(file_set_params = {})
|
128
|
+
!((file_set_params || {}).keys & %w(visibility embargo_release_date lease_expiration_date)).empty?
|
129
|
+
end
|
130
|
+
|
131
|
+
# copy visibility from source_concern to destination_concern
|
132
|
+
def copy_visibility(source_concern, destination_concern)
|
133
|
+
destination_concern.visibility = source_concern.visibility
|
134
|
+
end
|
135
|
+
|
136
|
+
def set_representative(work, file_set)
|
137
|
+
return unless work.representative_id.blank?
|
138
|
+
work.representative = file_set
|
139
|
+
end
|
140
|
+
|
141
|
+
def set_thumbnail(work, file_set)
|
142
|
+
return unless work.thumbnail_id.blank?
|
143
|
+
work.thumbnail = file_set
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class InterpretVisibilityActor < AbstractActor
|
3
|
+
class Intention
|
4
|
+
def initialize(attributes)
|
5
|
+
@attributes = attributes
|
6
|
+
end
|
7
|
+
|
8
|
+
# returns a copy of attributes with the necessary params removed
|
9
|
+
# If the lease or embargo is valid, or if they selected something besides lease
|
10
|
+
# or embargo, remove all the params.
|
11
|
+
def sanitize_params
|
12
|
+
if valid_lease?
|
13
|
+
@attributes.except(:visibility,
|
14
|
+
:embargo_release_date,
|
15
|
+
:visibility_during_embargo,
|
16
|
+
:visibility_after_embargo)
|
17
|
+
elsif valid_embargo?
|
18
|
+
@attributes.except(:visibility,
|
19
|
+
:lease_expiration_date,
|
20
|
+
:visibility_during_lease,
|
21
|
+
:visibility_after_lease)
|
22
|
+
elsif !wants_lease? && !wants_embargo?
|
23
|
+
@attributes.except(:lease_expiration_date,
|
24
|
+
:visibility_during_lease,
|
25
|
+
:visibility_after_lease,
|
26
|
+
:embargo_release_date,
|
27
|
+
:visibility_during_embargo,
|
28
|
+
:visibility_after_embargo)
|
29
|
+
else
|
30
|
+
@attributes
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def wants_lease?
|
35
|
+
visibility == Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_LEASE
|
36
|
+
end
|
37
|
+
|
38
|
+
def wants_embargo?
|
39
|
+
visibility == Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_EMBARGO
|
40
|
+
end
|
41
|
+
|
42
|
+
def valid_lease?
|
43
|
+
wants_lease? && @attributes[:lease_expiration_date].present?
|
44
|
+
end
|
45
|
+
|
46
|
+
def valid_embargo?
|
47
|
+
wants_embargo? && @attributes[:embargo_release_date].present?
|
48
|
+
end
|
49
|
+
|
50
|
+
def lease_params
|
51
|
+
[:lease_expiration_date,
|
52
|
+
:visibility_during_lease,
|
53
|
+
:visibility_after_lease].map { |key| @attributes[key] }
|
54
|
+
end
|
55
|
+
|
56
|
+
def embargo_params
|
57
|
+
[:embargo_release_date,
|
58
|
+
:visibility_during_embargo,
|
59
|
+
:visibility_after_embargo].map { |key| @attributes[key] }
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def visibility
|
65
|
+
@attributes[:visibility]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def create(attributes)
|
70
|
+
@intention = Intention.new(attributes)
|
71
|
+
attributes = @intention.sanitize_params
|
72
|
+
validate && apply_visibility(attributes) && next_actor.create(attributes)
|
73
|
+
end
|
74
|
+
|
75
|
+
def update(attributes)
|
76
|
+
@intention = Intention.new(attributes)
|
77
|
+
attributes = @intention.sanitize_params
|
78
|
+
validate && apply_visibility(attributes) && next_actor.update(attributes)
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def validate
|
84
|
+
validate_lease && validate_embargo
|
85
|
+
end
|
86
|
+
|
87
|
+
def apply_visibility(attributes)
|
88
|
+
result = apply_lease && apply_embargo
|
89
|
+
if attributes[:visibility]
|
90
|
+
curation_concern.visibility = attributes[:visibility]
|
91
|
+
end
|
92
|
+
result
|
93
|
+
end
|
94
|
+
|
95
|
+
def validate_lease
|
96
|
+
return true unless @intention.wants_lease? && !@intention.valid_lease?
|
97
|
+
curation_concern.errors.add(:visibility, 'When setting visibility to "lease" you must also specify lease expiration date.')
|
98
|
+
false
|
99
|
+
end
|
100
|
+
|
101
|
+
def validate_embargo
|
102
|
+
return true unless @intention.wants_embargo? && !@intention.valid_embargo?
|
103
|
+
curation_concern.errors.add(:visibility, 'When setting visibility to "embargo" you must also specify embargo release date.')
|
104
|
+
false
|
105
|
+
end
|
106
|
+
|
107
|
+
# If they want a lease, we can assume it's valid
|
108
|
+
def apply_lease
|
109
|
+
return true unless @intention.wants_lease?
|
110
|
+
curation_concern.apply_lease(*@intention.lease_params)
|
111
|
+
return unless curation_concern.lease
|
112
|
+
curation_concern.lease.save # see https://github.com/projecthydra/hydra-head/issues/226
|
113
|
+
end
|
114
|
+
|
115
|
+
# If they want an embargo, we can assume it's valid
|
116
|
+
def apply_embargo
|
117
|
+
return true unless @intention.wants_embargo?
|
118
|
+
curation_concern.apply_embargo(*@intention.embargo_params)
|
119
|
+
return unless curation_concern.embargo
|
120
|
+
curation_concern.embargo.save # see https://github.com/projecthydra/hydra-head/issues/226
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class LeaseActor
|
3
|
+
attr_reader :work
|
4
|
+
|
5
|
+
# @param [Hydra::Works::Work] work
|
6
|
+
def initialize(work)
|
7
|
+
@work = work
|
8
|
+
end
|
9
|
+
|
10
|
+
# Update the visibility of the work to match the correct state of the lease, then clear the lease date, etc.
|
11
|
+
# Saves the lease and the work
|
12
|
+
def destroy
|
13
|
+
work.lease_visibility! # If the lease has lapsed, update the current visibility.
|
14
|
+
work.deactivate_lease!
|
15
|
+
work.lease.save!
|
16
|
+
work.save!
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class RootActor
|
3
|
+
attr_reader :curation_concern, :user, :cloud_resources
|
4
|
+
def initialize(curation_concern, user, _more_actors)
|
5
|
+
@curation_concern = curation_concern
|
6
|
+
@user = user
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(_)
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def update(_)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module CurationConcerns::WorkActorBehavior
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
extend Deprecation
|
4
|
+
|
5
|
+
included do
|
6
|
+
Deprecation.warn(CurationConcerns::WorkActorBehavior, "CurationConcerns::WorkActorBehavior is deprecated and will be removed in CurationConcerns 1.0")
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
Blacklight.onLoad(function () {
|
2
|
+
|
3
|
+
// add the batch ids to any submit of a batch update
|
4
|
+
var batch_ids = null;
|
5
|
+
$('input.updates-batches').on('click', function() {
|
6
|
+
var form = $(this).closest("form");
|
7
|
+
var hash, id;
|
8
|
+
|
9
|
+
// pull the ids from the url
|
10
|
+
if (!batch_ids) {
|
11
|
+
batch_ids = [];
|
12
|
+
// pull the ids from the url
|
13
|
+
var q = document.URL.split('?')[1];
|
14
|
+
if(q != undefined){
|
15
|
+
q = q.split('&');
|
16
|
+
for(var i = 0; i < q.length; i++){
|
17
|
+
hash = q[i].split('=');
|
18
|
+
if (hash[0] == "batch_document_ids%5B%5D")
|
19
|
+
batch_ids.push(unescape(hash[1]));
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
// push the ids in the form
|
25
|
+
for(var j = 0; j < batch_ids.length; j++){
|
26
|
+
if (form.children("input[value='"+batch_ids[j]+"']").length == 0)
|
27
|
+
form.append('<input type="hidden" multiple="multiple" name="batch_document_ids[]" value="'+batch_ids[j]+'" />');
|
28
|
+
}
|
29
|
+
|
30
|
+
});
|
31
|
+
$('input.submits-batches').on('click', function() {
|
32
|
+
var form = $(this).closest("form");
|
33
|
+
$.map( $(".batch_document_selector:checked"), function(document, i) {
|
34
|
+
var id = document.id.substring("batch_document_".length);
|
35
|
+
if (form.children("input[value='"+id+"']").length == 0)
|
36
|
+
form.append('<input type="hidden" multiple="multiple" name="batch_document_ids[]" value="'+id+'" />');
|
37
|
+
});
|
38
|
+
|
39
|
+
|
40
|
+
});
|
41
|
+
|
42
|
+
});
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Blacklight.onLoad(function () {
|
2
|
+
|
3
|
+
// change the action based which collection is selected
|
4
|
+
$('input.updates-collection').on('click', function() {
|
5
|
+
|
6
|
+
var form = $(this).closest("form");
|
7
|
+
var collection_id = $(".collection-selector:checked")[0].value;
|
8
|
+
form[0].action = form[0].action.replace("collection_replace_id",collection_id);
|
9
|
+
form.append('<input type="hidden" value="add" name="collection[members]"></input>');
|
10
|
+
|
11
|
+
});
|
12
|
+
|
13
|
+
});
|
@@ -7,6 +7,8 @@
|
|
7
7
|
//= require curation_concerns/file_manager/sorting
|
8
8
|
//= require curation_concerns/file_manager/save_manager
|
9
9
|
//= require curation_concerns/file_manager/member
|
10
|
+
//= require curation_concerns/batch_select
|
11
|
+
//= require curation_concerns/collections
|
10
12
|
|
11
13
|
|
12
14
|
// Initialize plugins and Bootstrap dropdowns on jQuery's ready event as well as
|
@@ -1,6 +1,5 @@
|
|
1
1
|
@import 'modules/classify_work';
|
2
2
|
@import 'modules/forms';
|
3
|
-
@import 'modules/multi_value_fields';
|
4
3
|
@import 'modules/search_results';
|
5
4
|
@import 'modules/site_actions';
|
6
5
|
@import 'modules/site_search';
|
@@ -8,3 +7,4 @@
|
|
8
7
|
@import 'modules/embargoes';
|
9
8
|
@import 'modules/icons';
|
10
9
|
@import 'modules/file_manager';
|
10
|
+
@import 'modules/collections';
|
@@ -1,42 +1,3 @@
|
|
1
|
-
#brand-bar-wrapper {
|
2
|
-
background-color: $blue-dark;
|
3
|
-
background-image: linear-gradient(#0d407b,#07366c 85%,#001834);
|
4
|
-
border-bottom:1px solid #001834;
|
5
|
-
|
6
|
-
h2 a, h3 a {
|
7
|
-
color:#FFF;
|
8
|
-
}
|
9
|
-
|
10
|
-
.division {
|
11
|
-
float:right;
|
12
|
-
}
|
13
|
-
}
|
14
|
-
|
15
|
-
#title-bar-wrapper {
|
16
|
-
background-color:$yellow;
|
17
|
-
background-image: linear-gradient(#f5e59e,#dcb439 98%,#9c7012);
|
18
|
-
border-top:1px solid #FFF;
|
19
|
-
margin-bottom:.3em;
|
20
|
-
}
|
21
|
-
|
22
|
-
#site-title {
|
23
|
-
h1 {
|
24
|
-
text-shadow: #fff 0 0 1px;
|
25
|
-
}
|
26
|
-
|
27
|
-
a,
|
28
|
-
a:hover,
|
29
|
-
a:visited {
|
30
|
-
color:$blue;
|
31
|
-
}
|
32
|
-
}
|
33
|
-
|
34
|
-
#main {
|
35
|
-
h1,h2,h3,h4,h5,h6 {
|
36
|
-
color:$blue;
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
1
|
#footer {
|
41
2
|
color: $gray-light;
|
42
3
|
|
@@ -1,51 +1,8 @@
|
|
1
|
-
@import 'global-variables';
|
2
|
-
|
3
|
-
#banner {
|
4
|
-
h1,h2,h3 {
|
5
|
-
font-weight:normal;
|
6
|
-
}
|
7
|
-
|
8
|
-
a {
|
9
|
-
text-decoration:none;
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
1
|
#brand-bar-wrapper {
|
14
|
-
font-family: $font-family-serif;
|
15
|
-
letter-spacing:.2em;
|
16
|
-
padding:.15em 0;
|
17
|
-
text-transform:uppercase;
|
18
|
-
|
19
|
-
h2, h3 {
|
20
|
-
font-size:.95em;
|
21
|
-
margin:0;
|
22
|
-
}
|
23
|
-
|
24
|
-
.division {
|
25
|
-
text-align:right;
|
26
|
-
}
|
27
|
-
|
28
|
-
i {
|
29
|
-
letter-spacing:0;
|
30
|
-
padding:0 .2em;
|
31
|
-
text-transform:none;
|
32
|
-
}
|
33
|
-
}
|
34
|
-
|
35
|
-
#site-title h1 {
|
36
|
-
font-family: $font-family-serif;
|
37
|
-
font-size:2.4em;
|
38
|
-
line-height:1.2em;
|
39
|
-
text-align:center;
|
40
2
|
}
|
41
3
|
|
42
4
|
#main,
|
43
5
|
.modal-header {
|
44
|
-
h1,h2,h3,h4,h5,h6 {
|
45
|
-
font-family:$headings-font-family;
|
46
|
-
font-weight:normal;
|
47
|
-
text-rendering: optimizeLegibility;
|
48
|
-
}
|
49
6
|
h1 {
|
50
7
|
.human_readable_type {
|
51
8
|
font-size:.66em;
|
@@ -63,24 +20,12 @@ legend {
|
|
63
20
|
}
|
64
21
|
}
|
65
22
|
|
66
|
-
.table-heading {
|
67
|
-
text-align:left;
|
68
|
-
|
69
|
-
h1,h2,h3,h4,h5,h6 {
|
70
|
-
padding-top:1em;
|
71
|
-
}
|
72
|
-
}
|
73
|
-
|
74
23
|
.nested-field-heading {
|
75
24
|
font-family: $font-family-sans-serif;
|
76
25
|
font-size: 14px;
|
77
26
|
font-weight:normal;
|
78
27
|
}
|
79
28
|
|
80
|
-
.redacted {
|
81
|
-
font-family:'BLOKKNeue-Regular';
|
82
|
-
}
|
83
|
-
|
84
29
|
#footer {
|
85
30
|
text-align:center;
|
86
31
|
|
@@ -89,16 +34,6 @@ legend {
|
|
89
34
|
}
|
90
35
|
}
|
91
36
|
|
92
|
-
.centered {
|
93
|
-
text-align:center;
|
94
|
-
}
|
95
|
-
|
96
|
-
.doi {
|
97
|
-
font-size:200%;
|
98
|
-
margin:1em 0;
|
99
|
-
text-align:center;
|
100
|
-
}
|
101
|
-
|
102
37
|
.inline-item-actions {
|
103
38
|
padding:0 .5em;
|
104
39
|
|
@@ -120,7 +55,3 @@ legend {
|
|
120
55
|
}
|
121
56
|
}
|
122
57
|
}
|
123
|
-
|
124
|
-
.center {
|
125
|
-
text-align:center;
|
126
|
-
}
|
@@ -1,46 +1,33 @@
|
|
1
|
-
#site-actions {
|
2
|
-
.dropdown-menu {
|
3
|
-
text-align:left;
|
4
|
-
}
|
5
|
-
|
6
|
-
// Overriding default boostrap behavior
|
7
|
-
.btn-group + .btn-group {
|
8
|
-
margin-left:0;
|
9
|
-
}
|
10
|
-
}
|
11
|
-
|
12
1
|
.dropdown-menu {
|
13
|
-
.item-with-options
|
14
|
-
|
15
|
-
display:block;
|
2
|
+
.item-with-options {
|
3
|
+
display: block;
|
16
4
|
padding:3px 20px;
|
17
|
-
line-height:
|
18
|
-
color
|
5
|
+
line-height: $line-height-base;
|
6
|
+
color: $dropdown-link-color;
|
19
7
|
}
|
20
8
|
|
21
9
|
.item-options{
|
22
10
|
margin:0;
|
23
11
|
padding:0;
|
24
12
|
list-style-type:none;
|
25
|
-
}
|
26
13
|
|
27
|
-
|
28
|
-
|
14
|
+
// Links within the dropdown menu
|
15
|
+
> li > a {
|
16
|
+
display: block;
|
17
|
+
padding: 3px 20px 3px 30px;
|
18
|
+
clear: both;
|
19
|
+
font-weight: normal;
|
20
|
+
line-height: $line-height-base;
|
21
|
+
color: $dropdown-link-color;
|
22
|
+
white-space: nowrap; // prevent links from randomly breaking onto new lines
|
23
|
+
}
|
29
24
|
}
|
30
25
|
|
31
|
-
/* TODO: convert this from compiled bootstrap styles to SASS mixins if available. */
|
32
26
|
.item-option:hover,
|
33
27
|
.item-option:focus {
|
34
28
|
text-decoration: none;
|
35
|
-
color:
|
36
|
-
background-color:
|
37
|
-
background-image: -moz-linear-gradient(top, #005bc1, #004fa8);
|
38
|
-
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#005bc1), to(#004fa8));
|
39
|
-
background-image: -webkit-linear-gradient(top, #005bc1, #004fa8);
|
40
|
-
background-image: -o-linear-gradient(top, #005bc1, #004fa8);
|
41
|
-
background-image: linear-gradient(to bottom, #005bc1, #004fa8);
|
42
|
-
background-repeat: repeat-x;
|
43
|
-
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF005BC1', endColorstr='#FF004FA8', GradientType=0);
|
29
|
+
color: $dropdown-link-hover-color;
|
30
|
+
background-color: $dropdown-link-hover-bg;
|
44
31
|
}
|
45
32
|
|
46
33
|
.menu-heading {
|
@@ -51,3 +38,21 @@
|
|
51
38
|
font-style:italic;
|
52
39
|
}
|
53
40
|
}
|
41
|
+
|
42
|
+
@media (max-width: $grid-float-breakpoint-max) {
|
43
|
+
.navbar-inverse {
|
44
|
+
.item-with-options {
|
45
|
+
color: $navbar-inverse-link-color;
|
46
|
+
}
|
47
|
+
.item-options {
|
48
|
+
> li > a {
|
49
|
+
color: $navbar-inverse-link-color;
|
50
|
+
&:hover,
|
51
|
+
&:focus {
|
52
|
+
color: $navbar-inverse-link-hover-color;
|
53
|
+
background-color: $navbar-inverse-link-hover-bg;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|