Delete spending proposals

This commit is contained in:
voodoorai2000
2019-03-21 21:39:21 +01:00
parent 24dde9c35e
commit d0b8fef6b3
90 changed files with 52 additions and 1690 deletions

View File

@@ -3,7 +3,6 @@ class Admin::Api::StatsController < Admin::Api::BaseController
def show
unless params[:event].present? ||
params[:visits].present? ||
params[:spending_proposals].present? ||
params[:budget_investments].present? ||
params[:user_supported_budgets].present?
return render json: {}, status: :bad_request
@@ -19,10 +18,6 @@ class Admin::Api::StatsController < Admin::Api::BaseController
ds.add "Visits", Visit.group_by_day(:started_at).count
end
if params[:spending_proposals].present?
ds.add "Spending proposals", SpendingProposal.group_by_day(:created_at).count
end
if params[:budget_investments].present?
ds.add "Budget Investments", Budget::Investment.group_by_day(:created_at).count
end

View File

@@ -91,7 +91,7 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
end
def load_investment
@investment = Budget::Investment.by_budget(@budget).find(params[:id])
@investment = @budget.investments.find(params[:id])
end
def load_admins

View File

@@ -1,70 +0,0 @@
class Admin::SpendingProposalsController < Admin::BaseController
include FeatureFlags
before_action :load_filter_params
feature_flag :spending_proposals
has_filters %w{valuation_open without_admin managed valuating valuation_finished all}, only: :index
load_and_authorize_resource
def index
@spending_proposals = SpendingProposal.scoped_filter(filter_params, @current_filter)
.order(cached_votes_up: :desc, created_at: :desc)
.page(params[:page])
end
def show
end
def edit
load_admins
load_valuators
load_tags
end
def update
if @spending_proposal.update(spending_proposal_params)
redirect_to admin_spending_proposal_path(@spending_proposal, filter_params),
notice: t("flash.actions.update.spending_proposal")
else
load_admins
load_valuators
load_tags
render :edit
end
end
def summary
@spending_proposals = SpendingProposal.group(:geozone).sum(:price).sort_by{|geozone, count| geozone.present? ? geozone.name : "z"}
@spending_proposals_with_supports = SpendingProposal.with_supports.group(:geozone).sum(:price)
.sort_by{|geozone, count| geozone.present? ? geozone.name : "z"}
end
private
def spending_proposal_params
params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :association_name,
:administrator_id, :tag_list, valuator_ids: [])
end
def filter_params
params.permit(:geozone_id, :administrator_id, :tag_name, :valuator_id)
end
def load_filter_params
@filter_params ||= filter_params
end
def load_admins
@admins = Administrator.includes(:user).all
end
def load_valuators
@valuators = Valuator.includes(:user).all.order("description ASC").order("users.email ASC")
end
def load_tags
@tags = ActsAsTaggableOn::Tag.spending_proposal_tags
end
end

View File

@@ -11,6 +11,7 @@ class Admin::StatsController < Admin::BaseController
@debate_votes = Vote.where(votable_type: "Debate").count
@proposal_votes = Vote.where(votable_type: "Proposal").count
@comment_votes = Vote.where(votable_type: "Comment").count
@votes = Vote.count
@user_level_two = User.active.level_two_verified.count
@@ -24,8 +25,6 @@ class Admin::StatsController < Admin::BaseController
.count(:voter_id)
@user_ids_who_didnt_vote_proposals = @verified_users - @user_ids_who_voted_proposals
@spending_proposals = SpendingProposal.count
budgets_ids = Budget.where.not(phase: "finished").pluck(:id)
@budgets = budgets_ids.size
@investments = Budget::Investment.where(budget_id: budgets_ids).count
@@ -52,7 +51,6 @@ class Admin::StatsController < Admin::BaseController
@users_who_have_sent_message = DirectMessage.select(:sender_id).distinct.count
end
def budgets
@budgets = Budget.all
end

View File

@@ -73,10 +73,6 @@ class ApplicationController < ActionController::Base
@proposal_votes = current_user ? current_user.proposal_votes(proposals) : {}
end
def set_spending_proposal_votes(spending_proposals)
@spending_proposal_votes = current_user ? current_user.spending_proposal_votes(spending_proposals) : {}
end
def set_comment_flags(comments)
@comment_flags = current_user ? current_user.comment_flags(comments) : {}
end

View File

@@ -1,79 +0,0 @@
class Management::SpendingProposalsController < Management::BaseController
before_action :only_verified_users, except: :print
before_action :set_spending_proposal, only: [:vote, :show]
def index
@spending_proposals = apply_filters_and_search(SpendingProposal).order(cached_votes_up: :desc).page(params[:page]).for_render
set_spending_proposal_votes(@spending_proposals)
end
def new
@spending_proposal = SpendingProposal.new
end
def create
@spending_proposal = SpendingProposal.new(spending_proposal_params)
@spending_proposal.author = managed_user
if @spending_proposal.save
notice = t("flash.actions.create.notice", resource_name: t("activerecord.models.spending_proposal", count: 1))
redirect_to management_spending_proposal_path(@spending_proposal), notice: notice
else
render :new
end
end
def show
set_spending_proposal_votes(@spending_proposal)
end
def vote
@spending_proposal.register_vote(managed_user, "yes")
set_spending_proposal_votes(@spending_proposal)
end
def print
params[:geozone] ||= "all"
@spending_proposals = apply_filters_and_search(SpendingProposal).order(cached_votes_up: :desc).for_render.limit(15)
set_spending_proposal_votes(@spending_proposals)
end
private
def set_spending_proposal
@spending_proposal = SpendingProposal.find(params[:id])
end
def spending_proposal_params
params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :terms_of_service)
end
def only_verified_users
check_verified_user t("management.spending_proposals.alert.unverified_user")
end
# This should not be necessary. Maybe we could create a specific show view for managers.
def set_spending_proposal_votes(spending_proposals)
@spending_proposal_votes = managed_user ? managed_user.spending_proposal_votes(spending_proposals) : {}
end
def set_geozone_name
if params[:geozone] == "all"
@geozone_name = t("geozones.none")
else
@geozone_name = Geozone.find(params[:geozone]).name
end
end
def apply_filters_and_search(target)
target = params[:unfeasible].present? ? target.unfeasible : target.not_unfeasible
if params[:geozone].present?
target = target.by_geozone(params[:geozone])
set_geozone_name
end
target = target.search(params[:search]) if params[:search].present?
target
end
end

View File

@@ -1,76 +0,0 @@
class SpendingProposalsController < ApplicationController
include FeatureFlags
before_action :authenticate_user!, except: [:index, :show]
before_action -> { flash.now[:notice] = flash[:notice].html_safe if flash[:html_safe] && flash[:notice] }
load_and_authorize_resource
feature_flag :spending_proposals
invisible_captcha only: [:create, :update], honeypot: :subtitle
respond_to :html, :js
def index
@spending_proposals = apply_filters_and_search(SpendingProposal).page(params[:page]).for_render
set_spending_proposal_votes(@spending_proposals)
end
def new
@spending_proposal = SpendingProposal.new
end
def show
set_spending_proposal_votes(@spending_proposal)
end
def create
@spending_proposal = SpendingProposal.new(spending_proposal_params)
@spending_proposal.author = current_user
if @spending_proposal.save
activity = "<a href='#{user_path(current_user, filter: :spending_proposals)}'>#{t('layouts.header.my_activity_link')}</a>"
notice = t("flash.actions.create.spending_proposal", activity: activity)
redirect_to @spending_proposal, notice: notice, flash: { html_safe: true }
else
render :new
end
end
def destroy
spending_proposal = SpendingProposal.find(params[:id])
spending_proposal.destroy
redirect_to user_path(current_user, filter: "spending_proposals"), notice: t("flash.actions.destroy.spending_proposal")
end
def vote
@spending_proposal.register_vote(current_user, "yes")
set_spending_proposal_votes(@spending_proposal)
end
private
def spending_proposal_params
params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :association_name, :terms_of_service)
end
def set_geozone_name
if params[:geozone] == "all"
@geozone_name = t("geozones.none")
else
@geozone_name = Geozone.find(params[:geozone]).name
end
end
def apply_filters_and_search(target)
target = params[:unfeasible].present? ? target.unfeasible : target.not_unfeasible
if params[:geozone].present?
target = target.by_geozone(params[:geozone])
set_geozone_name
end
target = target.search(params[:search]) if params[:search].present?
target
end
end

View File

@@ -33,10 +33,6 @@ module AdminHelper
controller_name.starts_with?("budget")
end
def menu_budget?
["spending_proposals"].include?(controller_name)
end
def menu_polls?
%w[polls active_polls recounts results questions answers].include?(controller_name) ||
controller.class.parent == Admin::Poll::Questions::Answers

View File

@@ -8,9 +8,4 @@ module GeozonesHelper
Geozone.all.order(name: :asc).collect { |g| [ g.name, g.id ] }
end
def geozone_name_from_id(g_id)
@all_geozones ||= Geozone.all.collect{ |g| [ g.id, g.name ] }.to_h
@all_geozones[g_id] || t("geozones.none")
end
end

View File

@@ -8,4 +8,4 @@ module SettingsHelper
@all_settings ||= Hash[ Setting.all.map{|s| [s.key, s.value.presence]} ]
end
end
end

View File

@@ -1,25 +0,0 @@
module SpendingProposalsHelper
def spending_proposal_tags_select_options
ActsAsTaggableOn::Tag.spending_proposal_tags.pluck(:name)
end
def namespaced_spending_proposal_path(spending_proposal, options = {})
@namespace_spending_proposal_path ||= namespace
case @namespace_spending_proposal_path
when "management"
management_spending_proposal_path(spending_proposal, options)
else
spending_proposal_path(spending_proposal, options)
end
end
def spending_proposal_count_for_geozone(scope, geozone, second_scope)
if geozone.present?
geozone.spending_proposals.send(scope).send(second_scope).count
else
SpendingProposal.where(geozone: nil).send(scope).send(second_scope).count
end
end
end

View File

@@ -37,16 +37,6 @@ class Mailer < ApplicationMailer
end
end
def unfeasible_spending_proposal(spending_proposal)
@spending_proposal = spending_proposal
@author = spending_proposal.author
@email_to = @author.email
with_user(@author) do
mail(to: @email_to, subject: t("mailers.unfeasible_spending_proposal.subject", code: @spending_proposal.code))
end
end
def direct_message_for_receiver(direct_message)
@direct_message = direct_message
@receiver = @direct_message.receiver

View File

@@ -89,8 +89,6 @@ module Abilities
proposal.published?
end
can :vote_featured, Proposal
can :vote, SpendingProposal
can :create, SpendingProposal
can :vote, Legislation::Proposal
can :vote_featured, Legislation::Proposal

