diff --git a/BrainPortal/app/models/background_activity.rb b/BrainPortal/app/models/background_activity.rb index 40a577011..babea1799 100644 --- a/BrainPortal/app/models/background_activity.rb +++ b/BrainPortal/app/models/background_activity.rb @@ -180,6 +180,47 @@ def pretty_description "" end + + ########################################################### + # Auxiliary meta info regarding the items being processed # + ########################################################### + + # Returns the primary class of items the task targets + def targets_model + nil # stands for undefined + end + + # Returns the primary class of items the task targets + def produces_model + nil # stands for undefined + end + + # helper method to find item + def find_target(item) + # if class is not ActiveRecord, still can try implement find method + targets_model&.find(item_to_id item) rescue item + # todo find accessible to user + end + + # helper method to transform message to id if needed + def find_produced(msg) + produces_model&.find(message_to_id msg) rescue msg + end + + # extract id from item list element. + # In most cases it is identity, yet sometimes items are string with additional value + # besides id, as with file registration + # + def item_to_id(item) + item + end + + # extracts id from message + def message_to_id(m) + m # just a message no ids + end + + protected # Abstract method that must be implemented in a subclass. @@ -958,4 +999,3 @@ def self.preload_subclasses end end - diff --git a/BrainPortal/app/models/background_activity/archive_task_workdir.rb b/BrainPortal/app/models/background_activity/archive_task_workdir.rb index 3d94203b1..496e65874 100644 --- a/BrainPortal/app/models/background_activity/archive_task_workdir.rb +++ b/BrainPortal/app/models/background_activity/archive_task_workdir.rb @@ -43,5 +43,14 @@ def prepare_dynamic_items populate_items_from_task_custom_filter end -end + # Returns the primary class of items the task targets + def targets_model + CbrainTask + end + # Returns the primary class of items the task generates + def produces_model + nil # stands for nothing being generated + end + +end diff --git a/BrainPortal/app/models/background_activity/check_missing_workdir.rb b/BrainPortal/app/models/background_activity/check_missing_workdir.rb index 53ae6682d..9ef80c5bb 100644 --- a/BrainPortal/app/models/background_activity/check_missing_workdir.rb +++ b/BrainPortal/app/models/background_activity/check_missing_workdir.rb @@ -47,6 +47,11 @@ def self.setup!(remote_resource_id = CBRAIN::SelfRemoteResourceId) .save! end + def targets_model + CbrainTask + end + + def process(task_id) task = CbrainTask.where(:bourreau_id => self.remote_resource_id).find(task_id) full = task.full_cluster_workdir diff --git a/BrainPortal/app/models/background_activity/clean_cache.rb b/BrainPortal/app/models/background_activity/clean_cache.rb index a263d27db..177fd5204 100644 --- a/BrainPortal/app/models/background_activity/clean_cache.rb +++ b/BrainPortal/app/models/background_activity/clean_cache.rb @@ -48,6 +48,11 @@ def pretty_description desc end + # Returns the primary class of items the task targets + def targets_model + Userfile + end + def process(item) userfile = Userfile.find(item) return [ false, "File is under transfer" ] if @@ -85,4 +90,3 @@ def prepare_dynamic_items end end - diff --git a/BrainPortal/app/models/background_activity/compress_file.rb b/BrainPortal/app/models/background_activity/compress_file.rb index f70b47361..43340765c 100644 --- a/BrainPortal/app/models/background_activity/compress_file.rb +++ b/BrainPortal/app/models/background_activity/compress_file.rb @@ -27,6 +27,13 @@ class BackgroundActivity::CompressFile < BackgroundActivity validates_dynamic_bac_presence_of_option :userfile_custom_filter_id + # Returns the primary class of items the task targets + def targets_model + Userfile + end + + + # Helper for scheduling a copy of files immediately. def self.setup!(user_id, userfile_ids, remote_resource_id=nil) ba = self.local_new(user_id, userfile_ids, remote_resource_id) @@ -75,4 +82,3 @@ def prepare_dynamic_items end end - diff --git a/BrainPortal/app/models/background_activity/copy_file.rb b/BrainPortal/app/models/background_activity/copy_file.rb index 8cc5d7787..d20e48eef 100644 --- a/BrainPortal/app/models/background_activity/copy_file.rb +++ b/BrainPortal/app/models/background_activity/copy_file.rb @@ -35,6 +35,17 @@ def pretty_name self.class.to_s.demodulize.underscore.humanize + " to #{dp_name}" end + # Returns the primary class of items the task targets + def targets_model + Userfile # stands for undefined + end + + # Returns the primary class of items the task targets + def produces_model + Userfile # stands for undefined + end + + # Helper for scheduling a copy of files immediately. def self.setup!(user_id, userfile_ids, remote_resource_id, dest_data_provider_id, options={}) ba = self.local_new(user_id, userfile_ids, remote_resource_id) @@ -82,4 +93,3 @@ def prepare_dynamic_items end end - diff --git a/BrainPortal/app/models/background_activity/copy_file_and_unregister.rb b/BrainPortal/app/models/background_activity/copy_file_and_unregister.rb index 0e5def32e..d0b865eef 100644 --- a/BrainPortal/app/models/background_activity/copy_file_and_unregister.rb +++ b/BrainPortal/app/models/background_activity/copy_file_and_unregister.rb @@ -25,6 +25,16 @@ class BackgroundActivity::CopyFileAndUnregister < BackgroundActivity::CopyFile Revision_info=CbrainFileRevision[__FILE__] #:nodoc: + # Returns the primary class of items the task targets + def targets_model + Userfile + end + + # Returns the primary class of items the task targets + def output_model + nil # stands for undefined + end + def process(item) ok, userfile_id = super # CopyFile can return the ID or a string message return [ ok, userfile_id ] if userfile_id.is_a?(String) # a message @@ -34,4 +44,3 @@ def process(item) end end - diff --git a/BrainPortal/app/models/background_activity/destroy_file.rb b/BrainPortal/app/models/background_activity/destroy_file.rb index b2722545a..d4c499909 100644 --- a/BrainPortal/app/models/background_activity/destroy_file.rb +++ b/BrainPortal/app/models/background_activity/destroy_file.rb @@ -34,6 +34,18 @@ def self.setup!(user_id, userfile_ids, remote_resource_id=nil) ba end + # Returns the primary class of items the task targets + def targets_model + Userfile + end + + # Returns the primary class of items the task targets + def produces_model + nil # stands for undefined + end + + + def process(item) userfile = Userfile.find(item) ok = userfile.destroy @@ -46,4 +58,3 @@ def prepare_dynamic_items end end - diff --git a/BrainPortal/app/models/background_activity/destroy_task.rb b/BrainPortal/app/models/background_activity/destroy_task.rb index 5a434c7bc..017194ccf 100644 --- a/BrainPortal/app/models/background_activity/destroy_task.rb +++ b/BrainPortal/app/models/background_activity/destroy_task.rb @@ -27,6 +27,11 @@ class BackgroundActivity::DestroyTask < BackgroundActivity::TerminateTask Revision_info=CbrainFileRevision[__FILE__] #:nodoc: + def targets_model + CbrainTask + end + + def process(item) super(item) # invokes the terminate code; will skip tasks that don't need to be terminated cbrain_task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) diff --git a/BrainPortal/app/models/background_activity/destroy_task_without_workdir.rb b/BrainPortal/app/models/background_activity/destroy_task_without_workdir.rb index 6c1b929a3..ad1f46c8b 100644 --- a/BrainPortal/app/models/background_activity/destroy_task_without_workdir.rb +++ b/BrainPortal/app/models/background_activity/destroy_task_without_workdir.rb @@ -30,6 +30,11 @@ class BackgroundActivity::DestroyTaskWithoutWorkdir < BackgroundActivity Revision_info=CbrainFileRevision[__FILE__] #:nodoc: + def targets_model + CbrainTask + end + + def process(item) cbrain_task = CbrainTask.find(item) diff --git a/BrainPortal/app/models/background_activity/duplicate_task.rb b/BrainPortal/app/models/background_activity/duplicate_task.rb index c7f8a179c..1b9037e57 100644 --- a/BrainPortal/app/models/background_activity/duplicate_task.rb +++ b/BrainPortal/app/models/background_activity/duplicate_task.rb @@ -28,6 +28,13 @@ class BackgroundActivity::DuplicateTask < BackgroundActivity Revision_info=CbrainFileRevision[__FILE__] #:nodoc: + def targets_model + CbrainTask + end + + def produces_model + CbrainTask + end def process(item) task = CbrainTask.real_tasks.find(item) new_bid = options[:dup_bourreau_id].presence || task.bourreau_id diff --git a/BrainPortal/app/models/background_activity/erase_background_activities.rb b/BrainPortal/app/models/background_activity/erase_background_activities.rb index 1faf2f3fa..074b46d48 100644 --- a/BrainPortal/app/models/background_activity/erase_background_activities.rb +++ b/BrainPortal/app/models/background_activity/erase_background_activities.rb @@ -36,6 +36,10 @@ def process(item) return [ true, nil ] end + def targets_model + BackgroundActivity # stands for undefined + end + def prepare_dynamic_items days = self.options[:days_older] || 7 bacs = BackgroundActivity diff --git a/BrainPortal/app/models/background_activity/file_on_provider_is_newer.rb b/BrainPortal/app/models/background_activity/file_on_provider_is_newer.rb index aef470cb0..d2cbd4fc1 100644 --- a/BrainPortal/app/models/background_activity/file_on_provider_is_newer.rb +++ b/BrainPortal/app/models/background_activity/file_on_provider_is_newer.rb @@ -36,6 +36,10 @@ def self.setup!(user_id, userfile_ids, remote_resource_id=nil) ba end + def targets_model + Userfile # stands for undefined + end + def process(item) Userfile.find(item).provider_is_newer [ true, nil ] diff --git a/BrainPortal/app/models/background_activity/hold_task.rb b/BrainPortal/app/models/background_activity/hold_task.rb index 02b1533a6..b62da2736 100644 --- a/BrainPortal/app/models/background_activity/hold_task.rb +++ b/BrainPortal/app/models/background_activity/hold_task.rb @@ -37,6 +37,11 @@ class BackgroundActivity::HoldTask < BackgroundActivity before_save :must_be_on_bourreau! + def targets_model + CbrainTask + end + + def process(item) task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) ok = task.hold diff --git a/BrainPortal/app/models/background_activity/move_file.rb b/BrainPortal/app/models/background_activity/move_file.rb index aa3517d81..25623ae9c 100644 --- a/BrainPortal/app/models/background_activity/move_file.rb +++ b/BrainPortal/app/models/background_activity/move_file.rb @@ -45,6 +45,10 @@ def process(item) [ ok, message ] end + def targets_model + Userfile # stands for undefined + end + def prepare_dynamic_items populate_items_from_userfile_custom_filter end diff --git a/BrainPortal/app/models/background_activity/recover_task.rb b/BrainPortal/app/models/background_activity/recover_task.rb index 44e8339df..a31230703 100644 --- a/BrainPortal/app/models/background_activity/recover_task.rb +++ b/BrainPortal/app/models/background_activity/recover_task.rb @@ -29,6 +29,10 @@ class BackgroundActivity::RecoverTask < BackgroundActivity before_save :must_be_on_bourreau! + def targets_model + CbrainTask + end + def process(item) task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) old_status = task.status diff --git a/BrainPortal/app/models/background_activity/register_and_copy_file.rb b/BrainPortal/app/models/background_activity/register_and_copy_file.rb index 719fa5257..ef5a45434 100644 --- a/BrainPortal/app/models/background_activity/register_and_copy_file.rb +++ b/BrainPortal/app/models/background_activity/register_and_copy_file.rb @@ -44,6 +44,12 @@ def self.setup!(user_id, type_dash_names, remote_resource_id, src_data_provider_ ba end + + # Returns the primary class of items the task targets + def produces_model + Userfile # stands for undefined + end + def process(item) # item is like "TextFile-abcd.xyz" ok, userfile_id = super # userfile_id is an error message if ok is false return [ ok, userfile_id ] if ! ok # registration failed diff --git a/BrainPortal/app/models/background_activity/register_and_move_file.rb b/BrainPortal/app/models/background_activity/register_and_move_file.rb index 97f687509..c3ba123cd 100644 --- a/BrainPortal/app/models/background_activity/register_and_move_file.rb +++ b/BrainPortal/app/models/background_activity/register_and_move_file.rb @@ -30,6 +30,11 @@ def pretty_name super + " and move to #{dest_name}" end + # Returns the primary class of items the task targets + def produces_model + Userfile # stands for undefined + end + # Helper for scheduling a registration and move of the files immediately. def self.setup!(user_id, type_dash_names, remote_resource_id, src_data_provider_id, browse_path, group_id, as_user_id, dest_data_provider_id) ba = self.local_new(user_id, type_dash_names, remote_resource_id) diff --git a/BrainPortal/app/models/background_activity/register_file.rb b/BrainPortal/app/models/background_activity/register_file.rb index 21f36a098..5a3180326 100644 --- a/BrainPortal/app/models/background_activity/register_file.rb +++ b/BrainPortal/app/models/background_activity/register_file.rb @@ -31,6 +31,11 @@ def pretty_name "Register #{cnt} file#{cnt > 1 ? 's' : ''} on #{source_name}" end + def produces_model + Userfile # stands for undefined + end + + # Helper for scheduling a registration of the files immediately. # Note that the argument +dest_data_provider_id+ is always ignored # but it is declared to make this method's signature identical to @@ -47,6 +52,10 @@ def self.setup!(user_id, type_dash_names, remote_resource_id, src_data_provider_ ba end + def item_to_id(item) + type,name = item.split("-",2) + end + def process(item) # item is like "TextFile-abcd.xyz" type,name = item.split("-",2) src_dp_id = self.options[:src_data_provider_id] diff --git a/BrainPortal/app/models/background_activity/release_task.rb b/BrainPortal/app/models/background_activity/release_task.rb index e2198d61a..200730799 100644 --- a/BrainPortal/app/models/background_activity/release_task.rb +++ b/BrainPortal/app/models/background_activity/release_task.rb @@ -37,6 +37,10 @@ class BackgroundActivity::ReleaseTask < BackgroundActivity before_save :must_be_on_bourreau! + def targets_model + CbrainTask + end + def process(item) task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) ok = task.release diff --git a/BrainPortal/app/models/background_activity/remove_task_workdir.rb b/BrainPortal/app/models/background_activity/remove_task_workdir.rb index c690248d7..11fc6b62e 100644 --- a/BrainPortal/app/models/background_activity/remove_task_workdir.rb +++ b/BrainPortal/app/models/background_activity/remove_task_workdir.rb @@ -27,6 +27,10 @@ class BackgroundActivity::RemoveTaskWorkdir < BackgroundActivity::TerminateTask Revision_info=CbrainFileRevision[__FILE__] #:nodoc: + def targets_model + CbrainTask + end + def process(item) super(item) # invokes the terminate code; will skip tasks that don't need to be terminated cbrain_task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) diff --git a/BrainPortal/app/models/background_activity/restart_task.rb b/BrainPortal/app/models/background_activity/restart_task.rb index 5db3cafc3..5f00f0206 100644 --- a/BrainPortal/app/models/background_activity/restart_task.rb +++ b/BrainPortal/app/models/background_activity/restart_task.rb @@ -31,6 +31,10 @@ class BackgroundActivity::RestartTask < BackgroundActivity before_save :must_be_on_bourreau! + def targets_model + CbrainTask + end + def process(item) task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) atwhat = options[:atwhat] diff --git a/BrainPortal/app/models/background_activity/resume_task.rb b/BrainPortal/app/models/background_activity/resume_task.rb index 2ccc8364f..da82338a2 100644 --- a/BrainPortal/app/models/background_activity/resume_task.rb +++ b/BrainPortal/app/models/background_activity/resume_task.rb @@ -37,6 +37,10 @@ class BackgroundActivity::ResumeTask < BackgroundActivity before_save :must_be_on_bourreau! + def targets_model + CbrainTask + end + def process(item) task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) ok = task.resume diff --git a/BrainPortal/app/models/background_activity/save_task_workdir.rb b/BrainPortal/app/models/background_activity/save_task_workdir.rb index 310e0965a..63cb1bb8b 100644 --- a/BrainPortal/app/models/background_activity/save_task_workdir.rb +++ b/BrainPortal/app/models/background_activity/save_task_workdir.rb @@ -25,6 +25,10 @@ class BackgroundActivity::SaveTaskWorkdir < BackgroundActivity Revision_info=CbrainFileRevision[__FILE__] #:nodoc: + def targets_model + CbrainTask + end + def process(item) task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) ok = task.send(:save_cluster_workdir, self.user_id) # it's a protected method diff --git a/BrainPortal/app/models/background_activity/suspend_task.rb b/BrainPortal/app/models/background_activity/suspend_task.rb index 94ffafd62..43a244240 100644 --- a/BrainPortal/app/models/background_activity/suspend_task.rb +++ b/BrainPortal/app/models/background_activity/suspend_task.rb @@ -37,6 +37,7 @@ class BackgroundActivity::SuspendTask < BackgroundActivity before_save :must_be_on_bourreau! + def process(item) task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) ok = task.suspend diff --git a/BrainPortal/app/models/background_activity/sync_file.rb b/BrainPortal/app/models/background_activity/sync_file.rb index 59a50429f..29a3e5b13 100644 --- a/BrainPortal/app/models/background_activity/sync_file.rb +++ b/BrainPortal/app/models/background_activity/sync_file.rb @@ -33,6 +33,10 @@ def self.setup!(user_id, userfile_ids, remote_resource_id=nil) ba.save! ba end + def targets_model + Userfile # stands for undefined + end + def process(item) Userfile.find(item).sync_to_cache diff --git a/BrainPortal/app/models/background_activity/terminate_task.rb b/BrainPortal/app/models/background_activity/terminate_task.rb index 67dd33631..797a31d4c 100644 --- a/BrainPortal/app/models/background_activity/terminate_task.rb +++ b/BrainPortal/app/models/background_activity/terminate_task.rb @@ -43,5 +43,14 @@ def prepare_dynamic_items populate_items_from_task_custom_filter end -end + # Returns the primary class of items the task targets + def targets_model + CbrainTask + end + # Returns the primary class of items the task targets + def produces_model + nil # stands for undefined + end + +end diff --git a/BrainPortal/app/models/background_activity/unarchive_task_workdir.rb b/BrainPortal/app/models/background_activity/unarchive_task_workdir.rb index 687a0e1e9..b0bfee1ff 100644 --- a/BrainPortal/app/models/background_activity/unarchive_task_workdir.rb +++ b/BrainPortal/app/models/background_activity/unarchive_task_workdir.rb @@ -30,6 +30,11 @@ class BackgroundActivity::UnarchiveTaskWorkdir < BackgroundActivity before_save :must_be_on_bourreau! validates_dynamic_bac_presence_of_option :task_custom_filter_id + # Returns the primary class of items the task targets + + def targets_model + CbrainTask + end def process(item) cbrain_task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(item) diff --git a/BrainPortal/app/models/background_activity/uncompress_file.rb b/BrainPortal/app/models/background_activity/uncompress_file.rb index 1a6edbf26..d11e2990b 100644 --- a/BrainPortal/app/models/background_activity/uncompress_file.rb +++ b/BrainPortal/app/models/background_activity/uncompress_file.rb @@ -33,6 +33,9 @@ def self.setup!(user_id, userfile_ids, remote_resource_id=nil) ba.save! ba end + def targets_model + Userfile # stands for undefined + end def process(item) userfile = Userfile.find(item) diff --git a/BrainPortal/app/models/background_activity/unregister_file.rb b/BrainPortal/app/models/background_activity/unregister_file.rb index 966ad4197..8263cb219 100644 --- a/BrainPortal/app/models/background_activity/unregister_file.rb +++ b/BrainPortal/app/models/background_activity/unregister_file.rb @@ -34,6 +34,10 @@ def self.setup!(user_id, userfile_ids, remote_resource_id=nil) ba end + def targets_model + Userfile # stands for undefined + end + def process(item) userfile = Userfile.find(item) return [ false, "File is under transfer" ] if diff --git a/BrainPortal/app/models/background_activity/update_task_workdir_size.rb b/BrainPortal/app/models/background_activity/update_task_workdir_size.rb index 85d4c75f1..1521726dc 100644 --- a/BrainPortal/app/models/background_activity/update_task_workdir_size.rb +++ b/BrainPortal/app/models/background_activity/update_task_workdir_size.rb @@ -32,6 +32,11 @@ def self.setup!(task_ids) ba.start_at = 5.minutes.from_now ba.save end + # Returns the primary class of items the task targets + def targets_model + CbrainTask + end + def process(task_id) task = CbrainTask.where(:bourreau_id => CBRAIN::SelfRemoteResourceId).find(task_id) diff --git a/BrainPortal/app/models/background_activity/verify_data_provider.rb b/BrainPortal/app/models/background_activity/verify_data_provider.rb index 2dfb5e47e..33cb6b5d9 100644 --- a/BrainPortal/app/models/background_activity/verify_data_provider.rb +++ b/BrainPortal/app/models/background_activity/verify_data_provider.rb @@ -44,5 +44,14 @@ def process(item) return [ false, "Not alive: #{data_provider.name}" ] end -end + # Returns the primary class of items the task targets + def targets_model + DataProvider + end + # Returns the primary class of items the task targets + def produces_model + nil # stands for undefined + end + +end diff --git a/BrainPortal/app/views/background_activities/show.html.erb b/BrainPortal/app/views/background_activities/show.html.erb index f77567196..f5fe344c8 100644 --- a/BrainPortal/app/views/background_activities/show.html.erb +++ b/BrainPortal/app/views/background_activities/show.html.erb @@ -94,23 +94,70 @@ <% end %> -<% if (!@bac.is_configured_for_dynamic_items? && @bac.items.size > 0) %> - -
+<% if !@bac.is_configured_for_dynamic_items? && @bac.items.size > 0 %> + + <% if check_role(:admin_user) %> + + <%# show switch to bare-bones/linked-items view only if items are linkable %> +