5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-22 03:56:22 +00:00

mensajes de mantenimiento con agenda

This commit is contained in:
f 2020-06-16 13:35:08 -03:00
parent 0bd7939ab9
commit 8f46d45603
15 changed files with 187 additions and 1 deletions

View file

@ -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',

View file

@ -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)

View 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

View file

@ -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|

View 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

View file

@ -0,0 +1,8 @@
# frozen_string_literal: true
# En mantenimiento
class Maintenance < ApplicationRecord
extend Mobility
translates :message, type: :string, locale_accessors: true
end

View file

@ -0,0 +1,6 @@
= t('.hi').html_safe
\
= t('.message').html_safe
\
= params[:maintenance].message.html_safe
\

View 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)

View 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
\

View file

@ -0,0 +1,3 @@
%p= t('.hi')
%p= t('.message')
%blockquote= params[:maintenance].message

View file

@ -0,0 +1,6 @@
= t('.hi')
\
= t('.message')
\
= params[:maintenance].message
\

View file

@ -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

View file

@ -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

View 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

View file

@ -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