mirror of
https://github.com/openSUSE/osem.git
synced 2026-08-13 19:54:02 +00:00
Roles into their own controller. Rework interface. Add flash messages to ajax calls. Add description to roles. Possible to edit roles in use.
This commit is contained in:
parent
eda5c2bc07
commit
ccd7ecbb90
59 changed files with 618 additions and 356 deletions
|
|
@ -66,13 +66,15 @@ module Admin
|
|||
def create
|
||||
@conference = Conference.new(conference_params)
|
||||
|
||||
if @conference.valid?
|
||||
@conference.save
|
||||
if @conference.save
|
||||
flash[:notice] = 'Conference was successfully created.'
|
||||
|
||||
# user that creates the conference becomes organizer of that conference
|
||||
current_user.add_role :organizer, @conference
|
||||
redirect_to(admin_conference_path(id: @conference.short_title),
|
||||
notice: 'Conference was successfully created.')
|
||||
|
||||
redirect_to admin_conference_path(id: @conference.short_title)
|
||||
else
|
||||
flash[:error] = 'Could not create conference. ' + @conference.errors.full_messages.to_sentence
|
||||
render action: 'new'
|
||||
end
|
||||
end
|
||||
|
|
@ -173,31 +175,6 @@ module Admin
|
|||
end
|
||||
end
|
||||
|
||||
def roles
|
||||
@user = User.new
|
||||
@roles = Role::ACTIONABLES + Role::LABELS
|
||||
|
||||
params[:user] ? (@selection = params[:user][:roles].parameterize.underscore) : (@selection = 'organizer')
|
||||
@role_users = get_users(@selection)
|
||||
end
|
||||
|
||||
def add_user
|
||||
@user = User.find_by(email: params[:user][:email])
|
||||
@selection = params[:role]
|
||||
@user.add_role @selection, @conference
|
||||
|
||||
@role_users = get_users(@selection)
|
||||
render 'roles', formats: [:js]
|
||||
end
|
||||
|
||||
def remove_user
|
||||
@selection = params[:role]
|
||||
@user.revoke @selection, @conference
|
||||
|
||||
@role_users = get_users(@selection)
|
||||
render 'roles', formats: [:js]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def conference_params
|
||||
|
|
@ -213,14 +190,5 @@ module Admin
|
|||
:photos_attributes, :targets, :targets_attributes,
|
||||
:campaigns, :campaigns_attributes, :registration_limit)
|
||||
end
|
||||
|
||||
def get_users(role_name)
|
||||
@role_users = {}
|
||||
# Initialize @role variable, so that view can show the role description
|
||||
@role = Role.where(name: role_name, resource: @conference)
|
||||
@role.blank? ? @role_users[role_name] = @role : @role_users[role_name] = @role.first.users
|
||||
|
||||
@role_users
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
87
app/controllers/admin/roles_controller.rb
Normal file
87
app/controllers/admin/roles_controller.rb
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
module Admin
|
||||
class RolesController < Admin::BaseController
|
||||
load_and_authorize_resource :conference, find_by: :short_title
|
||||
before_action :set_selection
|
||||
# Show flash message with ajax calls
|
||||
after_action :prepare_unobtrusive_flash, only: :toggle_user
|
||||
|
||||
def index
|
||||
@roles = Role.where(resource: @conference)
|
||||
end
|
||||
|
||||
def show
|
||||
@users = @role.users
|
||||
end
|
||||
|
||||
def edit
|
||||
@users = @role.users
|
||||
end
|
||||
|
||||
def update
|
||||
role_name = @role.name
|
||||
|
||||
if @role.update_attributes(role_params)
|
||||
flash[:notice] = 'Successfully updated role ' + @role.name
|
||||
redirect_to admin_conference_role_path(@conference.short_title, @role.name)
|
||||
else
|
||||
@role.name = role_name
|
||||
flash[:error] = 'Could not update role! ' + @role.errors.full_messages.to_sentence
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
def toggle_user
|
||||
user = User.find_by(email: user_params[:email])
|
||||
state = user_params[:state]
|
||||
|
||||
unless user
|
||||
flash[:error] = 'Could not find user. Please provide a valid email!'
|
||||
redirect_to(admin_conference_role_path(@conference.short_title, @role.name)) && return
|
||||
end
|
||||
|
||||
# The conference must have at least 1 organizer
|
||||
if @role.name == 'organizer' && state == 'false' && @role.users.count == 1
|
||||
flash[:error] = 'The conference must have at least 1 organizer!'
|
||||
redirect_to(admin_conference_role_path(@conference.short_title, @role.name)) && return
|
||||
end
|
||||
|
||||
# Remove user
|
||||
if state == 'false'
|
||||
if user.remove_role @role.name, @conference
|
||||
flash[:notice] = "Successfully removed role #{@role.name} from user #{user.email}"
|
||||
else
|
||||
flash[:error] = "Could not remove role #{@role.name} from user #{user.email}"
|
||||
end
|
||||
elsif user.has_role? @role.name, @conference
|
||||
flash[:error] = "User #{user.email} already has the role #{@role.name}"
|
||||
# Add user
|
||||
elsif user.add_role @role.name, @conference
|
||||
flash[:notice] = "Successfully added role #{@role.name} to user #{user.email}"
|
||||
else
|
||||
flash[:error] = "Coud not add role #{@role.name} to #{user.email}"
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.html { redirect_to admin_conference_role_path(@conference.short_title, @role.name) }
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def set_selection
|
||||
# Set 'organizer' as default role, when there is no other selection
|
||||
@selection = params[:id] ? params[:id].parameterize.underscore : 'organizer'
|
||||
|
||||
@role = Role.find_by(name: @selection, resource: @conference)
|
||||
end
|
||||
|
||||
def role_params
|
||||
params.require(:role).permit(:name, :description, user_ids: [])
|
||||
end
|
||||
|
||||
def user_params
|
||||
params.require(:user).permit(:email, :state)
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue