##// END OF EJS Templates
Allows multiple roles on the same project (#706). Prerequisite for user groups feature....
Jean-Philippe Lang -
r2627:7dccf9fda6f3
parent child
Show More
@@ -0,0 +1,27
1 # Redmine - project management software
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 class MemberRole < ActiveRecord::Base
19 belongs_to :member
20 belongs_to :role
21
22 validates_presence_of :role
23
24 def validate
25 errors.add :role_id, :invalid if role && !role.member?
26 end
27 end
@@ -0,0 +1,12
1 class CreateMemberRoles < ActiveRecord::Migration
2 def self.up
3 create_table :member_roles do |t|
4 t.column :member_id, :integer, :null => false
5 t.column :role_id, :integer, :null => false
6 end
7 end
8
9 def self.down
10 drop_table :member_roles
11 end
12 end
@@ -0,0 +1,11
1 class PopulateMemberRoles < ActiveRecord::Migration
2 def self.up
3 Member.find(:all).each do |member|
4 MemberRole.create!(:member_id => member.id, :role_id => member.role_id)
5 end
6 end
7
8 def self.down
9 MemberRole.delete_all
10 end
11 end
@@ -0,0 +1,9
1 class DropMembersRoleId < ActiveRecord::Migration
2 def self.up
3 remove_column :members, :role_id
4 end
5
6 def self.down
7 raise IrreversibleMigration
8 end
9 end
@@ -0,0 +1,23
1 ---
2 member_roles_001:
3 id: 1
4 role_id: 1
5 member_id: 1
6 member_roles_002:
7 id: 2
8 role_id: 2
9 member_id: 2
10 member_roles_003:
11 id: 3
12 role_id: 2
13 member_id: 3
14 member_roles_004:
15 id: 4
16 role_id: 2
17 member_id: 4
18 member_roles_005:
19 id: 5
20 role_id: 1
21 member_id: 5
22
23 No newline at end of file
@@ -38,10 +38,6 class ApplicationController < ActionController::Base
38 require_dependency "repository/#{scm.underscore}"
38 require_dependency "repository/#{scm.underscore}"
39 end
39 end
40
40
41 def current_role
42 @current_role ||= User.current.role_for_project(@project)
43 end
44
45 def user_setup
41 def user_setup
46 # Check the settings cache for each request
42 # Check the settings cache for each request
47 Setting.check_cache
43 Setting.check_cache
@@ -146,7 +146,7 class IssuesController < ApplicationController
146 return
146 return
147 end
147 end
148 @issue.status = default_status
148 @issue.status = default_status
149 @allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(User.current.role_for_project(@project), @issue.tracker)).uniq
149 @allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(User.current.roles_for_project(@project), @issue.tracker)).uniq
150
150
151 if request.get? || request.xhr?
151 if request.get? || request.xhr?
152 @issue.start_date ||= Date.today
152 @issue.start_date ||= Date.today
@@ -48,7 +48,12 class MembersController < ApplicationController
48 if request.post? and @member.update_attributes(params[:member])
48 if request.post? and @member.update_attributes(params[:member])
49 respond_to do |format|
49 respond_to do |format|
50 format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
50 format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
51 format.js { render(:update) {|page| page.replace_html "tab-content-members", :partial => 'projects/settings/members'} }
51 format.js {
52 render(:update) {|page|
53 page.replace_html "tab-content-members", :partial => 'projects/settings/members'
54 page.visual_effect(:highlight, "member-#{@member.id}")
55 }
56 }
52 end
57 end
53 end
58 end
54 end
59 end
@@ -112,7 +112,7 class ProjectsController < ApplicationController
112 redirect_to_project_menu_item(@project, params[:jump]) && return
112 redirect_to_project_menu_item(@project, params[:jump]) && return
113 end
113 end
114
114
115 @members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role}
115 @members_by_role = @project.members.find(:all, :include => [:user, :roles], :order => 'position').group_by {|m| m.roles.first}
116 @subprojects = @project.children.visible
116 @subprojects = @project.children.visible
117 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
117 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
118 @trackers = @project.rolled_up_trackers
118 @trackers = @project.rolled_up_trackers
@@ -24,7 +24,7 class QueriesController < ApplicationController
24 @query = Query.new(params[:query])
24 @query = Query.new(params[:query])
25 @query.project = params[:query_is_for_all] ? nil : @project
25 @query.project = params[:query_is_for_all] ? nil : @project
26 @query.user = User.current
26 @query.user = User.current
27 @query.is_public = false unless (@query.project && current_role.allowed_to?(:manage_public_queries)) || User.current.admin?
27 @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
28 @query.column_names = nil if params[:default_columns]
28 @query.column_names = nil if params[:default_columns]
29
29
30 params[:fields].each do |field|
30 params[:fields].each do |field|
@@ -48,7 +48,7 class QueriesController < ApplicationController
48 end if params[:fields]
48 end if params[:fields]
49 @query.attributes = params[:query]
49 @query.attributes = params[:query]
50 @query.project = nil if params[:query_is_for_all]
50 @query.project = nil if params[:query_is_for_all]
51 @query.is_public = false unless (@query.project && current_role.allowed_to?(:manage_public_queries)) || User.current.admin?
51 @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
52 @query.column_names = nil if params[:default_columns]
52 @query.column_names = nil if params[:default_columns]
53
53
54 if @query.save
54 if @query.save
@@ -40,7 +40,7 class RolesController < ApplicationController
40 @role.workflows.copy(copy_from)
40 @role.workflows.copy(copy_from)
41 end
41 end
42 flash[:notice] = l(:notice_successful_create)
42 flash[:notice] = l(:notice_successful_create)
43 redirect_to :action => 'list'
43 redirect_to :action => 'index'
44 end
44 end
45 @permissions = @role.setable_permissions
45 @permissions = @role.setable_permissions
46 @roles = Role.find :all, :order => 'builtin, position'
46 @roles = Role.find :all, :order => 'builtin, position'
@@ -50,7 +50,7 class RolesController < ApplicationController
50 @role = Role.find(params[:id])
50 @role = Role.find(params[:id])
51 if request.post? and @role.update_attributes(params[:role])
51 if request.post? and @role.update_attributes(params[:role])
52 flash[:notice] = l(:notice_successful_update)
52 flash[:notice] = l(:notice_successful_update)
53 redirect_to :action => 'list'
53 redirect_to :action => 'index'
54 end
54 end
55 @permissions = @role.setable_permissions
55 @permissions = @role.setable_permissions
56 end
56 end
@@ -58,7 +58,7 class RolesController < ApplicationController
58 def destroy
58 def destroy
59 @role = Role.find(params[:id])
59 @role = Role.find(params[:id])
60 @role.destroy
60 @role.destroy
61 redirect_to :action => 'list'
61 redirect_to :action => 'index'
62 rescue
62 rescue
63 flash[:error] = 'This role is in use and can not be deleted.'
63 flash[:error] = 'This role is in use and can not be deleted.'
64 redirect_to :action => 'index'
64 redirect_to :action => 'index'
@@ -73,7 +73,7 class RolesController < ApplicationController
73 role.save
73 role.save
74 end
74 end
75 flash[:notice] = l(:notice_successful_update)
75 flash[:notice] = l(:notice_successful_update)
76 redirect_to :action => 'list'
76 redirect_to :action => 'index'
77 end
77 end
78 end
78 end
79 end
79 end
@@ -86,10 +86,7 class UsersController < ApplicationController
86 end
86 end
87 end
87 end
88 @auth_sources = AuthSource.find(:all)
88 @auth_sources = AuthSource.find(:all)
89 @roles = Role.find_all_givable
90 @projects = Project.active.find(:all, :order => 'lft')
91 @membership ||= Member.new
89 @membership ||= Member.new
92 @memberships = @user.memberships
93 end
90 end
94
91
95 def edit_membership
92 def edit_membership
@@ -97,12 +94,23 class UsersController < ApplicationController
97 @membership = params[:membership_id] ? Member.find(params[:membership_id]) : Member.new(:user => @user)
94 @membership = params[:membership_id] ? Member.find(params[:membership_id]) : Member.new(:user => @user)
98 @membership.attributes = params[:membership]
95 @membership.attributes = params[:membership]
99 @membership.save if request.post?
96 @membership.save if request.post?
100 redirect_to :action => 'edit', :id => @user, :tab => 'memberships'
97 respond_to do |format|
98 format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
99 format.js {
100 render(:update) {|page|
101 page.replace_html "tab-content-memberships", :partial => 'users/memberships'
102 page.visual_effect(:highlight, "member-#{@membership.id}")
103 }
104 }
105 end
101 end
106 end
102
107
103 def destroy_membership
108 def destroy_membership
104 @user = User.find(params[:id])
109 @user = User.find(params[:id])
105 Member.find(params[:membership_id]).destroy if request.post?
110 Member.find(params[:membership_id]).destroy if request.post?
106 redirect_to :action => 'edit', :id => @user, :tab => 'memberships'
111 respond_to do |format|
112 format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
113 format.js { render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'users/memberships'} }
114 end
107 end
115 end
108 end
116 end
@@ -28,10 +28,6 module ApplicationHelper
28 extend Forwardable
28 extend Forwardable
29 def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter
29 def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter
30
30
31 def current_role
32 @current_role ||= User.current.role_for_project(@project)
33 end
34
35 # Return true if user is authorized for controller/action, otherwise false
31 # Return true if user is authorized for controller/action, otherwise false
36 def authorize_for(controller, action)
32 def authorize_for(controller, action)
37 User.current.allowed_to?({:controller => controller, :action => action}, @project)
33 User.current.allowed_to?({:controller => controller, :action => action}, @project)
@@ -205,7 +205,7 class Issue < ActiveRecord::Base
205
205
206 # Returns an array of status that user is able to apply
206 # Returns an array of status that user is able to apply
207 def new_statuses_allowed_to(user)
207 def new_statuses_allowed_to(user)
208 statuses = status.find_new_statuses_allowed_to(user.role_for_project(project), tracker)
208 statuses = status.find_new_statuses_allowed_to(user.roles_for_project(project), tracker)
209 statuses << status unless statuses.empty?
209 statuses << status unless statuses.empty?
210 statuses.uniq.sort
210 statuses.uniq.sort
211 end
211 end
@@ -36,24 +36,34 class IssueStatus < ActiveRecord::Base
36
36
37 # Returns an array of all statuses the given role can switch to
37 # Returns an array of all statuses the given role can switch to
38 # Uses association cache when called more than one time
38 # Uses association cache when called more than one time
39 def new_statuses_allowed_to(role, tracker)
39 def new_statuses_allowed_to(roles, tracker)
40 new_statuses = workflows.select {|w| w.role_id == role.id && w.tracker_id == tracker.id}.collect{|w| w.new_status} if role && tracker
40 if roles && tracker
41 new_statuses ? new_statuses.compact.sort{|x, y| x.position <=> y.position } : []
41 role_ids = roles.collect(&:id)
42 new_statuses = workflows.select {|w| role_ids.include?(w.role_id) && w.tracker_id == tracker.id}.collect{|w| w.new_status}.compact.sort
43 else
44 []
45 end
42 end
46 end
43
47
44 # Same thing as above but uses a database query
48 # Same thing as above but uses a database query
45 # More efficient than the previous method if called just once
49 # More efficient than the previous method if called just once
46 def find_new_statuses_allowed_to(role, tracker)
50 def find_new_statuses_allowed_to(roles, tracker)
47 new_statuses = workflows.find(:all,
51 if roles && tracker
48 :include => :new_status,
52 workflows.find(:all,
49 :conditions => ["role_id=? and tracker_id=?", role.id, tracker.id]).collect{ |w| w.new_status }.compact if role && tracker
53 :include => :new_status,
50 new_statuses ? new_statuses.sort{|x, y| x.position <=> y.position } : []
54 :conditions => { :role_id => roles.collect(&:id),
55 :tracker_id => tracker.id}).collect{ |w| w.new_status }.compact.sort
56 else
57 []
58 end
51 end
59 end
52
60
53 def new_status_allowed_to?(status, role, tracker)
61 def new_status_allowed_to?(status, roles, tracker)
54 status && role && tracker ?
62 if status && roles && tracker
55 !workflows.find(:first, :conditions => {:new_status_id => status.id, :role_id => role.id, :tracker_id => tracker.id}).nil? :
63 !workflows.find(:first, :conditions => {:new_status_id => status.id, :role_id => roles.collect(&:id), :tracker_id => tracker.id}).nil?
64 else
56 false
65 false
66 end
57 end
67 end
58
68
59 def <=>(status)
69 def <=>(status)
@@ -1,5 +1,5
1 # redMine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006-2009 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
@@ -17,15 +17,12
17
17
18 class Member < ActiveRecord::Base
18 class Member < ActiveRecord::Base
19 belongs_to :user
19 belongs_to :user
20 belongs_to :role
20 has_many :member_roles, :dependent => :delete_all
21 has_many :roles, :through => :member_roles
21 belongs_to :project
22 belongs_to :project
22
23
23 validates_presence_of :role, :user, :project
24 validates_presence_of :user, :project
24 validates_uniqueness_of :user_id, :scope => :project_id
25 validates_uniqueness_of :user_id, :scope => :project_id
25
26 def validate
27 errors.add :role_id, :invalid if role && !role.member?
28 end
29
26
30 def name
27 def name
31 self.user.name
28 self.user.name
@@ -42,11 +39,18 class Member < ActiveRecord::Base
42 end
39 end
43
40
44 def <=>(member)
41 def <=>(member)
45 role == member.role ? (user <=> member.user) : (role <=> member.role)
42 a, b = roles.sort.first, member.roles.sort.first
43 a == b ? (user <=> member.user) : (a <=> b)
46 end
44 end
47
45
48 def before_destroy
46 def before_destroy
49 # remove category based auto assignments for this member
47 # remove category based auto assignments for this member
50 IssueCategory.update_all "assigned_to_id = NULL", ["project_id = ? AND assigned_to_id = ?", project.id, user.id]
48 IssueCategory.update_all "assigned_to_id = NULL", ["project_id = ? AND assigned_to_id = ?", project.id, user.id]
51 end
49 end
50
51 protected
52
53 def validate
54 errors.add_to_base "Role can't be blank" if roles.empty?
55 end
52 end
56 end
@@ -135,7 +135,7 class Project < ActiveRecord::Base
135 statements << "1=0"
135 statements << "1=0"
136 if user.logged?
136 if user.logged?
137 statements << "#{Project.table_name}.is_public = #{connection.quoted_true}" if Role.non_member.allowed_to?(permission)
137 statements << "#{Project.table_name}.is_public = #{connection.quoted_true}" if Role.non_member.allowed_to?(permission)
138 allowed_project_ids = user.memberships.select {|m| m.role.allowed_to?(permission)}.collect {|m| m.project_id}
138 allowed_project_ids = user.memberships.select {|m| m.roles.detect {|role| role.allowed_to?(permission)}}.collect {|m| m.project_id}
139 statements << "#{Project.table_name}.id IN (#{allowed_project_ids.join(',')})" if allowed_project_ids.any?
139 statements << "#{Project.table_name}.id IN (#{allowed_project_ids.join(',')})" if allowed_project_ids.any?
140 elsif Role.anonymous.allowed_to?(permission)
140 elsif Role.anonymous.allowed_to?(permission)
141 # anonymous user allowed on public project
141 # anonymous user allowed on public project
@@ -247,12 +247,14 class Project < ActiveRecord::Base
247
247
248 # Deletes all project's members
248 # Deletes all project's members
249 def delete_all_members
249 def delete_all_members
250 me, mr = Member.table_name, MemberRole.table_name
251 connection.delete("DELETE FROM #{mr} WHERE #{mr}.member_id IN (SELECT #{me}.id FROM #{me} WHERE #{me}.project_id = #{id})")
250 Member.delete_all(['project_id = ?', id])
252 Member.delete_all(['project_id = ?', id])
251 end
253 end
252
254
253 # Users issues can be assigned to
255 # Users issues can be assigned to
254 def assignable_users
256 def assignable_users
255 members.select {|m| m.role.assignable?}.collect {|m| m.user}.sort
257 members.select {|m| m.roles.detect {|role| role.assignable?}}.collect {|m| m.user}.sort
256 end
258 end
257
259
258 # Returns the mail adresses of users that should be always notified on project events
260 # Returns the mail adresses of users that should be always notified on project events
@@ -38,7 +38,8 class Role < ActiveRecord::Base
38 end
38 end
39 end
39 end
40
40
41 has_many :members
41 has_many :member_roles, :dependent => :destroy
42 has_many :members, :through => :member_roles
42 acts_as_list
43 acts_as_list
43
44
44 serialize :permissions, Array
45 serialize :permissions, Array
@@ -82,7 +83,11 class Role < ActiveRecord::Base
82 end
83 end
83
84
84 def <=>(role)
85 def <=>(role)
85 position <=> role.position
86 role ? position <=> role.position : -1
87 end
88
89 def to_s
90 name
86 end
91 end
87
92
88 # Return true if the role is a builtin role
93 # Return true if the role is a builtin role
@@ -33,7 +33,7 class User < ActiveRecord::Base
33 :username => '#{login}'
33 :username => '#{login}'
34 }
34 }
35
35
36 has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :conditions => "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}", :order => "#{Project.table_name}.name"
36 has_many :memberships, :class_name => 'Member', :include => [ :project, :roles ], :conditions => "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}", :order => "#{Project.table_name}.name"
37 has_many :members, :dependent => :delete_all
37 has_many :members, :dependent => :delete_all
38 has_many :projects, :through => :memberships
38 has_many :projects, :through => :memberships
39 has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify
39 has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify
@@ -229,26 +229,30 class User < ActiveRecord::Base
229 !logged?
229 !logged?
230 end
230 end
231
231
232 # Return user's role for project
232 # Return user's roles for project
233 def role_for_project(project)
233 def roles_for_project(project)
234 roles = []
234 # No role on archived projects
235 # No role on archived projects
235 return nil unless project && project.active?
236 return roles unless project && project.active?
236 if logged?
237 if logged?
237 # Find project membership
238 # Find project membership
238 membership = memberships.detect {|m| m.project_id == project.id}
239 membership = memberships.detect {|m| m.project_id == project.id}
239 if membership
240 if membership
240 membership.role
241 roles = membership.roles
241 else
242 else
242 @role_non_member ||= Role.non_member
243 @role_non_member ||= Role.non_member
244 roles << @role_non_member
243 end
245 end
244 else
246 else
245 @role_anonymous ||= Role.anonymous
247 @role_anonymous ||= Role.anonymous
248 roles << @role_anonymous
246 end
249 end
250 roles
247 end
251 end
248
252
249 # Return true if the user is a member of project
253 # Return true if the user is a member of project
250 def member_of?(project)
254 def member_of?(project)
251 role_for_project(project).member?
255 !roles_for_project(project).detect {|role| role.member?}.nil?
252 end
256 end
253
257
254 # Return true if the user is allowed to do the specified action on project
258 # Return true if the user is allowed to do the specified action on project
@@ -264,13 +268,13 class User < ActiveRecord::Base
264 # Admin users are authorized for anything else
268 # Admin users are authorized for anything else
265 return true if admin?
269 return true if admin?
266
270
267 role = role_for_project(project)
271 roles = roles_for_project(project)
268 return false unless role
272 return false unless roles
269 role.allowed_to?(action) && (project.is_public? || role.member?)
273 roles.detect {|role| (project.is_public? || role.member?) && role.allowed_to?(action)}
270
274
271 elsif options[:global]
275 elsif options[:global]
272 # authorize if user has at least one role that has this permission
276 # authorize if user has at least one role that has this permission
273 roles = memberships.collect {|m| m.role}.uniq
277 roles = memberships.collect {|m| m.roles}.flatten.uniq
274 roles.detect {|r| r.allowed_to?(action)} || (self.logged? ? Role.non_member.allowed_to?(action) : Role.anonymous.allowed_to?(action))
278 roles.detect {|r| r.allowed_to?(action)} || (self.logged? ? Role.non_member.allowed_to?(action) : Role.anonymous.allowed_to?(action))
275 else
279 else
276 false
280 false
@@ -25,7 +25,7
25 <ul>
25 <ul>
26 <% for membership in @memberships %>
26 <% for membership in @memberships %>
27 <li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %>
27 <li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %>
28 (<%=h membership.role.name %>, <%= format_date(membership.created_on) %>)</li>
28 (<%=h membership.roles.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li>
29 <% end %>
29 <% end %>
30 </ul>
30 </ul>
31 <% end %>
31 <% end %>
@@ -1,36 +1,43
1 <%= error_messages_for 'member' %>
1 <%= error_messages_for 'member' %>
2 <% roles = Role.find_all_givable
2 <% roles = Role.find_all_givable
3 members = @project.members.find(:all, :include => [:role, :user]).sort %>
3 members = @project.members.find(:all, :include => [:roles, :user]).sort %>
4
4
5 <div class="splitcontentleft">
5 <div class="splitcontentleft">
6 <% if members.any? %>
6 <% if members.any? %>
7 <table class="list">
7 <table class="list members">
8 <thead>
8 <thead>
9 <th><%= l(:label_user) %></th>
9 <th><%= l(:label_user) %></th>
10 <th><%= l(:label_role) %></th>
10 <th><%= l(:label_role_plural) %></th>
11 <th style="width:15%"></th>
11 <th style="width:15%"></th>
12 <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %>
12 <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %>
13 </thead>
13 </thead>
14 <tbody>
14 <tbody>
15 <% members.each do |member| %>
15 <% members.each do |member| %>
16 <% next if member.new_record? %>
16 <% next if member.new_record? %>
17 <tr id="member-<%= member.id %>" class="<%= cycle 'odd', 'even' %>">
17 <tr id="member-<%= member.id %>" class="<%= cycle 'odd', 'even' %> member">
18 <td><%=h member.name %></td>
18 <td class="user"><%= link_to_user member.user %></td>
19 <td align="center">
19 <td class="roles">
20 <span id="member-<%= member.id %>-roles"><%=h member.roles.sort.collect(&:to_s).join(', ') %></span>
20 <% if authorize_for('members', 'edit') %>
21 <% if authorize_for('members', 'edit') %>
21 <% remote_form_for(:member, member, :url => {:controller => 'members', :action => 'edit', :id => member}, :method => :post) do |f| %>
22 <% remote_form_for(:member, member, :url => {:controller => 'members', :action => 'edit', :id => member},
22 <%= f.select :role_id, roles.collect{|role| [role.name, role.id]}, {}, :class => "small" %>
23 :method => :post,
23 <%= submit_tag l(:button_change), :class => "small" %>
24 :html => { :id => "member-#{member.id}-roles-form", :style => 'display:none;' }) do |f| %>
25 <p><% roles.each do |role| %>
26 <label><%= check_box_tag 'member[role_ids][]', role.id, member.roles.include?(role) %> <%=h role %></label><br />
27 <% end %></p>
28 <p><%= submit_tag l(:button_change), :class => "small" %>
29 <%= link_to_function l(:button_cancel), "$('member-#{member.id}-roles').show(); $('member-#{member.id}-roles-form').hide(); return false;" %></p>
24 <% end %>
30 <% end %>
25 <% end %>
31 <% end %>
26 </td>
32 </td>
27 <td align="center">
33 <td class="buttons">
34 <%= link_to_function l(:button_edit), "$('member-#{member.id}-roles').hide(); $('member-#{member.id}-roles-form').show(); return false;", :class => 'icon icon-edit' %>
28 <%= link_to_remote l(:button_delete), { :url => {:controller => 'members', :action => 'destroy', :id => member},
35 <%= link_to_remote l(:button_delete), { :url => {:controller => 'members', :action => 'destroy', :id => member},
29 :method => :post
36 :method => :post
30 }, :title => l(:button_delete),
37 }, :title => l(:button_delete),
31 :class => 'icon icon-del' %>
38 :class => 'icon icon-del' %>
32 </td>
39 </td>
33 <%= call_hook(:view_projects_settings_members_table_row, { :project => @project, :member => member}) %>
40 <%= call_hook(:view_projects_settings_members_table_row, { :project => @project, :member => member}) %>
34 </tr>
41 </tr>
35 </tbody>
42 </tbody>
36 <% end; reset_cycle %>
43 <% end; reset_cycle %>
@@ -58,8 +65,11
58 <% end -%>
65 <% end -%>
59 </div>
66 </div>
60 <% end %>
67 <% end %>
61 <p><%= l(:label_role) %>: <%= f.select :role_id, roles.collect{|role| [role.name, role.id]}, :selected => nil %>
68 <p><%= l(:label_role_plural) %>:
62 <%= submit_tag l(:button_add) %></p>
69 <% roles.each do |role| %>
70 <label><%= check_box_tag 'member[role_ids][]', role.id %> <%=h role %></label>
71 <% end %></p>
72 <p><%= submit_tag l(:button_add) %></p>
63 </fieldset>
73 </fieldset>
64 <% end %>
74 <% end %>
65 <% end %>
75 <% end %>
@@ -6,7 +6,7
6 <p><label for="query_name"><%=l(:field_name)%></label>
6 <p><label for="query_name"><%=l(:field_name)%></label>
7 <%= text_field 'query', 'name', :size => 80 %></p>
7 <%= text_field 'query', 'name', :size => 80 %></p>
8
8
9 <% if User.current.admin? || (@project && current_role.allowed_to?(:manage_public_queries)) %>
9 <% if User.current.admin? || User.current.allowed_to?(:manage_public_queries, @project) %>
10 <p><label for="query_is_public"><%=l(:field_is_public)%></label>
10 <p><label for="query_is_public"><%=l(:field_is_public)%></label>
11 <%= check_box 'query', 'is_public',
11 <%= check_box 'query', 'is_public',
12 :onchange => (User.current.admin? ? nil : 'if (this.checked) {$("query_is_for_all").checked = false; $("query_is_for_all").disabled = true;} else {$("query_is_for_all").disabled = false;}') %></p>
12 :onchange => (User.current.admin? ? nil : 'if (this.checked) {$("query_is_for_all").checked = false; $("query_is_for_all").disabled = true;} else {$("query_is_for_all").disabled = false;}') %></p>
@@ -1,24 +1,36
1 <% if @memberships.any? %>
1 <% roles = Role.find_all_givable %>
2 <% projects = Project.active.find(:all, :order => 'lft') %>
3
4 <div class="splitcontentleft">
5 <% if @user.memberships.any? %>
2 <table class="list memberships">
6 <table class="list memberships">
3 <thead>
7 <thead>
4 <th><%= l(:label_project) %></th>
8 <th><%= l(:label_project) %></th>
5 <th><%= l(:label_role) %></th>
9 <th><%= l(:label_role_plural) %></th>
6 <th style="width:15%"></th>
10 <th style="width:15%"></th>
7 </thead>
11 </thead>
8 <tbody>
12 <tbody>
9 <% @memberships.each do |membership| %>
13 <% @user.memberships.each do |membership| %>
10 <% next if membership.new_record? %>
14 <% next if membership.new_record? %>
11 <tr class="<%= cycle 'odd', 'even' %>">
15 <tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class">
12 <td><%=h membership.project %></td>
16 <td class="project"><%=h membership.project %></td>
13 <td align="center">
17 <td class="roles">
14 <% form_tag({ :action => 'edit_membership', :id => @user, :membership_id => membership }) do %>
18 <span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span>
15 <%= select_tag 'membership[role_id]', options_from_collection_for_select(@roles, "id", "name", membership.role_id) %>
19 <% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership },
16 <%= submit_tag l(:button_change), :class => "small" %>
20 :html => { :id => "member-#{membership.id}-roles-form", :style => 'display:none;'}) do %>
21 <p><% roles.each do |role| %>
22 <label><%= check_box_tag 'membership[role_ids][]', role.id, membership.roles.include?(role) %> <%=h role %></label><br />
23 <% end %></p>
24 <p><%= submit_tag l(:button_change) %>
25 <%= link_to_function l(:button_cancel), "$('member-#{membership.id}-roles').show(); $('member-#{membership.id}-roles-form').hide(); return false;" %></p>
17 <% end %>
26 <% end %>
18 </td>
27 </td>
19 <td align="center">
28 <td class="buttons">
20 <%= link_to l(:button_delete), {:action => 'destroy_membership', :id => @user, :membership_id => membership }, :method => :post, :class => 'icon icon-del' %>
29 <%= link_to_function l(:button_edit), "$('member-#{membership.id}-roles').hide(); $('member-#{membership.id}-roles-form').show(); return false;", :class => 'icon icon-edit' %>
21 </td>
30 <%= link_to_remote l(:button_delete), { :url => { :controller => 'users', :action => 'destroy_membership', :id => @user, :membership_id => membership },
31 :method => :post },
32 :class => 'icon icon-del' %>
33 </td>
22 </tr>
34 </tr>
23 </tbody>
35 </tbody>
24 <% end; reset_cycle %>
36 <% end; reset_cycle %>
@@ -26,15 +38,19
26 <% else %>
38 <% else %>
27 <p class="nodata"><%= l(:label_no_data) %></p>
39 <p class="nodata"><%= l(:label_no_data) %></p>
28 <% end %>
40 <% end %>
41 </div>
29
42
30 <% if @projects.any? %>
43 <div class="splitcontentright">
31 <p>
44 <% if projects.any? %>
32 <label><%=l(:label_project_new)%></label><br/>
45 <fieldset><legend><%=l(:label_project_new)%></legend>
33 <% form_tag({ :action => 'edit_membership', :id => @user }) do %>
46 <% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user }) do %>
34 <%= select_tag 'membership[project_id]', options_for_membership_project_select(@user, @projects) %>
47 <%= select_tag 'membership[project_id]', options_for_membership_project_select(@user, projects) %>
35 <%= l(:label_role) %>:
48 <p><%= l(:label_role_plural) %>:
36 <%= select_tag 'membership[role_id]', options_from_collection_for_select(@roles, "id", "name") %>
49 <% roles.each do |role| %>
37 <%= submit_tag l(:button_add) %>
50 <label><%= check_box_tag 'membership[role_ids][]', role.id %> <%=h role %></label>
51 <% end %></p>
52 <p><%= submit_tag l(:button_add) %></p>
38 <% end %>
53 <% end %>
39 </p>
54 </fieldset>
40 <% end %>
55 <% end %>
56 </div>
@@ -43,7 +43,7
43 <% for old_status in @statuses %>
43 <% for old_status in @statuses %>
44 <tr class="<%= cycle("odd", "even") %>">
44 <tr class="<%= cycle("odd", "even") %>">
45 <td><%= old_status.name %></td>
45 <td><%= old_status.name %></td>
46 <% new_status_ids_allowed = old_status.find_new_statuses_allowed_to(@role, @tracker).collect(&:id) -%>
46 <% new_status_ids_allowed = old_status.find_new_statuses_allowed_to([@role], @tracker).collect(&:id) -%>
47 <% for new_status in @statuses -%>
47 <% for new_status in @statuses -%>
48 <td align="center">
48 <td align="center">
49 <input type="checkbox"
49 <input type="checkbox"
@@ -87,6 +87,8 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
87 table.list td { vertical-align: top; }
87 table.list td { vertical-align: top; }
88 table.list td.id { width: 2%; text-align: center;}
88 table.list td.id { width: 2%; text-align: center;}
89 table.list td.checkbox { width: 15px; padding: 0px;}
89 table.list td.checkbox { width: 15px; padding: 0px;}
90 table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
91 table.list td.buttons a { padding-right: 0.6em; }
90
92
91 tr.project td.name a { padding-left: 16px; white-space:nowrap; }
93 tr.project td.name a { padding-left: 16px; white-space:nowrap; }
92 tr.project.parent td.name a { background: url('../images/bullet_toggle_minus.png') no-repeat; }
94 tr.project.parent td.name a { background: url('../images/bullet_toggle_minus.png') no-repeat; }
@@ -114,6 +116,8 table.files tr.file td { text-align: center; }
114 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
116 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
115 table.files tr.file td.digest { font-size: 80%; }
117 table.files tr.file td.digest { font-size: 80%; }
116
118
119 table.members td.roles, table.memberships td.roles { width: 45%; }
120
117 tr.message { height: 2.6em; }
121 tr.message { height: 2.6em; }
118 tr.message td.last_message { font-size: 80%; }
122 tr.message td.last_message { font-size: 80%; }
119 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
123 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
@@ -333,11 +337,11 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
333 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
337 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
334
338
335 /* Project members tab */
339 /* Project members tab */
336 div#tab-content-members .splitcontentleft { width: 64% }
340 div#tab-content-members .splitcontentleft, div#tab-content-memberships .splitcontentleft { width: 64% }
337 div#tab-content-members .splitcontentright { width: 34% }
341 div#tab-content-members .splitcontentright, div#tab-content-memberships .splitcontentright { width: 34% }
338 div#tab-content-members fieldset { padding:1em; margin-bottom: 1em; }
342 div#tab-content-members fieldset, div#tab-content-memberships fieldset { padding:1em; margin-bottom: 1em; }
339 div#tab-content-members fieldset legend { font-weight: bold; }
343 div#tab-content-members fieldset legend, div#tab-content-memberships fieldset legend { font-weight: bold; }
340 div#tab-content-members fieldset label { display: block; }
344 div#tab-content-members fieldset label, div#tab-content-memberships fieldset label { display: block; }
341 div#tab-content-members fieldset div { max-height: 400px; overflow:auto; }
345 div#tab-content-members fieldset div { max-height: 400px; overflow:auto; }
342
346
343 * html div#tab-content-members fieldset div { height: 450px; }
347 * html div#tab-content-members fieldset div { height: 450px; }
@@ -2,21 +2,18
2 members_001:
2 members_001:
3 created_on: 2006-07-19 19:35:33 +02:00
3 created_on: 2006-07-19 19:35:33 +02:00
4 project_id: 1
4 project_id: 1
5 role_id: 1
6 id: 1
5 id: 1
7 user_id: 2
6 user_id: 2
8 mail_notification: true
7 mail_notification: true
9 members_002:
8 members_002:
10 created_on: 2006-07-19 19:35:36 +02:00
9 created_on: 2006-07-19 19:35:36 +02:00
11 project_id: 1
10 project_id: 1
12 role_id: 2
13 id: 2
11 id: 2
14 user_id: 3
12 user_id: 3
15 mail_notification: true
13 mail_notification: true
16 members_003:
14 members_003:
17 created_on: 2006-07-19 19:35:36 +02:00
15 created_on: 2006-07-19 19:35:36 +02:00
18 project_id: 2
16 project_id: 2
19 role_id: 2
20 id: 3
17 id: 3
21 user_id: 2
18 user_id: 2
22 mail_notification: true
19 mail_notification: true
@@ -24,7 +21,6 members_004:
24 id: 4
21 id: 4
25 created_on: 2006-07-19 19:35:36 +02:00
22 created_on: 2006-07-19 19:35:36 +02:00
26 project_id: 1
23 project_id: 1
27 role_id: 2
28 # Locked user
24 # Locked user
29 user_id: 5
25 user_id: 5
30 mail_notification: true
26 mail_notification: true
@@ -32,7 +28,6 members_005:
32 id: 5
28 id: 5
33 created_on: 2006-07-19 19:35:33 +02:00
29 created_on: 2006-07-19 19:35:33 +02:00
34 project_id: 5
30 project_id: 5
35 role_id: 1
36 user_id: 2
31 user_id: 2
37 mail_notification: true
32 mail_notification: true
38 No newline at end of file
33
@@ -23,7 +23,7 class AttachmentsController; def rescue_action(e) raise e end; end
23
23
24
24
25 class AttachmentsControllerTest < Test::Unit::TestCase
25 class AttachmentsControllerTest < Test::Unit::TestCase
26 fixtures :users, :projects, :roles, :members, :enabled_modules, :issues, :trackers, :attachments,
26 fixtures :users, :projects, :roles, :members, :member_roles, :enabled_modules, :issues, :trackers, :attachments,
27 :versions, :wiki_pages, :wikis, :documents
27 :versions, :wiki_pages, :wikis, :documents
28
28
29 def setup
29 def setup
@@ -22,7 +22,7 require 'boards_controller'
22 class BoardsController; def rescue_action(e) raise e end; end
22 class BoardsController; def rescue_action(e) raise e end; end
23
23
24 class BoardsControllerTest < Test::Unit::TestCase
24 class BoardsControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :members, :roles, :boards, :messages, :enabled_modules
25 fixtures :projects, :users, :members, :member_roles, :roles, :boards, :messages, :enabled_modules
26
26
27 def setup
27 def setup
28 @controller = BoardsController.new
28 @controller = BoardsController.new
@@ -22,7 +22,7 require 'documents_controller'
22 class DocumentsController; def rescue_action(e) raise e end; end
22 class DocumentsController; def rescue_action(e) raise e end; end
23
23
24 class DocumentsControllerTest < Test::Unit::TestCase
24 class DocumentsControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :enabled_modules, :documents, :enumerations
25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :documents, :enumerations
26
26
27 def setup
27 def setup
28 @controller = DocumentsController.new
28 @controller = DocumentsController.new
@@ -22,7 +22,7 require 'issue_categories_controller'
22 class IssueCategoriesController; def rescue_action(e) raise e end; end
22 class IssueCategoriesController; def rescue_action(e) raise e end; end
23
23
24 class IssueCategoriesControllerTest < Test::Unit::TestCase
24 class IssueCategoriesControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :members, :roles, :enabled_modules, :issue_categories
25 fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules, :issue_categories
26
26
27 def setup
27 def setup
28 @controller = IssueCategoriesController.new
28 @controller = IssueCategoriesController.new
@@ -10,6 +10,7 class IssueRelationsControllerTest < Test::Unit::TestCase
10 :users,
10 :users,
11 :roles,
11 :roles,
12 :members,
12 :members,
13 :member_roles,
13 :issues,
14 :issues,
14 :issue_statuses,
15 :issue_statuses,
15 :enabled_modules,
16 :enabled_modules,
@@ -26,6 +26,7 class IssuesControllerTest < Test::Unit::TestCase
26 :users,
26 :users,
27 :roles,
27 :roles,
28 :members,
28 :members,
29 :member_roles,
29 :issues,
30 :issues,
30 :issue_statuses,
31 :issue_statuses,
31 :versions,
32 :versions,
@@ -22,7 +22,7 require 'journals_controller'
22 class JournalsController; def rescue_action(e) raise e end; end
22 class JournalsController; def rescue_action(e) raise e end; end
23
23
24 class JournalsControllerTest < Test::Unit::TestCase
24 class JournalsControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :members, :roles, :issues, :journals, :journal_details, :enabled_modules
25 fixtures :projects, :users, :members, :member_roles, :roles, :issues, :journals, :journal_details, :enabled_modules
26
26
27 def setup
27 def setup
28 @controller = JournalsController.new
28 @controller = JournalsController.new
@@ -22,7 +22,7 require 'mail_handler_controller'
22 class MailHandlerController; def rescue_action(e) raise e end; end
22 class MailHandlerController; def rescue_action(e) raise e end; end
23
23
24 class MailHandlerControllerTest < Test::Unit::TestCase
24 class MailHandlerControllerTest < Test::Unit::TestCase
25 fixtures :users, :projects, :enabled_modules, :roles, :members, :issues, :issue_statuses, :trackers, :enumerations
25 fixtures :users, :projects, :enabled_modules, :roles, :members, :member_roles, :issues, :issue_statuses, :trackers, :enumerations
26
26
27 FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler'
27 FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler'
28
28
@@ -23,7 +23,7 class MembersController; def rescue_action(e) raise e end; end
23
23
24
24
25 class MembersControllerTest < Test::Unit::TestCase
25 class MembersControllerTest < Test::Unit::TestCase
26 fixtures :projects, :members, :roles, :users
26 fixtures :projects, :members, :member_roles, :roles, :users
27
27
28 def setup
28 def setup
29 @controller = MembersController.new
29 @controller = MembersController.new
@@ -42,7 +42,7 class MembersControllerTest < Test::Unit::TestCase
42
42
43 def test_create
43 def test_create
44 assert_difference 'Member.count' do
44 assert_difference 'Member.count' do
45 post :new, :id => 1, :member => {:role_id => 1, :user_id => 7}
45 post :new, :id => 1, :member => {:role_ids => [1], :user_id => 7}
46 end
46 end
47 assert_redirected_to '/projects/ecookbook/settings/members'
47 assert_redirected_to '/projects/ecookbook/settings/members'
48 assert User.find(7).member_of?(Project.find(1))
48 assert User.find(7).member_of?(Project.find(1))
@@ -50,7 +50,7 class MembersControllerTest < Test::Unit::TestCase
50
50
51 def test_create_by_user_login
51 def test_create_by_user_login
52 assert_difference 'Member.count' do
52 assert_difference 'Member.count' do
53 post :new, :id => 1, :member => {:role_id => 1, :user_login => 'someone'}
53 post :new, :id => 1, :member => {:role_ids => [1], :user_login => 'someone'}
54 end
54 end
55 assert_redirected_to '/projects/ecookbook/settings/members'
55 assert_redirected_to '/projects/ecookbook/settings/members'
56 assert User.find(7).member_of?(Project.find(1))
56 assert User.find(7).member_of?(Project.find(1))
@@ -58,7 +58,7 class MembersControllerTest < Test::Unit::TestCase
58
58
59 def test_create_multiple
59 def test_create_multiple
60 assert_difference 'Member.count', 3 do
60 assert_difference 'Member.count', 3 do
61 post :new, :id => 1, :member => {:role_id => 1, :user_ids => [7, 8, 9]}
61 post :new, :id => 1, :member => {:role_ids => [1], :user_ids => [7, 8, 9]}
62 end
62 end
63 assert_redirected_to '/projects/ecookbook/settings/members'
63 assert_redirected_to '/projects/ecookbook/settings/members'
64 assert User.find(7).member_of?(Project.find(1))
64 assert User.find(7).member_of?(Project.find(1))
@@ -66,7 +66,7 class MembersControllerTest < Test::Unit::TestCase
66
66
67 def test_edit
67 def test_edit
68 assert_no_difference 'Member.count' do
68 assert_no_difference 'Member.count' do
69 post :edit, :id => 2, :member => {:role_id => 1, :user_id => 3}
69 post :edit, :id => 2, :member => {:role_ids => [1], :user_id => 3}
70 end
70 end
71 assert_redirected_to '/projects/ecookbook/settings/members'
71 assert_redirected_to '/projects/ecookbook/settings/members'
72 end
72 end
@@ -22,7 +22,7 require 'messages_controller'
22 class MessagesController; def rescue_action(e) raise e end; end
22 class MessagesController; def rescue_action(e) raise e end; end
23
23
24 class MessagesControllerTest < Test::Unit::TestCase
24 class MessagesControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :members, :roles, :boards, :messages, :enabled_modules
25 fixtures :projects, :users, :members, :member_roles, :roles, :boards, :messages, :enabled_modules
26
26
27 def setup
27 def setup
28 @controller = MessagesController.new
28 @controller = MessagesController.new
@@ -22,7 +22,7 require 'news_controller'
22 class NewsController; def rescue_action(e) raise e end; end
22 class NewsController; def rescue_action(e) raise e end; end
23
23
24 class NewsControllerTest < Test::Unit::TestCase
24 class NewsControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :enabled_modules, :news, :comments
25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news, :comments
26
26
27 def setup
27 def setup
28 @controller = NewsController.new
28 @controller = NewsController.new
@@ -22,7 +22,7 require 'projects_controller'
22 class ProjectsController; def rescue_action(e) raise e end; end
22 class ProjectsController; def rescue_action(e) raise e end; end
23
23
24 class ProjectsControllerTest < Test::Unit::TestCase
24 class ProjectsControllerTest < Test::Unit::TestCase
25 fixtures :projects, :versions, :users, :roles, :members, :issues, :journals, :journal_details,
25 fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
26 :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
26 :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
27 :attachments
27 :attachments
28
28
@@ -22,7 +22,7 require 'queries_controller'
22 class QueriesController; def rescue_action(e) raise e end; end
22 class QueriesController; def rescue_action(e) raise e end; end
23
23
24 class QueriesControllerTest < Test::Unit::TestCase
24 class QueriesControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :members, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries
25 fixtures :projects, :users, :members, :member_roles, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries
26
26
27 def setup
27 def setup
28 @controller = QueriesController.new
28 @controller = QueriesController.new
@@ -22,7 +22,7 require 'repositories_controller'
22 class RepositoriesController; def rescue_action(e) raise e end; end
22 class RepositoriesController; def rescue_action(e) raise e end; end
23
23
24 class RepositoriesBazaarControllerTest < Test::Unit::TestCase
24 class RepositoriesBazaarControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :repositories, :enabled_modules
25 fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
26
26
27 # No '..' in the repository path
27 # No '..' in the repository path
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/bazaar_repository'
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/bazaar_repository'
@@ -22,7 +22,7 require 'repositories_controller'
22 class RepositoriesController; def rescue_action(e) raise e end; end
22 class RepositoriesController; def rescue_action(e) raise e end; end
23
23
24 class RepositoriesControllerTest < Test::Unit::TestCase
24 class RepositoriesControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :repositories, :issues, :issue_statuses, :changesets, :changes, :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
25 fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :issues, :issue_statuses, :changesets, :changes, :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
26
26
27 def setup
27 def setup
28 @controller = RepositoriesController.new
28 @controller = RepositoriesController.new
@@ -22,7 +22,7 require 'repositories_controller'
22 class RepositoriesController; def rescue_action(e) raise e end; end
22 class RepositoriesController; def rescue_action(e) raise e end; end
23
23
24 class RepositoriesDarcsControllerTest < Test::Unit::TestCase
24 class RepositoriesDarcsControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :repositories, :enabled_modules
25 fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
26
26
27 # No '..' in the repository path
27 # No '..' in the repository path
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository'
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository'
@@ -22,7 +22,7 require 'repositories_controller'
22 class RepositoriesController; def rescue_action(e) raise e end; end
22 class RepositoriesController; def rescue_action(e) raise e end; end
23
23
24 class RepositoriesGitControllerTest < Test::Unit::TestCase
24 class RepositoriesGitControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :repositories, :enabled_modules
25 fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
26
26
27 # No '..' in the repository path
27 # No '..' in the repository path
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
@@ -22,7 +22,7 require 'repositories_controller'
22 class RepositoriesController; def rescue_action(e) raise e end; end
22 class RepositoriesController; def rescue_action(e) raise e end; end
23
23
24 class RepositoriesMercurialControllerTest < Test::Unit::TestCase
24 class RepositoriesMercurialControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :repositories, :enabled_modules
25 fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
26
26
27 # No '..' in the repository path
27 # No '..' in the repository path
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
@@ -22,7 +22,7 require 'repositories_controller'
22 class RepositoriesController; def rescue_action(e) raise e end; end
22 class RepositoriesController; def rescue_action(e) raise e end; end
23
23
24 class RepositoriesSubversionControllerTest < Test::Unit::TestCase
24 class RepositoriesSubversionControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :enabled_modules,
25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules,
26 :repositories, :issues, :issue_statuses, :changesets, :changes,
26 :repositories, :issues, :issue_statuses, :changesets, :changes,
27 :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
27 :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
28
28
@@ -22,7 +22,7 require 'roles_controller'
22 class RolesController; def rescue_action(e) raise e end; end
22 class RolesController; def rescue_action(e) raise e end; end
23
23
24 class RolesControllerTest < Test::Unit::TestCase
24 class RolesControllerTest < Test::Unit::TestCase
25 fixtures :roles, :users, :members, :workflows
25 fixtures :roles, :users, :members, :member_roles, :workflows
26
26
27 def setup
27 def setup
28 @controller = RolesController.new
28 @controller = RolesController.new
@@ -65,7 +65,7 class RolesControllerTest < Test::Unit::TestCase
65 :permissions => ['add_issues', 'edit_issues', 'log_time', ''],
65 :permissions => ['add_issues', 'edit_issues', 'log_time', ''],
66 :assignable => '0'}
66 :assignable => '0'}
67
67
68 assert_redirected_to 'roles/list'
68 assert_redirected_to 'roles'
69 role = Role.find_by_name('RoleWithoutWorkflowCopy')
69 role = Role.find_by_name('RoleWithoutWorkflowCopy')
70 assert_not_nil role
70 assert_not_nil role
71 assert_equal [:add_issues, :edit_issues, :log_time], role.permissions
71 assert_equal [:add_issues, :edit_issues, :log_time], role.permissions
@@ -78,7 +78,7 class RolesControllerTest < Test::Unit::TestCase
78 :assignable => '0'},
78 :assignable => '0'},
79 :copy_workflow_from => '1'
79 :copy_workflow_from => '1'
80
80
81 assert_redirected_to 'roles/list'
81 assert_redirected_to 'roles'
82 role = Role.find_by_name('RoleWithWorkflowCopy')
82 role = Role.find_by_name('RoleWithWorkflowCopy')
83 assert_not_nil role
83 assert_not_nil role
84 assert_equal Role.find(1).workflows.size, role.workflows.size
84 assert_equal Role.find(1).workflows.size, role.workflows.size
@@ -97,7 +97,7 class RolesControllerTest < Test::Unit::TestCase
97 :permissions => ['edit_project', ''],
97 :permissions => ['edit_project', ''],
98 :assignable => '0'}
98 :assignable => '0'}
99
99
100 assert_redirected_to 'roles/list'
100 assert_redirected_to 'roles'
101 role = Role.find(1)
101 role = Role.find(1)
102 assert_equal [:edit_project], role.permissions
102 assert_equal [:edit_project], role.permissions
103 end
103 end
@@ -107,7 +107,7 class RolesControllerTest < Test::Unit::TestCase
107 assert r.save
107 assert r.save
108
108
109 post :destroy, :id => r
109 post :destroy, :id => r
110 assert_redirected_to 'roles/list'
110 assert_redirected_to 'roles'
111 assert_nil Role.find_by_id(r.id)
111 assert_nil Role.find_by_id(r.id)
112 end
112 end
113
113
@@ -139,7 +139,7 class RolesControllerTest < Test::Unit::TestCase
139
139
140 def test_post_report
140 def test_post_report
141 post :report, :permissions => { '0' => '', '1' => ['edit_issues'], '3' => ['add_issues', 'delete_issues']}
141 post :report, :permissions => { '0' => '', '1' => ['edit_issues'], '3' => ['add_issues', 'delete_issues']}
142 assert_redirected_to 'roles/list'
142 assert_redirected_to 'roles'
143
143
144 assert_equal [:edit_issues], Role.find(1).permissions
144 assert_equal [:edit_issues], Role.find(1).permissions
145 assert_equal [:add_issues, :delete_issues], Role.find(3).permissions
145 assert_equal [:add_issues, :delete_issues], Role.find(3).permissions
@@ -148,33 +148,33 class RolesControllerTest < Test::Unit::TestCase
148
148
149 def test_clear_all_permissions
149 def test_clear_all_permissions
150 post :report, :permissions => { '0' => '' }
150 post :report, :permissions => { '0' => '' }
151 assert_redirected_to 'roles/list'
151 assert_redirected_to 'roles'
152 assert Role.find(1).permissions.empty?
152 assert Role.find(1).permissions.empty?
153 end
153 end
154
154
155 def test_move_highest
155 def test_move_highest
156 post :edit, :id => 3, :role => {:move_to => 'highest'}
156 post :edit, :id => 3, :role => {:move_to => 'highest'}
157 assert_redirected_to 'roles/list'
157 assert_redirected_to 'roles'
158 assert_equal 1, Role.find(3).position
158 assert_equal 1, Role.find(3).position
159 end
159 end
160
160
161 def test_move_higher
161 def test_move_higher
162 position = Role.find(3).position
162 position = Role.find(3).position
163 post :edit, :id => 3, :role => {:move_to => 'higher'}
163 post :edit, :id => 3, :role => {:move_to => 'higher'}
164 assert_redirected_to 'roles/list'
164 assert_redirected_to 'roles'
165 assert_equal position - 1, Role.find(3).position
165 assert_equal position - 1, Role.find(3).position
166 end
166 end
167
167
168 def test_move_lower
168 def test_move_lower
169 position = Role.find(2).position
169 position = Role.find(2).position
170 post :edit, :id => 2, :role => {:move_to => 'lower'}
170 post :edit, :id => 2, :role => {:move_to => 'lower'}
171 assert_redirected_to 'roles/list'
171 assert_redirected_to 'roles'
172 assert_equal position + 1, Role.find(2).position
172 assert_equal position + 1, Role.find(2).position
173 end
173 end
174
174
175 def test_move_lowest
175 def test_move_lowest
176 post :edit, :id => 2, :role => {:move_to => 'lowest'}
176 post :edit, :id => 2, :role => {:move_to => 'lowest'}
177 assert_redirected_to 'roles/list'
177 assert_redirected_to 'roles'
178 assert_equal Role.count, Role.find(2).position
178 assert_equal Role.count, Role.find(2).position
179 end
179 end
180 end
180 end
@@ -5,7 +5,7 require 'search_controller'
5 class SearchController; def rescue_action(e) raise e end; end
5 class SearchController; def rescue_action(e) raise e end; end
6
6
7 class SearchControllerTest < Test::Unit::TestCase
7 class SearchControllerTest < Test::Unit::TestCase
8 fixtures :projects, :enabled_modules, :roles, :users,
8 fixtures :projects, :enabled_modules, :roles, :users, :members, :member_roles,
9 :issues, :trackers, :issue_statuses,
9 :issues, :trackers, :issue_statuses,
10 :custom_fields, :custom_values,
10 :custom_fields, :custom_values,
11 :repositories, :changesets
11 :repositories, :changesets
@@ -22,7 +22,7 require 'timelog_controller'
22 class TimelogController; def rescue_action(e) raise e end; end
22 class TimelogController; def rescue_action(e) raise e end; end
23
23
24 class TimelogControllerTest < Test::Unit::TestCase
24 class TimelogControllerTest < Test::Unit::TestCase
25 fixtures :projects, :enabled_modules, :roles, :members, :issues, :time_entries, :users, :trackers, :enumerations, :issue_statuses, :custom_fields, :custom_values
25 fixtures :projects, :enabled_modules, :roles, :members, :member_roles, :issues, :time_entries, :users, :trackers, :enumerations, :issue_statuses, :custom_fields, :custom_values
26
26
27 def setup
27 def setup
28 @controller = TimelogController.new
28 @controller = TimelogController.new
@@ -24,7 +24,7 class UsersController; def rescue_action(e) raise e end; end
24 class UsersControllerTest < Test::Unit::TestCase
24 class UsersControllerTest < Test::Unit::TestCase
25 include Redmine::I18n
25 include Redmine::I18n
26
26
27 fixtures :users, :projects, :members
27 fixtures :users, :projects, :members, :member_roles, :roles
28
28
29 def setup
29 def setup
30 @controller = UsersController.new
30 @controller = UsersController.new
@@ -123,9 +123,9 class UsersControllerTest < Test::Unit::TestCase
123
123
124 def test_edit_membership
124 def test_edit_membership
125 post :edit_membership, :id => 2, :membership_id => 1,
125 post :edit_membership, :id => 2, :membership_id => 1,
126 :membership => { :role_id => 2}
126 :membership => { :role_ids => [2]}
127 assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships'
127 assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships'
128 assert_equal 2, Member.find(1).role_id
128 assert_equal [2], Member.find(1).role_ids
129 end
129 end
130
130
131 def test_edit_with_activation_should_send_a_notification
131 def test_edit_with_activation_should_send_a_notification
@@ -22,7 +22,7 require 'versions_controller'
22 class VersionsController; def rescue_action(e) raise e end; end
22 class VersionsController; def rescue_action(e) raise e end; end
23
23
24 class VersionsControllerTest < Test::Unit::TestCase
24 class VersionsControllerTest < Test::Unit::TestCase
25 fixtures :projects, :versions, :issues, :users, :roles, :members, :enabled_modules
25 fixtures :projects, :versions, :issues, :users, :roles, :members, :member_roles, :enabled_modules
26
26
27 def setup
27 def setup
28 @controller = VersionsController.new
28 @controller = VersionsController.new
@@ -22,7 +22,7 require 'watchers_controller'
22 class WatchersController; def rescue_action(e) raise e end; end
22 class WatchersController; def rescue_action(e) raise e end; end
23
23
24 class WatchersControllerTest < Test::Unit::TestCase
24 class WatchersControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :enabled_modules,
25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules,
26 :issues, :trackers, :projects_trackers, :issue_statuses, :enumerations, :watchers
26 :issues, :trackers, :projects_trackers, :issue_statuses, :enumerations, :watchers
27
27
28 def setup
28 def setup
@@ -22,7 +22,7 require 'wiki_controller'
22 class WikiController; def rescue_action(e) raise e end; end
22 class WikiController; def rescue_action(e) raise e end; end
23
23
24 class WikiControllerTest < Test::Unit::TestCase
24 class WikiControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :enabled_modules, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions, :attachments
25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions, :attachments
26
26
27 def setup
27 def setup
28 @controller = WikiController.new
28 @controller = WikiController.new
@@ -22,7 +22,7 require 'wikis_controller'
22 class WikisController; def rescue_action(e) raise e end; end
22 class WikisController; def rescue_action(e) raise e end; end
23
23
24 class WikisControllerTest < Test::Unit::TestCase
24 class WikisControllerTest < Test::Unit::TestCase
25 fixtures :projects, :users, :roles, :members, :enabled_modules, :wikis
25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :wikis
26
26
27 def setup
27 def setup
28 @controller = WikisController.new
28 @controller = WikisController.new
@@ -18,7 +18,7
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class ActivityTest < Test::Unit::TestCase
20 class ActivityTest < Test::Unit::TestCase
21 fixtures :projects, :versions, :attachments, :users, :roles, :members, :issues, :journals, :journal_details,
21 fixtures :projects, :versions, :attachments, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
22 :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages
22 :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages
23
23
24 def setup
24 def setup
@@ -18,7 +18,7
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class ChangesetTest < Test::Unit::TestCase
20 class ChangesetTest < Test::Unit::TestCase
21 fixtures :projects, :repositories, :issues, :issue_statuses, :changesets, :changes, :issue_categories, :enumerations, :custom_fields, :custom_values, :users, :members, :trackers
21 fixtures :projects, :repositories, :issues, :issue_statuses, :changesets, :changes, :issue_categories, :enumerations, :custom_fields, :custom_values, :users, :members, :member_roles, :trackers
22
22
23 def setup
23 def setup
24 end
24 end
@@ -18,7 +18,7
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class IssueTest < Test::Unit::TestCase
20 class IssueTest < Test::Unit::TestCase
21 fixtures :projects, :users, :members,
21 fixtures :projects, :users, :members, :member_roles,
22 :trackers, :projects_trackers,
22 :trackers, :projects_trackers,
23 :issue_statuses, :issue_categories,
23 :issue_statuses, :issue_categories,
24 :enumerations,
24 :enumerations,
@@ -242,6 +242,10 class IssueTest < Test::Unit::TestCase
242 assert !Issue.new(:due_date => 1.day.ago.to_date, :status => IssueStatus.find(:first, :conditions => {:is_closed => true})).overdue?
242 assert !Issue.new(:due_date => 1.day.ago.to_date, :status => IssueStatus.find(:first, :conditions => {:is_closed => true})).overdue?
243 end
243 end
244
244
245 def test_assignable_users
246 assert_kind_of User, Issue.find(1).assignable_users.first
247 end
248
245 def test_create_should_send_email_notification
249 def test_create_should_send_email_notification
246 ActionMailer::Base.deliveries.clear
250 ActionMailer::Base.deliveries.clear
247 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.priorities.first, :subject => 'test_create', :estimated_hours => '1:30')
251 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.priorities.first, :subject => 'test_create', :estimated_hours => '1:30')
@@ -22,6 +22,7 class MailHandlerTest < Test::Unit::TestCase
22 :enabled_modules,
22 :enabled_modules,
23 :roles,
23 :roles,
24 :members,
24 :members,
25 :member_roles,
25 :issues,
26 :issues,
26 :issue_statuses,
27 :issue_statuses,
27 :workflows,
28 :workflows,
@@ -19,7 +19,7 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class MailerTest < Test::Unit::TestCase
20 class MailerTest < Test::Unit::TestCase
21 include Redmine::I18n
21 include Redmine::I18n
22 fixtures :projects, :issues, :users, :members, :documents, :attachments, :news, :tokens, :journals, :journal_details, :changesets, :trackers, :issue_statuses, :enumerations, :messages, :boards, :repositories
22 fixtures :projects, :issues, :users, :members, :member_roles, :documents, :attachments, :news, :tokens, :journals, :journal_details, :changesets, :trackers, :issue_statuses, :enumerations, :messages, :boards, :repositories
23
23
24 def test_generated_links_in_emails
24 def test_generated_links_in_emails
25 ActionMailer::Base.deliveries.clear
25 ActionMailer::Base.deliveries.clear
@@ -18,34 +18,54
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class MemberTest < Test::Unit::TestCase
20 class MemberTest < Test::Unit::TestCase
21 fixtures :users, :projects, :roles, :members
21 fixtures :users, :projects, :roles, :members, :member_roles
22
22
23 def setup
23 def setup
24 @jsmith = Member.find(1)
24 @jsmith = Member.find(1)
25 end
25 end
26
26
27 def test_create
27 def test_create
28 member = Member.new(:project_id => 1, :user_id => 4, :role_id => 1)
28 member = Member.new(:project_id => 1, :user_id => 4, :role_ids => [1, 2])
29 assert member.save
29 assert member.save
30 member.reload
31
32 assert_equal 2, member.roles.size
33 assert_equal Role.find(1), member.roles.sort.first
30 end
34 end
31
35
32 def test_update
36 def test_update
33 assert_equal "eCookbook", @jsmith.project.name
37 assert_equal "eCookbook", @jsmith.project.name
34 assert_equal "Manager", @jsmith.role.name
38 assert_equal "Manager", @jsmith.roles.first.name
35 assert_equal "jsmith", @jsmith.user.login
39 assert_equal "jsmith", @jsmith.user.login
36
40
37 @jsmith.role = Role.find(2)
41 @jsmith.mail_notification = !@jsmith.mail_notification
38 assert @jsmith.save
42 assert @jsmith.save
39 end
43 end
44
45 def test_update_roles
46 assert_equal 1, @jsmith.roles.size
47 @jsmith.role_ids = [1, 2]
48 assert @jsmith.save
49 assert_equal 2, @jsmith.reload.roles.size
50 end
40
51
41 def test_validate
52 def test_validate
42 member = Member.new(:project_id => 1, :user_id => 2, :role_id =>2)
53 member = Member.new(:project_id => 1, :user_id => 2, :role_ids => [2])
43 # same use can't have more than one role for a project
54 # same use can't have more than one membership for a project
55 assert !member.save
56
57 member = Member.new(:project_id => 1, :user_id => 2, :role_ids => [])
58 # must have one role at least
44 assert !member.save
59 assert !member.save
45 end
60 end
46
61
47 def test_destroy
62 def test_destroy
48 @jsmith.destroy
63 assert_difference 'Member.count', -1 do
64 assert_difference 'MemberRole.count', -1 do
65 @jsmith.destroy
66 end
67 end
68
49 assert_raise(ActiveRecord::RecordNotFound) { Member.find(@jsmith.id) }
69 assert_raise(ActiveRecord::RecordNotFound) { Member.find(@jsmith.id) }
50 end
70 end
51 end
71 end
@@ -18,7 +18,7
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class MessageTest < Test::Unit::TestCase
20 class MessageTest < Test::Unit::TestCase
21 fixtures :projects, :roles, :members, :boards, :messages, :users, :watchers
21 fixtures :projects, :roles, :members, :member_roles, :boards, :messages, :users, :watchers
22
22
23 def setup
23 def setup
24 @board = Board.find(1)
24 @board = Board.find(1)
@@ -116,7 +116,7 class MessageTest < Test::Unit::TestCase
116 author = message.author
116 author = message.author
117 assert message.editable_by?(author)
117 assert message.editable_by?(author)
118
118
119 author.role_for_project(message.project).remove_permission!(:edit_own_messages)
119 author.roles_for_project(message.project).first.remove_permission!(:edit_own_messages)
120 assert !message.reload.editable_by?(author.reload)
120 assert !message.reload.editable_by?(author.reload)
121 end
121 end
122
122
@@ -125,7 +125,7 class MessageTest < Test::Unit::TestCase
125 author = message.author
125 author = message.author
126 assert message.destroyable_by?(author)
126 assert message.destroyable_by?(author)
127
127
128 author.role_for_project(message.project).remove_permission!(:delete_own_messages)
128 author.roles_for_project(message.project).first.remove_permission!(:delete_own_messages)
129 assert !message.reload.destroyable_by?(author.reload)
129 assert !message.reload.destroyable_by?(author.reload)
130 end
130 end
131 end
131 end
@@ -18,7 +18,7
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class NewsTest < Test::Unit::TestCase
20 class NewsTest < Test::Unit::TestCase
21 fixtures :projects, :users, :roles, :members, :enabled_modules, :news
21 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news
22
22
23 def valid_news
23 def valid_news
24 { :title => 'Test news', :description => 'Lorem ipsum etc', :author => User.find(:first) }
24 { :title => 'Test news', :description => 'Lorem ipsum etc', :author => User.find(:first) }
@@ -20,8 +20,8 require File.dirname(__FILE__) + '/../test_helper'
20 class ProjectTest < Test::Unit::TestCase
20 class ProjectTest < Test::Unit::TestCase
21 fixtures :projects, :enabled_modules,
21 fixtures :projects, :enabled_modules,
22 :issues, :issue_statuses, :journals, :journal_details,
22 :issues, :issue_statuses, :journals, :journal_details,
23 :users, :members, :roles, :projects_trackers, :trackers, :boards,
23 :users, :members, :member_roles, :roles, :projects_trackers, :trackers, :boards,
24 :queries
24 :queries
25
25
26 def setup
26 def setup
27 @ecookbook = Project.find(1)
27 @ecookbook = Project.find(1)
@@ -18,7 +18,7
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class QueryTest < Test::Unit::TestCase
20 class QueryTest < Test::Unit::TestCase
21 fixtures :projects, :enabled_modules, :users, :members, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :watchers, :custom_fields, :custom_values, :versions, :queries
21 fixtures :projects, :enabled_modules, :users, :members, :member_roles, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :watchers, :custom_fields, :custom_values, :versions, :queries
22
22
23 def test_custom_fields_for_all_projects_should_be_available_in_global_queries
23 def test_custom_fields_for_all_projects_should_be_available_in_global_queries
24 query = Query.new(:project => nil, :name => '_')
24 query = Query.new(:project => nil, :name => '_')
@@ -19,7 +19,8 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class SearchTest < Test::Unit::TestCase
20 class SearchTest < Test::Unit::TestCase
21 fixtures :users,
21 fixtures :users,
22 :members,
22 :members,
23 :member_roles,
23 :projects,
24 :projects,
24 :roles,
25 :roles,
25 :enabled_modules,
26 :enabled_modules,
@@ -18,7 +18,7
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class UserTest < Test::Unit::TestCase
20 class UserTest < Test::Unit::TestCase
21 fixtures :users, :members, :projects
21 fixtures :users, :members, :projects, :roles, :member_roles
22
22
23 def setup
23 def setup
24 @admin = User.find(1)
24 @admin = User.find(1)
@@ -130,14 +130,14 class UserTest < Test::Unit::TestCase
130 assert_equal key, @jsmith.rss_key
130 assert_equal key, @jsmith.rss_key
131 end
131 end
132
132
133 def test_role_for_project
133 def test_roles_for_project
134 # user with a role
134 # user with a role
135 role = @jsmith.role_for_project(Project.find(1))
135 roles = @jsmith.roles_for_project(Project.find(1))
136 assert_kind_of Role, role
136 assert_kind_of Role, roles.first
137 assert_equal "Manager", role.name
137 assert_equal "Manager", roles.first.name
138
138
139 # user with no role
139 # user with no role
140 assert !@dlopper.role_for_project(Project.find(2)).member?
140 assert_nil @dlopper.roles_for_project(Project.find(2)).detect {|role| role.member?}
141 end
141 end
142
142
143 def test_mail_notification_all
143 def test_mail_notification_all
General Comments 0
You need to be logged in to leave comments. Login now