Using `setseed` and ordering by `RAND()` doesn't always return the same
results because, although the generated random numbers will always be
the same, PostgreSQL doesn't guarantee the order of the rows it will
apply those random numbers to, similar to the way it doesn't guarantee
an order when the `ORDER BY` clause isn't specified.
Using something like `reorder("legislation_proposals.id % #{seed}")`,
like we do in budget investments, is certainly more elegant but it makes
the test checking two users get different results fail sometimes, so
that approach might need some adjustments in order to make the results
more random.
139 lines
3.6 KiB
Ruby
139 lines
3.6 KiB
Ruby
class Legislation::ProcessesController < Legislation::BaseController
|
|
has_filters %w[open past], only: :index
|
|
has_filters %w[random winners], only: :proposals
|
|
|
|
load_and_authorize_resource
|
|
|
|
before_action :set_random_seed, only: :proposals
|
|
|
|
def index
|
|
@current_filter ||= 'open'
|
|
@processes = ::Legislation::Process.send(@current_filter).published
|
|
.not_in_draft.order(start_date: :desc).page(params[:page])
|
|
end
|
|
|
|
def show
|
|
draft_version = @process.draft_versions.published.last
|
|
allegations_phase = @process.allegations_phase
|
|
|
|
if @process.homepage_enabled? && @process.homepage.present?
|
|
render :show
|
|
elsif allegations_phase.enabled? && allegations_phase.started? && draft_version.present?
|
|
redirect_to legislation_process_draft_version_path(@process, draft_version)
|
|
elsif @process.debate_phase.enabled?
|
|
redirect_to debate_legislation_process_path(@process)
|
|
elsif @process.proposals_phase.enabled?
|
|
redirect_to proposals_legislation_process_path(@process)
|
|
else
|
|
redirect_to allegations_legislation_process_path(@process)
|
|
end
|
|
end
|
|
|
|
def debate
|
|
set_process
|
|
@phase = :debate_phase
|
|
|
|
if @process.debate_phase.started? || (current_user && current_user.administrator?)
|
|
render :debate
|
|
else
|
|
render :phase_not_open
|
|
end
|
|
end
|
|
|
|
def draft_publication
|
|
set_process
|
|
@phase = :draft_publication
|
|
|
|
if @process.draft_publication.started?
|
|
draft_version = @process.draft_versions.published.last
|
|
|
|
if draft_version.present?
|
|
redirect_to legislation_process_draft_version_path(@process, draft_version)
|
|
else
|
|
render :phase_empty
|
|
end
|
|
else
|
|
render :phase_not_open
|
|
end
|
|
end
|
|
|
|
def allegations
|
|
set_process
|
|
@phase = :allegations_phase
|
|
|
|
if @process.allegations_phase.started?
|
|
draft_version = @process.draft_versions.published.last
|
|
|
|
if draft_version.present?
|
|
redirect_to legislation_process_draft_version_path(@process, draft_version)
|
|
else
|
|
render :phase_empty
|
|
end
|
|
else
|
|
render :phase_not_open
|
|
end
|
|
end
|
|
|
|
def result_publication
|
|
set_process
|
|
@phase = :result_publication
|
|
|
|
if @process.result_publication.started?
|
|
final_version = @process.final_draft_version
|
|
|
|
if final_version.present?
|
|
redirect_to legislation_process_draft_version_path(@process, final_version)
|
|
else
|
|
render :phase_empty
|
|
end
|
|
else
|
|
render :phase_not_open
|
|
end
|
|
end
|
|
|
|
def milestones
|
|
@phase = :milestones
|
|
end
|
|
|
|
def proposals
|
|
set_process
|
|
@phase = :proposals_phase
|
|
|
|
@proposals = ::Legislation::Proposal.where(process: @process)
|
|
@proposals = @proposals.search(params[:search]) if params[:search].present?
|
|
|
|
@current_filter = "winners" if params[:filter].blank? && @proposals.winners.any?
|
|
|
|
if @current_filter == "random"
|
|
@proposals = @proposals.send(@current_filter, session[:random_seed]).page(params[:page])
|
|
else
|
|
@proposals = @proposals.send(@current_filter).page(params[:page])
|
|
end
|
|
|
|
if @process.proposals_phase.started? || (current_user && current_user.administrator?)
|
|
legislation_proposal_votes(@proposals)
|
|
render :proposals
|
|
else
|
|
render :phase_not_open
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def member_method?
|
|
params[:id].present?
|
|
end
|
|
|
|
def set_process
|
|
return if member_method?
|
|
@process = ::Legislation::Process.find(params[:process_id])
|
|
end
|
|
|
|
def set_random_seed
|
|
seed = (params[:random_seed] || session[:random_seed] || rand(10_000_000)).to_i
|
|
|
|
session[:random_seed] = seed
|
|
params[:random_seed] = seed
|
|
end
|
|
end
|