@@ -49,6 +49,7 @@
|
||||
//= require fixed_bar
|
||||
//= require banners
|
||||
//= require social_share
|
||||
//= require checkbox_toggle
|
||||
//= require custom
|
||||
|
||||
var initialize_modules = function() {
|
||||
@@ -74,6 +75,7 @@ var initialize_modules = function() {
|
||||
App.FixedBar.initialize();
|
||||
App.Banners.initialize();
|
||||
App.SocialShare.initialize();
|
||||
App.CheckboxToggle.initialize();
|
||||
};
|
||||
|
||||
$(function(){
|
||||
|
||||
12
app/assets/javascripts/checkbox_toggle.js.coffee
Normal file
12
app/assets/javascripts/checkbox_toggle.js.coffee
Normal file
@@ -0,0 +1,12 @@
|
||||
App.CheckboxToggle =
|
||||
|
||||
initialize: ->
|
||||
$('[data-checkbox-toggle]').on 'change', ->
|
||||
$this = $(this)
|
||||
$target = $($this.data('checkbox-toggle'))
|
||||
if $this.is(':checked')
|
||||
$target.show()
|
||||
else
|
||||
$target.hide()
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
class Admin::Poll::PollsController < Admin::BaseController
|
||||
load_and_authorize_resource
|
||||
|
||||
before_action :load_search, only: [:search_booths, :search_questions, :search_officers]
|
||||
before_action :load_geozones, only: [:new, :create, :edit, :update]
|
||||
|
||||
def index
|
||||
end
|
||||
@@ -78,9 +80,12 @@ class Admin::Poll::PollsController < Admin::BaseController
|
||||
end
|
||||
|
||||
private
|
||||
def load_geozones
|
||||
@geozones = Geozone.all.order(:name)
|
||||
end
|
||||
|
||||
def poll_params
|
||||
params.require(:poll).permit(:name, :starts_at, :ends_at)
|
||||
params.require(:poll).permit(:name, :starts_at, :ends_at, :geozone_restricted, geozone_ids: [])
|
||||
end
|
||||
|
||||
def search_params
|
||||
@@ -91,4 +96,4 @@ class Admin::Poll::PollsController < Admin::BaseController
|
||||
@search = search_params[:search]
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,8 +2,6 @@ class Admin::Poll::QuestionsController < Admin::BaseController
|
||||
load_and_authorize_resource :poll
|
||||
load_and_authorize_resource :question, class: 'Poll::Question'
|
||||
|
||||
before_action :load_geozones, only: [:new, :create, :edit, :update]
|
||||
|
||||
def index
|
||||
@polls = Poll.all
|
||||
@search = search_params[:search]
|
||||
@@ -55,16 +53,12 @@ class Admin::Poll::QuestionsController < Admin::BaseController
|
||||
|
||||
private
|
||||
|
||||
def load_geozones
|
||||
@geozones = Geozone.all.order(:name)
|
||||
end
|
||||
|
||||
def question_params
|
||||
params.require(:poll_question).permit(:title, :question, :summary, :description, :proposal_id, :valid_answers, :poll_id, :geozone_ids => [])
|
||||
params.require(:poll_question).permit(:poll_id, :title, :question, :summary, :description, :proposal_id, :valid_answers)
|
||||
end
|
||||
|
||||
def search_params
|
||||
params.permit(:poll_id, :search)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -9,8 +9,7 @@ class PollsController < ApplicationController
|
||||
end
|
||||
|
||||
def show
|
||||
@answerable_questions = @poll.questions.answerable_by(current_user).for_render.sort_for_list
|
||||
@non_answerable_questions = @poll.questions.where.not(id: @answerable_questions.map(&:id)).for_render.sort_for_list
|
||||
@questions = @poll.questions.for_render.sort_for_list
|
||||
|
||||
@answers_by_question_id = {}
|
||||
poll_partial_results = Poll::PartialResult.by_question(@poll.question_ids).by_author(current_user.try(:id))
|
||||
|
||||
@@ -6,6 +6,8 @@ class Poll < ActiveRecord::Base
|
||||
has_many :officers, through: :officer_assignments
|
||||
has_many :questions
|
||||
|
||||
has_and_belongs_to_many :geozones
|
||||
|
||||
validates :name, presence: true
|
||||
|
||||
validate :date_range
|
||||
@@ -14,6 +16,7 @@ class Poll < ActiveRecord::Base
|
||||
scope :incoming, -> { where('? < starts_at', Time.current) }
|
||||
scope :expired, -> { where('ends_at < ?', Time.current) }
|
||||
scope :published, -> { where('published = ?', true) }
|
||||
scope :by_geozone_id, ->(geozone_id) { where(geozones: {id: geozone_id}.joins(:geozones)) }
|
||||
|
||||
scope :sort_for_list, -> { order(:starts_at) }
|
||||
|
||||
@@ -30,12 +33,15 @@ class Poll < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def answerable_by?(user)
|
||||
user.present? && user.level_two_or_three_verified? && current?
|
||||
user.present? &&
|
||||
user.level_two_or_three_verified? &&
|
||||
current? &&
|
||||
(!geozone_restricted || geozone_ids.include?(user.geozone_id))
|
||||
end
|
||||
|
||||
def self.answerable_by(user)
|
||||
return none if user.nil? || user.unverified?
|
||||
current
|
||||
current.joins(:geozones).where('geozone_restricted = ? or geozones.id = ?', false, user.geozone_id)
|
||||
end
|
||||
|
||||
def document_has_voted?(document_number, document_type)
|
||||
|
||||
@@ -11,7 +11,6 @@ class Poll::Question < ActiveRecord::Base
|
||||
has_many :comments, as: :commentable
|
||||
has_many :answers
|
||||
has_many :partial_results
|
||||
has_and_belongs_to_many :geozones
|
||||
belongs_to :proposal
|
||||
|
||||
validates :title, presence: true
|
||||
@@ -21,9 +20,7 @@ class Poll::Question < ActiveRecord::Base
|
||||
validates :title, length: { in: 4..Poll::Question.title_max_length }
|
||||
validates :description, length: { maximum: Poll::Question.description_max_length }
|
||||
|
||||
scope :no_poll, -> { where(poll_id: nil) }
|
||||
scope :by_poll_id, -> (poll_id) { where(poll_id: poll_id) }
|
||||
scope :by_geozone_id, -> (geozone_id) { where(geozones: {id: geozone_id}.joins(:geozones)) }
|
||||
scope :by_poll_id, ->(poll_id) { where(poll_id: poll_id) }
|
||||
|
||||
scope :sort_for_list, -> { order('poll_questions.proposal_id IS NULL', :created_at)}
|
||||
scope :for_render, -> { includes(:author, :proposal) }
|
||||
@@ -41,9 +38,7 @@ class Poll::Question < ActiveRecord::Base
|
||||
summary => 'B',
|
||||
description => 'C',
|
||||
author.username => 'C',
|
||||
author_visible_name => 'C',
|
||||
geozones.pluck(:name).join(' ') => 'C'
|
||||
}
|
||||
author_visible_name => 'C' }
|
||||
end
|
||||
|
||||
def description
|
||||
@@ -62,29 +57,17 @@ class Poll::Question < ActiveRecord::Base
|
||||
self.title = proposal.title
|
||||
self.description = proposal.description
|
||||
self.summary = proposal.summary
|
||||
self.all_geozones = true
|
||||
self.valid_answers = I18n.t('poll_questions.default_valid_answers')
|
||||
end
|
||||
end
|
||||
|
||||
def answerable_by?(user)
|
||||
poll.answerable_by?(user) && (self.all_geozones || self.geozone_ids.include?(user.geozone_id))
|
||||
poll.answerable_by?(user)
|
||||
end
|
||||
|
||||
def self.answerable_by(user)
|
||||
return none if user.nil? || user.unverified?
|
||||
|
||||
where(poll_id: answerable_polls(user),
|
||||
geozones: { id: answerable_geozones(user) }).
|
||||
joins(:geozones)
|
||||
end
|
||||
|
||||
def self.answerable_polls(user)
|
||||
Poll.answerable_by(user)
|
||||
end
|
||||
|
||||
def self.answerable_geozones(user)
|
||||
user.geozone || Geozone.city
|
||||
where(poll_id: Poll.answerable_by(user).pluck(:id))
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -1,34 +1,46 @@
|
||||
<%= form_for [:admin, @poll] do |f| %>
|
||||
<div class="row">
|
||||
<div class="small-12 medium-6 column">
|
||||
<%= f.text_field :name,
|
||||
placeholder: t('admin.polls.form.name'),
|
||||
label: t("admin.polls.form.name") %>
|
||||
<%= f.text_field :name %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="small-12 medium-6 column">
|
||||
<%= f.label :starts_at, t("admin.polls.form.starts_at") %>
|
||||
<%= f.text_field :starts_at,
|
||||
label: false,
|
||||
value: @poll.starts_at.present? ? l(@poll.starts_at.to_date) : nil,
|
||||
class: "js-calendar-full" %>
|
||||
</div>
|
||||
|
||||
<div class="small-12 medium-6 column">
|
||||
<%= f.label :ends_at, t("admin.polls.form.ends_at") %>
|
||||
<%= f.text_field :ends_at,
|
||||
label: false,
|
||||
value: @poll.ends_at.present? ? l(@poll.ends_at.to_date) : nil,
|
||||
class: "js-calendar-full" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="small-6 medium-6 column">
|
||||
<%= f.check_box :geozone_restricted, data: { checkbox_toggle: "#geozones" } %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="geozones" style="<%= @poll.geozone_restricted? ? '' : 'display:none' %>">
|
||||
<div class="row">
|
||||
<%= f.collection_check_boxes(:geozone_ids, @geozones, :id, :name) do |b| %>
|
||||
<div class="small-6 medium-3 column">
|
||||
<%= b.label do %>
|
||||
<%= b.check_box + b.text %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="small-12 medium-4 column">
|
||||
<%= f.submit t("admin.polls.#{admin_submit_action(@poll)}.submit_button"),
|
||||
class: "button success expanded" %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@@ -6,9 +6,15 @@
|
||||
<%= @poll.name %>
|
||||
</h2>
|
||||
<br>
|
||||
<p class="inline-block">
|
||||
<span>
|
||||
(<%= l @poll.starts_at.to_date %> - <%= l @poll.ends_at.to_date %>)
|
||||
</p>
|
||||
</span>
|
||||
<% if @poll.geozone_restricted %>
|
||||
<span class="bullet"> • </span>
|
||||
<span>
|
||||
<%= @poll.geozones.pluck(:name).to_sentence %>
|
||||
<span>
|
||||
<% end %>
|
||||
|
||||
<div id="poll-resources" class="tabs-content" data-tabs-content="assigned-resources-tabs">
|
||||
<%= render "filter_subnav" %>
|
||||
@@ -27,4 +33,4 @@
|
||||
<%= render "search_officers" %>
|
||||
<%= render 'officers' %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -29,17 +29,6 @@
|
||||
ckeditor: { language: I18n.locale } %>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<%= f.collection_check_boxes(:geozone_ids, @geozones, :id, :name) do |b| %>
|
||||
<div class="small-6 medium-3 column">
|
||||
<%= b.label do %>
|
||||
<%= b.check_box + b.text %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<%# TODO include all link %>
|
||||
|
||||
<div class="row">
|
||||
<div class="actions small-12 medium-4 column margin-top">
|
||||
<%= f.submit(class: "button expanded", value: t("shared.save")) %>
|
||||
@@ -48,4 +37,4 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@@ -46,15 +46,6 @@
|
||||
<%= @question.description %>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong><%= t("admin.questions.show.geozones") %></strong>
|
||||
<br>
|
||||
<% @question.geozones.each do |geozone| %>
|
||||
<span class="geozone">
|
||||
<%= geozone.name %>
|
||||
</span>
|
||||
<% end %>
|
||||
</p>
|
||||
|
||||
<%= link_to t("admin.questions.show.preview"), question_path(@question) %>
|
||||
</div>
|
||||
|
||||
@@ -14,12 +14,6 @@
|
||||
<% end %>
|
||||
|
||||
<p><%= @question.summary %></p>
|
||||
|
||||
<ul class="no-bullet margin-top tags">
|
||||
<% @question.geozones.each do |g| %>
|
||||
<li class="inline-block"><span><%= g.name %></span></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="small-12 medium-3 column info">
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
<%= t("polls.show.question_count_html",
|
||||
count: @poll.questions.count) %>
|
||||
</p>
|
||||
<ul class="no-bullet margin-top tags">
|
||||
<% @poll.geozones.each do |g| %>
|
||||
<li class="inline-block"><span><%= g.name %></span></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
|
||||
<%= render "callout" %>
|
||||
</div>
|
||||
@@ -30,21 +35,7 @@
|
||||
|
||||
<div class="row margin-top">
|
||||
<div class="small-12 medium-9 column">
|
||||
<% @answerable_questions.each do |question| %>
|
||||
<%= render 'polls/questions/question', question: question %>
|
||||
<% end %>
|
||||
|
||||
<% if can?(:answer, @poll) &&
|
||||
@non_answerable_questions.present? %>
|
||||
<div class="callout warning margin-top">
|
||||
<h2 class="questions-callout">
|
||||
<%= t("polls.show.cant_answer_wrong_geozone",
|
||||
count: @non_answerable_questions.count) %>
|
||||
</h2>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% @non_answerable_questions.each do |question| %>
|
||||
<% @questions.each do |question| %>
|
||||
<%= render 'polls/questions/question', question: question %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
@@ -105,6 +105,11 @@ en:
|
||||
external_url: "Link to additional documentation"
|
||||
geozone_id: "Scope of operation"
|
||||
title: "Title"
|
||||
poll:
|
||||
name: "Name"
|
||||
starts_at: "Start Date"
|
||||
ends_at: "Closing Date"
|
||||
geozone_restricted: "Restricted by geozone"
|
||||
poll/question:
|
||||
title: "Question"
|
||||
valid_answers: "Posibles answers"
|
||||
|
||||
@@ -100,6 +100,11 @@ es:
|
||||
external_url: "Enlace a documentación adicional"
|
||||
geozone_id: "Ámbito de actuación"
|
||||
title: "Título"
|
||||
poll:
|
||||
name: "Nombre"
|
||||
starts_at: "Fecha de apertura"
|
||||
ends_at: "Fecha de cierre"
|
||||
geozone_restricted: "Restringida por zonas"
|
||||
poll/question:
|
||||
title: "Pregunta"
|
||||
valid_answers: "Posibles respuestas"
|
||||
|
||||
@@ -301,10 +301,6 @@ en:
|
||||
edit:
|
||||
title: "Edit poll"
|
||||
submit_button: "Update poll"
|
||||
form:
|
||||
name: "Name"
|
||||
starts_at: "Open date"
|
||||
ends_at: "Close date"
|
||||
show:
|
||||
questions_tab: Questions
|
||||
booths_tab: Booths
|
||||
@@ -357,7 +353,6 @@ en:
|
||||
valid_answers: Valid answers
|
||||
summary: Summary
|
||||
description: Description
|
||||
geozones: Geozones
|
||||
preview: View on website
|
||||
booths:
|
||||
index:
|
||||
|
||||
@@ -301,10 +301,6 @@ es:
|
||||
edit:
|
||||
title: "Editar votación"
|
||||
submit_button: "Actualizar votación"
|
||||
form:
|
||||
name: "Nombre"
|
||||
starts_at: "Fecha de apertura"
|
||||
ends_at: "Fecha de cierre"
|
||||
show:
|
||||
questions_tab: Preguntas
|
||||
booths_tab: Urnas
|
||||
@@ -357,7 +353,6 @@ es:
|
||||
valid_answers: Respuestas válidas
|
||||
summary: Resumen
|
||||
description: Descripción
|
||||
geozones: Distritos
|
||||
preview: Ver en la web
|
||||
booths:
|
||||
index:
|
||||
|
||||
@@ -411,7 +411,6 @@ en:
|
||||
verify_link: "verify your account"
|
||||
cant_answer_incoming: "This poll has not yet started."
|
||||
cant_answer_expired: "This poll has finished."
|
||||
cant_answer_wrong_geozone: "You can't answers the following %{count} questions because are not available in your geozone."
|
||||
question_count_html: "This poll has a total of <strong>%{count} qeustions</strong>."
|
||||
poll_questions:
|
||||
create_question: "Create question"
|
||||
|
||||
@@ -411,7 +411,6 @@ es:
|
||||
verify_link: "verifica tu cuenta"
|
||||
cant_answer_incoming: "Esta votación todavía no ha comenzado."
|
||||
cant_answer_expired: "Esta votación ha terminado."
|
||||
cant_answer_wrong_geozone: "No puedes responder a las siguientes %{count} preguntas porque no están disponibles en tu zona:"
|
||||
question_count_html: "Esta votación tiene un total de <strong>%{count} preguntas</strong>."
|
||||
poll_questions:
|
||||
create_question: "Crear pregunta para votación"
|
||||
|
||||
@@ -466,27 +466,32 @@ end
|
||||
|
||||
puts "Creating polls"
|
||||
|
||||
puts "Active Poll"
|
||||
poll = Poll.create(name: "Poll 1",
|
||||
starts_at: 1.month.ago,
|
||||
ends_at: 1.month.from_now)
|
||||
puts " #{poll.name}"
|
||||
puts "Active Polls"
|
||||
(1..5).each do |i|
|
||||
poll = Poll.create(name: "Active Poll #{i}",
|
||||
starts_at: 1.month.ago,
|
||||
ends_at: 1.month.from_now,
|
||||
geozone_restricted: true,
|
||||
geozones: Geozone.reorder("RANDOM()").limit(3)
|
||||
)
|
||||
puts " #{poll.name}"
|
||||
end
|
||||
|
||||
puts "Upcoming Poll"
|
||||
poll = Poll.create(name: "Poll 2",
|
||||
poll = Poll.create(name: "Upcoming Poll",
|
||||
starts_at: 1.month.from_now,
|
||||
ends_at: 2.months.from_now)
|
||||
puts " #{poll.name}"
|
||||
|
||||
puts "Expired Poll"
|
||||
poll = Poll.create(name: "Poll 3",
|
||||
poll = Poll.create(name: "Expired Poll",
|
||||
starts_at: 2.months.ago,
|
||||
ends_at: 1.months.ago)
|
||||
puts " #{poll.name}"
|
||||
|
||||
puts "Creating Poll Questions"
|
||||
|
||||
(1..20).each do |i|
|
||||
(1..50).each do |i|
|
||||
poll = Poll.reorder("RANDOM()").first
|
||||
author = User.reorder("RANDOM()").first
|
||||
description = "<p>#{Faker::Lorem.paragraphs.join('</p><p>')}</p>"
|
||||
@@ -496,14 +501,12 @@ puts "Creating Poll Questions"
|
||||
summary: Faker::Lorem.sentence(3),
|
||||
description: description,
|
||||
valid_answers: Faker::Lorem.words(3).join(', '),
|
||||
poll: poll,
|
||||
geozones: Geozone.reorder("RANDOM()").limit(3),
|
||||
all_geozones: [true, false].sample)
|
||||
poll: poll)
|
||||
puts " #{question.title}"
|
||||
end
|
||||
|
||||
puts "Creating Poll Booths"
|
||||
10.times.each_with_index do |i|
|
||||
30.times.each_with_index do |i|
|
||||
Poll::Booth.create(name: "Booth #{i}", polls: [Poll.all.sample])
|
||||
end
|
||||
|
||||
@@ -515,7 +518,7 @@ end
|
||||
puts "Creating Poll Officer Assignments"
|
||||
(1..10).to_a.sample.times do |i|
|
||||
Poll::BoothAssignment.all.sample(i).each do |booth_assignment|
|
||||
Poll::OfficerAssignment.create(officer: poll_officer,
|
||||
Poll::OfficerAssignment.create(officer: poll_officer.poll_officer,
|
||||
booth_assignment: booth_assignment,
|
||||
date: booth_assignment.poll.starts_at)
|
||||
end
|
||||
@@ -523,7 +526,7 @@ end
|
||||
|
||||
puts "Creating Poll Question from Proposals"
|
||||
|
||||
(1..3).each do |i|
|
||||
(1..3).each do
|
||||
proposal = Proposal.reorder("RANDOM()").first
|
||||
poll = Poll.current.first
|
||||
question = Poll::Question.create(valid_answers: "Yes, No")
|
||||
@@ -535,7 +538,7 @@ end
|
||||
|
||||
puts "Creating Successful Proposals"
|
||||
|
||||
(1..10).each do |i|
|
||||
(1..10).each do
|
||||
proposal = Proposal.reorder("RANDOM()").first
|
||||
poll = Poll.current.first
|
||||
question = Poll::Question.create(valid_answers: "Yes, No")
|
||||
@@ -547,11 +550,11 @@ end
|
||||
|
||||
puts "Commenting Poll Questions"
|
||||
|
||||
(1..30).each do |i|
|
||||
(1..30).each do
|
||||
author = User.reorder("RANDOM()").first
|
||||
question = Poll::Question.reorder("RANDOM()").first
|
||||
Comment.create!(user: author,
|
||||
created_at: rand(question.created_at .. Time.current),
|
||||
commentable: question,
|
||||
body: Faker::Lorem.sentence)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
class MoveGeozonesFromPollQuestionsToPolls < ActiveRecord::Migration
|
||||
def change
|
||||
drop_table :geozones_poll_questions
|
||||
|
||||
create_table :geozones_polls do |t|
|
||||
t.references :geozone, index: true, foreign_key: true
|
||||
t.references :poll, index: true, foreign_key: true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
class AddGeozoneRestrictedToPolls < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :polls, :geozone_restricted, :boolean, default: false, index: true
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
class RemoveAllGeozonesFromPollQuestions < ActiveRecord::Migration
|
||||
def change
|
||||
remove_column :poll_questions, :all_geozones, :boolean
|
||||
end
|
||||
end
|
||||
18
db/schema.rb
18
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: 20170114154421) do
|
||||
ActiveRecord::Schema.define(version: 20170120164547) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
@@ -307,13 +307,13 @@ ActiveRecord::Schema.define(version: 20170114154421) do
|
||||
t.string "census_code"
|
||||
end
|
||||
|
||||
create_table "geozones_poll_questions", force: :cascade do |t|
|
||||
create_table "geozones_polls", force: :cascade do |t|
|
||||
t.integer "geozone_id"
|
||||
t.integer "question_id"
|
||||
t.integer "poll_id"
|
||||
end
|
||||
|
||||
add_index "geozones_poll_questions", ["geozone_id"], name: "index_geozones_poll_questions_on_geozone_id", using: :btree
|
||||
add_index "geozones_poll_questions", ["question_id"], name: "index_geozones_poll_questions_on_question_id", using: :btree
|
||||
add_index "geozones_polls", ["geozone_id"], name: "index_geozones_polls_on_geozone_id", using: :btree
|
||||
add_index "geozones_polls", ["poll_id"], name: "index_geozones_polls_on_poll_id", using: :btree
|
||||
|
||||
create_table "identities", force: :cascade do |t|
|
||||
t.integer "user_id"
|
||||
@@ -424,7 +424,6 @@ ActiveRecord::Schema.define(version: 20170114154421) do
|
||||
t.datetime "hidden_at"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.boolean "all_geozones", default: false
|
||||
t.tsvector "tsv"
|
||||
end
|
||||
|
||||
@@ -459,7 +458,8 @@ ActiveRecord::Schema.define(version: 20170114154421) do
|
||||
t.string "name"
|
||||
t.datetime "starts_at"
|
||||
t.datetime "ends_at"
|
||||
t.boolean "published", default: false
|
||||
t.boolean "published", default: false
|
||||
t.boolean "geozone_restricted", default: false
|
||||
end
|
||||
|
||||
create_table "proposal_notifications", force: :cascade do |t|
|
||||
@@ -768,8 +768,8 @@ ActiveRecord::Schema.define(version: 20170114154421) do
|
||||
add_foreign_key "annotations", "users"
|
||||
add_foreign_key "failed_census_calls", "users"
|
||||
add_foreign_key "flags", "users"
|
||||
add_foreign_key "geozones_poll_questions", "geozones"
|
||||
add_foreign_key "geozones_poll_questions", "poll_questions", column: "question_id"
|
||||
add_foreign_key "geozones_polls", "geozones"
|
||||
add_foreign_key "geozones_polls", "polls"
|
||||
add_foreign_key "identities", "users"
|
||||
add_foreign_key "locks", "users"
|
||||
add_foreign_key "managers", "users"
|
||||
|
||||
@@ -18,7 +18,8 @@ feature 'Admin poll questions' do
|
||||
|
||||
scenario 'Show' do
|
||||
geozone = create(:geozone)
|
||||
question = create(:poll_question, geozone_ids: geozone.id)
|
||||
poll = create(:poll, geozone_restricted: true, geozone_ids: [geozone.id])
|
||||
question = create(:poll_question, poll: poll)
|
||||
|
||||
visit admin_question_path(question)
|
||||
|
||||
@@ -27,10 +28,10 @@ feature 'Admin poll questions' do
|
||||
expect(page).to have_content(question.summary)
|
||||
expect(page).to have_content(question.author.name)
|
||||
expect(page).to have_content(question.valid_answers.join(" "))
|
||||
expect(page).to have_content(geozone.name)
|
||||
end
|
||||
|
||||
scenario 'Create' do
|
||||
poll = create(:poll, name: 'Movies')
|
||||
title = "Star Wars: Episode IV - A New Hope"
|
||||
summary = "It is a period of civil war. Rebel spaceships, striking from a hidden base, have won their first victory against the evil Galactic Empire"
|
||||
description = %{
|
||||
@@ -41,6 +42,7 @@ feature 'Admin poll questions' do
|
||||
visit admin_questions_path
|
||||
click_link "Create question"
|
||||
|
||||
select 'Movies', from: 'poll_question_poll_id'
|
||||
fill_in 'poll_question_title', with: title
|
||||
fill_in 'poll_question_summary', with: summary
|
||||
fill_in 'poll_question_description', with: description
|
||||
@@ -53,7 +55,7 @@ feature 'Admin poll questions' do
|
||||
end
|
||||
|
||||
scenario 'Create from successful proposal index' do
|
||||
geozones = create_list(:geozone, 3)
|
||||
poll = create(:poll, name: 'Proposals')
|
||||
proposal = create(:proposal, :successful)
|
||||
|
||||
visit proposals_path
|
||||
@@ -65,6 +67,8 @@ feature 'Admin poll questions' do
|
||||
expect(page).to have_field('poll_question_description', with: proposal.description)
|
||||
expect(page).to have_field('poll_question_valid_answers', with: "Yes, No")
|
||||
|
||||
select 'Proposals', from: 'poll_question_poll_id'
|
||||
|
||||
click_button 'Save'
|
||||
|
||||
expect(page).to have_content(proposal.title)
|
||||
@@ -115,4 +119,4 @@ feature 'Admin poll questions' do
|
||||
|
||||
pending "Mark all city by default when creating a poll question from a successful proposal"
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -82,7 +82,9 @@ feature 'Polls' do
|
||||
end
|
||||
|
||||
scenario 'Level 1 users' do
|
||||
create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
|
||||
poll.update(geozone_restricted: true)
|
||||
poll.geozones << geozone
|
||||
create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
login_as(create(:user, geozone: geozone))
|
||||
visit poll_path(poll)
|
||||
|
||||
@@ -96,8 +98,9 @@ feature 'Polls' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users in an incoming poll' do
|
||||
incoming_poll = create(:poll, :incoming)
|
||||
create(:poll_question, poll: incoming_poll, geozone_ids: [geozone.id], valid_answers: 'Rey, Finn')
|
||||
incoming_poll = create(:poll, :incoming, geozone_restricted: true)
|
||||
incoming_poll.geozones << geozone
|
||||
create(:poll_question, poll: incoming_poll, valid_answers: 'Rey, Finn')
|
||||
login_as(create(:user, :level_two, geozone: geozone))
|
||||
|
||||
visit poll_path(incoming_poll)
|
||||
@@ -111,8 +114,9 @@ feature 'Polls' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users in an expired poll' do
|
||||
expired_poll = create(:poll, :expired)
|
||||
create(:poll_question, poll: expired_poll, geozone_ids: [geozone.id], valid_answers: 'Luke, Leia')
|
||||
expired_poll = create(:poll, :expired, geozone_restricted: true)
|
||||
expired_poll.geozones << geozone
|
||||
create(:poll_question, poll: expired_poll, valid_answers: 'Luke, Leia')
|
||||
login_as(create(:user, :level_two, geozone: geozone))
|
||||
|
||||
visit poll_path(expired_poll)
|
||||
@@ -126,21 +130,23 @@ feature 'Polls' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users in a poll with questions for a geozone which is not theirs' do
|
||||
create(:poll_question, poll: poll, geozone_ids: [], valid_answers: 'Vader, Palpatine')
|
||||
poll.update(geozone_restricted: true)
|
||||
poll.geozones << create(:geozone)
|
||||
create(:poll_question, poll: poll, valid_answers: 'Vader, Palpatine')
|
||||
login_as(create(:user, :level_two))
|
||||
|
||||
visit poll_path(poll)
|
||||
|
||||
expect(page).to have_content("You can't answers the following 1 questions because are not available in your geozone.")
|
||||
|
||||
expect(page).to have_content('Vader')
|
||||
expect(page).to have_content('Palpatine')
|
||||
expect(page).to_not have_link('Vader')
|
||||
expect(page).to_not have_link('Palpatine')
|
||||
end
|
||||
|
||||
scenario 'Level 2 users reading a same-geozone question' do
|
||||
create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
|
||||
scenario 'Level 2 users reading a same-geozone poll' do
|
||||
poll.update(geozone_restricted: true)
|
||||
poll.geozones << geozone
|
||||
create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
login_as(create(:user, :level_two, geozone: geozone))
|
||||
visit poll_path(poll)
|
||||
|
||||
@@ -148,9 +154,9 @@ feature 'Polls' do
|
||||
expect(page).to have_link('Chewbacca')
|
||||
end
|
||||
|
||||
scenario 'Level 2 users reading a all-geozones question' do
|
||||
create(:poll_question, poll: poll, all_geozones: true, valid_answers: 'Han Solo, Chewbacca')
|
||||
login_as(create(:user, :level_two, geozone: geozone))
|
||||
scenario 'Level 2 users reading a all-geozones poll' do
|
||||
create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
login_as(create(:user, :level_two))
|
||||
visit poll_path(poll)
|
||||
|
||||
expect(page).to have_link('Han Solo')
|
||||
@@ -158,8 +164,8 @@ feature 'Polls' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users who have already answered' do
|
||||
question = create(:poll_question, poll: poll, geozone_ids:[geozone.id], valid_answers: 'Han Solo, Chewbacca')
|
||||
user = create(:user, :level_two, geozone: geozone)
|
||||
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
user = create(:user, :level_two)
|
||||
create(:poll_partial_result, question: question, author: user, answer: 'Chewbacca')
|
||||
|
||||
login_as user
|
||||
@@ -171,7 +177,9 @@ feature 'Polls' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users answering', :js do
|
||||
create(:poll_question, poll: poll, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
|
||||
poll.update(geozone_restricted: true)
|
||||
poll.geozones << geozone
|
||||
create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
user = create(:user, :level_two, geozone: geozone)
|
||||
login_as user
|
||||
visit poll_path(poll)
|
||||
@@ -183,4 +191,4 @@ feature 'Polls' do
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -14,7 +14,7 @@ feature 'Poll Questions' do
|
||||
|
||||
context 'Answering' do
|
||||
let(:geozone) { create(:geozone) }
|
||||
|
||||
let(:poll) { create(:poll, geozone_restricted: true, geozone_ids: [geozone.id]) }
|
||||
scenario 'Non-logged in users' do
|
||||
question = create(:poll_question, valid_answers: 'Han Solo, Chewbacca')
|
||||
|
||||
@@ -29,7 +29,7 @@ feature 'Poll Questions' do
|
||||
end
|
||||
|
||||
scenario 'Level 1 users' do
|
||||
question = create(:poll_question, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
|
||||
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
|
||||
login_as(create(:user, geozone: geozone))
|
||||
visit question_path(question)
|
||||
@@ -43,9 +43,11 @@ feature 'Poll Questions' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users in an poll question for a geozone which is not theirs' do
|
||||
question = create(:poll_question, geozone_ids: [], valid_answers: 'Vader, Palpatine')
|
||||
|
||||
login_as(create(:user, :level_two))
|
||||
other_poll = create(:poll, geozone_restricted: true, geozone_ids: [create(:geozone).id])
|
||||
question = create(:poll_question, poll: other_poll, valid_answers: 'Vader, Palpatine')
|
||||
|
||||
login_as(create(:user, :level_two, geozone: geozone))
|
||||
visit question_path(question)
|
||||
|
||||
expect(page).to have_content('Vader')
|
||||
@@ -55,7 +57,7 @@ feature 'Poll Questions' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users who can answer' do
|
||||
question = create(:poll_question, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
|
||||
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
|
||||
login_as(create(:user, :level_two, geozone: geozone))
|
||||
visit question_path(question)
|
||||
@@ -65,7 +67,7 @@ feature 'Poll Questions' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users who have already answered' do
|
||||
question = create(:poll_question, geozone_ids:[geozone.id], valid_answers: 'Han Solo, Chewbacca')
|
||||
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
|
||||
user = create(:user, :level_two, geozone: geozone)
|
||||
create(:poll_partial_result, question: question, author: user, answer: 'Chewbacca')
|
||||
@@ -79,7 +81,7 @@ feature 'Poll Questions' do
|
||||
end
|
||||
|
||||
scenario 'Level 2 users answering', :js do
|
||||
question = create(:poll_question, geozone_ids: [geozone.id], valid_answers: 'Han Solo, Chewbacca')
|
||||
question = create(:poll_question, poll: poll, valid_answers: 'Han Solo, Chewbacca')
|
||||
user = create(:user, :level_two, geozone: geozone)
|
||||
|
||||
login_as user
|
||||
@@ -92,4 +94,4 @@ feature 'Poll Questions' do
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -27,19 +27,26 @@ describe "Abilities::Common" do
|
||||
|
||||
let(:current_poll) { create(:poll) }
|
||||
let(:incoming_poll) { create(:poll, :incoming) }
|
||||
let(:incoming_poll_from_own_geozone) { create(:poll, :incoming, geozone_restricted: true, geozones: [geozone]) }
|
||||
let(:incoming_poll_from_other_geozone) { create(:poll, :incoming, geozone_restricted: true, geozones: [create(:geozone)]) }
|
||||
let(:expired_poll) { create(:poll, :expired) }
|
||||
let(:expired_poll_from_own_geozone) { create(:poll, :expired, geozone_restricted: true, geozones: [geozone]) }
|
||||
let(:expired_poll_from_other_geozone) { create(:poll, :expired, geozone_restricted: true, geozones: [create(:geozone)]) }
|
||||
let(:poll) { create(:poll, geozone_restricted: false) }
|
||||
let(:poll_from_own_geozone) { create(:poll, geozone_restricted: true, geozones: [geozone]) }
|
||||
let(:poll_from_other_geozone) { create(:poll, geozone_restricted: true, geozones: [create(:geozone)]) }
|
||||
|
||||
let(:poll_question_from_own_geozone) { create(:poll_question, geozones: [geozone]) }
|
||||
let(:poll_question_from_other_geozone) { create(:poll_question, geozones: [create(:geozone)]) }
|
||||
let(:poll_question_from_all_geozones) { create(:poll_question, all_geozones: true) }
|
||||
let(:poll_question_from_own_geozone) { create(:poll_question, poll: poll_from_own_geozone) }
|
||||
let(:poll_question_from_other_geozone) { create(:poll_question, poll: poll_from_other_geozone) }
|
||||
let(:poll_question_from_all_geozones) { create(:poll_question, poll: poll) }
|
||||
|
||||
let(:expired_poll_question_from_own_geozone) { create(:poll_question, poll: expired_poll, geozones: [geozone]) }
|
||||
let(:expired_poll_question_from_other_geozone) { create(:poll_question, poll: expired_poll, geozones: [create(:geozone)]) }
|
||||
let(:expired_poll_question_from_all_geozones) { create(:poll_question, poll: expired_poll, all_geozones: true) }
|
||||
let(:expired_poll_question_from_own_geozone) { create(:poll_question, poll: expired_poll_from_own_geozone) }
|
||||
let(:expired_poll_question_from_other_geozone) { create(:poll_question, poll: expired_poll_from_other_geozone) }
|
||||
let(:expired_poll_question_from_all_geozones) { create(:poll_question, poll: expired_poll) }
|
||||
|
||||
let(:incoming_poll_question_from_own_geozone) { create(:poll_question, poll: incoming_poll, geozones: [geozone]) }
|
||||
let(:incoming_poll_question_from_other_geozone) { create(:poll_question, poll: incoming_poll, geozones: [create(:geozone)]) }
|
||||
let(:incoming_poll_question_from_all_geozones) { create(:poll_question, poll: incoming_poll, all_geozones: true) }
|
||||
let(:incoming_poll_question_from_own_geozone) { create(:poll_question, poll: incoming_poll_from_own_geozone) }
|
||||
let(:incoming_poll_question_from_other_geozone) { create(:poll_question, poll: incoming_poll_from_other_geozone) }
|
||||
let(:incoming_poll_question_from_all_geozones) { create(:poll_question, poll: incoming_poll) }
|
||||
|
||||
it { should be_able_to(:index, Debate) }
|
||||
it { should be_able_to(:show, debate) }
|
||||
|
||||
@@ -20,7 +20,6 @@ RSpec.describe Poll::Question, type: :model do
|
||||
expect(q.author_visible_name).to eq(p.author.name)
|
||||
expect(q.proposal_id).to eq(p.id)
|
||||
expect(q.title).to eq(p.title)
|
||||
expect(q.all_geozones).to be true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user