Commit bfb524805ffc503cb4b65c7ff4def80a57cec66c
1 parent
5453c5a4
Exists in
master
and in
11 other branches
proposals_discussion: allow any users to create proposals
Also create a proposal private by default and allow the author to publish.
Showing
9 changed files
with
57 additions
and
5 deletions
Show diff stats
controllers/myprofile/proposals_discussion_plugin_myprofile_controller.rb
| 1 | 1 | class ProposalsDiscussionPluginMyprofileController < MyProfileController |
| 2 | 2 | |
| 3 | + before_filter :check_edit_permission_to_proposal, :only => :publish_proposal | |
| 4 | + | |
| 3 | 5 | def select_topic |
| 4 | 6 | @discussion = profile.articles.find(params[:parent_id]) |
| 5 | 7 | render :file => 'select_topic' |
| ... | ... | @@ -9,4 +11,20 @@ class ProposalsDiscussionPluginMyprofileController < MyProfileController |
| 9 | 11 | redirect_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => params[:discussion][:topic] |
| 10 | 12 | end |
| 11 | 13 | |
| 14 | + def publish_proposal | |
| 15 | + if @proposal.update_attribute(:published, true) | |
| 16 | + session[:notice] = _('Proposal published!') | |
| 17 | + else | |
| 18 | + session[:notice] = _('Failed to publish your proposal.') | |
| 19 | + end | |
| 20 | + redirect_to @proposal.view_url | |
| 21 | + end | |
| 22 | + | |
| 23 | + protected | |
| 24 | + | |
| 25 | + def check_edit_permission_to_proposal | |
| 26 | + @proposal = profile.articles.find(params[:proposal_id]) | |
| 27 | + render_access_denied unless @proposal.allow_edit?(user) | |
| 28 | + end | |
| 29 | + | |
| 12 | 30 | end | ... | ... |
controllers/public/proposals_discussion_plugin_public_controller.rb
| ... | ... | @@ -9,7 +9,7 @@ class ProposalsDiscussionPluginPublicController < ApplicationController |
| 9 | 9 | page = (params[:page] || 1).to_i |
| 10 | 10 | |
| 11 | 11 | set_seed |
| 12 | - proposals = holder.proposals.includes(:parent, :profile).reorder('random()') | |
| 12 | + proposals = holder.proposals.public.reorder('random()') | |
| 13 | 13 | proposals = proposals.page(page).per_page(5) |
| 14 | 14 | |
| 15 | 15 | unless proposals.empty? | ... | ... |
lib/proposals_discussion_plugin/discussion.rb
| 1 | 1 | class ProposalsDiscussionPlugin::Discussion < Folder |
| 2 | 2 | |
| 3 | - alias :topics :children | |
| 4 | - | |
| 3 | + has_many :topics, :class_name => 'ProposalsDiscussionPlugin::Topic', :foreign_key => 'parent_id' | |
| 5 | 4 | has_many :proposals, :class_name => 'ProposalsDiscussionPlugin::Proposal', :through => :children, :source => :children |
| 6 | 5 | |
| 7 | 6 | def self.short_description | ... | ... |
lib/proposals_discussion_plugin/proposal.rb
| 1 | 1 | class ProposalsDiscussionPlugin::Proposal < TinyMceArticle |
| 2 | 2 | |
| 3 | + scope :private, lambda {|user| {:conditions => {:last_changed_by_id => user.id, :published => false}}} | |
| 4 | + | |
| 3 | 5 | alias :topic :parent |
| 4 | 6 | |
| 5 | 7 | def self.short_description |
| ... | ... | @@ -19,4 +21,8 @@ class ProposalsDiscussionPlugin::Proposal < TinyMceArticle |
| 19 | 21 | end |
| 20 | 22 | end |
| 21 | 23 | |
| 24 | + def allow_edit?(user) | |
| 25 | + super || created_by == user | |
| 26 | + end | |
| 27 | + | |
| 22 | 28 | end | ... | ... |
lib/proposals_discussion_plugin/topic.rb
| 1 | 1 | class ProposalsDiscussionPlugin::Topic < Folder |
| 2 | 2 | |
| 3 | 3 | alias :discussion :parent |
| 4 | - alias :proposals :children | |
| 5 | 4 | |
| 5 | + has_many :proposals, :class_name => 'ProposalsDiscussionPlugin::Proposal', :foreign_key => 'parent_id' | |
| 6 | 6 | has_many :proposals_comments, :class_name => 'Comment', :through => :children, :source => :comments |
| 7 | 7 | has_many :proposals_authors, :class_name => 'Person', :through => :children, :source => :created_by |
| 8 | 8 | ... | ... |
public/style.css
| 1 | +.private-proposals .proposal { | |
| 2 | + background: rgb(249, 252, 193); | |
| 3 | +} | |
| 4 | + | |
| 1 | 5 | .proposal { |
| 2 | 6 | background: rgb(236, 236, 236); |
| 3 | 7 | width: 100%; |
| ... | ... | @@ -30,7 +34,7 @@ |
| 30 | 34 | } |
| 31 | 35 | |
| 32 | 36 | .proposal .content:hover, .proposal .topic:hover { |
| 33 | - background: rgb(223, 223, 223); | |
| 37 | + background: rgba(0, 0, 0, 0.1); | |
| 34 | 38 | } |
| 35 | 39 | |
| 36 | 40 | .proposal .title { | ... | ... |
views/content_viewer/_proposals_list.html.erb
| ... | ... | @@ -9,7 +9,16 @@ |
| 9 | 9 | }); |
| 10 | 10 | </script> |
| 11 | 11 | |
| 12 | +<% private_proposals = @page.proposals.private(user)%> | |
| 13 | +<% unless private_proposals.empty? %> | |
| 14 | +<div class="private-proposals"> | |
| 15 | + <h5><%= _('My private proposals') %></h5> | |
| 16 | + <%= render :partial => 'content_viewer/proposal_card', :collection => private_proposals %> | |
| 17 | +</div> | |
| 18 | +<% end %> | |
| 19 | + | |
| 12 | 20 | <div class="proposals"> |
| 21 | + <h5><%= _('Proposals') %></h5> | |
| 13 | 22 | <div class="more"> |
| 14 | 23 | <img src="/images/loading.gif" alt="Loading" /><%= _("Loading...") %> |
| 15 | 24 | <%= link_to '', url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier }) %> | ... | ... |
views/content_viewer/proposal.html.erb
| ... | ... | @@ -17,3 +17,11 @@ |
| 17 | 17 | <h5><%= _('Body') %></h4> |
| 18 | 18 | <div class="content"><%= @page.body %></div> |
| 19 | 19 | </div> |
| 20 | + | |
| 21 | +<% if @page.allow_edit?(user) && !@page.published %> | |
| 22 | +<div class="actions"> | |
| 23 | + <%= link_to url_for({:controller => 'proposals_discussion_plugin_myprofile', :action => 'publish_proposal', :proposal_id => @page.id}), :class => 'button with-text icon-add' do %> | |
| 24 | + <strong><%= _("Publish") %></strong> | |
| 25 | + <% end %> | |
| 26 | +</div> | |
| 27 | +<% end %> | ... | ... |