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