empezar a migrar a roles, que nos permiten otras cosas

This commit is contained in:
f 2019-07-05 21:21:49 -03:00
parent 64fcf61c67
commit e485971940
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
9 changed files with 68 additions and 9 deletions

View file

@ -74,9 +74,10 @@ class UsuariesController < ApplicationController
usuarie = Usuarie.invite! email: invitacion.address usuarie = Usuarie.invite! email: invitacion.address
# No invitar al sitio si ya estaba en la lista! # No invitar al sitio si ya estaba en la lista!
unless @site.invitade?(usuarie) || @site.usuarie?(usuarie) next if @site.invitade?(usuarie) || @site.usuarie?(usuarie)
@site.send(invited_as) << usuarie
end @site.roles << Rol.create(usuarie: usuarie, site: @site,
temporal: true, rol: invited_as)
end end
redirect_to site_usuaries_path(@site) redirect_to site_usuaries_path(@site)
@ -101,9 +102,10 @@ class UsuariesController < ApplicationController
# El tipo de invitación que tenemos que enviar, si alguien mandó # El tipo de invitación que tenemos que enviar, si alguien mandó
# cualquier cosa, usamos el privilegio menor. # cualquier cosa, usamos el privilegio menor.
def invited_as def invited_as
invited_as = params[:invited_as].try(:to_sym) if Rol::ROLES.include?(params[:invited_as])
invited_as = :invitades unless %i[usuaries invitades].include?(invited_as) params[:invited_as]
else
invited_as 'invitade'
end
end end
end end

14
app/models/rol.rb Normal file
View file

@ -0,0 +1,14 @@
# frozen_string_literal: true
# Define el rol que tiene una usuaria en un sitio
#
# Un rol puede ser temporal, es decir que aun no se ha aceptado y
# necesita del consentimiento de le usuarie :)
class Rol < ApplicationRecord
ROLES = %w[usuarie invitade].freeze
belongs_to :usuarie
belongs_to :site
validates_inclusion_of :rol, in: ROLES
end

View file

@ -7,6 +7,7 @@ class Site < ApplicationRecord
friendly_id :name, use: %i[finders] friendly_id :name, use: %i[finders]
has_many :roles
has_and_belongs_to_many :usuaries, class_name: 'Usuarie' has_and_belongs_to_many :usuaries, class_name: 'Usuarie'
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'

View file

@ -8,6 +8,7 @@ class Usuarie < ApplicationRecord
validates_uniqueness_of :email validates_uniqueness_of :email
has_many :roles
has_and_belongs_to_many :sites has_and_belongs_to_many :sites
has_and_belongs_to_many :sites_as_invitade, has_and_belongs_to_many :sites_as_invitade,
class_name: 'Site', class_name: 'Site',

View file

@ -15,7 +15,7 @@
.row .row
.col .col
= form_with url: site_usuaries_invite_path(@site) do |f| = form_with url: site_usuaries_invite_path(@site) do |f|
= f.hidden_field :invite_as, value: params[:invite_as] = f.hidden_field :invited_as, value: params[:invite_as].singularize
.form-group .form-group
= f.label :invitaciones do = f.label :invitaciones do
= t('.invitaciones') = t('.invitaciones')

View file

@ -7,6 +7,8 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.singular 'invitades', 'invitade' inflect.singular 'invitades', 'invitade'
inflect.plural 'usuarie', 'usuaries' inflect.plural 'usuarie', 'usuaries'
inflect.singular 'usuaries', 'usuarie' inflect.singular 'usuaries', 'usuarie'
inflect.plural 'rol', 'roles'
inflect.singular 'roles', 'rol'
end end
ActiveSupport::Inflector.inflections(:es) do |inflect| ActiveSupport::Inflector.inflections(:es) do |inflect|
@ -16,4 +18,6 @@ ActiveSupport::Inflector.inflections(:es) do |inflect|
inflect.singular 'invitades', 'invitade' inflect.singular 'invitades', 'invitade'
inflect.plural 'usuarie', 'usuaries' inflect.plural 'usuarie', 'usuaries'
inflect.singular 'usuaries', 'usuarie' inflect.singular 'usuaries', 'usuarie'
inflect.plural 'rol', 'roles'
inflect.singular 'roles', 'rol'
end end

View file

@ -0,0 +1,17 @@
# frozen_string_literal: true
# Crea la tabla de roles
class CreateRoles < ActiveRecord::Migration[5.2]
def change
create_table :roles do |t|
t.timestamps
t.belongs_to :site
t.belongs_to :usuarie
t.string :rol
t.boolean :temporal
# Solo podemos tener un rol a la vez
t.index %i[site_id usuarie_id], unique: true
end
end
end

View file

@ -12,13 +12,25 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20_190_705_215_536) do ActiveRecord::Schema.define(version: 20_190_706_000_159) do
create_table 'invitades_sites', id: false, force: :cascade do |t| create_table 'invitades_sites', id: false, force: :cascade do |t|
t.integer 'site_id' t.integer 'site_id'
t.integer 'usuarie_id' t.integer 'usuarie_id'
t.index %w[site_id usuarie_id], name: 'index_invitades_sites_on_site_id_and_usuarie_id', unique: true t.index %w[site_id usuarie_id], name: 'index_invitades_sites_on_site_id_and_usuarie_id', unique: true
end end
create_table 'roles', force: :cascade do |t|
t.datetime 'created_at', null: false
t.datetime 'updated_at', null: false
t.integer 'site_id'
t.integer 'usuarie_id'
t.string 'rol'
t.boolean 'temporal'
t.index %w[site_id usuarie_id], name: 'index_roles_on_site_id_and_usuarie_id', unique: true
t.index ['site_id'], name: 'index_roles_on_site_id'
t.index ['usuarie_id'], name: 'index_roles_on_usuarie_id'
end
create_table 'sites', force: :cascade do |t| create_table 'sites', force: :cascade do |t|
t.datetime 'created_at', null: false t.datetime 'created_at', null: false
t.datetime 'updated_at', null: false t.datetime 'updated_at', null: false

View file

@ -58,6 +58,14 @@ momento, sino se pueden loguear normalmente.
Si ya están logueades, se acepta la invitación inmediatamente. Si ya están logueades, se acepta la invitación inmediatamente.
Para poder hacer una invitación con consentimiento, se guarda la
relación en una tabla aparte. Cuando la usuaria acepta la invitación
esa relación se borra y se aplican los cambios.
En el futuro cambiaríamos el sistema de permisos separados que tenemos
ahora por una tabla de roles (por qué no la hicimos desde el principio!)
con un campo binario que indique si ya se aceptó la invitación o no.
### Invitades desde la web ### Invitades desde la web
Al publicar la URL de invitación, les invitades se puedan registrar Al publicar la URL de invitación, les invitades se puedan registrar