diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5266ee0e..bb1e69ce 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -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) diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 6ca91f10..e9daeb33 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -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 diff --git a/app/models/site.rb b/app/models/site.rb index c443a11f..3052f1fb 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -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 diff --git a/app/models/site_translation.rb b/app/models/site_translation.rb new file mode 100644 index 00000000..d172a9bd --- /dev/null +++ b/app/models/site_translation.rb @@ -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 diff --git a/app/policies/i18n_policy.rb b/app/policies/i18n_policy.rb deleted file mode 100644 index 899ece09..00000000 --- a/app/policies/i18n_policy.rb +++ /dev/null @@ -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 diff --git a/app/policies/site_policy.rb b/app/policies/site_policy.rb index 72fcf855..c5b0ef51 100644 --- a/app/policies/site_policy.rb +++ b/app/policies/site_policy.rb @@ -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 diff --git a/app/policies/site_translation_policy.rb b/app/policies/site_translation_policy.rb new file mode 100644 index 00000000..b3461d2f --- /dev/null +++ b/app/policies/site_translation_policy.rb @@ -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 diff --git a/app/views/sites/index.haml b/app/views/sites/index.haml index 565406fd..93cc3200 100644 --- a/app/views/sites/index.haml +++ b/app/views/sites/index.haml @@ -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'), diff --git a/config/locales/en.yml b/config/locales/en.yml index e24511ff..051224b8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -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 diff --git a/config/locales/es.yml b/config/locales/es.yml index 5bef36f1..82b83926 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -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