From c0ff8440736f8eabd8c63fe40736d4cf7ac2e746 Mon Sep 17 00:00:00 2001
From: MontrealSergiy
Date: Mon, 28 Jul 2025 22:12:23 -0400
Subject: [PATCH 1/2] support custom task filters by target data provider #1538
---
BrainPortal/app/models/task_custom_filter.rb | 44 +++++++++++++------
.../_new_task_custom_filter.html.erb | 6 +++
.../_task_custom_filter.html.erb | 4 ++
3 files changed, 41 insertions(+), 13 deletions(-)
diff --git a/BrainPortal/app/models/task_custom_filter.rb b/BrainPortal/app/models/task_custom_filter.rb
index e38959d95..324810125 100644
--- a/BrainPortal/app/models/task_custom_filter.rb
+++ b/BrainPortal/app/models/task_custom_filter.rb
@@ -28,6 +28,7 @@
#[*description*] The CbrainTask description to filter.
#[*user_id*] The user_id of the CbrainTask owner to filter against.
#[*bourreau_id*] The bourreau_id of the bourreau to filter against.
+#[*results_data_provider_id*] The id of the results data provider for task results to filter against.
class TaskCustomFilter < CustomFilter
Revision_info=CbrainFileRevision[__FILE__] #:nodoc:
@@ -45,11 +46,12 @@ class TaskCustomFilter < CustomFilter
:wd_status,
:archiving_status,
{
- :user_ids => [],
- :group_ids => [],
- :bourreau_ids => [],
- :types => [],
- :status => [],
+ :user_ids => [],
+ :group_ids => [],
+ :bourreau_ids => [],
+ :types => [],
+ :status => [],
+ :results_data_provider_ids => [],
}
]
self.data_setter_and_getter(WHITELIST_TASKS_FILTERING_PARAMS)
@@ -64,12 +66,14 @@ class TaskCustomFilter < CustomFilter
validate :valid_data_user_ids
validate :valid_data_group_ids
validate :valid_data_bourreau_ids
+ validate :valid_data_results_data_provider_ids
validate :valid_data_types
validate :valid_data_description
validate :valid_data_wd_status
validate :valid_data_status
validate :valid_data_archiving_status
+
def valid_data_user_ids #:nodoc:
my_ids = cleaned_array_for_attribute(:user_ids)
return true if my_ids.empty?
@@ -94,6 +98,14 @@ def valid_data_bourreau_ids #:nodoc:
return false
end
+ def valid_data_results_data_provider_ids #:nodoc:
+ my_ids = cleaned_array_for_attribute(:results_data_provider_ids)
+ return true if my_ids.empty?
+ return true if (my_ids.map(&:to_i) - DataProvider.find_all_accessible_by_user(self.user).pluck(:id)).empty?
+ errors.add(:data_results_data_provider_ids, 'are not all accessible data providers')
+ return false
+ end
+
def valid_data_types #:nodoc:
self.data_types = cleaned_array_for_attribute(:types)
return true if self.data_types.empty?
@@ -153,14 +165,15 @@ def target_filtered_table
# See CustomFilter
def filter_scope(scope)
scope = super(scope)
- scope = scope_types(scope) if self.data_types.present?
- scope = scope_description(scope) if self.data_description_type.present? && self.data_description_term.present?
- scope = scope_user_ids(scope) if self.data_user_ids.present?
- scope = scope_group_ids(scope) if self.data_group_ids.present?
- scope = scope_bourreau_ids(scope) if self.data_bourreau_ids.present?
- scope = scope_status(scope) if self.data_status.present?
- scope = scope_archive(scope) if self.data_archiving_status.present?
- scope = scope_wd_status(scope) if self.data_wd_status.present?
+ scope = scope_types(scope) if self.data_types.present?
+ scope = scope_description(scope) if self.data_description_type.present? && self.data_description_term.present?
+ scope = scope_user_ids(scope) if self.data_user_ids.present?
+ scope = scope_group_ids(scope) if self.data_group_ids.present?
+ scope = scope_bourreau_ids(scope) if self.data_bourreau_ids.present?
+ scope = scope_results_data_provider_ids(scope) if self.data_results_data_provider_ids.present?
+ scope = scope_status(scope) if self.data_status.present?
+ scope = scope_archive(scope) if self.data_archiving_status.present?
+ scope = scope_wd_status(scope) if self.data_wd_status.present?
scope
end
@@ -207,6 +220,11 @@ def scope_bourreau_ids(scope)
filter_by_attribute(scope, :bourreau_id, self.data_bourreau_ids)
end
+ # Return +scope+ modified to filter the CbrainTask entry's data provider.
+ def scope_results_data_provider_ids(scope)
+ filter_by_attribute(scope, :results_data_provider_id, self.data_results_data_provider_ids)
+ end
+
# Returns +scope+ modified to filter the CbrainTask entry's status.
def scope_status(scope)
filter_by_attribute(scope, :status, self.data_status)
diff --git a/BrainPortal/app/views/custom_filters/_new_task_custom_filter.html.erb b/BrainPortal/app/views/custom_filters/_new_task_custom_filter.html.erb
index 03fa69f5d..a9e6e9ff3 100644
--- a/BrainPortal/app/views/custom_filters/_new_task_custom_filter.html.erb
+++ b/BrainPortal/app/views/custom_filters/_new_task_custom_filter.html.erb
@@ -48,6 +48,12 @@ Execution Servers
<%= bourreau_select 'data[bourreau_ids]', { :bourreaux => Bourreau.find_all_accessible_by_user(current_user).all, :selector => custom_filter.data_bourreau_ids, :offline_is_ok => true }, :include_blank => true, :multiple => true %>
+
+ Results on
+ <%= data_provider_select 'data[result_data_provider_ids]', { :data_providers => DataProvider.find_all_accessible_by_user(current_user).all, :selector => custom_filter.data_results_data_provider_ids, :offline_is_ok => true }, :include_blank => true, :multiple => true %>
+
+
+
Filtering by date
<%= date_range_panel(custom_filter[:data] || {}, "data") %>
diff --git a/BrainPortal/app/views/custom_filters/_task_custom_filter.html.erb b/BrainPortal/app/views/custom_filters/_task_custom_filter.html.erb
index 71990b5d2..72e3ddb39 100644
--- a/BrainPortal/app/views/custom_filters/_task_custom_filter.html.erb
+++ b/BrainPortal/app/views/custom_filters/_task_custom_filter.html.erb
@@ -67,6 +67,10 @@
<%= bourreau_select 'data[bourreau_ids]', { :bourreaux => Bourreau.find_all_accessible_by_user(current_user).all, :selector => @custom_filter.data_bourreau_ids, :offline_is_ok => true }, :include_blank => true, :multiple => true %>
<% end %>
+ <% t.edit_cell(:data_results_data_provider_ids, :header => "Results on", :content => DataProvider.where(:id => @custom_filter.data_results_data_provider_ids).pluck(:name).join(", ").presence || "None") do %>
+ <%= data_provider_select 'data[results_data_provider_ids]', { :data_providers => DataProvider.find_all_accessible_by_user(current_user).all, :selector => @custom_filter.data_results_data_provider_ids, :offline_is_ok => true }, :include_blank => true, :multiple => true %>
+ <% end %>
+
<%
archiving_status =
{
From 66e76c1e78ea260a18a77d47344d19fbec836574 Mon Sep 17 00:00:00 2001
From: MontrealSergiy
Date: Tue, 29 Jul 2025 12:36:16 -0400
Subject: [PATCH 2/2] formatting: vertical alignment in support custom task
filters by target data provider #1538
---
BrainPortal/app/models/task_custom_filter.rb | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/BrainPortal/app/models/task_custom_filter.rb b/BrainPortal/app/models/task_custom_filter.rb
index 324810125..a4164b8ca 100644
--- a/BrainPortal/app/models/task_custom_filter.rb
+++ b/BrainPortal/app/models/task_custom_filter.rb
@@ -46,12 +46,12 @@ class TaskCustomFilter < CustomFilter
:wd_status,
:archiving_status,
{
- :user_ids => [],
- :group_ids => [],
- :bourreau_ids => [],
- :types => [],
- :status => [],
+ :user_ids => [],
+ :group_ids => [],
+ :bourreau_ids => [],
:results_data_provider_ids => [],
+ :types => [],
+ :status => [],
}
]
self.data_setter_and_getter(WHITELIST_TASKS_FILTERING_PARAMS)