Commit ae7086105dadbd1839f9d0dd0e2e4246a562513d
1 parent
84bc4583
Exists in
master
and in
28 other branches
ActionItem5: implemented controllers to manipulate the attribution of roles in t…
…he profiles and added some functionlity git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@546 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
23 changed files
with
311 additions
and
206 deletions
Show diff stats
app/controllers/profile_admin/enterprise_controller.rb
... | ... | @@ -1,147 +0,0 @@ |
1 | -# Manage enterprises by providing an interface to register, activate and manage them | |
2 | -class EnterpriseController < ProfileAdminController | |
3 | - | |
4 | - before_filter :logon, :my_enterprises | |
5 | - protect([:edit, :update, :activate, :destroy], 'edit_enterprise', @profile) | |
6 | - | |
7 | - # Redirects to show if there is only one action and to list otherwise | |
8 | - def index | |
9 | - if @person.enterprises.size == 1 | |
10 | - redirect_to :action => 'show', :id => @person.enterprises[0] | |
11 | - else | |
12 | - redirect_to :action => 'list' | |
13 | - end | |
14 | - @vitual_communities = Environment.find(:all) | |
15 | - @validation_entities = Organization.find(:all) | |
16 | - end | |
17 | - | |
18 | - # Lists all enterprises | |
19 | - def list | |
20 | - @enterprises = Enterprise.find(:all) - @person.enterprises | |
21 | - end | |
22 | - | |
23 | - # Show details about an enterprise | |
24 | - def show | |
25 | - @enterprise = Enterprise.find(params[:id]) | |
26 | - end | |
27 | - | |
28 | - # Make a form to the creation of an eterprise | |
29 | - def register_form | |
30 | - @enterprise = Enterprise.new() | |
31 | - @vitual_communities = Environment.find(:all) | |
32 | - @validation_entities = Organization.find(:all) | |
33 | - end | |
34 | - | |
35 | - # Saves the new created enterprise | |
36 | - def register | |
37 | - @enterprise = Enterprise.new(params[:enterprise]) | |
38 | - @enterprise.organization_info = OrganizationInfo.new(params[:organization]) | |
39 | - if @enterprise.save | |
40 | - @enterprise.people << @person | |
41 | - flash[:notice] = _('The enterprise was succesfully created, the validation entity will cotact you as soon as your enterprise is approved') | |
42 | - redirect_to :action => 'index' | |
43 | - else | |
44 | - flash[:notice] = _('Enterprise was not created') | |
45 | - @vitual_communities = Environment.find(:all) | |
46 | - @validation_entities = Organization.find(:all) | |
47 | - render :action => 'register_form' | |
48 | - end | |
49 | - end | |
50 | - | |
51 | - # Provides an interface to editing the enterprise details | |
52 | - def edit | |
53 | - @enterprise = @person.enterprises(:id => params[:id])[0] | |
54 | - @validation_entities = Organization.find(:all) - [@enterprise] | |
55 | - end | |
56 | - | |
57 | - # Saves the changes made in an enterprise | |
58 | - def update | |
59 | - @enterprise = @person.enterprises(:id => params[:id])[0] | |
60 | - if @enterprise.update_attributes(params[:enterprise]) && @enterprise.organization_info.update_attributes(params[:organization_info]) | |
61 | - redirect_to :action => 'index' | |
62 | - else | |
63 | - flash[:notice] = _('Could not update the enterprise') | |
64 | - @validation_entities = Organization.find(:all) - [@enterprise] | |
65 | - render :action => 'edit' | |
66 | - end | |
67 | - end | |
68 | - | |
69 | - # Make the current user a new member of the enterprise | |
70 | - def affiliate | |
71 | - @enterprise = Enterprise.find(params[:id]) | |
72 | - member_role = Role.find_by_name('member') || Role.create(:name => 'member') | |
73 | - @enterprise.affiliate(@person,member_role) | |
74 | - redirect_to :action => 'index' | |
75 | - end | |
76 | - | |
77 | - # Elimitates the enterprise of the system | |
78 | - def destroy | |
79 | - @enterprise = @person.enterprises(:id => params[:id])[0] | |
80 | - if @enterprise | |
81 | - @enterprise.destroy | |
82 | - else | |
83 | - flash[:notice] = 'Can destroy only your enterprises' | |
84 | - end | |
85 | - redirect_to :action => 'index' | |
86 | - end | |
87 | - | |
88 | - # Search enterprises by name or tags | |
89 | - def search | |
90 | - @tagged_enterprises = Enterprise.search(params[:query]) | |
91 | - end | |
92 | - | |
93 | - # Activate a validated enterprise | |
94 | - def activate | |
95 | - @enterprise = Enterprise.find(params[:id]) | |
96 | - if @enterprise.activate | |
97 | - flash[:notice] = _('Enterprise successfuly activacted') | |
98 | - else | |
99 | - flash[:notice] = _('Failed to activate the enterprise') | |
100 | - end | |
101 | - redirect_to :action => 'index' | |
102 | - end | |
103 | - | |
104 | - # Validates an eterprise | |
105 | - def approve | |
106 | - @enterprise = Enterprise.find(params[:id]) | |
107 | - if @enterprise.approve | |
108 | - flash[:notice] = _('Enterprise successfuly approved') | |
109 | - else | |
110 | - flash[:notice] = _('Failed to approve the htmlenterprise') | |
111 | - end | |
112 | - redirect_to :action => 'index' | |
113 | - end | |
114 | - | |
115 | - # Rejects an enterprise | |
116 | - def reject | |
117 | - @enterprise = Enterprise.find(params[:id]) | |
118 | - if @enterprise.reject | |
119 | - flash[:notice] = _('Enterprise successfuly rejected') | |
120 | - else | |
121 | - flash[:notice] = _('Failed to reject the enterprise') | |
122 | - end | |
123 | - redirect_to :action => 'index' | |
124 | - end | |
125 | - | |
126 | - | |
127 | - protected | |
128 | - | |
129 | - # Make sure that the user is logged before access this controller | |
130 | - def logon | |
131 | - if logged_in? | |
132 | - @user = current_user | |
133 | - @person = @user.person | |
134 | - else | |
135 | - redirect_to :controller => 'account' unless logged_in? | |
136 | - end | |
137 | - end | |
138 | - | |
139 | - # Initializes some variables to contain the enterprises of the current user | |
140 | - def my_enterprises | |
141 | - if logged_in? | |
142 | - @my_active_enterprises = @person.active_enterprises | |
143 | - @my_pending_enterprises = @person.pending_enterprises | |
144 | - @my_enterprises = @person.enterprises | |
145 | - end | |
146 | - end | |
147 | -end |
app/controllers/profile_admin/enterprise_editor_controller.rb
0 → 100644
... | ... | @@ -0,0 +1,67 @@ |
1 | +class EnterpriseEditorController < ProfileAdminController | |
2 | + | |
3 | + before_filter :logon, :check_enterprise | |
4 | + | |
5 | + # Show details about an enterprise | |
6 | + def index | |
7 | + @my_enterprises = @person.enterprises | |
8 | + @my_pending_enterprises = @person.pending_enterprises | |
9 | + end | |
10 | + | |
11 | + # Provides an interface to editing the enterprise details | |
12 | + def edit | |
13 | + @validation_entities = Organization.find(:all) - [@enterprise] | |
14 | + end | |
15 | + | |
16 | + # Saves the changes made in an enterprise | |
17 | + def update | |
18 | + if @enterprise.update_attributes(params[:enterprise]) && @enterprise.organization_info.update_attributes(params[:organization_info]) | |
19 | + redirect_to :action => 'index' | |
20 | + else | |
21 | + flash[:notice] = _('Could not update the enterprise') | |
22 | + @validation_entities = Organization.find(:all) - [@enterprise] | |
23 | + render :action => 'edit' | |
24 | + end | |
25 | + end | |
26 | + | |
27 | + # Make the current user a new member of the enterprise | |
28 | + def affiliate | |
29 | + member_role = Role.find_by_name('member') || Role.create(:name => 'member') | |
30 | + @enterprise.affiliate(@person,member_role) | |
31 | + redirect_to :action => 'index' | |
32 | + end | |
33 | + | |
34 | + # Elimitates the enterprise of the system | |
35 | + def destroy | |
36 | + if @enterprise | |
37 | + @enterprise.destroy | |
38 | + else | |
39 | + flash[:notice] = 'Can destroy only your enterprises' | |
40 | + end | |
41 | + redirect_to :action => 'index' | |
42 | + end | |
43 | + | |
44 | + # Activate a validated enterprise | |
45 | + def activate | |
46 | + if @enterprise.activate | |
47 | + flash[:notice] = _('Enterprise successfuly activacted') | |
48 | + else | |
49 | + flash[:notice] = _('Failed to activate the enterprise') | |
50 | + end | |
51 | + redirect_to :action => 'index' | |
52 | + end | |
53 | + | |
54 | + protected | |
55 | + | |
56 | + def logon | |
57 | + if logged_in? | |
58 | + @user = current_user | |
59 | + @person = @user.person | |
60 | + end | |
61 | + end | |
62 | + | |
63 | + def check_enterprise | |
64 | + raise 'It\'s not an enterprise' unless @profile.is_a?(Enterprise) | |
65 | + @enterprise = @profile | |
66 | + end | |
67 | +end | ... | ... |
app/controllers/profile_admin/membership_editor_controller.rb
0 → 100644
app/controllers/profile_admin/profile_member_controller.rb
... | ... | @@ -1,23 +0,0 @@ |
1 | -class ProfileMemberController < ApplicationController | |
2 | - | |
3 | - def index | |
4 | - @members = @profile.people | |
5 | - end | |
6 | - | |
7 | - def affiliate | |
8 | - @member = Person.find(params[:id]) | |
9 | - @roles = Role.find(:all).select{ |r| r.has_kind?(:profile) } | |
10 | - end | |
11 | - | |
12 | - def give_role | |
13 | - @person = Person.find(params[:person]) | |
14 | - @role = Role.find(params[:role]) | |
15 | - if @profile.affiliate(@person, @role) | |
16 | - redirect_to :action => 'index' | |
17 | - else | |
18 | - @member = Person.find(params[:person]) | |
19 | - @roles = Role.find(:all).select{ |r| r.has_kind?(:profile) } | |
20 | - render :action => 'affiliate' | |
21 | - end | |
22 | - end | |
23 | -end |
app/controllers/profile_admin/profile_members_controller.rb
0 → 100644
... | ... | @@ -0,0 +1,60 @@ |
1 | +class ProfileMembersController < ProfileAdminController | |
2 | + | |
3 | + def index | |
4 | + @members = profile.people.uniq | |
5 | + end | |
6 | + | |
7 | + def change_roles | |
8 | + @member = Person.find(params[:id]) | |
9 | + @roles = Role.find(:all).select{ |r| r.has_kind?(:profile) } | |
10 | + end | |
11 | + | |
12 | + def update_roles | |
13 | + @roles = Role.find(params[:roles]) | |
14 | + @person = Person.find(params[:person]) | |
15 | + if @person.define_roles(@roles, profile) | |
16 | + flash[:notice] = 'Roles successfuly updated' | |
17 | + else | |
18 | + flash[:notice] = 'Couldn\'t change the roles' | |
19 | + end | |
20 | + redirect_to :action => :index | |
21 | + end | |
22 | + | |
23 | + def change_role | |
24 | + @roles = Role.find(:all).select{ |r| r.has_kind?(:profile) } | |
25 | + @member = Person.find(params[:id]) | |
26 | + @associations = RoleAssignment.find(:all, :conditions => {:person_id => @member, :resource_id => @profile, :resource_type => @profile.class.base_class.name}) | |
27 | + end | |
28 | + | |
29 | + def add_role | |
30 | + @person = Person.find(params[:person]) | |
31 | + @role = Role.find(params[:role]) | |
32 | + if @profile.affiliate(@person, @role) | |
33 | + redirect_to :action => 'index' | |
34 | + else | |
35 | + @member = Person.find(params[:person]) | |
36 | + @roles = Role.find(:all).select{ |r| r.has_kind?(:profile) } | |
37 | + render :action => 'affiliate' | |
38 | + end | |
39 | + end | |
40 | + | |
41 | + def remove_role | |
42 | + @association = RoleAssignment.find(params[:id]) | |
43 | + if @association.destroy | |
44 | + flash[:notice] = 'Member succefully unassociated' | |
45 | + else | |
46 | + flash[:notice] = 'Failed to unassociate member' | |
47 | + end | |
48 | + redirect_to :aciton => 'index' | |
49 | + end | |
50 | + | |
51 | + def unassociate | |
52 | + @association = RoleAssignment.find(params[:id]) | |
53 | + if @association.destroy | |
54 | + flash[:notice] = 'Member succefully unassociated' | |
55 | + else | |
56 | + flash[:notice] = 'Failed to unassociate member' | |
57 | + end | |
58 | + redirect_to :aciton => 'index' | |
59 | + end | |
60 | +end | ... | ... |
app/models/person.rb
... | ... | @@ -16,6 +16,14 @@ class Person < Profile |
16 | 16 | role_assignments.any? {|ra| ra.has_permission?(perm, res)} |
17 | 17 | end |
18 | 18 | |
19 | + def define_roles(roles, resource) | |
20 | + associations = RoleAssignment.find(:all, :conditions => {:resource_id => resource.id, :resource_type => resource.class.base_class.name, :person_id => self.id }) | |
21 | + roles_add = roles - associations.map(&:role) | |
22 | + roles_remove = associations.map(&:role) - roles | |
23 | + associations.each { |a| a.destroy if roles_remove.include?(a.role) } | |
24 | + roles_add.each {|r| RoleAssignment.create(:person_id => self.id, :resource_id => resource.id, :resource_type => resource.class.base_class.name, :role_id => r.id) } | |
25 | + end | |
26 | + | |
19 | 27 | def self.conditions_for_profiles(conditions, person) |
20 | 28 | new_conditions = sanitize_sql(['role_assignments.person_id = ?', person]) |
21 | 29 | new_conditions << ' AND ' + sanitize_sql(conditions) unless conditions.blank? | ... | ... |
... | ... | @@ -0,0 +1,17 @@ |
1 | +<li> | |
2 | +<%= link_to enterprise.name, :action => 'show', :id => enterprise %> | |
3 | +<%= link_to _('Edit'), :action => 'edit', :id => enterprise %> | |
4 | +<%= help _('Change the infomation about the enterprise') %> | |
5 | +<%= link_to _('Delete'), :action => 'destroy', :id => enterprise %> | |
6 | +<%= help _('Remove the enterprise from the system') %> | |
7 | +<%= link_to _('Affiliate'), :action => 'affiliate', :id => enterprise unless @my_enterprises.include?(enterprise) %> | |
8 | +<%= help _('Be a member of the enterprise') unless @my_enterprises.include?(enterprise) %> | |
9 | +<%= link_to _('Activate'), :action => 'activate', :id => enterprise unless enterprise.active %> | |
10 | +<%= help _('Activate the profile of an approved enterprise') unless enterprise.active %> | |
11 | +<% unless enterprise.approved? %> | |
12 | + <%= link_to _('Approve'), :action => 'approve', :id => enterprise %> | |
13 | + <%= help _('Approve a submitted enterprise profile') %> | |
14 | + <%= link_to _('Reject'), :action => 'reject', :id => enterprise %> | |
15 | + <%= help _('Reject a submitted enterprise profile') %> | |
16 | +<% end %> | |
17 | +</li> | ... | ... |
... | ... | @@ -0,0 +1,32 @@ |
1 | +<p><label for="name"><%= _('Name') %></label><br/> | |
2 | +<%= text_field 'enterprise', 'name', 'size' => 20 %></p> | |
3 | + | |
4 | +<p><label for="address"><%= _('Address') %></label><br/> | |
5 | +<%= text_field 'enterprise', 'address', 'size' => 50 %></p> | |
6 | + | |
7 | +<p><label for="contact_phone"><%= _('Contact Phone') %></label><br/> | |
8 | +<%= text_field 'enterprise', 'contact_phone', 'size' => 20 %></p> | |
9 | + | |
10 | +<p><label for="contact_person"><%= _('Contact Person') %></label><br/> | |
11 | +<%= text_field 'organization_info', 'contact_person', 'size' => 20 %></p> | |
12 | + | |
13 | +<p><label for="acronym"><%= _('Acronym') %></label><br/> | |
14 | +<%= text_field 'organization_info', 'acronym', 'size' => 20 %></p> | |
15 | + | |
16 | +<p><label for="foundation_year"><%= _('Foundation Year') %></label><br/> | |
17 | +<%= text_field 'organization_info', 'foundation_year', 'size' => 20 %></p> | |
18 | + | |
19 | +<p><label for="legal_form"><%= _('Legal Form') %></label><br/> | |
20 | +<%= text_field 'organization_info', 'legal_form', 'size' => 20 %></p> | |
21 | + | |
22 | +<p><label for="economic_activity"><%= _('Economic Activity') %></label><br/> | |
23 | +<%= text_field 'organization_info', 'economic_activity', 'size' => 20 %></p> | |
24 | + | |
25 | +<p><label for="management_information"><%= _('Management Information') %></label><br/> | |
26 | +<%= text_area 'organization_info', 'management_information', 'cols' => 40, 'rows' => 20 %></p> | |
27 | + | |
28 | +<p><label for="validation_entity"><%= _('Validation Entity') %></label><br/> | |
29 | +<%= select 'validation_entity', 'id', @validation_entities.map{|v| [v.name, v.id]}, :include_blank => true %></p> | |
30 | + | |
31 | +<p><label for="tag_list"><%= _('Tags') %></label><br/> | |
32 | +<%= text_field 'enterprise', 'tag_list', 'size' => 20 %></p> | ... | ... |
... | ... | @@ -0,0 +1,9 @@ |
1 | +<%= error_messages_for 'enterprise' %> | |
2 | + | |
3 | +<h2><%= _('Edit enterprise informations') %></h2> | |
4 | + | |
5 | +<% form_tag :action => 'update', :id => @enterprise do %> | |
6 | + <%= render :partial => 'form' %> | |
7 | +<p><%= submit_tag _('Update') %> | |
8 | +<%= link_to _('Cancel'), :action => 'index' %></p> | |
9 | +<% end %> | ... | ... |
... | ... | @@ -0,0 +1,21 @@ |
1 | +<h3> <%= @profile.name %> </h3> | |
2 | + | |
3 | +<p> <%= _('Identifier: ') %> <%= @profile.identifier %> </p> | |
4 | +<p> <%= _('Address: ') %> <%= @profile.address %> </p> | |
5 | +<p> <%= _('Contact phone: ') %> <%= @profile.contact_phone %> </p> | |
6 | +<p> <%= _('Contact person: ') %> <%= @profile.organization_info.contact_person %> </p> | |
7 | +<p> <%= _('Acronym: ') %> <%= @profile.organization_info.acronym %> </p> | |
8 | +<p> <%= _('Foundation year: ') %> <%= @profile.organization_info.foundation_year %> </p> | |
9 | +<p> <%= _('Legal Form: ') %> <%= @profile.organization_info.legal_form %> </p> | |
10 | +<p> <%= _('Economic activity: ') %> <%= @profile.organization_info.economic_activity %> </p> | |
11 | +<p> <%= _('Management infomation: ') %> <%= @profile.organization_info.management_information %> </p> | |
12 | +<p> <%= _('Tags:') %> <%= @profile.tag_list %> </p> | |
13 | + | |
14 | +<%= link_to _('Edit enterprise'), :action => 'edit', :id => @profile %> | |
15 | +<%= help _('Change the information about the enterprise') %> | |
16 | +<%= link_to _('Delete enterprise'), :action => 'destroy', :id => @profile %> | |
17 | +<%= help _('Remove the enterprise from the system') %> | |
18 | +<%= link_to _('Affiliate'), :action => 'affiliate' unless @my_enterprises.include?(@profile) %> | |
19 | +<%= help _('Be a member of the enterprise') unless @my_enterprises.include?(@profile) %> | |
20 | +<%= link_to _('Activate'), :action => 'activate', :id => @profile if @my_pending_enterprises.include?(@profile) %> | |
21 | +<%= help _('Activate an approved enterprise') if @my_pending_enterprises.include?(@profile) %> | ... | ... |
No preview for this file type
app/views/profile_member/affiliate.rhtml
... | ... | @@ -1,7 +0,0 @@ |
1 | -<h2> <%= @member.name %> </h2> | |
2 | - | |
3 | -<% form_tag( {:action => 'give_role'}, {:method => :post}) do %> | |
4 | - <%= select_tag 'role', options_for_select(@roles.map{|r|[r.name,r.id]}) %> | |
5 | - <%= hidden_field_tag 'person', current_user.person.id %> | |
6 | - <%= submit_tag _('Affiliate') %> | |
7 | -<% end %> |
app/views/profile_member/index.rhtml
test/fixtures/roles.yml
... | ... | @@ -0,0 +1,18 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | +require 'enterprise_editor_controller' | |
3 | + | |
4 | +# Re-raise errors caught by the controller. | |
5 | +class EnterpriseEditorController; def rescue_action(e) raise e end; end | |
6 | + | |
7 | +class EnterpriseEditorControllerTest < Test::Unit::TestCase | |
8 | + def setup | |
9 | + @controller = EnterpriseEditorController.new | |
10 | + @request = ActionController::TestRequest.new | |
11 | + @response = ActionController::TestResponse.new | |
12 | + end | |
13 | + | |
14 | + # Replace this with your real tests. | |
15 | + def test_truth | |
16 | + assert true | |
17 | + end | |
18 | +end | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | +require 'membership_editor_controller' | |
3 | + | |
4 | +# Re-raise errors caught by the controller. | |
5 | +class MembershipEditorController; def rescue_action(e) raise e end; end | |
6 | + | |
7 | +class MembershipEditorControllerTest < Test::Unit::TestCase | |
8 | + def setup | |
9 | + @controller = MembershipEditorController.new | |
10 | + @request = ActionController::TestRequest.new | |
11 | + @response = ActionController::TestResponse.new | |
12 | + end | |
13 | + | |
14 | + # Replace this with your real tests. | |
15 | + def test_truth | |
16 | + assert true | |
17 | + end | |
18 | +end | ... | ... |
test/functional/profile_member_controller_test.rb
... | ... | @@ -1,18 +0,0 @@ |
1 | -require File.dirname(__FILE__) + '/../test_helper' | |
2 | -require 'profile_member_controller' | |
3 | - | |
4 | -# Re-raise errors caught by the controller. | |
5 | -class ProfileMemberController; def rescue_action(e) raise e end; end | |
6 | - | |
7 | -class ProfileMemberControllerTest < Test::Unit::TestCase | |
8 | - def setup | |
9 | - @controller = ProfileMemberController.new | |
10 | - @request = ActionController::TestRequest.new | |
11 | - @response = ActionController::TestResponse.new | |
12 | - end | |
13 | - | |
14 | - # Replace this with your real tests. | |
15 | - def test_truth | |
16 | - assert true | |
17 | - end | |
18 | -end |
... | ... | @@ -0,0 +1,18 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | +require 'profile_members_controller' | |
3 | + | |
4 | +# Re-raise errors caught by the controller. | |
5 | +class ProfileMembersController; def rescue_action(e) raise e end; end | |
6 | + | |
7 | +class ProfileMembersControllerTest < Test::Unit::TestCase | |
8 | + def setup | |
9 | + @controller = ProfileMembersController.new | |
10 | + @request = ActionController::TestRequest.new | |
11 | + @response = ActionController::TestResponse.new | |
12 | + end | |
13 | + | |
14 | + # Replace this with your real tests. | |
15 | + def test_truth | |
16 | + assert true | |
17 | + end | |
18 | +end | ... | ... |
test/unit/person_test.rb
... | ... | @@ -64,4 +64,16 @@ class PersonTest < Test::Unit::TestCase |
64 | 64 | assert_equal p.person_info, p.info |
65 | 65 | end |
66 | 66 | |
67 | + should 'change the roles of the user' do | |
68 | + assert p = User.create(:login => 'jonh', :email => 'john@doe.org', :password => 'dhoe', :password_confirmation => 'dhoe').person | |
69 | + assert e = Enterprise.create(:identifier => 'enter') | |
70 | + assert r1 = Role.create(:name => 'associate') | |
71 | + assert e.affiliate(p, r1) | |
72 | + assert r2 = Role.create(:name => 'partner') | |
73 | + assert p.define_roles([r2], e) | |
74 | + p = Person.find(p.id) | |
75 | + assert p.role_assignments.any? {|ra| ra.role == r2} | |
76 | + assert !p.role_assignments.any? {|ra| ra.role == r1} | |
77 | + end | |
78 | + | |
67 | 79 | end | ... | ... |