View File

@@ -14,9 +14,8 @@ module Abilities
poll.expired? && poll.stats_enabled?
end
can :read, Poll::Question
can [:read, :welcome], Budget
can :read, SpendingProposal
can :read, User
can [:read, :welcome], Budget
can [:read], Budget
can [:read], Budget::Group
can [:read, :print, :json_data], Budget::Investment

View File

@@ -3,7 +3,6 @@ class Geozone < ApplicationRecord
include Graphqlable
has_many :proposals
has_many :spending_proposals
has_many :debates
has_many :users
validates :name, presence: true

View File

@@ -2,7 +2,7 @@ class SignatureSheet < ApplicationRecord
belongs_to :signable, polymorphic: true
belongs_to :author, class_name: "User", foreign_key: "author_id"
VALID_SIGNABLES = %w(Proposal Budget::Investment SpendingProposal)
VALID_SIGNABLES = %w(Proposal Budget::Investment)
has_many :signatures

View File

@@ -1,146 +0,0 @@
class SpendingProposal < ApplicationRecord
include Measurable
include Sanitizable
include Taggable
include Searchable
acts_as_votable
belongs_to :author, -> { with_hidden }, class_name: "User", foreign_key: "author_id"
belongs_to :geozone
belongs_to :administrator
has_many :valuation_assignments, dependent: :destroy
has_many :valuators, through: :valuation_assignments
validates :title, presence: true
validates :author, presence: true
validates :description, presence: true
validates :feasible_explanation, presence: { if: :feasible_explanation_required? }
validates :title, length: { in: 4..SpendingProposal.title_max_length }
validates :description, length: { maximum: SpendingProposal.description_max_length }
validates :terms_of_service, acceptance: { allow_nil: false }, on: :create
scope :valuation_open, -> { where(valuation_finished: false) }
scope :without_admin, -> { valuation_open.where(administrator_id: nil) }
scope :managed, -> { valuation_open.where(valuation_assignments_count: 0).where("administrator_id IS NOT ?", nil) }
scope :valuating, -> { valuation_open.where("valuation_assignments_count > 0 AND valuation_finished = ?", false) }
scope :valuation_finished, -> { where(valuation_finished: true) }
scope :feasible, -> { where(feasible: true) }
scope :unfeasible, -> { where(feasible: false) }
scope :not_unfeasible, -> { where("feasible IS ? OR feasible = ?", nil, true) }
scope :with_supports, -> { where("cached_votes_up > 0") }
scope :by_admin, ->(admin) { where(administrator_id: admin.presence) }
scope :by_tag, ->(tag_name) { tagged_with(tag_name) }
scope :by_valuator, ->(valuator) { where("valuation_assignments.valuator_id = ?", valuator.presence).joins(:valuation_assignments) }
scope :for_render, -> { includes(:geozone) }
before_validation :set_responsible_name
def description
super.try :html_safe
end
def self.scoped_filter(params, current_filter)
results = self
results = results.by_geozone(params[:geozone_id]) if params[:geozone_id].present?
results = results.by_admin(params[:administrator_id]) if params[:administrator_id].present?
results = results.by_tag(params[:tag_name]) if params[:tag_name].present?
results = results.by_valuator(params[:valuator_id]) if params[:valuator_id].present?
results = results.send(current_filter) if current_filter.present?
results.includes(:geozone, administrator: :user, valuators: :user)
end
def searchable_values
{ title => "A",
author.username => "B",
geozone.try(:name) => "B",
description => "C"
}
end
def self.search(terms)
pg_search(terms)
end
def self.by_geozone(geozone)
if geozone == "all"
where(geozone_id: nil)
else
where(geozone_id: geozone.presence)
end
end
def feasibility
case feasible
when true
"feasible"
when false
"not_feasible"
else
"undefined"
end
end
def unfeasible_email_pending?
unfeasible_email_sent_at.blank? && unfeasible? && valuation_finished?
end
def unfeasible?
feasible == false
end
def valuation_finished?
valuation_finished
end
def feasible_explanation_required?
valuation_finished? && unfeasible?
end
def total_votes
cached_votes_up + physical_votes
end
def code
"#{created_at.strftime("%Y")}-#{id}" + (administrator.present? ? "-A#{administrator.id}" : "")
end
def send_unfeasible_email
Mailer.unfeasible_spending_proposal(self).deliver_later
update(unfeasible_email_sent_at: Time.current)
end
def reason_for_not_being_votable_by(user)
return :not_voting_allowed if Setting["feature.spending_proposal_features.voting_allowed"].blank?
return :not_logged_in unless user
return :not_verified unless user.can?(:vote, SpendingProposal)
return :unfeasible if unfeasible?
return :organization if user.organization?
end
def votable_by?(user)
reason_for_not_being_votable_by(user).blank?
end
def register_vote(user, vote_value)
if votable_by?(user)
vote_by(voter: user, vote: vote_value)
end
end
def set_responsible_name
self.responsible_name = author.try(:document_number) if author.try(:document_number).present?
end
def self.finished_and_feasible
valuation_finished.feasible
end
def self.finished_and_unfeasible
valuation_finished.unfeasible
end
end

View File

@@ -25,7 +25,6 @@ class User < ApplicationRecord
has_many :proposals, -> { with_hidden }, foreign_key: :author_id
has_many :budget_investments, -> { with_hidden }, foreign_key: :author_id, class_name: "Budget::Investment"
has_many :comments, -> { with_hidden }
has_many :spending_proposals, foreign_key: :author_id
has_many :failed_census_calls
has_many :notifications
has_many :direct_messages_sent, class_name: "DirectMessage", foreign_key: :sender_id
@@ -117,11 +116,6 @@ class User < ApplicationRecord
voted.each_with_object({}) { |v, h| h[v.votable_id] = v.value }
end
def spending_proposal_votes(spending_proposals)
voted = votes.for_spending_proposals(spending_proposals)
voted.each_with_object({}) { |v, h| h[v.votable_id] = v.value }
end
def budget_investment_votes(budget_investments)
voted = votes.for_budget_investments(budget_investments)
voted.each_with_object({}) { |v, h| h[v.votable_id] = v.value }

View File

@@ -74,20 +74,6 @@
</li>
<% end %>
<% if feature?(:spending_proposals) %>
<li class="section-title">
<a href="#">
<span class="icon-budget"></span>
<strong><%= t("admin.menu.title_budgets") %></strong>
</a>
<ul <%= "class=is-active" if menu_budget? %>>
<li <%= "class=is-active" if controller_name == "spending_proposals" %>>
<%= link_to t("admin.menu.spending_proposals"), admin_spending_proposals_path %>
</li>
</ul>
</li>
<% end %>
<% messages_sections = %w(newsletters emails_download admin_notifications system_emails) %>
<% messages_menu_active = messages_sections.include?(controller_name) %>
<li class="section-title" <%= "class=is-active" if messages_menu_active %>>

View File

@@ -11,11 +11,14 @@
<div class="row expanded">
<div class="small-12 column">
<%= f.text_field :title, maxlength: Budget::Investment.title_max_length %>
<%= f.text_field :title,
maxlength: Budget::Investment.title_max_length %>
</div>
<div class="ckeditor small-12 column">
<%= f.cktext_area :description, maxlength: Budget::Investment.description_max_length, ckeditor: { language: I18n.locale } %>
<%= f.cktext_area :description,
maxlength: Budget::Investment.description_max_length,
ckeditor: { language: I18n.locale } %>
</div>
<div class="small-12 column">

View File

@@ -1,10 +0,0 @@
<%= form_for(SpendingProposal.new, url: url, as: :spending_proposal, method: :get) do |f| %>
<div class="row">
<div class="small-12 medium-6 column">
<%= text_field_tag :search, "", placeholder: t("admin.shared.spending_proposal_search.placeholder") %>
</div>
<div class="form-inline small-12 medium-3 column end">
<%= f.submit t("admin.shared.spending_proposal_search.button"), class: "button" %>
</div>
</div>
<% end %>

View File

@@ -1,35 +0,0 @@
<table id="spending_proposals" class="investment-projects-summary">
<th><%= t("admin.spending_proposals.summary.geozone_name") %></th>
<th><%= t("admin.spending_proposals.summary.finished_and_feasible_count") %></th>
<th><%= t("admin.spending_proposals.summary.finished_and_unfeasible_count") %></th>
<th><%= t("admin.spending_proposals.summary.finished_count") %></th>
<th><%= t("admin.spending_proposals.summary.in_evaluation_count") %></th>
<th><%= t("admin.spending_proposals.summary.total_count") %></th>
<th><%= t("admin.spending_proposals.summary.cost_for_geozone") %></th>
<% spending_proposals.each do |geozone, price| %>
<tr id="<%= geozone.present? ? dom_id(geozone) : "geozone_all_city" %>">
<td class="name">
<%= geozone.present? ? geozone.name : t("geozones.none") %>
</td>
<td class="finished-and-feasible-count">
<%= spending_proposal_count_for_geozone("finished_and_feasible", geozone, second_scope) %>
</td>
<td class="finished-and-unfeasible-count">
<%= spending_proposal_count_for_geozone("finished_and_unfeasible", geozone, second_scope) %>
</td>
<td class="finished-count">
<%= spending_proposal_count_for_geozone("valuation_finished", geozone, second_scope) %>
</td>
<td class="in-evaluation-count">
<%= spending_proposal_count_for_geozone("valuating", geozone, second_scope) %>
</td>
<td class="total-count">
<%= spending_proposal_count_for_geozone("all", geozone, second_scope) %>
</td>
<td class="total-price text-center">
<%= number_to_currency(price) %>
</td>
</tr>
<% end %>
</table>

View File

@@ -1,42 +0,0 @@
<div class="callout primary float-right">
<%= t "admin.spending_proposals.show.heading", id: @spending_proposal.id %>
</div>
<br>
<h1 class="inline-block"><%= @spending_proposal.title %></h1>
<div class="row small-collapse spending-proposal-info">
<div class="small-12 medium-4 column">
<p>
<strong><%= t("admin.spending_proposals.show.geozone") %>:</strong>
<%= geozone_name(@spending_proposal) %>
</p>
</div>
<div class="small-12 medium-4 column">
<p>
<strong><%= t("admin.spending_proposals.show.by") %>:</strong>
<%= link_to @spending_proposal.author.name, admin_hidden_user_path(@spending_proposal.author) %>
</p>
</div>
<div class="small-12 medium-4 column">
<p>
<strong><%= t("admin.spending_proposals.show.sent") %>:</strong>
<%= l @spending_proposal.created_at, format: :datetime %>
</p>
</div>
</div>
<% if @spending_proposal.association_name.present? %>
<p><strong><%= t("admin.spending_proposals.show.association_name") %>:</strong>
<%= @spending_proposal.association_name %>
</p>
<% end %>
<% if @spending_proposal.external_url.present? %>
<p><%= text_with_links @spending_proposal.external_url %>&nbsp;<span class="icon-external small"></span></p>
<% end %>
<%= safe_html_with_links @spending_proposal.description %>

