@@ -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 |
|
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 |
|
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 => ' |
|
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 => ' |
|
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 => ' |
|
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 => ' |
|
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 |
# |
|
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 |
|
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 |
|
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 |
|
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. |
|
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><%= |
|
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}, |
|
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 |
|
|
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 |
|
|
39 | </td> | |
33 |
|
|
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? || |
|
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 |
|
|
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 |
< |
|
45 | <fieldset><legend><%=l(:label_project_new)%></legend> | |
33 |
<% |
|
46 | <% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user }) do %> | |
34 |
<%= select_tag 'membership[project_id]', options_for_membership_project_select(@user, |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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