From 17b51105dce70f1854f884ec698efdd0b1bd9892 Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Wed, 16 Jul 2014 15:09:00 -0300 Subject: [PATCH] proposals_discussion: a plugin to promote a debate over ideas proposed by users --- plugins/proposals_discussion/lib/proposals_discussion_plugin.rb | 36 ++++++++++++++++++++++++++++++++++++ plugins/proposals_discussion/lib/proposals_discussion_plugin/discussion.rb | 18 ++++++++++++++++++ plugins/proposals_discussion/lib/proposals_discussion_plugin/proposal.rb | 13 +++++++++++++ plugins/proposals_discussion/public/images/comments.gif | Bin 0 -> 1700 bytes plugins/proposals_discussion/public/style.css | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/proposals_discussion/test/test_helper.rb | 1 + plugins/proposals_discussion/test/unit/proposal_test.rb | 22 ++++++++++++++++++++++ plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/proposals_discussion/views/cms/proposals_discussion_plugin/_proposal.html.erb | 28 ++++++++++++++++++++++++++++ plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb | 16 ++++++++++++++++ plugins/proposals_discussion/views/content_viewer/discussion.html.erb | 12 ++++++++++++ 11 files changed, 296 insertions(+), 0 deletions(-) create mode 100644 plugins/proposals_discussion/lib/proposals_discussion_plugin.rb create mode 100644 plugins/proposals_discussion/lib/proposals_discussion_plugin/discussion.rb create mode 100644 plugins/proposals_discussion/lib/proposals_discussion_plugin/proposal.rb create mode 100644 plugins/proposals_discussion/public/images/comments.gif create mode 100644 plugins/proposals_discussion/public/style.css create mode 100644 plugins/proposals_discussion/test/test_helper.rb create mode 100644 plugins/proposals_discussion/test/unit/proposal_test.rb create mode 100644 plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb create mode 100644 plugins/proposals_discussion/views/cms/proposals_discussion_plugin/_proposal.html.erb create mode 100644 plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb create mode 100644 plugins/proposals_discussion/views/content_viewer/discussion.html.erb diff --git a/plugins/proposals_discussion/lib/proposals_discussion_plugin.rb b/plugins/proposals_discussion/lib/proposals_discussion_plugin.rb new file mode 100644 index 0000000..6b2c097 --- /dev/null +++ b/plugins/proposals_discussion/lib/proposals_discussion_plugin.rb @@ -0,0 +1,36 @@ +class ProposalsDiscussionPlugin < Noosfero::Plugin + + def self.plugin_name + 'Discussion of Proposals' + end + + def self.plugin_description + _("Provide a structured way to promove a discussion over ideas proposed by users.") + end + + def stylesheet? + true + end + + def content_types + if context.respond_to?(:params) && context.params + types = [] + parent_id = context.params[:parent_id] + parent = parent_id ? context.profile.articles.find(parent_id) : nil + types << ProposalsDiscussionPlugin::Discussion unless parent + types << ProposalsDiscussionPlugin::Proposal if parent.kind_of?(ProposalsDiscussionPlugin::Discussion) + types + else + [ProposalsDiscussionPlugin::Discussion, ProposalsDiscussionPlugin::Proposal] + end + end + + def content_remove_new(page) + page.kind_of?(ProposalsDiscussionPlugin::Discussion) || page.kind_of?(ProposalsDiscussionPlugin::Proposal) + end + + def content_remove_upload(page) + page.kind_of?(ProposalsDiscussionPlugin::Discussion) || page.kind_of?(ProposalsDiscussionPlugin::Proposal) + end + +end diff --git a/plugins/proposals_discussion/lib/proposals_discussion_plugin/discussion.rb b/plugins/proposals_discussion/lib/proposals_discussion_plugin/discussion.rb new file mode 100644 index 0000000..daeb514 --- /dev/null +++ b/plugins/proposals_discussion/lib/proposals_discussion_plugin/discussion.rb @@ -0,0 +1,18 @@ +class ProposalsDiscussionPlugin::Discussion < Folder + + def self.short_description + _("Discussion") + end + + def self.description + _('Container for proposals.') + end + + def to_html(options = {}) + discussion = self + proc do + render :file => 'content_viewer/discussion', :locals => {:discussion => discussion} + end + end + +end diff --git a/plugins/proposals_discussion/lib/proposals_discussion_plugin/proposal.rb b/plugins/proposals_discussion/lib/proposals_discussion_plugin/proposal.rb new file mode 100644 index 0000000..3863246 --- /dev/null +++ b/plugins/proposals_discussion/lib/proposals_discussion_plugin/proposal.rb @@ -0,0 +1,13 @@ +class ProposalsDiscussionPlugin::Proposal < TinyMceArticle + + def self.short_description + _("Proposal") + end + + def self.description + _('Proposal') + end + + validates_presence_of :abstract + +end diff --git a/plugins/proposals_discussion/public/images/comments.gif b/plugins/proposals_discussion/public/images/comments.gif new file mode 100644 index 0000000..e3982a9 Binary files /dev/null and b/plugins/proposals_discussion/public/images/comments.gif differ diff --git a/plugins/proposals_discussion/public/style.css b/plugins/proposals_discussion/public/style.css new file mode 100644 index 0000000..1d2d44f --- /dev/null +++ b/plugins/proposals_discussion/public/style.css @@ -0,0 +1,80 @@ +.proposal { + background: rgb(236, 236, 236); + width: 31%; + min-width: 272px; + display: inline-block; + vertical-align: top; + margin: 5px 13px 5px 0; + box-shadow: 5px 5px 5px -2px #ddd; +} + +.proposal:hover { + background: rgb(223, 223, 223); +} + +.proposal .title { + background: rgba(0, 0, 0, 0.1); + font-weight: bold; + font-size: 15px; +} + +#article .proposal a:visited, #article .proposal a { + color: rgb(94, 94, 94); + text-decoration: none; + width: 100%; + display: inline-block; +} + +#article .proposal .title { + padding: 0px 5px; +} + +#article .proposal .title a { + padding: 8px 0px; +} + +.proposal .content { + padding: 5px; + color: rgb(83, 83, 83); +} + +.proposal .abstract { + padding-top: 8px; +} + +.proposal .info { + float: left; +} + +.proposal .info .comments { + background: url('/plugins/proposals_discussion/images/comments.gif') no-repeat left/15px; + padding-left: 18px; + display: inline; + font-size: 10px; + color: rgb(82, 82, 82); + opacity: 0.6; +} + +.proposal .actions { + float: right; +} + +.proposal .actions .vote-actions { + position: static; +} + +.proposal .actions .vote-actions .vote-action a { + opacity: 0.6; +} + +form .proposals-discussion-plugin textarea { + width: 98%; +} + +form .proposals-discussion-plugin .abstract textarea { + height: 60px; +} + +form .proposals-discussion-plugin .body textarea { + height: 400px; +} diff --git a/plugins/proposals_discussion/test/test_helper.rb b/plugins/proposals_discussion/test/test_helper.rb new file mode 100644 index 0000000..cca1fd3 --- /dev/null +++ b/plugins/proposals_discussion/test/test_helper.rb @@ -0,0 +1 @@ +require File.dirname(__FILE__) + '/../../../test/test_helper' diff --git a/plugins/proposals_discussion/test/unit/proposal_test.rb b/plugins/proposals_discussion/test/unit/proposal_test.rb new file mode 100644 index 0000000..aa093ca --- /dev/null +++ b/plugins/proposals_discussion/test/unit/proposal_test.rb @@ -0,0 +1,22 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ProposalsDiscussionPluginTest < ActiveSupport::TestCase + + def setup + @profile = fast_create(Community) + @proposal = ProposalsDiscussionPlugin::Proposal.new(:name => 'test', :profile => @profile) + end + + attr_reader :profile, :proposal + + should 'save a proposal' do + proposal.abstract = 'abstract' + assert proposal.save + end + + should 'do not save a proposal without abstract' do + proposal.save + assert proposal.errors['abstract'].present? + end + +end diff --git a/plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb b/plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb new file mode 100644 index 0000000..2c69cdc --- /dev/null +++ b/plugins/proposals_discussion/test/unit/proposals_discussion_plugin_test.rb @@ -0,0 +1,70 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ProposalsDiscussionPluginTest < ActiveSupport::TestCase + + def setup + @plugin = ProposalsDiscussionPlugin.new + @profile = fast_create(Community) + @params = {} + @plugin.stubs(:context).returns(self) + end + + attr_reader :plugin, :profile, :params + + should 'has stylesheet' do + assert @plugin.stylesheet? + end + + should 'return Discussion as a content type' do + @params[:parent_id] = nil + assert_includes plugin.content_types, ProposalsDiscussionPlugin::Discussion + end + + should 'do not return Discussion as a content type if it has a parent' do + parent = fast_create(Folder, :profile_id => @profile.id) + @params[:parent_id] = parent.id + assert_not_includes plugin.content_types, ProposalsDiscussionPlugin::Discussion + end + + should 'return Proposal as a content type if parent is a Discussion' do + parent = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) + @params[:parent_id] = parent.id + assert_includes plugin.content_types, ProposalsDiscussionPlugin::Proposal + end + + should 'do not return Proposal as a content type if parent is nil' do + @params[:parent_id] = nil + assert_not_includes plugin.content_types, ProposalsDiscussionPlugin::Proposal + end + + should 'remove new button from content page for a discussion' do + page = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) + assert plugin.content_remove_new(page) + end + + should 'remove upload button from content page for a discussion' do + page = fast_create(ProposalsDiscussionPlugin::Discussion, :profile_id => @profile.id) + assert plugin.content_remove_upload(page) + end + + should 'remove new button from content page for a proposal' do + page = fast_create(ProposalsDiscussionPlugin::Proposal, :profile_id => @profile.id) + assert plugin.content_remove_new(page) + end + + should 'remove upload button from content page for a proposal' do + page = fast_create(ProposalsDiscussionPlugin::Proposal, :profile_id => @profile.id) + assert plugin.content_remove_upload(page) + end + + should 'do not remove new button from content page for others article types' do + page = fast_create(Article, :profile_id => @profile.id) + assert !plugin.content_remove_new(page) + end + + should 'do not remove upload button from content page for others article types' do + page = fast_create(Article, :profile_id => @profile.id) + assert !plugin.content_remove_upload(page) + end + +end diff --git a/plugins/proposals_discussion/views/cms/proposals_discussion_plugin/_proposal.html.erb b/plugins/proposals_discussion/views/cms/proposals_discussion_plugin/_proposal.html.erb new file mode 100644 index 0000000..74b5124 --- /dev/null +++ b/plugins/proposals_discussion/views/cms/proposals_discussion_plugin/_proposal.html.erb @@ -0,0 +1,28 @@ +<%= required_fields_message %> + +<%= render :file => 'shared/tiny_mce' %> + +<% title_limit = 70 %> +<% abstract_limit = 140 %> + +
+
+ <%= required labelled_form_field _('Title'), limited_text_area(:article, :name, title_limit, 'title_textarea', :rows => 1) %> +
+ +
+ <%= required labelled_form_field _('Abstract'), limited_text_area(:article, :abstract, abstract_limit, 'abstract_textarea') %> +
+ +
+ <% editor_type = 'mceEditor' %> + <%= labelled_form_field(_('Text'), text_area(:article, :body, :class => editor_type)) %> +
+
+ + diff --git a/plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb b/plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb new file mode 100644 index 0000000..9f05d64 --- /dev/null +++ b/plugins/proposals_discussion/views/content_viewer/_proposal_card.html.erb @@ -0,0 +1,16 @@ +
+
+ <%= link_to proposal_card.name, proposal_card.view_url %> +
+
+
+
<%= proposal_card.comments_count %>
+
+
+ <%= @plugins.dispatch(:article_header_extra_contents, proposal_card).collect { |content| instance_exec(&content) }.join("") %> +
+
+ <%= link_to strip_tags(proposal_card.lead), proposal_card.view_url %> +
+
+
diff --git a/plugins/proposals_discussion/views/content_viewer/discussion.html.erb b/plugins/proposals_discussion/views/content_viewer/discussion.html.erb new file mode 100644 index 0000000..ac3787a --- /dev/null +++ b/plugins/proposals_discussion/views/content_viewer/discussion.html.erb @@ -0,0 +1,12 @@ +
+ <%= @page.body %> +
+ +<%= link_to url_for({:controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => @page.id}), :class => 'button with-text icon-add' do %> + <%= _("New Proposal") %> +<% end %> + +
+ <%= render :partial => 'content_viewer/proposal_card', :collection => discussion.children %> +
+
-- libgit2 0.21.2