Skip to content
Snippets Groups Projects
Commit 2db218f8 authored by Sean McGivern's avatar Sean McGivern
Browse files

Send emails for issues due tomorrow

Also, refactor the mail sending slightly: instead of one worker sending all
emails, create a worker per project with issues due, which will send all emails
for that project.
parent 5ab75649
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -48,6 +48,7 @@ class Issue < ActiveRecord::Base
scope :without_due_date, -> { where(due_date: nil) }
scope :due_before, ->(date) { where('issues.due_date < ?', date) }
scope :due_between, ->(from_date, to_date) { where('issues.due_date >= ?', from_date).where('issues.due_date <= ?', to_date) }
scope :due_tomorrow, -> { where(due_date: Date.tomorrow) }
 
scope :order_due_date_asc, -> { reorder('issues.due_date IS NULL, issues.due_date ASC') }
scope :order_due_date_desc, -> { reorder('issues.due_date IS NULL, issues.due_date DESC') }
Loading
Loading
Loading
Loading
@@ -18,7 +18,7 @@
- cronjob:stuck_import_jobs
- cronjob:stuck_merge_jobs
- cronjob:trending_projects
- cronjob:issue_due
- cronjob:issue_due_scheduler
 
- gcp_cluster:cluster_install_app
- gcp_cluster:cluster_provision
Loading
Loading
@@ -40,6 +40,8 @@
- github_importer:github_import_stage_import_pull_requests
- github_importer:github_import_stage_import_repository
 
- mail_scheduler:mail_scheduler_issue_due
- object_storage_upload
- object_storage:object_storage_background_move
- object_storage:object_storage_migrate_uploads
Loading
Loading
module MailSchedulerQueue
extend ActiveSupport::Concern
included do
queue_namespace :mail_scheduler
end
end
class IssueDueWorker
class IssueDueSchedulerWorker
include ApplicationWorker
include CronjobQueue
 
def perform
Issue.where(due_date: Date.today).find_each do |issue|
NotificationService.new.issue_due_email(issue)
Issue.opened.due_tomorrow.group(:project_id).pluck(:project_id).each do |project_id|
MailScheduler::IssueDueWorker.perform_async(project_id)
end
end
end
module MailScheduler
class IssueDueWorker
include ApplicationWorker
include MailSchedulerQueue
def perform(project_id)
notification_service = NotificationService.new
Issue.opened.due_tomorrow.in_projects(project_id).preload(:project).find_each do |issue|
notification_service.issue_due(issue)
end
end
end
end
---
title: Add cron job to email users on issue due date
merge_request: 16957
merge_request: 17985
author: Stuart Nelson
type: added
Loading
Loading
@@ -453,9 +453,9 @@ Settings.cron_jobs['pages_domain_verification_cron_worker'] ||= Settingslogic.ne
Settings.cron_jobs['pages_domain_verification_cron_worker']['cron'] ||= '*/15 * * * *'
Settings.cron_jobs['pages_domain_verification_cron_worker']['job_class'] = 'PagesDomainVerificationCronWorker'
 
Settings.cron_jobs['issue_due_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['issue_due_worker']['cron'] ||= '50 00 * * *'
Settings.cron_jobs['issue_due_worker']['job_class'] = 'IssueDueWorker'
Settings.cron_jobs['issue_due_scheduler_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['issue_due_scheduler_worker']['cron'] ||= '50 00 * * *'
Settings.cron_jobs['issue_due_scheduler_worker']['job_class'] = 'IssueDueSchedulerWorker'
 
#
# GitLab Shell
Loading
Loading
Loading
Loading
@@ -34,6 +34,7 @@
- [email_receiver, 2]
- [emails_on_push, 2]
- [mailers, 2]
- [mail_scheduler, 2]
- [invalid_gpg_signature_update, 2]
- [create_gpg_signature, 2]
- [rebase, 2]
Loading
Loading
Loading
Loading
@@ -35,5 +35,8 @@ Due dates also appear in your [todos list](../../../workflow/todos.md).
 
![Issues with due dates in the todos](img/due_dates_todos.png)
 
The day before an open issue is due, an email will be sent to all participants
of the issue.
[ce-3614]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3614
[permissions]: ../../permissions.md#project
require 'spec_helper'
describe IssueDueSchedulerWorker do
describe '#perform' do
it 'schedules one MailScheduler::IssueDueWorker per project with open issues due tomorrow' do
project1 = create(:project)
project2 = create(:project)
project_closed_issue = create(:project)
project_issue_due_another_day = create(:project)
create(:issue, :opened, project: project1, due_date: Date.tomorrow)
create(:issue, :opened, project: project1, due_date: Date.tomorrow)
create(:issue, :opened, project: project2, due_date: Date.tomorrow)
create(:issue, :closed, project: project_closed_issue, due_date: Date.tomorrow)
create(:issue, :opened, project: project_issue_due_another_day, due_date: Date.today)
expect(MailScheduler::IssueDueWorker).to receive(:perform_async).with(project1.id)
expect(MailScheduler::IssueDueWorker).to receive(:perform_async).with(project2.id)
described_class.new.perform
end
end
end
require 'spec_helper'
describe IssueDueWorker do
describe 'perform' do
let(:worker) { described_class.new }
it 'finds issues due on the day run' do
issue1 = create(:issue, :opened, due_date: Date.today)
create(:issue, :opened, due_date: 3.days.from_now)
create(:issue, :opened, due_date: 4.days.from_now)
expect_any_instance_of(NotificationService).to receive(:issue_due_email).with(issue1)
worker.perform
end
end
end
require 'spec_helper'
describe MailScheduler::IssueDueWorker do
describe '#perform' do
let(:worker) { described_class.new }
let(:project) { create(:project) }
it 'sends emails for open issues due tomorrow in the project specified' do
issue1 = create(:issue, :opened, project: project, due_date: Date.tomorrow)
issue2 = create(:issue, :opened, project: project, due_date: Date.tomorrow)
create(:issue, :closed, project: project, due_date: Date.tomorrow) # closed
create(:issue, :opened, project: project, due_date: 2.days.from_now) # due on another day
create(:issue, :opened, due_date: Date.tomorrow) # different project
expect_any_instance_of(NotificationService).to receive(:issue_due).with(issue1)
expect_any_instance_of(NotificationService).to receive(:issue_due).with(issue2)
worker.perform(project.id)
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment