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