diff --git a/lib/proposals_discussion_plugin.rb b/lib/proposals_discussion_plugin.rb index 0cf4b8d..bc6e45e 100644 --- a/lib/proposals_discussion_plugin.rb +++ b/lib/proposals_discussion_plugin.rb @@ -48,4 +48,8 @@ class ProposalsDiscussionPlugin < Noosfero::Plugin ['jquery.jscroll.min.js', 'jquery.masonry.min.js', 'flotr2.min.js'] end + def self.api_mount_points + [ProposalsDiscussionPlugin::API] + end + end diff --git a/lib/proposals_discussion_plugin/api.rb b/lib/proposals_discussion_plugin/api.rb new file mode 100644 index 0000000..188177c --- /dev/null +++ b/lib/proposals_discussion_plugin/api.rb @@ -0,0 +1,20 @@ +class ProposalsDiscussionPlugin::API < Grape::API + + resource :proposals_discussion_plugin do + + get ':id/ranking' do + article = find_article(environment.articles, params[:id]) + proposals = article.proposals.map do |proposal| + effective_support = (proposal.votes_for - proposal.votes_against)/proposal.hits.to_f + effective_participation = (proposal.votes_for + proposal.votes_against)/proposal.hits.to_f + + {:id => proposal.id, :abstract => proposal.abstract, :votes_for => proposal.votes_for, :votes_against => proposal.votes_against, :effective_support => effective_support, :effective_participation => effective_participation} + end + + proposals = proposals.sort_by { |p| p[:effective_support] }.reverse + {:proposals => proposals, :updated_at => DateTime.now} + end + + end + +end diff --git a/lib/proposals_discussion_plugin/proposals_holder.rb b/lib/proposals_discussion_plugin/proposals_holder.rb index fe798bb..0d60b27 100644 --- a/lib/proposals_discussion_plugin/proposals_holder.rb +++ b/lib/proposals_discussion_plugin/proposals_holder.rb @@ -1,5 +1,8 @@ class ProposalsDiscussionPlugin::ProposalsHolder < Folder + has_many :proposals, :class_name => 'ProposalsDiscussionPlugin::Proposal', :foreign_key => 'parent_id' + has_many :proposals_authors, :class_name => 'Person', :through => :children, :source => :created_by + def accept_comments? accept_comments end diff --git a/lib/proposals_discussion_plugin/topic.rb b/lib/proposals_discussion_plugin/topic.rb index 81956a1..f2157c4 100644 --- a/lib/proposals_discussion_plugin/topic.rb +++ b/lib/proposals_discussion_plugin/topic.rb @@ -2,9 +2,7 @@ class ProposalsDiscussionPlugin::Topic < ProposalsDiscussionPlugin::ProposalsHo alias :discussion :parent - has_many :proposals, :class_name => 'ProposalsDiscussionPlugin::Proposal', :foreign_key => 'parent_id' has_many :proposals_comments, :class_name => 'Comment', :through => :children, :source => :comments - has_many :proposals_authors, :class_name => 'Person', :through => :children, :source => :created_by settings_items :color, :type => :string diff --git a/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb b/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb index b57db7b..42e7ce3 100644 --- a/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb +++ b/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb @@ -4,8 +4,8 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC def setup @profile = fast_create(Community) - @discussion = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) - @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) + @discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => @profile, :name => "Discussion") + @topic = ProposalsDiscussionPlugin::Topic.create!(:parent => @discussion, :profile => @profile, :name => 'Topic') @person = create_user_with_permission('testinguser', 'post_content') login_as :testinguser end @@ -28,6 +28,13 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC assert_redirected_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => topic.id end + should 'new_proposal with moderated discussion redirect to suggest action in cms controller' do + discussion.moderate_proposals = true + discussion.save! + get :new_proposal, :profile => profile.identifier,:parent_id => topic.id, :discussion_id => discussion.id + assert_match /suggest_an_article/, @response.location.inspect + end + should 'publish a proposal' do proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id, :profile_id => profile.id, :published => false, :created_by_id => person.id) get :publish_proposal, :proposal_id => proposal.id, :profile => profile.identifier diff --git a/test/unit/api_test.rb b/test/unit/api_test.rb new file mode 100644 index 0000000..9efcce7 --- /dev/null +++ b/test/unit/api_test.rb @@ -0,0 +1,37 @@ +require_relative '../test_helper' +require_relative '../../../../test/unit/api/test_helper' + +class APITest < ActiveSupport::TestCase + + def setup + login_api + end + + should 'return proposal ranking' do + begin + Environment.default.enable_plugin(VotePlugin) + rescue + puts 'VotePlugin not enabled' + return + end + + discussion = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => user.person.id) + topic = fast_create(ProposalsDiscussionPlugin::Topic, :profile_id => user.person.id, :parent_id => discussion.id) + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :profile_id => user.person.id, :parent_id => topic.id) + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :profile_id => user.person.id, :parent_id => topic.id) + proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :profile_id => user.person.id, :parent_id => topic.id) + + proposal2.update_attribute(:hits, 10) + 10.times { Vote.create!(:voteable => proposal2, :voter => nil, :vote => 1) } + + proposal3.update_attribute(:hits, 10) + 2.times { Vote.create!(:voteable => proposal3, :voter => nil, :vote => 1) } + + proposal1.update_attribute(:hits, 5) + + get "/api/v1/proposals_discussion_plugin/#{topic.id}/ranking?#{params.to_query}" + json = JSON.parse(last_response.body) + assert_equal [proposal2.id, proposal3.id, proposal1.id], json['proposals'].map {|p| p['id']} + end + +end -- libgit2 0.21.2