parent
ecb4f16ec5
commit
d5f77d338b
7 changed files with 50 additions and 2 deletions
5
Rakefile
5
Rakefile
|
|
@ -25,3 +25,8 @@ desc "Close votes that have expired"
|
||||||
task :close_expired_votes do
|
task :close_expired_votes do
|
||||||
close_expired_votes
|
close_expired_votes
|
||||||
end
|
end
|
||||||
|
|
||||||
|
desc "Send email reminders"
|
||||||
|
task :send_reminders do
|
||||||
|
send_reminders
|
||||||
|
end
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@ set :values, [ { :id => 1, :label => _("Awful"), :color => '#ff4500' },
|
||||||
{ :id => 5, :label => _("Good"), :color => '#228b22' },
|
{ :id => 5, :label => _("Good"), :color => '#228b22' },
|
||||||
{ :id => 6, :label => _("Very good"), :color => '#006400' } ]
|
{ :id => 6, :label => _("Very good"), :color => '#006400' } ]
|
||||||
set :expire_after, 7 * 24 * 60 * 60 # 7 days
|
set :expire_after, 7 * 24 * 60 * 60 # 7 days
|
||||||
|
set :reminders, [ { :timeout => 48 * 60 * 60 },
|
||||||
|
{ :timeout => 24 * 60 * 60 } ]
|
||||||
|
|
|
||||||
|
|
@ -6,4 +6,5 @@ set :environment_variable, 'RACK_ENV'
|
||||||
|
|
||||||
every 5.minutes do
|
every 5.minutes do
|
||||||
rake "close_expired_votes"
|
rake "close_expired_votes"
|
||||||
|
rake "send_email_reminders"
|
||||||
end
|
end
|
||||||
|
|
|
||||||
5
db/migrate/20260323215246_add_reminders_to_votes.rb.rb
Normal file
5
db/migrate/20260323215246_add_reminders_to_votes.rb.rb
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddRemindersToVotes < ActiveRecord::Migration[7.2]
|
||||||
|
def change
|
||||||
|
add_column :votes, :reminders, :integer
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[7.2].define(version: 2025_06_08_223006) do
|
ActiveRecord::Schema[7.2].define(version: 2026_03_23_215246) do
|
||||||
create_table "candidates", force: :cascade do |t|
|
create_table "candidates", force: :cascade do |t|
|
||||||
t.integer "vote_id"
|
t.integer "vote_id"
|
||||||
t.string "name"
|
t.string "name"
|
||||||
|
|
@ -56,6 +56,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_06_08_223006) do
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at", null: false
|
||||||
t.string "state"
|
t.string "state"
|
||||||
|
t.integer "reminders"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_foreign_key "ratings", "votes"
|
add_foreign_key "ratings", "votes"
|
||||||
|
|
|
||||||
31
vedia.rb
31
vedia.rb
|
|
@ -268,6 +268,7 @@ post '/admin/votes/:id' do
|
||||||
if (@vote.state == 'open' or @vote.state == 'closed') and new_expiry > Time.now
|
if (@vote.state == 'open' or @vote.state == 'closed') and new_expiry > Time.now
|
||||||
puts "change"
|
puts "change"
|
||||||
@vote.expire_on = new_expiry
|
@vote.expire_on = new_expiry
|
||||||
|
@vote.reminders = 0
|
||||||
@vote.state = 'open'
|
@vote.state = 'open'
|
||||||
@vote.save
|
@vote.save
|
||||||
end
|
end
|
||||||
|
|
@ -589,7 +590,7 @@ def close_expired_votes
|
||||||
mail = Mail.new
|
mail = Mail.new
|
||||||
mail.from = settings.admin_email
|
mail.from = settings.admin_email
|
||||||
mail.to = user.email
|
mail.to = user.email
|
||||||
mail.subject = _("Results of the vote: %{t}") % { t: vote.title }
|
mail.subject = _("Results of the vote '%{t}'") % { t: vote.title }
|
||||||
template = ERB.new(File.read("views/votes_close_email.erb"))
|
template = ERB.new(File.read("views/votes_close_email.erb"))
|
||||||
mail.body = template.result(binding)
|
mail.body = template.result(binding)
|
||||||
mail.deliver
|
mail.deliver
|
||||||
|
|
@ -597,6 +598,34 @@ def close_expired_votes
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def send_reminders
|
||||||
|
Vote.where(state: 'open').each do |vote|
|
||||||
|
settings.reminders.slice(vote.reminders..settings.reminders.length-1).each do |reminder|
|
||||||
|
minutes_to_expiry = ( vote.expire_on - Time.now.utc ) / 60
|
||||||
|
if minutes_to_expiry < reminder[:timeout] / 60
|
||||||
|
User.all.each do |user|
|
||||||
|
if not vote.ratings.collect { |rating| rating.user }.include?(user)
|
||||||
|
puts "#{Time.now.utc} Sending reminder #{reminder[:template]} for '#{vote.title}' to #{user.email}..."
|
||||||
|
mail = Mail.new
|
||||||
|
mail.from = settings.admin_email
|
||||||
|
mail.to = user.email
|
||||||
|
if minutes_to_expiry < 60
|
||||||
|
mail.subject = _("%{m} minutes left to vote on '%{t}'") % { m: minutes_to_expiry.round, t: vote.title }
|
||||||
|
else
|
||||||
|
mail.subject = _("%{h} hours left to vote on '%{t}'") % { h: (minutes_to_expiry / 60).round, t: vote.title }
|
||||||
|
end
|
||||||
|
template = ERB.new(File.read("views/votes_reminder_email.erb"))
|
||||||
|
mail.body = template.result(binding)
|
||||||
|
mail.deliver
|
||||||
|
end
|
||||||
|
end
|
||||||
|
vote.reminders = vote.reminders + 1
|
||||||
|
vote.save
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
helpers do
|
helpers do
|
||||||
def current_user
|
def current_user
|
||||||
if session[:user_id]
|
if session[:user_id]
|
||||||
|
|
|
||||||
5
views/votes_reminder_email.erb
Normal file
5
views/votes_reminder_email.erb
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<%= _("You haven't voted yet!") %>
|
||||||
|
|
||||||
|
<%= _("Visit this link to vote:") %>
|
||||||
|
|
||||||
|
<%= "#{settings.base_url}votes/#{vote.secure_id}" %>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue