comparison app/controllers/members_controller.rb @ 1338:25603efa57b5

Merge from live branch
author Chris Cannam
date Thu, 20 Jun 2013 13:14:14 +0100
parents b2f7f52a164d
children 4f746d8966dd 51364c0cd58f
comparison
equal deleted inserted replaced
1209:1b1138f6f55e 1338:25603efa57b5
1 # Redmine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2011 Jean-Philippe Lang 2 # Copyright (C) 2006-2012 Jean-Philippe Lang
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 class MembersController < ApplicationController 18 class MembersController < ApplicationController
19 model_object Member 19 model_object Member
20 menu_item :members 20 menu_item :members
21 before_filter :find_model_object, :except => [:index, :new, :autocomplete_for_member] 21 before_filter :find_model_object, :except => [:index, :create, :autocomplete]
22 before_filter :find_project_from_association, :except => [:new, :index, :autocomplete_for_member] 22 before_filter :find_project_from_association, :except => [:index, :create, :autocomplete]
23 before_filter :find_project, :only => [:new, :autocomplete_for_member] 23 before_filter :find_project_by_project_id, :only => [:index, :create, :autocomplete]
24 before_filter :find_project_by_project_id, :only => [:index]
25 before_filter :authorize 24 before_filter :authorize
25 accept_api_auth :index, :show, :create, :update, :destroy
26 26
27 def index 27 def index
28 logger.debug('in index')
29 respond_to do |format| 28 respond_to do |format|
30 format.html { 29 format.html {
31 render :layout => false if request.xhr? 30 render :layout => false if request.xhr?
32 } 31 }
32 format.api {
33 @offset, @limit = api_offset_and_limit
34 @member_count = @project.member_principals.count
35 @member_pages = Paginator.new self, @member_count, @limit, params['page']
36 @offset ||= @member_pages.current.offset
37 @members = @project.member_principals.all(
38 :order => "#{Member.table_name}.id",
39 :limit => @limit,
40 :offset => @offset
41 )
42 }
33 end 43 end
34 end 44 end
35 45
36 def new 46 def show
47 respond_to do |format|
48 format.html { head 406 }
49 format.api
50 end
51 end
52
53 def create
37 members = [] 54 members = []
38 if params[:member] && request.post? 55 if params[:membership]
39 attrs = params[:member].dup 56 if params[:membership][:user_ids]
40 if (user_ids = attrs.delete(:user_ids)) 57 attrs = params[:membership].dup
58 user_ids = attrs.delete(:user_ids)
41 user_ids.each do |user_id| 59 user_ids.each do |user_id|
42 @new_member = Member.new(:role_ids => params[:member][:role_ids], :user_id => user_id) 60 @new_member = Member.new(:role_ids => params[:membership][:role_ids], :user_id => user_id)
43 members << @new_member 61 members << @new_member
44 62
45 # send notification to member 63 # send notification to member
46 Mailer.deliver_added_to_project(@new_member, @project) 64 Mailer.member_added_to_project(@new_member, @project).deliver
47
48 end 65 end
49 else 66 else
50 @new_member = Member.new(:role_ids => params[:member][:role_ids], :user_id => params[:member][:user_id]) 67 @new_member = Member.new(:role_ids => params[:membership][:role_ids], :user_id => params[:membership][:user_id])
51 members << @new_member 68 members << @new_member
52 69
53 # send notification to member 70 # send notification to member
54 Mailer.deliver_added_to_project(@new_member, @project) 71 Mailer.member_added_to_project(@new_member, @project).deliver
55
56 end 72 end
57 73
58 @project.members << members 74 @project.members << members
59 75
60 end 76 end
77
61 respond_to do |format| 78 respond_to do |format|
62 if members.present? && members.all? {|m| m.valid? } 79 format.html { redirect_to :action => 'index', :project_id => @project }
63 80 format.js { @members = members }
64 format.html { redirect_to :action => 'index', :project_id => @project } 81 format.api {
65 82 @member = members.first
66 format.js { 83 if @member.valid?
67 render(:update) {|page| 84 render :action => 'show', :status => :created, :location => membership_url(@member)
68 page.replace_html "memberlist", :partial => 'editlist' 85 else
69 page << 'hideOnLoad()' 86 render_validation_errors(@member)
70 members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") } 87 end
71 } 88 }
72 }
73 else
74
75 format.js {
76 render(:update) {|page|
77 errors = members.collect {|m|
78 m.errors.full_messages
79 }.flatten.uniq
80
81 # page.alert(l(:notice_failed_to_save_members, :errors => errors.join(', ')))
82 }
83 }
84
85 end
86 end 89 end
87 end 90 end
88 91
89 def edit 92 def update
90 if params[:member] 93 if params[:membership]
91 @member.role_ids = params[:member][:role_ids] 94 @member.role_ids = params[:membership][:role_ids]
92 end 95 end
93 if request.post? and @member.save 96 saved = @member.save
94 respond_to do |format| 97 respond_to do |format|
95 format.html { redirect_to :action => 'index', :project_id => @project } 98 format.html { redirect_to :action => 'index', :project_id => @project }
96 format.js { 99 format.js
97 render(:update) {|page| 100 format.api {
98 page.replace_html "memberlist", :partial => 'editlist' 101 if saved
99 page << 'hideOnLoad()' 102 render_api_ok
100 page.visual_effect(:highlight, "member-#{@member.id}") 103 else
101 } 104 render_validation_errors(@member)
102 } 105 end
103 end 106 }
104 end 107 end
105 end 108 end
106 109
107 def destroy 110 def destroy
108 if request.post? && @member.deletable? 111 if request.delete? && @member.deletable?
109 @member.destroy 112 @member.destroy
110 end 113 end
111 respond_to do |format| 114 respond_to do |format|
112 format.html { redirect_to :action => 'index', :project_id => @project } 115 format.html { redirect_to :action => 'index', :project_id => @project }
113 format.js { render(:update) {|page| 116 format.js
114 page.replace_html "memberlist", :partial => 'editlist' 117 format.api {
115 page << 'hideOnLoad()' 118 if @member.destroyed?
116 } 119 render_api_ok
120 else
121 head :unprocessable_entity
122 end
117 } 123 }
118 end 124 end
119 end 125 end
120 126
121 def autocomplete_for_member 127 def autocomplete
122 @principals = Principal.active.not_member_of(@project).like(params[:q]).all(:limit => 100) 128 @principals = Principal.active.not_member_of(@project).like(params[:q]).all(:limit => 100)
123 logger.debug "Query for #{params[:q]} returned #{@principals.size} results" 129 logger.debug "Query for #{params[:q]} returned #{@principals.size} results"
124 render :layout => false 130 render :layout => false
125 end 131 end
126
127 end 132 end