5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-24 20:26:21 +00:00

agregar titulo y descripcion al sitio

This commit is contained in:
f 2019-07-31 17:55:34 -03:00
parent 4e1cfdd726
commit 9a69edb05b
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
13 changed files with 133 additions and 15 deletions

View file

@ -5,6 +5,28 @@
@import "select2-theme-bootstrap4/dist/select2-bootstrap"; @import "select2-theme-bootstrap4/dist/select2-bootstrap";
@import "dragula-with-animation/dist/dragula"; @import "dragula-with-animation/dist/dragula";
@font-face {
font-family: 'Saira';
font-style: normal;
font-weight: 500;
font-display: optional;
src: local('Saira Medium'), local('Saira-Medium'),
font-url('saira/v3/SairaMedium.ttf') format('truetype');
}
@font-face {
font-family: 'Saira';
font-style: normal;
font-weight: 700;
font-display: optional;
src: local('Saira Bold'), local('Saira-Bold'),
font-url('saira/v3/SairaBold.ttf') format('truetype');
}
body {
font-family: Saira, sans-serif;
}
$footer-height: 60px; $footer-height: 60px;
/* Colores */ /* Colores */

View file

@ -30,11 +30,14 @@ class SitesController < ApplicationController
def create def create
@site = Site.new(site_params) @site = Site.new(site_params)
current_usuarie.roles << Rol.new(site: @site, @site.roles << Rol.new(site: @site,
temporal: false, usuarie: current_usuarie,
rol: 'usuarie') temporal: false,
rol: 'usuarie')
if current_usuarie.save # XXX: Necesitamos escribir la configuración después porque queremos
# registrar quién hizo los cambios en el repositorio
if @site.save && @site.config.write(current_usuarie)
redirect_to site_path(@site) redirect_to site_path(@site)
else else
render 'new' render 'new'
@ -50,7 +53,9 @@ class SitesController < ApplicationController
@site = find_site @site = find_site
authorize @site authorize @site
if @site.update(site_params) # XXX: Necesitamos escribir la configuración después porque queremos
# registrar quién hizo los cambios en el repositorio
if @site.update(site_params) && @site.config.write(current_usuarie)
redirect_to sites_path redirect_to sites_path
else else
render 'edit' render 'edit'
@ -133,9 +138,7 @@ class SitesController < ApplicationController
def site_params def site_params
params.require(:site) params.require(:site)
.permit(:name, :design_id, :licencia_id, .permit(:name, :design_id, :licencia_id, :description, :title,
deploys_attributes: %i[ deploys_attributes: %i[type id _destroy])
type id _destroy
])
end end
end end

View file

@ -1,5 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
# Helpers
module ApplicationHelper module ApplicationHelper
# Devuelve el atributo name de un campo posiblemente anidado # Devuelve el atributo name de un campo posiblemente anidado
def field_name_for_post(names) def field_name_for_post(names)
@ -24,4 +25,20 @@ module ApplicationHelper
def sanitize_markdown(text, options = {}) def sanitize_markdown(text, options = {})
sanitize(CommonMarker.render_html(text), options) sanitize(CommonMarker.render_html(text), options)
end end
def invalid?(model, field)
model.errors.messages[field].present?
end
def form_control(model, field)
if invalid? model, field
'form-control is-invalid'
else
'form-control'
end
end
def form_class(model)
model.errors.messages.empty? ? 'needs-validation' : 'was-validated'
end
end end

View file

@ -9,6 +9,8 @@ class Site < ApplicationRecord
validates :design_id, presence: true validates :design_id, presence: true
validate :deploy_local_presence 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 :description, length: { in: 50..160 }
friendly_id :name, use: %i[finders] friendly_id :name, use: %i[finders]
@ -32,6 +34,8 @@ class Site < ApplicationRecord
after_create :load_jekyll! after_create :load_jekyll!
# Cambiar el nombre del directorio # Cambiar el nombre del directorio
before_update :update_name! before_update :update_name!
# Guardar la configuración si hubo cambios
after_save :sync_attributes_with_config!
attr_accessor :jekyll, :collections attr_accessor :jekyll, :collections
@ -335,6 +339,14 @@ class Site < ApplicationRecord
FileUtils.mv old_path, path FileUtils.mv old_path, path
end end
# Sincroniza algunos atributos del sitio con su configuración y
# guarda los cambios
def sync_attributes_with_config!
config.theme = design.gem unless design_id_changed?
config.description = description unless description_changed?
config.title = title unless title_changed?
end
# Valida si el sitio tiene al menos una forma de alojamiento asociada # Valida si el sitio tiene al menos una forma de alojamiento asociada
# y es la local # y es la local
# #

View file

@ -28,12 +28,14 @@ class Site
end end
# Escribe los cambios en el repositorio # Escribe los cambios en el repositorio
def write(usuarie) def write(usuarie = nil)
return if persisted? return if persisted?
Site::Writer.new(site: site, file: path, Site::Writer.new(site: site, file: path,
content: content.to_yaml, usuarie: usuarie, content: content.to_yaml, usuarie: usuarie,
message: I18n.t('sites.repository.config')).save message: I18n.t('sites.repository.config')).save
# Actualizar el hash para no escribir dos veces
@hash = content.hash
end end
# Detecta si la configuración cambió comparando con el valor inicial # Detecta si la configuración cambió comparando con el valor inicial

View file

