From 6e29b6adf5909f613752f9e6d174567163a9a91e Mon Sep 17 00:00:00 2001 From: Bertocq Date: Fri, 6 Oct 2017 12:16:59 +0200 Subject: [PATCH 01/13] Fix dev seeds rake, creating Poll Question Answers --- db/dev_seeds.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/db/dev_seeds.rb b/db/dev_seeds.rb index b151a45cf..31902bad9 100644 --- a/db/dev_seeds.rb +++ b/db/dev_seeds.rb @@ -557,11 +557,14 @@ print "Creating Poll Questions" author = User.reorder("RANDOM()").first description = "

#{Faker::Lorem.paragraphs.join('

')}

" open_at = rand(2.months.ago..2.months.from_now) + answers = Faker::Lorem.words((2..4).to_a.sample).map { |answer| answer.capitalize } question = Poll::Question.create!(author: author, title: Faker::Lorem.sentence(3).truncate(60), - description: description, - valid_answers: Faker::Lorem.words((2..7).to_a.sample).join(', '), + valid_answers: answers.join(', '), poll: poll) + answers.each do |answer| + Poll::Question::Answer.create!(question: question, title: answer, description: Faker::ChuckNorris.fact) + end end puts " ✅" From 1806bd3df4444317433872d417977de94a7a8852 Mon Sep 17 00:00:00 2001 From: Bertocq Date: Fri, 6 Oct 2017 14:28:57 +0200 Subject: [PATCH 02/13] Add token string attribute to Poll Answer --- app/models/poll/answer.rb | 3 ++- db/migrate/20171006102811_add_token_to_poll_answer.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20171006102811_add_token_to_poll_answer.rb diff --git a/app/models/poll/answer.rb b/app/models/poll/answer.rb index 2378de6ba..fc4f07c8b 100644 --- a/app/models/poll/answer.rb +++ b/app/models/poll/answer.rb @@ -8,6 +8,7 @@ class Poll::Answer < ActiveRecord::Base validates :question, presence: true validates :author, presence: true validates :answer, presence: true + validates :token, presence: true # temporary skipping validation, review when removing valid_answers # validates :answer, inclusion: { in: ->(a) { a.question.valid_answers }}, @@ -19,4 +20,4 @@ class Poll::Answer < ActiveRecord::Base def record_voter_participation Poll::Voter.find_or_create_by!(user: author, poll: poll, origin: "web") end -end \ No newline at end of file +end diff --git a/db/migrate/20171006102811_add_token_to_poll_answer.rb b/db/migrate/20171006102811_add_token_to_poll_answer.rb new file mode 100644 index 000000000..22fee6db9 --- /dev/null +++ b/db/migrate/20171006102811_add_token_to_poll_answer.rb @@ -0,0 +1,5 @@ +class AddTokenToPollAnswer < ActiveRecord::Migration + def change + add_column :poll_answers, :token, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index dbbd3ec46..04aab5b4d 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: 20171004151553) do +ActiveRecord::Schema.define(version: 20171006102811) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -592,6 +592,7 @@ ActiveRecord::Schema.define(version: 20171004151553) do t.string "answer" t.datetime "created_at" t.datetime "updated_at" + t.string "token" end add_index "poll_answers", ["author_id"], name: "index_poll_answers_on_author_id", using: :btree From d4408efda652383eafe94fa9756db3912698421e Mon Sep 17 00:00:00 2001 From: Bertocq Date: Fri, 6 Oct 2017 14:36:21 +0200 Subject: [PATCH 03/13] Generate a unique token for a Poll Ballot and use it on answer buttons --- app/controllers/polls/questions_controller.rb | 1 + app/controllers/polls_controller.rb | 4 +++- app/helpers/polls_helper.rb | 11 +++++++++++ app/views/polls/questions/_answers.html.erb | 4 ++-- app/views/polls/questions/_question.html.erb | 2 +- app/views/polls/questions/answer.js.erb | 3 ++- app/views/polls/show.html.erb | 2 +- config/locales/en/general.yml | 1 + config/locales/es/general.yml | 1 + 9 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/controllers/polls/questions_controller.rb b/app/controllers/polls/questions_controller.rb index 490b32fbe..32f4b8e54 100644 --- a/app/controllers/polls/questions_controller.rb +++ b/app/controllers/polls/questions_controller.rb @@ -9,6 +9,7 @@ class Polls::QuestionsController < ApplicationController answer = @question.answers.find_or_initialize_by(author: current_user) answer.answer = params[:answer] + answer.token = params[:token] answer.save! answer.record_voter_participation diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 41a038b46..18a75534c 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -1,5 +1,7 @@ class PollsController < ApplicationController + include PollsHelper + load_and_authorize_resource has_filters %w{current expired incoming} @@ -12,7 +14,7 @@ class PollsController < ApplicationController def show @questions = @poll.questions.for_render.sort_for_list - + @token = poll_answer_author_token(@poll, current_user) @answers_by_question_id = {} poll_answers = ::Poll::Answer.by_question(@poll.question_ids).by_author(current_user.try(:id)) poll_answers.each do |answer| diff --git a/app/helpers/polls_helper.rb b/app/helpers/polls_helper.rb index 27d33ea04..a0a4736aa 100644 --- a/app/helpers/polls_helper.rb +++ b/app/helpers/polls_helper.rb @@ -41,4 +41,15 @@ module PollsHelper booth.name + location end + def poll_answer_author_token(poll, author) + existing_token = Poll::Answer.where(question: poll.questions, author: author) + existing_token.present? ? existing_token.first.token : poll_answer_unique_token + end + + def poll_answer_unique_token + loop do + token = SecureRandom.hex(32) + break token unless Poll::Answer.where(token: token).exists? + end + end end diff --git a/app/views/polls/questions/_answers.html.erb b/app/views/polls/questions/_answers.html.erb index 2bef6de72..8188c4cd1 100644 --- a/app/views/polls/questions/_answers.html.erb +++ b/app/views/polls/questions/_answers.html.erb @@ -2,13 +2,13 @@ <% if can? :answer, question %> <% question.question_answers.each do |answer| %> <% if @answers_by_question_id[question.id] == answer.title %> - "> <%= answer.title %> <% else %> <%= link_to answer.title, - answer_question_path(question, answer: answer.title), + answer_question_path(question, answer: answer.title, token: token), method: :post, remote: true, title: t("poll_questions.show.vote_answer", answer: answer.title), diff --git a/app/views/polls/questions/_question.html.erb b/app/views/polls/questions/_question.html.erb index 982d0a070..b0df3fb42 100644 --- a/app/views/polls/questions/_question.html.erb +++ b/app/views/polls/questions/_question.html.erb @@ -4,6 +4,6 @@
- <%= render 'polls/questions/answers', question: question %> + <%= render 'polls/questions/answers', question: question, token: token %>
diff --git a/app/views/polls/questions/answer.js.erb b/app/views/polls/questions/answer.js.erb index aabbd8d89..2dcb5b0aa 100644 --- a/app/views/polls/questions/answer.js.erb +++ b/app/views/polls/questions/answer.js.erb @@ -1 +1,2 @@ -$("#<%= dom_id(@question) %>_answers").html('<%= j render("polls/questions/answers", question: @question) %>'); +<% token = poll_answer_author_token(@question.poll, current_user) %> +$("#<%= dom_id(@question) %>_answers").html('<%= j render("polls/questions/answers", question: @question, token: token) %>'); diff --git a/app/views/polls/show.html.erb b/app/views/polls/show.html.erb index b632fac55..bc9cefd2b 100644 --- a/app/views/polls/show.html.erb +++ b/app/views/polls/show.html.erb @@ -39,7 +39,7 @@ <% else %> <% @questions.each do |question| %> - <%= render 'polls/questions/question', question: question %> + <%= render 'polls/questions/question', question: question, token: @token %> <% end %> <% end %> diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml index 11693d20f..13ab81041 100644 --- a/config/locales/en/general.yml +++ b/config/locales/en/general.yml @@ -497,6 +497,7 @@ en: show: vote_answer: "Vote %{answer}" voted: "You have voted %{answer}" + voted_token: "You can write down this vote identifier, to check your vote on the final results." proposal_notifications: new: title: "Send message" diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml index 981f85ca6..1650fb37b 100644 --- a/config/locales/es/general.yml +++ b/config/locales/es/general.yml @@ -497,6 +497,7 @@ es: show: vote_answer: "Votar %{answer}" voted: "Has votado %{answer}" + voted_token: "Puedes apuntar este identificador de voto, para comprobar tu votación en el resultado final" proposal_notifications: new: title: "Enviar mensaje" From 6994f6d7fedf9f964295249deba7a67da67e1a49 Mon Sep 17 00:00:00 2001 From: Bertocq Date: Fri, 6 Oct 2017 15:28:25 +0200 Subject: [PATCH 04/13] Remove random token generation, we'll use JS on the client when its empty --- app/helpers/polls_helper.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/helpers/polls_helper.rb b/app/helpers/polls_helper.rb index a0a4736aa..feb4c42e2 100644 --- a/app/helpers/polls_helper.rb +++ b/app/helpers/polls_helper.rb @@ -43,13 +43,7 @@ module PollsHelper def poll_answer_author_token(poll, author) existing_token = Poll::Answer.where(question: poll.questions, author: author) - existing_token.present? ? existing_token.first.token : poll_answer_unique_token + existing_token.present? ? existing_token.first.token : '' end - def poll_answer_unique_token - loop do - token = SecureRandom.hex(32) - break token unless Poll::Answer.where(token: token).exists? - end - end end From 35148015b949f77c0fd14dba895246765bcac097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Fri, 6 Oct 2017 18:43:00 +0200 Subject: [PATCH 05/13] Added token to poll voters --- app/controllers/polls/questions_controller.rb | 4 ++-- app/controllers/polls_controller.rb | 1 - app/models/poll/answer.rb | 7 +++++-- db/migrate/20171006102811_add_token_to_poll_answer.rb | 5 ----- db/migrate/20171006145053_add_token_to_poll_voters.rb | 6 ++++++ db/schema.rb | 5 +++-- 6 files changed, 16 insertions(+), 12 deletions(-) delete mode 100644 db/migrate/20171006102811_add_token_to_poll_answer.rb create mode 100644 db/migrate/20171006145053_add_token_to_poll_voters.rb diff --git a/app/controllers/polls/questions_controller.rb b/app/controllers/polls/questions_controller.rb index 32f4b8e54..39fc18252 100644 --- a/app/controllers/polls/questions_controller.rb +++ b/app/controllers/polls/questions_controller.rb @@ -7,11 +7,11 @@ class Polls::QuestionsController < ApplicationController def answer answer = @question.answers.find_or_initialize_by(author: current_user) + token = params[:token] answer.answer = params[:answer] - answer.token = params[:token] answer.save! - answer.record_voter_participation + answer.record_voter_participation(token) @answers_by_question_id = { @question.id => params[:answer] } end diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 18a75534c..ce807eda2 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -14,7 +14,6 @@ class PollsController < ApplicationController def show @questions = @poll.questions.for_render.sort_for_list - @token = poll_answer_author_token(@poll, current_user) @answers_by_question_id = {} poll_answers = ::Poll::Answer.by_question(@poll.question_ids).by_author(current_user.try(:id)) poll_answers.each do |answer| diff --git a/app/models/poll/answer.rb b/app/models/poll/answer.rb index fc4f07c8b..48287053c 100644 --- a/app/models/poll/answer.rb +++ b/app/models/poll/answer.rb @@ -17,7 +17,10 @@ class Poll::Answer < ActiveRecord::Base scope :by_author, ->(author_id) { where(author_id: author_id) } scope :by_question, ->(question_id) { where(question_id: question_id) } - def record_voter_participation - Poll::Voter.find_or_create_by!(user: author, poll: poll, origin: "web") + def record_voter_participation(token) + Poll::Voter.find_or_create_by!(user: author, poll: poll, origin: "web") do |poll_voter| + poll_voter.token = token unless poll_voter.token.present? + poll_voter.token_seen_at = Time.now unless poll_voter.token_seen_at.present? + end end end diff --git a/db/migrate/20171006102811_add_token_to_poll_answer.rb b/db/migrate/20171006102811_add_token_to_poll_answer.rb deleted file mode 100644 index 22fee6db9..000000000 --- a/db/migrate/20171006102811_add_token_to_poll_answer.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTokenToPollAnswer < ActiveRecord::Migration - def change - add_column :poll_answers, :token, :string - end -end diff --git a/db/migrate/20171006145053_add_token_to_poll_voters.rb b/db/migrate/20171006145053_add_token_to_poll_voters.rb new file mode 100644 index 000000000..01e68031e --- /dev/null +++ b/db/migrate/20171006145053_add_token_to_poll_voters.rb @@ -0,0 +1,6 @@ +class AddTokenToPollVoters < ActiveRecord::Migration + def change + add_column :poll_voters, :token, :string + add_column :poll_voters, :token_seen_at, :date + end +end diff --git a/db/schema.rb b/db/schema.rb index 04aab5b4d..be956a309 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: 20171006102811) do +ActiveRecord::Schema.define(version: 20171006145053) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -592,7 +592,6 @@ ActiveRecord::Schema.define(version: 20171006102811) do t.string "answer" t.datetime "created_at" t.datetime "updated_at" - t.string "token" end add_index "poll_answers", ["author_id"], name: "index_poll_answers_on_author_id", using: :btree @@ -761,6 +760,8 @@ ActiveRecord::Schema.define(version: 20171006102811) do t.integer "user_id" t.string "origin" t.integer "officer_id" + t.string "token" + t.date "token_seen_at" end add_index "poll_voters", ["booth_assignment_id"], name: "index_poll_voters_on_booth_assignment_id", using: :btree From 165509b5259f92479a158d1864826826d53896c0 Mon Sep 17 00:00:00 2001 From: Bertocq Date: Fri, 6 Oct 2017 18:59:47 +0200 Subject: [PATCH 06/13] Switch from Poll::Answer to Poll::Voter usage and small fixes --- app/controllers/polls_controller.rb | 1 + app/helpers/polls_helper.rb | 5 ++--- app/models/poll/answer.rb | 5 ++--- app/views/polls/questions/answer.js.erb | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index ce807eda2..064aa130f 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -14,6 +14,7 @@ class PollsController < ApplicationController def show @questions = @poll.questions.for_render.sort_for_list + @token = poll_voter_token(@poll, current_user) @answers_by_question_id = {} poll_answers = ::Poll::Answer.by_question(@poll.question_ids).by_author(current_user.try(:id)) poll_answers.each do |answer| diff --git a/app/helpers/polls_helper.rb b/app/helpers/polls_helper.rb index feb4c42e2..acc84b49c 100644 --- a/app/helpers/polls_helper.rb +++ b/app/helpers/polls_helper.rb @@ -41,9 +41,8 @@ module PollsHelper booth.name + location end - def poll_answer_author_token(poll, author) - existing_token = Poll::Answer.where(question: poll.questions, author: author) - existing_token.present? ? existing_token.first.token : '' + def poll_voter_token(poll, user) + Poll::Voter.where(poll: poll, user: user, origin: "web").first&.token || '' end end diff --git a/app/models/poll/answer.rb b/app/models/poll/answer.rb index 48287053c..ccd521294 100644 --- a/app/models/poll/answer.rb +++ b/app/models/poll/answer.rb @@ -8,7 +8,6 @@ class Poll::Answer < ActiveRecord::Base validates :question, presence: true validates :author, presence: true validates :answer, presence: true - validates :token, presence: true # temporary skipping validation, review when removing valid_answers # validates :answer, inclusion: { in: ->(a) { a.question.valid_answers }}, @@ -19,8 +18,8 @@ class Poll::Answer < ActiveRecord::Base def record_voter_participation(token) Poll::Voter.find_or_create_by!(user: author, poll: poll, origin: "web") do |poll_voter| - poll_voter.token = token unless poll_voter.token.present? - poll_voter.token_seen_at = Time.now unless poll_voter.token_seen_at.present? + poll_voter.token = token unless poll_voter.token.present? + poll_voter.token_seen_at = Time.current unless poll_voter.token_seen_at.present? end end end diff --git a/app/views/polls/questions/answer.js.erb b/app/views/polls/questions/answer.js.erb index 2dcb5b0aa..8e8c01358 100644 --- a/app/views/polls/questions/answer.js.erb +++ b/app/views/polls/questions/answer.js.erb @@ -1,2 +1,2 @@ -<% token = poll_answer_author_token(@question.poll, current_user) %> +<% token = poll_voter_token(@question.poll, current_user) %> $("#<%= dom_id(@question) %>_answers").html('<%= j render("polls/questions/answers", question: @question, token: token) %>'); From bcfd1a844a7e874aa6db37182e43674638e956da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Fri, 6 Oct 2017 20:44:47 +0200 Subject: [PATCH 07/13] Poll voter token --- app/assets/javascripts/application.js | 2 ++ app/assets/javascripts/polls.js.coffee | 21 +++++++++++++++++++ app/models/poll/answer.rb | 5 ++--- app/views/polls/questions/_answers.html.erb | 2 +- app/views/polls/show.html.erb | 7 +++++++ config/locales/en/general.yml | 2 +- config/locales/es/general.yml | 2 +- ...20171006145053_add_token_to_poll_voters.rb | 1 - db/schema.rb | 1 - 9 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 app/assets/javascripts/polls.js.coffee diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index b73c07474..ce9861547 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -70,6 +70,7 @@ //= require polls_admin //= require leaflet //= require map +//= require polls var initialize_modules = function() { App.Comments.initialize(); @@ -108,6 +109,7 @@ var initialize_modules = function() { App.TagAutocomplete.initialize(); App.PollsAdmin.initialize(); App.Map.initialize(); + App.Polls.initialize(); }; $(function(){ diff --git a/app/assets/javascripts/polls.js.coffee b/app/assets/javascripts/polls.js.coffee new file mode 100644 index 000000000..ace7f895e --- /dev/null +++ b/app/assets/javascripts/polls.js.coffee @@ -0,0 +1,21 @@ +App.Polls = + generateToken: -> + rand = Math.random().toString(36).substr(2) # remove `0.` + token = rand + rand # to make it longer + return token + + replaceToken: -> + for link in $('.js-question-answer') + token_param = link.search.slice(-6) + if token_param == "token=" + link.href = link.href + @token + + initialize: -> + @token = App.Polls.generateToken() + App.Polls.replaceToken() + + $(".js-question-answer").on "click", (@token) -> + token_message = $(".js-token-message") + token_message.html(token_message.html() + "
" + @token + ""); + token_message.show() + false diff --git a/app/models/poll/answer.rb b/app/models/poll/answer.rb index ccd521294..da68f2d91 100644 --- a/app/models/poll/answer.rb +++ b/app/models/poll/answer.rb @@ -17,9 +17,8 @@ class Poll::Answer < ActiveRecord::Base scope :by_question, ->(question_id) { where(question_id: question_id) } def record_voter_participation(token) - Poll::Voter.find_or_create_by!(user: author, poll: poll, origin: "web") do |poll_voter| - poll_voter.token = token unless poll_voter.token.present? - poll_voter.token_seen_at = Time.current unless poll_voter.token_seen_at.present? + Poll::Voter.find_or_create_by(user: author, poll: poll, origin: "web") do |poll_voter| + poll_voter.token = token unless poll_voter.token.present? end end end diff --git a/app/views/polls/questions/_answers.html.erb b/app/views/polls/questions/_answers.html.erb index 8188c4cd1..3801a1964 100644 --- a/app/views/polls/questions/_answers.html.erb +++ b/app/views/polls/questions/_answers.html.erb @@ -12,7 +12,7 @@ method: :post, remote: true, title: t("poll_questions.show.vote_answer", answer: answer.title), - class: "button secondary hollow" %> + class: "button secondary hollow js-question-answer" %> <% end %> <% end %> <% else %> diff --git a/app/views/polls/show.html.erb b/app/views/polls/show.html.erb index bc9cefd2b..be743f2f1 100644 --- a/app/views/polls/show.html.erb +++ b/app/views/polls/show.html.erb @@ -38,6 +38,13 @@ <%= t("polls.show.already_voted_in_booth") %> <% else %> + + <% if !@poll.voters.find_by_user_id(current_user).present? %> + + <% end %> + <% @questions.each do |question| %> <%= render 'polls/questions/question', question: question, token: @token %> <% end %> diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml index 13ab81041..8f999d0ec 100644 --- a/config/locales/en/general.yml +++ b/config/locales/en/general.yml @@ -497,7 +497,7 @@ en: show: vote_answer: "Vote %{answer}" voted: "You have voted %{answer}" - voted_token: "You can write down this vote identifier, to check your vote on the final results." + voted_token: "You can write down this vote identifier, to check your vote on the final results:" proposal_notifications: new: title: "Send message" diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml index 1650fb37b..677b03a4a 100644 --- a/config/locales/es/general.yml +++ b/config/locales/es/general.yml @@ -497,7 +497,7 @@ es: show: vote_answer: "Votar %{answer}" voted: "Has votado %{answer}" - voted_token: "Puedes apuntar este identificador de voto, para comprobar tu votación en el resultado final" + voted_token: "Puedes apuntar este identificador de voto, para comprobar tu votación en el resultado final:" proposal_notifications: new: title: "Enviar mensaje" diff --git a/db/migrate/20171006145053_add_token_to_poll_voters.rb b/db/migrate/20171006145053_add_token_to_poll_voters.rb index 01e68031e..5d07f5065 100644 --- a/db/migrate/20171006145053_add_token_to_poll_voters.rb +++ b/db/migrate/20171006145053_add_token_to_poll_voters.rb @@ -1,6 +1,5 @@ class AddTokenToPollVoters < ActiveRecord::Migration def change add_column :poll_voters, :token, :string - add_column :poll_voters, :token_seen_at, :date end end diff --git a/db/schema.rb b/db/schema.rb index be956a309..cafec3a82 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -761,7 +761,6 @@ ActiveRecord::Schema.define(version: 20171006145053) do t.string "origin" t.integer "officer_id" t.string "token" - t.date "token_seen_at" end add_index "poll_voters", ["booth_assignment_id"], name: "index_poll_voters_on_booth_assignment_id", using: :btree From 34cd8d8b98c8260a19fcd4c8774b8baab13b55e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Fri, 6 Oct 2017 20:59:25 +0200 Subject: [PATCH 08/13] Fixed token message --- app/assets/javascripts/polls.js.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/polls.js.coffee b/app/assets/javascripts/polls.js.coffee index ace7f895e..d603f01b9 100644 --- a/app/assets/javascripts/polls.js.coffee +++ b/app/assets/javascripts/polls.js.coffee @@ -14,7 +14,8 @@ App.Polls = @token = App.Polls.generateToken() App.Polls.replaceToken() - $(".js-question-answer").on "click", (@token) -> + $(".js-question-answer").on + click: => token_message = $(".js-token-message") token_message.html(token_message.html() + "
" + @token + ""); token_message.show() From 7e11a48f00d17fab3fe0104d93dfec68d5146319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Fri, 6 Oct 2017 21:14:19 +0200 Subject: [PATCH 09/13] Fixed token message --- app/assets/javascripts/polls.js.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/polls.js.coffee b/app/assets/javascripts/polls.js.coffee index d603f01b9..50daff0ba 100644 --- a/app/assets/javascripts/polls.js.coffee +++ b/app/assets/javascripts/polls.js.coffee @@ -17,6 +17,7 @@ App.Polls = $(".js-question-answer").on click: => token_message = $(".js-token-message") - token_message.html(token_message.html() + "
" + @token + ""); - token_message.show() + if !token_message.is(':visible') + token_message.html(token_message.html() + "
" + @token + ""); + token_message.show() false From cc2da735c738852fcfaf4d60946b0e47c7eeac13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Fri, 6 Oct 2017 21:47:46 +0200 Subject: [PATCH 10/13] Set token to 64 characters --- app/assets/javascripts/polls.js.coffee | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/polls.js.coffee b/app/assets/javascripts/polls.js.coffee index 50daff0ba..650c2596a 100644 --- a/app/assets/javascripts/polls.js.coffee +++ b/app/assets/javascripts/polls.js.coffee @@ -1,7 +1,11 @@ App.Polls = generateToken: -> - rand = Math.random().toString(36).substr(2) # remove `0.` - token = rand + rand # to make it longer + token = '' + for n in [0..5] + rand = Math.random().toString(36).substr(2) # remove `0.` + token = token + rand; + + token = token.substring(0, 64) return token replaceToken: -> From 9a396fe6343ff1282c9a4dc7208548b34dcc0d12 Mon Sep 17 00:00:00 2001 From: Bertocq Date: Sat, 7 Oct 2017 10:48:24 +0200 Subject: [PATCH 11/13] Fix record_voter_participation and usage on specs --- app/models/poll/answer.rb | 4 +--- spec/models/poll/answer_spec.rb | 6 +++--- spec/models/poll/voter_spec.rb | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/models/poll/answer.rb b/app/models/poll/answer.rb index da68f2d91..4484060dd 100644 --- a/app/models/poll/answer.rb +++ b/app/models/poll/answer.rb @@ -17,8 +17,6 @@ class Poll::Answer < ActiveRecord::Base scope :by_question, ->(question_id) { where(question_id: question_id) } def record_voter_participation(token) - Poll::Voter.find_or_create_by(user: author, poll: poll, origin: "web") do |poll_voter| - poll_voter.token = token unless poll_voter.token.present? - end + Poll::Voter.find_or_create_by(user: author, poll: poll, origin: "web", token: token) end end diff --git a/spec/models/poll/answer_spec.rb b/spec/models/poll/answer_spec.rb index 2c27bc060..8731445cc 100644 --- a/spec/models/poll/answer_spec.rb +++ b/spec/models/poll/answer_spec.rb @@ -46,7 +46,7 @@ describe Poll::Answer do answer = create(:poll_answer, question: question, author: author, answer: "Yes") expect(answer.poll.voters).to be_blank - answer.record_voter_participation + answer.record_voter_participation('token') expect(poll.reload.voters.size).to eq(1) voter = poll.voters.first @@ -57,12 +57,12 @@ describe Poll::Answer do it "updates a poll_voter with user and poll data" do answer = create(:poll_answer, question: question, author: author, answer: "Yes") - answer.record_voter_participation + answer.record_voter_participation('token') expect(poll.reload.voters.size).to eq(1) answer = create(:poll_answer, question: question, author: author, answer: "No") - answer.record_voter_participation + answer.record_voter_participation('token') expect(poll.reload.voters.size).to eq(1) diff --git a/spec/models/poll/voter_spec.rb b/spec/models/poll/voter_spec.rb index f306248dc..bbd22011a 100644 --- a/spec/models/poll/voter_spec.rb +++ b/spec/models/poll/voter_spec.rb @@ -76,7 +76,7 @@ describe :voter do it "should not be valid if the user has voted via web" do answer = create(:poll_answer) - answer.record_voter_participation + answer.record_voter_participation('token') voter = build(:poll_voter, poll: answer.question.poll, user: answer.author) expect(voter).to_not be_valid @@ -169,4 +169,4 @@ describe :voter do expect(voter.document_type).to eq("1") end end -end \ No newline at end of file +end From e127b52225c91e6def5f5e45dcd286e97baea397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Sat, 7 Oct 2017 11:37:33 +0200 Subject: [PATCH 12/13] Minor fixes --- app/assets/javascripts/polls.js.coffee | 1 + app/views/polls/show.html.erb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/polls.js.coffee b/app/assets/javascripts/polls.js.coffee index 650c2596a..5cf792ce2 100644 --- a/app/assets/javascripts/polls.js.coffee +++ b/app/assets/javascripts/polls.js.coffee @@ -1,6 +1,7 @@ App.Polls = generateToken: -> token = '' + rand = '' for n in [0..5] rand = Math.random().toString(36).substr(2) # remove `0.` token = token + rand; diff --git a/app/views/polls/show.html.erb b/app/views/polls/show.html.erb index 1fd305e71..4a6b7b4fa 100644 --- a/app/views/polls/show.html.erb +++ b/app/views/polls/show.html.erb @@ -39,7 +39,7 @@ <% else %> - <% if !@poll.voters.find_by_user_id(current_user).present? %> + <% if poll_voter_token(@poll, current_user).empty? %> From 84e35edca7efa5a20879bd95b54d1afa2823fa85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Checa?= Date: Sat, 7 Oct 2017 16:16:39 +0200 Subject: [PATCH 13/13] Added new tests for vote token --- spec/features/polls/voter_spec.rb | 7 +++++++ spec/models/poll/voter_spec.rb | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/spec/features/polls/voter_spec.rb b/spec/features/polls/voter_spec.rb index e558b7261..256807928 100644 --- a/spec/features/polls/voter_spec.rb +++ b/spec/features/polls/voter_spec.rb @@ -32,6 +32,11 @@ feature "Voter" do expect(page).to_not have_link('Yes') end + find(:css, ".js-token-message").should be_visible + token = find(:css, ".js-question-answer")[:href].gsub(/.+?(?=token)/, '').gsub('token=', '') + + expect(page).to have_content "You can write down this vote identifier, to check your vote on the final results: #{token}" + expect(Poll::Voter.count).to eq(1) expect(Poll::Voter.first.origin).to eq("web") end @@ -101,6 +106,8 @@ feature "Voter" do visit poll_path(poll) + expect(page).to_not have_selector('.js-token-message') + expect(page).to have_content "You have already participated in this poll. If you vote again it will be overwritten." within("#poll_question_#{question.id}_answers") do expect(page).to_not have_link('Yes') diff --git a/spec/models/poll/voter_spec.rb b/spec/models/poll/voter_spec.rb index bbd22011a..ae0f84a49 100644 --- a/spec/models/poll/voter_spec.rb +++ b/spec/models/poll/voter_spec.rb @@ -162,11 +162,12 @@ describe :voter do it "sets user info" do user = create(:user, document_number: "1234A", document_type: "1") - voter = build(:poll_voter, user: user) + voter = build(:poll_voter, user: user, token: "1234abcd") voter.save expect(voter.document_number).to eq("1234A") expect(voter.document_type).to eq("1") + expect(voter.token).to eq("1234abcd") end end end