##// END OF EJS Templates
Adds a scope for sorting groups....
Jean-Philippe Lang -
r9764:1c825df54929
parent child
Show More
@@ -1,158 +1,158
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2012 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class GroupsController < ApplicationController
19 19 layout 'admin'
20 20
21 21 before_filter :require_admin
22 22 before_filter :find_group, :except => [:index, :new, :create]
23 23 accept_api_auth :index, :show, :create, :update, :destroy, :add_users, :remove_user
24 24
25 25 helper :custom_fields
26 26
27 27 def index
28 @groups = Group.find(:all, :order => 'lastname')
28 @groups = Group.sorted.all
29 29
30 30 respond_to do |format|
31 31 format.html
32 32 format.api
33 33 end
34 34 end
35 35
36 36 def show
37 37 respond_to do |format|
38 38 format.html
39 39 format.api
40 40 end
41 41 end
42 42
43 43 def new
44 44 @group = Group.new
45 45 end
46 46
47 47 def create
48 48 @group = Group.new
49 49 @group.safe_attributes = params[:group]
50 50
51 51 respond_to do |format|
52 52 if @group.save
53 53 format.html {
54 54 flash[:notice] = l(:notice_successful_create)
55 55 redirect_to(params[:continue] ? new_group_path : groups_path)
56 56 }
57 57 format.api { render :action => 'show', :status => :created, :location => group_url(@group) }
58 58 else
59 59 format.html { render :action => "new" }
60 60 format.api { render_validation_errors(@group) }
61 61 end
62 62 end
63 63 end
64 64
65 65 def edit
66 66 end
67 67
68 68 def update
69 69 @group.safe_attributes = params[:group]
70 70
71 71 respond_to do |format|
72 72 if @group.save
73 73 flash[:notice] = l(:notice_successful_update)
74 74 format.html { redirect_to(groups_path) }
75 75 format.api { head :ok }
76 76 else
77 77 format.html { render :action => "edit" }
78 78 format.api { render_validation_errors(@group) }
79 79 end
80 80 end
81 81 end
82 82
83 83 def destroy
84 84 @group.destroy
85 85
86 86 respond_to do |format|
87 87 format.html { redirect_to(groups_url) }
88 88 format.api { head :ok }
89 89 end
90 90 end
91 91
92 92 def add_users
93 93 users = User.find_all_by_id(params[:user_id] || params[:user_ids])
94 94 @group.users << users if request.post?
95 95 respond_to do |format|
96 96 format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'users' }
97 97 format.js {
98 98 render(:update) {|page|
99 99 page.replace_html "tab-content-users", :partial => 'groups/users'
100 100 users.each {|user| page.visual_effect(:highlight, "user-#{user.id}") }
101 101 }
102 102 }
103 103 format.api { head :ok }
104 104 end
105 105 end
106 106
107 107 def remove_user
108 108 @group.users.delete(User.find(params[:user_id])) if request.delete?
109 109 respond_to do |format|
110 110 format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'users' }
111 111 format.js { render(:update) {|page| page.replace_html "tab-content-users", :partial => 'groups/users'} }
112 112 format.api { head :ok }
113 113 end
114 114 end
115 115
116 116 def autocomplete_for_user
117 117 @users = User.active.not_in_group(@group).like(params[:q]).all(:limit => 100)
118 118 render :layout => false
119 119 end
120 120
121 121 def edit_membership
122 122 @membership = Member.edit_membership(params[:membership_id], params[:membership], @group)
123 123 @membership.save if request.post?
124 124 respond_to do |format|
125 125 if @membership.valid?
126 126 format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
127 127 format.js {
128 128 render(:update) {|page|
129 129 page.replace_html "tab-content-memberships", :partial => 'groups/memberships'
130 130 page.visual_effect(:highlight, "member-#{@membership.id}")
131 131 }
132 132 }
133 133 else
134 134 format.js {
135 135 render(:update) {|page|
136 136 page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
137 137 }
138 138 }
139 139 end
140 140 end
141 141 end
142 142
143 143 def destroy_membership
144 144 Member.find(params[:membership_id]).destroy if request.post?
145 145 respond_to do |format|
146 146 format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
147 147 format.js { render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'groups/memberships'} }
148 148 end
149 149 end
150 150
151 151 private
152 152
153 153 def find_group
154 154 @group = Group.find(params[:id])
155 155 rescue ActiveRecord::RecordNotFound
156 156 render_404
157 157 end
158 158 end
@@ -1,84 +1,86
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2012 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class Group < Principal
19 19 include Redmine::SafeAttributes
20 20
21 21 has_and_belongs_to_many :users, :after_add => :user_added,
22 22 :after_remove => :user_removed
23 23
24 24 acts_as_customizable
25 25
26 26 validates_presence_of :lastname
27 27 validates_uniqueness_of :lastname, :case_sensitive => false
28 28 validates_length_of :lastname, :maximum => 30
29 29
30 30 before_destroy :remove_references_before_destroy
31 31
32 scope :sorted, order("#{table_name}.lastname ASC")
33
32 34 safe_attributes 'name',
33 35 'user_ids',
34 36 'custom_field_values',
35 37 'custom_fields',
36 38 :if => lambda {|group, user| user.admin?}
37 39
38 40 def to_s
39 41 lastname.to_s
40 42 end
41 43
42 44 def name
43 45 lastname
44 46 end
45 47
46 48 def name=(arg)
47 49 self.lastname = arg
48 50 end
49 51
50 52 def user_added(user)
51 53 members.each do |member|
52 54 next if member.project.nil?
53 55 user_member = Member.find_by_project_id_and_user_id(member.project_id, user.id) || Member.new(:project_id => member.project_id, :user_id => user.id)
54 56 member.member_roles.each do |member_role|
55 57 user_member.member_roles << MemberRole.new(:role => member_role.role, :inherited_from => member_role.id)
56 58 end
57 59 user_member.save!
58 60 end
59 61 end
60 62
61 63 def user_removed(user)
62 64 members.each do |member|
63 65 MemberRole.find(:all, :include => :member,
64 66 :conditions => ["#{Member.table_name}.user_id = ? AND #{MemberRole.table_name}.inherited_from IN (?)", user.id, member.member_role_ids]).each(&:destroy)
65 67 end
66 68 end
67 69
68 70 def self.human_attribute_name(attribute_key_name, *args)
69 71 attr_name = attribute_key_name.to_s
70 72 if attr_name == 'lastname'
71 73 attr_name = "name"
72 74 end
73 75 super(attr_name, *args)
74 76 end
75 77
76 78 private
77 79
78 80 # Removes references that are not handled by associations
79 81 def remove_references_before_destroy
80 82 return if self.id.nil?
81 83
82 84 Issue.update_all 'assigned_to_id = NULL', ['assigned_to_id = ?', id]
83 85 end
84 86 end
General Comments 0
You need to be logged in to leave comments. Login now