ver todos los sitios como usuarie y como invitade

This commit is contained in:
f 2019-07-03 21:47:59 -03:00
parent 15a92c1772
commit c804d386f0
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
10 changed files with 74 additions and 65 deletions

View file

@ -19,7 +19,10 @@ class ApplicationController < ActionController::Base
def find_site
id = params[:site_id] || params[:id]
current_usuarie.sites.find_by_name id
# TODO: encontrar una forma mejor de buscar en todos los sitios en
# lugar de desperdiciar una consulta
current_usuarie.sites.find_by_name(id) ||
current_usuarie.sites_as_invitade.find_by_name(id)
end
def find_post(site)

View file

@ -8,7 +8,8 @@ class SitesController < ApplicationController
# Ver un listado de sitios
def index
authorize Site
@sites = current_usuarie.sites
@sites = [current_usuarie.sites,
current_usuarie.sites_as_invitade].flatten
end
# No tenemos propiedades de un sitio aún, así que vamos al listado de

View file

@ -11,14 +11,17 @@ class Site < ApplicationRecord
has_and_belongs_to_many :invitades, class_name: 'Usuarie',
join_table: 'invitades_sites'
# Carga el sitio Jekyll una vez que se inicializa el modelo
after_initialize :load_jekyll!
attr_accessor :jekyll, :collections
def load_jekyll!
Dir.chdir(path) do
@jekyll ||= Site.load_jekyll(Dir.pwd)
end
def invitade?(usuarie)
invitades.pluck(:id).include? usuarie.id
end
def usuarie?(usuarie)
usuaries.pluck(:id).include? usuarie.id
end
# Traer la ruta del sitio
@ -177,31 +180,6 @@ class Site < ApplicationRecord
end.flatten.uniq.compact
end
# Las usuarias que tienen acceso a este sitio se guardan en un archivo
# `.usuarias` que tiene la dirección de correo de cada una
def usuarias_file
File.join(path, '.usuarias')
end
# Obtiene las usuarias que gestionan este sitio
def usuarias
@usuarias ||= File.read(usuarias_file).split("\n").map do |u|
Usuaria.find(u)
end
end
def invitadxs_file
File.join(path, '.invitadxs')
end
def invitadxs
return [] unless invitadxs?
@invitadxs ||= File.read(invitadxs_file).split("\n").map do |i|
Invitadx.find_by_email(i)
end
end
def failed_file
File.join(path, '.failed')
end
@ -358,4 +336,13 @@ class Site < ApplicationRecord
Jekyll::Site.new(config)
end
private
# Carga el sitio Jekyll
def load_jekyll!
Dir.chdir(path) do
@jekyll ||= Site.load_jekyll(Dir.pwd)
end
end
end

View file

@ -0,0 +1,12 @@
# frozen_string_literal: true
# Una clase de I18n solo necesaria para Pundit
#
# ver app/policies/i18n.rb
class SiteTranslation
attr_reader :site
def initialize(site)
@site = site
end
end

View file

@ -1,23 +0,0 @@
# frozen_string_literal: true
# Política de acceso a la traducción del sitio.
#
# TODO: Prohibir Invitades
class I18nPolicy
def initialize(usuarix, _i18n)
@usuarix = usuarix
end
# Solo las usuarias
def index?
true
end
def edit?
update?
end
def update?
true
end
end

View file

@ -1,8 +1,6 @@
# frozen_string_literal: true
# Política de acceso para sitios
#
# TODO: Distinguir entre Invitades
class SitePolicy
attr_reader :site, :usuarie
@ -11,19 +9,19 @@ class SitePolicy
@site = site
end
# Solo las usuarias
# Todes les usuaries pueden ver sus propios sitios
def index?
true
end
# Todxs lxs usuarixs pueden ver el sitio
# Todes les usuaries pueden ver el sitio
def show?
true
end
# Solo las usuarias
# Les invitades no pueden generar el sitio
def build?
true
!site.invitade?(usuarie)
end
def send_public_file?
@ -31,14 +29,14 @@ class SitePolicy
end
def enqueue?
true
build?
end
def build_log?
true
build?
end
def reorder_posts?
true
build?
end
end

View file

@ -0,0 +1,24 @@
# frozen_string_literal: true
# Política de acceso a la traducción del sitio.
class SiteTranslationPolicy
attr_reader :usuarie, :i18n
def initialize(usuarie, i18n)
@usuarie = usuarie
@i18n = i18n
end
# Solo las usuarias
def index?
!i18n.site.invitade?(usuarie)
end
def edit?
index?
end
def update?
index?
end
end

View file

@ -13,7 +13,12 @@
- @sites.each do |site|
%tr
%td
%h2= link_to site.name, site_path(site)
%h2
= link_to site.name, site_path(site)
- if site.invitade? current_usuarie
%span.badge.badge-warning{data: { toggle: 'tooltip' },
title: t('help.sites.invitade')}
= t('.invitade')
%br
.btn-group{role: 'group', 'aria-label': t('sites.actions')}
- if policy(site).show?
@ -22,7 +27,7 @@
type: 'success',
link: site_path(site),
text: t('sites.posts')
- if policy(:i18n).edit?
- if policy(SiteTranslation.new(site)).edit?
= render 'layouts/btn_with_tooltip',
tooltip: t('help.sites.edit_translations'),
text: t('i18n.edit'),

View file

@ -89,6 +89,7 @@ en:
finishes."
build_log: "This is the log for what happened during site
generation. If there was an issue, you'll see it here."
invitade: "Invited users can only add and modify entries but can't publish until reviewed by a user"
close: 'Close help'
markdown:
intro: 'The text is formatted using a syntax called Markdown, a

View file

@ -99,6 +99,7 @@ es:
avisándote cómo fue todo.'
build_log: 'Este es el registro de lo que sucedió mientras se
generaba el sitio. Si hubo algún problema, saldrá aquí.'
invitade: 'Les invitades a un sitio solo pueden crear y modificar entradas propias y no pueden publicar sin la revisión de une usuarie'
close: 'Cerrar ayuda'
markdown:
intro: 'El formato del texto se llama Markdown. Es un formato