View File

@@ -1,85 +0,0 @@
<%= link_to t("admin.spending_proposals.index.summary_link"),
summary_admin_spending_proposals_path,
class: "button float-right" %>
<%= link_to t("admin.spending_proposals.index.valuator_summary_link"),
summary_admin_valuators_path,
class: "button float-right margin-right" %>
<h2 class="inline-block"><%= t("admin.spending_proposals.index.title") %></h2>
<div class="row margin">
<%= form_tag admin_spending_proposals_path, method: :get, enforce_utf8: false do %>
<div class="small-12 medium-3 column">
<%= select_tag :administrator_id,
options_for_select(admin_select_options, params[:administrator_id]),
{ prompt: t("admin.spending_proposals.index.administrator_filter_all"),
label: false,
class: "js-submit-on-change" } %>
</div>
<div class="small-12 medium-3 column">
<%= select_tag :valuator_id,
options_for_select(valuator_select_options, params[:valuator_id]),
{ prompt: t("admin.spending_proposals.index.valuator_filter_all"),
label: false,
class: "js-submit-on-change" } %>
</div>
<div class="small-12 medium-3 column">
<%= select_tag :geozone_id,
options_for_select(geozone_select_options.unshift([t("geozones.none"), "all"]), params[:geozone_id]),
{ prompt: t("admin.spending_proposals.index.geozone_filter_all"),
label: false,
class: "js-submit-on-change" } %>
</div>
<div class="small-12 medium-3 column">
<%= select_tag :tag_name,
options_for_select(spending_proposal_tags_select_options, params[:tag_name]),
{ prompt: t("admin.spending_proposals.index.tags_filter_all"),
label: false,
class: "js-submit-on-change" } %>
</div>
<% end %>
</div>
<%= render "shared/filter_subnav", i18n_namespace: "admin.spending_proposals.index" %>
<h3><%= page_entries_info @spending_proposals %></h3>
<table>
<% @spending_proposals.each do |spending_proposal| %>
<tr id="<%= dom_id(spending_proposal) %>" class="spending_proposal">
<td>
<strong><%= spending_proposal.id %></strong>
</td>
<td>
<%= link_to spending_proposal.title,
admin_spending_proposal_path(spending_proposal, @filter_params.to_h) %>
</td>
<td class="small">
<% if spending_proposal.administrator.present? %>
<span title="<%= t("admin.spending_proposals.index.assigned_admin") %>"><%= spending_proposal.administrator.name %></span>
<% else %>
<%= t("admin.spending_proposals.index.no_admin_assigned") %>
<% end %>
</td>
<td class="small">
<% if spending_proposal.valuators.size == 0 %>
<%= t("admin.spending_proposals.index.no_valuators_assigned") %>
<% else %>
<%= spending_proposal.valuators.collect(&:description_or_name).join(", ") %>
<% end %>
</td>
<td class="small">
<%= geozone_name(spending_proposal) %>
</td>
<td class="small">
<%= t("admin.spending_proposals.index.feasibility.#{spending_proposal.feasibility}", price: spending_proposal.price) %>
</td>
</tr>
<% end %>
</table>
<%= paginate @spending_proposals %>

View File

@@ -106,14 +106,6 @@
</p>
</div>
<% if feature?(:spending_proposals) %>
<div class="small-12 medium-3 column">
<p class="featured">
<%= t "admin.stats.show.summary.spending_proposals" %> <br>
<span class="number"><%= number_with_delimiter(@spending_proposals) %></span>
</p>
</div>
<% end %>
</div>
<div class="small-12 column">

View File

@@ -7,14 +7,20 @@
</div>
<div class="small-12 column">
<%= f.text_field :title, maxlength: SpendingProposal.title_max_length, data: { js_suggest_result: "js_suggest_result", js_suggest: "#js-suggest", js_url: suggest_budget_investments_path(@budget) }%>
<%= f.text_field :title,
maxlength: Budget::Investment.title_max_length,
data: { js_suggest_result: "js_suggest_result",
js_suggest: "#js-suggest",
js_url: suggest_budget_investments_path(@budget) } %>
</div>
<div id="js-suggest"></div>
<%= f.invisible_captcha :subtitle %>
<div class="ckeditor small-12 column">
<%= f.cktext_area :description, maxlength: SpendingProposal.description_max_length, ckeditor: { language: I18n.locale } %>
<%= f.cktext_area :description,
maxlength: Budget::Investment.description_max_length,
ckeditor: { language: I18n.locale } %>
</div>
<% if feature?(:allow_images) %>

View File

@@ -8,7 +8,7 @@
<thead>
<tr>
<th scope="col">
<%= t("budgets.results.spending_proposal") %>
<%= t("budgets.results.investment_title") %>
</th>
<th scope="col" class="text-center">
<%= t("budgets.results.ballot_lines_count") %>

View File

@@ -1,24 +0,0 @@
<td style="padding-bottom: 20px; padding-left: 10px;">
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.unfeasible_spending_proposal.hi") %>
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px; padding-left: 12px; border-left: 2px solid #ccc;">
<%= @spending_proposal.feasible_explanation %>
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.unfeasible_spending_proposal.new_html",
url: link_to(t("mailers.unfeasible_spending_proposal.new_href"),
new_spending_proposal_url, style: "color: #2895F1; text-decoration: underline;")) %>
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.unfeasible_spending_proposal.sorry") %>
</p>
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;font-weight: normal;line-height: 24px;">
<%= t("mailers.unfeasible_spending_proposal.sincerely") %>
</p>
</td>

View File

@@ -64,29 +64,5 @@
<%= t("management.menu.user_invites") %>
<% end %>
</li>
<%# temporarily commenting until obsolete spending_proposals is removed %>
<% if false %>
<li <%= "class=is-active" if controller_name == "spending_proposals" && action_name == "new" %>>
<%= link_to new_management_spending_proposal_path do %>
<span class="icon-budget"></span>
<%= t("management.menu.create_spending_proposal") %>
<% end %>
</li>
<li <%= "class=is-active" if controller_name == "spending_proposals" && action_name == "index" %>>
<%= link_to management_spending_proposals_path do %>
<span class="icon-like"></span>
<%= t("management.menu.support_spending_proposals") %>
<% end %>
</li>
<li <%= "class=is-active" if controller_name == "spending_proposals" && action_name == "print" %>>
<%= link_to print_management_spending_proposals_path do %>
<span class="icon-print"></span>
<%= t("management.menu.print_spending_proposals") %>
<% end %>
</li>
<% end %>
</ul>
</div>

View File

@@ -1 +0,0 @@
<%= render partial: "spending_proposals/spending_proposal", locals: {spending_proposal: spending_proposal} %>

View File

@@ -1,2 +0,0 @@
<%= render "spending_proposals/votes",
{ spending_proposal: spending_proposal, vote_url: vote_management_spending_proposal_path(spending_proposal, value: "yes") } %>

View File

@@ -1,25 +0,0 @@
<main>
<span class="not-print">
<%= render "admin/shared/spending_proposal_search", url: management_spending_proposals_path %>
</span>
<div class="row">
<div id="investment-projects" class="investment-projects-list small-12 medium-9 column">
<div class="small-12 search-results">
<%= content_tag(:h2, t("management.spending_proposals.filters.unfeasible")) if params[:unfeasible].present? %>
<%= content_tag(:h2, t("management.spending_proposals.filters.by_geozone", geozone: @geozone_name)) if @geozone_name.present? %>
<% if params[:search].present? %>
<h2>
<%= page_entries_info @spending_proposals %>
<%= t("management.spending_proposals.search_results", count: @spending_proposals.size, search_term: params[:search]) %>
</h2>
<% end %>
</div>
<%= render @spending_proposals %>
<%= paginate @spending_proposals %>
</div>
</div>
</main>

View File

@@ -1,12 +0,0 @@
<div class="spending-proposal-form">
<div class="clear float-right">
<%= render "/shared/print" %>
</div>
<div class="small-12 medium-9 column end">
<h1 class=""><%= t("management.spending_proposals.create") %></h1>
<%= render "spending_proposals/form", form_url: management_spending_proposals_url %>
</div>
</div>

View File

@@ -1,33 +0,0 @@
<main>
<div class="row">
<div id="investment-projects" class="investment-projects-list small-12 column">
<div class="not-print">
<%= form_tag print_management_spending_proposals_path, method: :get, enforce_utf8: false do %>
<div class="small-12 medium-4 column float-left">
<%= select_tag :geozone,
options_for_select(geozone_select_options.unshift([t("geozones.none"), "all"]), params[:geozone]),
{ label: false,
class: "js-submit-on-change" } %>
</div>
<% end %>
<a id="print_link" href="javascript:window.print();" class="button warning float-right">
<%= t("management.spending_proposals.print.print_button") %>
</a>
</div>
<div class="small-12 search-results">
<%= content_tag(:h2, t("management.spending_proposals.filters.unfeasible"), class: "inline-block") if params[:unfeasible].present? %>
<%= content_tag(:h2, t("management.spending_proposals.filters.by_geozone", geozone: @geozone_name), class: "inline-block") if @geozone_name.present? %>
<%= content_tag(:h2, t("management.spending_proposals.search_results", count: @spending_proposals.size, search_term: params[:search]), class: "inline-block") if params[:search].present? %>
</div>
<%= render @spending_proposals %>
<div class="for-print-only">
<p><strong><%= t("management.print.spending_proposals_info") %></strong></p>
</div>
</div>
</div>
</main>

View File

@@ -1,3 +0,0 @@
<%= render "/shared/print" %>
<%= render template: "spending_proposals/show" %>

View File

@@ -1 +0,0 @@
<%= render template: "spending_proposals/vote" %>

View File

@@ -14,7 +14,7 @@
</li>
<% end %>
<% if (feature?(:spending_proposals) || feature?(:budgets)) &&
<% if feature?(:budgets) &&
(current_user.administrator? || current_user.valuator?) %>
<li>
<%= link_to t("layouts.header.valuation"), valuation_root_path %>

View File

@@ -37,14 +37,6 @@
accesskey: "4" %>
</li>
<% end %>
<% if feature?(:spending_proposals) %>
<li>
<%= layout_menu_link_to t("layouts.header.spending_proposals"),
spending_proposals_path,
controller_name == "spending_proposals",
accesskey: "s" %>
</li>
<% end %>
<% if feature?(:budgets) %>
<li>
<%= layout_menu_link_to t("layouts.header.budgets"),

