crear sitios!

This commit is contained in:
f 2019-07-12 20:40:44 -03:00
parent 5d4c797132
commit 3a3dd7a2de
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
13 changed files with 148 additions and 11 deletions

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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 : ''}

View file

@ -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
View 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'

View file

@ -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.

View file

@ -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:

View file

@ -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:

View file

@ -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

View file

@ -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.

View 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