From 67743cd0146815be61b6a6ef348c5d17faee87fc Mon Sep 17 00:00:00 2001 From: Benjamin Meichsner Date: Tue, 10 Feb 2009 15:07:47 +0100 Subject: [PATCH] Implement notification for upcoming tasks via a daily fired rake-task. --- app/models/mailer.rb | 9 +++++++++ app/models/task.rb | 1 + app/models/user.rb | 16 +++++++++------- app/views/mailer/notify_upcoming_tasks.html.erb | 17 +++++++++++++++++ .../20090120184410_road_to_version_three.rb | 4 +++- db/schema.rb | 2 +- lib/tasks/foodsoft.rake | 14 ++++++++++++++ 7 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 app/views/mailer/notify_upcoming_tasks.html.erb diff --git a/app/models/mailer.rb b/app/models/mailer.rb index 422ab958..0b4d4d56 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -37,5 +37,14 @@ class Mailer < ActionMailer::Base :link => url_for(:host => request.host, :controller => "login", :action => "invite", :id => invite.token), :foodsoftUrl => url_for(:host => request.host, :controller => "index") end + + # Notify user of upcoming task. + def notify_upcoming_tasks(user, task) + subject "[#{APP_CONFIG[:name]}] Aufgaben werden fällig!" + recipients user.email + from "FoodSoft <#{APP_CONFIG[:email_sender]}>" + body :user => user, :task => task + + end end diff --git a/app/models/task.rb b/app/models/task.rb index cb5babea..65da3eaf 100644 --- a/app/models/task.rb +++ b/app/models/task.rb @@ -22,6 +22,7 @@ class Task < ActiveRecord::Base named_scope :non_group, :conditions => { :workgroup_id => nil, :done => false } named_scope :done, :conditions => {:done => true}, :order => "due_date ASC" + named_scope :upcoming, lambda { |*args| {:conditions => ["done = 0 AND due_date = ?", (args.first || 7.days.from_now)]} } # form will send user in string. responsibilities will added later attr_protected :users diff --git a/app/models/user.rb b/app/models/user.rb index 15f08615..ea3cd459 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -53,12 +53,13 @@ class User < ActiveRecord::Base # returns the User-settings and the translated description def self.setting_keys { - "notify.orderFinished" => 'Get message with order result', - "notify.negativeBalance" => 'Get message if negative account balance', - "messages.sendAsEmail" => 'Get messages as emails', - "profile.phoneIsPublic" => 'Phone is visible for foodcoop members', - "profile.emailIsPublic" => 'Email is visible for foodcoop members', - "profile.nameIsPublic" => 'Name is visible for foodcoop members' + "notify.orderFinished" => 'Informier mich über meine Bestellergebnisse (nach Ende der Bestellung).', + "notify.negativeBalance" => 'Informiere mich, falls meine Bestellgruppe ins Minus rutscht.', + "notify.upcoming_tasks" => 'Erinnere mich an anstehende Aufgaben.', + "messages.sendAsEmail" => 'Bekomme Nachrichten als Emails.', + "profile.phoneIsPublic" => 'Telefon ist für Mitglieder sichtbar', + "profile.emailIsPublic" => 'E-Mail ist für Mitglieder sichtbar', + "profile.nameIsPublic" => 'Name ist für Mitglieder sichtbar' } end # retuns the default setting for a NEW user @@ -67,7 +68,8 @@ class User < ActiveRecord::Base def settings_default(setting) # define a default for the settings defaults = { - "messages.sendAsEmail" => true + "messages.sendAsEmail" => true, + "notify.upcoming_tasks" => true } return true if self.new_record? && defaults[setting] end diff --git a/app/views/mailer/notify_upcoming_tasks.html.erb b/app/views/mailer/notify_upcoming_tasks.html.erb new file mode 100644 index 00000000..3fe53b37 --- /dev/null +++ b/app/views/mailer/notify_upcoming_tasks.html.erb @@ -0,0 +1,17 @@ +Liebe(r) <%= @user.name %>, + +Du bist für "<%= @task.name -%>" eingetragen. Die Aufgabe ist morgen (<%= @task.due_date.strftime("%d. %b") -%>) fällig! + +<% if @user.next_tasks.size > 1 -%> +Aufgaben für die nächste Woche: + <% for next_task in @user.next_tasks -%> + <% unless next_task == @task -%> +* <%= next_task.due_date.strftime("%d.%m.") -%> <%= next_task.name %> + <% end -%> + <% end -%> +<% end -%> + +Viele Grüße von <%= APP_CONFIG[:name] %> + +-- +Meine Aufgaben: <%= APP_CONFIG[:base_url] %>/home/tasks \ No newline at end of file diff --git a/db/migrate/20090120184410_road_to_version_three.rb b/db/migrate/20090120184410_road_to_version_three.rb index 72fa79f7..5725ae62 100644 --- a/db/migrate/20090120184410_road_to_version_three.rb +++ b/db/migrate/20090120184410_road_to_version_three.rb @@ -144,7 +144,9 @@ class RoadToVersionThree < ActiveRecord::Migration # t.datetime :created_at # end - + # == User + # Ativate all Users for notification on upcoming tasks + User.all.each { |u| u.settings['notify.upcoming_tasks'] = 1 } end diff --git a/db/schema.rb b/db/schema.rb index 31ed8104..75648fb1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20090120184410) do +ActiveRecord::Schema.define(:version => 20090119155930) do create_table "article_categories", :force => true do |t| t.string "name", :default => "", :null => false diff --git a/lib/tasks/foodsoft.rake b/lib/tasks/foodsoft.rake index b34110ae..1306fc60 100644 --- a/lib/tasks/foodsoft.rake +++ b/lib/tasks/foodsoft.rake @@ -24,4 +24,18 @@ namespace :foodsoft do puts "Joining 'admin' user to 'Administrators' group" Membership.create(:group => administrators, :user => admin) end + + desc "Notify users of upcoming tasks" + task :notify_upcoming_tasks => :environment do + tasks = Task.find :all, :conditions => ["done = ? AND due_date = ?", false, 1.day.from_now.to_date] + for task in tasks + puts "Send notifications for #{task.name} to .." + for user in task.users + if user.settings['notify.upcoming_tasks'] == 1 + puts "#{user.email}.." + Mailer.deliver_notify_upcoming_tasks(user,task) + end + end + end + end end \ No newline at end of file