View File

@@ -1,49 +0,0 @@
<%= form_for(@spending_proposal, url: form_url) do |f| %>
<%= render "shared/errors", resource: @spending_proposal %>
<div class="row">
<div class="small-12 column">
<%= f.label :title, t("spending_proposals.form.title") %>
<%= f.text_field :title, maxlength: SpendingProposal.title_max_length, placeholder: t("spending_proposals.form.title"), label: false %>
</div>
<%= f.invisible_captcha :subtitle %>
<div class="ckeditor small-12 column">
<%= f.label :description, t("spending_proposals.form.description") %>
<%= f.cktext_area :description, maxlength: SpendingProposal.description_max_length, ckeditor: { language: I18n.locale }, label: false %>
</div>
<div class="small-12 column">
<%= f.label :external_url, t("spending_proposals.form.external_url") %>
<%= f.text_field :external_url, placeholder: t("spending_proposals.form.external_url"), label: false %>
</div>
<div class="small-12 column">
<%= f.label :geozone_id, t("spending_proposals.form.geozone") %>
<%= f.select :geozone_id, geozone_select_options, {include_blank: t("geozones.none"), label: false} %>
</div>
<div class="small-12 column">
<%= f.label :association_name, t("spending_proposals.form.association_name_label") %>
<%= f.text_field :association_name, placeholder: t("spending_proposals.form.association_name"), label: false %>
</div>
<div class="small-12 column">
<% if @spending_proposal.new_record? %>
<%= f.label :terms_of_service do %>
<%= f.check_box :terms_of_service, title: t("form.accept_terms_title"), label: false %>
<span class="checkbox">
<%= t("form.accept_terms",
policy: link_to(t("form.policy"), "/privacy", target: "blank"),
conditions: link_to(t("form.conditions"), "/conditions", target: "blank")).html_safe %>
</span>
<% end %>
<% end %>
</div>
<div class="actions small-12 column">
<%= f.submit(class: "button", value: t("spending_proposals.form.submit_buttons.#{action_name}")) %>
</div>
</div>
<% end %>

View File

@@ -1,15 +0,0 @@
<div class="sidebar-divider"></div>
<h2 class="sidebar-title"><%= t("spending_proposals.index.sidebar.geozones") %></h2>
<br>
<div class="geozone">
<%= link_to t("geozones.all"), spending_proposals_path(geozone: nil) %>
<%= link_to t("geozones.none"), spending_proposals_path(geozone: "all") %>
<% Geozone.all.each do |geozone| %>
<%= link_to geozone.name, spending_proposals_path(geozone: geozone.id) %>
<% end %>
</div>
<div class="sidebar-divider"></div>
<h2 class="sidebar-title"><%= t("spending_proposals.index.sidebar.feasibility") %></h2>
<br>
<%= link_to t("spending_proposals.index.sidebar.unfeasible"), spending_proposals_path(unfeasible: "1") %>

View File

@@ -1,59 +0,0 @@
<div id="<%= dom_id(spending_proposal) %>" class="investment-project clear">
<div class="panel">
<div class="row">
<div class="small-12 medium-9 column">
<div class="investment-project-content">
<% cache [locale_and_user_status(spending_proposal), "index", spending_proposal, spending_proposal.author] do %>
<span class="label-investment-project float-left"><%= t("spending_proposals.spending_proposal.spending_proposal") %></span>
<span class="icon-budget"></span>
<h3><%= link_to spending_proposal.title, namespaced_spending_proposal_path(spending_proposal) %></h3>
<p class="investment-project-info">
<%= l spending_proposal.created_at.to_date %>
<% if spending_proposal.author.hidden? || spending_proposal.author.erased? %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="author">
<%= t("spending_proposals.show.author_deleted") %>
</span>
<% else %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="author">
<%= spending_proposal.author.name %>
</span>
<% if spending_proposal.author.display_official_position_badge? %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="label round level-<%= spending_proposal.author.official_level %>">
<%= spending_proposal.author.official_position %>
</span>
<% end %>
<% end %>
<% if spending_proposal.author.verified_organization? %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<span class="label round is-association">
<%= t("shared.collective") %>
</span>
<% end %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<%= geozone_name(spending_proposal) %>
</p>
<div class="investment-project-description">
<p><%= link_to spending_proposal.description, namespaced_spending_proposal_path(spending_proposal) %></p>
<div class="truncate"></div>
</div>
<% end %>
</div>
</div>
<div id="<%= dom_id(spending_proposal) %>_votes" class="small-12 medium-3 column supports-container">
<%= render "votes",
{ spending_proposal: spending_proposal, vote_url: vote_spending_proposal_path(spending_proposal, value: "yes") } %>
</div>
</div>
</div>
</div>

View File

@@ -1,45 +0,0 @@
<div class="supports text-center">
<% reason = spending_proposal.reason_for_not_being_votable_by(current_user) %>
<% voting_allowed = true unless reason.presence == :not_voting_allowed %>
<% user_voted_for = voted_for?(@spending_proposal_votes, spending_proposal) %>
<span class="total-supports <%= "no-button" unless voting_allowed || user_voted_for %>">
<%= t("spending_proposals.spending_proposal.supports", count: spending_proposal.total_votes) %>
</span>
<div class="in-favor">
<% if user_voted_for %>
<div class="supported callout success">
<%= t("spending_proposals.spending_proposal.already_supported") %>
</div>
<% elsif voting_allowed %>
<%= link_to vote_url,
class: "button button-support small expanded",
title: t("spending_proposals.spending_proposal.support_title"), method: "post", remote: true,
"aria-hidden" => css_for_aria_hidden(reason) do %>
<%= t("spending_proposals.spending_proposal.support") %>
<% end %>
<% end %>
</div>
<% if reason.present? && !user_voted_for %>
<div class="participation-not-allowed" style="display:none" aria-hidden="false">
<p>
<%= t("votes.spending_proposals.#{reason}",
verify_account: link_to(t("votes.verify_account"), verification_path),
signin: link_to(t("votes.signin"), new_user_session_path),
signup: link_to(t("votes.signup"), new_user_registration_path)
).html_safe %>
</p>
</div>
<% end %>
<% if user_voted_for && setting["twitter_handle"] %>
<%= render partial: "shared/social_share", locals: {
title: spending_proposal.title,
url: spending_proposal_url(spending_proposal),
description: spending_proposal.title
} %>
<% end %>
</div>

View File

@@ -1,39 +0,0 @@
<% provide :title do %><%= t("spending_proposals.index.title") %><% end %>
<% content_for :header_addon do %>
<%= render "shared/search_form",
search_path: spending_proposals_path(page: 1),
i18n_namespace: "spending_proposals.index.search_form" %>
<% end %>
<main>
<h1 class="show-for-sr"><%= t("shared.outline.budget") %></h1>
<div class="row">
<div id="investment-projects" class="investment-projects-list small-12 medium-9 column">
<div class="small-12 search-results">
<%= content_tag(:h2, t("spending_proposals.index.unfeasible")) if params[:unfeasible].present? %>
<%= content_tag(:h2, t("spending_proposals.index.by_geozone", geozone: @geozone_name)) if @geozone_name.present? %>
<% if params[:search].present? %>
<h2>
<%= page_entries_info @spending_proposals %>
<%= t("spending_proposals.index.search_results", count: @spending_proposals.size, search_term: params[:search]) %>
</h2>
<% end %>
</div>
<div class="show-for-small-only">
<%= link_to t("spending_proposals.index.start_spending_proposal"), new_spending_proposal_path, class: "button expanded" %>
</div>
<%= render partial: "spending_proposals/spending_proposal", collection: @spending_proposals %>
<%= paginate @spending_proposals %>
</div>
<div class="small-12 medium-3 column">
<aside id="sidebar" class="margin-bottom">
<%= render "sidebar" %>
</aside>
</div>
</div>
</main>

View File

@@ -1,25 +0,0 @@
<div class="spending-proposal-form row margin-top">
<div class="small-12 medium-9 column">
<%= back_link_to %>
<h1><%= t("spending_proposals.new.start_new") %></h1>
<div data-alert class="callout primary">
<%= link_to "/spending_proposals_info", title: t("shared.target_blank_html"), target: "_blank" do %>
<%= t("spending_proposals.new.more_info")%>
<% end %>
</div>
<%= render "spending_proposals/form", form_url: spending_proposals_url %>
</div>
<div class="small-12 medium-3 column">
<span class="icon-budget float-right"></span>
<h2><%= t("spending_proposals.new.recommendations_title") %></h2>
<ul class="recommendations">
<li><%= t("spending_proposals.new.recommendation_one") %></li>
<li><%= t("spending_proposals.new.recommendation_two") %></li>
<li><%= t("spending_proposals.new.recommendation_three") %></li>
</ul>
</div>
</div>

View File

@@ -1,52 +0,0 @@
<% provide :title do %><%= @spending_proposal.title %><% end %>
<section class="investment-project-show">
<div id="<%= dom_id(@spending_proposal) %>" class="row">
<div class="small-12 medium-9 column">
<h1><%= @spending_proposal.title %></h1>
<div class="investment-project-info">
<%= render "/shared/author_info", resource: @spending_proposal %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<%= l @spending_proposal.created_at.to_date %>
<span class="bullet">&nbsp;&bull;&nbsp;</span>
<%= geozone_name(@spending_proposal) %>
</div>
<br>
<p id="spending_proposal_code">
<%= t("spending_proposals.show.code") %>
<strong><%= @spending_proposal.id %></strong>
</p>
<%= safe_html_with_links @spending_proposal.description.html_safe %>
<% if @spending_proposal.external_url.present? %>
<div class="document-link">
<%= text_with_links @spending_proposal.external_url %>
</div>
<% end %>
</div>
<aside class="small-12 medium-3 column">
<div class="sidebar-divider"></div>
<h3><%= t("votes.supports") %></h3>
<div class="text-center">
<div id="<%= dom_id(@spending_proposal) %>_votes">
<%= render "votes",
{ spending_proposal: @spending_proposal, vote_url: vote_spending_proposal_path(@spending_proposal, value: "yes") } %>
</div>
</div>
<%= render partial: "shared/social_share", locals: {
share_title: t("spending_proposals.show.share"),
title: @spending_proposal.title,
url: spending_proposal_url(@spending_proposal),
description: @spending_proposal.title
} %>
</aside>
</div>
</section>

View File

@@ -1 +0,0 @@
$("#<%= dom_id(@spending_proposal) %>_votes").html("<%= j render("spending_proposals/votes", spending_proposal: @spending_proposal, vote_url: vote_spending_proposal_path(@spending_proposal, value: "yes")) %>");

