├── .gitignore ├── .travis-database.yml ├── .travis-init.sh ├── .travis.yml ├── Gemfile ├── README.markdown ├── app ├── controllers │ └── mail_reminders_controller.rb ├── helpers │ └── mail_reminders_helper.rb ├── models │ ├── mail_reminder.rb │ ├── mail_reminder_mailer.rb │ └── reminder_role.rb └── views │ ├── mail_reminder_mailer │ └── issues_reminder.html.erb │ ├── mail_reminders │ ├── _form.html.erb │ ├── _interval_values.erb │ └── index.html.erb │ └── reminder_settings │ └── _issue_reminder_settings.erb ├── config ├── locales │ ├── cs.yml │ ├── de.yml │ ├── en.yml │ ├── es.yml │ ├── fr.yml │ ├── ja.yml │ ├── ru.yml │ ├── sr-YU.yml │ ├── sr.yml │ ├── tr.yml │ ├── uk.yml │ ├── zh-TW.yml │ └── zh.yml └── routes.rb ├── db └── migrate │ ├── 001_create_reminders.rb │ ├── 002_create_reminder_roles.rb │ ├── 003_rename_reminders_to_issue_reminders.rb │ ├── 004_rename_reminders_id_to_issue_reminders_id_in_reminder_role.rb │ ├── 005_rename_issue_reminders_to_mail_reminders.rb │ └── 006_rename_issue_reminders_id_to_mail_reminders_id_in_reminder_role.rb ├── init.rb ├── lang ├── de.yml ├── en.yml ├── fr.yml ├── pl.yml ├── ru.yml ├── sr-YU.yml ├── sr.yml └── uk.yml ├── lib ├── boards_watchers_patches.rb ├── premailer_ext │ └── file_system_loader_extensions.rb └── tasks │ └── reminder.rake └── test ├── fixtures ├── reminder_roles.yml └── reminders.yml ├── test_helper.rb └── unit ├── reminder_roles_test.rb └── reminder_test.rb /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | Gemfile.lock 3 | -------------------------------------------------------------------------------- /.travis-database.yml: -------------------------------------------------------------------------------- 1 | test: 2 | adapter: sqlite3 3 | database: db/redmine_test.sqlite3 -------------------------------------------------------------------------------- /.travis-init.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | 3 | if [[ ! "$WORKSPACE" = /* ]] || 4 | [[ ! "$PATH_TO_PLUGIN" = /* ]] || 5 | [[ ! "$PATH_TO_REDMINE" = /* ]]; 6 | then 7 | echo "You should set"\ 8 | " WORKSPACE, PATH_TO_PLUGIN, PATH_TO_REDMINE"\ 9 | " environment variables" 10 | echo "You set:"\ 11 | "$WORKSPACE"\ 12 | "$PATH_TO_PLUGIN"\ 13 | "$PATH_TO_REDMINE" 14 | exit 1; 15 | fi 16 | 17 | case $REDMINE_VERSION in 18 | 1.4.*) export PATH_TO_PLUGINS=./vendor/plugins # for redmine < 2.0 19 | export GENERATE_SECRET=generate_session_store 20 | export MIGRATE_PLUGINS=db:migrate_plugins 21 | export REDMINE_TARBALL=https://github.com/redmine/redmine/archive/$REDMINE_VERSION.tar.gz 22 | ;; 23 | 2.* | 3.*) export PATH_TO_PLUGINS=./plugins # for redmine 2.x and 3.x 24 | export GENERATE_SECRET=generate_secret_token 25 | export MIGRATE_PLUGINS=redmine:plugins:migrate 26 | export REDMINE_TARBALL=https://github.com/redmine/redmine/archive/$REDMINE_VERSION.tar.gz 27 | ;; 28 | master) export PATH_TO_PLUGINS=./plugins 29 | export GENERATE_SECRET=generate_secret_token 30 | export MIGRATE_PLUGINS=redmine:plugins:migrate 31 | export REDMINE_GIT_REPO=https://github.com/redmine/redmine.git 32 | export REDMINE_GIT_TAG=master 33 | ;; 34 | *) echo "Unsupported platform $REDMINE_VERSION" 35 | exit 1 36 | ;; 37 | esac 38 | 39 | export BUNDLE_GEMFILE=$PATH_TO_REDMINE/Gemfile 40 | 41 | clone_redmine() { 42 | set -e # exit if clone fails 43 | rm -rf $PATH_TO_REDMINE 44 | if [ ! "$VERBOSE" = "yes" ]; then 45 | QUIET=--quiet 46 | fi 47 | if [ -n "${REDMINE_GIT_TAG}" ]; then 48 | git clone -b $REDMINE_GIT_TAG --depth=100 $QUIET $REDMINE_GIT_REPO $PATH_TO_REDMINE 49 | cd $PATH_TO_REDMINE 50 | git checkout $REDMINE_GIT_TAG 51 | else 52 | mkdir -p $PATH_TO_REDMINE 53 | wget $REDMINE_TARBALL -O- | tar -C $PATH_TO_REDMINE -xz --strip=1 --show-transformed -f - 54 | fi 55 | } 56 | 57 | run_tests() { 58 | # exit if tests fail 59 | set -e 60 | 61 | cd $PATH_TO_REDMINE 62 | 63 | if [ "$VERBOSE" = "yes" ]; then 64 | TRACE=--trace 65 | fi 66 | 67 | script -e -c "bundle exec rake redmine:plugins:test NAME="$PLUGIN $VERBOSE 68 | } 69 | 70 | uninstall() { 71 | set -e # exit if migrate fails 72 | cd $PATH_TO_REDMINE 73 | # clean up database 74 | if [ "$VERBOSE" = "yes" ]; then 75 | TRACE=--trace 76 | fi 77 | bundle exec rake $TRACE $MIGRATE_PLUGINS NAME=$PLUGIN VERSION=0 78 | } 79 | 80 | run_install() { 81 | # exit if install fails 82 | set -e 83 | 84 | # cd to redmine folder 85 | cd $PATH_TO_REDMINE 86 | 87 | # create a link to the plugin, but avoid recursive link. 88 | if [ -L "$PATH_TO_PLUGINS/$PLUGIN" ]; then rm "$PATH_TO_PLUGINS/$PLUGIN"; fi 89 | ln -s "$PATH_TO_PLUGIN" "$PATH_TO_PLUGINS/$PLUGIN" 90 | 91 | if [ "$VERBOSE" = "yes" ]; then 92 | export TRACE=--trace 93 | fi 94 | 95 | cp $PATH_TO_PLUGINS/$PLUGIN/.travis-database.yml config/database.yml 96 | 97 | # install gems 98 | mkdir -p vendor/bundle 99 | bundle install --path vendor/bundle 100 | 101 | bundle exec rake db:migrate $TRACE 102 | bundle exec rake redmine:load_default_data REDMINE_LANG=en $TRACE 103 | bundle exec rake $GENERATE_SECRET $TRACE 104 | bundle exec rake $MIGRATE_PLUGINS $TRACE 105 | } 106 | 107 | while getopts :irtu opt 108 | do case "$opt" in 109 | r) clone_redmine; exit 0;; 110 | i) run_install; exit 0;; 111 | t) run_tests $2; exit 0;; 112 | u) uninstall; exit 0;; 113 | [?]) echo "i: install; r: clone redmine; t: run tests; u: uninstall";; 114 | esac 115 | done -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | cache: 3 | bundler: true 4 | directories: 5 | - ~/.rvm 6 | before_install: 7 | - "echo 'gem: --no-rdoc --no-ri' > ~/.gemrc" 8 | - gem install bundler 9 | matrix: 10 | include: 11 | - env: REDMINE_VERSION=3.4.6 VERBOSE=yes 12 | rvm: 2.1 13 | - env: REDMINE_VERSION=3.4.6 VERBOSE=yes 14 | rvm: 2.2 15 | - env: REDMINE_VERSION=3.4.6 VERBOSE=yes 16 | rvm: 2.3 17 | - env: REDMINE_VERSION=3.4.6 VERBOSE=yes 18 | rvm: 2.4 19 | - env: REDMINE_VERSION=3.3.8 VERBOSE=yes 20 | rvm: 2.1 21 | - env: REDMINE_VERSION=3.3.8 VERBOSE=yes 22 | rvm: 2.2 23 | - env: REDMINE_VERSION=3.3.8 VERBOSE=yes 24 | rvm: 2.3 25 | - env: REDMINE_VERSION=3.2.9 VERBOSE=yes 26 | rvm: 2.1 27 | - env: REDMINE_VERSION=3.2.9 VERBOSE=yes 28 | rvm: 2.2 29 | 30 | script: 31 | - export PLUGIN=redmine_mail_reminder 32 | - export WORKSPACE=$(pwd)/workspace 33 | - export PATH_TO_PLUGIN=$(pwd) 34 | - export PATH_TO_REDMINE=$WORKSPACE/redmine 35 | - mkdir $WORKSPACE 36 | - bash -x ./.travis-init.sh -r || exit 1 37 | - bash -x ./.travis-init.sh -i || exit 1 38 | - bash -x ./.travis-init.sh -u || exit 1 39 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # For redmine_mail_reminder 2 | gem 'prototype-rails', git: 'https://github.com/rails/prototype-rails.git', branch: '4.2' 3 | 4 | source "https://rubygems.org" do 5 | gem 'premailer-rails', '~> 1.9', '>= 1.9.5' 6 | gem 'colorize' 7 | end 8 | 9 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | [![Join the chat at https://gitter.im/Hopebaytech/redmine_mail_reminder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Hopebaytech/redmine_mail_reminder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 2 | [![Build Status](https://travis-ci.org/jcppkkk/redmine_mail_reminder.svg?branch=master)](https://travis-ci.org/jcppkkk/redmine_mail_reminder) 3 | 4 | Redmine Issue Reminder 5 | ============== 6 | 7 | [Plugin page on redmine.org](http://www.redmine.org/plugins/redmine_mail_reminder) 8 | 9 | Compatible with redmine 3.3, 3.2 10 | 11 | redmine 3.4 is not tested yet. 12 | 13 | Plugin provides an easy to use interface to set up automatic email reminder to every project. 14 | Every reminder uses a custom query with all their filter options to select issues 15 | and performs periodical email transmission on a role basis. 16 | 17 | Following intervals are possible: 18 | - Daily (Selecting interval from every 1st day until every 6th day) 19 | - Weekly (Selecting weekday) 20 | - Monthly (Selecting day of the month) 21 | 22 | ## Screenshots 23 | 24 | ![image](http://farm7.static.flickr.com/6109/6294745006_49986ec541_b.jpg) 25 | ![image](https://cloud.githubusercontent.com/assets/84070/7959114/ceb99b22-0a28-11e5-94f9-f4169423d0cf.png) 26 | ![image](https://cloud.githubusercontent.com/assets/84070/7959130/f794f6cc-0a28-11e5-93c9-16d56ca9c6ea.png) 27 | 28 | 29 | ## Migrate from redmine_issue_reminder to redmine_mail_reminder 30 | 31 | At 2015/05/13 (2.6/3.0 Branch) this plugin is renamed from redmine_issue_reminder to redmine_mail_reminder, in order to avoid conflict with [existed redmine_issue_reminder](http://www.redmine.org/plugins/redmine_issue_reminder). 32 | 33 | * Rename your redmine_issue_reminder directory (redmine/plugins/redmine_issue_reminder) to redmine_mail_reminder 34 | 35 | * Connect to your redmine's SQL database, run the following SQL script 36 | ```sql 37 | update schema_migrations set version=replace(version, 'redmine_issue_reminder', 'redmine_mail_reminder') where version like '%redmine_issue_reminder%'; 38 | update settings set name=replace(name, 'issue', 'mail') where name = 'plugin_redmine_issue_reminder'; 39 | ``` 40 | 41 | * Pull new version source from github 42 | 43 | * Install dependencies and migrate database 44 | ```console 45 | cd redmine/ 46 | bundle install 47 | RAILS_ENV=production rake redmine:plugins:migrate 48 | ``` 49 | 7. Restart your web server (usually /etc/init.d/apache2 restart) 50 | 51 | ## Installation - Linux 52 | 53 | * Clone this repository into ```redmine/plugins/redmine_mail_reminder``` 54 | * Install dependencies and migrate database 55 | ```console 56 | cd redmine/ 57 | bundle install 58 | RAILS_ENV=production rake redmine:plugins:migrate 59 | ``` 60 | 61 | * Setup cronjob for daily transmission. RVM users see [Using RVM with Cron](https://rvm.io/deployment/cron). 62 | ``` 63 | crontab -e 64 | # Check reminders at 06:00 every day, send emails by schedule 65 | 0 6 * * * cd redmine/ && rake reminder:exec RAILS_ENV="production" 66 | # Or, Check reminders at 08:30 on work days 1-6, send emails by schedule 67 | 30 8 * * 1-6 cd redmine/ && rake reminder:exec RAILS_ENV="production" 68 | ``` 69 | CentOS users can make a file /etc/cron.d/redmine 70 | ``` 71 | SHELL=/bin/bash 72 | PATH=/sbin:/bin:/usr/sbin:/usr/bin 73 | MAILTO=root 74 | HOME=/ 75 | #check reminders at 06:00 every day, send emails by schedule 76 | 0 6 * * * root cd /var/lib/redmine && /usr/local/bin/rake reminder:exec RAILS_ENV="production" >> /var/lib/redmine/log/production.log 2>&1 77 | ``` 78 | and restart cron with 79 | ``` 80 | /etc/init.d/crond restart 81 | ``` 82 | * Restart your Redmine web server (e.g. mongrel, thin, mod_rails) 83 | 84 | ## Installation - Windows 85 | 86 | Enviroment : Winxp + Redmine 1.2.X + Mysql 5.X 87 | 88 | * Write a bat file such as these 89 | ```bat 90 | echo on 91 | cd redmine\ 92 | rake reminder:exec RAILS_ENV="production" 93 | ``` 94 | 95 | * Config a schedule following http://www.iopus.com/guides/winscheduler.htm 96 | * Restart redmine server. 97 | 98 | ## Configuration 99 | 100 | * Active `Issue reminder` module in project settings 101 | * Configure `View issue reminder` in "Administration > Roles and permissions" 102 | * Create a [custom query](http://www.redmine.org/projects/redmine/wiki/RedmineIssueList#Custom-queries) of what you want to send in email. 103 | * Create reminder with custom query in "Project > Issues Reminder" 104 | 105 | ## Testing redminder mail 106 | 107 | Send test mail without affecting inverval of schedule 108 | 109 | ```rake reminder:exec[test] RAILS_ENV="production"``` 110 | 111 | * The behavior of `rake reminder:exec` is to send email only if it is time to send a new email, regarding the interval parameters. If you execute `rake reminder:exec` manually, it will affact next scheduled transmission. 112 | * `rake reminder:exec[test]` is supposed to have exactly the same behavior as `rake reminder:exec`, except two things: 113 | * It does always send emails to issue assignees (no matter when the last execution was) 114 | * It does not affecting the next schedule of `rake reminder:exec`. 115 | 116 | ## Troubleshouting 117 | 118 | Make sure that: 119 | 120 | 1. You are using the branch which matches your redmine version. e.g. redmine2.0/redmine2.5/redmine2.6/master for lastest version 121 | 2. This plugin folder's name is redmine_**mail**_reminder 122 | 3. Your cron job executes without errors 123 | 124 | ### How can i customize the queries? 125 | 126 | Take a look at the official documentation about custom queries: 127 | http://www.redmine.org/projects/redmine/wiki/RedmineIssueList#Custom-queries 128 | 129 | ### I don't see the Reminder Settings 130 | 131 | Add permission to Your user. 132 | 133 | ### The issue reminder doesn't send mails 134 | 135 | We use redmine internal mail send functions, therefore the outgoing email settings 136 | has to be set in config/emai.yml or config/configuration.yml 137 | 138 | ### I can not use the windows scheduler (WinXP related) 139 | 140 | You need to have a user password set for your windows user in order to use the windows scheduler. See also here: http://technet.microsoft.com/en-us/library/cc785125(WS.10).aspx 141 | 142 | ## Translations 143 | 144 | - de by Michael Kling 145 | - en by Boško Ivanišević 146 | - sr-YU by Boško Ivanišević 147 | - sr by Boško Ivanišević 148 | 149 | Thanks for the contribution. 150 | 151 | ## To-Do List 152 | 153 | - Feature: `rake reminder:exec[reset_scheduler]` 154 | 155 | ## Changelog 156 | 157 | ### 2014/6/3 158 | 159 | - Inline CSS from site setting, What You See Is What You Get. Require `$ bundle install` 160 | 161 | ### 2014/5/23 162 | 163 | - Add a way to test by rake command 164 | - User can use all queries viviable at redmine page to set reminder. 165 | - Fix async_smtp can't 166 | - Fix compatibility with Redmine 2.5.1 167 | -------------------------------------------------------------------------------- /app/controllers/mail_reminders_controller.rb: -------------------------------------------------------------------------------- 1 | class MailRemindersController < ApplicationController 2 | unloadable 3 | 4 | before_filter :find_project 5 | before_filter :authorize, :only => :index 6 | 7 | def index 8 | needs_refresh = false 9 | @reminders = MailReminder.where(project_id: @project) 10 | @reminders.each do |reminder| 11 | if reminder.query.nil? 12 | reminder.destroy 13 | needs_refresh = true 14 | end 15 | end 16 | @reminders = MailReminder.where(project_id: @project) if needs_refresh 17 | @reminder = MailReminder.new 18 | end 19 | 20 | def create 21 | parameters = ActionController::Parameters.new(params[:reminder]) 22 | reminder = MailReminder.new(parameters.permit(:project_id, :query_id, :interval)) 23 | reminder.interval_value = params[:interval_value].to_i 24 | if reminder.save 25 | Role.find_all_givable.each do |role| 26 | if params[role.name.downcase] 27 | rr = ReminderRole.new 28 | rr.mail_reminder = reminder 29 | rr.role = role 30 | rr.save 31 | end 32 | end 33 | 34 | flash[:notice] = t :reminder_created 35 | else 36 | flash[:error] = t :reminder_not_created 37 | end 38 | render(:update) { |page| page.call 'location.reload(true)' } 39 | end 40 | 41 | def update 42 | reminder = MailReminder.find(params[:id]) 43 | if request.put? && reminder.update_attributes(params[:reminder]) 44 | reminder.interval_value = params[:interval_value] 45 | Role.find_all_givable.each do |role| 46 | if reminder.roles.include?(role) && params[role.name.downcase].nil? 47 | reminder.reminder_roles.find_by_role_id(role.id).destroy 48 | elsif params[role.name.downcase] && !reminder.roles.include?(role) 49 | rr = ReminderRole.new 50 | rr.mail_reminder = reminder 51 | rr.role = role 52 | rr.save 53 | end 54 | end 55 | 56 | reminder.save 57 | end 58 | render(:update) { |page| page.call 'location.reload' } 59 | end 60 | 61 | def destroy 62 | reminder = MailReminder.find(params[:id]) 63 | if reminder 64 | reminder.destroy 65 | end 66 | render(:update) {|page| page.call 'location.reload'} 67 | end 68 | 69 | def update_interval_values 70 | vals = MailReminder.interval_values_for(params[:interval]) 71 | begin 72 | reminder = MailReminder.find(params[:mail_reminder_id]) 73 | rescue ActiveRecord::RecordNotFound 74 | reminder = MailReminder.new 75 | end 76 | 77 | render :update do |page| 78 | page.replace_html "interval_values-#{params[:mail_reminder_id]}", 79 | :partial => 'interval_values', 80 | :locals => { :possible_values => vals, :selected_value => nil, :reminder => reminder} 81 | end 82 | end 83 | 84 | private 85 | 86 | def find_project 87 | begin 88 | @project = Project.find(params[:project_id]) 89 | rescue ActiveRecord::RecordNotFound 90 | @project = Project.find(params[:reminder][:project_id]) if params[:reminder] 91 | end 92 | end 93 | end 94 | -------------------------------------------------------------------------------- /app/helpers/mail_reminders_helper.rb: -------------------------------------------------------------------------------- 1 | module MailRemindersHelper 2 | 3 | include QueriesHelper 4 | 5 | def queries_for_options(project_id) 6 | # Project specific queries and global queries 7 | IssueQuery.visible.order("#{Query.table_name}.name ASC"). 8 | where(project_id.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", project_id]). 9 | collect {|q| [q.name, q.id]} 10 | end 11 | 12 | def reminders_intervals_for_options 13 | MailReminder.intervals.collect {|i| [l(i).capitalize, i.to_s]} 14 | end 15 | 16 | def content_for_column(column, issue) 17 | value = column.value(issue) 18 | 19 | case value.class.name 20 | when 'String' 21 | if column.name == :subject 22 | link_to issue.subject, issue_url(issue) 23 | else 24 | h(value) 25 | end 26 | when 'Time' 27 | format_time(value) 28 | when 'Date' 29 | format_date(value) 30 | when 'Fixnum', 'Float' 31 | if column.name == :done_ratio 32 | progress_bar(value, :width => '80px') 33 | elsif column.name == :id 34 | link_to h(value.to_s), issue_url(issue) 35 | else 36 | h(value.to_s) 37 | end 38 | when 'User' 39 | link_to "#{value.firstname} #{value.lastname}", user_url(value) 40 | when 'Project' 41 | link_to value.name, project_url(value) 42 | when 'Version' 43 | # Turn off link to version temporarly since 44 | # routes are not correct in the Redmine 45 | # version 1.2.1 46 | #link_to(h(value), version_url(value)) 47 | h(value.name) 48 | when 'TrueClass' 49 | l(:general_text_Yes) 50 | when 'FalseClass' 51 | l(:general_text_No) 52 | when 'Issue' 53 | link_to value.subject, issue_url(value) 54 | else 55 | column_content(column, issue) 56 | # h(value) 57 | end 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /app/models/mail_reminder.rb: -------------------------------------------------------------------------------- 1 | require "date" 2 | 3 | class MailReminder < ActiveRecord::Base 4 | include ActiveModel::ForbiddenAttributesProtection 5 | unloadable 6 | 7 | WEEKLY_INTERVAS = Date::DAYNAMES 8 | MONTHLY_INTERVALS = [1..31] 9 | 10 | has_many :reminder_roles, :dependent => :destroy 11 | has_many :roles, :through => :reminder_roles 12 | belongs_to :query 13 | belongs_to :project 14 | 15 | validates_presence_of :query_id 16 | 17 | def self.intervals 18 | [:daily, :weekly, :monthly] 19 | end 20 | 21 | def self.daily_intervals 22 | [:every_day, 23 | :every_second_day, 24 | :every_third_day, 25 | :every_fourth_day, 26 | :every_fifth_day, 27 | :every_sixth_day] 28 | end 29 | 30 | def self.weekly_intervals 31 | Date::DAYNAMES 32 | end 33 | 34 | def self.monthly_intervals 35 | (1..31).to_a 36 | end 37 | 38 | def self.interval_values_for(interval) 39 | case interval.to_s.downcase 40 | when("daily") 41 | daily_intervals.enum_for(:each_with_index).collect {|val,idx| [interval_value_display("daily", val), idx]} 42 | when("weekly") 43 | weekly_intervals.enum_for(:each_with_index).collect {|val,idx| [interval_value_display("weekly", val), idx]} 44 | when("monthly") 45 | monthly_intervals.enum_for(:each).collect {|val| [interval_value_display("monthly", val), val]} 46 | else 47 | [] 48 | end 49 | end 50 | 51 | def self.interval_value_display(interval, value) 52 | case interval 53 | when("daily") 54 | value = MailReminder.daily_intervals[value] if value.is_a? Integer 55 | l(value) 56 | when("weekly") 57 | value = Date::DAYNAMES[value] if value.is_a? Integer 58 | l(:every_weekly_format) % l(value.downcase.to_sym) 59 | when("monthly") 60 | l(:every_of_month_format) % value 61 | else 62 | "Unknown" 63 | end 64 | end 65 | 66 | def last_execute 67 | result = Time.now 68 | if executed_at.nil? || (updated_at > executed_at) 69 | result = updated_at 70 | else 71 | result = executed_at 72 | end 73 | return result 74 | end 75 | 76 | def execute? 77 | case interval 78 | when "daily" 79 | execute_daily? 80 | when "weekly" 81 | execute_weekly? 82 | when "monthly" 83 | execute_monthly? 84 | else 85 | false 86 | end 87 | end 88 | 89 | def execute_daily? 90 | return false if last_execute.to_date == DateTime.current.to_date 91 | 92 | diff = ((Time.now - last_execute) / 1.day).round.to_i 93 | return diff >= interval_value + 1 94 | end 95 | 96 | def execute_weekly? 97 | return false if last_execute.to_date == DateTime.current.to_date 98 | 99 | return Time.now.wday == interval_value 100 | end 101 | 102 | def execute_monthly? 103 | return false if last_execute.to_date == DateTime.current.to_date 104 | 105 | if Time::days_in_month(Time.now.month) < interval_value 106 | if Time.now.mday == Time.days_in_month(Time.now.month) 107 | return true 108 | else 109 | return false 110 | end 111 | else 112 | return Time.now.mday == interval_value 113 | end 114 | end 115 | 116 | attr_accessible :project_id, :query_id, :interval 117 | end 118 | -------------------------------------------------------------------------------- /app/models/mail_reminder_mailer.rb: -------------------------------------------------------------------------------- 1 | class MailReminderMailer < ActionMailer::Base 2 | helper :application 3 | helper :issues 4 | helper :mail_reminders 5 | include Redmine::I18n 6 | 7 | def self.default_url_options 8 | h = Setting.host_name 9 | h = h.to_s.gsub(%r{\/.*$}, '') unless Redmine::Utils.relative_url_root.blank? 10 | { :host => h, :protocol => Setting.protocol } 11 | end 12 | 13 | # Fixed: reminder mails are not sent when delivery_method is :async_smtp (#5058). 14 | def self.with_synched_deliveries(&block) 15 | saved_method = ActionMailer::Base.delivery_method 16 | if m = saved_method.to_s.match(%r{^async_(.+)$}) 17 | synched_method = m[1] 18 | ActionMailer::Base.delivery_method = synched_method.to_sym 19 | ActionMailer::Base.send "#{synched_method}_settings=", ActionMailer::Base.send("async_#{synched_method}_settings") 20 | end 21 | yield 22 | ensure 23 | ActionMailer::Base.delivery_method = saved_method 24 | end 25 | 26 | def issues_reminder(user, queries_data) 27 | User.current = user 28 | @queries_data = [] 29 | queries_data.each do |project, query| 30 | query.project = project 31 | issues = query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version]) 32 | @queries_data << [project, query, issues] if issues.any? 33 | end 34 | 35 | # Not Sending email if there are no issues 36 | original_delivery_method = ActionMailer::Base.delivery_method 37 | if @queries_data.empty? 38 | ActionMailer::Base.delivery_method = :test 39 | end 40 | 41 | headers['X-Mailer'] = 'Redmine' 42 | headers['X-Redmine-Host'] = Setting.host_name 43 | headers['X-Redmine-Site'] = Setting.app_title 44 | headers['X-Auto-Response-Suppress'] = 'OOF' 45 | headers['Auto-Submitted'] = 'auto-generated' 46 | headers['From'] = Setting.mail_from 47 | headers['List-Id'] = "<#{Setting.mail_from.to_s.gsub('@', '.')}>" 48 | 49 | set_language_if_valid user.language 50 | mail :to => user.mail, 51 | :from => Setting.mail_from, 52 | :subject => Setting.plugin_redmine_mail_reminder['issue_reminder_mail_subject'] || "Issue Reminder" 53 | ActionMailer::Base.delivery_method = original_delivery_method 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /app/models/reminder_role.rb: -------------------------------------------------------------------------------- 1 | class ReminderRole < ActiveRecord::Base 2 | unloadable 3 | belongs_to :mail_reminder 4 | belongs_to :role 5 | end 6 | -------------------------------------------------------------------------------- /app/views/mail_reminder_mailer/issues_reminder.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <% headers[:skip_premailer] = nil if headers[:skip_premailer] %> 6 | <%= stylesheet_link_tag '/stylesheets/application', 'jquery/jquery-ui-1.11.0', 'application', :media => 'all' %> 7 | 8 | <%= stylesheet_link_tag 'jquery/jquery-ui-1.11.0', 'application', 'responsive', :media => 'all' %> 9 | <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> 10 | <%= javascript_heads %> 11 | <%= heads_for_theme %> 12 | <%= call_hook :view_layouts_base_html_head %> 13 | 14 | <%= yield :header_tags -%> 15 | 16 | 17 | <% if Setting.plugin_redmine_mail_reminder['issue_reminder_mail_header'].present? %> 18 | <%= Redmine::WikiFormatting.to_html(Setting.text_formatting, Setting.plugin_redmine_mail_reminder['issue_reminder_mail_header']).html_safe %> 19 | <% end %> 20 | <% @queries_data.each do |project, query, issues| %> 21 |

<%= "#{project.name}: #{query.name}" %>

22 | 23 | 24 | 25 | <% query.columns.each do |col| %> 26 | 27 | <% end %> 28 | 29 | 30 | 31 | <% issues.each do |issue| %> 32 | 33 | <% query.columns.each do |column| %> 34 | 35 | <% end %> 36 | 37 | <% end %> 38 | 39 |
<%= col.caption %>
\"><%= raw "#{content_for_column(column, issue)}" %>
40 | <% end %> 41 | <% if Setting.plugin_redmine_mail_reminder['issue_reminder_mail_footer'].present? -%> 42 |
43 |
44 | 45 | <%= Redmine::WikiFormatting.to_html(Setting.text_formatting, Setting.plugin_redmine_mail_reminder['issue_reminder_mail_footer']).html_safe %> 46 | 47 | <% end -%> 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/views/mail_reminders/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= form_for(:reminder, :url => {:action => (reminder.new_record? ? :create : :update), :id => reminder}, :remote => true, :method => (reminder.new_record? ? :post : :put) ) do |f| %> 2 | <%= f.hidden_field :project_id, { :value => project.id } %> 3 |

4 | <%= f.label l(:query) %> 5 | <%= f.select :query_id, queries_for_options(project.id) %> 6 | <%= link_to l(:label_query_new), new_query_path, :class => 'icon icon-add' %> 7 |

8 |
9 | <%= f.label l(:interval) %> 10 | <%= f.select :interval, options_for_select(reminders_intervals_for_options, reminder.interval) %> 11 |
12 | <%= render :partial => 'interval_values', 13 | :locals => { :possible_values => MailReminder.interval_values_for(reminder.new_record? ? :daily : reminder.interval), 14 | :selected_value => reminder.interval_value, 15 | :reminder => reminder } %> 16 |

17 | <%= f.label l(:roles) %>:
18 |

19 | <% Role.find_all_givable.each do |role| %> 20 | <%= check_box_tag(role.name.downcase, role.id, reminder.roles.include?(role)) %> 21 | <%= label_tag(role.name.downcase, role.name) %>
22 | <% end %> 23 |

24 |

25 | <%= f.submit reminder.new_record? ? l(:add) : l(:save) %> 26 | 27 | <% unless reminder.new_record? %> 28 | <%= link_to_function l(:button_cancel), "$('#reminder-#{reminder.id}-edit').hide()" %>

29 | <% end %> 30 | <% end %> 31 | -------------------------------------------------------------------------------- /app/views/mail_reminders/_interval_values.erb: -------------------------------------------------------------------------------- 1 |
2 | <%= label(:interval, l(:value)) %>: 3 | <%= select_tag(:interval_value, options_for_select(possible_values, selected_value)) %> 4 |
5 | -------------------------------------------------------------------------------- /app/views/mail_reminders/index.html.erb: -------------------------------------------------------------------------------- 1 |

<%= l(:issues_reminder) %>

2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | <% @reminders.each do |reminder| %> 14 | 15 | 16 | 17 | 18 | 25 | 26 | 27 | 28 | 31 | 32 | 33 | <% end %> 34 | 35 |
<%= l(:query) %><%= l(:roles) %><%= l(:interval) %>
<%= link_to(h(reminder.query.name), :controller => 'queries', :action => 'edit', :id => reminder.query) %><%= reminder.roles.collect {|r| r.name}.join(',') %><%= MailReminder.interval_value_display(reminder.interval,reminder.interval_value) %> 19 | <%= link_to_function l(:button_edit), "$('#reminder-#{reminder.id}-edit').show()", :class => 'icon icon-edit' %> 20 | <%= link_to l(:button_delete), 21 | {:controller => 'mail_reminders', :action => :destroy, :id => reminder}, 22 | {:confirm => l(:reminder_delete_confirmation), :method => :delete, :remote => true, 23 | :title => l(:button_delete), :class => 'icon icon-del'} %> 24 |
36 |
37 | 38 |
39 |
40 | <%= l(:new_reminder) %> 41 | <%= render :partial => 'form', :locals => { :reminder => @reminder, :project => @project } %> 42 |
43 |
44 | 45 | 65 | -------------------------------------------------------------------------------- /app/views/reminder_settings/_issue_reminder_settings.erb: -------------------------------------------------------------------------------- 1 |

2 | <%= content_tag(:label, l(:mail_subject)) %> 3 | <%= text_field_tag 'settings[issue_reminder_mail_subject]', @settings['issue_reminder_mail_subject'], :size => 50 %> 4 |

5 |

6 | <%= content_tag(:label, l(:setting_emails_header)) %> 7 | <%= text_area_tag 'settings[issue_reminder_mail_header]', @settings['issue_reminder_mail_header'], rows: 5 %> 8 |

9 |

10 | <%= content_tag(:label, l(:setting_emails_footer)) %> 11 | <%= text_area_tag 'settings[issue_reminder_mail_footer]', @settings['issue_reminder_mail_footer'], rows: 5 %> 12 |

13 | -------------------------------------------------------------------------------- /config/locales/cs.yml: -------------------------------------------------------------------------------- 1 | # Czech strings go here for Rails i18n 2 | cs: 3 | :issues_reminder: "Připomenutí úkolů" 4 | :reminder_settings: "Nastavení připomínání" 5 | :daily: "Denně" 6 | :weekly: "Týdně" 7 | :monthly: "Měsíčně" 8 | :every_day: "Každý den" 9 | :every_second_day: "Každý druhý den" 10 | :every_third_day: "Každý třetí den" 11 | :every_fourth_day: "Každý čtvrtý den" 12 | :every_fifth_day: "Každý pátý den" 13 | :every_sixth_day: "Každý šestý den" 14 | :every_of_month_format: "Každou %s. měsíce" 15 | :every: "Every" 16 | :query: "Dotaz" 17 | :new_reminder: "Nová připomínka" 18 | :interval: "Interval" 19 | :sunday: "Neděle" 20 | :monday: "Pondělí" 21 | :tuesday: "Úterý" 22 | :wednesday: "Středa" 23 | :thursday: "Čtvrtek" 24 | :friday: "Pátek" 25 | :saturday: "Sobota" 26 | :every_weekly_format: "Každý %s" 27 | :add: "Přidat" 28 | :save: "Uložit" 29 | :roles: "Role" 30 | :reminder_delete_confirmation: "Opravdu si přejete odstranit tuto připomínku?" 31 | :default_email_subject: "Připomínky úkolů Redmine" 32 | :permission_view_issue_reminder: "Zobrazit připomínky úkolu" 33 | :reminder_created: "Připomínka vytvořena" 34 | :reminder_not_created: "Připomínka nebyla vytvořena" 35 | :mail_subject: "Předmět e-mailu" 36 | :value: "Hodnota" 37 | -------------------------------------------------------------------------------- /config/locales/de.yml: -------------------------------------------------------------------------------- 1 | # German strings go here for Rails i18n 2 | de: 3 | :issues_reminder: "Ticket Erinnerung" 4 | :reminder_settings: "Erinnerungs Einstellungen" 5 | :daily: "Täglich" 6 | :weekly: "Wöchentlich" 7 | :monthly: "Monatlich" 8 | :every_day: "Jeden Tag" 9 | :every_second_day: "Jeden zweiten Tag" 10 | :every_third_day: "Jeden dritten Tag" 11 | :every_fourth_day: "Jeden vierten Tag" 12 | :every_fifth_day: "Jeden fünften Tag" 13 | :every_sixth_day: "Jeden sechsten Tag" 14 | :every_of_month_format: "Jeden %s. des Monats" 15 | :every: "Jeden" 16 | :query: "Abfrage" 17 | :new_reminder: "Neue Erinnerung" 18 | :interval: "Interval" 19 | :sunday: "Sonntag" 20 | :monday: "Montag" 21 | :tuesday: "Dienstag" 22 | :wednesday: "Mittwoch" 23 | :thursday: "Donnerstag" 24 | :friday: "Freitag" 25 | :saturday: "Samstag" 26 | :every_weekly_format: "Jeden %s" 27 | :add: "Hinzufügen" 28 | :save: "Speichern" 29 | :roles: "Rollen" 30 | :reminder_delete_confirmation: "Wollen sie diese Erinnerung wirklich löschen?" 31 | :default_email_subject: "Redmine Ticket Erinnerung" 32 | :permission_view_issue_reminder: "Zeige Ticket Erinnerung" 33 | :reminder_created: "Erinnerung erfolgreich erstellt" 34 | :reminder_not_created: "Erinnerung nicht erstellt" 35 | :value: "Wert" 36 | -------------------------------------------------------------------------------- /config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # English strings go here for Rails i18n 2 | en: 3 | :issues_reminder: "Issues Reminder" 4 | :reminder_settings: "Reminder settings" 5 | :daily: "Daily" 6 | :weekly: "Weekly" 7 | :monthly: "Monthly" 8 | :every_day: "Every day" 9 | :every_second_day: "Every second day" 10 | :every_third_day: "Every third day" 11 | :every_fourth_day: "Every fourth day" 12 | :every_fifth_day: "Every fifth day" 13 | :every_sixth_day: "Every sixth day" 14 | :every_of_month_format: "Every %s. of month" 15 | :every: "Every" 16 | :query: "Query" 17 | :new_reminder: "New reminder" 18 | :interval: "Interval" 19 | :sunday: "Sunday" 20 | :monday: "Monday" 21 | :tuesday: "Tuesday" 22 | :wednesday: "Wednesday" 23 | :thursday: "Thursday" 24 | :friday: "Friday" 25 | :saturday: "Saturday" 26 | :every_weekly_format: "Every %s" 27 | :add: "Add" 28 | :save: "Save" 29 | :roles: "Roles" 30 | :reminder_delete_confirmation: "Do you really want to delete this reminder?" 31 | :default_email_subject: "Redmine Issue Reminder" 32 | :permission_view_issue_reminder: "View issue reminder" 33 | :reminder_created: "Reminder successfully created" 34 | :reminder_not_created: "Reminder not created" 35 | :mail_subject: "Mail Subject" 36 | :value: "Value" 37 | -------------------------------------------------------------------------------- /config/locales/es.yml: -------------------------------------------------------------------------------- 1 | # Spanish strings go here for Rails i18n 2 | es: 3 | :issues_reminder: "Recordatorios" 4 | :reminder_settings: "Configurar recordatorios" 5 | :daily: "Diario" 6 | :weekly: "Semanal" 7 | :monthly: "Mensual" 8 | :every_day: "Cada día" 9 | :every_second_day: "Cada segundo día" 10 | :every_third_day: "Cada tercer día" 11 | :every_fourth_day: "Cada cuarto día" 12 | :every_fifth_day: "Cada quinto día" 13 | :every_sixth_day: "Cada sexto día" 14 | :every_of_month_format: "El %s. de cada mes" 15 | :every: "Cada" 16 | :query: "Consulta" 17 | :new_reminder: "Nuevo recordatorio" 18 | :interval: "Intervalo" 19 | :sunday: "Domingo" 20 | :monday: "Lunes" 21 | :tuesday: "Martes" 22 | :wednesday: "Miércoles" 23 | :thursday: "Jueves" 24 | :friday: "Viernes" 25 | :saturday: "Sábado" 26 | :every_weekly_format: "Cada %s" 27 | :add: "Agregar" 28 | :save: "Guardar" 29 | :roles: "Roles" 30 | :reminder_delete_confirmation: "Realmente quiere borrar este recordatorio ?" 31 | :default_email_subject: "Recordatorio de peticiones Redmine" 32 | :permission_view_issue_reminder: "Ver Recordatorios" 33 | :reminder_created: "Recordatorio creado con éxito" 34 | :reminder_not_created: "Recordatorio no creado" 35 | :mail_subject: "Asunto del correo" 36 | :value: "Valor" 37 | -------------------------------------------------------------------------------- /config/locales/fr.yml: -------------------------------------------------------------------------------- 1 | # French strings go here for Rails i18n 2 | fr: 3 | :issues_reminder: "Rappel des demandes" 4 | :reminder_settings: "Paramétrage des rappels" 5 | :daily: "Journalier" 6 | :weekly: "Hebdomadère" 7 | :monthly: "Mensuel" 8 | :every_day: "Chaque jour" 9 | :every_second_day: "Chaque second jour" 10 | :every_third_day: "Chaque troisième jour" 11 | :every_fourth_day: "Chaque quatrième jour" 12 | :every_fifth_day: "Chaque cinquième jour" 13 | :every_sixth_day: "Chaque sixième jour" 14 | :every_of_month_format: "Chaque %s. du mois" 15 | :every: "Chaque" 16 | :query: "Rapport personnalisé" 17 | :new_reminder: "Nouveau rappel" 18 | :interval: "Intervalle" 19 | :sunday: "Dimanche" 20 | :monday: "Lundi" 21 | :tuesday: "Mardi" 22 | :wednesday: "Mercredi" 23 | :thursday: "Jeudi" 24 | :friday: "Vendredi" 25 | :saturday: "Samedi" 26 | :every_weekly_format: "Chaque %s" 27 | :add: "Ajouter" 28 | :save: "Enregistrer" 29 | :roles: "Rôles" 30 | :reminder_delete_confirmation: "Voulez-vous vraiment supprimer ce rappel ?" 31 | :default_email_subject: "Rappel des demandes Redmine" 32 | :permission_view_issue_reminder: "Voir les rappels des demandes" 33 | :reminder_created: "Rappel créé avec succès" 34 | :reminder_not_created: "Rappel non créé" 35 | :mail_subject: "Sujet de l'email" 36 | :value: "Valeur" 37 | -------------------------------------------------------------------------------- /config/locales/ja.yml: -------------------------------------------------------------------------------- 1 | # Japanese strings go here for Rails i18n 2 | ja: 3 | :project_module_issue_reminder: "メールリマインダー" 4 | :issues_reminder: "メールリマインダー" 5 | :reminder_settings: "リマインダー設定" 6 | :daily: "毎日" 7 | :weekly: "毎週" 8 | :monthly: "毎月" 9 | :every_day: "1日ごと" 10 | :every_second_day: "2日ごと" 11 | :every_third_day: "3日ごと" 12 | :every_fourth_day: "4日ごと" 13 | :every_fifth_day: "5日ごと" 14 | :every_sixth_day: "6日ごと" 15 | :every_of_month_format: "毎月 %s日" 16 | :every: "ごと" 17 | :query: "クエリ" 18 | :new_reminder: "新しいリマインダー" 19 | :interval: "間隔" 20 | :sunday: "日曜日" 21 | :monday: "月曜日" 22 | :tuesday: "火曜日" 23 | :wednesday: "水曜日" 24 | :thursday: "木曜日" 25 | :friday: "金曜日" 26 | :saturday: "土曜日" 27 | :every_weekly_format: "毎週 %s" 28 | :add: "追加" 29 | :save: "保存" 30 | :roles: "ロール" 31 | :reminder_delete_confirmation: "このリマインダーを本当に削除しますか?" 32 | :default_email_subject: "Redmine メールリマインダー" 33 | :permission_view_issue_reminder: "メールリマインダーの表示" 34 | :reminder_created: "リマインダーが作成されました" 35 | :reminder_not_created: "リマインダーが作成されませんでした" 36 | :mail_subject: "メール件名" 37 | :value: "値" 38 | -------------------------------------------------------------------------------- /config/locales/ru.yml: -------------------------------------------------------------------------------- 1 | # Russian strings go here for Rails i18n 2 | ru: 3 | :issues_reminder: "Оповещение о задачах" 4 | :reminder_settings: "Настройки оповещения" 5 | :daily: "Ежедневно" 6 | :weekly: "Еженедельно" 7 | :monthly: "Ежемесячно" 8 | :every_day: "Каждый день" 9 | :every_second_day: "Каждый второй день" 10 | :every_third_day: "Каждый третий день" 11 | :every_fourth_day: "Каждый четвертый день" 12 | :every_fifth_day: "Каждый пятый день" 13 | :every_sixth_day: "Каждый шестой день" 14 | :every_of_month_format: "Каждый %s. день месяца" 15 | :every: "Каждый" 16 | :query: "Запрос" 17 | :new_reminder: "Новое оповещение" 18 | :interval: "Интервал" 19 | :sunday: "Воскресенье" 20 | :monday: "Понедельник" 21 | :tuesday: "Вторник" 22 | :wednesday: "Среда" 23 | :thursday: "Четверг" 24 | :friday: "Пятница" 25 | :saturday: "Суббота" 26 | :every_weekly_format: "Каждый %s" 27 | :add: "Добавить" 28 | :save: "Сохранить" 29 | :roles: "Роли" 30 | :reminder_delete_confirmation: "Вы действительно хотите удалить это оповещение?" 31 | :default_email_subject: "Оповещение о задачах redmine" 32 | :permission_view_issue_reminder: "Просмотреть оповещение о задачах" 33 | :reminder_created: "Оповещение успешно создано" 34 | :reminder_not_created: "Оповещение не создано" 35 | :mail_subject: "Тема письма" 36 | :value: "Значение" 37 | -------------------------------------------------------------------------------- /config/locales/sr-YU.yml: -------------------------------------------------------------------------------- 1 | # Serbian Latin stings go here 2 | sr-YU: 3 | :issues_reminder: "Potsetnik zadataka" 4 | :reminder_settings: "Podešavanja potsetnika" 5 | :new_reminder: "Novi potsetnik" 6 | :daily: "Dnevno" 7 | :weekly: "Nedeljno" 8 | :monthly: "Mesečno" 9 | :every_day: "Svaki dan" 10 | :every_second_day: "Svaki drugi dan" 11 | :every_third_day: "Svaki treći dan" 12 | :every_fourth_day: "Svaki četvrti dan" 13 | :every_fifth_day: "Svaki peti dan" 14 | :every_sixth_day: "Svaki šesti dan" 15 | :every_of_month_format: "Svaki %s. u mesecu" 16 | :every: "Svaki" 17 | :query: "Upit" 18 | :new_reminder: "Novi potsetnik" 19 | :interval: "Interval" 20 | :sunday: "nedelja" 21 | :monday: "ponedeljak" 22 | :tuesday: "utorak" 23 | :wednesday: "sreda" 24 | :thursday: "četvrtak" 25 | :friday: "petak" 26 | :saturday: "subota" 27 | :every_weekly_format: "Svaki %s" 28 | :add: "Dodaj" 29 | :save: "Snimi" 30 | :roles: "Uloge" 31 | :reminder_delete_confirmation: "Da li ste sigurni da želite da obrišete ovaj potsetnik?" 32 | :default_email_subject: "Redmin potsetnik zadataka" 33 | :permission_view_issue_reminder: "Vidljiv potsetnik zadataka" 34 | :reminder_created: "Potsetnik uspešno kreiran" 35 | :reminder_not_created: "Potsetnik nije kreiran" 36 | :mail_subject: "Naslov poruke" 37 | :value: "Vrednost:" 38 | -------------------------------------------------------------------------------- /config/locales/sr.yml: -------------------------------------------------------------------------------- 1 | # Serbian Cyrillic stings go here 2 | sr: 3 | :issues_reminder: "Потсетник задатака" 4 | :reminder_settings: "Подешавања потсетника" 5 | :daily: "Дневно" 6 | :weekly: "Недељно" 7 | :monthly: "Месечно" 8 | :every_day: "Сваки дан" 9 | :every_second_day: "Сваки други дан" 10 | :every_third_day: "Сваки трећи дан" 11 | :every_fourth_day: "Сваки четврти дан" 12 | :every_fifth_day: "Сваки пети дан" 13 | :every_sixth_day: "Сваки шести дан" 14 | :every_of_month_format: "Сваки %s. у месецу" 15 | :every: "Сваки" 16 | :query: "Упит" 17 | :new_reminder: "Нови потсетник" 18 | :interval: "Интервал" 19 | :sunday: "недеља" 20 | :monday: "понедељак" 21 | :tuesday: "уторак" 22 | :wednesday: "среда" 23 | :thursday: "четвртак" 24 | :friday: "петак" 25 | :saturday: "субота" 26 | :every_weekly_format: "Сваки %s" 27 | :add: "Додај" 28 | :save: "Сними" 29 | :roles: "Улоге" 30 | :reminder_delete_confirmation: "Да ли сте сигурни да желите да обришете овј потсетник?" 31 | :default_email_subject: "Редмин потсетник задатака" 32 | :permission_view_issue_reminder: "Видљив потсетник задатака" 33 | :reminder_created: "Потсетник успешно креиран" 34 | :reminder_not_created: "Потсетник није креиран" 35 | :mail_subject: "Наслов поруке" 36 | :value: "Вредност" 37 | -------------------------------------------------------------------------------- /config/locales/tr.yml: -------------------------------------------------------------------------------- 1 | # Turkish strings go here for Rails i18n 2 | tr: 3 | :issues_reminder: "İş Hatırlatıcı" 4 | :reminder_settings: "Hatırlatma Ayarları" 5 | :daily: "Günlük" 6 | :weekly: "Haftalık" 7 | :monthly: "Aylık" 8 | :every_day: "Her gün" 9 | :every_second_day: "İki günde bir" 10 | :every_third_day: "Üç günde bir" 11 | :every_fourth_day: "Dört günde bir" 12 | :every_fifth_day: "Beş günde bir" 13 | :every_sixth_day: "Altı günde bir" 14 | :every_of_month_format: "Her ayın %s. günü" 15 | :every: "Her" 16 | :query: "Sorgu" 17 | :new_reminder: "Yeni hatırlatıcı" 18 | :interval: "Aralığı" 19 | :sunday: "Pazar" 20 | :monday: "Pazartesi" 21 | :tuesday: "Salı" 22 | :wednesday: "Çarşamba" 23 | :thursday: "Perşembe" 24 | :friday: "Cuma" 25 | :saturday: "Cumartesi" 26 | :every_weekly_format: "Her %s" 27 | :add: "Ekle" 28 | :save: "Kaydet" 29 | :roles: "Roller" 30 | :reminder_delete_confirmation: "Bu hatırlatıcıyı silmek istiyor musunuz?" 31 | :default_email_subject: "İş Hatırlatıcı" 32 | :permission_view_issue_reminder: "İş hatırlatıcıyı görme" 33 | :reminder_created: "Hatırlatıcı yaratıldı" 34 | :reminder_not_created: "Hatırlatıcı yaratılamadı" 35 | :mail_subject: "E-posta başlığı" 36 | :value: "Değer" 37 | -------------------------------------------------------------------------------- /config/locales/uk.yml: -------------------------------------------------------------------------------- 1 | # Ukrainian strings go here for Rails i18n 2 | uk: 3 | :issues_reminder: "Нагадування про завдання" 4 | :reminder_settings: "Налаштування нагадування" 5 | :daily: "Щодня" 6 | :weekly: "Щотижня" 7 | :monthly: "Щомісяця" 8 | :every_day: "Кожен день" 9 | :every_second_day: "Кожен другий день" 10 | :every_third_day: "Кожен третій день" 11 | :every_fourth_day: "Кожен четвертий день" 12 | :every_fifth_day: "Кожен п'ятий день" 13 | :every_sixth_day: "Кожен шостий день" 14 | :every_of_month_format: "Кожен %s. день місяця" 15 | :every: "Кожен" 16 | :query: "Запит" 17 | :new_reminder: "Нове нагадування" 18 | :interval: "Інтервал" 19 | :sunday: "Неділя" 20 | :monday: "Понеділок" 21 | :tuesday: "Вівторок" 22 | :wednesday: "Середа" 23 | :thursday: "Четверг" 24 | :friday: "П'ятниця" 25 | :saturday: "Субота" 26 | :every_weekly_format: "Кожен %s" 27 | :add: "Додати" 28 | :save: "Зберегти" 29 | :roles: "Ролі" 30 | :reminder_delete_confirmation: "Ви дійсно хочете видалити це нагадування?" 31 | :default_email_subject: "Нагадування про завдання redmine" 32 | :permission_view_issue_reminder: "Переглянути нагадування про завдання" 33 | :reminder_created: "Нагадування успішно створено" 34 | :reminder_not_created: "Сповіщення не створено" 35 | :mail_subject: "Тема листа" 36 | :value: "Значення" 37 | -------------------------------------------------------------------------------- /config/locales/zh-TW.yml: -------------------------------------------------------------------------------- 1 | # Traditional Chinese strings go here for Rails i18n 2 | zh-TW: 3 | :issues_reminder: "郵件提醒" 4 | :reminder_settings: "提醒設定" 5 | :daily: "每日" 6 | :weekly: "每週" 7 | :monthly: "每月" 8 | :every_day: "每一天" 9 | :every_second_day: "每兩天" 10 | :every_third_day: "每三天" 11 | :every_fourth_day: "每四天" 12 | :every_fifth_day: "每五天" 13 | :every_sixth_day: "每六天" 14 | :every_of_month_format: "每月的 %s. " 15 | :every: "每" 16 | :query: "自訂查詢" 17 | :new_reminder: "新增提醒" 18 | :interval: "間隔設置" 19 | :sunday: "周日" 20 | :monday: "週一" 21 | :tuesday: "週二" 22 | :wednesday: "週三" 23 | :thursday: "週四" 24 | :friday: "週五" 25 | :saturday: "週六" 26 | :every_weekly_format: "每週的 %s" 27 | :add: "新增" 28 | :save: "保存" 29 | :roles: "角色" 30 | :reminder_delete_confirmation: "刪除該提醒設定?" 31 | :default_email_subject: "Redmine 問題處理情況提醒!" 32 | :permission_view_issue_reminder: "查看問題提醒設定" 33 | :reminder_created: "提醒設定已新增!" 34 | :reminder_not_created: "提醒設定未創建。" 35 | :mail_subject: "郵件主題" 36 | :value: "間隔取值" 37 | -------------------------------------------------------------------------------- /config/locales/zh.yml: -------------------------------------------------------------------------------- 1 | # Simplified Chinese strings go here for Rails i18n 2 | zh: 3 | :issues_reminder: "问题提醒" 4 | :reminder_settings: "提醒设置" 5 | :daily: "每日" 6 | :weekly: "每周" 7 | :monthly: "每月" 8 | :every_day: "每一天" 9 | :every_second_day: "每两天" 10 | :every_third_day: "每三天" 11 | :every_fourth_day: "每四天" 12 | :every_fifth_day: "每五天" 13 | :every_sixth_day: "每六天" 14 | :every_of_month_format: "每月的 %s. " 15 | :every: "每" 16 | :query: "查询" 17 | :new_reminder: "添加提醒" 18 | :interval: "间隔设置" 19 | :sunday: "周日" 20 | :monday: "周一" 21 | :tuesday: "周二" 22 | :wednesday: "周三" 23 | :thursday: "周四" 24 | :friday: "周五" 25 | :saturday: "周六" 26 | :every_weekly_format: "每周的 %s" 27 | :add: "添加" 28 | :save: "保存" 29 | :roles: "角色" 30 | :reminder_delete_confirmation: "删除该提醒配置?" 31 | :default_email_subject: "Redmine 问题处理情况提醒!" 32 | :permission_view_issue_reminder: "查看问题提醒配置" 33 | :reminder_created: "提醒配置已添加!" 34 | :reminder_not_created: "提醒配置未创建。" 35 | :mail_subject: "邮件主题" 36 | :value: "间隔取值" 37 | -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | resources :mail_reminders do 2 | post 'update_interval_values', :on => :collection 3 | end 4 | 5 | resources :query 6 | -------------------------------------------------------------------------------- /db/migrate/001_create_reminders.rb: -------------------------------------------------------------------------------- 1 | class CreateReminders < ActiveRecord::Migration 2 | def self.up 3 | create_table :reminders do |t| 4 | t.column :project_id, :integer 5 | t.column :query_id, :integer 6 | t.column :interval, :string, :limit => 30 7 | t.column :interval_value, :integer 8 | t.column :executed_at, :datetime 9 | t.timestamps 10 | end 11 | end 12 | 13 | def self.down 14 | drop_table :reminders 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /db/migrate/002_create_reminder_roles.rb: -------------------------------------------------------------------------------- 1 | class CreateReminderRoles < ActiveRecord::Migration 2 | def self.up 3 | create_table :reminder_roles do |t| 4 | t.column :reminder_id, :integer 5 | t.column :role_id, :integer 6 | end 7 | end 8 | 9 | def self.down 10 | drop_table :reminder_roles 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/003_rename_reminders_to_issue_reminders.rb: -------------------------------------------------------------------------------- 1 | class RenameRemindersToIssueReminders < ActiveRecord::Migration 2 | def self.up 3 | rename_table :reminders, :issue_reminders 4 | end 5 | 6 | def self.down 7 | rename_table :issue_reminders, :reminders 8 | end 9 | end -------------------------------------------------------------------------------- /db/migrate/004_rename_reminders_id_to_issue_reminders_id_in_reminder_role.rb: -------------------------------------------------------------------------------- 1 | class RenameRemindersIdToIssueRemindersIdInReminderRole < ActiveRecord::Migration 2 | def self.up 3 | rename_column :reminder_roles, :reminder_id, :issue_reminder_id 4 | end 5 | 6 | def self.down 7 | rename_column :reminder_roles, :issue_reminder_id, :reminder_id 8 | end 9 | end -------------------------------------------------------------------------------- /db/migrate/005_rename_issue_reminders_to_mail_reminders.rb: -------------------------------------------------------------------------------- 1 | class RenameIssueRemindersToMailReminders < ActiveRecord::Migration 2 | def self.up 3 | rename_table :issue_reminders, :mail_reminders 4 | end 5 | 6 | def self.down 7 | rename_table :mail_reminders, :issue_reminders 8 | end 9 | end -------------------------------------------------------------------------------- /db/migrate/006_rename_issue_reminders_id_to_mail_reminders_id_in_reminder_role.rb: -------------------------------------------------------------------------------- 1 | class RenameIssueRemindersIdToMailRemindersIdInReminderRole < ActiveRecord::Migration 2 | def self.up 3 | rename_column :reminder_roles, :issue_reminder_id, :mail_reminder_id 4 | end 5 | 6 | def self.down 7 | rename_column :reminder_roles, :mail_reminder_id, :issue_reminder_id 8 | end 9 | end -------------------------------------------------------------------------------- /init.rb: -------------------------------------------------------------------------------- 1 | require 'redmine' 2 | require 'active_support/core_ext' 3 | 4 | # This plugin should be reloaded in development mode. 5 | if Rails.env == 'development' 6 | ActiveSupport::Dependencies.autoload_once_paths.reject!{|x| x =~ /^#{Regexp.escape(File.dirname(__FILE__))}/} 7 | end 8 | 9 | # Tentative de faire fonctionner le plugin sous Rails 3 10 | ActionDispatch::Callbacks.to_prepare do 11 | # use require_dependency if you plan to utilize development mode 12 | require 'boards_watchers_patches' 13 | end 14 | 15 | ActionMailer::Base.default :skip_premailer => true 16 | 17 | require 'premailer_ext/file_system_loader_extensions' 18 | 19 | Redmine::Plugin.register :redmine_mail_reminder do 20 | name 'Redmine Mail Reminder plugin' 21 | author 'Jethro' 22 | description 'Issue reminder plugin for Redmine, based on Ascendro S.R.L version https://github.com/ascendro/redmine_issue_reminder ' 23 | version '3.0.1' 24 | url 'https://github.com/Hopebaytech/redmine_mail_reminder' 25 | 26 | permission :view_issue_reminder, :mail_reminders => :index 27 | 28 | settings( :default => { 'email_subject' => :default_email_subject}, 29 | :partial => 'reminder_settings/issue_reminder_settings') 30 | 31 | project_module :issue_reminder do 32 | permission :view_issue_reminder, :mail_reminders => :index 33 | end 34 | 35 | if_proc = Proc.new{|project| project.enabled_module_names.include?('issue_reminder')} 36 | menu :project_menu, 37 | :issue_reminder, 38 | { :controller => 'mail_reminders', :action => 'index' }, 39 | :caption => :issues_reminder, 40 | :last => true, 41 | #:after => :activity, 42 | :param => :project_id, 43 | :if => if_proc 44 | 45 | # menu :application_menu, :issue_reminder, { :controller => 'reminders', :action => 'index' }, :caption => :usses_reminder 46 | 47 | end 48 | -------------------------------------------------------------------------------- /lang/de.yml: -------------------------------------------------------------------------------- 1 | # German strings go here for Rails i18n 2 | de: 3 | :issues_reminder: "Ticket Erinnerung" 4 | :reminder_settings: "Erinnerungs Einstellungen" 5 | :daily: "Täglich" 6 | :weekly: "Wöchentlich" 7 | :monthly: "Monatlich" 8 | :every_day: "Jeden Tag" 9 | :every_second_day: "Jeden zweiten Tag" 10 | :every_third_day: "Jeden dritten Tag" 11 | :every_fourth_day: "Jeden vierten Tag" 12 | :every_fifth_day: "Jeden fünften Tag" 13 | :every_sixth_day: "Jeden sechsten Tag" 14 | :every_of_month_format: "Jeden %s. des Monats" 15 | :every: "Jeden" 16 | :query: "Abfrage" 17 | :new_reminder: "Neue Erinnerung" 18 | :interval: "Interval" 19 | :sunday: "Sonntag" 20 | :monday: "Montag" 21 | :tuesday: "Dienstag" 22 | :wednesday: "Mittwoch" 23 | :thursday: "Donnerstag" 24 | :friday: "Freitag" 25 | :saturday: "Samstag" 26 | :every_weekly_format: "Jeden %s" 27 | :add: "Hinzufügen" 28 | :save: "Speichern" 29 | :roles: "Rollen" 30 | :reminder_delete_confirmation: "Wollen sie diese Erinnerung wirklich löschen?" 31 | :default_email_subject: "Redmine Ticket Erinnerung" 32 | :permission_view_issue_reminder: "Zeige Ticket Erinnerung" 33 | :reminder_created: "Erinnerung erfolgreich erstellt" 34 | :reminder_not_created: "Erinnerung nicht erstellt" 35 | :value: "Wert" 36 | -------------------------------------------------------------------------------- /lang/en.yml: -------------------------------------------------------------------------------- 1 | # English strings go here for Rails i18n 2 | en: 3 | :issues_reminder: "Issues Reminder" 4 | :reminder_settings: "Reminder settings" 5 | :daily: "Daily" 6 | :weekly: "Weekly" 7 | :monthly: "Monthly" 8 | :every_day: "Every day" 9 | :every_second_day: "Every second day" 10 | :every_third_day: "Every third day" 11 | :every_fourth_day: "Every fourth day" 12 | :every_fifth_day: "Every fifth day" 13 | :every_sixth_day: "Every sixth day" 14 | :every_of_month_format: "Every %s. of month" 15 | :every: "Every" 16 | :query: "Query" 17 | :new_reminder: "New reminder" 18 | :interval: "Interval" 19 | :sunday: "Sunday" 20 | :monday: "Monday" 21 | :tuesday: "Tuesday" 22 | :wednesday: "Wednesday" 23 | :thursday: "Thursday" 24 | :friday: "Friday" 25 | :saturday: "Saturday" 26 | :every_weekly_format: "Every %s" 27 | :add: "Add" 28 | :save: "Save" 29 | :roles: "Roles" 30 | :reminder_delete_confirmation: "Do you really want to delete this reminder?" 31 | :default_email_subject: "Redmine Issue Reminder" 32 | :permission_view_issue_reminder: "View issue reminder" 33 | :reminder_created: "Reminder successfully created" 34 | :reminder_not_created: "Reminder not created" 35 | :mail_subject: "Mail Subject" 36 | :value: "Value" 37 | -------------------------------------------------------------------------------- /lang/fr.yml: -------------------------------------------------------------------------------- 1 | # French strings go here for Rails i18n 2 | fr: 3 | :issues_reminder: "Rappel des demandes" 4 | :reminder_settings: "Paramétrage des rappels" 5 | :daily: "Journalier" 6 | :weekly: "Hebdomadaire" 7 | :monthly: "Mensuel" 8 | :every_day: "Chaque jour" 9 | :every_second_day: "Chaque second jour" 10 | :every_third_day: "Chaque troisième jour" 11 | :every_fourth_day: "Chaque quatrième jour" 12 | :every_fifth_day: "Chaque cinquième jour" 13 | :every_sixth_day: "Chaque sixième jour" 14 | :every_of_month_format: "Chaque %s. du mois" 15 | :every: "Chaque" 16 | :query: "Rapport personnalisé" 17 | :new_reminder: "Nouveau rappel" 18 | :interval: "Intervalle" 19 | :sunday: "Dimanche" 20 | :monday: "Lundi" 21 | :tuesday: "Mardi" 22 | :wednesday: "Mercredi" 23 | :thursday: "Jeudi" 24 | :friday: "Vendredi" 25 | :saturday: "Samedi" 26 | :every_weekly_format: "Chaque %s" 27 | :add: "Ajouter" 28 | :save: "Enregistrer" 29 | :roles: "Rôles" 30 | :reminder_delete_confirmation: "Voulez-vous vraiment supprimer ce rappel ?" 31 | :default_email_subject: "Rappel des demandes Redmine" 32 | :permission_view_issue_reminder: "Voir les rappels des demandes" 33 | :reminder_created: "Rappel créé avec succès" 34 | :reminder_not_created: "Rappel non créé" 35 | :mail_subject: "Sujet de l'email" 36 | :value: "Valeur" 37 | -------------------------------------------------------------------------------- /lang/pl.yml: -------------------------------------------------------------------------------- 1 | # Polish strings go here for Rails i18n 2 | pl: 3 | :issues_reminder: "Przypominanie o zagadnieniach" 4 | :reminder_settings: "Ustawienia przypomnień" 5 | :daily: "Dzienne" 6 | :weekly: "Tygodniowe" 7 | :monthly: "Miesięczne" 8 | :every_day: "codziennie" 9 | :every_second_day: "Co drugi dzień" 10 | :every_third_day: "Co trzy dni" 11 | :every_fourth_day: "Co cztery dni" 12 | :every_fifth_day: "Co pięć dni" 13 | :every_sixth_day: "Co sześć dni" 14 | :every_of_month_format: "Każdy %s. miesiąca" 15 | :every: "Każdego" 16 | :query: "Zapytanie" 17 | :new_reminder: "Nowe przypomnienie" 18 | :interval: "Interwał" 19 | :sunday: "Niedziela" 20 | :monday: "Poniedziałek" 21 | :tuesday: "Tuesday" 22 | :wednesday: "Środa" 23 | :thursday: "Czwartek" 24 | :friday: "Piątek" 25 | :saturday: "Sobota" 26 | :every_weekly_format: "Każdy %s" 27 | :add: "Dodaj" 28 | :save: "Sapisz" 29 | :roles: "Role" 30 | :reminder_delete_confirmation: "Czy chcesz usunąć to przypomnienie?" 31 | :default_email_subject: "Przypomnienia o zadagnieniach" 32 | :permission_view_issue_reminder: "Wyświetl przypomnienie o problemie" 33 | :reminder_created: "Przypomnieni poprawnie utworzone" 34 | :reminder_not_created: "Przyponienie nie zostało utworzone" 35 | :mail_subject: "Tytył maila" 36 | :value: "Wartość" 37 | -------------------------------------------------------------------------------- /lang/ru.yml: -------------------------------------------------------------------------------- 1 | # Russian strings go here for Rails i18n 2 | ru: 3 | :issues_reminder: "Оповещение о задачах" 4 | :reminder_settings: "Настройки оповещения" 5 | :daily: "Ежедневно" 6 | :weekly: "Еженедельно" 7 | :monthly: "Ежемесячно" 8 | :every_day: "Каждый день" 9 | :every_second_day: "Каждый второй день" 10 | :every_third_day: "Каждый третий день" 11 | :every_fourth_day: "Каждый четвертый день" 12 | :every_fifth_day: "Каждый пятый день" 13 | :every_sixth_day: "Каждый шестой день" 14 | :every_of_month_format: "Каждый %s. день месяца" 15 | :every: "Каждый" 16 | :query: "Запрос" 17 | :new_reminder: "Новое оповещение" 18 | :interval: "Интервал" 19 | :sunday: "Воскресенье" 20 | :monday: "Понедельник" 21 | :tuesday: "Вторник" 22 | :wednesday: "Среда" 23 | :thursday: "Четверг" 24 | :friday: "Пятница" 25 | :saturday: "Суббота" 26 | :every_weekly_format: "Каждый %s" 27 | :add: "Добавить" 28 | :save: "Сохранить" 29 | :roles: "Роли" 30 | :reminder_delete_confirmation: "Вы действительно хотите удалить это оповещение?" 31 | :default_email_subject: "Оповещение о задачах redmine" 32 | :permission_view_issue_reminder: "Просмотреть оповещение о задачах" 33 | :reminder_created: "Оповещение успешно создано" 34 | :reminder_not_created: "Оповещение не создано" 35 | :mail_subject: "Тема письма" 36 | :value: "Значение" 37 | -------------------------------------------------------------------------------- /lang/sr-YU.yml: -------------------------------------------------------------------------------- 1 | # Serbian Latin stings go here 2 | sr-YU: 3 | :issues_reminder: "Potsetnik zadataka" 4 | :reminder_settings: "Podešavanja potsetnika" 5 | :new_reminder: "Novi potsetnik" 6 | :daily: "Dnevno" 7 | :weekly: "Nedeljno" 8 | :monthly: "Mesečno" 9 | :every_day: "Svaki dan" 10 | :every_second_day: "Svaki drugi dan" 11 | :every_third_day: "Svaki treći dan" 12 | :every_fourth_day: "Svaki četvrti dan" 13 | :every_fifth_day: "Svaki peti dan" 14 | :every_sixth_day: "Svaki šesti dan" 15 | :every_of_month_format: "Svaki %s. u mesecu" 16 | :every: "Svaki" 17 | :query: "Upit" 18 | :new_reminder: "Novi potsetnik" 19 | :interval: "Interval" 20 | :sunday: "nedelja" 21 | :monday: "ponedeljak" 22 | :tuesday: "utorak" 23 | :wednesday: "sreda" 24 | :thursday: "četvrtak" 25 | :friday: "petak" 26 | :saturday: "subota" 27 | :every_weekly_format: "Svaki %s" 28 | :add: "Dodaj" 29 | :save: "Snimi" 30 | :roles: "Uloge" 31 | :reminder_delete_confirmation: "Da li ste sigurni da želite da obrišete ovaj potsetnik?" 32 | :default_email_subject: "Redmin potsetnik zadataka" 33 | :permission_view_issue_reminder: "Vidljiv potsetnik zadataka" 34 | :reminder_created: "Potsetnik uspešno kreiran" 35 | :reminder_not_created: "Potsetnik nije kreiran" 36 | :mail_subject: "Naslov poruke" 37 | :value: "Vrednost: 38 | -------------------------------------------------------------------------------- /lang/sr.yml: -------------------------------------------------------------------------------- 1 | # Serbian Cyrillic stings go here 2 | sr: 3 | :issues_reminder: "Потсетник задатака" 4 | :reminder_settings: "Подешавања потсетника" 5 | :daily: "Дневно" 6 | :weekly: "Недељно" 7 | :monthly: "Месечно" 8 | :every_day: "Сваки дан" 9 | :every_second_day: "Сваки други дан" 10 | :every_third_day: "Сваки трећи дан" 11 | :every_fourth_day: "Сваки четврти дан" 12 | :every_fifth_day: "Сваки пети дан" 13 | :every_sixth_day: "Сваки шести дан" 14 | :every_of_month_format: "Сваки %s. у месецу" 15 | :every: "Сваки" 16 | :query: "Упит" 17 | :new_reminder: "Нови потсетник" 18 | :interval: "Интервал" 19 | :sunday: "недеља" 20 | :monday: "понедељак" 21 | :tuesday: "уторак" 22 | :wednesday: "среда" 23 | :thursday: "четвртак" 24 | :friday: "петак" 25 | :saturday: "субота" 26 | :every_weekly_format: "Сваки %s" 27 | :add: "Додај" 28 | :save: "Сними" 29 | :roles: "Улоге" 30 | :reminder_delete_confirmation: "Да ли сте сигурни да желите да обришете овј потсетник?" 31 | :default_email_subject: "Редмин потсетник задатака" 32 | :permission_view_issue_reminder: "Видљив потсетник задатака" 33 | :reminder_created: "Потсетник успешно креиран" 34 | :reminder_not_created: "Потсетник није креиран" 35 | :mail_subject: "Наслов поруке" 36 | :value: "Вредност" 37 | -------------------------------------------------------------------------------- /lang/uk.yml: -------------------------------------------------------------------------------- 1 | # Ukrainian strings go here for Rails i18n 2 | uk: 3 | :issues_reminder: "Нагадування про завдання" 4 | :reminder_settings: "Налаштування нагадування" 5 | :daily: "Щодня" 6 | :weekly: "Щотижня" 7 | :monthly: "Щомісяця" 8 | :every_day: "Кожен день" 9 | :every_second_day: "Кожен другий день" 10 | :every_third_day: "Кожен третій день" 11 | :every_fourth_day: "Кожен четвертий день" 12 | :every_fifth_day: "Кожен п'ятий день" 13 | :every_sixth_day: "Кожен шостий день" 14 | :every_of_month_format: "Кожен %s. день місяця" 15 | :every: "Кожен" 16 | :query: "Запит" 17 | :new_reminder: "Нове нагадування" 18 | :interval: "Інтервал" 19 | :sunday: "Неділя" 20 | :monday: "Понеділок" 21 | :tuesday: "Вівторок" 22 | :wednesday: "Середа" 23 | :thursday: "Четверг" 24 | :friday: "П'ятниця" 25 | :saturday: "Субота" 26 | :every_weekly_format: "Кожен %s" 27 | :add: "Додати" 28 | :save: "Зберегти" 29 | :roles: "Ролі" 30 | :reminder_delete_confirmation: "Ви дійсно хочете видалити це нагадування?" 31 | :default_email_subject: "Нагадування про завдання redmine" 32 | :permission_view_issue_reminder: "Переглянути нагадування про завдання" 33 | :reminder_created: "Нагадування успішно створено" 34 | :reminder_not_created: "Сповіщення не створено" 35 | :mail_subject: "Тема листа" 36 | :value: "Значення" 37 | -------------------------------------------------------------------------------- /lib/boards_watchers_patches.rb: -------------------------------------------------------------------------------- 1 | # use require_dependency if you plan to utilize development mode 2 | require_dependency 'application_helper' 3 | 4 | module BoardsWatchers 5 | module Patches 6 | module ApplicationHelperPatch 7 | def self.included(base) # :nodoc: 8 | # sending instance methods to module 9 | base.send(:include, InstanceMethods) 10 | 11 | base.class_eval do 12 | unloadable 13 | 14 | # aliasing methods if needed 15 | #alias_method_chain :render_page_hierarchy, :watchers 16 | end 17 | end 18 | 19 | # Instance methods are here 20 | module InstanceMethods 21 | def render_page_hierarchy_with_watchers(pages, node=nil, options={}) 22 | # our code is here 23 | end 24 | end 25 | end 26 | end 27 | end 28 | 29 | # now we should include this module in ApplicationHelper module 30 | unless ApplicationHelper.included_modules.include? BoardsWatchers::Patches::ApplicationHelperPatch 31 | ApplicationHelper.send(:include, BoardsWatchers::Patches::ApplicationHelperPatch) 32 | end 33 | -------------------------------------------------------------------------------- /lib/premailer_ext/file_system_loader_extensions.rb: -------------------------------------------------------------------------------- 1 | require 'addressable/uri' 2 | 3 | class Premailer 4 | module Rails 5 | module CSSLoaders 6 | module FileSystemLoader 7 | def load(url) 8 | path = Addressable::URI.parse(url).path 9 | file_path = "public#{path}" 10 | File.read(file_path) if File.exist?(file_path) 11 | end 12 | end 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /lib/tasks/reminder.rake: -------------------------------------------------------------------------------- 1 | namespace :reminder do 2 | desc "Executes all reminders that fulfill time conditions." 3 | task :exec, [:test] => :environment do |task, args| 4 | require 'set' 5 | require 'colorize' 6 | mail_data = Hash.new{|h, k| h[k] = Set.new} 7 | reminders = MailReminder.select do |rem| 8 | if rem.project 9 | next(false) unless rem.project.enabled_module_names.include?('issue_reminder') 10 | next(false) unless rem.query.present? 11 | print "Project \"#{ rem.project.name }\" with query \"#{ rem.query.name }\" " 12 | if args.test == "test" 13 | puts "\t is forced processing under [test] mode.".yellow 14 | next(true) 15 | end 16 | if rem.execute? 17 | puts "\t is processing.".light_blue 18 | next(true) 19 | else 20 | puts "\t is ignored. It's executed recently and too early for next execution.".red 21 | next(false) 22 | end 23 | end 24 | end 25 | reminders. 26 | sort{|l,r| l.project_id <=> r.project_id}. 27 | each do |rem| 28 | rem.roles.each do |role| 29 | role.members. 30 | select {|m| m.project_id == rem.project_id}. 31 | reject {|m| m.user.nil? || m.user.locked?}. 32 | each do |member| 33 | mail_data[member.user] << [rem.project, rem.query] 34 | end 35 | end 36 | rem.executed_at = Time.now if args.test != "test" 37 | rem.save 38 | end 39 | 40 | # Fixed: reminder mails are not sent when delivery_method is :async_smtp (#5058). 41 | MailReminderMailer.with_synched_deliveries do 42 | mail_data.each do |user, queries_data| 43 | MailReminderMailer.issues_reminder(user, queries_data).deliver if user.active? 44 | puts user.mail 45 | end 46 | end 47 | end 48 | end 49 | -------------------------------------------------------------------------------- /test/fixtures/reminder_roles.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html 2 | one: 3 | id: 1 4 | mail_reminder_id: 1 5 | role_id: 1 6 | two: 7 | id: 2 8 | mail_reminder_id: 1 9 | role_id: 1 10 | -------------------------------------------------------------------------------- /test/fixtures/reminders.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html 2 | one: 3 | id: 1 4 | query_id: 1 5 | interval: MyString 6 | interval_value: 1 7 | two: 8 | id: 2 9 | query_id: 1 10 | interval: MyString 11 | interval_value: 1 12 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | # Load the normal Rails helper 2 | require File.expand_path(File.dirname(__FILE__) + '/../../../test/test_helper') 3 | -------------------------------------------------------------------------------- /test/unit/reminder_roles_test.rb: -------------------------------------------------------------------------------- 1 | require File.dirname(__FILE__) + '/../test_helper' 2 | 3 | class ReminderRolesTest < ActiveSupport::TestCase 4 | fixtures :reminder_roles 5 | 6 | # Replace this with your real tests. 7 | def test_truth 8 | assert true 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /test/unit/reminder_test.rb: -------------------------------------------------------------------------------- 1 | require File.dirname(__FILE__) + '/../test_helper' 2 | 3 | class ReminderTest < ActiveSupport::TestCase 4 | fixtures :reminders 5 | 6 | # Replace this with your real tests. 7 | def test_truth 8 | assert true 9 | end 10 | end 11 | --------------------------------------------------------------------------------