Merge pull request #8448 from andrej-scinote/aj_SCI_11826

Add experiment due date notifications [SCI-11826]
This commit is contained in:
andrej-scinote 2025-04-23 11:49:41 +02:00 committed by GitHub
commit fe69fafcd8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 99 additions and 1 deletions

View file

@ -0,0 +1,26 @@
# frozen_string_literal: true
class ExperimentDueDateReminderJob < ApplicationJob
queue_as :default
def perform
NewRelic::Agent.ignore_transaction
experiments_due.find_each do |experiment|
ExperimentDueDateNotification
.send_notifications({ experiment_id: experiment.id })
end
end
private
def experiments_due
Experiment.joins(:project)
.active
.where(
due_date_notification_sent: false,
projects: { archived: false }
)
.where('experiments.due_date > ? AND experiments.due_date <= ?', Date.current, Date.current + 1.day)
end
end

View file

@ -16,6 +16,7 @@ class Experiment < ApplicationRecord
include TimeTrackable
before_save -> { report_elements.destroy_all }, if: -> { !new_record? && project_id_changed? }
before_save :reset_due_date_notification_sent, if: -> { due_date_changed? }
belongs_to :project, inverse_of: :experiments, touch: true
delegate :team, to: :project
@ -560,11 +561,15 @@ class Experiment < ApplicationRecord
end
def one_day_prior?(date = Date.current)
due_date.present? && date < due_date && date > (due_date - 1.day)
due_date.present? && date < due_date && date >= (due_date - 1.day)
end
private
def reset_due_date_notification_sent
self.due_date_notification_sent = false
end
def log_activity(type_of, current_user, my_module)
Activities::CreateActivityService
.call(activity_type: type_of,

View file

@ -27,6 +27,7 @@ class Project < ApplicationRecord
validate :selected_user_role_validation, if: :bulk_assignment?
before_validation :remove_project_folder, on: :update, if: :archived_changed?
before_save :reset_due_date_notification_sent, if: -> { due_date_changed? }
belongs_to :created_by,
foreign_key: 'created_by_id',
@ -395,4 +396,8 @@ class Project < ApplicationRecord
end
col_name
end
def reset_due_date_notification_sent
self.due_date_notification_sent = false
end
end

View file

@ -0,0 +1,24 @@
# frozen_string_literal: true
class ExperimentDueDateNotification < BaseNotification
def self.subtype
:experiments_due_date_reminder
end
def title
I18n.t(
'notifications.content.experiment_due_date_reminder.message_html',
experiment_name: subject.name
)
end
def subject
Experiment.find(params[:experiment_id])
end
after_deliver do
# rubocop:disable Rails/SkipsModelValidations
Experiment.find(params[:experiment_id]).update_column(:due_date_notification_sent, true)
# rubocop:enable Rails/SkipsModelValidations
end
end

View file

@ -0,0 +1,19 @@
# frozen_string_literal: true
module Recipients
class DueDateRecipients
def initialize(params)
@params = params
end
def recipients
if @params[:experiment_id].present?
experiment = Experiment.find_by(id: @params[:experiment_id])
User.where(id: experiment.user_assignments
.joins(:user_role)
.where('? = ANY(user_roles.permissions)',
ExperimentPermissions::MANAGE).select(:user_id))
end
end
end
end

View file

@ -13,6 +13,9 @@ class NotificationExtends
my_module_due_date_reminder: {
recipients_module: :MyModuleDesignatedRecipients
},
experiments_due_date_reminder: {
recipients_module: :DueDateRecipients
},
add_comment_to_module_activity: {
code: 35,
recipients_module: :MyModuleDesignatedRecipients
@ -140,6 +143,9 @@ class NotificationExtends
change_user_role_on_experiment_activity
change_user_role_on_my_module_activity
project_access_changed_all_team_members_activity
],
experiment_due_date: %I[
experiments_due_date_reminder
]
},
repository: {

View file

@ -30,6 +30,7 @@ if ENV['WORKER'].present?
reminder_job_interval = ENV['REMINDER_JOB_INTERVAL'] || '1h'
schedule_task(scheduler, reminder_job_interval) do
ExperimentDueDateReminderJob.perform_now
MyModules::DueDateReminderJob.perform_now
RepositoryItemDateReminderJob.perform_now
end

View file

@ -4139,6 +4139,7 @@ en:
repository_date_reminder: "Date reminder"
other_smart_annotation: "You were tagged"
other_team_invitation: "You were invited or removed from the team"
experiment_due_date: "Due date reminder if you have Owner or User access role on a Experiment"
content:
my_module_due_date_reminder:
title_html: "Task due date reminder"
@ -4149,6 +4150,9 @@ en:
item_date_reminder:
title_html: "Item date reminder"
message_html: "Date reminder for %{repository_row_name} is coming up in %{value} %{units}."
experiment_due_date_reminder:
title_html: "Experiment due date reminder"
message_html: "Due date for the experiment %{experiment_name} is coming up."
deliver:
download_link: "Download link:"
download_text: "Click the link to download the file."

View file

@ -0,0 +1,8 @@
# frozen_string_literal: true
class AddDueDateReminderNotificationColumns < ActiveRecord::Migration[7.0]
def change
add_column :projects, :due_date_notification_sent, :boolean, default: false, null: false
add_column :experiments, :due_date_notification_sent, :boolean, default: false, null: false
end
end