View File

@@ -111,7 +111,6 @@ search:
ignore_missing:
- "unauthorized.*"
- "activerecord.models.proposal"
- "activerecord.models.spending_proposal"
- "activerecord.errors.models.proposal_notification.*"
- "activerecord.errors.models.direct_message.*"
- "errors.messages.blank"
@@ -138,7 +137,6 @@ ignore_unused:
- "admin.proposal_notifications.index.filter*"
- "admin.budgets.index.filter*"
- "admin.budget_investments.index.filter*"
- "admin.spending_proposals.index.filter*"
- "admin.organizations.index.filter*"
- "admin.hidden_users.index.filter*"
- "admin.hidden_budget_investments.index.filter*"
@@ -181,7 +179,6 @@ ignore_unused:
- "proposals.index.select_order"
- "proposals.index.orders.*"
- "proposals.index.section_header.*"
- "spending_proposals.index.search_form.*"
- "*.index.search_form.*"
- "notifications.notification.action.*"
- "legislation.processes.index.filter*"
@@ -201,9 +198,6 @@ ignore_unused:
# - "simple_form.{yes,no}"
# - "simple_form.{placeholders,hints,labels}.*"
# - "simple_form.{error_notification,required}.:"
#### Review unused keys after merge with Budgest (both en and es)
- users.show.confirm_deletion_spending_proposal
- users.show.delete_spending_proposal
- verification.letter.create.flash.offices_url
- verification.letter.new.offices_url
- votes.budget_investments.different_heading_assigned*

View File

@@ -73,13 +73,6 @@ module ActsAsTaggableOn
Tag.category.pluck(:name)
end
def self.spending_proposal_tags
ActsAsTaggableOn::Tag.where("taggings.taggable_type" => "SpendingProposal")
.includes(:taggings)
.order(:name)
.distinct
end
def self.graphql_field_name
:tag
end
@@ -97,6 +90,6 @@ module ActsAsTaggableOn
def custom_counter_field_name_for(taggable_type)
"#{taggable_type.underscore.pluralize}_count"
end
end
end
end

View File

@@ -25,10 +25,6 @@ ActsAsVotable::Vote.class_eval do
where(votable_type: "Legislation::Proposal", votable_id: proposals)
end
def self.for_spending_proposals(spending_proposals)
where(votable_type: "SpendingProposal", votable_id: spending_proposals)
end
def self.for_budget_investments(budget_investments=Budget::Investment.all)
where(votable_type: "Budget::Investment", votable_id: budget_investments)
end

View File

@@ -71,9 +71,6 @@ en:
proposal:
one: "Citizen proposal"
other: "Citizen proposals"
spending_proposal:
one: "Investment project"
other: "Investment projects"
site_customization/page:
one: Custom page
other: Custom pages
@@ -203,13 +200,6 @@ en:
organization:
name: "Name of organisation"
responsible_name: "Person responsible for the group"
spending_proposal:
administrator_id: "Administrator"
association_name: "Association name"
description: "Description"
external_url: "Link to additional documentation"
geozone_id: "Scope of operation"
title: "Title"
poll:
name: "Name"
starts_at: "Start Date"

View File

@@ -690,7 +690,6 @@ en:
officials: Officials
organizations: Organisations
settings: Global settings
spending_proposals: Spending proposals
stats: Statistics
signature_sheets: Signature Sheets
site_customization:
@@ -1299,9 +1298,6 @@ en:
proposal_search:
button: Search
placeholder: Search proposals by title, code, description or question
spending_proposal_search:
button: Search
placeholder: Search spending proposals by title or description
user_search:
button: Search
placeholder: Search user by name or email
@@ -1322,52 +1318,6 @@ en:
color_help: Hexadecimal format
show_results_and_stats: "Show results and stats"
results_and_stats_reminder: "Marking these checkboxes the results and/or stats will be publicly available and every user will see them."
spending_proposals:
index:
geozone_filter_all: All zones
administrator_filter_all: All administrators
valuator_filter_all: All valuators
tags_filter_all: All tags
filters:
valuation_open: Open
without_admin: Without assigned admin
managed: Managed
valuating: Under valuation
valuation_finished: Valuation finished
all: All
title: Investment projects for participatory budgeting
assigned_admin: Assigned administrator
no_admin_assigned: No admin assigned
no_valuators_assigned: No valuators assigned
summary_link: "Investment project summary"
valuator_summary_link: "Valuator summary"
feasibility:
feasible: "Feasible (%{price})"
not_feasible: "Not feasible"
undefined: "Undefined"
show:
assigned_admin: Assigned administrator
assigned_valuators: Assigned valuators
back: Back
classification: Classification
heading: "Investment project %{id}"
edit: Edit
edit_classification: Edit classification
association_name: Association
by: By
sent: Sent
geozone: Scope
dossier: Dossier
edit_dossier: Edit dossier
tags: Tags
undefined: Undefined
edit:
classification: Classification
assigned_valuators: Valuators
submit_button: Update
tags: Tags
tags_placeholder: "Write the tags you want separated by commas (,)"
undefined: Undefined
geozones:
index:
title: Geozone
@@ -1438,7 +1388,6 @@ en:
proposals: Proposals
budgets: Open budgets
budget_investments: Investment projects
spending_proposals: Spending Proposals
unverified_users: Unverified users
user_level_three: Level three users
user_level_two: Level two users
@@ -1455,7 +1404,6 @@ en:
polls: Polls
graph:
debate_created: Debates
spending_proposals: Investment projects
visit: Visits
level_2_user: Level 2 users
proposal_created: Citizen proposals

View File

@@ -165,15 +165,15 @@ en:
page_title: "%{budget} - Results"
heading: "Participatory budget results"
heading_selection_title: "By district"
spending_proposal: Proposal title
ballot_lines_count: Votes
hide_discarded_link: Hide discarded
show_all_link: Show all
price: Price
amount_available: Available budget
accepted: "Accepted spending proposal: "
discarded: "Discarded spending proposal: "
accepted: "Accepted investment: "
discarded: "Discarded investment: "
incompatibles: Incompatibles
investment_title: Project title
investment_proyects: List of all investment projects
unfeasible_investment_proyects: List of all unfeasible investment projects
not_selected_investment_proyects: List of all investment projects not selected for balloting

View File

@@ -179,7 +179,6 @@ en:
policy: Privacy Policy
proposal: Proposal
proposal_notification: "Notification"
spending_proposal: Spending proposal
budget/investment: Investment
budget/group: Budget Group
budget/heading: Budget Heading
@@ -193,7 +192,6 @@ en:
image: Image
geozones:
none: All city
all: All scopes
layouts:
application:
chrome: Google Chrome
@@ -248,7 +246,6 @@ en:
proposals: Proposals
poll_questions: Voting
budgets: Participatory budgeting
spending_proposals: Spending Proposals
notification_item:
new_notifications:
one: You have a new notification
@@ -764,7 +761,6 @@ en:
unflag: Unflag
unfollow_entity: "Unfollow %{entity}"
outline:
budget: Participatory budget
searcher: Searcher
go_to_page: "Go to page of "
share: Share
@@ -787,54 +783,6 @@ en:
whatsapp: WhatsApp
telegram: "%{org} Telegram"
instagram: "%{org} Instagram"
spending_proposals:
form:
association_name_label: "If you propose in name of an assocation or collective add the name here"
association_name: "Association name"
description: Description
external_url: Link to additional documentation
geozone: Scope of operation
submit_buttons:
create: Create
new: Create
title: Spending proposal title
index:
title: Participatory budgeting
unfeasible: Unfeasible investment projects
by_geozone: "Investment projects with scope: %{geozone}"
search_form:
button: Search
placeholder: Investment projects...
title: Search
search_results:
one: " containing the term '%{search_term}'"
other: " containing the term '%{search_term}'"
sidebar:
geozones: Scope of operation
feasibility: Feasibility
unfeasible: Unfeasible
start_spending_proposal: Create an investment project
new:
more_info: How do participatory budgeting works?
recommendation_one: It's mandatory that the proposal makes reference to a budgetable action.
recommendation_three: Try to go into details when describing your spending proposal so the reviewing team undertands your points.
recommendation_two: Any proposal or comment suggesting illegal action will be deleted.
recommendations_title: How to create a spending proposal
start_new: Create spending proposal
show:
author_deleted: User deleted
code: "Proposal code:"
share: Share
wrong_price_format: Only integer numbers
spending_proposal:
spending_proposal: Investment project
already_supported: You have already supported this. Share it!
support: Support
support_title: Support this project
supports:
one: 1 support
other: "%{count} supports"
zero: No supports
stats:
index:
visits: Visits
@@ -917,12 +865,6 @@ en:
unauthenticated: You must %{signin} or %{signup} to continue.
verified_only: Only verified users can vote on proposals; %{verify_account}.
verify_account: verify your account
spending_proposals:
not_logged_in: You must %{signin} or %{signup} to continue.
not_verified: Only verified users can vote on proposals; %{verify_account}.
organization: Organizations are not permitted to vote
unfeasible: Unfeasible investment projects can not be supported
not_voting_allowed: Voting phase is closed
budget_investments:
not_logged_in: You must %{signin} or %{signup} to continue.
not_verified: Only verified users can vote on investment projects; %{verify_account}.

View File

@@ -20,13 +20,6 @@ en:
new_reply_by_html: There is a new response from <b>%{commenter}</b> to your comment on
subject: Someone has responded to your comment
title: New response to your comment
unfeasible_spending_proposal:
hi: "Dear user,"
new_html: "For all these, we invite you to elaborate a <strong>new proposal</strong> that adjusts to the conditions of this process. You can do it following this link: %{url}."
new_href: "new investment project"
sincerely: "Sincerely"
sorry: "Sorry for the inconvenience and we again thank you for your invaluable participation."
subject: "Your investment project '%{code}' has been marked as unfeasible"
proposal_notification_digest:
info: "Here are the new notifications that have been published by authors of the proposals that you have supported in %{org_name}."
title: "Proposal notifications in %{org_name}"

View File

