File: app/controllers/members_controller.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: MembersController#18
inherits from
  ApplicationController   
has properties
method: index #26
method: show #43
method: create #50
method: update #94
method: destroy #118
method: autocomplete #139

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 MembersController < ApplicationController
  19    model_object Member
  20    before_filter :find_model_object, :except => [:index, :create, :autocomplete]
  21    before_filter :find_project_from_association, :except => [:index, :create, :autocomplete]
  22    before_filter :find_project_by_project_id, :only => [:index, :create, :autocomplete]
  23    before_filter :authorize
  24    accept_api_auth :index, :show, :create, :update, :destroy
  25 
  26    def index
  27      @offset, @limit = api_offset_and_limit
  28      @member_count = @project.member_principals.count
  29      @member_pages = Paginator.new self, @member_count, @limit, params['page']
  30      @offset ||= @member_pages.current.offset
  31      @members =  @project.member_principals.all(
  32        :order => "#{Member.table_name}.id",
  33        :limit  =>  @limit,
  34        :offset =>  @offset
  35      )
  36 
  37      respond_to do |format|
  38        format.html { head 406 }
  39        format.api
  40      end
  41    end
  42 
  43    def show
  44      respond_to do |format|
  45        format.html { head 406 }
  46        format.api
  47      end
  48    end
  49 
  50    def create
  51      members = []
  52      if params[:membership]
  53        if params[:membership][:user_ids]
  54          attrs = params[:membership].dup
  55          user_ids = attrs.delete(:user_ids)
  56          user_ids.each do |user_id|
  57            members << Member.new(:role_ids => params[:membership][:role_ids], :user_id => user_id)
  58          end
  59        else
  60          members << Member.new(:role_ids => params[:membership][:role_ids], :user_id => params[:membership][:user_id])
  61        end
  62        @project.members << members
  63      end
  64 
  65      respond_to do |format|
  66        if members.present? && members.all? {|m| m.valid? }
  67          format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
  68          format.js {
  69            render(:update) {|page|
  70              page.replace_html "tab-content-members", :partial => 'projects/settings/members'
  71              page << 'hideOnLoad()'
  72              members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") }
  73            }
  74          }
  75          format.api {
  76            @member = members.first
  77            render :action => 'show', :status => :created, :location => membership_url(@member)
  78          }
  79        else
  80          format.js {
  81            render(:update) {|page|
  82              errors = members.collect {|m|
  83                m.errors.full_messages
  84              }.flatten.uniq
  85 
  86              page.alert(l(:notice_failed_to_save_members, :errors => errors.join(', ')))
  87            }
  88          }
  89          format.api { render_validation_errors(members.first) }
  90        end
  91      end
  92    end
  93 
  94    def update
  95      if params[:membership]
  96        @member.role_ids = params[:membership][:role_ids]
  97      end
  98      saved = @member.save
  99      respond_to do |format|
 100        format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
 101        format.js {
 102          render(:update) {|page|
 103            page.replace_html "tab-content-members", :partial => 'projects/settings/members'
 104            page << 'hideOnLoad()'
 105            page.visual_effect(:highlight, "member-#{@member.id}")
 106          }
 107        }
 108        format.api {
 109          if saved
 110            head :ok
 111          else
 112            render_validation_errors(@member)
 113          end
 114        }
 115      end
 116    end
 117 
 118    def destroy
 119      if request.delete? && @member.deletable?
 120        @member.destroy
 121      end
 122      respond_to do |format|
 123        format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
 124        format.js { render(:update) {|page|
 125            page.replace_html "tab-content-members", :partial => 'projects/settings/members'
 126            page << 'hideOnLoad()'
 127          }
 128        }
 129        format.api {
 130          if @member.destroyed?
 131            head :ok
 132          else
 133            head :unprocessable_entity
 134          end
 135        }
 136      end
 137    end
 138 
 139    def autocomplete
 140      @principals = Principal.active.not_member_of(@project).like(params[:q]).all(:limit => 100)
 141      render :layout => false
 142    end
 143 
 144  end