members_controller.rb
142 lines
| 4.5 KiB
| text/x-ruby
|
RubyLexer
|
r6776 | # Redmine - project management software | ||
# Copyright (C) 2006-2011 Jean-Philippe Lang | ||||
|
r330 | # | ||
# This program is free software; you can redistribute it and/or | ||||
# modify it under the terms of the GNU General Public License | ||||
# as published by the Free Software Foundation; either version 2 | ||||
# of the License, or (at your option) any later version. | ||||
|
r6776 | # | ||
|
r330 | # This program is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
# GNU General Public License for more details. | ||||
|
r6776 | # | ||
|
r330 | # You should have received a copy of the GNU General Public License | ||
# along with this program; if not, write to the Free Software | ||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
|
r2 | class MembersController < ApplicationController | ||
|
r3483 | model_object Member | ||
|
r8678 | before_filter :find_model_object, :except => [:index, :create, :autocomplete] | ||
before_filter :find_project_from_association, :except => [:index, :create, :autocomplete] | ||||
before_filter :find_project_by_project_id, :only => [:index, :create, :autocomplete] | ||||
|
r714 | before_filter :authorize | ||
|
r8678 | accept_api_auth :index, :show, :create, :update, :destroy | ||
def index | ||||
@offset, @limit = api_offset_and_limit | ||||
@member_count = @project.member_principals.count | ||||
@member_pages = Paginator.new self, @member_count, @limit, params['page'] | ||||
@offset ||= @member_pages.current.offset | ||||
@members = @project.member_principals.all( | ||||
:order => "#{Member.table_name}.id", | ||||
:limit => @limit, | ||||
:offset => @offset | ||||
) | ||||
respond_to do |format| | ||||
format.html { head 406 } | ||||
format.api | ||||
end | ||||
end | ||||
def show | ||||
respond_to do |format| | ||||
format.html { head 406 } | ||||
format.api | ||||
end | ||||
end | ||||
|
r2 | |||
|
r8669 | def create | ||
|
r2546 | members = [] | ||
|
r8678 | if params[:membership] && params[:membership][:user_ids] | ||
|
r8669 | attrs = params[:membership].dup | ||
|
r8678 | user_ids = attrs.delete(:user_ids) | ||
user_ids.each do |user_id| | ||||
members << Member.new(attrs.merge(:user_id => user_id)) | ||||
|
r2546 | end | ||
|
r8678 | else | ||
members << Member.new(params[:membership]) | ||||
|
r2546 | end | ||
|
r8678 | @project.members << members | ||
|
r714 | respond_to do |format| | ||
|
r3635 | if members.present? && members.all? {|m| m.valid? } | ||
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project } | ||||
|
r6776 | format.js { | ||
render(:update) {|page| | ||||
|
r3635 | page.replace_html "tab-content-members", :partial => 'projects/settings/members' | ||
|
r3670 | page << 'hideOnLoad()' | ||
|
r3635 | members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") } | ||
} | ||||
|
r2546 | } | ||
|
r8678 | format.api { | ||
@member = members.first | ||||
render :action => 'show', :status => :created, :location => membership_url(@member) | ||||
} | ||||
|
r3635 | else | ||
format.js { | ||||
render(:update) {|page| | ||||
errors = members.collect {|m| | ||||
m.errors.full_messages | ||||
}.flatten.uniq | ||||
page.alert(l(:notice_failed_to_save_members, :errors => errors.join(', '))) | ||||
} | ||||
} | ||||
|
r8678 | format.api { render_validation_errors(members.first) } | ||
|
r3635 | end | ||
|
r714 | end | ||
end | ||||
|
r6776 | |||
|
r8669 | def update | ||
if params[:membership] | ||||
@member.role_ids = params[:membership][:role_ids] | ||||
end | ||||
|
r8678 | saved = @member.save | ||
respond_to do |format| | ||||
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project } | ||||
format.js { | ||||
render(:update) {|page| | ||||
page.replace_html "tab-content-members", :partial => 'projects/settings/members' | ||||
page << 'hideOnLoad()' | ||||
page.visual_effect(:highlight, "member-#{@member.id}") | ||||
|
r2627 | } | ||
|
r8678 | } | ||
format.api { | ||||
if saved | ||||
head :ok | ||||
else | ||||
render_validation_errors(@member) | ||||
end | ||||
} | ||||
|
r178 | end | ||
end | ||||
|
r330 | |||
|
r178 | def destroy | ||
|
r8669 | if request.delete? && @member.deletable? | ||
|
r2755 | @member.destroy | ||
end | ||||
respond_to do |format| | ||||
|
r505 | format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project } | ||
|
r3670 | format.js { render(:update) {|page| | ||
page.replace_html "tab-content-members", :partial => 'projects/settings/members' | ||||
page << 'hideOnLoad()' | ||||
} | ||||
} | ||||
|
r8678 | format.api { | ||
if @member.destroyed? | ||||
head :ok | ||||
else | ||||
head :unprocessable_entity | ||||
end | ||||
} | ||||
|
r505 | end | ||
|
r330 | end | ||
|
r6776 | |||
|
r8669 | def autocomplete | ||
|
r2755 | @principals = Principal.active.like(params[:q]).find(:all, :limit => 100) - @project.principals | ||
|
r2549 | render :layout => false | ||
end | ||||
|
r330 | |||
|
r2 | end | ||