@@ -62,9 +62,6 @@ en:
create_proposal: Create proposal
print_proposals: Print proposals
support_proposals: Support proposals
create_spending_proposal: Create spending proposal
print_spending_proposals: Print spending proposals
support_spending_proposals: Support spending proposals
create_budget_investment: Create budget investment
print_budget_investments: Print budget investments
support_budget_investments: Support budget investments
@@ -79,7 +76,6 @@ en:
print:
proposals_info: Create your proposal on http://url.consul
proposals_title: "Proposals:"
spending_proposals_info: Participate at http://url.consul
budget_investments_info: Participate at http://url.consul
print_info: Print this info
proposals:
@@ -110,18 +106,6 @@ en:
search_results:
one: " containing the term '%{search_term}'"
other: " containing the term '%{search_term}'"
spending_proposals:
alert:
unverified_user: User is not verified
create: Create spending proposal
filters:
unfeasible: Unfeasible investment projects
by_geozone: "Investment projects with scope: %{geozone}"
print:
print_button: Print
search_results:
one: " containing the term '%{search_term}'"
other: " containing the term '%{search_term}'"
sessions:
signed_out: Signed out successfully.
signed_out_managed_user: User session signed out successfully.

View File

@@ -12,7 +12,6 @@ en:
poll_question_answer_image: "Image uploaded successfully"
proposal: "Proposal created successfully."
proposal_notification: "Your message has been sent correctly."
spending_proposal: "Spending proposal created successfully. You can access it from %{activity}"
budget_investment: "Budget Investment created successfully."
signature_sheet: "Signature sheet created successfully"
topic: "Topic created successfully."
@@ -26,13 +25,11 @@ en:
poll_booth: "Booth updated successfully."
active_poll: "Polls description updated successfully."
proposal: "Proposal updated successfully."
spending_proposal: "Investment project updated succesfully."
budget_investment: "Investment project updated succesfully."
topic: "Topic updated successfully."
valuator_group: "Valuator group updated successfully"
translation: "Translation updated successfully"
destroy:
spending_proposal: "Spending proposal deleted succesfully."
budget_investment: "Investment project deleted succesfully."
error: "Could not delete"
topic: "Topic deleted successfully."

View File

@@ -93,11 +93,6 @@ en:
featured_proposals_description: "Shows featured proposals on index proposals page"
signature_sheets: "Signature sheets"
signature_sheets_description: "It allows adding from the Administration panel signatures collected on-site to Proposals and investment projects of the Participative Budgets"
spending_proposals: "Spending proposals"
spending_proposals_description: "⚠️ NOTE: This functionality has been replaced by Participatory Budgeting and will disappear in new versions"
spending_proposal_features:
voting_allowed: Voting on investment projects - Preselection phase
voting_allowed_description: "⚠️ NOTE: This functionality has been replaced by Participatory Budgeting and will disappear in new versions"
user:
recommendations: "Recommendations"
recommendations_description: "Shows users recommendations on the homepage based on the tags of the following items"

View File

@@ -71,9 +71,6 @@ es:
proposal:
one: "Propuesta ciudadana"
other: "Propuestas ciudadanas"
spending_proposal:
one: "Propuesta de inversión"
other: "Proyectos de gasto"
site_customization/page:
one: Página
other: Páginas
@@ -203,13 +200,6 @@ es:
organization:
name: "Nombre de la organización"
responsible_name: "Persona responsable del colectivo"
spending_proposal:
administrator_id: "Administrador"
association_name: "Nombre de la asociación"
description: "Descripción"
external_url: "Enlace a documentación adicional"
geozone_id: "Ámbito de actuación"
title: "Título"
poll:
name: "Nombre"
starts_at: "Fecha de apertura"

View File

@@ -689,7 +689,6 @@ es:
officials: Cargos públicos
organizations: Organizaciones
settings: Configuración global
spending_proposals: Propuestas de inversión
stats: Estadísticas
signature_sheets: Hojas de firmas
site_customization:
@@ -714,7 +713,6 @@ es:
content_block:
update: "Actualizar Bloque"
title_moderated_content: Contenido moderado
title_budgets: Presupuestos
title_profiles: Perfiles
title_settings: Configuración
title_site_customization: Contenido del sitio
@@ -1299,9 +1297,6 @@ es:
proposal_search:
button: Buscar
placeholder: Buscar propuestas por título, código, descripción o pregunta
spending_proposal_search:
button: Buscar
placeholder: Buscar propuestas por título o descripción
user_search:
button: Buscar
placeholder: Buscar usuario por nombre o email
@@ -1322,62 +1317,6 @@ es:
color_help: Formato hexadecimal
show_results_and_stats: "Mostrar resultados y estadísticas"
results_and_stats_reminder: "Si marcas estas casillas los resultados y/o estadísticas serán públicos y podrán verlos todos los usuarios."
spending_proposals:
index:
geozone_filter_all: Todos los ámbitos de actuación
administrator_filter_all: Todos los administradores
valuator_filter_all: Todos los evaluadores
tags_filter_all: Todas las etiquetas
filters:
valuation_open: Abiertas
without_admin: Sin administrador
managed: Gestionando
valuating: En evaluación
valuation_finished: Evaluación finalizada
all: Todas
title: Propuestas de inversión para presupuestos participativos
assigned_admin: Administrador asignado
no_admin_assigned: Sin admin asignado
no_valuators_assigned: Sin evaluador
summary_link: "Resumen de propuestas"
valuator_summary_link: "Resumen de evaluadores"
feasibility:
feasible: "Viable (%{price})"
not_feasible: "Inviable"
undefined: "Sin definir"
show:
assigned_admin: Administrador asignado
assigned_valuators: Evaluadores asignados
back: Volver
classification: Clasificación
heading: "Propuesta de inversión %{id}"
edit: Editar
edit_classification: Editar clasificación
association_name: Asociación
by: Autor
sent: Fecha
geozone: Ámbito
dossier: Informe
edit_dossier: Editar informe
tags: Etiquetas
undefined: Sin definir
edit:
classification: Clasificación
assigned_valuators: Evaluadores
submit_button: Actualizar
tags: Etiquetas
tags_placeholder: "Escribe las etiquetas que desees separadas por comas (,)"
undefined: Sin definir
summary:
title: Resumen de propuestas de inversión
title_proposals_with_supports: Resumen para propuestas que han superado la fase de apoyos
geozone_name: Ámbito de ciudad
finished_and_feasible_count: Finalizadas viables
finished_and_unfeasible_count: Finalizadas inviables
finished_count: Finalizadas
in_evaluation_count: En evaluación
total_count: Total
cost_for_geozone: Coste total
geozones:
index:
title: Zonas
@@ -1448,7 +1387,6 @@ es:
proposals: Propuestas
budgets: Presupuestos abiertos
budget_investments: Proyectos de gasto
spending_proposals: Propuestas de inversión
unverified_users: Usuarios sin verificar
user_level_three: Usuarios de nivel tres
user_level_two: Usuarios de nivel dos
@@ -1465,7 +1403,6 @@ es:
polls: Votaciones
graph:
debate_created: Debates
spending_proposals: Propuestas de inversión
visit: Visitas
level_2_user: Usuarios nivel 2
proposal_created: Propuestas Ciudadanas

View File

@@ -165,7 +165,6 @@ es:
page_title: "%{budget} - Resultados"
heading: "Resultados presupuestos participativos"
heading_selection_title: "Ámbito de actuación"
spending_proposal: Título de la propuesta
ballot_lines_count: Votos
hide_discarded_link: Ocultar descartados
show_all_link: Mostrar todos
@@ -174,6 +173,7 @@ es:
accepted: "Proyecto de gasto aceptado: "
discarded: "Proyecto de gasto descartado: "
incompatibles: Incompatibles
investment_title: Título del proyecto de gasto
investment_proyects: Ver lista completa de proyectos de gasto
unfeasible_investment_proyects: Ver lista de proyectos de gasto inviables
not_selected_investment_proyects: Ver lista de proyectos de gasto no seleccionados para la votación final

View File

@@ -179,7 +179,6 @@ es:
policy: Política de privacidad
proposal: la propuesta
proposal_notification: "la notificación"
spending_proposal: la propuesta de gasto
budget/investment: el proyecto de gasto
budget/group: el grupo de partidas presupuestarias
budget/heading: la partida presupuestaria
@@ -193,7 +192,6 @@ es:
image: Imagen
geozones:
none: Toda la ciudad
all: Todos los ámbitos de actuación
layouts:
application:
chrome: Google Chrome
@@ -248,7 +246,6 @@ es:
proposals: Propuestas
poll_questions: Votaciones
budgets: Presupuestos participativos
spending_proposals: Propuestas de inversión
notification_item:
new_notifications:
one: Tienes una nueva notificación
@@ -762,7 +759,6 @@ es:
unflag: Deshacer denuncia
unfollow_entity: "Dejar de seguir %{entity}"
outline:
budget: Presupuestos participativos
searcher: Buscador
go_to_page: "Ir a la página de "
share: Compartir
@@ -785,54 +781,6 @@ es:
whatsapp: WhatsApp
telegram: "Telegram de %{org}"
instagram: "Instagram de %{org}"
spending_proposals:
form:
association_name_label: "Si propones en nombre de una asociación o colectivo añade el nombre aquí"
association_name: "Nombre de la asociación"
description: Descripción detallada
external_url: Enlace a documentación adicional
geozone: Ámbito de actuación
submit_buttons:
create: Crear
new: Crear
title: Título de la propuesta de gasto
index:
title: Presupuestos participativos
unfeasible: Propuestas de inversión no viables
by_geozone: "Propuestas de inversión con ámbito: %{geozone}"
search_form:
button: Buscar
placeholder: Propuestas de inversión...
title: Buscar
search_results:
one: " que contiene '%{search_term}'"
other: " que contienen '%{search_term}'"
sidebar:
geozones: Ámbitos de actuación
feasibility: Viabilidad
unfeasible: No viables
start_spending_proposal: Crea una propuesta de inversión
new:
more_info: '¿Cómo funcionan los presupuestos participativos?'
recommendation_one: Es fundamental que haga referencia a una actuación presupuestable.
recommendation_three: Intenta detallar lo máximo posible la propuesta para que el equipo de gobierno encargado de estudiarla tenga las menor dudas posibles.
recommendation_two: Cualquier propuesta o comentario que implique acciones ilegales será eliminada.
recommendations_title: Cómo crear una propuesta de gasto
start_new: Crear una propuesta de gasto
show:
author_deleted: Usuario eliminado
code: "Código de la propuesta:"
share: Compartir
wrong_price_format: Solo puede incluir caracteres numéricos
spending_proposal:
spending_proposal: Propuesta de inversión
already_supported: Ya has apoyado este proyecto. ¡Compártelo!
support: Apoyar
support_title: Apoyar este proyecto
supports:
zero: Sin apoyos
one: 1 apoyo
other: "%{count} apoyos"
stats:
index:
visits: Visitas
@@ -915,12 +863,6 @@ es:
unauthenticated: Necesitas %{signin} o %{signup} para continuar.
verified_only: Las propuestas sólo pueden ser votadas por usuarios verificados, %{verify_account}.
verify_account: verifica tu cuenta
spending_proposals:
not_logged_in: Necesitas %{signin} o %{signup} para continuar.
not_verified: Las propuestas de inversión sólo pueden ser apoyadas por usuarios verificados, %{verify_account}.
organization: Las organizaciones no pueden votar.
unfeasible: No se pueden votar propuestas inviables.
not_voting_allowed: El periodo de votación está cerrado.
budget_investments:
not_logged_in: Necesitas %{signin} o %{signup} para continuar.
not_verified: Los proyectos de gasto sólo pueden ser apoyadas por usuarios verificados, %{verify_account}.

