Just like we did in commit0214184b2dfor investments, we're removing some possible optimizations (we don't have any benchmarks proving they affect performance at all) in order to simplify the code. The investement votes component `delegate` code was accidentally left but isn't used since commit0214184b2, so we're removing it now that we're removing the `voted_for?` helper method.
179 lines
5.3 KiB
Ruby
179 lines
5.3 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 :destroy_map_location_association, only: :update
|
|
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
|
|
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 vote_featured
|
|
@follow = Follow.find_or_create_by!(user: current_user, followable: @proposal)
|
|
@proposal.register_vote(current_user, "yes")
|
|
end
|
|
|
|
def summary
|
|
@proposals = Proposal.for_summary
|
|
@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
|
|
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)
|
|
params.require(:proposal).permit(attributes, translations_attributes)
|
|
end
|
|
|
|
def retired_params
|
|
attributes = [:retired_reason]
|
|
translations_attributes = translation_params(Proposal, only: :retired_explanation)
|
|
params.require(:proposal).permit(attributes, translations_attributes)
|
|
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
|
|
@resources = @resources.where(retired_reason: params[:retired]) if Proposal::RETIRE_OPTIONS.include?(params[:retired])
|
|
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 unless !@advanced_search_terms && @search_terms.blank? && params[:retired].blank? && @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.where.not(id: @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][:map_location_attributes]
|
|
if map_location && (map_location[:longitude] && map_location[:latitude]).blank? && !map_location[:id].blank?
|
|
MapLocation.destroy(map_location[:id])
|
|
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
|