Commit be9074f5b1e7d0b07a0f569e587edbb458677e5d
1 parent
cdfd3ecb
Exists in
master
and in
9 other branches
proposals_discussion: add api method that return proposal ranking
Showing
6 changed files
with
73 additions
and
4 deletions
Show diff stats
lib/proposals_discussion_plugin.rb
... | ... | @@ -0,0 +1,20 @@ |
1 | +class ProposalsDiscussionPlugin::API < Grape::API | |
2 | + | |
3 | + resource :proposals_discussion_plugin do | |
4 | + | |
5 | + get ':id/ranking' do | |
6 | + article = find_article(environment.articles, params[:id]) | |
7 | + proposals = article.proposals.map do |proposal| | |
8 | + effective_support = (proposal.votes_for - proposal.votes_against)/proposal.hits.to_f | |
9 | + effective_participation = (proposal.votes_for + proposal.votes_against)/proposal.hits.to_f | |
10 | + | |
11 | + {:id => proposal.id, :abstract => proposal.abstract, :votes_for => proposal.votes_for, :votes_against => proposal.votes_against, :effective_support => effective_support, :effective_participation => effective_participation} | |
12 | + end | |
13 | + | |
14 | + proposals = proposals.sort_by { |p| p[:effective_support] }.reverse | |
15 | + {:proposals => proposals, :updated_at => DateTime.now} | |
16 | + end | |
17 | + | |
18 | + end | |
19 | + | |
20 | +end | ... | ... |
lib/proposals_discussion_plugin/proposals_holder.rb
1 | 1 | class ProposalsDiscussionPlugin::ProposalsHolder < Folder |
2 | 2 | |
3 | + has_many :proposals, :class_name => 'ProposalsDiscussionPlugin::Proposal', :foreign_key => 'parent_id' | |
4 | + has_many :proposals_authors, :class_name => 'Person', :through => :children, :source => :created_by | |
5 | + | |
3 | 6 | def accept_comments? |
4 | 7 | accept_comments |
5 | 8 | end | ... | ... |
lib/proposals_discussion_plugin/topic.rb
... | ... | @@ -2,9 +2,7 @@ class ProposalsDiscussionPlugin::Topic < ProposalsDiscussionPlugin::ProposalsHo |
2 | 2 | |
3 | 3 | alias :discussion :parent |
4 | 4 | |
5 | - has_many :proposals, :class_name => 'ProposalsDiscussionPlugin::Proposal', :foreign_key => 'parent_id' | |
6 | 5 | has_many :proposals_comments, :class_name => 'Comment', :through => :children, :source => :comments |
7 | - has_many :proposals_authors, :class_name => 'Person', :through => :children, :source => :created_by | |
8 | 6 | |
9 | 7 | settings_items :color, :type => :string |
10 | 8 | ... | ... |
test/functional/proposals_discussion_plugin_myprofile_controller_test.rb
... | ... | @@ -4,8 +4,8 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC |
4 | 4 | |
5 | 5 | def setup |
6 | 6 | @profile = fast_create(Community) |
7 | - @discussion = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) | |
8 | - @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) | |
7 | + @discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => @profile, :name => "Discussion") | |
8 | + @topic = ProposalsDiscussionPlugin::Topic.create!(:parent => @discussion, :profile => @profile, :name => 'Topic') | |
9 | 9 | @person = create_user_with_permission('testinguser', 'post_content') |
10 | 10 | login_as :testinguser |
11 | 11 | end |
... | ... | @@ -28,6 +28,13 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC |
28 | 28 | assert_redirected_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => topic.id |
29 | 29 | end |
30 | 30 | |
31 | + should 'new_proposal with moderated discussion redirect to suggest action in cms controller' do | |
32 | + discussion.moderate_proposals = true | |
33 | + discussion.save! | |
34 | + get :new_proposal, :profile => profile.identifier,:parent_id => topic.id, :discussion_id => discussion.id | |
35 | + assert_match /suggest_an_article/, @response.location.inspect | |
36 | + end | |
37 | + | |
31 | 38 | should 'publish a proposal' do |
32 | 39 | proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :profile_id => profile.id, :published => false, :created_by_id => person.id) |
33 | 40 | get :publish_proposal, :proposal_id => proposal.id, :profile => profile.identifier | ... | ... |
... | ... | @@ -0,0 +1,37 @@ |
1 | +require_relative '../test_helper' | |
2 | +require_relative '../../../../test/unit/api/test_helper' | |
3 | + | |
4 | +class APITest < ActiveSupport::TestCase | |
5 | + | |
6 | + def setup | |
7 | + login_api | |
8 | + end | |
9 | + | |
10 | + should 'return proposal ranking' do | |
11 | + begin | |
12 | + Environment.default.enable_plugin(VotePlugin) | |
13 | + rescue | |
14 | + puts 'VotePlugin not enabled' | |
15 | + return | |
16 | + end | |
17 | + | |
18 | + discussion = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => user.person.id) | |
19 | + topic = fast_create(ProposalsDiscussionPlugin::Topic, :profile_id => user.person.id, :parent_id => discussion.id) | |
20 | + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :profile_id => user.person.id, :parent_id => topic.id) | |
21 | + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :profile_id => user.person.id, :parent_id => topic.id) | |
22 | + proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :profile_id => user.person.id, :parent_id => topic.id) | |
23 | + | |
24 | + proposal2.update_attribute(:hits, 10) | |
25 | + 10.times { Vote.create!(:voteable => proposal2, :voter => nil, :vote => 1) } | |
26 | + | |
27 | + proposal3.update_attribute(:hits, 10) | |
28 | + 2.times { Vote.create!(:voteable => proposal3, :voter => nil, :vote => 1) } | |
29 | + | |
30 | + proposal1.update_attribute(:hits, 5) | |
31 | + | |
32 | + get "/api/v1/proposals_discussion_plugin/#{topic.id}/ranking?#{params.to_query}" | |
33 | + json = JSON.parse(last_response.body) | |
34 | + assert_equal [proposal2.id, proposal3.id, proposal1.id], json['proposals'].map {|p| p['id']} | |
35 | + end | |
36 | + | |
37 | +end | ... | ... |