View File

@@ -20,13 +20,6 @@ es:
new_reply_by_html: Hay una nueva respuesta de <b>%{commenter}</b> a tu comentario en
subject: Alguien ha respondido a tu comentario
title: Nueva respuesta a tu comentario
unfeasible_spending_proposal:
hi: "Estimado/a usuario/a"
new_html: "Por todo ello, te invitamos a que elabores una <strong>nueva propuesta</strong> que se ajuste a las condiciones de este proceso. Esto lo puedes hacer en este enlace: %{url}."
new_href: "nueva propuesta de inversión"
sincerely: "Atentamente"
sorry: "Sentimos las molestias ocasionadas y volvemos a darte las gracias por tu inestimable participación."
subject: "Tu propuesta de inversión '%{code}' ha sido marcada como inviable"
proposal_notification_digest:
info: "A continuación te mostramos las nuevas notificaciones que han publicado los autores de las propuestas que estás apoyando en %{org_name}."
title: "Notificaciones de propuestas en %{org_name}"

View File

@@ -62,9 +62,6 @@ es:
create_proposal: Crear propuesta
print_proposals: Imprimir propuestas
support_proposals: Apoyar propuestas
create_spending_proposal: Crear una propuesta de gasto
print_spending_proposals: Imprimir propts. de inversión
support_spending_proposals: Apoyar propts. de inversión
create_budget_investment: Crear proyectos de gasto
print_budget_investments: Imprimir proyectos de gasto
support_budget_investments: Apoyar proyectos de gasto
@@ -79,7 +76,6 @@ es:
print:
proposals_info: Haz tu propuesta en http://url.consul
proposals_title: "Propuestas:"
spending_proposals_info: Participa en http://url.consul
budget_investments_info: Participa en http://url.consul
print_info: Imprimir esta información
proposals:
@@ -110,18 +106,6 @@ es:
search_results:
one: " que contiene '%{search_term}'"
other: " que contienen '%{search_term}'"
spending_proposals:
alert:
unverified_user: Usuario no verificado
create: Crear una propuesta de gasto
filters:
unfeasible: Propuestas de inversión no viables
by_geozone: "Propuestas de inversión con ámbito: %{geozone}"
print:
print_button: Imprimir
search_results:
one: " que contiene '%{search_term}'"
other: " que contienen '%{search_term}'"
sessions:
signed_out: Has cerrado la sesión correctamente.
signed_out_managed_user: Se ha cerrado correctamente la sesión del usuario.

View File

@@ -12,7 +12,6 @@ es:
poll_question_answer_image: "Imagen cargada correctamente"
proposal: "Propuesta creada correctamente."
proposal_notification: "Tu mensaje ha sido enviado correctamente."
spending_proposal: "Propuesta de inversión creada correctamente. Puedes acceder a ella desde %{activity}"
budget_investment: "Proyecto de gasto creado correctamente."
signature_sheet: "Hoja de firmas creada correctamente"
topic: "Tema creado correctamente."
@@ -26,13 +25,11 @@ es:
poll_booth: "Urna actualizada correctamente."
active_poll: "Descripción general de votaciones actualizada correctamente."
proposal: "Propuesta actualizada correctamente."
spending_proposal: "Propuesta de inversión actualizada correctamente."
budget_investment: "Proyecto de gasto actualizado correctamente"
topic: "Tema actualizado correctamente."
valuator_group: "Grupo de evaluadores actualizado correctamente"
translation: "Traducción actualizada correctamente"
destroy:
spending_proposal: "Propuesta de inversión eliminada."
budget_investment: "Proyecto de gasto eliminado."
error: "No se pudo borrar"
topic: "Tema eliminado."

View File

@@ -93,11 +93,6 @@ es:
featured_proposals_description: "Muestra propuestas destacadas en la página principal de propuestas"
signature_sheets: "Hojas de firmas"
signature_sheets_description: "Permite añadir desde el panel de Administración firmas recogidas de forma presencial a Propuestas y proyectos de gasto de los Presupuestos participativos"
spending_proposals: "Propuestas de inversión"
spending_proposals_description: "⚠️ NOTA: Esta funcionalidad ha sido sustituida por Pesupuestos Participativos y desaparecerá en nuevas versiones"
spending_proposal_features:
voting_allowed: Votaciones de preselección sobre propuestas de inversión.
voting_allowed_description: "⚠️ NOTA: Esta funcionalidad ha sido sustituida por Pesupuestos Participativos y desaparecerá en nuevas versiones"
user:
recommendations: "Recomendaciones"
recommendations_description: "Muestra a los usuarios recomendaciones en la homepage basado en las etiquetas de los elementos que sigue"

View File

@@ -42,15 +42,6 @@ namespace :admin do
end
end
resources :spending_proposals, only: [:index, :show, :edit, :update] do
member do
patch :assign_admin
patch :assign_valuators
end
get :summary, on: :collection
end
resources :proposal_notifications, only: :index do
member do
put :restore

View File

@@ -19,11 +19,5 @@ resources :budgets, only: [:show, :index] do
resource :executions, only: :show, controller: "budgets/executions"
end
scope "/participatory_budget" do
resources :spending_proposals, only: [:index, :new, :create, :show, :destroy], path: "investment_projects" do
post :vote, on: :member
end
end
get "investments/:id/json_data", action: :json_data, controller: "budgets/investments"
get "/budgets/:budget_id/investments/:id/json_data", action: :json_data, controller: "budgets/investments"

View File

@@ -31,11 +31,6 @@ namespace :management do
get :print, on: :collection
end
resources :spending_proposals, only: [:index, :new, :create, :show] do
post :vote, on: :member
get :print, on: :collection
end
resources :budgets, only: :index do
collection do
get :create_investments

View File

@@ -26,7 +26,6 @@ require_relative "dev_seeds/tags_categories"
require_relative "dev_seeds/debates"
require_relative "dev_seeds/proposals"
require_relative "dev_seeds/budgets"
require_relative "dev_seeds/spending_proposals"
require_relative "dev_seeds/comments"
require_relative "dev_seeds/votes"
require_relative "dev_seeds/flags"

View File

@@ -33,8 +33,6 @@ section "Creating Settings" do
Setting.create(key: "process.legislation", value: "true")
Setting.create(key: "feature.featured_proposals", value: "true")
Setting.create(key: "feature.spending_proposals", value: nil)
Setting.create(key: "feature.spending_proposal_features.voting_allowed", value: nil)
Setting.create(key: "feature.twitter_login", value: "true")
Setting.create(key: "feature.facebook_login", value: "true")
@@ -65,6 +63,7 @@ section "Creating Settings" do
Setting.create(key: "map.latitude", value: 40.4332002)
Setting.create(key: "map.longitude", value: -3.7009591)
Setting.create(key: "map.zoom", value: 10)
Setting.create(key: "featured_proposals_number", value: 3)
Setting.create(key: "proposal_notification_minimum_interval_in_days", value: 0)
Setting.create(key: "direct_message_max_per_day", value: 3)

View File

@@ -1,24 +0,0 @@
section "Creating Spending Proposals" do
tags = Faker::Lorem.words(10)
60.times do
geozone = Geozone.all.sample
author = User.all.sample
description = "<p>#{Faker::Lorem.paragraphs.join("</p><p>")}</p>"
feasible_explanation = "<p>#{Faker::Lorem.paragraphs.join("</p><p>")}</p>"
valuation_finished = [true, false].sample
feasible = [true, false].sample
created_at = rand((Time.current - 1.week)..Time.current)
spending_proposal = SpendingProposal.create!(author: author,
title: Faker::Lorem.sentence(3).truncate(60),
external_url: Faker::Internet.url,
description: description,
created_at: created_at,
geozone: [geozone, nil].sample,
feasible: feasible,
feasible_explanation: feasible_explanation,
valuation_finished: valuation_finished,
tag_list: tags.sample(3).join(","),
price: rand(1000000),
terms_of_service: "1")
end
end

View File

@@ -0,0 +1,5 @@
class DestroySpendingProposals < ActiveRecord::Migration
def change
drop_table :spending_proposals
end
end

View File

@@ -0,0 +1,6 @@
class DestroySpendingProposalAssociations < ActiveRecord::Migration
def change
remove_column :tags, :spending_proposals_count
remove_column :valuators, :spending_proposals_count
end
end

View File

@@ -74,7 +74,6 @@ Setting["process.legislation"] = true
# Feature flags
Setting["feature.featured_proposals"] = nil
Setting["feature.spending_proposals"] = nil
Setting["feature.twitter_login"] = true
Setting["feature.facebook_login"] = true
Setting["feature.google_login"] = true
@@ -90,9 +89,6 @@ Setting["feature.allow_images"] = true
Setting["feature.allow_attached_documents"] = true
Setting["feature.help_page"] = true
# Spending proposals feature flags
Setting["feature.spending_proposal_features.voting_allowed"] = nil
# Proposal notifications
Setting["proposal_notification_minimum_interval_in_days"] = 3
Setting["direct_message_max_per_day"] = 3

View File

@@ -10,7 +10,15 @@ namespace :settings do
"banner-img.banner-img-one",
"banner-img.banner-img-two",
"banner-img.banner-img-three",
"verification_offices_url"
"verification_offices_url",
"feature.spending_proposals",
"feature.spending_proposal_features.phase1",
"feature.spending_proposal_features.phase2",
"feature.spending_proposal_features.phase3",
"feature.spending_proposal_features.voting_allowed",
"feature.spending_proposal_features.final_voting_allowed",
"feature.spending_proposal_features.open_results_page",
"feature.spending_proposal_features.valuation_allowed"
]
deprecated_keys.each do |key|

View File

@@ -1,22 +0,0 @@
namespace :spending_proposals do
desc "Check if there are any spending proposals in DB"
task check: :environment do
if !Rails.env.production?
puts "Please run this rake task in your production environment."
else
if SpendingProposal.any?
puts "WARNING"
puts "You have spending proposals in your database."
puts "This model has been deprecated in favor of budget investments."
puts "In the next CONSUL release spending proposals will be deleted."
puts "If you do not need to keep this data, you don't have to do anything else."
print "If you would like to migrate the data from spending proposals to budget investments "
puts "please check this PR https://github.com/consul/consul/pull/3431."
else
puts "All good!"
end
end
end
end

