Mercurial > hg > soundsoftware-site
diff 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 |
line wrap: on
line diff
--- a/app/controllers/members_controller.rb Wed Jan 23 13:11:25 2013 +0000 +++ b/app/controllers/members_controller.rb Thu Jun 20 13:14:14 2013 +0100 @@ -1,5 +1,5 @@ # Redmine - project management software -# Copyright (C) 2006-2011 Jean-Philippe Lang +# Copyright (C) 2006-2012 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -18,110 +18,115 @@ class MembersController < ApplicationController model_object Member menu_item :members - before_filter :find_model_object, :except => [:index, :new, :autocomplete_for_member] - before_filter :find_project_from_association, :except => [:new, :index, :autocomplete_for_member] - before_filter :find_project, :only => [:new, :autocomplete_for_member] - before_filter :find_project_by_project_id, :only => [:index] + 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] before_filter :authorize + accept_api_auth :index, :show, :create, :update, :destroy def index - logger.debug('in index') respond_to do |format| format.html { render :layout => false if request.xhr? } + format.api { + @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 + ) + } end end - def new + def show + respond_to do |format| + format.html { head 406 } + format.api + end + end + + def create members = [] - if params[:member] && request.post? - attrs = params[:member].dup - if (user_ids = attrs.delete(:user_ids)) + if params[:membership] + if params[:membership][:user_ids] + attrs = params[:membership].dup + user_ids = attrs.delete(:user_ids) user_ids.each do |user_id| - @new_member = Member.new(:role_ids => params[:member][:role_ids], :user_id => user_id) + @new_member = Member.new(:role_ids => params[:membership][:role_ids], :user_id => user_id) members << @new_member # send notification to member - Mailer.deliver_added_to_project(@new_member, @project) - + Mailer.member_added_to_project(@new_member, @project).deliver end else - @new_member = Member.new(:role_ids => params[:member][:role_ids], :user_id => params[:member][:user_id]) + @new_member = Member.new(:role_ids => params[:membership][:role_ids], :user_id => params[:membership][:user_id]) members << @new_member # send notification to member - Mailer.deliver_added_to_project(@new_member, @project) - + Mailer.member_added_to_project(@new_member, @project).deliver end @project.members << members end + respond_to do |format| - if members.present? && members.all? {|m| m.valid? } - - format.html { redirect_to :action => 'index', :project_id => @project } - - format.js { - render(:update) {|page| - page.replace_html "memberlist", :partial => 'editlist' - page << 'hideOnLoad()' - members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") } - } - } - 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(', '))) - } - } - - end + format.html { redirect_to :action => 'index', :project_id => @project } + format.js { @members = members } + format.api { + @member = members.first + if @member.valid? + render :action => 'show', :status => :created, :location => membership_url(@member) + else + render_validation_errors(@member) + end + } end end - def edit - if params[:member] - @member.role_ids = params[:member][:role_ids] + def update + if params[:membership] + @member.role_ids = params[:membership][:role_ids] end - if request.post? and @member.save - respond_to do |format| - format.html { redirect_to :action => 'index', :project_id => @project } - format.js { - render(:update) {|page| - page.replace_html "memberlist", :partial => 'editlist' - page << 'hideOnLoad()' - page.visual_effect(:highlight, "member-#{@member.id}") - } - } - end + saved = @member.save + respond_to do |format| + format.html { redirect_to :action => 'index', :project_id => @project } + format.js + format.api { + if saved + render_api_ok + else + render_validation_errors(@member) + end + } end end def destroy - if request.post? && @member.deletable? + if request.delete? && @member.deletable? @member.destroy end respond_to do |format| format.html { redirect_to :action => 'index', :project_id => @project } - format.js { render(:update) {|page| - page.replace_html "memberlist", :partial => 'editlist' - page << 'hideOnLoad()' - } + format.js + format.api { + if @member.destroyed? + render_api_ok + else + head :unprocessable_entity + end } end end - def autocomplete_for_member + def autocomplete @principals = Principal.active.not_member_of(@project).like(params[:q]).all(:limit => 100) logger.debug "Query for #{params[:q]} returned #{@principals.size} results" render :layout => false end - end