diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 83bffea..097605d 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -5,6 +5,28 @@ @import "select2-theme-bootstrap4/dist/select2-bootstrap"; @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; /* Colores */ diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 3b2f672..527762a 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -30,11 +30,14 @@ class SitesController < ApplicationController def create @site = Site.new(site_params) - current_usuarie.roles << Rol.new(site: @site, - temporal: false, - rol: 'usuarie') + @site.roles << Rol.new(site: @site, + usuarie: current_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) else render 'new' @@ -50,7 +53,9 @@ class SitesController < ApplicationController @site = find_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 else render 'edit' @@ -133,9 +138,7 @@ class SitesController < ApplicationController def site_params params.require(:site) - .permit(:name, :design_id, :licencia_id, - deploys_attributes: %i[ - type id _destroy - ]) + .permit(:name, :design_id, :licencia_id, :description, :title, + deploys_attributes: %i[type id _destroy]) end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f8ca552..449f9c5 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +# Helpers module ApplicationHelper # Devuelve el atributo name de un campo posiblemente anidado def field_name_for_post(names) @@ -24,4 +25,20 @@ module ApplicationHelper def sanitize_markdown(text, options = {}) sanitize(CommonMarker.render_html(text), options) 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 diff --git a/app/models/site.rb b/app/models/site.rb index dd86a9f..6c537e0 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -9,6 +9,8 @@ class Site < ApplicationRecord validates :design_id, presence: true validate :deploy_local_presence 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] @@ -32,6 +34,8 @@ class Site < ApplicationRecord after_create :load_jekyll! # Cambiar el nombre del directorio before_update :update_name! + # Guardar la configuración si hubo cambios + after_save :sync_attributes_with_config! attr_accessor :jekyll, :collections @@ -335,6 +339,14 @@ class Site < ApplicationRecord FileUtils.mv old_path, path 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 # y es la local # diff --git a/app/models/site/config.rb b/app/models/site/config.rb index 9660d9f..1fc459c 100644 --- a/app/models/site/config.rb +++ b/app/models/site/config.rb @@ -28,12 +28,14 @@ class Site end # Escribe los cambios en el repositorio - def write(usuarie) + def write(usuarie = nil) return if persisted? Site::Writer.new(site: site, file: path, content: content.to_yaml, usuarie: usuarie, message: I18n.t('sites.repository.config')).save + # Actualizar el hash para no escribir dos veces + @hash = content.hash end # Detecta si la configuración cambió comparando con el valor inicial diff --git a/app/views/sites/_form.haml b/app/views/sites/_form.haml index 734e1e2..579d1a9 100644 --- a/app/views/sites/_form.haml +++ b/app/views/sites/_form.haml @@ -1,8 +1,34 @@ -= form_for site do |f| += form_for site, html: { class: form_class(site) } do |f| .form-group %h2= f.label :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 %h2= t('.design.title') %p.lead= t('.help.design') diff --git a/config/locales/es.yml b/config/locales/es.yml index 783933d..5f0e543 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -30,6 +30,8 @@ es: password_confirmation: 'Confirmación de contraseña' site: name: 'Nombre' + title: 'Título' + description: 'Descripción' errors: models: site: @@ -215,7 +217,9 @@ es: submit: 'Guardar cambios' form: 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.' licencia: 'Todo lo que publicamos posee automáticamente derechos de autore. Esto significa que nadie puede hacer uso de nuestras @@ -231,7 +235,7 @@ es: url: 'Demostración' license: 'Leer la 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' deploys: title: '¿Dónde querés alojar tu sitio?' diff --git a/db/migrate/20190730211624_add_description_to_site.rb b/db/migrate/20190730211624_add_description_to_site.rb new file mode 100644 index 0000000..d907df4 --- /dev/null +++ b/db/migrate/20190730211624_add_description_to_site.rb @@ -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 diff --git a/db/migrate/20190730211756_add_title_to_sites.rb b/db/migrate/20190730211756_add_title_to_sites.rb new file mode 100644 index 0000000..a48a241 --- /dev/null +++ b/db/migrate/20190730211756_add_title_to_sites.rb @@ -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 diff --git a/db/schema.rb b/db/schema.rb index f7c0bd7..9455733 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -12,7 +12,7 @@ # # 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| t.datetime 'created_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 'licencia_id' t.string 'status', default: 'waiting' + t.text 'description' + t.string 'title' t.index ['design_id'], name: 'index_sites_on_design_id' t.index ['licencia_id'], name: 'index_sites_on_licencia_id' t.index ['name'], name: 'index_sites_on_name', unique: true diff --git a/doc/crear_sitios.md b/doc/crear_sitios.md index 92a309c..a70173c 100644 --- a/doc/crear_sitios.md +++ b/doc/crear_sitios.md @@ -212,3 +212,13 @@ método de deployment). El plan es migrar todo esto a de forma que la compilación se haga por separado de sutty. Este es un plan intermedio hasta que 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 diff --git a/test/controllers/sites_controller_test.rb b/test/controllers/sites_controller_test.rb index 1c5d30e..35646f3 100644 --- a/test/controllers/sites_controller_test.rb +++ b/test/controllers/sites_controller_test.rb @@ -34,6 +34,8 @@ class SitesControllerTest < ActionDispatch::IntegrationTest post sites_url, headers: @authorization, params: { site: { name: name, + title: name, + description: name * 2, design_id: create(:design).id, licencia_id: create(:licencia).id, deploys_attributes: { diff --git a/test/factories/site.rb b/test/factories/site.rb index f59221e..d9d8720 100644 --- a/test/factories/site.rb +++ b/test/factories/site.rb @@ -3,6 +3,8 @@ FactoryBot.define do factory :site do name { "test-#{SecureRandom.hex}" } + title { SecureRandom.hex } + description { SecureRandom.hex * 2 } design licencia