mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-22 23:26:21 +00:00
verificar que se pueda cambiar de plantilla closes #158
This commit is contained in:
parent
305921ae63
commit
09b8e50545
5 changed files with 78 additions and 32 deletions
|
@ -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')
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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.'
|
||||||
|
|
Loading…
Reference in a new issue