mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-14 22:51:41 +00:00
mensajes de mantenimiento con agenda
This commit is contained in:
parent
0bd7939ab9
commit
8f46d45603
15 changed files with 187 additions and 1 deletions
1
Gemfile
1
Gemfile
|
@ -50,6 +50,7 @@ gem 'friendly_id'
|
||||||
gem 'hamlit-rails'
|
gem 'hamlit-rails'
|
||||||
gem 'hiredis'
|
gem 'hiredis'
|
||||||
gem 'image_processing'
|
gem 'image_processing'
|
||||||
|
gem 'icalendar'
|
||||||
gem 'inline_svg'
|
gem 'inline_svg'
|
||||||
gem 'jekyll'
|
gem 'jekyll'
|
||||||
gem 'jekyll-data', require: 'jekyll-data',
|
gem 'jekyll-data', require: 'jekyll-data',
|
||||||
|
|
|
@ -194,6 +194,9 @@ GEM
|
||||||
http_parser.rb (0.6.0)
|
http_parser.rb (0.6.0)
|
||||||
i18n (1.8.3)
|
i18n (1.8.3)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
|
icalendar (2.6.1)
|
||||||
|
ice_cube (~> 0.16)
|
||||||
|
ice_cube (0.16.3)
|
||||||
image_processing (1.11.0)
|
image_processing (1.11.0)
|
||||||
mini_magick (>= 4.9.5, < 5)
|
mini_magick (>= 4.9.5, < 5)
|
||||||
ruby-vips (>= 2.0.17, < 3)
|
ruby-vips (>= 2.0.17, < 3)
|
||||||
|
@ -507,6 +510,7 @@ DEPENDENCIES
|
||||||
haml-lint
|
haml-lint
|
||||||
hamlit-rails
|
hamlit-rails
|
||||||
hiredis
|
hiredis
|
||||||
|
icalendar
|
||||||
image_processing
|
image_processing
|
||||||
inline_svg
|
inline_svg
|
||||||
jbuilder (~> 2.5)
|
jbuilder (~> 2.5)
|
||||||
|
|
30
app/jobs/maintenance_job.rb
Normal file
30
app/jobs/maintenance_job.rb
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Envía los mensajes de mantenimiento
|
||||||
|
#
|
||||||
|
# TODO: Interfaz web desde el panel de gestión. Mientras tanto:
|
||||||
|
#
|
||||||
|
# docker exec -it sutty /bin/sh
|
||||||
|
# su app
|
||||||
|
# cd
|
||||||
|
# bundle exec rails c
|
||||||
|
# m = Maintenance.create message_en: 'reason', message_es: 'razón',
|
||||||
|
# estimated_from: Time.now, estimated_to: Time.now + 1.hour
|
||||||
|
# MaintenanceJob.perform_async(maintenance_id: m.id)
|
||||||
|
#
|
||||||
|
# Lo mismo para salir de mantenimiento, agregando el atributo
|
||||||
|
# are_we_back: true al crear el Maintenance.
|
||||||
|
class MaintenanceJob < ApplicationJob
|
||||||
|
def perform(maintenance_id:)
|
||||||
|
maintenance = Maintenance.find(maintenance_id)
|
||||||
|
# Decidir cuál vamos a enviar según el estado de Maintenance
|
||||||
|
mailer = maintenance.are_we_back ? :were_back : :notice
|
||||||
|
|
||||||
|
# XXX: Parece que [0] es más rápido que []#first
|
||||||
|
Usuarie.all.pluck(:email, :lang).each do |u|
|
||||||
|
MaintenanceMailer.with(maintenance: maintenance,
|
||||||
|
email: u[0],
|
||||||
|
lang: u[1]).send(mailer).deliver_now
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -20,6 +20,8 @@ class ContactMailer < ApplicationMailer
|
||||||
|
|
||||||
# El CSV es un archivo adjunto con dos filas, una con las etiquetas de
|
# El CSV es un archivo adjunto con dos filas, una con las etiquetas de
|
||||||
# los campos en la cabecera y otra con los valores.
|
# los campos en la cabecera y otra con los valores.
|
||||||
|
#
|
||||||
|
# TODO: Si el sitio tiene muches usuaries esto se genera cada vez.
|
||||||
def generate_csv
|
def generate_csv
|
||||||
csv = ["\xEF\xBB\xBF"]
|
csv = ["\xEF\xBB\xBF"]
|
||||||
csv << params[:form].keys.map do |field|
|
csv << params[:form].keys.map do |field|
|
||||||
|
|
46
app/mailers/maintenance_mailer.rb
Normal file
46
app/mailers/maintenance_mailer.rb
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Envía correos de mantenimiento
|
||||||
|
class MaintenanceMailer < ApplicationMailer
|
||||||
|
# Notifica a les usuaries de tareas de mantenimiento
|
||||||
|
def notice
|
||||||
|
I18n.with_locale params[:lang] do
|
||||||
|
attachments['maintenance.ics'] = ics
|
||||||
|
|
||||||
|
mail to: params[:email],
|
||||||
|
subject: I18n.t('maintenance_mailer.notice.subject')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Notifica que volvimos
|
||||||
|
def were_back
|
||||||
|
params[:maintenance] = Maintenance.find(params[:maintenance_id])
|
||||||
|
|
||||||
|
Usuarie.all.find_each do |usuarie|
|
||||||
|
I18n.with_locale usuarie.lang do
|
||||||
|
mail to: usuarie.email,
|
||||||
|
subject: I18n.t('maintenance_mailer.were_back.subject')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def cache_key
|
||||||
|
@cache_key ||= params[:maintenance].cache_key_with_version + '/ics/' + params[:lang]
|
||||||
|
end
|
||||||
|
|
||||||
|
def ics
|
||||||
|
Rails.cache.fetch(cache_key, expires_in: 1.hour) do
|
||||||
|
cal = Icalendar::Calendar.new
|
||||||
|
cal.event do |e|
|
||||||
|
e.dtstart = params[:maintenance].estimated_from
|
||||||
|
e.dtend = params[:maintenance].estimated_to
|
||||||
|
e.summary = I18n.t('maintenance_mailer.ics.summary')
|
||||||
|
e.description = params[:maintenance].message
|
||||||
|
end
|
||||||
|
|
||||||
|
{ mimetype: 'text/calendar; charset=utf-8', content: cal.to_ical }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
8
app/models/maintenance.rb
Normal file
8
app/models/maintenance.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# En mantenimiento
|
||||||
|
class Maintenance < ApplicationRecord
|
||||||
|
extend Mobility
|
||||||
|
|
||||||
|
translates :message, type: :string, locale_accessors: true
|
||||||
|
end
|
6
app/views/maintenance/were_back.text.haml
Normal file
6
app/views/maintenance/were_back.text.haml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
= t('.hi').html_safe
|
||||||
|
\
|
||||||
|
= t('.message').html_safe
|
||||||
|
\
|
||||||
|
= params[:maintenance].message.html_safe
|
||||||
|
\
|
6
app/views/maintenance_mailer/notice.html.haml
Normal file
6
app/views/maintenance_mailer/notice.html.haml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
%p= t('.hi')
|
||||||
|
%p= t('.message')
|
||||||
|
%p= t('.reason')
|
||||||
|
%blockquote= params[:maintenance].message
|
||||||
|
%p= t('.estimated_from', from: params[:maintenance].estimated_from)
|
||||||
|
%p= t('.estimated_to', to: params[:maintenance].estimated_to)
|
12
app/views/maintenance_mailer/notice.text.haml
Normal file
12
app/views/maintenance_mailer/notice.text.haml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
= t('.hi').html_safe
|
||||||
|
\
|
||||||
|
= t('.message').html_safe
|
||||||
|
\
|
||||||
|
= t('.reason').html_safe
|
||||||
|
\
|
||||||
|
= params[:maintenance].message.html_safe
|
||||||
|
\
|
||||||
|
= t('.estimated_from', from: params[:maintenance].estimated_from).html_safe
|
||||||
|
\
|
||||||
|
= t('.estimated_to', to: params[:maintenance].estimated_to).html_safe
|
||||||
|
\
|
3
app/views/maintenance_mailer/were_back.html.haml
Normal file
3
app/views/maintenance_mailer/were_back.html.haml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
%p= t('.hi')
|
||||||
|
%p= t('.message')
|
||||||
|
%blockquote= params[:maintenance].message
|
6
app/views/maintenance_mailer/were_back.text.haml
Normal file
6
app/views/maintenance_mailer/were_back.text.haml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
= t('.hi')
|
||||||
|
\
|
||||||
|
= t('.message')
|
||||||
|
\
|
||||||
|
= params[:maintenance].message
|
||||||
|
\
|
|
@ -69,6 +69,21 @@ en:
|
||||||
success: Available for download
|
success: Available for download
|
||||||
error: Error
|
error: Error
|
||||||
help: You can contact us by replying this e-mail
|
help: You can contact us by replying this e-mail
|
||||||
|
maintenance_mailer:
|
||||||
|
notice:
|
||||||
|
subject: 'Maintenance notice'
|
||||||
|
hi: 'Hi!'
|
||||||
|
message: "We're getting in contact with you to let you know we'll be doing maintenance work in our servers."
|
||||||
|
reason: 'The reason is:'
|
||||||
|
estimated_from: 'The maintenance period starts at %{from}'
|
||||||
|
estimated_to: 'Up to %{to} (approximately)'
|
||||||
|
thanks: 'Thanks for your patience'
|
||||||
|
were_back:
|
||||||
|
subject: 'Maintenance period ended'
|
||||||
|
hi: 'Hi!'
|
||||||
|
message: 'The maintenance period ended at %{created_at}'
|
||||||
|
ics:
|
||||||
|
summary: 'Sutty - Maintenance'
|
||||||
activerecord:
|
activerecord:
|
||||||
models:
|
models:
|
||||||
usuarie: User
|
usuarie: User
|
||||||
|
|
|
@ -71,6 +71,21 @@ es:
|
||||||
success: Disponible para descargar
|
success: Disponible para descargar
|
||||||
error: Hubo un error
|
error: Hubo un error
|
||||||
help: Por cualquier duda, responde este correo para contactarte con nosotres.
|
help: Por cualquier duda, responde este correo para contactarte con nosotres.
|
||||||
|
maintenance_mailer:
|
||||||
|
notice:
|
||||||
|
subject: 'Aviso de mantenimiento'
|
||||||
|
hi: '¡Hola!'
|
||||||
|
message: 'Nos comunicamos con vos para informarte que estaremos realizando mantenimiento en nuestros servidores'
|
||||||
|
reason: 'La razón de esta tarea es:'
|
||||||
|
estimated_from: 'El mantenimiento se realizará a partir de %{from}'
|
||||||
|
estimated_to: 'Hasta %{to} (aproximadamente)'
|
||||||
|
thanks: 'Gracias por tu paciencia'
|
||||||
|
were_back:
|
||||||
|
subject: 'Fin del mantenimiento'
|
||||||
|
hi: '¡Hola!'
|
||||||
|
message: 'El período de mantenimiento terminó en %{created_at}'
|
||||||
|
ics:
|
||||||
|
summary: 'Sutty - Mantenimiento'
|
||||||
activerecord:
|
activerecord:
|
||||||
models:
|
models:
|
||||||
usuarie: Usuarie
|
usuarie: Usuarie
|
||||||
|
|
14
db/migrate/20200616133218_create_maintenance.rb
Normal file
14
db/migrate/20200616133218_create_maintenance.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Crea una tabla de avisos de mantenimiento
|
||||||
|
class CreateMaintenance < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
create_table :maintenances do |t|
|
||||||
|
t.timestamps
|
||||||
|
t.text :message
|
||||||
|
t.datetime :estimated_from
|
||||||
|
t.datetime :estimated_to
|
||||||
|
t.boolean :are_we_back, default: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
20
db/schema.rb
20
db/schema.rb
|
@ -12,7 +12,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.define(version: 20_200_206_151_057) do
|
ActiveRecord::Schema.define(version: 20_200_616_133_218) do
|
||||||
# Could not dump table "access_logs" because of following StandardError
|
# Could not dump table "access_logs" because of following StandardError
|
||||||
# Unknown type '' for column 'id'
|
# Unknown type '' for column 'id'
|
||||||
|
|
||||||
|
@ -92,6 +92,23 @@ ActiveRecord::Schema.define(version: 20_200_206_151_057) do
|
||||||
t.string 'icons'
|
t.string 'icons'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table 'log_entries', force: :cascade do |t|
|
||||||
|
t.datetime 'created_at', precision: 6, null: false
|
||||||
|
t.datetime 'updated_at', precision: 6, null: false
|
||||||
|
t.integer 'site_id'
|
||||||
|
t.text 'text'
|
||||||
|
t.index ['site_id'], name: 'index_log_entries_on_site_id'
|
||||||
|
end
|
||||||
|
|
||||||
|
create_table 'maintenances', force: :cascade do |t|
|
||||||
|
t.datetime 'created_at', precision: 6, null: false
|
||||||
|
t.datetime 'updated_at', precision: 6, null: false
|
||||||
|
t.text 'message'
|
||||||
|
t.datetime 'estimated_from'
|
||||||
|
t.datetime 'estimated_to'
|
||||||
|
t.boolean 'are_we_back', default: false
|
||||||
|
end
|
||||||
|
|
||||||
create_table 'mobility_string_translations', force: :cascade do |t|
|
create_table 'mobility_string_translations', force: :cascade do |t|
|
||||||
t.string 'locale', null: false
|
t.string 'locale', null: false
|
||||||
t.string 'key', null: false
|
t.string 'key', null: false
|
||||||
|
@ -139,6 +156,7 @@ ActiveRecord::Schema.define(version: 20_200_206_151_057) do
|
||||||
t.text 'description'
|
t.text 'description'
|
||||||
t.string 'title'
|
t.string 'title'
|
||||||
t.boolean 'colaboracion_anonima', default: false
|
t.boolean 'colaboracion_anonima', default: false
|
||||||
|
t.boolean 'contact', default: false
|
||||||
t.index ['design_id'], name: 'index_sites_on_design_id'
|
t.index ['design_id'], name: 'index_sites_on_design_id'
|
||||||
t.index ['licencia_id'], name: 'index_sites_on_licencia_id'
|
t.index ['licencia_id'], name: 'index_sites_on_licencia_id'
|
||||||
t.index ['name'], name: 'index_sites_on_name', unique: true
|
t.index ['name'], name: 'index_sites_on_name', unique: true
|
||||||
|
|
Loading…
Reference in a new issue