crear sitios!
This commit is contained in:
parent
5d4c797132
commit
3a3dd7a2de
13 changed files with 148 additions and 11 deletions
|
@ -14,12 +14,30 @@ class SitesController < ApplicationController
|
||||||
# No tenemos propiedades de un sitio aún, así que vamos al listado de
|
# No tenemos propiedades de un sitio aún, así que vamos al listado de
|
||||||
# artículos
|
# artículos
|
||||||
def show
|
def show
|
||||||
authorize Site
|
|
||||||
site = find_site
|
site = find_site
|
||||||
|
authorize site
|
||||||
|
|
||||||
redirect_to site_posts_path(site)
|
redirect_to site_posts_path(site)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
@site = Site.new
|
||||||
|
authorize @site
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@site = Site.new(site_params)
|
||||||
|
current_usuarie.roles << Rol.new(site: @site,
|
||||||
|
temporal: false,
|
||||||
|
rol: 'usuarie')
|
||||||
|
|
||||||
|
if current_usuarie.save
|
||||||
|
redirect_to site_path(@site)
|
||||||
|
else
|
||||||
|
render 'new'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Envía un archivo del directorio público de Jekyll
|
# Envía un archivo del directorio público de Jekyll
|
||||||
def send_public_file
|
def send_public_file
|
||||||
authorize Site
|
authorize Site
|
||||||
|
@ -79,4 +97,10 @@ class SitesController < ApplicationController
|
||||||
|
|
||||||
redirect_to site_posts_path @site
|
redirect_to site_posts_path @site
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def site_params
|
||||||
|
params.require(:site).permit(:name)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -359,7 +359,7 @@ class Site < ApplicationRecord
|
||||||
|
|
||||||
# Carga el sitio Jekyll
|
# Carga el sitio Jekyll
|
||||||
def load_jekyll!
|
def load_jekyll!
|
||||||
return unless name
|
return unless name.present? && File.directory?(path)
|
||||||
|
|
||||||
Dir.chdir(path) do
|
Dir.chdir(path) do
|
||||||
@jekyll ||= Site.load_jekyll(Dir.pwd)
|
@jekyll ||= Site.load_jekyll(Dir.pwd)
|
||||||
|
|
|
@ -16,13 +16,35 @@ class SitePolicy
|
||||||
|
|
||||||
# Todes les usuaries pueden ver el sitio si aceptaron la invitación
|
# Todes les usuaries pueden ver el sitio si aceptaron la invitación
|
||||||
def show?
|
def show?
|
||||||
!@usuarie.rol_for_site(@site).temporal
|
!current_role.temporal
|
||||||
|
end
|
||||||
|
|
||||||
|
# Todes pueden crear nuevos sitios
|
||||||
|
def new?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
def create?
|
||||||
|
new?
|
||||||
|
end
|
||||||
|
|
||||||
|
# Para poder editarlos también tienen que haber aceptado la invitación
|
||||||
|
def edit?
|
||||||
|
show? && usuarie?
|
||||||
|
end
|
||||||
|
|
||||||
|
def update?
|
||||||
|
edit?
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy?
|
||||||
|
edit?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Les invitades no pueden generar el sitio y les usuaries solo hasta
|
# Les invitades no pueden generar el sitio y les usuaries solo hasta
|
||||||
# que aceptan la invitación
|
# que aceptan la invitación
|
||||||
def build?
|
def build?
|
||||||
show? && !site.invitade?(usuarie)
|
show? && usuarie?
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_public_file?
|
def send_public_file?
|
||||||
|
@ -40,4 +62,18 @@ class SitePolicy
|
||||||
def reorder_posts?
|
def reorder_posts?
|
||||||
build?
|
build?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def current_role
|
||||||
|
usuarie.rol_for_site(site)
|
||||||
|
end
|
||||||
|
|
||||||
|
def usuarie?
|
||||||
|
site.usuarie? usuarie
|
||||||
|
end
|
||||||
|
|
||||||
|
def invitade?
|
||||||
|
site.invitade? usuarie
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
data: { toggle: 'tooltip' }, title: t('help.logout'),
|
data: { toggle: 'tooltip' }, title: t('help.logout'),
|
||||||
role: 'button', class: 'btn-text' do
|
role: 'button', class: 'btn-text' do
|
||||||
= fa_icon 'sign-out', title: t('help.logout')
|
= fa_icon 'sign-out', title: t('help.logout')
|
||||||
- if help = @site.try(:config).try(:dig, 'help')
|
- if @site.try(:persisted?) && (help = @site.try(:config).try(:dig, 'help'))
|
||||||
%li.breadcrumb-item= link_to t('.help'), help, target: '_blank'
|
%li.breadcrumb-item= link_to t('.help'), help, target: '_blank'
|
||||||
- crumbs.compact.each do |crumb|
|
- crumbs.compact.each do |crumb|
|
||||||
- if current_user.is_a? Invitadx
|
- if current_user.is_a? Invitadx
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
= csrf_meta_tags
|
= csrf_meta_tags
|
||||||
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
|
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
|
||||||
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
|
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
|
||||||
- if @site.try(:config).try(:dig, 'css')
|
- if @site.try(:persisted?) && @site.try(:config).try(:dig, 'css')
|
||||||
%link{rel: 'stylesheet', type: 'text/css', href: @site.get_url_from_site(@site.config.dig('css'))}
|
%link{rel: 'stylesheet', type: 'text/css', href: @site.get_url_from_site(@site.config.dig('css'))}
|
||||||
- style = "background-image: url(#{@site.try(:cover) || image_url('background.jpg')})"
|
- style = "background-image: url(#{@site.try(:cover) || image_url('background.jpg')})"
|
||||||
%body{class: @has_cover ? 'background-cover' : '', style: @has_cover ? style : ''}
|
%body{class: @has_cover ? 'background-cover' : '', style: @has_cover ? style : ''}
|
||||||
|
|
|
@ -4,7 +4,11 @@
|
||||||
= render 'layouts/breadcrumb', crumbs: [ t('sites.index') ]
|
= render 'layouts/breadcrumb', crumbs: [ t('sites.index') ]
|
||||||
.row
|
.row
|
||||||
.col
|
.col
|
||||||
%h1= t('sites.title')
|
%h1
|
||||||
|
= t('sites.title')
|
||||||
|
- if policy(Site).new?
|
||||||
|
= link_to t('sites.new.title'), new_site_path,
|
||||||
|
class: 'btn btn-info'
|
||||||
|
|
||||||
= render 'layouts/help', help: t('help.sites.index')
|
= render 'layouts/help', help: t('help.sites.index')
|
||||||
|
|
||||||
|
|
14
app/views/sites/new.haml
Normal file
14
app/views/sites/new.haml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
.row
|
||||||
|
.col
|
||||||
|
= render 'layouts/breadcrumb',
|
||||||
|
crumbs: [ link_to(t('sites.index'), sites_path), t('.title') ]
|
||||||
|
.row
|
||||||
|
.col
|
||||||
|
%h1= t('.title')
|
||||||
|
|
||||||
|
= form_for @site do |f|
|
||||||
|
.form-group
|
||||||
|
= f.label :name
|
||||||
|
= f.text_field :name, class: 'form-control'
|
||||||
|
.form-group
|
||||||
|
= f.submit t('.submit'), class: 'btn btn-success'
|
|
@ -78,7 +78,7 @@ Devise.setup do |config|
|
||||||
# `config.http_authenticatable = [:database]` will enable it only for
|
# `config.http_authenticatable = [:database]` will enable it only for
|
||||||
# database authentication. The supported strategies are: :database
|
# database authentication. The supported strategies are: :database
|
||||||
# = Support basic authentication with authentication key + password
|
# = Support basic authentication with authentication key + password
|
||||||
# config.http_authenticatable = false
|
config.http_authenticatable = true
|
||||||
|
|
||||||
# If 401 status code should be returned for AJAX requests. True by
|
# If 401 status code should be returned for AJAX requests. True by
|
||||||
# default.
|
# default.
|
||||||
|
|
|
@ -152,6 +152,9 @@ en:
|
||||||
invitations:
|
invitations:
|
||||||
accept: 'Accept invitation'
|
accept: 'Accept invitation'
|
||||||
reject: 'No, thanks'
|
reject: 'No, thanks'
|
||||||
|
new:
|
||||||
|
title: 'Create site'
|
||||||
|
submit: 'Create site'
|
||||||
footer:
|
footer:
|
||||||
powered_by: 'is developed by'
|
powered_by: 'is developed by'
|
||||||
templates:
|
templates:
|
||||||
|
|
|
@ -7,6 +7,8 @@ es:
|
||||||
email: 'Correo electrónico'
|
email: 'Correo electrónico'
|
||||||
password: 'Contraseña'
|
password: 'Contraseña'
|
||||||
password_confirmation: 'Confirmación de contraseña'
|
password_confirmation: 'Confirmación de contraseña'
|
||||||
|
site:
|
||||||
|
name: 'Nombre'
|
||||||
errors:
|
errors:
|
||||||
models:
|
models:
|
||||||
invitadx:
|
invitadx:
|
||||||
|
@ -155,6 +157,9 @@ es:
|
||||||
invitations:
|
invitations:
|
||||||
accept: 'Aceptar la invitación'
|
accept: 'Aceptar la invitación'
|
||||||
reject: 'No, gracias'
|
reject: 'No, gracias'
|
||||||
|
new:
|
||||||
|
title: 'Crear un sitio'
|
||||||
|
submit: 'Crear sitio'
|
||||||
footer:
|
footer:
|
||||||
powered_by: 'es desarrollada por'
|
powered_by: 'es desarrollada por'
|
||||||
i18n:
|
i18n:
|
||||||
|
|
|
@ -11,9 +11,7 @@ Rails.application.routes.draw do
|
||||||
# como un objeto válido
|
# como un objeto válido
|
||||||
resources :invitadxs, only: [:create]
|
resources :invitadxs, only: [:create]
|
||||||
|
|
||||||
resources :sites, only: %i[index show],
|
resources :sites, constraints: { site_id: %r{[^/]+}, id: %r{[^/]+} } do
|
||||||
constraints: { site_id: %r{[^/]+}, id: %r{[^/]+} } do
|
|
||||||
|
|
||||||
get 'public/:type/:basename', to: 'sites#send_public_file'
|
get 'public/:type/:basename', to: 'sites#send_public_file'
|
||||||
|
|
||||||
# Gestionar usuaries
|
# Gestionar usuaries
|
||||||
|
|
|
@ -105,3 +105,11 @@ falta (algunas plantillas tienen requisitos extraños).
|
||||||
|
|
||||||
Las plantillas se instalan como gemas en los sitios, de forma que
|
Las plantillas se instalan como gemas en los sitios, de forma que
|
||||||
podemos cambiarla desde las opciones del sitio luego.
|
podemos cambiarla desde las opciones del sitio luego.
|
||||||
|
|
||||||
|
## Internamente
|
||||||
|
|
||||||
|
Al crear un sitio, clonar el esqueleto en el lugar correcto. Al
|
||||||
|
eliminarlo, eliminar el directorio.
|
||||||
|
|
||||||
|
Lo correcto sería preguntar a todes les usuaries si están de acuerdo en
|
||||||
|
borrar el sitio. Si una no está de acuerdo, el borrado se cancela.
|
||||||
|
|
45
test/controllers/sites_controller_test.rb
Normal file
45
test/controllers/sites_controller_test.rb
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class SitesControllerTest < ActionDispatch::IntegrationTest
|
||||||
|
setup do
|
||||||
|
@rol = create :rol
|
||||||
|
@site = @rol.site
|
||||||
|
@usuarie = @rol.usuarie
|
||||||
|
|
||||||
|
@authorization = {
|
||||||
|
Authorization: ActionController::HttpAuthentication::Basic
|
||||||
|
.encode_credentials(@usuarie.email, @usuarie.password)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
teardown do
|
||||||
|
@site.destroy
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'se pueden ver' do
|
||||||
|
get sites_url, headers: @authorization
|
||||||
|
|
||||||
|
assert_match @site.name, response.body
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'se puede ver el formulario de creación' do
|
||||||
|
get new_site_url, headers: @authorization
|
||||||
|
|
||||||
|
assert_match(/<form.*id="new_site"/, response.body)
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'se pueden crear' do
|
||||||
|
name = SecureRandom.hex
|
||||||
|
|
||||||
|
post sites_url, headers: @authorization, params: {
|
||||||
|
site: {
|
||||||
|
name: name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_nothing_raised do
|
||||||
|
site = Site.find_by_name(name)
|
||||||
|
site.destroy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue