Commit 67d9cf1a850407fa7bdfacc6f3658b24c70125ce
Committed by
Antonio Terceiro
1 parent
f386c3a4
Exists in
master
and in
28 other branches
ActionItem1221: created permission for publish articles
members can create articles an edit/delete them without being able to edit/delete others' members articles
Showing
5 changed files
with
99 additions
and
7 deletions
Show diff stats
app/controllers/my_profile/cms_controller.rb
1 | class CmsController < MyProfileController | 1 | class CmsController < MyProfileController |
2 | 2 | ||
3 | - protect 'post_content', :profile, :except => [:set_home_page] | ||
4 | protect 'edit_profile', :profile, :only => [:set_home_page] | 3 | protect 'edit_profile', :profile, :only => [:set_home_page] |
5 | 4 | ||
5 | + def self.protect_if(*args) | ||
6 | + before_filter(*args) do |c| | ||
7 | + user, profile = c.send(:user), c.send(:profile) | ||
8 | + if yield(c, user, profile) | ||
9 | + true | ||
10 | + else | ||
11 | + render_access_denied(c) | ||
12 | + false | ||
13 | + end | ||
14 | + end | ||
15 | + end | ||
16 | + | ||
17 | + protect_if :except => [:set_home_page, :edit, :destroy, :publish] do |c, user, profile| | ||
18 | + user && (user.has_permission?('post_content', profile) || user.has_permission?('publish_content', profile)) | ||
19 | + end | ||
20 | + | ||
21 | + protect_if :only => [:edit, :destroy, :publish] do |c, user, profile| | ||
22 | + profile.articles.find(c.params[:id]).allow_post_content?(user) | ||
23 | + end | ||
24 | + | ||
6 | alias :check_ssl_orig :check_ssl | 25 | alias :check_ssl_orig :check_ssl |
7 | # Redefines the SSL checking to avoid requiring SSL when creating the "New | 26 | # Redefines the SSL checking to avoid requiring SSL when creating the "New |
8 | # publication" button on article's public view. | 27 | # publication" button on article's public view. |
app/models/article.rb
@@ -214,11 +214,8 @@ class Article < ActiveRecord::Base | @@ -214,11 +214,8 @@ class Article < ActiveRecord::Base | ||
214 | end | 214 | end |
215 | end | 215 | end |
216 | 216 | ||
217 | - def allow_post_content?(logged_person = nil) | ||
218 | - if logged_person && logged_person.has_permission?('post_content', profile) | ||
219 | - return true | ||
220 | - end | ||
221 | - false | 217 | + def allow_post_content?(user = nil) |
218 | + user && (user.has_permission?('post_content', profile) || user.has_permission?('publish_content', profile) && (user == self.creator)) | ||
222 | end | 219 | end |
223 | 220 | ||
224 | def comments_updated | 221 | def comments_updated |
@@ -291,6 +288,11 @@ class Article < ActiveRecord::Base | @@ -291,6 +288,11 @@ class Article < ActiveRecord::Base | ||
291 | self.find(:all, :include => :taggings, :conditions => ['taggings.tag_id = ?', tag.id]) | 288 | self.find(:all, :include => :taggings, :conditions => ['taggings.tag_id = ?', tag.id]) |
292 | end | 289 | end |
293 | 290 | ||
291 | + def creator | ||
292 | + creator_id = versions[0][:last_changed_by_id] | ||
293 | + creator_id && Profile.find(creator_id) | ||
294 | + end | ||
295 | + | ||
294 | private | 296 | private |
295 | 297 | ||
296 | def sanitize_tag_list | 298 | def sanitize_tag_list |
app/models/profile.rb
@@ -33,7 +33,7 @@ class Profile < ActiveRecord::Base | @@ -33,7 +33,7 @@ class Profile < ActiveRecord::Base | ||
33 | 'edit_profile' => N_('Edit profile'), | 33 | 'edit_profile' => N_('Edit profile'), |
34 | 'destroy_profile' => N_('Destroy profile'), | 34 | 'destroy_profile' => N_('Destroy profile'), |
35 | 'manage_memberships' => N_('Manage memberships'), | 35 | 'manage_memberships' => N_('Manage memberships'), |
36 | - 'post_content' => N_('Post content'), | 36 | + 'post_content' => N_('Manage content'), # changed only presentation name to keep already given permissions |
37 | 'edit_profile_design' => N_('Edit profile design'), | 37 | 'edit_profile_design' => N_('Edit profile design'), |
38 | 'manage_products' => N_('Manage products'), | 38 | 'manage_products' => N_('Manage products'), |
39 | 'manage_friends' => N_('Manage friends'), | 39 | 'manage_friends' => N_('Manage friends'), |
@@ -42,6 +42,7 @@ class Profile < ActiveRecord::Base | @@ -42,6 +42,7 @@ class Profile < ActiveRecord::Base | ||
42 | 'moderate_comments' => N_('Moderate comments'), | 42 | 'moderate_comments' => N_('Moderate comments'), |
43 | 'edit_appearance' => N_('Edit appearance'), | 43 | 'edit_appearance' => N_('Edit appearance'), |
44 | 'view_private_content' => N_('View private content'), | 44 | 'view_private_content' => N_('View private content'), |
45 | + 'publish_content' => N_('Publish content'), | ||
45 | } | 46 | } |
46 | 47 | ||
47 | acts_as_accessible | 48 | acts_as_accessible |
test/functional/cms_controller_test.rb
@@ -1148,4 +1148,58 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -1148,4 +1148,58 @@ class CmsControllerTest < Test::Unit::TestCase | ||
1148 | assert_not_includes assigns(:article_types).map{|at|at[:name]}, 'Event' | 1148 | assert_not_includes assigns(:article_types).map{|at|at[:name]}, 'Event' |
1149 | end | 1149 | end |
1150 | 1150 | ||
1151 | + should 'not allow user without permission create an article in community' do | ||
1152 | + c = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
1153 | + u = create_user_with_permission('test_user', 'bogus_permission', c) | ||
1154 | + login_as :test_user | ||
1155 | + | ||
1156 | + get :new, :profile => c.identifier | ||
1157 | + assert_response :forbidden | ||
1158 | + assert_template 'access_denied.rhtml' | ||
1159 | + end | ||
1160 | + | ||
1161 | + should 'allow user with permission create an article in community' do | ||
1162 | + c = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
1163 | + u = create_user_with_permission('test_user', 'publish_content', c) | ||
1164 | + login_as :test_user | ||
1165 | + | ||
1166 | + get :new, :profile => c.identifier, :type => 'TinyMceArticle' | ||
1167 | + assert_response :success | ||
1168 | + assert_template 'edit' | ||
1169 | + end | ||
1170 | + | ||
1171 | + should 'not allow user edit article if he has publish permission but is not owner' do | ||
1172 | + c = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
1173 | + u = create_user_with_permission('test_user', 'publish_content', c) | ||
1174 | + a = c.articles.create!(:name => 'test_article') | ||
1175 | + login_as :test_user | ||
1176 | + | ||
1177 | + get :edit, :profile => c.identifier, :id => a.id | ||
1178 | + assert_response :forbidden | ||
1179 | + assert_template 'access_denied.rhtml' | ||
1180 | + end | ||
1181 | + | ||
1182 | + should 'not allow user edit article if he is owner but has no publish permission' do | ||
1183 | + c = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
1184 | + u = create_user_with_permission('test_user', 'bogus_permission', c) | ||
1185 | + a = c.articles.create!(:name => 'test_article', :last_changed_by => u) | ||
1186 | + login_as :test_user | ||
1187 | + | ||
1188 | + get :edit, :profile => c.identifier, :id => a.id | ||
1189 | + assert_response :forbidden | ||
1190 | + assert_template 'access_denied.rhtml' | ||
1191 | + end | ||
1192 | + | ||
1193 | + should 'allow user edit article if he is owner and has publish permission' do | ||
1194 | + c = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
1195 | + u = create_user_with_permission('test_user', 'publish_content', c) | ||
1196 | + a = c.articles.create!(:name => 'test_article', :last_changed_by => u) | ||
1197 | + login_as :test_user | ||
1198 | + | ||
1199 | + get :edit, :profile => c.identifier, :id => a.id | ||
1200 | + | ||
1201 | + assert_response :success | ||
1202 | + assert_template 'edit' | ||
1203 | + end | ||
1204 | + | ||
1151 | end | 1205 | end |
test/unit/article_test.rb
@@ -763,4 +763,20 @@ class ArticleTest < Test::Unit::TestCase | @@ -763,4 +763,20 @@ class ArticleTest < Test::Unit::TestCase | ||
763 | assert_match(/-owner/, a.cache_key({}, c)) | 763 | assert_match(/-owner/, a.cache_key({}, c)) |
764 | end | 764 | end |
765 | 765 | ||
766 | + should 'have a creator method' do | ||
767 | + c = Community.create!(:name => 'new_comm') | ||
768 | + a = c.articles.create!(:name => 'a test article', :last_changed_by => profile) | ||
769 | + p = create_user('other_user').person | ||
770 | + a.update_attributes(:body => 'some content', :last_changed_by => p); a.save! | ||
771 | + assert_equal profile, a.creator | ||
772 | + end | ||
773 | + | ||
774 | + should 'allow creator to edit if is publisher' do | ||
775 | + c = Community.create!(:name => 'new_comm') | ||
776 | + p = create_user_with_permission('test_user', 'publish_content', c) | ||
777 | + a = c.articles.create!(:name => 'a test article', :last_changed_by => p) | ||
778 | + | ||
779 | + assert a.allow_post_content?(p) | ||
780 | + end | ||
781 | + | ||
766 | end | 782 | end |