View File

@@ -1,13 +1,4 @@
FactoryBot.define do
factory :spending_proposal do
sequence(:title) { |n| "Spending Proposal #{n} title" }
description "Spend money on this"
feasible_explanation "This proposal is not viable because..."
external_url "http://external_documention.org"
terms_of_service "1"
association :author, factory: :user
end
factory :budget do
sequence(:name) { |n| "#{Faker::Lorem.word} #{n}" }
currency_symbol ""

View File

@@ -3,7 +3,7 @@ require "rails_helper"
describe "Admin feature flags" do
before do
Setting["feature.spending_proposals"] = true
Setting["process.budgets"] = true
login_as(create(:administrator).user)
end

View File

@@ -103,6 +103,7 @@ describe "Stats" do
end
describe "Budget investments" do
context "Supporting phase" do
before do
@budget = create(:budget)
@@ -244,6 +245,7 @@ describe "Stats" do
end
context "graphs" do
scenario "event graphs", :js do
campaign = create(:campaign)
@@ -260,6 +262,7 @@ describe "Stats" do
expect(page).to have_content event_created_at.strftime("%Y-%m-%d")
end
end
end
context "Proposal notifications" do

View File

@@ -65,8 +65,6 @@ describe "Admin" do
end
scenario "Admin access links" do
Setting["feature.spending_proposals"] = true
login_as(administrator)
visit root_path
@@ -74,8 +72,6 @@ describe "Admin" do
expect(page).to have_link("Moderation")
expect(page).to have_link("Valuation")
expect(page).to have_link("Management")
Setting["feature.spending_proposals"] = nil
end
scenario "Admin dashboard" do

View File

@@ -218,34 +218,6 @@ describe "Emails" do
expect(email).to have_subject("Instrucciones de confirmación")
end
scenario "Email on unfeasible spending proposal" do
Setting["feature.spending_proposals"] = true
spending_proposal = create(:spending_proposal)
administrator = create(:administrator)
valuator = create(:valuator)
spending_proposal.update(administrator: administrator)
spending_proposal.valuators << valuator
login_as(valuator.user)
visit edit_valuation_spending_proposal_path(spending_proposal)
choose "spending_proposal_feasible_false"
fill_in "spending_proposal_feasible_explanation", with: "This is not legal as stated in Article 34.9"
check "spending_proposal_valuation_finished"
click_button "Save changes"
expect(page).to have_content "Dossier updated"
spending_proposal.reload
email = open_last_email
expect(email).to have_subject("Your investment project '#{spending_proposal.code}' has been marked as unfeasible")
expect(email).to deliver_to(spending_proposal.author.email)
expect(email).to have_body_text(spending_proposal.feasible_explanation)
Setting["feature.spending_proposals"] = nil
end
context "Direct Message" do
scenario "Receiver email" do

View File

@@ -129,11 +129,10 @@ describe "Notifications" do
end
scenario "Notification's notifiable model no longer includes Notifiable module" do
create(:notification, notifiable: create(:spending_proposal), user: user)
create(:notification, notifiable: create(:poll_question), user: user)
click_notifications_icon
expect(page).to have_content("This resource is not available anymore.", count: 2)
expect(page).to have_content("This resource is not available anymore.", count: 1)
end
context "Admin Notifications" do

View File

@@ -69,34 +69,5 @@ describe "Official positions" do
end
end
context "Spending proposals" do
before do
Setting["feature.spending_proposals"] = true
@spending_proposal1 = create(:spending_proposal, author: @user1)
@spending_proposal2 = create(:spending_proposal, author: @user2)
end
after do
Setting["feature.spending_proposals"] = nil
end
scenario "Index" do
visit spending_proposals_path
expect_badge_for("spending_proposal", @spending_proposal1)
expect_no_badge_for("spending_proposal", @spending_proposal2)
end
scenario "Show" do
visit spending_proposal_path(@spending_proposal1)
expect_badge_for("spending_proposal", @spending_proposal1)
visit spending_proposal_path(@spending_proposal2)
expect_no_badge_for("spending_proposal", @spending_proposal2)
end
end
end
end

View File

@@ -368,106 +368,4 @@ describe "Votes" do
end
end
describe "Spending Proposals" do
before do
Setting["feature.spending_proposals"] = true
Setting["feature.spending_proposal_features.voting_allowed"] = true
login_as(@manuela)
end
after do
Setting["feature.spending_proposals"] = nil
end
describe "Index" do
scenario "Index shows user votes on proposals" do
spending_proposal1 = create(:spending_proposal)
spending_proposal2 = create(:spending_proposal)
spending_proposal3 = create(:spending_proposal)
create(:vote, voter: @manuela, votable: spending_proposal1, vote_flag: true)
visit spending_proposals_path
within("#investment-projects") do
within("#spending_proposal_#{spending_proposal1.id}_votes") do
expect(page).to have_content "You have already supported this. Share it!"
end
within("#spending_proposal_#{spending_proposal2.id}_votes") do
expect(page).not_to have_content "You have already supported this. Share it!"
end
within("#spending_proposal_#{spending_proposal3.id}_votes") do
expect(page).not_to have_content "You have already supported this. Share it!"
end
end
end
scenario "Create from spending proposal index", :js do
spending_proposal = create(:spending_proposal)
visit spending_proposals_path
within(".supports") do
find(".in-favor a").click
expect(page).to have_content "1 support"
expect(page).to have_content "You have already supported this. Share it!"
end
end
end
describe "Single spending proposal" do
before do
@proposal = create(:spending_proposal)
end
scenario "Show no votes" do
visit spending_proposal_path(@proposal)
expect(page).to have_content "No supports"
end
scenario "Trying to vote multiple times", :js do
visit spending_proposal_path(@proposal)
within(".supports") do
find(".in-favor a").click
expect(page).to have_content "1 support"
expect(page).not_to have_selector ".in-favor a"
end
end
scenario "Create from proposal show", :js do
visit spending_proposal_path(@proposal)
within(".supports") do
find(".in-favor a").click
expect(page).to have_content "1 support"
expect(page).to have_content "You have already supported this. Share it!"
end
end
end
scenario "Disable voting on spending proposals", :js do
login_as(@manuela)
Setting["feature.spending_proposal_features.voting_allowed"] = nil
spending_proposal = create(:spending_proposal)
visit spending_proposals_path
within("#spending_proposal_#{spending_proposal.id}") do
find("div.supports").hover
expect_message_voting_not_allowed
end
visit spending_proposal_path(spending_proposal)
within("#spending_proposal_#{spending_proposal.id}") do
find("div.supports").hover
expect_message_voting_not_allowed
end
end
end
end

View File

@@ -31,19 +31,4 @@ describe GeozonesHelper do
end
end
describe "#geozone_name_from_id" do
it "returns geozone name if present" do
g1 = create(:geozone, name: "AAA")
g2 = create(:geozone, name: "BBB")
expect(geozone_name_from_id(g1.id)).to eq "AAA"
expect(geozone_name_from_id(g2.id)).to eq "BBB"
end
it "returns default string for no geozone if geozone is blank" do
expect(geozone_name_from_id(nil)).to eq "All city"
end
end
end

View File

@@ -73,10 +73,6 @@ describe Abilities::Common do
it { should_not be_able_to(:vote, Proposal) }
it { should_not be_able_to(:vote_featured, Proposal) }
it { should be_able_to(:index, SpendingProposal) }
it { should_not be_able_to(:create, SpendingProposal) }
it { should_not be_able_to(:destroy, SpendingProposal) }
it { should_not be_able_to(:comment_as_administrator, debate) }
it { should_not be_able_to(:comment_as_moderator, debate) }
it { should_not be_able_to(:comment_as_administrator, proposal) }
@@ -189,8 +185,6 @@ describe Abilities::Common do
end
describe "when level 2 verified" do
let(:own_spending_proposal) { create(:spending_proposal, author: user) }
let(:own_direct_message) { create(:direct_message, sender: user) }
before{ user.update(residence_verified_at: Time.current, confirmed_phone: "1") }
@@ -200,12 +194,6 @@ describe Abilities::Common do
it { should be_able_to(:vote_featured, Proposal) }
end
describe "Spending Proposal" do
it { should be_able_to(:create, SpendingProposal) }
it { should_not be_able_to(:destroy, create(:spending_proposal)) }
it { should_not be_able_to(:destroy, own_spending_proposal) }
end
describe "Direct Message" do
it { should be_able_to(:new, DirectMessage) }
it { should be_able_to(:create, DirectMessage) }
@@ -270,7 +258,6 @@ describe Abilities::Common do
end
describe "when level 3 verified" do
let(:own_spending_proposal) { create(:spending_proposal, author: user) }
let(:own_direct_message) { create(:direct_message, sender: user) }
before{ user.update(verified_at: Time.current) }
@@ -278,10 +265,6 @@ describe Abilities::Common do
it { should be_able_to(:vote, Proposal) }
it { should be_able_to(:vote_featured, Proposal) }
it { should be_able_to(:create, SpendingProposal) }
it { should_not be_able_to(:destroy, create(:spending_proposal)) }
it { should_not be_able_to(:destroy, own_spending_proposal) }
it { should be_able_to(:new, DirectMessage) }
it { should be_able_to(:create, DirectMessage) }
it { should be_able_to(:show, own_direct_message) }

View File

@@ -24,9 +24,6 @@ describe Abilities::Everyone do
it { should be_able_to(:show, Comment) }
it { should be_able_to(:index, SpendingProposal) }
it { should_not be_able_to(:create, SpendingProposal) }
it { should be_able_to(:index, Budget) }
it { should_not be_able_to(:manage, Dashboard::Action) }

View File

@@ -29,11 +29,6 @@ describe Geozone do
expect(geozone).not_to be_safe_to_destroy
end
it "is false when already linked to spending proposal" do
create(:spending_proposal, geozone: geozone)
expect(geozone).not_to be_safe_to_destroy
end
it "is false when already linked to debate" do
create(:debate, geozone: geozone)
expect(geozone).not_to be_safe_to_destroy

View File

@@ -47,13 +47,6 @@ describe SignatureSheet do
expect(signature_sheet.name).to eq("Citizen proposal #{proposal.id}")
end
it "returns name for spending proposal signature sheets" do
spending_proposal = create(:spending_proposal)
signature_sheet.signable = spending_proposal
expect(signature_sheet.name).to eq("Investment project #{spending_proposal.id}")
end
it "returns name for budget investment signature sheets" do
budget_investment = create(:budget_investment)
signature_sheet.signable = budget_investment

View File

@@ -10,4 +10,5 @@ module Budgets
expect(page).to have_content "Remove"
end
end
end