File: app/controllers/users_controller.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: UsersController#18
includes
  CustomFieldsHelper   
  SortHelper   
inherits from
  ApplicationController   
has properties
method: index #30
method: show #64
method: new #84
method: create #89
method: edit #126
method: update #131
method: destroy #176
method: edit_membership #184
method: destroy_membership #206
method: find_user #219

Class Hierarchy

Code

   1  # Redmine - project management software
   2  # Copyright (C) 2006-2011  Jean-Philippe Lang
   3  #
   4  # This program is free software; you can redistribute it and/or
   5  # modify it under the terms of the GNU General Public License
   6  # as published by the Free Software Foundation; either version 2
   7  # of the License, or (at your option) any later version.
   8  #
   9  # This program is distributed in the hope that it will be useful,
  10  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  # GNU General Public License for more details.
  13  #
  14  # You should have received a copy of the GNU General Public License
  15  # along with this program; if not, write to the Free Software
  16  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17 
  18  class UsersController < ApplicationController
  19    layout 'admin'
  20 
  21    before_filter :require_admin, :except => :show
  22    before_filter :find_user, :only => [:show, :edit, :update, :destroy, :edit_membership, :destroy_membership]
  23    accept_api_auth :index, :show, :create, :update, :destroy
  24 
  25    helper :sort
  26    include SortHelper
  27    helper :custom_fields
  28    include CustomFieldsHelper
  29 
  30    def index
  31      sort_init 'login', 'asc'
  32      sort_update %w(login firstname lastname mail admin created_on last_login_on)
  33 
  34      case params[:format]
  35      when 'xml', 'json'
  36        @offset, @limit = api_offset_and_limit
  37      else
  38        @limit = per_page_option
  39      end
  40 
  41      @status = params[:status] || 1
  42 
  43      scope = User.logged.status(@status)
  44      scope = scope.like(params[:name]) if params[:name].present?
  45      scope = scope.in_group(params[:group_id]) if params[:group_id].present?
  46 
  47      @user_count = scope.count
  48      @user_pages = Paginator.new self, @user_count, @limit, params['page']
  49      @offset ||= @user_pages.current.offset
  50      @users =  scope.find :all,
  51                          :order => sort_clause,
  52                          :limit  =>  @limit,
  53                          :offset =>  @offset
  54 
  55      respond_to do |format|
  56        format.html {
  57          @groups = Group.all.sort
  58          render :layout => !request.xhr?
  59        }
  60        format.api
  61      end
  62    end
  63 
  64    def show
  65      # show projects based on current user visibility
  66      @memberships = @user.memberships.all(:conditions => Project.visible_condition(User.current))
  67 
  68      events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
  69      @events_by_day = events.group_by(&:event_date)
  70 
  71      unless User.current.admin?
  72        if !@user.active? || (@user != User.current  && @memberships.empty? && events.empty?)
  73          render_404
  74          return
  75        end
  76      end
  77 
  78      respond_to do |format|
  79        format.html { render :layout => 'base' }
  80        format.api
  81      end
  82    end
  83 
  84    def new
  85      @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option)
  86      @auth_sources = AuthSource.find(:all)
  87    end
  88 
  89    def create
  90      @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option)
  91      @user.safe_attributes = params[:user]
  92      @user.admin = params[:user][:admin] || false
  93      @user.login = params[:user][:login]
  94      @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] unless @user.auth_source_id
  95 
  96      if @user.save
  97        @user.pref.attributes = params[:pref]
  98        @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
  99        @user.pref.save
 100        @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
 101 
 102        Mailer.deliver_account_information(@user, params[:user][:password]) if params[:send_information]
 103 
 104        respond_to do |format|
 105          format.html {
 106            flash[:notice] = l(:notice_successful_create)
 107            redirect_to(params[:continue] ?
 108              {:controller => 'users', :action => 'new'} :
 109              {:controller => 'users', :action => 'edit', :id => @user}
 110            )
 111          }
 112          format.api  { render :action => 'show', :status => :created, :location => user_url(@user) }
 113        end
 114      else
 115        @auth_sources = AuthSource.find(:all)
 116        # Clear password input
 117        @user.password = @user.password_confirmation = nil
 118 
 119        respond_to do |format|
 120          format.html { render :action => 'new' }
 121          format.api  { render_validation_errors(@user) }
 122        end
 123      end
 124    end
 125 
 126    def edit
 127      @auth_sources = AuthSource.find(:all)
 128      @membership ||= Member.new
 129    end
 130 
 131    def update
 132      @user.admin = params[:user][:admin] if params[:user][:admin]
 133      @user.login = params[:user][:login] if params[:user][:login]
 134      if params[:user][:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
 135        @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation]
 136      end
 137      @user.safe_attributes = params[:user]
 138      # Was the account actived ? (do it before User#save clears the change)
 139      was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
 140      # TODO: Similar to My#account
 141      @user.pref.attributes = params[:pref]
 142      @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
 143 
 144      if @user.save
 145        @user.pref.save
 146        @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
 147 
 148        if was_activated
 149          Mailer.deliver_account_activated(@user)
 150        elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.auth_source_id.nil?
 151          Mailer.deliver_account_information(@user, params[:user][:password])
 152        end
 153 
 154        respond_to do |format|
 155          format.html {
 156            flash[:notice] = l(:notice_successful_update)
 157            redirect_to :back
 158          }
 159          format.api  { head :ok }
 160        end
 161      else
 162        @auth_sources = AuthSource.find(:all)
 163        @membership ||= Member.new
 164        # Clear password input
 165        @user.password = @user.password_confirmation = nil
 166 
 167        respond_to do |format|
 168          format.html { render :action => :edit }
 169          format.api  { render_validation_errors(@user) }
 170        end
 171      end
 172    rescue ::ActionController::RedirectBackError
 173      redirect_to :controller => 'users', :action => 'edit', :id => @user
 174    end
 175 
 176    def destroy
 177      @user.destroy
 178      respond_to do |format|
 179        format.html { redirect_to(users_url) }
 180        format.api  { head :ok }
 181      end
 182    end
 183 
 184    def edit_membership
 185      @membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
 186      @membership.save
 187      respond_to do |format|
 188        if @membership.valid?
 189          format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
 190          format.js {
 191            render(:update) {|page|
 192              page.replace_html "tab-content-memberships", :partial => 'users/memberships'
 193              page.visual_effect(:highlight, "member-#{@membership.id}")
 194            }
 195          }
 196        else
 197          format.js {
 198            render(:update) {|page|
 199              page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
 200            }
 201          }
 202        end
 203      end
 204    end
 205 
 206    def destroy_membership
 207      @membership = Member.find(params[:membership_id])
 208      if @membership.deletable?
 209        @membership.destroy
 210      end
 211      respond_to do |format|
 212        format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
 213        format.js { render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'users/memberships'} }
 214      end
 215    end
 216 
 217    private
 218 
 219    def find_user
 220      if params[:id] == 'current'
 221        require_login || return
 222        @user = User.current
 223      else
 224        @user = User.find(params[:id])
 225      end
 226    rescue ActiveRecord::RecordNotFound
 227      render_404
 228    end
 229  end