@ -1,8 +1,34 @@
= form_for site do |f| = form_for site, html: { class: form_class(site) } do |f|
.form-group .form-group
%h2= f.label :name %h2= f.label :name
%p.lead= t('.help.name') %p.lead= t('.help.name')
= f.text_field :name, class: 'form-control' -#
El dominio contiene letras y números
No puede empezar ni terminar con guiones
No puede estar compuesto solo de números
= f.text_field :name,
class: form_control(site, :name),
required: true,
pattern: '^([a-z0-9][a-z0-9\-]*)?[a-z0-9]$',
minlength: 1,
maxlength: 63
- if invalid? site, :name
.invalid-feedback= site.errors.messages[:name].join(', ')
.form-group
%h2= f.label :title
%p.lead= t('.help.title')
= f.text_field :title, class: form_control(site, :title),
required: true
- if invalid? site, :title
.invalid-feedback= site.errors.messages[:title].join(', ')
.form-group
%h2= f.label :description
%p.lead= t('.help.description')
= f.text_area :description, class: form_control(site, :description),
maxlength: 160, minlength: 50, required: true
- if invalid? site, :description
.invalid-feedback= site.errors.messages[:description].join(', ')
.form-group .form-group
%h2= t('.design.title') %h2= t('.design.title')
%p.lead= t('.help.design') %p.lead= t('.help.design')

View file

@ -30,6 +30,8 @@ es:
password_confirmation: 'Confirmación de contraseña' password_confirmation: 'Confirmación de contraseña'
site: site:
name: 'Nombre' name: 'Nombre'
title: 'Título'
description: 'Descripción'
errors: errors:
models: models:
site: site:
@ -215,7 +217,9 @@ es:
submit: 'Guardar cambios' submit: 'Guardar cambios'
form: form:
help: help:
name: 'El nombre de tu sitio. Solo puede contener letras y números.' 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.'
description: 'La descripción del sitio, que saldrá en buscadores. Entre 50 y 160 caracteres.'
design: 'Elegí el diseño que va a tener tu sitio aquí. Podés cambiarlo luego. De tanto en tanto vamos sumando diseños nuevos.' design: 'Elegí el diseño que va a tener tu sitio aquí. Podés cambiarlo luego. De tanto en tanto vamos sumando diseños nuevos.'
licencia: 'Todo lo que publicamos posee automáticamente derechos licencia: 'Todo lo que publicamos posee automáticamente derechos
de autore. Esto significa que nadie puede hacer uso de nuestras de autore. Esto significa que nadie puede hacer uso de nuestras
@ -231,7 +235,7 @@ es:
url: 'Demostración' url: 'Demostración'
license: 'Leer la licencia' license: 'Leer la licencia'
licencia: licencia:
title: 'Licencia del sitio y todo lo que se publique' title: 'Licencia del sitio y todo lo que publiques'
url: 'Leer la licencia' url: 'Leer la licencia'
deploys: deploys:
title: '¿Dónde querés alojar tu sitio?' title: '¿Dónde querés alojar tu sitio?'

View file

@ -0,0 +1,8 @@
# frozen_string_literal: true
# Agrega la descripción de un sitio
class AddDescriptionToSite < ActiveRecord::Migration[5.2]
def change
add_column :sites, :description, :text
end
end

View file

@ -0,0 +1,8 @@
# frozen_string_literal: true
# Agrega el título al sitio
class AddTitleToSites < ActiveRecord::Migration[5.2]
def change
add_column :sites, :title, :string
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_190_726_003_756) do ActiveRecord::Schema.define(version: 20_190_730_211_756) do
create_table 'build_stats', force: :cascade do |t| create_table 'build_stats', force: :cascade do |t|
t.datetime 'created_at', null: false t.datetime 'created_at', null: false
t.datetime 'updated_at', null: false t.datetime 'updated_at', null: false
@ -99,6 +99,8 @@ ActiveRecord::Schema.define(version: 20_190_726_003_756) do
t.integer 'design_id' t.integer 'design_id'
t.integer 'licencia_id' t.integer 'licencia_id'
t.string 'status', default: 'waiting' t.string 'status', default: 'waiting'
t.text 'description'
t.string 'title'
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

View file

@ -212,3 +212,13 @@ método de deployment).
El plan es migrar todo esto a <drone.io> de forma que la compilación se El plan es migrar todo esto a <drone.io> de forma que la compilación se
haga por separado de sutty. Este es un plan intermedio hasta que haga por separado de sutty. Este es un plan intermedio hasta que
tengamos tiempo de hacerlo realmente. tengamos tiempo de hacerlo realmente.
# TODO
* ver las estadisticas de compilación en lugar del log (el log también)
* comitear en git los articulos (igual no es de esta rama...)
* sanitizar titulo y descripcion, tambien escapar
* al crear el sitio incorporar politica de privacidad y codigo de
convivencia
* link a visitar sitio

View file

@ -34,6 +34,8 @@ class SitesControllerTest < ActionDispatch::IntegrationTest
post sites_url, headers: @authorization, params: { post sites_url, headers: @authorization, params: {
site: { site: {
name: name, name: name,
title: name,
description: name * 2,
design_id: create(:design).id, design_id: create(:design).id,
licencia_id: create(:licencia).id, licencia_id: create(:licencia).id,
deploys_attributes: { deploys_attributes: {

View file

@ -3,6 +3,8 @@
FactoryBot.define do FactoryBot.define do
factory :site do factory :site do
name { "test-#{SecureRandom.hex}" } name { "test-#{SecureRandom.hex}" }
title { SecureRandom.hex }
description { SecureRandom.hex * 2 }
design design
licencia licencia