aeolusproject/conductor

View on GitHub
src/app/controllers/users_controller.rb

Summary

Maintainability
B
5 hrs
Test Coverage
#
#   Copyright 2011 Red Hat, Inc.
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#

class UsersController < ApplicationController
  before_filter :require_user
  before_filter :load_users, :only => [:show]

  def index
    if !check_privilege(Alberich::Privilege::VIEW, User)
      redirect_to account_url and return
    end
    @title = _('Users')
    clear_breadcrumbs
    save_breadcrumb(users_path)
    set_admin_users_tabs 'users'
    @params = params
    load_headers
    load_users
    respond_to do |format|
      format.html
      format.js { render :partial => 'list' }
    end
  end

  def new
    require_privilege(Alberich::Privilege::CREATE, User)
    @title = _('New User')
    @user = User.new
    @user.quota = Quota.new_for_user
  end

  def create
    require_privilege(Alberich::Privilege::MODIFY, User)
    @user = User.new(params[:user])
    @title = _('New User')
    @user.quota ||= Quota.new

    @registration = RegistrationService.new(@user)
    unless @registration.save
      render :action => 'new' and return
    end

    if current_user != @user
      flash[:notice] = _('User registered')
      redirect_to users_url
    else
      flash[:notice] = _('You have successfully registered.')
      redirect_to root_url
    end
  end

  def show
    @user = params[:id] ? User.find(params[:id]) : current_user
    require_privilege(Alberich::Privilege::VIEW, User) unless current_user == @user
    @title = @user.name.present? ? @user.name : @user.username
    @quota_resources = @user.quota.quota_resources
    if current_user == user
      current_session.update_session_entities(current_user)
    end
    @user_groups = @user.all_groups
    @groups_header = [
      { :name => _('Name'), :sortable => false },
      { :name => _('Type'), :sortable => false },
    ]
    save_breadcrumb(user_path(@user), @user.name.present? ? @user.name : @user.username)
    @tab_captions = ['Properties']
    @details_tab = 'properties' # currently the only supported details tab
    add_profile_permissions_inline(@user.entity)
    respond_to do |format|
      format.html
      format.js do
        if params.delete :details_pane
          render :partial => 'layouts/details_pane' and return
        end
        render :partial => @details_tab
      end
    end
  end

  def edit
    @user = params[:id] ? User.find(params[:id]) : current_user
    require_privilege(Alberich::Privilege::MODIFY, User) unless @user == current_user
    @title = _('Edit User')
    @ldap_user = (SETTINGS_CONFIG[:auth][:strategy] == "ldap")
  end

  def update
    @title = _('Edit User')
    @user = params[:id] ? User.find(params[:id]) : current_user
    require_privilege(Alberich::Privilege::MODIFY, User) unless @user == current_user
    # A user should not be able to edit their own quota:
    params[:user].delete(:quota_attributes) unless check_privilege(Alberich::Privilege::MODIFY, User)

    if params[:commit] == "Reset"
      redirect_to edit_user_url(@user) and return
    end

    redirect_to root_url and return unless @user

    unless @user.update_attributes(params[:user])
      render :action => 'edit' and return
    else
      flash[:notice] = _('User updated')
      redirect_to user_path(@user)
    end
  end

  def multi_destroy
    require_privilege(Alberich::Privilege::MODIFY, User)
    deleted_users = []

    begin
      User.transaction do
        User.find(params[:user_selected]).each do |user|
          if user == current_user
            flash[:warning] = _('Cannot delete %s : You are logged in as this user') % "#{user.username}"
          else
            user.destroy
            deleted_users << user.username
          end
        end
      end

      unless deleted_users.empty?
        flash[:notice] =  n_('Deleted user','Deleted users',deleted_users.length)
      end

    rescue => ex
      flash[:warning] = _('Cannot delete: %s') % ex.message
    end

    redirect_to users_url
  end

  def destroy
    require_privilege(Alberich::Privilege::MODIFY, User)
    user = User.find(params[:id])
    if user == current_user
      flash[:warning] = "#{_('Cannot delete %s : You are logged in as this user') % "#{user.username}"}"
    else
      user.destroy
      flash[:notice] = _('User has been successfully deleted.')
    end

    respond_to do |format|
      format.html { redirect_to users_path }
    end
  end

  def filter
    redirect_to_original({"users_preset_filter" => params[:users_preset_filter], "users_search" => params[:users_search]})
  end

  protected

  def load_users
    @users = User.includes(:quota).apply_filters(:preset_filter_id => params[:users_preset_filter], :search_filter => params[:users_search])
    sort_order = params[:sort_by].nil? ? "username" : params[:sort_by]
    # TODO: (lmartinc) Optimize this sort! hell!
    if sort_order == "percentage_quota_used"
      @users.sort! {|x,y| y.quota.percentage_used <=> x.quota.percentage_used }
    elsif sort_order == "quota"
      @users.sort! {|x,y| (x.quota.maximum_running_instances and y.quota.maximum_running_instances) ? x.quota.maximum_running_instances <=> y.quota.maximum_running_instances : (x ? 1 : -1) }
    else
      @users = User.includes(:quota).apply_filters(:preset_filter_id => params[:users_preset_filter], :search_filter => params[:users_search]).order(sort_order)
    end
  end

  def load_headers
    @header = [
      { :name => 'checkbox', :class => 'checkbox', :sortable => false },
      { :name => _('User ID'), :sortable => false },
      { :name => _('Last Name'), :sortable => false },
      { :name => _('First Name'), :sortable => false },
      { :name => _('Quota Used'), :class => 'center', :sortable => false },
      { :name => _('Quota Limit'), :class => 'center', :sortable => false },
      { :name => _('e-mail'), :sortable => false },
    ]
  end

end