mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-22 19:56:21 +00:00
ver todos los sitios como usuarie y como invitade
This commit is contained in:
parent
15a92c1772
commit
c804d386f0
10 changed files with 74 additions and 65 deletions
|
@ -19,7 +19,10 @@ class ApplicationController < ActionController::Base
|
||||||
def find_site
|
def find_site
|
||||||
id = params[:site_id] || params[:id]
|
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
|
end
|
||||||
|
|
||||||
def find_post(site)
|
def find_post(site)
|
||||||
|
|
|
@ -8,7 +8,8 @@ class SitesController < ApplicationController
|
||||||
# Ver un listado de sitios
|
# Ver un listado de sitios
|
||||||
def index
|
def index
|
||||||
authorize Site
|
authorize Site
|
||||||
@sites = current_usuarie.sites
|
@sites = [current_usuarie.sites,
|
||||||
|
current_usuarie.sites_as_invitade].flatten
|
||||||
end
|
end
|
||||||
|
|
||||||
# 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
|
||||||
|
|
|
@ -11,14 +11,17 @@ class Site < ApplicationRecord
|
||||||
has_and_belongs_to_many :invitades, class_name: 'Usuarie',
|
has_and_belongs_to_many :invitades, class_name: 'Usuarie',
|
||||||
join_table: 'invitades_sites'
|
join_table: 'invitades_sites'
|
||||||
|
|
||||||
|
# Carga el sitio Jekyll una vez que se inicializa el modelo
|
||||||
after_initialize :load_jekyll!
|
after_initialize :load_jekyll!
|
||||||
|
|
||||||
attr_accessor :jekyll, :collections
|
attr_accessor :jekyll, :collections
|
||||||
|
|
||||||
def load_jekyll!
|
def invitade?(usuarie)
|
||||||
Dir.chdir(path) do
|
invitades.pluck(:id).include? usuarie.id
|
||||||
@jekyll ||= Site.load_jekyll(Dir.pwd)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def usuarie?(usuarie)
|
||||||
|
usuaries.pluck(:id).include? usuarie.id
|
||||||
end
|
end
|
||||||
|
|
||||||
# Traer la ruta del sitio
|
# Traer la ruta del sitio
|
||||||
|
@ -177,31 +180,6 @@ class Site < ApplicationRecord
|
||||||
end.flatten.uniq.compact
|
end.flatten.uniq.compact
|
||||||
end
|
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
|
def failed_file
|
||||||
File.join(path, '.failed')
|
File.join(path, '.failed')
|
||||||
end
|
end
|
||||||
|
@ -358,4 +336,13 @@ class Site < ApplicationRecord
|
||||||
|
|
||||||
Jekyll::Site.new(config)
|
Jekyll::Site.new(config)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Carga el sitio Jekyll
|
||||||
|
def load_jekyll!
|
||||||
|
Dir.chdir(path) do
|
||||||
|
@jekyll ||= Site.load_jekyll(Dir.pwd)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
12
app/models/site_translation.rb
Normal file
12
app/models/site_translation.rb
Normal 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
|
|
@ -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
|
|
|
@ -1,8 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
# Política de acceso para sitios
|
# Política de acceso para sitios
|
||||||
#
|
|
||||||
# TODO: Distinguir entre Invitades
|
|
||||||
class SitePolicy
|
class SitePolicy
|
||||||
attr_reader :site, :usuarie
|
attr_reader :site, :usuarie
|
||||||
|
|
||||||
|
@ -11,19 +9,19 @@ class SitePolicy
|
||||||
@site = site
|
@site = site
|
||||||
end
|
end
|
||||||
|
|
||||||
# Solo las usuarias
|
# Todes les usuaries pueden ver sus propios sitios
|
||||||
def index?
|
def index?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
# Todxs lxs usuarixs pueden ver el sitio
|
# Todes les usuaries pueden ver el sitio
|
||||||
def show?
|
def show?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
# Solo las usuarias
|
# Les invitades no pueden generar el sitio
|
||||||
def build?
|
def build?
|
||||||
true
|
!site.invitade?(usuarie)
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_public_file?
|
def send_public_file?
|
||||||
|
@ -31,14 +29,14 @@ class SitePolicy
|
||||||
end
|
end
|
||||||
|
|
||||||
def enqueue?
|
def enqueue?
|
||||||
true
|
build?
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_log?
|
def build_log?
|
||||||
true
|
build?
|
||||||
end
|
end
|
||||||
|
|
||||||
def reorder_posts?
|
def reorder_posts?
|
||||||
true
|
build?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
24
app/policies/site_translation_policy.rb
Normal file
24
app/policies/site_translation_policy.rb
Normal 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
|
|
@ -13,7 +13,12 @@
|
||||||
- @sites.each do |site|
|
- @sites.each do |site|
|
||||||
%tr
|
%tr
|
||||||
%td
|
%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
|
%br
|
||||||
.btn-group{role: 'group', 'aria-label': t('sites.actions')}
|
.btn-group{role: 'group', 'aria-label': t('sites.actions')}
|
||||||
- if policy(site).show?
|
- if policy(site).show?
|
||||||
|
@ -22,7 +27,7 @@
|
||||||
type: 'success',
|
type: 'success',
|
||||||
link: site_path(site),
|
link: site_path(site),
|
||||||
text: t('sites.posts')
|
text: t('sites.posts')
|
||||||
- if policy(:i18n).edit?
|
- if policy(SiteTranslation.new(site)).edit?
|
||||||
= render 'layouts/btn_with_tooltip',
|
= render 'layouts/btn_with_tooltip',
|
||||||
tooltip: t('help.sites.edit_translations'),
|
tooltip: t('help.sites.edit_translations'),
|
||||||
text: t('i18n.edit'),
|
text: t('i18n.edit'),
|
||||||
|
|
|
@ -89,6 +89,7 @@ en:
|
||||||
finishes."
|
finishes."
|
||||||
build_log: "This is the log for what happened during site
|
build_log: "This is the log for what happened during site
|
||||||
generation. If there was an issue, you'll see it here."
|
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'
|
close: 'Close help'
|
||||||
markdown:
|
markdown:
|
||||||
intro: 'The text is formatted using a syntax called Markdown, a
|
intro: 'The text is formatted using a syntax called Markdown, a
|
||||||
|
|
|
@ -99,6 +99,7 @@ es:
|
||||||
avisándote cómo fue todo.'
|
avisándote cómo fue todo.'
|
||||||
build_log: 'Este es el registro de lo que sucedió mientras se
|
build_log: 'Este es el registro de lo que sucedió mientras se
|
||||||
generaba el sitio. Si hubo algún problema, saldrá aquí.'
|
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'
|
close: 'Cerrar ayuda'
|
||||||
markdown:
|
markdown:
|
||||||
intro: 'El formato del texto se llama Markdown. Es un formato
|
intro: 'El formato del texto se llama Markdown. Es un formato
|
||||||
|
|
Loading…
Reference in a new issue