From 2ee90ac76e0e9ad01106ca80f9e7d59007938400 Mon Sep 17 00:00:00 2001 From: palomahnhp Date: Sun, 7 Feb 2016 22:20:59 +0100 Subject: [PATCH] share links to debate --- .../concerns/commentable_actions.rb | 6 ++- app/controllers/debate_links_controller.rb | 26 ++++++++++++ app/controllers/debates_controller.rb | 2 +- app/models/concerns/measurable.rb | 4 ++ app/models/debate.rb | 25 ++++++++++- app/views/debate_links/_form.html.erb | 42 +++++++++++++++++++ app/views/debate_links/new.html.erb | 29 +++++++++++++ app/views/debate_links/suggest.js.erb | 1 + app/views/debates/_debate.html.erb | 7 +++- app/views/debates/_form.html.erb | 16 ++++--- app/views/debates/index.html.erb | 1 + app/views/debates/show.html.erb | 8 +++- config/locales/en.yml | 12 ++++++ config/locales/es.yml | 12 ++++++ config/routes.rb | 3 ++ ...0207205252_add_external_link_to_debates.rb | 5 +++ db/schema.rb | 4 +- spec/features/debates_spec.rb | 18 ++++++++ spec/models/debate_spec.rb | 18 ++++++++ 19 files changed, 226 insertions(+), 13 deletions(-) create mode 100644 app/controllers/debate_links_controller.rb create mode 100644 app/views/debate_links/_form.html.erb create mode 100644 app/views/debate_links/new.html.erb create mode 100644 app/views/debate_links/suggest.js.erb create mode 100644 db/migrate/20160207205252_add_external_link_to_debates.rb diff --git a/app/controllers/concerns/commentable_actions.rb b/app/controllers/concerns/commentable_actions.rb index 855ad1de5..dde28e0b2 100644 --- a/app/controllers/concerns/commentable_actions.rb +++ b/app/controllers/concerns/commentable_actions.rb @@ -40,7 +40,7 @@ module CommentableActions if @resource.save_with_captcha track_event - redirect_path = url_for(controller: controller_name, action: :show, id: @resource.id) + redirect_path = after_create_path redirect_to redirect_path, notice: t("flash.actions.create.#{resource_name.underscore}") else load_categories @@ -153,4 +153,8 @@ module CommentableActions def index_customization nil end + + def after_create_path + url_for(controller: controller_name, action: :show, id: @resource.id) + end end diff --git a/app/controllers/debate_links_controller.rb b/app/controllers/debate_links_controller.rb new file mode 100644 index 000000000..3de0b9f1b --- /dev/null +++ b/app/controllers/debate_links_controller.rb @@ -0,0 +1,26 @@ +class DebateLinksController < ApplicationController + include CommentableActions + + load_and_authorize_resource class: "Debate" + + respond_to :html, :js + + private + + def create_params + params.require(:debate).permit(:title, :external_link, :tag_list, :terms_of_service, :captcha, :captcha_key) + end + + def debate_params + params.require(:debate).permit(:title, :external_link, :tag_list, :terms_of_service, :captcha, :captcha_key) + end + + def after_create_path + debate_path(@resource) + end + + def resource_model + Debate + end + +end diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index e1173f749..db291b374 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -26,7 +26,7 @@ class DebatesController < ApplicationController private def debate_params - params.require(:debate).permit(:title, :description, :tag_list, :terms_of_service, :captcha, :captcha_key) + params.require(:debate).permit(:title, :description, :external_link, :tag_list, :terms_of_service, :captcha, :captcha_key) end def resource_model diff --git a/app/models/concerns/measurable.rb b/app/models/concerns/measurable.rb index 44b7ddabb..de69cb559 100644 --- a/app/models/concerns/measurable.rb +++ b/app/models/concerns/measurable.rb @@ -6,6 +6,10 @@ module Measurable def title_max_length @@title_max_length ||= self.columns.find { |c| c.name == 'title' }.limit || 80 end + + def external_link_max_length + @@external_link_max_length ||= self.columns.find { |c| c.name == 'external_link' }.limit || 100 + end def responsible_name_max_length @@responsible_name_max_length ||= self.columns.find { |c| c.name == 'responsible_name' }.limit || 60 diff --git a/app/models/debate.rb b/app/models/debate.rb index c811b4925..fa78f8d7a 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -18,11 +18,16 @@ class Debate < ActiveRecord::Base has_many :comments, as: :commentable validates :title, presence: true - validates :description, presence: true + validates :description, presence: true, :if => :description_required? validates :author, presence: true validates :title, length: { in: 4..Debate.title_max_length } - validates :description, length: { in: 10..Debate.description_max_length } + validates :description, length: { in: 10..Debate.description_max_length }, :if => :description_required? + + validates :external_link, :presence => true, + length: { in: 10..Debate.external_link_max_length }, + format: { with: /https?:\/\/*/}, + :if => :link_required? validates :terms_of_service, acceptance: { allow_nil: false }, on: :create @@ -126,4 +131,20 @@ class Debate < ActiveRecord::Base self.tags.each{ |t| t.increment_custom_counter_for('Debate') } end + def description_required? + if self.external_link == nil + return true + else + return false + end + end + + def link_required? + if self.external_link == nil + return false + else + return true + end + end + end diff --git a/app/views/debate_links/_form.html.erb b/app/views/debate_links/_form.html.erb new file mode 100644 index 000000000..5f918674c --- /dev/null +++ b/app/views/debate_links/_form.html.erb @@ -0,0 +1,42 @@ +<%= form_for @debate,url: debate_links_path, :method => :post do |f| %> + <%= render 'shared/errors', resource: @debate %> +
+
+ <%= f.label :title, t("debates.form.debate_title") %> + <%= f.text_field :title, maxlength: Debate.title_max_length, placeholder: t("debates.form.debate_title"), label: false, data: {js_suggest_result: "js_suggest_result", js_suggest: "#js-suggest", js_url: suggest_debates_path}%> +
+
+
+ <%= f.label :external_link, t("debate_links.form.debate_link") %> + <%= f.text_field :external_link, maxlength: Debate.title_max_length, placeholder: t("debate_links.form.debate_link"), label: false %> +
+
+ <%= f.label :tag_list, t("debates.form.tags_label") %> +

<%= t("debates.form.tags_instructions") %>

+ + <%= f.text_field :tag_list, value: @debate.tag_list.to_s, + label: false, + placeholder: t("debates.form.tags_placeholder") %> +
+
+ <% if @debate.new_record? %> + <%= f.label :terms_of_service do %> + <%= f.check_box :terms_of_service, label: false %> + + <%= t("form.accept_terms", + policy: link_to(t("form.policy"), "/privacy", target: "blank"), + conditions: link_to(t("form.conditions"), "/conditions", target: "blank")).html_safe %> + + <% end %> + <% end %> +
+ +
+ <%= f.simple_captcha input_html: { required: false } %> +
+ +
+ <%= f.submit(class: "button radius", value: t("debate_links.#{action_name}.form.submit_button")) %> +
+
+<% end %> diff --git a/app/views/debate_links/new.html.erb b/app/views/debate_links/new.html.erb new file mode 100644 index 000000000..b74e623f5 --- /dev/null +++ b/app/views/debate_links/new.html.erb @@ -0,0 +1,29 @@ +
+ +
+ <%= link_to debates_path, class: "left back" do %> + + <%= t("debates.new.back_link") %> + <% end %> +

<%= t("debate_links.new.start_new") %>

+
+ <%= t("debates.new.info", + info_link: link_to(t("debates.new.info_link"), new_proposal_path )).html_safe %> + <%= link_to "/more_information", target: "_blank" do %> + <%= t("debates.new.more_info")%> + <% end %> +
+ <%= render "form" %> +
+ +
+ +

<%= t("debate_links.new.recommendations_title") %>

+
    +
  • <%= t("debates.new.recommendation_one") %>
  • +
  • <%= t("debates.new.recommendation_two") %>
  • +
  • <%= t("debates.new.recommendation_three") %>
  • +
  • <%= t("debates.new.recommendation_four") %>
  • +
+
+
diff --git a/app/views/debate_links/suggest.js.erb b/app/views/debate_links/suggest.js.erb new file mode 100644 index 000000000..819af2b16 --- /dev/null +++ b/app/views/debate_links/suggest.js.erb @@ -0,0 +1 @@ +<%= render "shared/suggest" %> \ No newline at end of file diff --git a/app/views/debates/_debate.html.erb b/app/views/debates/_debate.html.erb index 6148630d3..8e07c7304 100644 --- a/app/views/debates/_debate.html.erb +++ b/app/views/debates/_debate.html.erb @@ -41,7 +41,12 @@

- <%= link_to debate.description, debate %> + <% if debate.description.present? %> + <%= link_to debate.description, debate %> + <% end %> + <% if debate.external_link.present? %> + <%= link_to debate.external_link, debate.external_link, target: '_blank' %> + <% end %>
<%= render "shared/tags", taggable: debate, limit: 5 %> diff --git a/app/views/debates/_form.html.erb b/app/views/debates/_form.html.erb index 60bee011d..a39b2a81e 100644 --- a/app/views/debates/_form.html.erb +++ b/app/views/debates/_form.html.erb @@ -6,11 +6,17 @@ <%= f.text_field :title, maxlength: Debate.title_max_length, placeholder: t("debates.form.debate_title"), label: false, data: {js_suggest_result: "js_suggest_result", js_suggest: "#js-suggest", js_url: suggest_debates_path}%>
-
- <%= f.label :description, t("debates.form.debate_text") %> - <%= f.cktext_area :description, maxlength: Debate.description_max_length, ckeditor: { language: I18n.locale }, label: false %> -
- + <% if @debate.external_link != nil %> +
+ <%= f.label :external_link, t("debate_links.form.debate_link") %> + <%= f.text_field :external_link, maxlength: Debate.external_link_max_length, placeholder: t("debates.form.debate_title"), label: false %> +
+ <% else %> +
+ <%= f.label :description, t("debates.form.debate_text") %> + <%= f.cktext_area :description, maxlength: Debate.description_max_length, ckeditor: { language: I18n.locale }, label: false %> +
+ <% end %>
<%= f.label :tag_list, t("debates.form.tags_label") %>

<%= t("debates.form.tags_instructions") %>

diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index b1a316887..317d393f0 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -44,6 +44,7 @@
diff --git a/app/views/debates/show.html.erb b/app/views/debates/show.html.erb index a1985f259..cf1e9da2b 100644 --- a/app/views/debates/show.html.erb +++ b/app/views/debates/show.html.erb @@ -34,7 +34,13 @@
- <%= safe_html_with_links @debate.description %> + <% if @debate.external_link.present? %> + <%= safe_html_with_links link_to @debate.external_link, @debate.external_link, target: '_blank'%> + <% end %> + + <% if @debate.description.present? %> + <%= safe_html_with_links @debate.description %> + <% end %> <%= render 'shared/tags', taggable: @debate %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 699923c5a..f92f21ba4 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -108,6 +108,7 @@ en: select_order: Order by start_debate: Start a debate title: Debates + share_debate: "Share a link" new: back_link: Go back form: @@ -136,6 +137,17 @@ en: update: form: submit_button: Save changes + debate_links: + form: + debate_link: "Link" + new: + start_new: "Share a link" + recommendations_title: "Recommendations for sharing a link" + form: + submit_button: "Share link" + create: + form: + submit_button: "Share link" errors: messages: user_not_found: User not found diff --git a/config/locales/es.yml b/config/locales/es.yml index a69f3c364..8f232e8e0 100755 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -109,6 +109,7 @@ es: select_order: Ordenar por start_debate: Empieza un debate title: Debates + share_debate: "Comparte un enlace" new: back_link: Volver form: @@ -137,6 +138,17 @@ es: update: form: submit_button: Guardar cambios + debate_links: + form: + debate_link: "Enlace" + new: + start_new: "Compartir un enlace" + recommendations_title: "Recomendaciones para compartir un enlace" + form: + submit_button: "Comparte un enlace" + create: + form: + submit_button: "Comparte un enlace" errors: messages: user_not_found: No se encontrĂ³ el usuario diff --git a/config/routes.rb b/config/routes.rb index b48b4628f..c270eaa73 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -43,6 +43,9 @@ Rails.application.routes.draw do get :suggest end end + + get 'debate_links/new' => 'debate_links#new' + post 'debate_links' => 'debate_links#create' resources :proposals do member do diff --git a/db/migrate/20160207205252_add_external_link_to_debates.rb b/db/migrate/20160207205252_add_external_link_to_debates.rb new file mode 100644 index 000000000..b7b31626a --- /dev/null +++ b/db/migrate/20160207205252_add_external_link_to_debates.rb @@ -0,0 +1,5 @@ +class AddExternalLinkToDebates < ActiveRecord::Migration + def change + add_column :debates, :external_link, :string, limit: 100 + end +end diff --git a/db/schema.rb b/db/schema.rb index dafbdd4b0..6e9d25833 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160204134022) do +ActiveRecord::Schema.define(version: 20160207205252) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -118,9 +118,9 @@ ActiveRecord::Schema.define(version: 20160204134022) do t.integer "cached_votes_score", default: 0 t.integer "hot_score", limit: 8, default: 0 t.integer "confidence_score", default: 0 - t.string "external_link", limit: 100 t.integer "geozone_id" t.tsvector "tsv" + t.string "external_link", limit: 100 end add_index "debates", ["author_id", "hidden_at"], name: "index_debates_on_author_id_and_hidden_at", using: :btree diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 5dea879a6..001af7e9c 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -86,6 +86,24 @@ feature 'Debates' do expect(page).to have_content I18n.l(Debate.last.created_at.to_date) end + scenario 'Create_link' do + author = create(:user) + login_as(author) + + visit debate_links_new_path + fill_in 'debate_title', with: 'A title for a debate' + fill_in 'debate_external_link', with: 'http://localhost:3000' + fill_in 'debate_captcha', with: correct_captcha_text + check 'debate_terms_of_service' + + click_button 'Share link' + + expect(page).to have_content 'A title for a debate' + expect(page).to have_content 'Debate created successfully.' + expect(page).to have_content author.name + expect(page).to have_content I18n.l(Debate.last.created_at.to_date) + end + scenario 'Captcha is required for debate creation' do login_as(create(:user)) diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb index 04132224a..50241e1f0 100644 --- a/spec/models/debate_spec.rb +++ b/spec/models/debate_spec.rb @@ -30,6 +30,24 @@ describe Debate do end end + describe "#external_link" do + + it "should not be valid without a url" do + debate.external_link = "" + expect(debate).to_not be_valid + end + + it "should not be valid when very short" do + debate.external_link = "abc" + expect(debate).to_not be_valid + end + + it "should not be valid when very long" do + debate.external_link = "a" * 101 + expect(debate).to_not be_valid + end + end + describe "#description" do it "should not be valid without a description" do debate.description = nil