verificar que se pueda cambiar de plantilla closes #158

This commit is contained in:
f 2020-08-03 15:58:08 -03:00
parent 305921ae63
commit 09b8e50545
5 changed files with 78 additions and 32 deletions

View file

@ -55,7 +55,7 @@ class SitesController < ApplicationController
usuarie: current_usuarie) usuarie: current_usuarie)
if service.update.valid? if service.update.valid?
redirect_to sites_path redirect_to site_path(@site)
else else
render 'edit' render 'edit'
end end
@ -76,12 +76,12 @@ class SitesController < ApplicationController
authorize @site authorize @site
lang = params.require(:posts).require(:lang) lang = params.require(:posts).require(:lang)
if params[:posts][:force].present? result = if params[:posts][:force].present?
result = @site.reorder_collection! lang @site.reorder_collection! lang
else else
result = @site @site
.reorder_collection(lang, params.require(:posts).require(:order)) .reorder_collection(lang, params.require(:posts).require(:order))
end end
if result if result
flash[:info] = I18n.t('info.posts.reorder') flash[:info] = I18n.t('info.posts.reorder')

View file

@ -16,10 +16,13 @@ class Site < ApplicationRecord
} }
validates :design_id, presence: true validates :design_id, presence: true
validate :deploy_local_presence
validates_inclusion_of :status, in: %w[waiting enqueued building] validates_inclusion_of :status, in: %w[waiting enqueued building]
validates_presence_of :title validates_presence_of :title
validates :description, length: { in: 50..160 } validates :description, length: { in: 50..160 }
validate :deploy_local_presence
validate :compatible_layouts, on: :update
attr_reader :incompatible_layouts
friendly_id :name, use: %i[finders] friendly_id :name, use: %i[finders]
@ -292,14 +295,6 @@ class Site < ApplicationRecord
status == 'enqueued' status == 'enqueued'
end end
# Obtener una ruta disponible para Sutty
#
# TODO: Refactorizar y testear
def get_url_for_sutty(path)
# Remover los puntos para que no nos envíen a ../../
File.join('/', 'sites', id, path.gsub('..', ''))
end
# Cargar el sitio Jekyll # Cargar el sitio Jekyll
# #
# TODO: En lugar de leer todo junto de una vez, extraer la carga de # TODO: En lugar de leer todo junto de una vez, extraer la carga de
@ -315,7 +310,7 @@ class Site < ApplicationRecord
reset reset
Dir.chdir(path) do Dir.chdir(path) do
@jekyll = Jekyll::Site.new(jekyll_config) @jekyll = Jekyll::Site.new(configuration)
end end
end end
@ -324,7 +319,9 @@ class Site < ApplicationRecord
reload_jekyll! reload_jekyll!
end end
def jekyll_config def configuration
return @configuration if @configuration
# Pasamos destination porque configuration() toma el directorio # Pasamos destination porque configuration() toma el directorio
# actual # actual
# #
@ -333,7 +330,7 @@ class Site < ApplicationRecord
# #
# excerpt_separator está vacío para no incorporar el Excerpt en los # excerpt_separator está vacío para no incorporar el Excerpt en los
# metadatos de Document # metadatos de Document
configuration = @configuration =
::Jekyll.configuration('source' => path, ::Jekyll.configuration('source' => path,
'destination' => File.join(path, '_site'), 'destination' => File.join(path, '_site'),
'safe' => true, 'watch' => false, 'safe' => true, 'watch' => false,
@ -341,19 +338,19 @@ class Site < ApplicationRecord
# No necesitamos cargar plugins en este momento # No necesitamos cargar plugins en este momento
%w[plugins gems].each do |unneeded| %w[plugins gems].each do |unneeded|
configuration[unneeded] = [] if configuration.key? unneeded @configuration[unneeded] = [] if @configuration.key? unneeded
end end
# Eliminar el theme si no es una gema válida # Eliminar el theme si no es una gema válida
configuration.delete 'theme' unless theme_available? @configuration.delete 'theme' unless theme_available?
# Si estamos usando nuestro propio plugin de i18n, los posts están # Si estamos usando nuestro propio plugin de i18n, los posts están
# en "colecciones" # en "colecciones"
locales.each do |i| locales.each do |i|
configuration['collections'][i] = {} @configuration['collections'][i] = {}
end end
configuration @configuration
end end
# Lista los nombres de las plantillas disponibles como gemas, # Lista los nombres de las plantillas disponibles como gemas,
@ -438,4 +435,31 @@ class Site < ApplicationRecord
errors.add(:deploys, I18n.t('activerecord.errors.models.site.attributes.deploys.deploy_local_presence')) errors.add(:deploys, I18n.t('activerecord.errors.models.site.attributes.deploys.deploy_local_presence'))
end end
# Valida que al cambiar de plantilla no tengamos artículos en layouts
# inexistentes.
def compatible_layouts
return unless design_id_changed?
new_configuration = configuration.dup
new_configuration['theme'] = design.gem
new_site = Jekyll::Site.new(new_configuration)
new_site.read
new_site.documents.map(&:read!)
new_layouts = new_site.layouts.keys
old_layouts = new_site.documents.map do |doc|
doc.data['layout']
end.uniq.compact
@incompatible_layouts = old_layouts - new_layouts
return if @incompatible_layouts.empty?
@incompatible_layouts.map! do |layout|
i18n.dig('layouts', layout) || layout
end
errors.add(:design_id,
I18n.t('activerecord.errors.models.site.attributes.design_id.layout_incompatible.error'))
end
end end

View file

@ -1,6 +1,15 @@
- unless site.errors.empty?
.alert.alert-info
%h4= t('.errors.title')
%p.lead= t('.errors.help')
%ul
- site.errors.messages.each_pair do |attr, error|
- error.each do |e|
%li= link_to e, '#' + attr.to_s
= form_for site, html: { class: form_class(site) } do |f| = form_for site, html: { class: form_class(site) } do |f|
- unless site.persisted? - unless site.persisted?
.form-group .form-group#name
%h2= f.label :name %h2= f.label :name
%p.lead= sanitize_markdown t('.help.name'), tags: %w[strong] %p.lead= sanitize_markdown t('.help.name'), tags: %w[strong]
-# -#
@ -17,7 +26,7 @@
- if invalid? site, :name - if invalid? site, :name
.invalid-feedback= site.errors.messages[:name].join(', ') .invalid-feedback= site.errors.messages[:name].join(', ')
.form-group .form-group#title
%h2= f.label :title %h2= f.label :title
%p.lead= t('.help.title') %p.lead= t('.help.title')
= f.text_field :title, class: form_control(site, :title), = f.text_field :title, class: form_control(site, :title),
@ -25,7 +34,7 @@
- if invalid? site, :title - if invalid? site, :title
.invalid-feedback= site.errors.messages[:title].join(', ') .invalid-feedback= site.errors.messages[:title].join(', ')
.form-group .form-group#description
%h2= f.label :description %h2= f.label :description
%p.lead= t('.help.description') %p.lead= t('.help.description')
= f.text_area :description, class: form_control(site, :description), = f.text_area :description, class: form_control(site, :description),
@ -34,9 +43,13 @@
.invalid-feedback= site.errors.messages[:description].join(', ') .invalid-feedback= site.errors.messages[:description].join(', ')
%hr/ %hr/
.form-group .form-group#design_id
%h2= t('.design.title') %h2= t('.design.title')
%p.lead= t('.help.design') %p.lead= t('.help.design')
- if invalid? site, :design_id
.alert.alert-info
= t('activerecord.errors.models.site.attributes.design_id.layout_incompatible.help',
layouts: site.incompatible_layouts.to_sentence)
.row.designs .row.designs
-# Demasiado complejo para un f.collection_radio_buttons -# Demasiado complejo para un f.collection_radio_buttons
- Design.all.find_each do |design| - Design.all.find_each do |design|
@ -61,7 +74,7 @@
target: '_blank', class: 'btn' target: '_blank', class: 'btn'
%hr/ %hr/
.form-group.licenses .form-group.licenses#license_id
%h2= t('.licencia.title') %h2= t('.licencia.title')
%p.lead= t('.help.licencia') %p.lead= t('.help.licencia')
- Licencia.all.find_each do |licencia| - Licencia.all.find_each do |licencia|
@ -91,7 +104,7 @@
%hr/ %hr/
- if site.persisted? - if site.persisted?
.form-group .form-group#contact
%h2= t('.contact.title') %h2= t('.contact.title')
%p.lead= t('.contact.help') %p.lead= t('.contact.help')
@ -99,7 +112,7 @@
= f.check_box :contact, class: 'custom-control-input' = f.check_box :contact, class: 'custom-control-input'
= f.label :contact, class: 'custom-control-label' = f.label :contact, class: 'custom-control-label'
.form-group .form-group#colaboracion_anonima
%h2= t('.colaboracion_anonima.title') %h2= t('.colaboracion_anonima.title')
%p.lead= t('.colaboracion_anonima.help') %p.lead= t('.colaboracion_anonima.help')

View file

@ -126,6 +126,10 @@ en:
confirmation: "The passwords don't match" confirmation: "The passwords don't match"
acepta_politicas_de_privacidad: acepta_politicas_de_privacidad:
no_acepta_politicas_de_privacidad: "Please read and accept the privacy policy" no_acepta_politicas_de_privacidad: "Please read and accept the privacy policy"
design_id:
layout_incompatible:
error: "Design can't be changed because there're posts with incompatible layouts"
help: "Your site has posts with layout only compatible to the current design. If you change it, the site won't work as you expect. If you're trying out designs, you can delete posts in the following incompatible layouts:: %{layouts}."
errors: errors:
argument_error: 'Argument `%{argument}` must be an instance of %{class}' argument_error: 'Argument `%{argument}` must be an instance of %{class}'
unknown_locale: 'Unknown %{locale} locale' unknown_locale: 'Unknown %{locale} locale'

View file

@ -99,6 +99,7 @@ es:
models: models:
usuarie: Usuarie usuarie: Usuarie
licencia: Licencia licencia: Licencia
design: Diseño
attributes: attributes:
usuarie: usuarie:
email: 'Correo electrónico' email: 'Correo electrónico'
@ -119,6 +120,10 @@ es:
attributes: attributes:
deploys: deploys:
deploy_local_presence: '¡Necesitamos poder generar el sitio!' deploy_local_presence: '¡Necesitamos poder generar el sitio!'
design_id:
layout_incompatible:
error: 'No se puede cambiar la plantilla porque hay artículos con formatos incompatibles'
help: 'En tu sitio hay artículos que solo son compatibles con el diseño actual, si cambias la plantilla el sitio no funcionará como esperas. Si estás probando plantillas, puedes eliminar los artículos en los formatos incompatibles: %{layouts}.'
errors: errors:
argument_error: 'El argumento `%{argument}` debe ser una instancia de %{class}' argument_error: 'El argumento `%{argument}` debe ser una instancia de %{class}'
unknown_locale: 'El idioma %{locale} es desconocido' unknown_locale: 'El idioma %{locale} es desconocido'
@ -344,8 +349,8 @@ es:
btn: 'Configuración' btn: 'Configuración'
form: form:
errors: errors:
title: Hay errores y no pudimos guardar tus cambios :( title: Hubo errores y no pudimos guardar tus cambios :(
help: Por favor, busca los campos marcados como inválidos para resolverlos help: Por favor, busca los campos marcados como no válidos para resolverlos
help: help:
name: 'El nombre de tu sitio que formará parte de la dirección (**ejemplo**.sutty.nl). Solo puede contener letras minúsculas, números y guiones.' name: 'El nombre de tu sitio que formará parte de la dirección (**ejemplo**.sutty.nl). Solo puede contener letras minúsculas, números y guiones.'
title: 'El título de tu sitio puede ser lo que quieras.' title: 'El título de tu sitio puede ser lo que quieras.'