This method was added in Rails 7.0 and makes the code slihgtly more readable. The downside is that it generates two queries instead of one, so it might generate some confusion when debugging SQL queries. Its impact on performance is probably negligible.
194 lines
5.4 KiB
Ruby
194 lines
5.4 KiB
Ruby
class ProposalsController < ApplicationController
|
|
include FeatureFlags
|
|
include CommentableActions
|
|
include FlagActions
|
|
include ImageAttributes
|
|
include DocumentAttributes
|
|
include MapLocationAttributes
|
|
include Translatable
|
|
|
|
before_action :load_categories, only: [:index, :map, :summary]
|
|
before_action :load_geozones, only: [:edit, :map, :summary]
|
|
before_action :authenticate_user!, except: [:index, :show, :map, :summary]
|
|
before_action :set_view, only: :index
|
|
before_action :proposals_recommendations, only: :index, if: :current_user
|
|
|
|
feature_flag :proposals
|
|
|
|
invisible_captcha only: [:create, :update], honeypot: :subtitle
|
|
|
|
has_orders ->(c) { Proposal.proposals_orders(c.current_user) }, only: :index
|
|
has_orders %w[most_voted newest oldest], only: :show
|
|
|
|
load_and_authorize_resource
|
|
before_action :destroy_map_location_association, only: :update
|
|
|
|
helper_method :resource_model, :resource_name
|
|
respond_to :html, :js
|
|
|
|
def show
|
|
super
|
|
@notifications = @proposal.notifications
|
|
@notifications = @proposal.notifications.not_moderated
|
|
|
|
if request.path != proposal_path(@proposal)
|
|
redirect_to proposal_path(@proposal), status: :moved_permanently
|
|
end
|
|
end
|
|
|
|
def create
|
|
@proposal = Proposal.new(proposal_params.merge(author: current_user))
|
|
if @proposal.save
|
|
redirect_to created_proposal_path(@proposal), notice: I18n.t("flash.actions.create.proposal")
|
|
else
|
|
render :new
|
|
end
|
|
end
|
|
|
|
def created; end
|
|
|
|
def index_customization
|
|
discard_draft
|
|
discard_archived
|
|
load_retired
|
|
load_selected
|
|
load_featured
|
|
remove_archived_from_order_links
|
|
end
|
|
|
|
def vote
|
|
@follow = Follow.find_or_create_by!(user: current_user, followable: @proposal)
|
|
@proposal.register_vote(current_user, "yes")
|
|
end
|
|
|
|
def retire
|
|
if @proposal.update(retired_params.merge(retired_at: Time.current))
|
|
redirect_to proposal_path(@proposal), notice: t("proposals.notice.retired")
|
|
else
|
|
render action: :retire_form
|
|
end
|
|
end
|
|
|
|
def retire_form
|
|
end
|
|
|
|
def summary
|
|
@proposals = Proposal.for_summary
|
|
@tag_cloud = tag_cloud
|
|
end
|
|
|
|
def map
|
|
@proposal = Proposal.new
|
|
@tag_cloud = tag_cloud
|
|
end
|
|
|
|
def disable_recommendations
|
|
if current_user.update(recommended_proposals: false)
|
|
redirect_to proposals_path, notice: t("proposals.index.recommendations.actions.success")
|
|
else
|
|
redirect_to proposals_path, error: t("proposals.index.recommendations.actions.error")
|
|
end
|
|
end
|
|
|
|
def publish
|
|
@proposal.publish
|
|
redirect_to share_proposal_path(@proposal), notice: t("proposals.notice.published")
|
|
end
|
|
|
|
private
|
|
|
|
def proposal_params
|
|
params.require(:proposal).permit(allowed_params)
|
|
end
|
|
|
|
def allowed_params
|
|
attributes = [:video_url, :responsible_name, :tag_list, :terms_of_service,
|
|
:geozone_id, :related_sdg_list,
|
|
image_attributes: image_attributes,
|
|
documents_attributes: document_attributes,
|
|
map_location_attributes: map_location_attributes]
|
|
translations_attributes = translation_params(Proposal, except: :retired_explanation)
|
|
|
|
[*attributes, translations_attributes]
|
|
end
|
|
|
|
def retired_params
|
|
params.require(:proposal).permit(allowed_retired_params)
|
|
end
|
|
|
|
def allowed_retired_params
|
|
[:retired_reason, translation_params(Proposal, only: :retired_explanation)]
|
|
end
|
|
|
|
def resource_model
|
|
Proposal
|
|
end
|
|
|
|
def discard_draft
|
|
@resources = @resources.published
|
|
end
|
|
|
|
def discard_archived
|
|
unless @current_order == "archival_date" || params[:selected].present?
|
|
@resources = @resources.not_archived
|
|
end
|
|
end
|
|
|
|
def load_retired
|
|
if params[:retired].present?
|
|
@resources = @resources.retired
|
|
|
|
if Proposal::RETIRE_OPTIONS.include?(params[:retired])
|
|
@resources = @resources.where(retired_reason: params[:retired])
|
|
end
|
|
else
|
|
@resources = @resources.not_retired
|
|
end
|
|
end
|
|
|
|
def load_selected
|
|
if params[:selected].present?
|
|
@resources = @resources.selected
|
|
else
|
|
@resources = @resources.not_selected
|
|
end
|
|
end
|
|
|
|
def load_featured
|
|
return if @advanced_search_terms || @search_terms.present? ||
|
|
params[:retired].present? || @current_order == "recommendations"
|
|
|
|
if Setting["feature.featured_proposals"]
|
|
@featured_proposals = Proposal.not_archived
|
|
.unsuccessful
|
|
.sort_by_confidence_score
|
|
.limit(Setting["featured_proposals_number"])
|
|
if @featured_proposals.present?
|
|
@resources = @resources.excluding(@featured_proposals)
|
|
end
|
|
end
|
|
end
|
|
|
|
def remove_archived_from_order_links
|
|
@valid_orders.delete("archival_date")
|
|
end
|
|
|
|
def set_view
|
|
@view = (params[:view] == "minimal") ? "minimal" : "default"
|
|
end
|
|
|
|
def destroy_map_location_association
|
|
map_location_params = proposal_params[:map_location_attributes]
|
|
|
|
if map_location_params.blank? || map_location_params.values.all?(&:blank?)
|
|
@proposal.map_location = nil
|
|
end
|
|
end
|
|
|
|
def proposals_recommendations
|
|
if Setting["feature.user.recommendations_on_proposals"] && current_user.recommended_proposals
|
|
@recommended_proposals = Proposal.recommendations(current_user).sort_by_random.limit(3)
|
|
end
|
|
end
|
|
end
|