From 0f814b1a8ba8f2b04da6270cfc64b3165bcf4325 Mon Sep 17 00:00:00 2001 From: rubynovich Date: Fri, 19 Apr 2013 15:16:50 +0400 Subject: [PATCH] add: rake-task for delivery --- app/views/mailer/solved_issues_mail.html.haml | 24 +++++++++++ app/views/mailer/solved_issues_mail.text.haml | 16 +++++++ config/locales/en.yml | 9 +++- config/locales/ru.yml | 7 +++ init.rb | 21 +++++++++ lib/solved_issues_mailer_patch.rb | 43 +++++++++++++++++++ lib/tasks/send_solved_issues.rake | 16 +++++++ 7 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 app/views/mailer/solved_issues_mail.html.haml create mode 100644 app/views/mailer/solved_issues_mail.text.haml create mode 100644 lib/solved_issues_mailer_patch.rb create mode 100644 lib/tasks/send_solved_issues.rake diff --git a/app/views/mailer/solved_issues_mail.html.haml b/app/views/mailer/solved_issues_mail.html.haml new file mode 100644 index 0000000..2992404 --- /dev/null +++ b/app/views/mailer/solved_issues_mail.html.haml @@ -0,0 +1,24 @@ +%p= l(:mail_body_greeting, :firstname => @firstname, :lastname => @lastname ) + +- if @solved_issues.present? + - issues_count = @solved_issues.count + - case issues_count + - when 1 + %p= l(:mail_body_solved_issues1, :count => issues_count) + - when 2..4 + %p= l(:mail_body_solved_issues2, :count => issues_count) + - else + %p= l(:mail_body_solved_issues5, :count => issues_count) + +%ul + - @solved_issues.each do |issue| + %li + =h issue.due_date + ="-" + =h issue.project + ="-" + =link_to("#{issue.tracker} ##{issue.id}", :controller => 'issues', :action => 'show', :id => issue, :only_path => false) + =":" + =h issue.subject + +%p= link_to l(:label_issue_view_all), @issues_url diff --git a/app/views/mailer/solved_issues_mail.text.haml b/app/views/mailer/solved_issues_mail.text.haml new file mode 100644 index 0000000..3d3109e --- /dev/null +++ b/app/views/mailer/solved_issues_mail.text.haml @@ -0,0 +1,16 @@ += l(:mail_body_greeting, :firstname => @firstname, :lastname => @lastname ) + +- if @solved_issues.present? + - issues_count = @solved_issues.count + - case issues_count + - when 1 + = l(:mail_body_solved_issues1, :count => issues_count) + - when 2..4 + = l(:mail_body_solved_issues2, :count => issues_count) + - else + = l(:mail_body_solved_issues5, :count => issues_count) + +- @solved_issues.each do |issue| + = "* #{issue.due_date} - #{issue.project} - #{issue.tracker} ##{issue.id}: #{issue.subject}" + += @issues_url diff --git a/config/locales/en.yml b/config/locales/en.yml index f049836..03a7283 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2,4 +2,11 @@ en: issuesreportedbymewithstatus: "Solved issues" label_solved_issue_plural: "Solved issues" - label_solved_issue_status: "Status for solved issues" + label_solved_issue_status: "Status for solved issues" + mail_body_greeting: "Dear %{firstname} %{lastname}," + mail_subject_solved_issues1: " %{count} solved issue must be closed" + mail_subject_solved_issues2: " %{count} solved issues must be closed" + mail_subject_solved_issues5: " %{count} solved issues must be closed" + mail_body_solved_issues1: " %{count} solved issue must be closed:" + mail_body_solved_issues2: " %{count} solved issues must be closed:" + mail_body_solved_issues5: " %{count} solved issues must be closed:" diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 8aed7e0..8327b15 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -3,3 +3,10 @@ ru: issuesreportedbymewithstatus: "Решенные задачи" label_solved_issue_plural: "Решенные задачи" label_solved_issue_status: "Статус решенных задач" + mail_body_greeting: "Уважаемый %{firstname} %{lastname}," + mail_subject_solved_issues1: " %{count} решенная задача должна быть закрыта" + mail_subject_solved_issues2: " %{count} решенные задачи должны быть закрыты" + mail_subject_solved_issues5: " %{count} решенных задач должны быть закрыты" + mail_body_solved_issues1: " %{count} решенная задача, поставленная Вами, должна быть закрыта:" + mail_body_solved_issues2: " %{count} решенные задачи, поставленные Вами, должны быть закрыты:" + mail_body_solved_issues3: " %{count} решенных задач, поставленных Вами, должны быть закрыты:" diff --git a/init.rb b/init.rb index 5058086..29b7d89 100644 --- a/init.rb +++ b/init.rb @@ -1,3 +1,5 @@ +require 'redmine' + Redmine::Plugin.register :redmine_solved_issues do name 'Redmine Solved Issues plugin' author 'Roman Shipiev' @@ -11,3 +13,22 @@ }, :partial => 'settings/settings' end + +if Rails::VERSION::MAJOR < 3 + require 'dispatcher' + object_to_prepare = Dispatcher +else + object_to_prepare = Rails.configuration +end + +object_to_prepare.to_prepare do + [:mailer].each do |cl| + require "solved_issues_#{cl}_patch" + end + + [ + [Mailer, SolvedIssuesPlugin::MailerPatch] + ].each do |cl, patch| + cl.send(:include, patch) unless cl.included_modules.include? patch + end +end diff --git a/lib/solved_issues_mailer_patch.rb b/lib/solved_issues_mailer_patch.rb new file mode 100644 index 0000000..bfa30fd --- /dev/null +++ b/lib/solved_issues_mailer_patch.rb @@ -0,0 +1,43 @@ +require_dependency 'mailer' + +module SolvedIssuesPlugin + module MailerPatch + def self.included(base) + base.extend(ClassMethods) + + base.send(:include, InstanceMethods) + + base.class_eval do + end + end + + module ClassMethods + def solved_issues(options={}) + mailcopy = options[:cc] + status_id = Setting[:plugin_redmine_solved_issues][:issue_status] + solved_issues = Issue.open.where(:status_id => status_id) + solved_issues.map(&:author).uniq.map do |user| + solved_issues_mail(user, solved_issues.where(:author_id => user.id), mailcopy).deliver + end + end + end + + module InstanceMethods + def solved_issues_mail(user, solved_issues, mailcopy) + set_language_if_valid user.language + issues_count = solved_issues.count + subject = case issues_count + when 1 then l(:mail_subject_solved_issues1, :count => issues_count) + when 2..4 then l(:mail_subject_solved_issues2, :count => issues_count) + else l(:mail_subject_solved_issues5, :count => issues_count) + end + status_id = Setting[:plugin_redmine_solved_issues][:issue_status] + @solved_issues = solved_issues + @firstname = user.firstname + @lastname = user.lastname + @issues_url = url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :author_id => 'me', :status_id => status_id, :sort => 'priority:desc,updated_on:desc') + mail(:to => user.mail, :cc => mailcopy, :subject => subject) if user.mail.present? && issues_count.nonzero? + end + end + end +end diff --git a/lib/tasks/send_solved_issues.rake b/lib/tasks/send_solved_issues.rake new file mode 100644 index 0000000..55014cb --- /dev/null +++ b/lib/tasks/send_solved_issues.rake @@ -0,0 +1,16 @@ +desc <<-END_DESC +Send mails about solved issues. + +Available options: + * cc => send a copy of each message to this address (no copy per default) +Example: + rake redmine:send_solved_issues cc=admin@example.net RAILS_ENV="production" +END_DESC + +namespace :redmine do + task :send_solved_issues => :environment do + options = {} + options[:cc] = ENV['cc'] if ENV['cc'] + Mailer.solved_issues(options) + end +end